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. Signed-off-by: Maxime Ripard <[email protected]> --- Cc: [email protected] --- 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 @@ -132,19 +132,19 @@ int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane, .atomic_check = drm_sysfb_plane_helper_atomic_check, \ .atomic_update = drm_sysfb_plane_helper_atomic_update, \ .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 /* * CRTC 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 @@ -418,24 +418,36 @@ int drm_sysfb_plane_helper_get_scanout_buffer(struct drm_plane *plane, return 0; } 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) { struct drm_device *dev = plane->dev; struct drm_plane_state *plane_state = plane->state; -- 2.54.0
