Commit f30da187 authored by Daniel Vetter's avatar Daniel Vetter

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Tested-by: default avatarTomas Melin <tomas.melin@iki.fi>
Tested-by: default avatarRichard Cochran <richardcochran@gmail.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 42b5aeab
...@@ -7916,9 +7916,9 @@ intel_modeset_check_state(struct drm_device *dev) ...@@ -7916,9 +7916,9 @@ intel_modeset_check_state(struct drm_device *dev)
} }
} }
int intel_set_mode(struct drm_crtc *crtc, static int __intel_set_mode(struct drm_crtc *crtc,
struct drm_display_mode *mode, struct drm_display_mode *mode,
int x, int y, struct drm_framebuffer *fb) int x, int y, struct drm_framebuffer *fb)
{ {
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
...@@ -8012,8 +8012,6 @@ int intel_set_mode(struct drm_crtc *crtc, ...@@ -8012,8 +8012,6 @@ int intel_set_mode(struct drm_crtc *crtc,
if (ret && crtc->enabled) { if (ret && crtc->enabled) {
crtc->hwmode = *saved_hwmode; crtc->hwmode = *saved_hwmode;
crtc->mode = *saved_mode; crtc->mode = *saved_mode;
} else {
intel_modeset_check_state(dev);
} }
out: out:
...@@ -8022,6 +8020,20 @@ int intel_set_mode(struct drm_crtc *crtc, ...@@ -8022,6 +8020,20 @@ int intel_set_mode(struct drm_crtc *crtc,
return ret; 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) 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);
...@@ -9333,10 +9345,16 @@ void intel_modeset_setup_hw_state(struct drm_device *dev, ...@@ -9333,10 +9345,16 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
} }
if (force_restore) { if (force_restore) {
/*
* We need to use raw interfaces for restoring state to avoid
* checking (bogus) intermediate states.
*/
for_each_pipe(pipe) { for_each_pipe(pipe) {
struct drm_crtc *crtc = struct drm_crtc *crtc =
dev_priv->pipe_to_crtc_mapping[pipe]; 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) list_for_each_entry(plane, &dev->mode_config.plane_list, head)
intel_plane_restore(plane); intel_plane_restore(plane);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment