]> git.itanic.dy.fi Git - linux-stable/commitdiff
drm/i915/display: Check async flip state of every crtc and plane once
authorJosé Roberto de Souza <jose.souza@intel.com>
Fri, 29 Oct 2021 20:24:32 +0000 (13:24 -0700)
committerJosé Roberto de Souza <jose.souza@intel.com>
Mon, 1 Nov 2021 17:36:40 +0000 (10:36 -0700)
For every crtc in state, intel_atomic_check_async() was checking all
the crtc and plane states again.

v2: comparing pipe ids instead of crtc pointers when iterating over
planes

Cc: Karthik B S <karthik.b.s@intel.com>
Cc: Vandita Kulkarni <vandita.kulkarni@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211029202432.140745-1-jose.souza@intel.com
drivers/gpu/drm/i915/display/intel_display.c

index 79cd158503b37f53f82c27b33d9ae5727cbe10c3..e494028260621c50b4f0984915bc38acfc7a5aad 100644 (file)
@@ -7707,35 +7707,37 @@ static void kill_bigjoiner_slave(struct intel_atomic_state *state,
  * correspond to the last vblank and have no relation to the actual time when
  * the flip done event was sent.
  */
-static int intel_atomic_check_async(struct intel_atomic_state *state)
+static int intel_atomic_check_async(struct intel_atomic_state *state, struct intel_crtc *crtc)
 {
        struct drm_i915_private *i915 = to_i915(state->base.dev);
        const struct intel_crtc_state *old_crtc_state, *new_crtc_state;
        const struct intel_plane_state *new_plane_state, *old_plane_state;
-       struct intel_crtc *crtc;
        struct intel_plane *plane;
        int i;
 
-       for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
-                                           new_crtc_state, i) {
-               if (intel_crtc_needs_modeset(new_crtc_state)) {
-                       drm_dbg_kms(&i915->drm, "Modeset Required. Async flip not supported\n");
-                       return -EINVAL;
-               }
+       old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
+       new_crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
 
-               if (!new_crtc_state->hw.active) {
-                       drm_dbg_kms(&i915->drm, "CRTC inactive\n");
-                       return -EINVAL;
-               }
-               if (old_crtc_state->active_planes != new_crtc_state->active_planes) {
-                       drm_dbg_kms(&i915->drm,
-                                   "Active planes cannot be changed during async flip\n");
-                       return -EINVAL;
-               }
+       if (intel_crtc_needs_modeset(new_crtc_state)) {
+               drm_dbg_kms(&i915->drm, "Modeset Required. Async flip not supported\n");
+               return -EINVAL;
+       }
+
+       if (!new_crtc_state->hw.active) {
+               drm_dbg_kms(&i915->drm, "CRTC inactive\n");
+               return -EINVAL;
+       }
+       if (old_crtc_state->active_planes != new_crtc_state->active_planes) {
+               drm_dbg_kms(&i915->drm,
+                           "Active planes cannot be changed during async flip\n");
+               return -EINVAL;
        }
 
        for_each_oldnew_intel_plane_in_state(state, plane, old_plane_state,
                                             new_plane_state, i) {
+               if (plane->pipe != crtc->pipe)
+                       continue;
+
                /*
                 * TODO: Async flip is only supported through the page flip IOCTL
                 * as of now. So support currently added for primary plane only.
@@ -8054,7 +8056,7 @@ static int intel_atomic_check(struct drm_device *dev,
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
                                            new_crtc_state, i) {
                if (new_crtc_state->uapi.async_flip) {
-                       ret = intel_atomic_check_async(state);
+                       ret = intel_atomic_check_async(state, crtc);
                        if (ret)
                                goto fail;
                }