[PATCH v2 03/68] drm/encoder: Introduce drmm_encoder_init

Thomas Zimmermann tzimmermann at suse.de
Tue Jun 28 08:55:56 UTC 2022


Hi

Am 22.06.22 um 16:31 schrieb Maxime Ripard:
> The DRM-managed function to register an encoder is
> drmm_encoder_alloc() and its variants, which will allocate the underlying
> structure and initialisation the encoder.
> 
> However, we might want to separate the structure creation and the encoder
> initialisation, for example if the structure is shared across multiple DRM
> entities, for example an encoder and a connector.
> 
> Let's create an helper to only initialise an encoder that would be passed
> as an argument.
> 
> Signed-off-by: Maxime Ripard <maxime at cerno.tech>
> ---
>   drivers/gpu/drm/drm_encoder.c | 57 ++++++++++++++++++++++++++++-------
>   include/drm/drm_encoder.h     |  5 +++
>   2 files changed, 51 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c
> index a940024c8087..b29f2f07744f 100644
> --- a/drivers/gpu/drm/drm_encoder.c
> +++ b/drivers/gpu/drm/drm_encoder.c
> @@ -148,9 +148,9 @@ static int __drm_encoder_init(struct drm_device *dev,
>    * the encoder structure. The encoder structure should not be allocated with
>    * devm_kzalloc().
>    *
> - * Note: consider using drmm_encoder_alloc() instead of drm_encoder_init() to
> - * let the DRM managed resource infrastructure take care of cleanup and
> - * deallocation.
> + * Note: consider using drmm_encoder_alloc() or drmm_encoder_init()
> + * instead of drm_encoder_init() to let the DRM managed resource
> + * infrastructure take care of cleanup and deallocation.
>    *
>    * Returns:
>    * Zero on success, error code on failure.
> @@ -221,9 +221,6 @@ void *__drmm_encoder_alloc(struct drm_device *dev, size_t size, size_t offset,
>   	va_list ap;
>   	int ret;
>   
> -	if (WARN_ON(funcs && funcs->destroy))
> -		return ERR_PTR(-EINVAL);
> -
>   	container = drmm_kzalloc(dev, size, GFP_KERNEL);
>   	if (!container)
>   		return ERR_PTR(-ENOMEM);
> @@ -231,19 +228,57 @@ void *__drmm_encoder_alloc(struct drm_device *dev, size_t size, size_t offset,
>   	encoder = container + offset;
>   
>   	va_start(ap, name);
> -	ret = __drm_encoder_init(dev, encoder, funcs, encoder_type, name, ap);
> +	ret = drmm_encoder_init(dev, encoder, funcs, encoder_type, name, ap);

That's the same problem with ap as in the CRTC case. I guess other 
patches are also affected.

Best regards
Thomas

>   	va_end(ap);
>   	if (ret)
>   		return ERR_PTR(ret);
>   
> -	ret = drmm_add_action_or_reset(dev, drmm_encoder_alloc_release, encoder);
> -	if (ret)
> -		return ERR_PTR(ret);
> -
>   	return container;
>   }
>   EXPORT_SYMBOL(__drmm_encoder_alloc);
>   
> +/**
> + * drmm_encoder_init - Initialize a preallocated encoder
> + * @dev: drm device
> + * @encoder: the encoder to init
> + * @funcs: callbacks for this encoder (optional)
> + * @encoder_type: user visible type of the encoder
> + * @name: printf style format string for the encoder name, or NULL for default name
> + *
> + * Initializes a preallocated encoder. Encoder should be subclassed as
> + * part of driver encoder objects. Cleanup is automatically handled
> + * through registering drm_encoder_cleanup() with drmm_add_action(). The
> + * encoder structure should be allocated with drmm_kzalloc().
> + *
> + * The @drm_encoder_funcs.destroy hook must be NULL.
> + *
> + * Returns:
> + * Zero on success, error code on failure.
> + */
> +int drmm_encoder_init(struct drm_device *dev, struct drm_encoder *encoder,
> +		      const struct drm_encoder_funcs *funcs,
> +		      int encoder_type, const char *name, ...)
> +{
> +	va_list ap;
> +	int ret;
> +
> +	if (WARN_ON(funcs && funcs->destroy))
> +		return -EINVAL;
> +
> +	va_start(ap, name);
> +	ret = __drm_encoder_init(dev, encoder, funcs, encoder_type, name, ap);
> +	va_end(ap);
> +	if (ret)
> +		return ret;
> +
> +	ret = drmm_add_action_or_reset(dev, drmm_encoder_alloc_release, encoder);
> +	if (ret)
> +		return ret;
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(drmm_encoder_init);
> +
>   static struct drm_crtc *drm_encoder_get_crtc(struct drm_encoder *encoder)
>   {
>   	struct drm_connector *connector;
> diff --git a/include/drm/drm_encoder.h b/include/drm/drm_encoder.h
> index 6e91a0280f31..6713fe1804e9 100644
> --- a/include/drm/drm_encoder.h
> +++ b/include/drm/drm_encoder.h
> @@ -194,6 +194,11 @@ int drm_encoder_init(struct drm_device *dev,
>   		     const struct drm_encoder_funcs *funcs,
>   		     int encoder_type, const char *name, ...);
>   
> +int drmm_encoder_init(struct drm_device *dev,
> +		      struct drm_encoder *encoder,
> +		      const struct drm_encoder_funcs *funcs,
> +		      int encoder_type, const char *name, ...);
> +
>   __printf(6, 7)
>   void *__drmm_encoder_alloc(struct drm_device *dev,
>   			   size_t size, size_t offset,

-- 
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20220628/ba050c96/attachment-0001.sig>


More information about the dri-devel mailing list