From: Ville Syrjälä <ville.syrj...@linux.intel.com>

Don't leave stale flips hanging around the sprites' flip helpers
when the crtc is being disabled.

Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_atomic.c  |   15 +++++++++++++++
 drivers/gpu/drm/i915/intel_display.c |    4 ++--
 drivers/gpu/drm/i915/intel_drv.h     |    1 +
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_atomic.c 
b/drivers/gpu/drm/i915/intel_atomic.c
index 41885fa..41fd0d5 100644
--- a/drivers/gpu/drm/i915/intel_atomic.c
+++ b/drivers/gpu/drm/i915/intel_atomic.c
@@ -2449,3 +2449,18 @@ void intel_atomic_handle_vblank(struct drm_device *dev, 
int pipe)
                        drm_flip_helper_vblank(&intel_plane->flip_helper);
        }
 }
+
+void intel_atomic_clear_flips(struct drm_crtc *crtc)
+{
+       struct drm_device *dev = crtc->dev;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct intel_plane *intel_plane;
+       int pipe = intel_crtc->pipe;
+
+       drm_flip_helper_clear(&intel_crtc->flip_helper);
+
+       list_for_each_entry(intel_plane, &dev->mode_config.plane_list, 
base.head) {
+               if (intel_plane->pipe == pipe)
+                       drm_flip_helper_clear(&intel_plane->flip_helper);
+       }
+}
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 9903456..566bf29 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3566,7 +3566,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
                encoder->disable(encoder);
 
        intel_crtc_wait_for_pending_flips(crtc);
-       drm_flip_helper_clear(&intel_crtc->flip_helper);
+       intel_atomic_clear_flips(crtc);
        drm_vblank_off(dev, pipe);
        intel_crtc_update_cursor(crtc, false);
 
@@ -3688,7 +3688,7 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
 
        /* Give the overlay scaler a chance to disable if it's on this pipe */
        intel_crtc_wait_for_pending_flips(crtc);
-       drm_flip_helper_clear(&intel_crtc->flip_helper);
+       intel_atomic_clear_flips(crtc);
        drm_vblank_off(dev, pipe);
        intel_crtc_dpms_overlay(intel_crtc, false);
        intel_crtc_update_cursor(crtc, false);
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 92a9518..5b0789f 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -729,6 +729,7 @@ extern int intel_atomic_init(struct drm_device *dev);
 extern void intel_atomic_fini(struct drm_device *dev);
 extern void intel_atomic_free_events(struct drm_device *dev, struct drm_file 
*file);
 extern void intel_atomic_handle_vblank(struct drm_device *dev, int pipe);
+extern void intel_atomic_clear_flips(struct drm_crtc *crtc);
 
 extern void intel_enable_primary(struct drm_crtc *crtc);
 extern void intel_disable_primary(struct drm_crtc *crtc);
-- 
1.7.8.6

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to