On Mon, Jun 21, 2010 at 12:11:49PM -0400, Alex Deucher wrote: > On Mon, Jun 21, 2010 at 11:03 AM, Alex Deucher <alexdeucher at gmail.com> > wrote: > > On Mon, Jun 21, 2010 at 8:45 AM, Jerome Glisse <glisse at freedesktop.org> > > 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 at iki.fi> > >>> > > >>> > >>> 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? >
Thanks for the patch. I'll try it when I'm back where the dock is.. will take a couple of days. -- Pasi > From 557b452536c9390105539a264d342d963d71b087 Mon Sep 17 00:00:00 2001 > From: Alex Deucher <alexdeucher at gmail.com> > 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 at iki.fi> on dri-devel > > Signed-off-by: Alex Deucher <alexdeucher at gmail.com> > --- > 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 >