On Mon, Jun 21, 2010 at 11:03 AM, Alex Deucher <alexdeucher@xxxxxxxxx> wrote: > On Mon, Jun 21, 2010 at 8:45 AM, Jerome Glisse <glisse@xxxxxxxxxxxxxxx> wrote: >> On Mon, Jun 21, 2010 at 12:31:22PM +0300, Pasi Kärkkäinen wrote: >>> On Mon, Jun 21, 2010 at 12:23:10PM +0300, Pasi Kärkkäinen wrote: >>> > On Sat, Jun 19, 2010 at 10:24:53PM +0300, Pasi Kärkkäinen wrote: >>> > > On Fri, Jun 18, 2010 at 09:45:22PM +0300, Pasi Kärkkäinen wrote: >>> > > > > > > >> > >>> > > > > > > >> > I wonder if that HDMI-0 is the key to the problem.. I don't have anything connected >>> > > > > > > >> > to the HDMI connector on the laptop. There's no HDMI connector on the dock, it's only in the laptop. >>> > > > > > > >> >>> > > > > > > >> Indeed that is the problem. On your system the HDMI and DVI ports >>> > > > > > > >> share the same encoder and DDC line so they will both come up as >>> > > > > > > >> connected since the line is shared. The driver used to check the edid >>> > > > > > > >> when the lines where shared and select HDMI or DVI based on the EDID, >>> > > > > > > >> but perhaps that got broken at some point. >>> > > > > > > >> >>> > > > > > > > >>> > > > > > > > Makes sense. Does some kernel option/parameter affect that? >>> > > > > > > >>> > > > > > > No. I'll check the code and see if I can figure out what's going on. >>> > > > > > > >>> > > > > > >>> > > > > > Ok, thanks! >>> > > > > > >>> > > > > >>> > > > > Hello, >>> > > > > >>> > > > > I'll be near the dock tomorrow.. So if you have a chance of looking at this, and want me to test something, >>> > > > > I could do it on thursday/friday. >>> > > > > >>> > > > >>> > > > I just tried the latest Fedora 13 kernel (2.6.33.5-124.fc13.x86_64) and the latest >>> > > > Fedora development (rawhide 2.6.34-43.fc14.x86_64) kernel, but the behaviour was the same. >>> > > > >>> > > > Connecting display to the DVI connector makes the HDMI connector also show the same display, >>> > > > breaking things.. >>> > > > >>> > > >>> > > Here's a new log with drm.debug=4.. that's the biggest debug level that still allows me to grab >>> > > the whole dmesg log before it's overwritten by huge amount of debug messages. >>> > > >>> > > Full dmesg log: >>> > > http://pasik.reaktio.net/fedora/bz593429/both-internal-and-external-displays-active/dmesg-with-drmdebug4.txt >>> > > >>> > >>> > Ok.. I did some debugging, and figured out how to make it work. Patch attached. >>> > I'm not sure if this is the correct method.. someone familiar with the code should review it. >>> > >>> > >>> > Some debugging information for my system (HP EliteBook 8530p): >>> > >>> > > >>> > > [drm] Radeon Display Connectors >>> > > [drm] Connector 0: >>> > > [drm] VGA >>> > > [drm] DDC: 0x7e40 0x7e40 0x7e44 0x7e44 0x7e48 0x7e48 0x7e4c 0x7e4c >>> > > [drm] Encoders: >>> > > [drm] CRT1: INTERNAL_KLDSCP_DAC1 >>> > >>> > connector->devices for VGA is: 1 >>> > >>> > > [drm] Connector 1: >>> > > [drm] LVDS >>> > > [drm] Encoders: >>> > > [drm] LCD1: INTERNAL_KLDSCP_LVTMA >>> > >>> > connector->devices for LVDS is: 2 >>> > >>> > > [drm] Connector 2: >>> > > [drm] DVI-D >>> > > [drm] HPD1 >>> > > [drm] DDC: 0x7e60 0x7e60 0x7e64 0x7e64 0x7e68 0x7e68 0x7e6c 0x7e6c >>> > > [drm] Encoders: >>> > > [drm] DFP1: INTERNAL_UNIPHY >>> > >>> > connector->devices for DVI-D is: 8 >>> > >>> > > [drm] Connector 3: >>> > > [drm] HDMI-A >>> > > [drm] HPD2 >>> > > [drm] DDC: 0x7e60 0x7e60 0x7e64 0x7e64 0x7e68 0x7e68 0x7e6c 0x7e6c >>> > > [drm] Encoders: >>> > > [drm] DFP2: INTERNAL_UNIPHY >>> > >>> > connector->devices for HDMI-A is: 128 >>> > >>> > >>> > >>> > The code in radeon_connectors.c in radeon_dvi_detect(): >>> > >>> > /* multiple connectors on the same encoder with the same ddc line >>> > * This tends to be HDMI and DVI on the same encoder with the >>> > * same ddc line. If the edid says HDMI, consider the HDMI port >>> > * connected and the DVI port disconnected. If the edid doesn't >>> > * say HDMI, vice versa. >>> > */ >>> > if (radeon_connector->shared_ddc && (ret == connector_status_connected)) { >>> > struct drm_device *dev = connector->dev; >>> > struct drm_connector *list_connector; >>> > struct radeon_connector *list_radeon_connector; >>> > list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { >>> > if (connector == list_connector) >>> > continue; >>> > list_radeon_connector = to_radeon_connector(list_connector); >>> > if (radeon_connector->devices == list_radeon_connector->devices) { >>> > if (drm_detect_hdmi_monitor(radeon_connector->edid)) { >>> > if (connector->connector_type == DRM_MODE_CONNECTOR_DVID) { >>> > kfree(radeon_connector->edid); >>> > radeon_connector->edid = NULL; >>> > ret = connector_status_disconnected; >>> > } >>> > } else { >>> > if ((connector->connector_type == DRM_MODE_CONNECTOR_HDMIA) || >>> > (connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)) { >>> > kfree(radeon_connector->edid); >>> > radeon_connector->edid = NULL; >>> > ret = connector_status_disconnected; >>> > } >>> > } >>> > } >>> > } >>> > } >>> > >>> > >>> > Ok, so at least on my system the "if (connector == list_connector)" will SKIP the connector >>> > that actually would match in "if (radeon_connector->devices == list_radeon_connector->devices)", >>> > and thus the drm_detect_hdmi_monitor() is never called. >>> > >>> > My patch removes that "if (connector == list_connector)" check and fixes the problem on my system. >>> > Is this the correct way to do it? >>> > >>> > radeon-fix-shared_ddc-dvi-hdmi-edid-detection.patch: >>> > - allow checking against all connectors to be able to properly detect shared_ddc dvi/hdmi displays >>> > - patch applies to 2.6.33.5, 2.6.34 and 2.6.35-rc3. Tested with Fedora 13 2.6.33.5-124.fc13.x86_64. >>> > - Signed-off-by: Pasi Kärkkäinen <pasik@xxxxxx> >>> > >>> >>> And actually attached now :) >>> >>> -- Pasi >> >> I am not sure your patch is right, my guess is that devices field of >> radeon connector structure btw the HDMI & DVI connector are different >> and thus that drm_detect_hdmi_monitor is not call. I expect it's normal >> for the device field to be different (my understanding being that HDMI >> will have one more bit set than the DVI connector). Bottom line is >> i think we want to discard non hdmi connector just in case we face >> shared connector. >> >> Alex would have to comment on the device field test, maybe your atombios >> is broken. Does it works if instead of removing >> if (connector == list_connector) >> continue; >> You remove : >> if (radeon_connector->devices == list_radeon_connector->devices) >> >> Also can you print the radeon_connector->devices of all your connector >> so we can compare them. > > The code was for systems with shared ddc lines and shared encoders, > but it looks like your system may have a shared ddc line and (sort of) > non-shared encoders. I suspect the DVI port is using UNIPHY A or A+B > (for dual link) and HDMI is using UNIPHY link B. It's probably > actually using router objects (gpio toggle to switch gpio routing > between physical ports), however support for that is not implemented > yet which is why we have the current code. Can you send me a copy of > your vbios so I can verify? > > To access your vbios (as root): > cd /sys/bus/pci/device/<pci bus id> > echo 1 > rom > cat rom > /tmp/vbios.rom > echo 0 > rom Does the attached patch fix the issue? Alex
From 557b452536c9390105539a264d342d963d71b087 Mon Sep 17 00:00:00 2001 From: Alex Deucher <alexdeucher@xxxxxxxxx> Date: Mon, 21 Jun 2010 12:07:52 -0400 Subject: [PATCH] drm/radeon/kms: fix shared ddc handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Connectors with a shared ddc line can be connected to different encoders. Reported by Pasi Kärkkäinen <pasik@xxxxxx> on dri-devel Signed-off-by: Alex Deucher <alexdeucher@xxxxxxxxx> --- drivers/gpu/drm/radeon/radeon_connectors.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 0c7ccc6..f58f8bd 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c @@ -785,7 +785,9 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect if (connector == list_connector) continue; list_radeon_connector = to_radeon_connector(list_connector); - if (radeon_connector->devices == list_radeon_connector->devices) { + if (list_radeon_connector->shared_ddc && + (list_radeon_connector->ddc_bus->rec.i2c_id == + radeon_connector->ddc_bus->rec.i2c_id)) { if (drm_detect_hdmi_monitor(radeon_connector->edid)) { if (connector->connector_type == DRM_MODE_CONNECTOR_DVID) { kfree(radeon_connector->edid); -- 1.7.0.1
_______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel