Re: [RFC PATCH] Re: KMS:RV635:Radeon 3650HD graphics driver broken on a laptop when connected to a docking station and external display

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux