drm/i915: Re-enable vblank irqs for already active pipes
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 20 May 2014 14:20:05 +0000 (17:20 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 21 May 2014 09:50:25 +0000 (11:50 +0200)
If a pipe is already active when we init/resume there might not be a
full modeset afterwards so drm_vblank_on() may not get called. In such
a case if someone is holding a vblank reference across a suspend/resume
cycle drm_vblank_get() called after resuming won't re-enable the vblank
interrupts.

So in order to make sure vblank interrupts get re-enabled post-resume,
call drm_vblank_on() in intel_sanitize_crtc() if the crtc is already
active.

v2: Also drm_vblank_off() if the pipe got disabled magically

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Testecase: igt/kms_flip/vblank-vs-suspend
Tested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_display.c

index 5f803f4..6c5db7c 100644 (file)
@@ -11778,6 +11778,12 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
        reg = PIPECONF(crtc->config.cpu_transcoder);
        I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
 
+       /* restore vblank interrupts to correct state */
+       if (crtc->active)
+               drm_vblank_on(dev, crtc->pipe);
+       else
+               drm_vblank_off(dev, crtc->pipe);
+
        /* We need to sanitize the plane -> pipe mapping first because this will
         * disable the crtc (and hence change the state) if it is wrong. Note
         * that gen4+ has a fixed plane -> pipe mapping.  */