Hi Maxime Ripard,

> -----Original Message-----
> From: Maxime Ripard <[email protected]>
> Sent: 09 July 2026 12:51
> Subject: [PATCH 52/60] drm/rz-du: Convert to atomic_create_state
> 
> The plane reset implementation creates a custom state subclass, but only 
> initializes a pristine state
> without resetting any hardware. This is equivalent to what 
> atomic_create_state expects.
> Convert to it.
> 
> The conversion was done using the following Coccinelle semantic patch:
> 
> @@
> identifier funcs;
> symbol drm_atomic_helper_plane_reset;
> symbol drm_atomic_helper_plane_create_state;
> @@
> 
> struct drm_plane_funcs funcs = {
>   ...,
> - .reset = drm_atomic_helper_plane_reset,
> + .atomic_create_state = drm_atomic_helper_plane_create_state,
>   ...,
> };
> 
> @match_struct_reset@
> identifier funcs, reset_func;
> @@
> struct drm_plane_funcs funcs = {
>     ...,
>     .reset = reset_func,
>     ...,
> };
> 
> @reset_uses_helpers depends on match_struct_reset@ identifier 
> match_struct_reset.reset_func; @@
> 
>  void reset_func(...)
>  {
>       <+...
> (
>       __drm_atomic_helper_plane_reset(...);
> |
>       __drm_gem_reset_shadow_plane(...);
> )
>       ...+>
>  }
> 
> @match_struct_destroy@
> identifier funcs, destroy_func;
> @@
> struct drm_plane_funcs funcs = {
>     ...,
>     .atomic_destroy_state = destroy_func,
>     ...,
> };
> 
> @script:python renamed_func@
> old_name << match_struct_reset.reset_func; new_name; @@ if 
> old_name.endswith("_reset"):
>     coccinelle.new_name = old_name.replace("_reset", "_create_state")
> else:
>     coccinelle.new_name = old_name
> 
> @update_struct depends on match_struct_reset && reset_uses_helpers@ 
> identifier match_struct_reset.funcs,
> match_struct_reset.reset_func; identifier renamed_func.new_name; @@ struct 
> drm_plane_funcs funcs = {
>     ...,
> -   .reset = reset_func,
> +   .atomic_create_state = new_name,
>     ...,
> };
> 
> @drop_destroy depends on update_struct && match_struct_destroy@ identifier 
> match_struct_reset.reset_func;
> identifier match_struct_destroy.destroy_func;
> identifier container_func;
> identifier P;
> symbol drm_atomic_helper_plane_destroy_state;
> symbol __drm_atomic_helper_plane_destroy_state;
> @@
> 
>  void reset_func(struct drm_plane *P)
>  {
>       ...
> (
> -     if (P->state) {
> -             <+...
> (
> -             drm_atomic_helper_plane_destroy_state(P, P->state);
> |
> -             __drm_atomic_helper_plane_destroy_state(P->state);
> |
> -             P->funcs->atomic_destroy_state(P, P->state);
> |
> -             destroy_func(P, P->state);
> )
> -             ...+>
> -     }
> |
> -     drm_WARN_ON_ONCE(P->dev, P->state);
> |
> -     WARN_ON(P->state);
> )
>       ...
> (
> -     kfree(P->state);
> |
> -     kfree(container_func(P->state));
> |
>       // kfree is optional
> )
> (
> -     P->state = NULL;
> |
>       // plane->state clearing is optional
> )
>       ...
>  }
> 
> @drop_destroy_mtk depends on update_struct@ identifier P; symbol 
> __drm_atomic_helper_plane_destroy_state;
> symbol to_mtk_plane_state;
> @@
> 
>  void mtk_plane_reset(struct drm_plane *P)  {
>       ...
> -     if (P->state) {
> -             __drm_atomic_helper_plane_destroy_state(P->state);
> -             ...
> -     } else {
>               ...
> -     }
>       ...
>  }
> 
> @transform_nv50_wndw depends on update_struct@ identifier S; @@
> 
>  void nv50_wndw_reset(...)
>  {
>       ...
> -     if (WARN_ON(!(S = kzalloc_obj(*S))))
> +     S = kzalloc_obj(*S);
> +     if (WARN_ON(!S))
>               return;
>       ...
>  }
> 
> @transform_kzalloc depends on update_struct@ identifier 
> match_struct_reset.reset_func; identifier P, S;
> statement ST; statement list STL; @@
> 
>  void reset_func(struct drm_plane *P)
>  {
>       <...
>       S = kzalloc_obj(*S);
> (
> -     if (S)
> -     {
> -             STL
> -     }
> +     if (!S) return;
> +
> +     STL
> |
> -     if (S) ST
> +     if (!S) return;
> +
> +     ST
> )
>       ...>
>  }
> 
> @transform_body depends on update_struct@ identifier 
> match_struct_reset.reset_func; identifier
> renamed_func.new_name; identifier S, P; expression PS; @@
> - void reset_func(struct drm_plane *P)
> + struct drm_plane_state *new_name(struct drm_plane *P)
> {
>       ...
>       S = kzalloc_obj(*S);
>       ...
> (
>       if (!S) {
>               ...
> -             return;
> +             return ERR_PTR(-ENOMEM);
>       }
> |
>       if (WARN_ON(!S)) {
>               ...
> -             return;
> +             return ERR_PTR(-ENOMEM);
>       }
> |
>       if (S == NULL) {
>               ...
> -             return;
> +             return ERR_PTR(-ENOMEM);
>       }
> )
>       ...
> (
> -     __drm_atomic_helper_plane_reset(P, PS);
> +     __drm_atomic_helper_plane_state_init(PS, P);
> |
> -     __drm_gem_reset_shadow_plane(P, PS);
> +     __drm_gem_shadow_plane_state_init(P, PS);
> )
>       ...
> }
> 
> @update_early_return depends on update_struct@ identifier 
> match_struct_reset.reset_func; identifier
> renamed_func.new_name; identifier P; expression PS; @@  struct 
> drm_plane_state *new_name(struct drm_plane
> *P) {
>       <+...
> -     return;
> +     return ERR_PTR(-EINVAL);
>       ...+>
> }
> 
> @update_return_plane depends on update_struct@ identifier 
> match_struct_reset.reset_func; identifier
> renamed_func.new_name; identifier P; expression PS; @@  struct 
> drm_plane_state *new_name(struct drm_plane
> *P) {
>       ...
>       __drm_atomic_helper_plane_state_init(PS, P);
>       ...
> +
> +     return PS;
> }
> 
> @update_return_shadow depends on update_struct@ identifier 
> renamed_func.new_name; identifier P;
> expression PS; @@  struct drm_plane_state *new_name(struct drm_plane *P) {
>       ...
>       __drm_gem_shadow_plane_state_init(P, PS);
>       ...
> +
> +     return &PS->base;
> }
> 
> Signed-off-by: Maxime Ripard <[email protected]>

Tested the patch on RZ/V2L SMARC EVK.

So,

Tested-by: Biju Das <[email protected]>

Cheers,
Biju

> ---
> Cc: [email protected]
> Cc: [email protected]
> ---
>  drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c | 15 ++++++---------
>  1 file changed, 6 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c 
> b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c
> index 1efa0f0451fe..944bc9ac9589 100644
> --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c
> +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c
> @@ -264,30 +264,27 @@ static void 
> rzg2l_du_vsp_plane_atomic_destroy_state(struct drm_plane *plane,  {
>       __drm_atomic_helper_plane_destroy_state(state);
>       kfree(to_rzg2l_vsp_plane_state(state));
>  }
> 
> -static void rzg2l_du_vsp_plane_reset(struct drm_plane *plane)
> +static struct drm_plane_state *rzg2l_du_vsp_plane_create_state(struct
> +drm_plane *plane)
>  {
>       struct rzg2l_du_vsp_plane_state *state;
> 
> -     if (plane->state) {
> -             rzg2l_du_vsp_plane_atomic_destroy_state(plane, plane->state);
> -             plane->state = NULL;
> -     }
> -
>       state = kzalloc_obj(*state);
>       if (!state)
> -             return;
> +             return ERR_PTR(-ENOMEM);
> 
> -     __drm_atomic_helper_plane_reset(plane, &state->state);
> +     __drm_atomic_helper_plane_state_init(&state->state, plane);
> +
> +     return &state->state;
>  }
> 
>  static const struct drm_plane_funcs rzg2l_du_vsp_plane_funcs = {
>       .update_plane = drm_atomic_helper_update_plane,
>       .disable_plane = drm_atomic_helper_disable_plane,
> -     .reset = rzg2l_du_vsp_plane_reset,
> +     .atomic_create_state = rzg2l_du_vsp_plane_create_state,
>       .atomic_duplicate_state = rzg2l_du_vsp_plane_atomic_duplicate_state,
>       .atomic_destroy_state = rzg2l_du_vsp_plane_atomic_destroy_state,
>  };
> 
>  static void rzg2l_du_vsp_cleanup(struct drm_device *dev, void *res)
> 
> --
> 2.54.0

Reply via email to