Message ID | 20240806135300.114469-2-andrealmeid@igalia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/atomic: Ease async flip restrictions | expand |
On Tue, Aug 06, 2024 at 10:52:59AM GMT, André Almeida wrote: > Currently, DRM atomic uAPI allows only primary planes to be flipped > asynchronously. However, each driver might be able to perform async > flips in other different plane types. To enable drivers to set their own > restrictions on which type of plane they can or cannot flip, use the > existing atomic_async_check() from struct drm_plane_helper_funcs to > enhance this flexibility, thus allowing different plane types to be able > to do async flips as well. > > In order to prevent regressions and such, we keep the current policy: we > skip the driver check for the primary plane, because it is always > allowed to do async flips on it. Unfortunately this needs to be rebased on top of 929725bd7eb4 ("drm/atomic: allow no-op FB_ID updates for async flips"), but the approach looks good to me and it fits the existing API. > > Signed-off-by: André Almeida <andrealmeid@igalia.com> > --- > drivers/gpu/drm/drm_atomic_uapi.c | 23 +++++++++++++++++------ > 1 file changed, 17 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c > index fc16fddee5c5..8568c2428670 100644 > --- a/drivers/gpu/drm/drm_atomic_uapi.c > +++ b/drivers/gpu/drm/drm_atomic_uapi.c > @@ -27,8 +27,9 @@ > * Daniel Vetter <daniel.vetter@ffwll.ch> > */ > > -#include <drm/drm_atomic_uapi.h> > #include <drm/drm_atomic.h> > +#include <drm/drm_atomic_helper.h> > +#include <drm/drm_atomic_uapi.h> > #include <drm/drm_framebuffer.h> > #include <drm/drm_print.h> > #include <drm/drm_drv.h> > @@ -1059,6 +1060,7 @@ 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)) { > @@ -1073,11 +1075,20 @@ int drm_atomic_set_property(struct drm_atomic_state *state, > break; > } > > - if (async_flip && plane_state->plane->type != DRM_PLANE_TYPE_PRIMARY) { > - drm_dbg_atomic(prop->dev, > - "[OBJECT:%d] Only primary planes can be changed during async flip\n", > - obj->id); > - ret = -EINVAL; > + if (async_flip) { > + /* we always allow primary planes */ > + 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); > + > + if (ret) { > + drm_dbg_atomic(prop->dev, > + "[PLANE:%d] does not support async flips\n", > + obj->id); > + } > + } > break; > } > > -- > 2.46.0 >
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index fc16fddee5c5..8568c2428670 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -27,8 +27,9 @@ * Daniel Vetter <daniel.vetter@ffwll.ch> */ -#include <drm/drm_atomic_uapi.h> #include <drm/drm_atomic.h> +#include <drm/drm_atomic_helper.h> +#include <drm/drm_atomic_uapi.h> #include <drm/drm_framebuffer.h> #include <drm/drm_print.h> #include <drm/drm_drv.h> @@ -1059,6 +1060,7 @@ 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)) { @@ -1073,11 +1075,20 @@ int drm_atomic_set_property(struct drm_atomic_state *state, break; } - if (async_flip && plane_state->plane->type != DRM_PLANE_TYPE_PRIMARY) { - drm_dbg_atomic(prop->dev, - "[OBJECT:%d] Only primary planes can be changed during async flip\n", - obj->id); - ret = -EINVAL; + if (async_flip) { + /* we always allow primary planes */ + 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); + + if (ret) { + drm_dbg_atomic(prop->dev, + "[PLANE:%d] does not support async flips\n", + obj->id); + } + } break; }
Currently, DRM atomic uAPI allows only primary planes to be flipped asynchronously. However, each driver might be able to perform async flips in other different plane types. To enable drivers to set their own restrictions on which type of plane they can or cannot flip, use the existing atomic_async_check() from struct drm_plane_helper_funcs to enhance this flexibility, thus allowing different plane types to be able to do async flips as well. In order to prevent regressions and such, we keep the current policy: we skip the driver check for the primary plane, because it is always allowed to do async flips on it. Signed-off-by: André Almeida <andrealmeid@igalia.com> --- drivers/gpu/drm/drm_atomic_uapi.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-)