All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liviu Dudau <liviu.dudau@arm.com>
To: Maxime Ripard <mripard@kernel.org>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
	dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v3 08/15] drm/arm: komeda: Switch private_obj initialization to atomic_create_state
Date: Tue, 20 Jan 2026 14:45:03 +0000	[thread overview]
Message-ID: <aW-U7-kc3QKtfInt@e142607> (raw)
In-Reply-To: <20260119-drm-private-obj-reset-v3-8-b931abe3a5e3@redhat.com>

On Mon, Jan 19, 2026 at 01:50:04PM +0100, Maxime Ripard wrote:
> The ARM komeda driver relies on a number of drm_private_objs, that are
> initialized by allocating and initializing a state, and then passing it
> to drm_private_obj_init.
> 
> Since we're gradually moving away from that pattern to the more
> established one relying on a atomic_create_state implementation, let's
> migrate this instance to the new pattern.
> 
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
> 
> ---
> 
> Cc: Liviu Dudau <liviu.dudau@arm.com>

Acked-by: Liviu Dudau <liviu.dudau@arm.com>

Best regards,
Liviu

> ---
>  .../gpu/drm/arm/display/komeda/komeda_pipeline.h   |   2 +
>  .../drm/arm/display/komeda/komeda_private_obj.c    | 208 ++++++++++++++-------
>  2 files changed, 146 insertions(+), 64 deletions(-)
> 
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
> index ac8725e248537e5737d16cd36860401c42073500..37b9e92202443cc72adc0666ed047d4f77d79782 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
> @@ -126,10 +126,12 @@ struct komeda_component {
>  	 * @funcs: chip functions to access HW
>  	 */
>  	const struct komeda_component_funcs *funcs;
>  };
>  
> +#define to_component(o)	container_of(o, struct komeda_component, obj)
> +
>  /**
>   * struct komeda_component_output
>   *
>   * a component has multiple outputs, if want to know where the data
>   * comes from, only know the component is not enough, we still need to know
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c b/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
> index 914400c4af73824e52dda76425a73a74e681a146..4994b69c6595637ea832b97629b052e3aea97ee7 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
> @@ -38,26 +38,36 @@ komeda_layer_atomic_destroy_state(struct drm_private_obj *obj,
>  	struct komeda_layer_state *st = to_layer_st(priv_to_comp_st(state));
>  
>  	kfree(st);
>  }
>  
> +static struct drm_private_state *
> +komeda_layer_atomic_create_state(struct drm_private_obj *obj)
> +{
> +	struct komeda_layer_state *st;
> +
> +	st = kzalloc(sizeof(*st), GFP_KERNEL);
> +	if (!st)
> +		return ERR_PTR(-ENOMEM);
> +
> +	__drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> +	komeda_component_state_reset(&st->base);
> +	st->base.component = to_component(obj);
> +
> +	return &st->base.obj;
> +}
> +
>  static const struct drm_private_state_funcs komeda_layer_obj_funcs = {
> +	.atomic_create_state	= komeda_layer_atomic_create_state,
>  	.atomic_duplicate_state	= komeda_layer_atomic_duplicate_state,
>  	.atomic_destroy_state	= komeda_layer_atomic_destroy_state,
>  };
>  
>  static int komeda_layer_obj_add(struct komeda_kms_dev *kms,
>  				struct komeda_layer *layer)
>  {
> -	struct komeda_layer_state *st;
> -
> -	st = kzalloc(sizeof(*st), GFP_KERNEL);
> -	if (!st)
> -		return -ENOMEM;
> -
> -	st->base.component = &layer->base;
> -	drm_atomic_private_obj_init(&kms->base, &layer->base.obj, &st->base.obj,
> +	drm_atomic_private_obj_init(&kms->base, &layer->base.obj, NULL,
>  				    &komeda_layer_obj_funcs);
>  	return 0;
>  }
>  
>  static struct drm_private_state *
> @@ -80,27 +90,37 @@ komeda_scaler_atomic_destroy_state(struct drm_private_obj *obj,
>  				   struct drm_private_state *state)
>  {
>  	kfree(to_scaler_st(priv_to_comp_st(state)));
>  }
>  
> +static struct drm_private_state *
> +komeda_scaler_atomic_create_state(struct drm_private_obj *obj)
> +{
> +	struct komeda_scaler_state *st;
> +
> +	st = kzalloc(sizeof(*st), GFP_KERNEL);
> +	if (!st)
> +		return ERR_PTR(-ENOMEM);
> +
> +	__drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> +	komeda_component_state_reset(&st->base);
> +	st->base.component = to_component(obj);
> +
> +	return &st->base.obj;
> +}
> +
>  static const struct drm_private_state_funcs komeda_scaler_obj_funcs = {
> +	.atomic_create_state	= komeda_scaler_atomic_create_state,
>  	.atomic_duplicate_state	= komeda_scaler_atomic_duplicate_state,
>  	.atomic_destroy_state	= komeda_scaler_atomic_destroy_state,
>  };
>  
>  static int komeda_scaler_obj_add(struct komeda_kms_dev *kms,
>  				 struct komeda_scaler *scaler)
>  {
> -	struct komeda_scaler_state *st;
> -
> -	st = kzalloc(sizeof(*st), GFP_KERNEL);
> -	if (!st)
> -		return -ENOMEM;
> -
> -	st->base.component = &scaler->base;
>  	drm_atomic_private_obj_init(&kms->base,
> -				    &scaler->base.obj, &st->base.obj,
> +				    &scaler->base.obj, NULL,
>  				    &komeda_scaler_obj_funcs);
>  	return 0;
>  }
>  
>  static struct drm_private_state *
> @@ -123,26 +143,36 @@ komeda_compiz_atomic_destroy_state(struct drm_private_obj *obj,
>  				   struct drm_private_state *state)
>  {
>  	kfree(to_compiz_st(priv_to_comp_st(state)));
>  }
>  
> +static struct drm_private_state *
> +komeda_compiz_atomic_create_state(struct drm_private_obj *obj)
> +{
> +	struct komeda_compiz_state *st;
> +
> +	st = kzalloc(sizeof(*st), GFP_KERNEL);
> +	if (!st)
> +		return ERR_PTR(-ENOMEM);
> +
> +	__drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> +	komeda_component_state_reset(&st->base);
> +	st->base.component = to_component(obj);
> +
> +	return &st->base.obj;
> +}
> +
>  static const struct drm_private_state_funcs komeda_compiz_obj_funcs = {
> +	.atomic_create_state	= komeda_compiz_atomic_create_state,
>  	.atomic_duplicate_state	= komeda_compiz_atomic_duplicate_state,
>  	.atomic_destroy_state	= komeda_compiz_atomic_destroy_state,
>  };
>  
>  static int komeda_compiz_obj_add(struct komeda_kms_dev *kms,
>  				 struct komeda_compiz *compiz)
>  {
> -	struct komeda_compiz_state *st;
> -
> -	st = kzalloc(sizeof(*st), GFP_KERNEL);
> -	if (!st)
> -		return -ENOMEM;
> -
> -	st->base.component = &compiz->base;
> -	drm_atomic_private_obj_init(&kms->base, &compiz->base.obj, &st->base.obj,
> +	drm_atomic_private_obj_init(&kms->base, &compiz->base.obj, NULL,
>  				    &komeda_compiz_obj_funcs);
>  
>  	return 0;
>  }
>  
> @@ -166,27 +196,37 @@ komeda_splitter_atomic_destroy_state(struct drm_private_obj *obj,
>  				     struct drm_private_state *state)
>  {
>  	kfree(to_splitter_st(priv_to_comp_st(state)));
>  }
>  
> +static struct drm_private_state *
> +komeda_splitter_atomic_create_state(struct drm_private_obj *obj)
> +{
> +	struct komeda_splitter_state *st;
> +
> +	st = kzalloc(sizeof(*st), GFP_KERNEL);
> +	if (!st)
> +		return ERR_PTR(-ENOMEM);
> +
> +	__drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> +	komeda_component_state_reset(&st->base);
> +	st->base.component = to_component(obj);
> +
> +	return &st->base.obj;
> +}
> +
>  static const struct drm_private_state_funcs komeda_splitter_obj_funcs = {
> +	.atomic_create_state	= komeda_splitter_atomic_create_state,
>  	.atomic_duplicate_state	= komeda_splitter_atomic_duplicate_state,
>  	.atomic_destroy_state	= komeda_splitter_atomic_destroy_state,
>  };
>  
>  static int komeda_splitter_obj_add(struct komeda_kms_dev *kms,
>  				   struct komeda_splitter *splitter)
>  {
> -	struct komeda_splitter_state *st;
> -
> -	st = kzalloc(sizeof(*st), GFP_KERNEL);
> -	if (!st)
> -		return -ENOMEM;
> -
> -	st->base.component = &splitter->base;
>  	drm_atomic_private_obj_init(&kms->base,
> -				    &splitter->base.obj, &st->base.obj,
> +				    &splitter->base.obj, NULL,
>  				    &komeda_splitter_obj_funcs);
>  
>  	return 0;
>  }
>  
> @@ -209,27 +249,37 @@ static void komeda_merger_atomic_destroy_state(struct drm_private_obj *obj,
>  					       struct drm_private_state *state)
>  {
>  	kfree(to_merger_st(priv_to_comp_st(state)));
>  }
>  
> +static struct drm_private_state *
> +komeda_merger_atomic_create_state(struct drm_private_obj *obj)
> +{
> +	struct komeda_merger_state *st;
> +
> +	st = kzalloc(sizeof(*st), GFP_KERNEL);
> +	if (!st)
> +		return ERR_PTR(-ENOMEM);
> +
> +	__drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> +	komeda_component_state_reset(&st->base);
> +	st->base.component = to_component(obj);
> +
> +	return &st->base.obj;
> +}
> +
>  static const struct drm_private_state_funcs komeda_merger_obj_funcs = {
> +	.atomic_create_state	= komeda_merger_atomic_create_state,
>  	.atomic_duplicate_state	= komeda_merger_atomic_duplicate_state,
>  	.atomic_destroy_state	= komeda_merger_atomic_destroy_state,
>  };
>  
>  static int komeda_merger_obj_add(struct komeda_kms_dev *kms,
>  				 struct komeda_merger *merger)
>  {
> -	struct komeda_merger_state *st;
> -
> -	st = kzalloc(sizeof(*st), GFP_KERNEL);
> -	if (!st)
> -		return -ENOMEM;
> -
> -	st->base.component = &merger->base;
>  	drm_atomic_private_obj_init(&kms->base,
> -				    &merger->base.obj, &st->base.obj,
> +				    &merger->base.obj, NULL,
>  				    &komeda_merger_obj_funcs);
>  
>  	return 0;
>  }
>  
> @@ -253,26 +303,36 @@ komeda_improc_atomic_destroy_state(struct drm_private_obj *obj,
>  				   struct drm_private_state *state)
>  {
>  	kfree(to_improc_st(priv_to_comp_st(state)));
>  }
>  
> +static struct drm_private_state *
> +komeda_improc_atomic_create_state(struct drm_private_obj *obj)
> +{
> +	struct komeda_improc_state *st;
> +
> +	st = kzalloc(sizeof(*st), GFP_KERNEL);
> +	if (!st)
> +		return ERR_PTR(-ENOMEM);
> +
> +	__drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> +	komeda_component_state_reset(&st->base);
> +	st->base.component = to_component(obj);
> +
> +	return &st->base.obj;
> +}
> +
>  static const struct drm_private_state_funcs komeda_improc_obj_funcs = {
> +	.atomic_create_state	= komeda_improc_atomic_create_state,
>  	.atomic_duplicate_state	= komeda_improc_atomic_duplicate_state,
>  	.atomic_destroy_state	= komeda_improc_atomic_destroy_state,
>  };
>  
>  static int komeda_improc_obj_add(struct komeda_kms_dev *kms,
>  				 struct komeda_improc *improc)
>  {
> -	struct komeda_improc_state *st;
> -
> -	st = kzalloc(sizeof(*st), GFP_KERNEL);
> -	if (!st)
> -		return -ENOMEM;
> -
> -	st->base.component = &improc->base;
> -	drm_atomic_private_obj_init(&kms->base, &improc->base.obj, &st->base.obj,
> +	drm_atomic_private_obj_init(&kms->base, &improc->base.obj, NULL,
>  				    &komeda_improc_obj_funcs);
>  
>  	return 0;
>  }
>  
> @@ -296,26 +356,36 @@ komeda_timing_ctrlr_atomic_destroy_state(struct drm_private_obj *obj,
>  					 struct drm_private_state *state)
>  {
>  	kfree(to_ctrlr_st(priv_to_comp_st(state)));
>  }
>  
> +static struct drm_private_state *
> +komeda_timing_ctrlr_atomic_create_state(struct drm_private_obj *obj)
> +{
> +	struct komeda_timing_ctrlr_state *st;
> +
> +	st = kzalloc(sizeof(*st), GFP_KERNEL);
> +	if (!st)
> +		return ERR_PTR(-ENOMEM);
> +
> +	__drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> +	komeda_component_state_reset(&st->base);
> +	st->base.component = to_component(obj);
> +
> +	return &st->base.obj;
> +}
> +
>  static const struct drm_private_state_funcs komeda_timing_ctrlr_obj_funcs = {
> +	.atomic_create_state	= komeda_timing_ctrlr_atomic_create_state,
>  	.atomic_duplicate_state	= komeda_timing_ctrlr_atomic_duplicate_state,
>  	.atomic_destroy_state	= komeda_timing_ctrlr_atomic_destroy_state,
>  };
>  
>  static int komeda_timing_ctrlr_obj_add(struct komeda_kms_dev *kms,
>  				       struct komeda_timing_ctrlr *ctrlr)
>  {
> -	struct komeda_compiz_state *st;
> -
> -	st = kzalloc(sizeof(*st), GFP_KERNEL);
> -	if (!st)
> -		return -ENOMEM;
> -
> -	st->base.component = &ctrlr->base;
> -	drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj, &st->base.obj,
> +	drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj, NULL,
>  				    &komeda_timing_ctrlr_obj_funcs);
>  
>  	return 0;
>  }
>  
> @@ -340,26 +410,36 @@ komeda_pipeline_atomic_destroy_state(struct drm_private_obj *obj,
>  				     struct drm_private_state *state)
>  {
>  	kfree(priv_to_pipe_st(state));
>  }
>  
> +static struct drm_private_state *
> +komeda_pipeline_atomic_create_state(struct drm_private_obj *obj)
> +{
> +	struct komeda_pipeline_state *st;
> +
> +	st = kzalloc(sizeof(*st), GFP_KERNEL);
> +	if (!st)
> +		return ERR_PTR(-ENOMEM);
> +
> +	__drm_atomic_helper_private_obj_create_state(obj, &st->obj);
> +	st->active_comps = 0;
> +	st->pipe = container_of(obj, struct komeda_pipeline, obj);
> +
> +	return &st->obj;
> +}
> +
>  static const struct drm_private_state_funcs komeda_pipeline_obj_funcs = {
> +	.atomic_create_state	= komeda_pipeline_atomic_create_state,
>  	.atomic_duplicate_state	= komeda_pipeline_atomic_duplicate_state,
>  	.atomic_destroy_state	= komeda_pipeline_atomic_destroy_state,
>  };
>  
>  static int komeda_pipeline_obj_add(struct komeda_kms_dev *kms,
>  				   struct komeda_pipeline *pipe)
>  {
> -	struct komeda_pipeline_state *st;
> -
> -	st = kzalloc(sizeof(*st), GFP_KERNEL);
> -	if (!st)
> -		return -ENOMEM;
> -
> -	st->pipe = pipe;
> -	drm_atomic_private_obj_init(&kms->base, &pipe->obj, &st->obj,
> +	drm_atomic_private_obj_init(&kms->base, &pipe->obj, NULL,
>  				    &komeda_pipeline_obj_funcs);
>  
>  	return 0;
>  }
>  
> 
> -- 
> 2.52.0
> 

  parent reply	other threads:[~2026-01-20 14:46 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
2026-01-19 12:49 ` [PATCH v3 01/15] drm/atomic: Make drm_atomic_private_obj_init fallible Maxime Ripard
2026-01-19 12:49 ` [PATCH v3 02/15] drm/atomic: Add new atomic_create_state callback to drm_private_obj Maxime Ripard
2026-01-19 17:25   ` Dmitry Baryshkov
2026-01-19 12:49 ` [PATCH v3 03/15] drm/atomic-helper: Add private_obj atomic_create_state helper Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 04/15] drm/bridge: Switch private_obj initialization to atomic_create_state Maxime Ripard
2026-01-20  9:43   ` kernel test robot
2026-01-19 12:50 ` [PATCH v3 05/15] drm/dp_mst: " Maxime Ripard
2026-01-19 19:48   ` Dmitry Baryshkov
2026-01-19 12:50 ` [PATCH v3 06/15] drm/dp_tunnel: " Maxime Ripard
2026-01-19 17:29   ` Dmitry Baryshkov
2026-01-19 12:50 ` [PATCH v3 07/15] drm/amdgpu: " Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 08/15] drm/arm: komeda: " Maxime Ripard
2026-01-19 20:10   ` Dmitry Baryshkov
2026-01-20 14:45   ` Liviu Dudau [this message]
2026-01-19 12:50 ` [PATCH v3 09/15] drm/ingenic: " Maxime Ripard
2026-01-19 16:18   ` Paul Cercueil
2026-01-19 12:50 ` [PATCH v3 10/15] drm/msm: mdp5: " Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 11/15] drm/msm: dpu1: " Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 12/15] drm/omapdrm: " Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 13/15] drm/tegra: " Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 14/15] drm/vc4: " Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 15/15] drm/atomic: Remove state argument to drm_atomic_private_obj_init Maxime Ripard
2026-01-20 14:45   ` Liviu Dudau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aW-U7-kc3QKtfInt@e142607 \
    --to=liviu.dudau@arm.com \
    --cc=airlied@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=simona@ffwll.ch \
    --cc=tzimmermann@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.