Message ID | 20240612193713.167448-3-andrealmeid@igalia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/atomic: Allow drivers to write their own plane check for async | expand |
On Wed, Jun 12, 2024 at 04:37:12PM -0300, André Almeida wrote: > Different planes may have different capabilities of doing async flips, > so create a field to let drivers allow async flip per plane type. > > Signed-off-by: André Almeida <andrealmeid@igalia.com> > --- > drivers/gpu/drm/drm_atomic_uapi.c | 4 ++-- > drivers/gpu/drm/drm_plane.c | 3 +++ > include/drm/drm_plane.h | 5 +++++ > 3 files changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c > index 2e1d9391febe..dd4b1578f141 100644 > --- a/drivers/gpu/drm/drm_atomic_uapi.c > +++ b/drivers/gpu/drm/drm_atomic_uapi.c > @@ -1079,9 +1079,9 @@ int drm_atomic_set_property(struct drm_atomic_state *state, > break; > } > > - if (async_flip && plane_state->plane->type != DRM_PLANE_TYPE_PRIMARY) { > + if (async_flip && !plane_state->plane->async_flip) { You alreayd have 'plane', no need to dog it out again. > drm_dbg_atomic(prop->dev, > - "[OBJECT:%d] Only primary planes can be changed during async flip\n", > + "[OBJECT:%d] This type of plane cannot be changed during async flip\n", > obj->id); "[PLANE:%d:%s] does not support async flips" or something like it would make more sense to me. > ret = -EINVAL; > break; > diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c > index 57662a1fd345..bbcec3940636 100644 > --- a/drivers/gpu/drm/drm_plane.c > +++ b/drivers/gpu/drm/drm_plane.c > @@ -385,6 +385,9 @@ static int __drm_universal_plane_init(struct drm_device *dev, > > drm_modeset_lock_init(&plane->mutex); > > + if (type == DRM_PLANE_TYPE_PRIMARY) > + plane->async_flip = true; Setting that would be the job of the driver. You could probably just nuke mode_config.async_page_flip and replace it fully with plane.async_flip checks. > + > plane->base.properties = &plane->properties; > plane->dev = dev; > plane->funcs = funcs; > diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h > index 9507542121fa..0bebc72af5c3 100644 > --- a/include/drm/drm_plane.h > +++ b/include/drm/drm_plane.h > @@ -786,6 +786,11 @@ struct drm_plane { > * @kmsg_panic: Used to register a panic notifier for this plane > */ > struct kmsg_dumper kmsg_panic; > + > + /** > + * @async_flip: indicates if a plane can do async flips > + */ > + bool async_flip; > }; > > #define obj_to_plane(x) container_of(x, struct drm_plane, base) > -- > 2.45.2
On Wed, Jun 12, 2024 at 04:37:12PM -0300, André Almeida wrote: > Different planes may have different capabilities of doing async flips, > so create a field to let drivers allow async flip per plane type. > > Signed-off-by: André Almeida <andrealmeid@igalia.com> > --- > drivers/gpu/drm/drm_atomic_uapi.c | 4 ++-- > drivers/gpu/drm/drm_plane.c | 3 +++ > include/drm/drm_plane.h | 5 +++++ > 3 files changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c > index 57662a1fd345..bbcec3940636 100644 > --- a/drivers/gpu/drm/drm_plane.c > +++ b/drivers/gpu/drm/drm_plane.c > @@ -385,6 +385,9 @@ static int __drm_universal_plane_init(struct drm_device *dev, > > drm_modeset_lock_init(&plane->mutex); > > + if (type == DRM_PLANE_TYPE_PRIMARY) > + plane->async_flip = true; > + Why? Also note that the commit message writes about adding the field, not about enabling it for the primary planes. > plane->base.properties = &plane->properties; > plane->dev = dev; > plane->funcs = funcs;
Hi Dmitry, Em 12/06/2024 17:45, Dmitry Baryshkov escreveu: > On Wed, Jun 12, 2024 at 04:37:12PM -0300, André Almeida wrote: >> Different planes may have different capabilities of doing async flips, >> so create a field to let drivers allow async flip per plane type. >> >> Signed-off-by: André Almeida <andrealmeid@igalia.com> >> --- >> drivers/gpu/drm/drm_atomic_uapi.c | 4 ++-- >> drivers/gpu/drm/drm_plane.c | 3 +++ >> include/drm/drm_plane.h | 5 +++++ >> 3 files changed, 10 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c >> index 57662a1fd345..bbcec3940636 100644 >> --- a/drivers/gpu/drm/drm_plane.c >> +++ b/drivers/gpu/drm/drm_plane.c >> @@ -385,6 +385,9 @@ static int __drm_universal_plane_init(struct drm_device *dev, >> >> drm_modeset_lock_init(&plane->mutex); >> >> + if (type == DRM_PLANE_TYPE_PRIMARY) >> + plane->async_flip = true; >> + > > Why? Also note that the commit message writes about adding the field, > not about enabling it for the primary planes. > This is not meant to have any function change actually, just to enable per-plane configuration. Currently, any driver that supports async page flip in atomic API supports flipping the primary plane. But as Ville pointed out, that belongs to driver code, so I'll move there, hope that it makes more clear >> plane->base.properties = &plane->properties; >> plane->dev = dev; >> plane->funcs = funcs; > >
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index 2e1d9391febe..dd4b1578f141 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -1079,9 +1079,9 @@ int drm_atomic_set_property(struct drm_atomic_state *state, break; } - if (async_flip && plane_state->plane->type != DRM_PLANE_TYPE_PRIMARY) { + if (async_flip && !plane_state->plane->async_flip) { drm_dbg_atomic(prop->dev, - "[OBJECT:%d] Only primary planes can be changed during async flip\n", + "[OBJECT:%d] This type of plane cannot be changed during async flip\n", obj->id); ret = -EINVAL; break; diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c index 57662a1fd345..bbcec3940636 100644 --- a/drivers/gpu/drm/drm_plane.c +++ b/drivers/gpu/drm/drm_plane.c @@ -385,6 +385,9 @@ static int __drm_universal_plane_init(struct drm_device *dev, drm_modeset_lock_init(&plane->mutex); + if (type == DRM_PLANE_TYPE_PRIMARY) + plane->async_flip = true; + plane->base.properties = &plane->properties; plane->dev = dev; plane->funcs = funcs; diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h index 9507542121fa..0bebc72af5c3 100644 --- a/include/drm/drm_plane.h +++ b/include/drm/drm_plane.h @@ -786,6 +786,11 @@ struct drm_plane { * @kmsg_panic: Used to register a panic notifier for this plane */ struct kmsg_dumper kmsg_panic; + + /** + * @async_flip: indicates if a plane can do async flips + */ + bool async_flip; }; #define obj_to_plane(x) container_of(x, struct drm_plane, base)
Different planes may have different capabilities of doing async flips, so create a field to let drivers allow async flip per plane type. Signed-off-by: André Almeida <andrealmeid@igalia.com> --- drivers/gpu/drm/drm_atomic_uapi.c | 4 ++-- drivers/gpu/drm/drm_plane.c | 3 +++ include/drm/drm_plane.h | 5 +++++ 3 files changed, 10 insertions(+), 2 deletions(-)