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>
This commit is contained in:
Родитель
42b5aeabe9
Коммит
f30da187cd
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче