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:27:42 -0500
commit437113124bbd6fb166825169eabec4dfde900dd9 (patch)
treee8e3fcd6e44fff84bb8c1489ed31645b3b0fc378
parent9b8605d4e2bf7703c7848f3e2022a8c7328a3acd (diff)
radeon: deal with connectors sourced to the same encoderHEADmaster
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 42d37fa..24e07db 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -322,10 +322,40 @@ radeon_ddc_connected(xf86OutputPtr output)
case CONNECTOR_DVI_D:
case CONNECTOR_HDMI_TYPE_A:
if (radeon_output->shared_ddc) {
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn);
+ int i;
+
if (monitor_is_digital(MonInfo))
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;
@@ -422,6 +452,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 {