summaryrefslogtreecommitdiff
path: root/src/nv_output.c
diff options
context:
space:
mode:
authorStuart Bennett <sb476@cam.ac.uk>2008-11-12 20:32:47 +0000
committerStuart Bennett <sb476@cam.ac.uk>2008-11-22 21:58:35 +0000
commit763e0f88c79105a726ea05219875a25fc0129e1f (patch)
treeef5b601971514a3f1df7ec0d530c037447b0e990 /src/nv_output.c
parent9d8bd459485392ec21d90c405510f3f097a61921 (diff)
randr12: allow ddc while crtc is locked
Diffstat (limited to 'src/nv_output.c')
-rw-r--r--src/nv_output.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/nv_output.c b/src/nv_output.c
index b5cc054..0201ec9 100644
--- a/src/nv_output.c
+++ b/src/nv_output.c
@@ -147,6 +147,27 @@ update_output_fields(xf86OutputPtr output, struct nouveau_encoder *det_encoder)
}
}
+static bool edid_sink_connected(xf86OutputPtr output)
+{
+ struct nouveau_connector *nv_connector = to_nouveau_connector(output);
+ NVPtr pNv = NVPTR(output->scrn);
+ bool waslocked = NVLockVgaCrtcs(pNv, false);
+ bool wastied = nv_heads_tied(pNv);
+
+ if (wastied)
+ NVSetOwner(pNv, 0); /* necessary? */
+
+ nv_connector->edid = xf86OutputGetEDID(output, nv_connector->pDDCBus);
+ xf86OutputSetEDID(output, nv_connector->edid);
+
+ if (wastied)
+ NVSetOwner(pNv, 0x4);
+ if (waslocked)
+ NVLockVgaCrtcs(pNv, true);
+
+ return !!nv_connector->edid;
+}
+
static xf86OutputStatus
nv_output_detect(xf86OutputPtr output)
{
@@ -166,9 +187,7 @@ nv_output_detect(xf86OutputPtr output)
return NULL;
}
- if (nv_connector->pDDCBus &&
- (nv_connector->edid = xf86OutputGetEDID(output, nv_connector->pDDCBus),
- xf86OutputSetEDID(output, nv_connector->edid), nv_connector->edid)) {
+ if (nv_connector->pDDCBus && edid_sink_connected(output)) {
if (MULTIPLE_ENCODERS(nv_connector->possible_encoders)) {
if (nv_connector->edid->features.input_type)
det_encoder = find_encoder_by_type(OUTPUT_TMDS);