[PATCH 5/7] drm/plane-helper: Export individual helpers

Daniel Vetter daniel at ffwll.ch
Tue Sep 6 19:15:30 UTC 2022


On Thu, Aug 11, 2022 at 08:32:19PM +0200, Thomas Zimmermann wrote:
> Hi
> 
> Am 11.08.22 um 18:41 schrieb Daniel Vetter:
> > On Wed, Jul 20, 2022 at 10:30:56AM +0200, Thomas Zimmermann wrote:
> > > Export the individual plane helpers that make up the plane functions and
> > > align the naming with other helpers. The plane helpers are for non-atomic
> > > modesetting and exporting them will simplify a later conversion of drivers
> > > to atomic modesetting.
> > > 
> > > With struct drm_plane_funcs removed from drm_plane_helper.h, also remove
> > > the include statements. It only needs linux/types.h for uint32_t and a
> > > number of forward declarations.
> > > 
> > > Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> > 
> > So my commit message was maybe not super motivated, but I intentionally
> > hid these because atomic drivers where using them, which is all bad no
> > good. Now they're more exposed again, which sucks a bit. Exporting the
> > complete function table for legacy helpers (and the one open-coded one in
> > nouveau, not sure we could not move that back to drm_crtc_init) feels much
> > safer against abuse to me.
> > 
> > I'm not entirely clear why we're doing this, because the include untangle
> > could also have been achieved with a struct forward decl, which is what
> > we're usually doing. Can we walk this back please, or am I missing
> > something here?
> 
> I don't think you miss anything. It's just ugly to export the complete funcs
> table. If we roll that change back, let's add a comment that states the
> rational you wrote here.

So I'm way behind on everything, but maybe another option is to just check
in these functions that it's not an atomic modeset driver (i.e.
drm_drv_uses_atomic_modeset()). Or we just hope driver authors are smarter
now and there wont be fallout.

I'm also not clear on why exporting the entire vfunc table is a bad idea?

Either way I'd say up to you.
-Daniel

> 
> Best regards
> Thomas
> 
> > 
> > Cheers, Daniel
> > 
> > > ---
> > >   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  3 +-
> > >   drivers/gpu/drm/armada/armada_plane.c         |  2 +-
> > >   drivers/gpu/drm/drm_modeset_helper.c          |  8 ++-
> > >   drivers/gpu/drm/drm_plane_helper.c            | 70 ++++++++++++++-----
> > >   drivers/gpu/drm/nouveau/dispnv04/crtc.c       |  8 ++-
> > >   drivers/gpu/drm/qxl/qxl_display.c             |  4 +-
> > >   drivers/gpu/drm/vboxvideo/vbox_mode.c         |  4 +-
> > >   include/drm/drm_plane_helper.h                | 22 ++++--
> > >   8 files changed, 88 insertions(+), 33 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > > index 3e83fed540e8..1548f0a1b1c0 100644
> > > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > > @@ -86,6 +86,7 @@
> > >   #include <drm/drm_vblank.h>
> > >   #include <drm/drm_audio_component.h>
> > >   #include <drm/drm_gem_atomic_helper.h>
> > > +#include <drm/drm_plane_helper.h>
> > >   #include "ivsrcid/dcn/irqsrcs_dcn_1_0.h"
> > > @@ -7824,7 +7825,7 @@ static void dm_drm_plane_destroy_state(struct drm_plane *plane,
> > >   static const struct drm_plane_funcs dm_plane_funcs = {
> > >   	.update_plane	= drm_atomic_helper_update_plane,
> > >   	.disable_plane	= drm_atomic_helper_disable_plane,
> > > -	.destroy	= drm_primary_helper_destroy,
> > > +	.destroy	= drm_plane_helper_destroy,
> > >   	.reset = dm_drm_plane_reset,
> > >   	.atomic_duplicate_state = dm_drm_plane_duplicate_state,
> > >   	.atomic_destroy_state = dm_drm_plane_destroy_state,
> > > diff --git a/drivers/gpu/drm/armada/armada_plane.c b/drivers/gpu/drm/armada/armada_plane.c
> > > index 959d7f0a5108..cc47c032dbc1 100644
> > > --- a/drivers/gpu/drm/armada/armada_plane.c
> > > +++ b/drivers/gpu/drm/armada/armada_plane.c
> > > @@ -288,7 +288,7 @@ struct drm_plane_state *armada_plane_duplicate_state(struct drm_plane *plane)
> > >   static const struct drm_plane_funcs armada_primary_plane_funcs = {
> > >   	.update_plane	= drm_atomic_helper_update_plane,
> > >   	.disable_plane	= drm_atomic_helper_disable_plane,
> > > -	.destroy	= drm_primary_helper_destroy,
> > > +	.destroy	= drm_plane_helper_destroy,
> > >   	.reset		= armada_plane_reset,
> > >   	.atomic_duplicate_state = armada_plane_duplicate_state,
> > >   	.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
> > > diff --git a/drivers/gpu/drm/drm_modeset_helper.c b/drivers/gpu/drm/drm_modeset_helper.c
> > > index 0f08319453b2..bd609a978848 100644
> > > --- a/drivers/gpu/drm/drm_modeset_helper.c
> > > +++ b/drivers/gpu/drm/drm_modeset_helper.c
> > > @@ -108,6 +108,12 @@ static const uint32_t safe_modeset_formats[] = {
> > >   	DRM_FORMAT_ARGB8888,
> > >   };
> > > +static const struct drm_plane_funcs primary_plane_funcs = {
> > > +	.update_plane = drm_plane_helper_update_primary,
> > > +	.disable_plane = drm_plane_helper_disable_primary,
> > > +	.destroy = drm_plane_helper_destroy,
> > > +};
> > > +
> > >   static struct drm_plane *create_primary_plane(struct drm_device *dev)
> > >   {
> > >   	struct drm_plane *primary;
> > > @@ -127,7 +133,7 @@ static struct drm_plane *create_primary_plane(struct drm_device *dev)
> > >   	/* possible_crtc's will be filled in later by crtc_init */
> > >   	ret = drm_universal_plane_init(dev, primary, 0,
> > > -				       &drm_primary_helper_funcs,
> > > +				       &primary_plane_funcs,
> > >   				       safe_modeset_formats,
> > >   				       ARRAY_SIZE(safe_modeset_formats),
> > >   				       NULL,
> > > diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
> > > index bc08edd69030..c7785967f5bf 100644
> > > --- a/drivers/gpu/drm/drm_plane_helper.c
> > > +++ b/drivers/gpu/drm/drm_plane_helper.c
> > > @@ -145,13 +145,36 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
> > >   	return 0;
> > >   }
> > > -static int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *crtc,
> > > -				     struct drm_framebuffer *fb,
> > > -				     int crtc_x, int crtc_y,
> > > -				     unsigned int crtc_w, unsigned int crtc_h,
> > > -				     uint32_t src_x, uint32_t src_y,
> > > -				     uint32_t src_w, uint32_t src_h,
> > > -				     struct drm_modeset_acquire_ctx *ctx)
> > > +/**
> > > + * drm_plane_helper_update_primary - Helper for updating primary planes
> > > + * @plane: plane to update
> > > + * @crtc: the plane's new CRTC
> > > + * @fb: the plane's new framebuffer
> > > + * @crtc_x: x coordinate within CRTC
> > > + * @crtc_y: y coordinate within CRTC
> > > + * @crtc_w: width coordinate within CRTC
> > > + * @crtc_h: height coordinate within CRTC
> > > + * @src_x: x coordinate within source
> > > + * @src_y: y coordinate within source
> > > + * @src_w: width coordinate within source
> > > + * @src_h: height coordinate within source
> > > + * @ctx: modeset locking context
> > > + *
> > > + * This helper validates the given parameters and updates the primary plane.
> > > + *
> > > + * This function is only useful for non-atomic modesetting. Don't use
> > > + * it in new drivers.
> > > + *
> > > + * Returns:
> > > + * Zero on success, or an errno code otherwise.
> > > + */
> > > +int drm_plane_helper_update_primary(struct drm_plane *plane, struct drm_crtc *crtc,
> > > +				    struct drm_framebuffer *fb,
> > > +				    int crtc_x, int crtc_y,
> > > +				    unsigned int crtc_w, unsigned int crtc_h,
> > > +				    uint32_t src_x, uint32_t src_y,
> > > +				    uint32_t src_w, uint32_t src_h,
> > > +				    struct drm_modeset_acquire_ctx *ctx)
> > >   {
> > >   	struct drm_mode_set set = {
> > >   		.crtc = crtc,
> > > @@ -218,31 +241,40 @@ static int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *c
> > >   	kfree(connector_list);
> > >   	return ret;
> > >   }
> > > +EXPORT_SYMBOL(drm_plane_helper_update_primary);
> > > -static int drm_primary_helper_disable(struct drm_plane *plane,
> > > -				      struct drm_modeset_acquire_ctx *ctx)
> > > +/**
> > > + * drm_plane_helper_disable_primary - Helper for disabling primary planes
> > > + * @plane: plane to disable
> > > + * @ctx: modeset locking context
> > > + *
> > > + * This helper returns an error when trying to disable the primary
> > > + * plane.
> > > + *
> > > + * This function is only useful for non-atomic modesetting. Don't use
> > > + * it in new drivers.
> > > + *
> > > + * Returns:
> > > + * An errno code.
> > > + */
> > > +int drm_plane_helper_disable_primary(struct drm_plane *plane,
> > > +				     struct drm_modeset_acquire_ctx *ctx)
> > >   {
> > >   	return -EINVAL;
> > >   }
> > > +EXPORT_SYMBOL(drm_plane_helper_disable_primary);
> > >   /**
> > > - * drm_primary_helper_destroy() - Helper for primary plane destruction
> > > + * drm_plane_helper_destroy() - Helper for primary plane destruction
> > >    * @plane: plane to destroy
> > >    *
> > >    * Provides a default plane destroy handler for primary planes.  This handler
> > >    * is called during CRTC destruction.  We disable the primary plane, remove
> > >    * it from the DRM plane list, and deallocate the plane structure.
> > >    */
> > > -void drm_primary_helper_destroy(struct drm_plane *plane)
> > > +void drm_plane_helper_destroy(struct drm_plane *plane)
> > >   {
> > >   	drm_plane_cleanup(plane);
> > >   	kfree(plane);
> > >   }
> > > -EXPORT_SYMBOL(drm_primary_helper_destroy);
> > > -
> > > -const struct drm_plane_funcs drm_primary_helper_funcs = {
> > > -	.update_plane = drm_primary_helper_update,
> > > -	.disable_plane = drm_primary_helper_disable,
> > > -	.destroy = drm_primary_helper_destroy,
> > > -};
> > > -EXPORT_SYMBOL(drm_primary_helper_funcs);
> > > +EXPORT_SYMBOL(drm_plane_helper_destroy);
> > > diff --git a/drivers/gpu/drm/nouveau/dispnv04/crtc.c b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
> > > index f9e962fd94d0..660c4cbc0b3d 100644
> > > --- a/drivers/gpu/drm/nouveau/dispnv04/crtc.c
> > > +++ b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
> > > @@ -1275,6 +1275,12 @@ static const uint32_t modeset_formats[] = {
> > >           DRM_FORMAT_XRGB1555,
> > >   };
> > > +static const struct drm_plane_funcs nv04_primary_plane_funcs = {
> > > +	.update_plane = drm_plane_helper_update_primary,
> > > +	.disable_plane = drm_plane_helper_disable_primary,
> > > +	.destroy = drm_plane_helper_destroy,
> > > +};
> > > +
> > >   static struct drm_plane *
> > >   create_primary_plane(struct drm_device *dev)
> > >   {
> > > @@ -1289,7 +1295,7 @@ create_primary_plane(struct drm_device *dev)
> > >           /* possible_crtc's will be filled in later by crtc_init */
> > >           ret = drm_universal_plane_init(dev, primary, 0,
> > > -                                       &drm_primary_helper_funcs,
> > > +				       &nv04_primary_plane_funcs,
> > >                                          modeset_formats,
> > >                                          ARRAY_SIZE(modeset_formats), NULL,
> > >                                          DRM_PLANE_TYPE_PRIMARY, NULL);
> > > diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
> > > index 2e8949863d6b..a152a7c6db21 100644
> > > --- a/drivers/gpu/drm/qxl/qxl_display.c
> > > +++ b/drivers/gpu/drm/qxl/qxl_display.c
> > > @@ -902,7 +902,7 @@ static const struct drm_plane_helper_funcs qxl_cursor_helper_funcs = {
> > >   static const struct drm_plane_funcs qxl_cursor_plane_funcs = {
> > >   	.update_plane	= drm_atomic_helper_update_plane,
> > >   	.disable_plane	= drm_atomic_helper_disable_plane,
> > > -	.destroy	= drm_primary_helper_destroy,
> > > +	.destroy	= drm_plane_helper_destroy,
> > >   	.reset		= drm_atomic_helper_plane_reset,
> > >   	.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
> > >   	.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
> > > @@ -924,7 +924,7 @@ static const struct drm_plane_helper_funcs primary_helper_funcs = {
> > >   static const struct drm_plane_funcs qxl_primary_plane_funcs = {
> > >   	.update_plane	= drm_atomic_helper_update_plane,
> > >   	.disable_plane	= drm_atomic_helper_disable_plane,
> > > -	.destroy	= drm_primary_helper_destroy,
> > > +	.destroy	= drm_plane_helper_destroy,
> > >   	.reset		= drm_atomic_helper_plane_reset,
> > >   	.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
> > >   	.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
> > > diff --git a/drivers/gpu/drm/vboxvideo/vbox_mode.c b/drivers/gpu/drm/vboxvideo/vbox_mode.c
> > > index 604ebfbef314..341edd982cb3 100644
> > > --- a/drivers/gpu/drm/vboxvideo/vbox_mode.c
> > > +++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c
> > > @@ -477,7 +477,7 @@ static const struct drm_plane_helper_funcs vbox_cursor_helper_funcs = {
> > >   static const struct drm_plane_funcs vbox_cursor_plane_funcs = {
> > >   	.update_plane	= drm_atomic_helper_update_plane,
> > >   	.disable_plane	= drm_atomic_helper_disable_plane,
> > > -	.destroy	= drm_primary_helper_destroy,
> > > +	.destroy	= drm_plane_helper_destroy,
> > >   	DRM_GEM_SHADOW_PLANE_FUNCS,
> > >   };
> > > @@ -496,7 +496,7 @@ static const struct drm_plane_helper_funcs vbox_primary_helper_funcs = {
> > >   static const struct drm_plane_funcs vbox_primary_plane_funcs = {
> > >   	.update_plane	= drm_atomic_helper_update_plane,
> > >   	.disable_plane	= drm_atomic_helper_disable_plane,
> > > -	.destroy	= drm_primary_helper_destroy,
> > > +	.destroy	= drm_plane_helper_destroy,
> > >   	.reset		= drm_atomic_helper_plane_reset,
> > >   	.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
> > >   	.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
> > > diff --git a/include/drm/drm_plane_helper.h b/include/drm/drm_plane_helper.h
> > > index ff85ef41cb33..1781fab24dd6 100644
> > > --- a/include/drm/drm_plane_helper.h
> > > +++ b/include/drm/drm_plane_helper.h
> > > @@ -24,12 +24,22 @@
> > >   #ifndef DRM_PLANE_HELPER_H
> > >   #define DRM_PLANE_HELPER_H
> > > -#include <drm/drm_rect.h>
> > > -#include <drm/drm_crtc.h>
> > > -#include <drm/drm_modeset_helper_vtables.h>
> > > -#include <drm/drm_modeset_helper.h>
> > > +#include <linux/types.h>
> > > -void drm_primary_helper_destroy(struct drm_plane *plane);
> > > -extern const struct drm_plane_funcs drm_primary_helper_funcs;
> > > +struct drm_crtc;
> > > +struct drm_framebuffer;
> > > +struct drm_modeset_acquire_ctx;
> > > +struct drm_plane;
> > > +
> > > +int drm_plane_helper_update_primary(struct drm_plane *plane, struct drm_crtc *crtc,
> > > +				    struct drm_framebuffer *fb,
> > > +				    int crtc_x, int crtc_y,
> > > +				    unsigned int crtc_w, unsigned int crtc_h,
> > > +				    uint32_t src_x, uint32_t src_y,
> > > +				    uint32_t src_w, uint32_t src_h,
> > > +				    struct drm_modeset_acquire_ctx *ctx);
> > > +int drm_plane_helper_disable_primary(struct drm_plane *plane,
> > > +				     struct drm_modeset_acquire_ctx *ctx);
> > > +void drm_plane_helper_destroy(struct drm_plane *plane);
> > >   #endif
> > > -- 
> > > 2.36.1
> > > 
> > 
> 
> -- 
> Thomas Zimmermann
> Graphics Driver Developer
> SUSE Software Solutions Germany GmbH
> Maxfeldstr. 5, 90409 Nürnberg, Germany
> (HRB 36809, AG Nürnberg)
> Geschäftsführer: Ivo Totev




-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list