diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-04-11 14:22:50 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-04-18 03:43:22 -0400 |
commit | f30da187cdcd0939288038e11fb3bfbd1b655564 (patch) | |
tree | 9fdff9c04fc5bceac2cf093fce9dc85afc5c80f4 | |
parent | 42b5aeabe9286cdaabfc9b0ce5fa869bbe04dcd9 (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.c | 30 |
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 | ||
7919 | int intel_set_mode(struct drm_crtc *crtc, | 7919 | static 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 | ||
8019 | out: | 8017 | out: |
@@ -8022,6 +8020,20 @@ out: | |||
8022 | return ret; | 8020 | return ret; |
8023 | } | 8021 | } |
8024 | 8022 | ||
8023 | int 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 | |||
8025 | void intel_crtc_restore_mode(struct drm_crtc *crtc) | 8037 | void 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); |