diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2009-11-17 14:16:22 -0500 |
---|---|---|
committer | Alex Deucher <alexdeucher@gmail.com> | 2009-11-17 14:34:41 -0500 |
commit | 51266161f70baf4ddbf79ba6225ee2ae107a9f36 (patch) | |
tree | a213a4f5a093621690939b5dfd912bfb68016fd3 | |
parent | c2892cbd18e0f25401b615055425f727e096b7cd (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.c | 46 |
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 { |