aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-04-11 14:22:50 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-04-18 03:43:22 -0400
commitf30da187cdcd0939288038e11fb3bfbd1b655564 (patch)
tree9fdff9c04fc5bceac2cf093fce9dc85afc5c80f4
parent42b5aeabe9286cdaabfc9b0ce5fa869bbe04dcd9 (diff)
drm/i915: don't check inconsistent modeset state when force-restoring
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>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 880981360e09..457a0a03c063 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7916,9 +7916,9 @@ intel_modeset_check_state(struct drm_device *dev)
7916 } 7916 }
7917} 7917}
7918 7918
7919int intel_set_mode(struct drm_crtc *crtc, 7919static int __intel_set_mode(struct drm_crtc *crtc,
7920 struct drm_display_mode *mode, 7920 struct drm_display_mode *mode,
7921 int x, int y, struct drm_framebuffer *fb) 7921 int x, int y, struct drm_framebuffer *fb)
7922{ 7922{
7923 struct drm_device *dev = crtc->dev; 7923 struct drm_device *dev = crtc->dev;
7924 drm_i915_private_t *dev_priv = dev->dev_private; 7924 drm_i915_private_t *dev_priv = dev->dev_private;
@@ -8012,8 +8012,6 @@ done:
8012 if (ret && crtc->enabled) { 8012 if (ret && crtc->enabled) {
8013 crtc->hwmode = *saved_hwmode; 8013 crtc->hwmode = *saved_hwmode;
8014 crtc->mode = *saved_mode; 8014 crtc->mode = *saved_mode;
8015 } else {
8016 intel_modeset_check_state(dev);
8017 } 8015 }
8018 8016
8019out: 8017out:
@@ -8022,6 +8020,20 @@ out:
8022 return ret; 8020 return ret;
8023} 8021}
8024 8022
8023int intel_set_mode(struct drm_crtc *crtc,
8024 struct drm_display_mode *mode,
8025 int x, int y, struct drm_framebuffer *fb)
8026{
8027 int ret;
8028
8029 ret = __intel_set_mode(crtc, mode, x, y, fb);
8030
8031 if (ret == 0)
8032 intel_modeset_check_state(crtc->dev);
8033
8034 return ret;
8035}
8036
8025void intel_crtc_restore_mode(struct drm_crtc *crtc) 8037void intel_crtc_restore_mode(struct drm_crtc *crtc)
8026{ 8038{
8027 intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, crtc->fb); 8039 intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, crtc->fb);
@@ -9333,10 +9345,16 @@ setup_pipes:
9333 } 9345 }
9334 9346
9335 if (force_restore) { 9347 if (force_restore) {
9348 /*
9349 * We need to use raw interfaces for restoring state to avoid
9350 * checking (bogus) intermediate states.
9351 */
9336 for_each_pipe(pipe) { 9352 for_each_pipe(pipe) {
9337 struct drm_crtc *crtc = 9353 struct drm_crtc *crtc =
9338 dev_priv->pipe_to_crtc_mapping[pipe]; 9354 dev_priv->pipe_to_crtc_mapping[pipe];
9339 intel_crtc_restore_mode(crtc); 9355
9356 __intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y,
9357 crtc->fb);
9340 } 9358 }
9341 list_for_each_entry(plane, &dev->mode_config.plane_list, head) 9359 list_for_each_entry(plane, &dev->mode_config.plane_list, head)
9342 intel_plane_restore(plane); 9360 intel_plane_restore(plane);