diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2018-10-03 10:49:51 -0400 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-10-17 21:23:36 -0400 |
commit | 7cada4d0b7a0fb813dbc9777fec092e9ed0546e9 (patch) | |
tree | d48bcfc8e248e552436a753a7aded97e557f0d7d | |
parent | 3f6d5ba173da9a41c799146a3ad999da2158716a (diff) |
drm/i915: Restore vblank interrupts earlier
Plane sanitation needs vblank interrupts (on account of CxSR disable).
So let's restore vblank interrupts earlier.
v2: Make it actually build
v3: Add comment to explain why we need this (Daniel)
Cc: stable@vger.kernel.org
Cc: Dennis <dennis.nezic@utoronto.ca>
Tested-by: Dennis <dennis.nezic@utoronto.ca>
Tested-by: Peter Nowee <peter.nowee@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105637
Fixes: b1e01595a66d ("drm/i915: Redo plane sanitation during readout")
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20181003144951.4397-1-ville.syrjala@linux.intel.com
(cherry picked from commit 68bc30deac625b8be8d3950b30dc93d09a3645f5)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index aa6e79dfd571..ce23b0546407 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -15526,13 +15526,9 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc, | |||
15526 | I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK); | 15526 | I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK); |
15527 | } | 15527 | } |
15528 | 15528 | ||
15529 | /* restore vblank interrupts to correct state */ | ||
15530 | drm_crtc_vblank_reset(&crtc->base); | ||
15531 | if (crtc->active) { | 15529 | if (crtc->active) { |
15532 | struct intel_plane *plane; | 15530 | struct intel_plane *plane; |
15533 | 15531 | ||
15534 | drm_crtc_vblank_on(&crtc->base); | ||
15535 | |||
15536 | /* Disable everything but the primary plane */ | 15532 | /* Disable everything but the primary plane */ |
15537 | for_each_intel_plane_on_crtc(dev, crtc, plane) { | 15533 | for_each_intel_plane_on_crtc(dev, crtc, plane) { |
15538 | const struct intel_plane_state *plane_state = | 15534 | const struct intel_plane_state *plane_state = |
@@ -15874,7 +15870,6 @@ intel_modeset_setup_hw_state(struct drm_device *dev, | |||
15874 | struct drm_modeset_acquire_ctx *ctx) | 15870 | struct drm_modeset_acquire_ctx *ctx) |
15875 | { | 15871 | { |
15876 | struct drm_i915_private *dev_priv = to_i915(dev); | 15872 | struct drm_i915_private *dev_priv = to_i915(dev); |
15877 | enum pipe pipe; | ||
15878 | struct intel_crtc *crtc; | 15873 | struct intel_crtc *crtc; |
15879 | struct intel_encoder *encoder; | 15874 | struct intel_encoder *encoder; |
15880 | int i; | 15875 | int i; |
@@ -15887,15 +15882,23 @@ intel_modeset_setup_hw_state(struct drm_device *dev, | |||
15887 | /* HW state is read out, now we need to sanitize this mess. */ | 15882 | /* HW state is read out, now we need to sanitize this mess. */ |
15888 | get_encoder_power_domains(dev_priv); | 15883 | get_encoder_power_domains(dev_priv); |
15889 | 15884 | ||
15890 | intel_sanitize_plane_mapping(dev_priv); | 15885 | /* |
15886 | * intel_sanitize_plane_mapping() may need to do vblank | ||
15887 | * waits, so we need vblank interrupts restored beforehand. | ||
15888 | */ | ||
15889 | for_each_intel_crtc(&dev_priv->drm, crtc) { | ||
15890 | drm_crtc_vblank_reset(&crtc->base); | ||
15891 | 15891 | ||
15892 | for_each_intel_encoder(dev, encoder) { | 15892 | if (crtc->active) |
15893 | intel_sanitize_encoder(encoder); | 15893 | drm_crtc_vblank_on(&crtc->base); |
15894 | } | 15894 | } |
15895 | 15895 | ||
15896 | for_each_pipe(dev_priv, pipe) { | 15896 | intel_sanitize_plane_mapping(dev_priv); |
15897 | crtc = intel_get_crtc_for_pipe(dev_priv, pipe); | ||
15898 | 15897 | ||
15898 | for_each_intel_encoder(dev, encoder) | ||
15899 | intel_sanitize_encoder(encoder); | ||
15900 | |||
15901 | for_each_intel_crtc(&dev_priv->drm, crtc) { | ||
15899 | intel_sanitize_crtc(crtc, ctx); | 15902 | intel_sanitize_crtc(crtc, ctx); |
15900 | intel_dump_pipe_config(crtc, crtc->config, | 15903 | intel_dump_pipe_config(crtc, crtc->config, |
15901 | "[setup_hw_state]"); | 15904 | "[setup_hw_state]"); |