On Fri, Aug 14, 2026 at 10:58 PM Maxime Ripard <[email protected]> wrote: > > The plane only initializes a pristine state in its reset hook > using drm_atomic_helper_plane_reset(), which 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]> > --- > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > --- > drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 2 +- > drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c > b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c > index 00756ab78b4e..bad102134726 100644 > --- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c > +++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c > @@ -211,11 +211,11 @@ static const struct drm_plane_helper_funcs > sun8i_ui_layer_helper_funcs = { > static const struct drm_plane_funcs sun8i_ui_layer_funcs = { > .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, > .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, > .destroy = drm_plane_cleanup, > .disable_plane = drm_atomic_helper_disable_plane, > - .reset = drm_atomic_helper_plane_reset, > + .atomic_create_state = drm_atomic_helper_plane_create_state, > .update_plane = drm_atomic_helper_update_plane, > }; > > static const u32 sun8i_ui_layer_formats[] = { > DRM_FORMAT_ABGR1555, > diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c > b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c > index 09f668c8af24..2e9cda45c04e 100644 > --- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c > +++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c > @@ -291,11 +291,11 @@ static const struct drm_plane_helper_funcs > sun8i_vi_layer_helper_funcs = { > static const struct drm_plane_funcs sun8i_vi_layer_funcs = { > .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, > .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, > .destroy = drm_plane_cleanup, > .disable_plane = drm_atomic_helper_disable_plane, > - .reset = drm_atomic_helper_plane_reset, > + .atomic_create_state = drm_atomic_helper_plane_create_state,
Looks like a pretty standard replacement. Acked-by: Chen-Yu Tsai <[email protected]> > .update_plane = drm_atomic_helper_update_plane, > }; > > /* > * While DE2 VI layer supports same RGB formats as UI layer, alpha > > -- > 2.55.0 >
