diff options
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.patch | 60 |
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); |