From 7e8bd554c367739c832371179da9f106f8ba1358 Mon Sep 17 00:00:00 2001 From: Maxime Ripard Date: Fri, 14 Aug 2026 16:56:55 +0200 Subject: [PATCH] drm/sysfb: Convert to atomic_create_state drm_sysfb_plane_reset() handles both state creation and teardown of the previous state through the reset hook, which conflates initial state allocation with hardware and software reset at resume. Convert it to drm_sysfb_plane_atomic_create_state(), which only allocates and initializes a pristine state using __drm_gem_shadow_plane_state_init(). Update DRM_SYSFB_PLANE_FUNCS to use .atomic_create_state instead of .reset. Reviewed-by: Thomas Zimmermann Link: https://patch.msgid.link/20260814-drm-no-more-plane-reset-v2-6-82d2963dd134@kernel.org Signed-off-by: Maxime Ripard --- drivers/gpu/drm/sysfb/drm_sysfb_helper.h | 4 +-- drivers/gpu/drm/sysfb/drm_sysfb_modeset.c | 30 ++++++++++++++++------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/sysfb/drm_sysfb_helper.h b/drivers/gpu/drm/sysfb/drm_sysfb_helper.h index 547f2327af5e..1c31267daa00 100644 --- a/drivers/gpu/drm/sysfb/drm_sysfb_helper.h +++ b/drivers/gpu/drm/sysfb/drm_sysfb_helper.h @@ -134,15 +134,15 @@ int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane, .atomic_disable = drm_sysfb_plane_helper_atomic_disable, \ .get_scanout_buffer = drm_sysfb_plane_helper_get_scanout_buffer -void drm_sysfb_plane_reset(struct drm_plane *plane); +struct drm_plane_state *drm_sysfb_plane_atomic_create_state(struct drm_plane *plane); struct drm_plane_state *drm_sysfb_plane_atomic_duplicate_state(struct drm_plane *plane); void drm_sysfb_plane_atomic_destroy_state(struct drm_plane *plane, struct drm_plane_state *plane_state); #define DRM_SYSFB_PLANE_FUNCS \ - .reset = drm_sysfb_plane_reset, \ .update_plane = drm_atomic_helper_update_plane, \ .disable_plane = drm_atomic_helper_disable_plane, \ + .atomic_create_state = drm_sysfb_plane_atomic_create_state, \ .atomic_duplicate_state = drm_sysfb_plane_atomic_duplicate_state, \ .atomic_destroy_state = drm_sysfb_plane_atomic_destroy_state diff --git a/drivers/gpu/drm/sysfb/drm_sysfb_modeset.c b/drivers/gpu/drm/sysfb/drm_sysfb_modeset.c index d2de29caf89e..9a4c210d6f96 100644 --- a/drivers/gpu/drm/sysfb/drm_sysfb_modeset.c +++ b/drivers/gpu/drm/sysfb/drm_sysfb_modeset.c @@ -420,20 +420,32 @@ int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane, } EXPORT_SYMBOL(drm_sysfb_plane_helper_get_scanout_buffer); -void drm_sysfb_plane_reset(struct drm_plane *plane) +/** + * drm_sysfb_plane_atomic_create_state - creates sysfb plane state + * @plane: the plane + * + * This function implements struct &drm_plane_funcs.atomic_create_state for + * sysfb planes. It allocates the plane state of type + * struct drm_sysfb_plane_state. + * + * Returns: + * A pointer to a new plane state on success, or an ERR_PTR()-encoded + * error code otherwise. + */ +struct drm_plane_state * +drm_sysfb_plane_atomic_create_state(struct drm_plane *plane) { struct drm_sysfb_plane_state *sysfb_plane_state; - if (plane->state) - drm_sysfb_plane_state_destroy(to_drm_sysfb_plane_state(plane->state)); - sysfb_plane_state = kzalloc_obj(*sysfb_plane_state); - if (sysfb_plane_state) - __drm_gem_reset_shadow_plane(plane, &sysfb_plane_state->base); - else - __drm_gem_reset_shadow_plane(plane, NULL); + if (!sysfb_plane_state) + return ERR_PTR(-ENOMEM); + + __drm_gem_shadow_plane_state_init(plane, &sysfb_plane_state->base); + + return &sysfb_plane_state->base.base; } -EXPORT_SYMBOL(drm_sysfb_plane_reset); +EXPORT_SYMBOL(drm_sysfb_plane_atomic_create_state); struct drm_plane_state *drm_sysfb_plane_atomic_duplicate_state(struct drm_plane *plane) {