127 lines
4.3 KiB
Diff
127 lines
4.3 KiB
Diff
From 3cd8c73bebbc64ab13173931012ed4a58717b446 Mon Sep 17 00:00:00 2001
|
|
From: Chris Wilson <chris@chris-wilson.co.uk>
|
|
Date: Tue, 12 Apr 2011 18:06:51 +0100
|
|
Subject: [PATCH 1/2] drm/i915: Sanitize the output registers after resume
|
|
|
|
commit f6e5b1603b8bb7131b6778d0d4e2e5dda120a379 upstream.
|
|
|
|
Similar to booting, we need to inspect the state left by the BIOS and
|
|
remove any conflicting bits before we take over. The example reported by
|
|
Seth Forshee is very similar to the bug we encountered with the state left
|
|
by grub2, that the crtc pipe<->planning mapping was reversed from our
|
|
expectations and so we failed to turn off the outputs when booting or,
|
|
in this case, resuming. This may be in fact the same bug, but triggered
|
|
at resume time.
|
|
|
|
This patch rearranges the code we already have to clear up the
|
|
conflicting state upon init and calls it from reset (which is called
|
|
after we have lost control of the hardware, i.e. along both the boot and
|
|
resume paths) instead.
|
|
|
|
Reported-and-tested-by: Seth Forshee <seth.forshee@canonical.com>
|
|
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=35796
|
|
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
|
Reviewed-by: Keith Packard <keithp@keithp.com>
|
|
Signed-off-by: Keith Packard <keithp@keithp.com>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
|
---
|
|
drivers/gpu/drm/i915/intel_display.c | 68 ++++++++++++++++++----------------
|
|
1 files changed, 36 insertions(+), 32 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
|
index cef853b..c7403e7 100644
|
|
--- a/drivers/gpu/drm/i915/intel_display.c
|
|
+++ b/drivers/gpu/drm/i915/intel_display.c
|
|
@@ -5764,36 +5764,6 @@ cleanup_work:
|
|
return ret;
|
|
}
|
|
|
|
-static void intel_crtc_reset(struct drm_crtc *crtc)
|
|
-{
|
|
- struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
|
-
|
|
- /* Reset flags back to the 'unknown' status so that they
|
|
- * will be correctly set on the initial modeset.
|
|
- */
|
|
- intel_crtc->dpms_mode = -1;
|
|
-}
|
|
-
|
|
-static struct drm_crtc_helper_funcs intel_helper_funcs = {
|
|
- .dpms = intel_crtc_dpms,
|
|
- .mode_fixup = intel_crtc_mode_fixup,
|
|
- .mode_set = intel_crtc_mode_set,
|
|
- .mode_set_base = intel_pipe_set_base,
|
|
- .mode_set_base_atomic = intel_pipe_set_base_atomic,
|
|
- .load_lut = intel_crtc_load_lut,
|
|
- .disable = intel_crtc_disable,
|
|
-};
|
|
-
|
|
-static const struct drm_crtc_funcs intel_crtc_funcs = {
|
|
- .reset = intel_crtc_reset,
|
|
- .cursor_set = intel_crtc_cursor_set,
|
|
- .cursor_move = intel_crtc_cursor_move,
|
|
- .gamma_set = intel_crtc_gamma_set,
|
|
- .set_config = drm_crtc_helper_set_config,
|
|
- .destroy = intel_crtc_destroy,
|
|
- .page_flip = intel_crtc_page_flip,
|
|
-};
|
|
-
|
|
static void intel_sanitize_modesetting(struct drm_device *dev,
|
|
int pipe, int plane)
|
|
{
|
|
@@ -5830,6 +5800,42 @@ static void intel_sanitize_modesetting(struct drm_device *dev,
|
|
intel_disable_pipe(dev_priv, pipe);
|
|
}
|
|
|
|
+static void intel_crtc_reset(struct drm_crtc *crtc)
|
|
+{
|
|
+ struct drm_device *dev = crtc->dev;
|
|
+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
|
+
|
|
+ /* Reset flags back to the 'unknown' status so that they
|
|
+ * will be correctly set on the initial modeset.
|
|
+ */
|
|
+ intel_crtc->dpms_mode = -1;
|
|
+
|
|
+ /* We need to fix up any BIOS configuration that conflicts with
|
|
+ * our expectations.
|
|
+ */
|
|
+ intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane);
|
|
+}
|
|
+
|
|
+static struct drm_crtc_helper_funcs intel_helper_funcs = {
|
|
+ .dpms = intel_crtc_dpms,
|
|
+ .mode_fixup = intel_crtc_mode_fixup,
|
|
+ .mode_set = intel_crtc_mode_set,
|
|
+ .mode_set_base = intel_pipe_set_base,
|
|
+ .mode_set_base_atomic = intel_pipe_set_base_atomic,
|
|
+ .load_lut = intel_crtc_load_lut,
|
|
+ .disable = intel_crtc_disable,
|
|
+};
|
|
+
|
|
+static const struct drm_crtc_funcs intel_crtc_funcs = {
|
|
+ .reset = intel_crtc_reset,
|
|
+ .cursor_set = intel_crtc_cursor_set,
|
|
+ .cursor_move = intel_crtc_cursor_move,
|
|
+ .gamma_set = intel_crtc_gamma_set,
|
|
+ .set_config = drm_crtc_helper_set_config,
|
|
+ .destroy = intel_crtc_destroy,
|
|
+ .page_flip = intel_crtc_page_flip,
|
|
+};
|
|
+
|
|
static void intel_crtc_init(struct drm_device *dev, int pipe)
|
|
{
|
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
@@ -5879,8 +5885,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
|
|
|
|
setup_timer(&intel_crtc->idle_timer, intel_crtc_idle_timer,
|
|
(unsigned long)intel_crtc);
|
|
-
|
|
- intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane);
|
|
}
|
|
|
|
int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
|
|
--
|
|
1.7.6.5
|
|
|