From 56f115da1b7e862f62c79aee233acbe5918c6040 Mon Sep 17 00:00:00 2001 From: Maxime Ripard Date: Fri, 21 Aug 2026 16:39:42 +0200 Subject: [PATCH] drm/vc4: Convert to atomic_create_state The vc4 crtc implementation provides a custom reset hook. However, this hook only allocates the state, initializes it with __drm_atomic_helper_crtc_reset(), sets the assigned_channel field to VC4_HVS_CHANNEL_DISABLED, and frees the previous state. It does not perform any hardware reset. Since this is exactly what the atomic_create_state hook is meant to do, minus the old state cleanup which the caller handles, convert the implementation to use atomic_create_state with __drm_atomic_helper_crtc_state_init() instead. Reviewed-by: Thomas Zimmermann Link: https://patch.msgid.link/20260821-drm-no-more-crtc-reset-v1-66-fb793475c05a@kernel.org Signed-off-by: Maxime Ripard --- drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c | 2 +- drivers/gpu/drm/vc4/vc4_crtc.c | 14 ++++++-------- drivers/gpu/drm/vc4/vc4_drv.h | 2 +- drivers/gpu/drm/vc4/vc4_txp.c | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c b/drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c index ade3309ae042..247863f8e2c5 100644 --- a/drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c +++ b/drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c @@ -14,7 +14,7 @@ static const struct drm_crtc_helper_funcs vc4_dummy_crtc_helper_funcs = { static const struct drm_crtc_funcs vc4_dummy_crtc_funcs = { .atomic_destroy_state = vc4_crtc_destroy_state, .atomic_duplicate_state = vc4_crtc_duplicate_state, - .reset = vc4_crtc_reset, + .atomic_create_state = vc4_crtc_create_state, }; struct vc4_dummy_crtc *vc4_mock_pv(struct kunit *test, diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c index 4572b0b9bae1..f42cd5353230 100644 --- a/drivers/gpu/drm/vc4/vc4_crtc.c +++ b/drivers/gpu/drm/vc4/vc4_crtc.c @@ -1135,21 +1135,19 @@ void vc4_crtc_destroy_state(struct drm_crtc *crtc, drm_atomic_helper_crtc_destroy_state(crtc, state); } -void vc4_crtc_reset(struct drm_crtc *crtc) +struct drm_crtc_state *vc4_crtc_create_state(struct drm_crtc *crtc) { struct vc4_crtc_state *vc4_crtc_state; - if (crtc->state) - vc4_crtc_destroy_state(crtc, crtc->state); - vc4_crtc_state = kzalloc_obj(*vc4_crtc_state); if (!vc4_crtc_state) { - crtc->state = NULL; - return; + return ERR_PTR(-ENOMEM); } vc4_crtc_state->assigned_channel = VC4_HVS_CHANNEL_DISABLED; - __drm_atomic_helper_crtc_reset(crtc, &vc4_crtc_state->base); + __drm_atomic_helper_crtc_state_init(&vc4_crtc_state->base, crtc); + + return &vc4_crtc_state->base; } int vc4_crtc_late_register(struct drm_crtc *crtc) @@ -1170,7 +1168,7 @@ static const struct drm_crtc_funcs vc4_crtc_funcs = { .set_property = NULL, .cursor_set = NULL, /* handled by drm_mode_cursor_universal */ .cursor_move = NULL, /* handled by drm_mode_cursor_universal */ - .reset = vc4_crtc_reset, + .atomic_create_state = vc4_crtc_create_state, .atomic_duplicate_state = vc4_crtc_duplicate_state, .atomic_destroy_state = vc4_crtc_destroy_state, .enable_vblank = vc4_enable_vblank, diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h index 0f5958c1e6b6..649032174dbd 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.h +++ b/drivers/gpu/drm/vc4/vc4_drv.h @@ -949,7 +949,7 @@ int vc4_crtc_atomic_check(struct drm_crtc *crtc, struct drm_crtc_state *vc4_crtc_duplicate_state(struct drm_crtc *crtc); void vc4_crtc_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *state); -void vc4_crtc_reset(struct drm_crtc *crtc); +struct drm_crtc_state *vc4_crtc_create_state(struct drm_crtc *crtc); void vc4_crtc_handle_vblank(struct vc4_crtc *crtc); void vc4_crtc_send_vblank(struct drm_crtc *crtc); int vc4_crtc_late_register(struct drm_crtc *crtc); diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c index bc3f366fc3e6..c469f8b1068b 100644 --- a/drivers/gpu/drm/vc4/vc4_txp.c +++ b/drivers/gpu/drm/vc4/vc4_txp.c @@ -425,7 +425,7 @@ static void vc4_txp_disable_vblank(struct drm_crtc *crtc) {} static const struct drm_crtc_funcs vc4_txp_crtc_funcs = { .set_config = drm_atomic_helper_set_config, .page_flip = vc4_page_flip, - .reset = vc4_crtc_reset, + .atomic_create_state = vc4_crtc_create_state, .atomic_duplicate_state = vc4_crtc_duplicate_state, .atomic_destroy_state = vc4_crtc_destroy_state, .enable_vblank = vc4_txp_enable_vblank,