summaryrefslogtreecommitdiffstats
path: root/queue-2.6.38/drm-i915-dp-be-paranoid-in-case-we-disable-a-dp-before-it-is-attached.patch
diff options
context:
space:
mode:
Diffstat (limited to 'queue-2.6.38/drm-i915-dp-be-paranoid-in-case-we-disable-a-dp-before-it-is-attached.patch')
-rw-r--r--queue-2.6.38/drm-i915-dp-be-paranoid-in-case-we-disable-a-dp-before-it-is-attached.patch60
1 files changed, 60 insertions, 0 deletions
diff --git a/queue-2.6.38/drm-i915-dp-be-paranoid-in-case-we-disable-a-dp-before-it-is-attached.patch b/queue-2.6.38/drm-i915-dp-be-paranoid-in-case-we-disable-a-dp-before-it-is-attached.patch
new file mode 100644
index 0000000000..adb20cb738
--- /dev/null
+++ b/queue-2.6.38/drm-i915-dp-be-paranoid-in-case-we-disable-a-dp-before-it-is-attached.patch
@@ -0,0 +1,60 @@
+From 31acbcc408f412d1ba73765b846c38642be553c3 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Sun, 17 Apr 2011 06:38:35 +0100
+Subject: drm/i915/dp: Be paranoid in case we disable a DP before it is attached
+
+From: Chris Wilson <chris@chris-wilson.co.uk>
+
+commit 31acbcc408f412d1ba73765b846c38642be553c3 upstream.
+
+Given that the hardware may be left in a random condition by the BIOS,
+it is conceivable that we then attempt to clear the DP_PIPEB_SELECT bit
+without us ever enabling/attaching the DP encoder to a pipe. Thus
+causing a NULL deference when we attempt to wait for a vblank on that
+crtc.
+
+Reported-and-tested-by: Bryan Christ <bryan.christ@gmail.com>
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=36314
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=36456
+Reported-and-tested-by: Bo Wang <bo.b.wang@intel.com>
+Signed-off-by: Keith Packard <keithp@keithp.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/gpu/drm/i915/intel_dp.c | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+--- a/drivers/gpu/drm/i915/intel_dp.c
++++ b/drivers/gpu/drm/i915/intel_dp.c
+@@ -1455,7 +1455,8 @@ intel_dp_link_down(struct intel_dp *inte
+
+ if (!HAS_PCH_CPT(dev) &&
+ I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) {
+- struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc);
++ struct drm_crtc *crtc = intel_dp->base.base.crtc;
++
+ /* Hardware workaround: leaving our transcoder select
+ * set to transcoder B while it's off will prevent the
+ * corresponding HDMI output on transcoder A.
+@@ -1470,7 +1471,19 @@ intel_dp_link_down(struct intel_dp *inte
+ /* Changes to enable or select take place the vblank
+ * after being written.
+ */
+- intel_wait_for_vblank(dev, intel_crtc->pipe);
++ if (crtc == NULL) {
++ /* We can arrive here never having been attached
++ * to a CRTC, for instance, due to inheriting
++ * random state from the BIOS.
++ *
++ * If the pipe is not running, play safe and
++ * wait for the clocks to stabilise before
++ * continuing.
++ */
++ POSTING_READ(intel_dp->output_reg);
++ msleep(50);
++ } else
++ intel_wait_for_vblank(dev, to_intel_crtc(crtc)->pipe);
+ }
+
+ I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN);