]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/i915: Reject async flips if we need to change DDB/watermarks
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 30 Apr 2024 09:56:36 +0000 (12:56 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 3 May 2024 10:13:46 +0000 (13:13 +0300)
DDB/watermarks are always double buffered on the vblank, so we
can't safely change them during async flips. Currently this never
happens, but we'll be making changing between sync and async
flips a bit more flexible, in which case we can actually end up
here.

Reviewed-by: Vandita Kulkarni <vandita.kulkarni@intel.com>
Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240430095639.26390-3-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/skl_watermark.c

index 7c6187b4479fc3dfc7f6f67c18709db25f67ccc0..e6476aa621a7395a182673a8e47788ea9630257d 100644 (file)
@@ -2540,6 +2540,12 @@ skl_ddb_add_affected_planes(const struct intel_crtc_state *old_crtc_state,
                                        &new_crtc_state->wm.skl.plane_ddb_y[plane_id]))
                        continue;
 
+               if (new_crtc_state->do_async_flip) {
+                       drm_dbg_kms(&i915->drm, "[PLANE:%d:%s] Can't change DDB during async flip\n",
+                                   plane->base.base.id, plane->base.name);
+                       return -EINVAL;
+               }
+
                plane_state = intel_atomic_get_plane_state(state, plane);
                if (IS_ERR(plane_state))
                        return PTR_ERR(plane_state);
@@ -2899,6 +2905,12 @@ static int skl_wm_add_affected_planes(struct intel_atomic_state *state,
                                                 &new_crtc_state->wm.skl.optimal))
                        continue;
 
+               if (new_crtc_state->do_async_flip) {
+                       drm_dbg_kms(&i915->drm, "[PLANE:%d:%s] Can't change watermarks during async flip\n",
+                                   plane->base.base.id, plane->base.name);
+                       return -EINVAL;
+               }
+
                plane_state = intel_atomic_get_plane_state(state, plane);
                if (IS_ERR(plane_state))
                        return PTR_ERR(plane_state);