xf86-video-ati: Branch '6.12-branch'

Alex Deucher agd5f at kemper.freedesktop.org
Tue Nov 17 11:35:34 PST 2009


 src/radeon_output.c |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

New commits:
commit 51266161f70baf4ddbf79ba6225ee2ae107a9f36
Author: Alex Deucher <alexdeucher at gmail.com>
Date:   Tue Nov 17 14:16:22 2009 -0500

    radeon: deal with connectors sourced to the same encoder
    
    Some systems have multiple connectors connected to the
    same encoder; e.g., DVI and HDMI connected to the same
    encoder with the same ddc line.  Since we expose
    connectors as xrandr outputs, randr treats them separately
    which results in it trying to source the same encoder to
    different crtcs.  If we have an HDMI and DVI-D port on the
    same encoder, pick the one to be considered connected
    based on the edid (HDMI if edid indicates HDMI, DVI
    otherwise).  Also, don't turn off (dpms) encoders that are
    shared.
    
    Fixes fdo bug 21767.
    
    Signed-off-by: Alex Deucher <alexdeucher at gmail.com>

diff --git a/src/radeon_output.c b/src/radeon_output.c
index edf59cd..6b6ba70 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -236,10 +236,40 @@ radeon_ddc_connected(xf86OutputPtr output)
 	case CONNECTOR_HDMI_TYPE_A:
 	case CONNECTOR_HDMI_TYPE_B:
 	    if (radeon_output->shared_ddc) {
+		xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn);
+		int i;
+
 		if (MonInfo->rawData[0x14] & 0x80) /* if it's digital and DVI/HDMI/etc. */
 		    MonType = MT_DFP;
 		else
 		    MonType = MT_NONE;
+
+		for (i = 0; i < config->num_output; i++) {
+		    if (output != config->output[i]) {
+			RADEONOutputPrivatePtr other_radeon_output =
+			    config->output[i]->driver_private;
+			if (radeon_output->devices & other_radeon_output->devices) {
+#ifndef EDID_COMPLETE_RAWDATA
+			    if (radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_A) {
+				MonType = MT_NONE;
+				break;
+			    }
+#else
+			    if (xf86MonitorIsHDMI(MonInfo)) {
+				if (radeon_output->ConnectorType == CONNECTOR_DVI_D) {
+				    MonType = MT_NONE;
+				    break;
+				}
+			    } else {
+				if (radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_A) {
+				    MonType = MT_NONE;
+				    break;
+				}
+			    }
+#endif
+			}
+		    }
+		}
 	    } else
 		MonType = MT_DFP;
 	    break;
@@ -334,6 +364,22 @@ radeon_dpms(xf86OutputPtr output, int mode)
     if ((mode == DPMSModeOn) && radeon_output->enabled)
 	return;
 
+    if ((mode != DPMSModeOn) && radeon_output->shared_ddc) {
+	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn);
+	int i;
+
+	for (i = 0; i < config->num_output; i++) {
+	    if (output != config->output[i]) {
+		RADEONOutputPrivatePtr other_radeon_output =
+		    config->output[i]->driver_private;
+		if (radeon_output->devices & other_radeon_output->devices) {
+		    if (output->status == XF86OutputStatusDisconnected)
+			return;
+		}
+	    }
+	}
+    }
+
     if (IS_AVIVO_VARIANT || info->r4xx_atom) {
 	atombios_output_dpms(output, mode);
     } else {


More information about the xorg-commit mailing list