Jonathan Nieder wrote:

> If you get a chance to test the patch against 3.0.y or 3.2.y, that
> would be very helpful.

Here's a blind backport to 2.6.32.y.  I'd be interested to hear
whether the kernel in squeeze is affected, and if so, whether this
patch helps and has no bad side-effects.
From: Daniel Vetter <daniel.vet...@ffwll.ch>
Date: Fri, 20 Apr 2012 21:03:36 +0200
Subject: drm/i915: fixup load-detect on enabled, but not active pipe

commit e95c8438ea1c56c254f0607c8fb6bca7f463c744 upstream.

Somehow we have a fast-path that tries to avoid going through
the load-detect code when the encode already has a crtc associated.
But this fails horribly when the crtc is off. The load detect pipe
itself manages this case well (and also does not forget to restore the
dpms state), so just rip out this special case.

The issue seems to go back all the way to the commit that originally
introduced load-detection on the vga output:

commit e4a5d54f924ea5ce2913d9d0687d034004816465
Author: Ma Ling <ling...@intel.com>
Date:   Tue May 26 11:31:00 2009 +0800

    drm/i915: Add support for VGA load detection (pre-945).

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=43020
Reported-by: Jean Delvare <kh...@linux-fr.org>
Reviewed-by: Chris Wilson <ch...@chris-wilson.co.uk>
Signed-Off-by: Daniel Vetter <daniel.vet...@ffwll.ch>
Signed-off-by: Jonathan Nieder <jrnie...@gmail.com>
---
 drivers/gpu/drm/i915/intel_crt.c |   18 ++++++------------
 1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index 166a24e76b21..b70d179bfd67 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -415,7 +415,6 @@ static enum drm_connector_status intel_crt_detect(struct drm_connector *connecto
 {
 	struct drm_device *dev = connector->dev;
 	struct intel_output *intel_output = to_intel_output(connector);
-	struct drm_encoder *encoder = &intel_output->enc;
 	struct drm_crtc *crtc;
 	int dpms_mode;
 	enum drm_connector_status status;
@@ -431,17 +430,12 @@ static enum drm_connector_status intel_crt_detect(struct drm_connector *connecto
 		return connector_status_connected;
 
 	/* for pre-945g platforms use load detect */
-	if (encoder->crtc && encoder->crtc->enabled) {
-		status = intel_crt_load_detect(encoder->crtc, intel_output);
-	} else {
-		crtc = intel_get_load_detect_pipe(intel_output,
-						  NULL, &dpms_mode);
-		if (crtc) {
-			status = intel_crt_load_detect(crtc, intel_output);
-			intel_release_load_detect_pipe(intel_output, dpms_mode);
-		} else
-			status = connector_status_unknown;
-	}
+	crtc = intel_get_load_detect_pipe(intel_output, NULL, &dpms_mode);
+	if (crtc) {
+		status = intel_crt_load_detect(crtc, intel_output);
+		intel_release_load_detect_pipe(intel_output, dpms_mode);
+	} else
+		status = connector_status_unknown;
 
 	return status;
 }
-- 
1.7.10

Reply via email to