summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2009-11-17 14:16:22 -0500
committerAlex Deucher <alexdeucher@gmail.com>2009-11-17 14:34:41 -0500
commit51266161f70baf4ddbf79ba6225ee2ae107a9f36 (patch)
treea213a4f5a093621690939b5dfd912bfb68016fd3
parentc2892cbd18e0f25401b615055425f727e096b7cd (diff)
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@gmail.com>
-rw-r--r--src/radeon_output.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/radeon_output.c b/src/radeon_output.c
index edf59cdc..6b6ba708 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 {