[PATCH v3] drm: don't run atomic_async_check for disabled planes

Murthy, Arun R arun.r.murthy at intel.com
Mon Aug 4 09:53:22 UTC 2025


On 01-08-2025 18:40, Xaver Hugl wrote:
> It's entirely valid and correct for compositors to include disabled
> planes in the atomic commit, and doing that should not prevent async
> flips from working. To fix that, this commit moves the plane check
> to after all the properties of the object have been set,
I dont think this is required. Again the plane states will have to be 
fetched outside the set_prop()

Alternate approach
@@ -1091,8 +1091,16 @@ int drm_atomic_set_property(struct 
drm_atomic_state *state,

                         /* ask the driver if this non-primary plane is 
supported */
                         if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
-                               ret = -EINVAL;
+                               /*
+                                * continue if no change in prop on 
non-supported async planes as well
+                                * or when disabling the plane
+                                */
+                               if (ret == 0 || (prop == 
config->prop_fb_id && prop_value == 0))
+  drm_dbg_atomic(prop->dev,
+ "[PLANE:%d:%s] continue async as there is no prop change\n",
+                                                      obj->id, 
plane->name);
+                               else
+                                       ret = -EINVAL;

                                 if (plane_funcs && 
plane_funcs->atomic_async_check)

Thanks and Regards,
Arun R Murthy
--------------------

>   and skips
> the async checks if the plane was and still is not visible.
>
> Fixes: fd40a63c drm/atomic (Let drivers decide which planes to async flip)
> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4263
>
> Signed-off-by: Xaver Hugl <xaver.hugl at kde.org>
> ---
>   drivers/gpu/drm/drm_atomic_uapi.c | 51 +++++++++++++++++++++----------
>   1 file changed, 35 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> index c2726af6698e..2ae41a522e92 100644
> --- a/drivers/gpu/drm/drm_atomic_uapi.c
> +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> @@ -1068,7 +1068,6 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
>   		struct drm_plane *plane = obj_to_plane(obj);
>   		struct drm_plane_state *plane_state;
>   		struct drm_mode_config *config = &plane->dev->mode_config;
> -		const struct drm_plane_helper_funcs *plane_funcs = plane->helper_private;
>   
>   		plane_state = drm_atomic_get_plane_state(state, plane);
>   		if (IS_ERR(plane_state)) {
> @@ -1084,21 +1083,8 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
>   				ret = drm_atomic_plane_get_property(plane, plane_state,
>   								    prop, &old_val);
>   				ret = drm_atomic_check_prop_changes(ret, old_val, prop_value, prop);
> -			}
> -
> -			/* ask the driver if this non-primary plane is supported */
> -			if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
> -				ret = -EINVAL;
> -
> -				if (plane_funcs && plane_funcs->atomic_async_check)
> -					ret = plane_funcs->atomic_async_check(plane, state, true);
> -
> -				if (ret) {
> -					drm_dbg_atomic(prop->dev,
> -						       "[PLANE:%d:%s] does not support async flips\n",
> -						       obj->id, plane->name);
> -					break;
> -				}
> +				if (ret)
> +				    break;
>   			}
>   		}
>   
> @@ -1394,6 +1380,10 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
>   	int ret = 0;
>   	unsigned int i, j, num_fences;
>   	bool async_flip = false;
> +	struct drm_plane *plane;
> +	struct drm_plane_state *old_plane_state = NULL;
> +	struct drm_plane_state *new_plane_state = NULL;
> +	u64 fb_id = 0;
>   
>   	/* disallow for drivers not supporting atomic: */
>   	if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
> @@ -1521,6 +1511,35 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
>   			copied_props++;
>   		}
>   
> +		if (async_flip && obj->type == DRM_MODE_OBJECT_PLANE &&
> +		    obj_to_plane(obj)->type != DRM_PLANE_TYPE_PRIMARY) {
> +			/* need to ask the driver if this plane is supported */
> +			plane = obj_to_plane(obj);
> +			old_plane_state = drm_atomic_get_old_plane_state(state, plane);
> +			new_plane_state = drm_atomic_get_new_plane_state(state, plane);
> +			ret = drm_atomic_plane_get_property(plane, new_plane_state,
> +							    dev->mode_config.prop_fb_id,
> +							    &fb_id);
> +			if (ret)
> +				break;
> +			/*
> +			 * Only do the check if the plane was or is enabled.
> +			 * Note that the new state doesn't have "visible" set yet,
> +			 * so this uses fb_id instead.
> +			 */
> +			if (old_plane_state->visible || fb_id)
> +				ret = -EINVAL;
> +			if (ret && plane->helper_private &&
> +			    plane->helper_private->atomic_async_check) {
> +				ret = plane->helper_private->atomic_async_check(plane, state, true);
> +			}
> +			if (ret) {
> +				drm_dbg_atomic(dev, "[PLANE:%d:%s] does not support async flips\n",
> +						obj->id, plane->name);
> +				break;
> +			}
> +		}
> +
>   		drm_mode_object_put(obj);
>   	}
>   


More information about the Intel-gfx mailing list