diff options
author | Stuart Bennett <sb476@cam.ac.uk> | 2008-11-12 20:32:47 +0000 |
---|---|---|
committer | Stuart Bennett <sb476@cam.ac.uk> | 2008-11-22 21:58:35 +0000 |
commit | 763e0f88c79105a726ea05219875a25fc0129e1f (patch) | |
tree | ef5b601971514a3f1df7ec0d530c037447b0e990 /src/nv_output.c | |
parent | 9d8bd459485392ec21d90c405510f3f097a61921 (diff) |
randr12: allow ddc while crtc is locked
Diffstat (limited to 'src/nv_output.c')
-rw-r--r-- | src/nv_output.c | 25 |
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); |