drm/i915: don't check inconsistent modeset state when force-restoring
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 11 Apr 2013 18:22:50 +0000 (20:22 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 18 Apr 2013 07:43:22 +0000 (09:43 +0200)
It will be only consistent once we've restored all the crtcs. Since a
bunch of other callers also want to just restore a single crtc, add a
boolean to disable checking only where it doesn't make sense.

Note that intel_modeset_setup_hw_state already has a call to
intel_modeset_check_state at the end, so we don't reduce the amount of
checking.

v2: Try harder not to create a big patch (Chris).

v3: Even smaller (still Chris). Also fix a trailing space.

References: https://lkml.org/lkml/2013/3/16/60
Cc: Tomas Melin <tomas.melin@iki.fi>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: stable@vger.kernel.org
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Tested-by: Tomas Melin <tomas.melin@iki.fi>
Tested-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_display.c

index 8809813..457a0a0 100644 (file)
@@ -7916,9 +7916,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;
@@ -8012,8 +8012,6 @@ done:
        if (ret && crtc->enabled) {
                crtc->hwmode = *saved_hwmode;
                crtc->mode = *saved_mode;
-       } else {
-               intel_modeset_check_state(dev);
        }
 
 out:
@@ -8022,6 +8020,20 @@ out:
        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);
@@ -9333,10 +9345,16 @@ setup_pipes:
        }
 
        if (force_restore) {
+               /*
+                * We need to use raw interfaces for restoring state to avoid
+                * checking (bogus) intermediate states.
+                */
                for_each_pipe(pipe) {
                        struct drm_crtc *crtc =
                                dev_priv->pipe_to_crtc_mapping[pipe];
-                       intel_crtc_restore_mode(crtc);
+
+                       __intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y,
+                                        crtc->fb);
                }
                list_for_each_entry(plane, &dev->mode_config.plane_list, head)
                        intel_plane_restore(plane);