[PATCH] drm/i915: don't check inconsistent modeset state when force-restoring

Tomas Melin tomas.melin at iki.fi
Wed Apr 10 11:32:43 PDT 2013


On Tue, Apr 9, 2013 at 10:51 PM, Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
> v2: Try harder not to create a big patch (Chris).
>
Tested the patch applied to 3.9-rc6. Atleast on my machine that
helped, although once I managed to get the error (but not warning and
call trace as before):
[drm:i9xx_crtc_mode_set] *ERROR* Couldn't find PLL settings for mode!


On Wed, Apr 10, 2013 at 8:27 PM, Richard Cochran
<richardcochran at gmail.com> wrote:
> I couldn't see right away how to fix it up, so I just compiled your
> drm-intel-next-queued plus this patch. If I close the netbook's lid
> and open it again, the screen is blank, no backlight, and the machine
> seems to be frozen.

The patch doesn't apply at all to 3.8 since function crtc_restore_mode
is missing and also 3.9-rc6 was quite different.
This version of the patch applies atleast to 3.9-rc6 if you want to test it:

>From 9f498da114cea3d82c291b7090d4441664d7870c Mon Sep 17 00:00:00 2001
From: Tomas Melin <tomas.melin at iki.fi>
Date: Wed, 10 Apr 2013 18:53:42 +0300
Subject: [PATCH] applied patch

---
 drivers/gpu/drm/i915/intel_display.c |   36 +++++++++++++++++++++++++++-------
 1 file changed, 29 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c
b/drivers/gpu/drm/i915/intel_display.c
index b20d501..83b11c5 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7771,9 +7771,9 @@ intel_modeset_check_state(struct drm_device *dev)
     }
 }

-int intel_set_mode(struct drm_crtc *crtc,
-           struct drm_display_mode *mode,
-           int x, int y, struct drm_framebuffer *fb)
+static int __intel_set_mode(struct drm_crtc *crtc,
+                struct drm_display_mode *mode,
+                int x, int y, struct drm_framebuffer *fb)
 {
     struct drm_device *dev = crtc->dev;
     drm_i915_private_t *dev_priv = dev->dev_private;
@@ -7863,18 +7863,33 @@ done:
     if (ret && crtc->enabled) {
         crtc->hwmode = *saved_hwmode;
         crtc->mode = *saved_mode;
-    } else {
-        intel_modeset_check_state(dev);
     }

 out:
     kfree(saved_mode);
     return ret;
 }
+int intel_set_mode(struct drm_crtc *crtc,
+             struct drm_display_mode *mode,
+             int x, int y, struct drm_framebuffer *fb)
+{
+    int ret;
+
+    ret = __intel_set_mode(crtc, mode, x, y, fb);
+
+    if (ret == 0)
+        intel_modeset_check_state(crtc->dev);
+
+    return ret;
+}
+
+

 void intel_crtc_restore_mode(struct drm_crtc *crtc)
 {
-    intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, crtc->fb);
+    __intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, crtc->fb);
+
+    intel_modeset_check_state(crtc->dev);
 }

 #undef for_each_intel_crtc_masked
@@ -9172,8 +9187,15 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
     }

     if (force_restore) {
+        /*
+         * We need to use raw interfaces for restoring state to avoid
+         * checking (bogus) intermediate states.
+         */
         for_each_pipe(pipe) {
-            intel_crtc_restore_mode(dev_priv->pipe_to_crtc_mapping[pipe]);
+             struct drm_crtc *crtc =
+                 dev_priv->pipe_to_crtc_mapping[pipe];
+            __intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y,
+                     crtc->fb);
         }

         i915_redisable_vga(dev);
--
1.7.9.5


More information about the dri-devel mailing list