On Mon, Jun 21, 2010 at 02:45:44PM +0200, Jerome Glisse 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 <pa...@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)
> 

I'll have to try that..

> Also can you print the radeon_connector->devices of all your connector
> so we can compare them.
> 


I already listed the values above, like this:


> > > > [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


Or did you mean something else? 


-- Pasi

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to