A bit an oversight - the current code did nothing, since only
legacy flips used the unpin_work_count and assorted logic.

Cc: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
Cc: Ville Syrjälä <ville.syrj...@linux.intel.com>
Reviewed-by: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vet...@ffwll.ch>
---
 drivers/gpu/drm/i915/intel_display.c | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index fcbd4b7fa96c..bd0488a72503 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4149,21 +4149,22 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc)
 
 bool intel_has_pending_fb_unpin(struct drm_i915_private *dev_priv)
 {
-       struct intel_crtc *crtc;
-
-       /* Note that we don't need to be called with mode_config.lock here
-        * as our list of CRTC objects is static for the lifetime of the
-        * device and so cannot disappear as we iterate. Similarly, we can
-        * happily treat the predicates as racy, atomic checks as userspace
-        * cannot claim and pin a new fb without at least acquring the
-        * struct_mutex and so serialising with us.
-        */
-       for_each_intel_crtc(&dev_priv->drm, crtc) {
-               if (atomic_read(&crtc->unpin_work_count) == 0)
+       struct drm_crtc *crtc;
+       bool cleanup_done;
+
+       drm_for_each_crtc(crtc, &dev_priv->drm) {
+               struct drm_crtc_commit *commit;
+               spin_lock(&crtc->commit_lock);
+               commit = list_first_entry_or_null(&crtc->commit_list,
+                                                 struct drm_crtc_commit, 
commit_entry);
+               cleanup_done = commit ?
+                       try_wait_for_completion(&commit->cleanup_done) : true;
+               spin_unlock(&crtc->commit_lock);
+
+               if (cleanup_done)
                        continue;
 
-               if (crtc->flip_work)
-                       intel_wait_for_vblank(dev_priv, crtc->pipe);
+               drm_crtc_wait_one_vblank(crtc);
 
                return true;
        }
-- 
2.13.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to