* [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset
@ 2026-09-04 9:07 Maxime Ripard
2026-09-04 9:07 ` [PATCH v3 02/13] drm/amdgpu: vkms: Switch to drm_atomic_helper_crtc_create_state Maxime Ripard
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Maxime Ripard @ 2026-09-04 9:07 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Christian König, Alex Deucher,
amd-gfx, Paul Kocialkowski, Jyri Sarha, Tomi Valkeinen,
Harry Wentland, Leo Li, Rodrigo Siqueira, Huacai Chen,
Icenowy Zheng, Jianmin Lv, Mingcong Bai, Qianhai Wu, Xi Ruoyao,
AngeloGioacchino Del Regno, Chun-Kuang Hu, Matthias Brugger,
Philipp Zabel, Iker Pedrosa, Dmitry Baryshkov
This is a follow-up to the plane reset removal series, and part of a
larger effort to remove the reset hook from all KMS objects.
The CRTC reset hook is overloaded: it is called both at probe time to
create the initial software state and during suspend/resume to reset
hardware and software state. These two roles have different
requirements, and the reset hook is not fallible, making error
handling difficult for the initial state allocation path.
While reset has the semantics to reset both the software and hardware
state, the vast majority of implementations and all the helpers only
reset the software state, making them equivalent to
atomic_create_state in practice. The atomic_create_state hook makes
this explicit: it only allocates and initializes a pristine state
without any side effect, and returns the state pointer or an ERR_PTR
on failure.
This series converts all CRTC drivers tree-wide from the reset hook to
atomic_create_state, then removes the reset hook from struct
drm_crtc_funcs entirely. Two drivers (tilcdc and loongson) had actual
hardware reset logic mixed into their reset hook; those are moved to
CRTC creation instead. The conversions were done using a combination of
Coccinelle semantic patches and manual adjustments.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Changes in v3:
- Test if crtc->helper_private is set before accessing it, and call the
temp variable to store it helper_funcs
- Rework outdated commit logs
- Fix error path for amdgpu_dm_crtc_init
- Fix new amdgpu tests doc
- Rebased on drm-misc-next-2026-09-03
- Link to v2: https://lore.kernel.org/r/20260831-drm-no-more-crtc-reset-v2-0-4500d49a337f@kernel.org
Changes in v2:
- Fix indentation in logicvc
- Fix hardware reset at probe and suspend for loonsoon and tilcldc
- Fix state creation for amdgpu
- Rebase on current drm-misc-next
- Fix commit message for st7920
- Fix merge conflict for mediatek
- Link to v1: https://lore.kernel.org/r/20260821-drm-no-more-crtc-reset-v1-0-fb793475c05a@kernel.org
---
Maxime Ripard (13):
drm/crtc: Introduce hw_reset helper hook
drm/amdgpu: vkms: Switch to drm_atomic_helper_crtc_create_state
drm/logicvc: Switch to drm_atomic_helper_crtc_create_state
drm/tilcdc: Move hardware reset to hw_reset hook
drm/tilcdc: Switch to drm_atomic_helper_crtc_create_state
drm/atomic-helper: Remove drm_atomic_helper_crtc_reset
drm/amdgpu: dm: Convert to atomic_create_state
drm/loongson: Move hardware reset to hw_reset hook
drm/loongson: Convert to atomic_create_state
drm/mediatek: Convert to atomic_create_state
drm/sitronix: st7920: Convert to atomic_create_state
drm/atomic-helper: Remove __drm_atomic_helper_crtc_reset
drm/crtc: Remove reset
drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c | 2 +-
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 31 ++++++++++-----
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h | 2 +-
.../display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c | 23 ++++++-----
drivers/gpu/drm/drm_atomic_state_helper.c | 45 ----------------------
drivers/gpu/drm/drm_mode_config.c | 17 ++++++--
drivers/gpu/drm/logicvc/logicvc_crtc.c | 2 +-
drivers/gpu/drm/loongson/lsdc_crtc.c | 30 ++++++++-------
drivers/gpu/drm/mediatek/mtk_crtc.c | 18 ++++-----
drivers/gpu/drm/sitronix/st7920.c | 12 +++---
drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 7 ++--
include/drm/drm_atomic_state_helper.h | 3 --
include/drm/drm_crtc.h | 12 ------
include/drm/drm_modeset_helper_vtables.h | 14 +++++++
14 files changed, 96 insertions(+), 122 deletions(-)
---
base-commit: 17c6b88e85ffe5de5720004ae8c2176d52944aca
change-id: 20260709-drm-no-more-crtc-reset-14a4d5bc8d41
Best regards,
--
Maxime Ripard <mripard@kernel.org>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 02/13] drm/amdgpu: vkms: Switch to drm_atomic_helper_crtc_create_state
2026-09-04 9:07 [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
@ 2026-09-04 9:07 ` Maxime Ripard
2026-09-04 9:07 ` [PATCH v3 07/13] drm/amdgpu: dm: Convert to atomic_create_state Maxime Ripard
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Maxime Ripard @ 2026-09-04 9:07 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Christian König, Alex Deucher,
amd-gfx
The amdgpu vkms crtc implementation uses the deprecated
drm_atomic_helper_crtc_reset() as its reset hook.
Switch to drm_atomic_helper_crtc_create_state() instead.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: "Christian König" <christian.koenig@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: amd-gfx@lists.freedesktop.org
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
index c835504fdf2b..592c5c253938 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c
@@ -45,11 +45,11 @@ static const u32 amdgpu_vkms_formats[] = {
static const struct drm_crtc_funcs amdgpu_vkms_crtc_funcs = {
.set_config = drm_atomic_helper_set_config,
.destroy = drm_crtc_cleanup,
.page_flip = drm_atomic_helper_page_flip,
- .reset = drm_atomic_helper_crtc_reset,
+ .atomic_create_state = drm_atomic_helper_crtc_create_state,
.atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
DRM_CRTC_VBLANK_TIMER_FUNCS,
};
--
2.55.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 07/13] drm/amdgpu: dm: Convert to atomic_create_state
2026-09-04 9:07 [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
2026-09-04 9:07 ` [PATCH v3 02/13] drm/amdgpu: vkms: Switch to drm_atomic_helper_crtc_create_state Maxime Ripard
@ 2026-09-04 9:07 ` Maxime Ripard
2026-09-10 16:41 ` Leo Li
2026-09-10 15:20 ` [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset Javier Martinez Canillas
2026-09-11 13:14 ` Maxime Ripard
3 siblings, 1 reply; 6+ messages in thread
From: Maxime Ripard @ 2026-09-04 9:07 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Christian König, Alex Deucher,
Harry Wentland, Leo Li, Rodrigo Siqueira, amd-gfx
The amdgpu display manager crtc implementation provides a custom reset
hook. However, this hook only allocates the state, initializes it with
__drm_atomic_helper_crtc_reset(), 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 <tzimmermann@suse.de>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: "Christian König" <christian.koenig@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: Leo Li <sunpeng.li@amd.com>
Cc: Rodrigo Siqueira <siqueira@igalia.com>
Cc: amd-gfx@lists.freedesktop.org
---
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 31 +++++++++++++++-------
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h | 2 +-
.../display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c | 23 ++++++++--------
3 files changed, 33 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
index 62eac6e65334..53910056da20 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
@@ -473,24 +473,23 @@ static void amdgpu_dm_crtc_destroy(struct drm_crtc *crtc)
drm_crtc_cleanup(crtc);
kfree(crtc);
}
-STATIC_IFN_KUNIT void amdgpu_dm_crtc_reset_state(struct drm_crtc *crtc)
+STATIC_IFN_KUNIT struct drm_crtc_state *amdgpu_dm_crtc_create_state(struct drm_crtc *crtc)
{
struct dm_crtc_state *state;
state = kzalloc_obj(*state);
if (!state)
- return;
+ return ERR_PTR(-ENOMEM);
- if (crtc->state)
- amdgpu_dm_crtc_destroy_state(crtc, crtc->state);
+ __drm_atomic_helper_crtc_state_init(&state->base, crtc);
- __drm_atomic_helper_crtc_reset(crtc, &state->base);
+ return &state->base;
}
-EXPORT_IF_KUNIT(amdgpu_dm_crtc_reset_state);
+EXPORT_IF_KUNIT(amdgpu_dm_crtc_create_state);
#ifdef CONFIG_DEBUG_FS
static int amdgpu_dm_crtc_late_register(struct drm_crtc *crtc)
{
crtc_debugfs_init(crtc);
@@ -563,11 +562,11 @@ amdgpu_dm_atomic_crtc_get_property(struct drm_crtc *crtc,
}
#endif
/* Implemented only the options currently available for the driver */
static const struct drm_crtc_funcs amdgpu_dm_crtc_funcs = {
- .reset = amdgpu_dm_crtc_reset_state,
+ .atomic_create_state = amdgpu_dm_crtc_create_state,
.destroy = amdgpu_dm_crtc_destroy,
.set_config = drm_atomic_helper_set_config,
.page_flip = drm_atomic_helper_page_flip,
.atomic_duplicate_state = amdgpu_dm_crtc_duplicate_state,
.atomic_destroy_state = amdgpu_dm_crtc_destroy_state,
@@ -779,13 +778,22 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
amdgpu_dm_ism_init(&acrtc->ism, &default_ism_config);
drm_crtc_helper_add(&acrtc->base, &amdgpu_dm_crtc_helper_funcs);
- /* Create (reset) the plane state */
- if (acrtc->base.funcs->reset)
- acrtc->base.funcs->reset(&acrtc->base);
+ /* Create the plane state */
+ if (acrtc->base.funcs->atomic_create_state) {
+ struct drm_crtc_state *crtc_state;
+
+ crtc_state = acrtc->base.funcs->atomic_create_state(&acrtc->base);
+ if (IS_ERR(crtc_state)) {
+ res = PTR_ERR(crtc_state);
+ goto error_ism_fini;
+ }
+
+ acrtc->base.state = crtc_state;
+ }
acrtc->max_cursor_width = dm->adev->dm.dc->caps.max_cursor_size;
acrtc->max_cursor_height = dm->adev->dm.dc->caps.max_cursor_size;
acrtc->crtc_id = crtc_index;
@@ -813,10 +821,13 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
#ifdef AMD_PRIVATE_COLOR
dm_crtc_additional_color_mgmt(&acrtc->base);
#endif
return 0;
+error_ism_fini:
+ amdgpu_dm_ism_fini(&acrtc->ism);
+ drm_crtc_cleanup(&acrtc->base);
fail:
kfree(acrtc);
kfree(cursor_plane);
return res;
}
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
index 93c6d0d8d7fd..ad516aeb9798 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
@@ -47,11 +47,11 @@ bool amdgpu_dm_crtc_helper_mode_fixup(struct drm_crtc *crtc,
const struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode);
void amdgpu_dm_crtc_destroy_state(struct drm_crtc *crtc,
struct drm_crtc_state *state);
struct drm_crtc_state *amdgpu_dm_crtc_duplicate_state(struct drm_crtc *crtc);
-void amdgpu_dm_crtc_reset_state(struct drm_crtc *crtc);
+struct drm_crtc_state *amdgpu_dm_crtc_create_state(struct drm_crtc *crtc);
int amdgpu_dm_crtc_count_crtc_active_planes(struct drm_crtc_state *new_crtc_state);
void amdgpu_dm_crtc_update_crtc_active_planes(struct drm_crtc *crtc,
struct drm_crtc_state *new_crtc_state);
void amdgpu_dm_crtc_vblank_control_worker(struct work_struct *work);
void amdgpu_dm_idle_worker(struct work_struct *work);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c
index 4dacddd23878..20ae31d2bf6a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c
@@ -1402,35 +1402,34 @@ static void dm_test_crtc_duplicate_state_copies_fields(struct kunit *test)
KUNIT_EXPECT_TRUE(test, dm_dup->mpo_requested);
amdgpu_dm_crtc_destroy_state(crtc, dup);
}
-/* Tests for amdgpu_dm_crtc_reset_state() */
+/* Tests for amdgpu_dm_crtc_create_state() */
/**
- * dm_test_crtc_reset_state_allocates_state - Test reset installs a fresh state
+ * dm_test_crtc_create_state_allocates_state - Test create_state allocates a fresh state
* @test: The KUnit test context
*
- * Resetting a CRTC with no existing state must allocate and install a new
- * drm_crtc_state.
+ * Creating state for a CRTC must allocate a new drm_crtc_state.
*/
-static void dm_test_crtc_reset_state_allocates_state(struct kunit *test)
+static void dm_test_crtc_create_state_allocates_state(struct kunit *test)
{
struct amdgpu_device *adev = dm_kunit_alloc_adev(test);
+ struct drm_crtc_state *crtc_state;
struct drm_crtc *crtc;
crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc);
crtc->dev = &adev->ddev;
crtc->state = NULL;
- amdgpu_dm_crtc_reset_state(crtc);
+ crtc_state = amdgpu_dm_crtc_create_state(crtc);
+ KUNIT_EXPECT_NOT_ERR_OR_NULL(test, crtc_state);
- KUNIT_EXPECT_NOT_NULL(test, crtc->state);
-
- if (crtc->state)
- amdgpu_dm_crtc_destroy_state(crtc, crtc->state);
+ if (!IS_ERR(crtc_state))
+ amdgpu_dm_crtc_destroy_state(crtc, crtc_state);
}
/* Tests for amdgpu_dm_crtc_destroy_state() */
/**
@@ -1905,12 +1904,12 @@ static struct kunit_case amdgpu_dm_crtc_tests[] = {
/* amdgpu_dm_crtc_count_crtc_active_planes */
KUNIT_CASE(dm_test_count_crtc_active_planes_none),
KUNIT_CASE(dm_test_count_crtc_active_planes_mixed),
/* amdgpu_dm_crtc_duplicate_state */
KUNIT_CASE(dm_test_crtc_duplicate_state_copies_fields),
- /* amdgpu_dm_crtc_reset_state */
- KUNIT_CASE(dm_test_crtc_reset_state_allocates_state),
+ /* amdgpu_dm_crtc_create_state */
+ KUNIT_CASE(dm_test_crtc_create_state_allocates_state),
/* amdgpu_dm_crtc_destroy_state */
KUNIT_CASE(dm_test_crtc_destroy_state_no_stream),
KUNIT_CASE(dm_test_crtc_destroy_state_releases_stream),
/* amdgpu_dm_crtc_handle_vblank */
KUNIT_CASE(dm_test_crtc_handle_vblank_no_event),
--
2.55.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset
2026-09-04 9:07 [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
2026-09-04 9:07 ` [PATCH v3 02/13] drm/amdgpu: vkms: Switch to drm_atomic_helper_crtc_create_state Maxime Ripard
2026-09-04 9:07 ` [PATCH v3 07/13] drm/amdgpu: dm: Convert to atomic_create_state Maxime Ripard
@ 2026-09-10 15:20 ` Javier Martinez Canillas
2026-09-11 13:14 ` Maxime Ripard
3 siblings, 0 replies; 6+ messages in thread
From: Javier Martinez Canillas @ 2026-09-10 15:20 UTC (permalink / raw)
To: Maxime Ripard, Maarten Lankhorst, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, Maxime Ripard, Christian König, Alex Deucher,
amd-gfx, Paul Kocialkowski, Jyri Sarha, Tomi Valkeinen,
Harry Wentland, Leo Li, Rodrigo Siqueira, Huacai Chen,
Icenowy Zheng, Jianmin Lv, Mingcong Bai, Qianhai Wu, Xi Ruoyao,
AngeloGioacchino Del Regno, Chun-Kuang Hu, Matthias Brugger,
Philipp Zabel, Iker Pedrosa, Dmitry Baryshkov
Maxime Ripard <mripard@kernel.org> writes:
Hello,
> This is a follow-up to the plane reset removal series, and part of a
> larger effort to remove the reset hook from all KMS objects.
>
> The CRTC reset hook is overloaded: it is called both at probe time to
> create the initial software state and during suspend/resume to reset
> hardware and software state. These two roles have different
> requirements, and the reset hook is not fallible, making error
> handling difficult for the initial state allocation path.
>
> While reset has the semantics to reset both the software and hardware
> state, the vast majority of implementations and all the helpers only
> reset the software state, making them equivalent to
> atomic_create_state in practice. The atomic_create_state hook makes
> this explicit: it only allocates and initializes a pristine state
> without any side effect, and returns the state pointer or an ERR_PTR
> on failure.
>
> This series converts all CRTC drivers tree-wide from the reset hook to
> atomic_create_state, then removes the reset hook from struct
> drm_crtc_funcs entirely. Two drivers (tilcdc and loongson) had actual
> hardware reset logic mixed into their reset hook; those are moved to
> CRTC creation instead. The conversions were done using a combination of
> Coccinelle semantic patches and manual adjustments.
>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
> ---
I went through all this series and the patches look good to me.
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
--
Best regards,
Javier Martinez Canillas
Core Platforms
Red Hat
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 07/13] drm/amdgpu: dm: Convert to atomic_create_state
2026-09-04 9:07 ` [PATCH v3 07/13] drm/amdgpu: dm: Convert to atomic_create_state Maxime Ripard
@ 2026-09-10 16:41 ` Leo Li
0 siblings, 0 replies; 6+ messages in thread
From: Leo Li @ 2026-09-10 16:41 UTC (permalink / raw)
To: Maxime Ripard, Maarten Lankhorst, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, Christian König, Alex Deucher, Harry Wentland,
Rodrigo Siqueira, amd-gfx
On 2026-09-04 05:07, Maxime Ripard wrote:
> The amdgpu display manager crtc implementation provides a custom reset
> hook. However, this hook only allocates the state, initializes it with
> __drm_atomic_helper_crtc_reset(), 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 <tzimmermann@suse.de>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
> ---
> Cc: "Christian König" <christian.koenig@amd.com>
> Cc: Alex Deucher <alexander.deucher@amd.com>
> Cc: Harry Wentland <harry.wentland@amd.com>
> Cc: Leo Li <sunpeng.li@amd.com>
> Cc: Rodrigo Siqueira <siqueira@igalia.com>
> Cc: amd-gfx@lists.freedesktop.org
> ---
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 31 +++++++++++++++-------
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h | 2 +-
> .../display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c | 23 ++++++++--------
> 3 files changed, 33 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
> index 62eac6e65334..53910056da20 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
> @@ -473,24 +473,23 @@ static void amdgpu_dm_crtc_destroy(struct drm_crtc *crtc)
>
> drm_crtc_cleanup(crtc);
> kfree(crtc);
> }
>
> -STATIC_IFN_KUNIT void amdgpu_dm_crtc_reset_state(struct drm_crtc *crtc)
> +STATIC_IFN_KUNIT struct drm_crtc_state *amdgpu_dm_crtc_create_state(struct drm_crtc *crtc)
> {
> struct dm_crtc_state *state;
>
> state = kzalloc_obj(*state);
> if (!state)
> - return;
> + return ERR_PTR(-ENOMEM);
>
> - if (crtc->state)
> - amdgpu_dm_crtc_destroy_state(crtc, crtc->state);
> + __drm_atomic_helper_crtc_state_init(&state->base, crtc);
>
> - __drm_atomic_helper_crtc_reset(crtc, &state->base);
> + return &state->base;
> }
> -EXPORT_IF_KUNIT(amdgpu_dm_crtc_reset_state);
> +EXPORT_IF_KUNIT(amdgpu_dm_crtc_create_state);
>
> #ifdef CONFIG_DEBUG_FS
> static int amdgpu_dm_crtc_late_register(struct drm_crtc *crtc)
> {
> crtc_debugfs_init(crtc);
> @@ -563,11 +562,11 @@ amdgpu_dm_atomic_crtc_get_property(struct drm_crtc *crtc,
> }
> #endif
>
> /* Implemented only the options currently available for the driver */
> static const struct drm_crtc_funcs amdgpu_dm_crtc_funcs = {
> - .reset = amdgpu_dm_crtc_reset_state,
> + .atomic_create_state = amdgpu_dm_crtc_create_state,
> .destroy = amdgpu_dm_crtc_destroy,
> .set_config = drm_atomic_helper_set_config,
> .page_flip = drm_atomic_helper_page_flip,
> .atomic_duplicate_state = amdgpu_dm_crtc_duplicate_state,
> .atomic_destroy_state = amdgpu_dm_crtc_destroy_state,
> @@ -779,13 +778,22 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
>
> amdgpu_dm_ism_init(&acrtc->ism, &default_ism_config);
>
> drm_crtc_helper_add(&acrtc->base, &amdgpu_dm_crtc_helper_funcs);
>
> - /* Create (reset) the plane state */
> - if (acrtc->base.funcs->reset)
> - acrtc->base.funcs->reset(&acrtc->base);
> + /* Create the plane state */
Looks like an existing typo, could you s/plane state/crtc state/ along with
this change?
Reviewed-by: Leo Li <sunpeng.li@amd.com>
Thanks!
- Leo
> + if (acrtc->base.funcs->atomic_create_state) {
> + struct drm_crtc_state *crtc_state;
> +
> + crtc_state = acrtc->base.funcs->atomic_create_state(&acrtc->base);
> + if (IS_ERR(crtc_state)) {
> + res = PTR_ERR(crtc_state);
> + goto error_ism_fini;
> + }
> +
> + acrtc->base.state = crtc_state;
> + }
>
> acrtc->max_cursor_width = dm->adev->dm.dc->caps.max_cursor_size;
> acrtc->max_cursor_height = dm->adev->dm.dc->caps.max_cursor_size;
>
> acrtc->crtc_id = crtc_index;
> @@ -813,10 +821,13 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
> #ifdef AMD_PRIVATE_COLOR
> dm_crtc_additional_color_mgmt(&acrtc->base);
> #endif
> return 0;
>
> +error_ism_fini:
> + amdgpu_dm_ism_fini(&acrtc->ism);
> + drm_crtc_cleanup(&acrtc->base);
> fail:
> kfree(acrtc);
> kfree(cursor_plane);
> return res;
> }
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
> index 93c6d0d8d7fd..ad516aeb9798 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
> @@ -47,11 +47,11 @@ bool amdgpu_dm_crtc_helper_mode_fixup(struct drm_crtc *crtc,
> const struct drm_display_mode *mode,
> struct drm_display_mode *adjusted_mode);
> void amdgpu_dm_crtc_destroy_state(struct drm_crtc *crtc,
> struct drm_crtc_state *state);
> struct drm_crtc_state *amdgpu_dm_crtc_duplicate_state(struct drm_crtc *crtc);
> -void amdgpu_dm_crtc_reset_state(struct drm_crtc *crtc);
> +struct drm_crtc_state *amdgpu_dm_crtc_create_state(struct drm_crtc *crtc);
> int amdgpu_dm_crtc_count_crtc_active_planes(struct drm_crtc_state *new_crtc_state);
> void amdgpu_dm_crtc_update_crtc_active_planes(struct drm_crtc *crtc,
> struct drm_crtc_state *new_crtc_state);
> void amdgpu_dm_crtc_vblank_control_worker(struct work_struct *work);
> void amdgpu_dm_idle_worker(struct work_struct *work);
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c
> index 4dacddd23878..20ae31d2bf6a 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c
> @@ -1402,35 +1402,34 @@ static void dm_test_crtc_duplicate_state_copies_fields(struct kunit *test)
> KUNIT_EXPECT_TRUE(test, dm_dup->mpo_requested);
>
> amdgpu_dm_crtc_destroy_state(crtc, dup);
> }
>
> -/* Tests for amdgpu_dm_crtc_reset_state() */
> +/* Tests for amdgpu_dm_crtc_create_state() */
>
> /**
> - * dm_test_crtc_reset_state_allocates_state - Test reset installs a fresh state
> + * dm_test_crtc_create_state_allocates_state - Test create_state allocates a fresh state
> * @test: The KUnit test context
> *
> - * Resetting a CRTC with no existing state must allocate and install a new
> - * drm_crtc_state.
> + * Creating state for a CRTC must allocate a new drm_crtc_state.
> */
> -static void dm_test_crtc_reset_state_allocates_state(struct kunit *test)
> +static void dm_test_crtc_create_state_allocates_state(struct kunit *test)
> {
> struct amdgpu_device *adev = dm_kunit_alloc_adev(test);
> + struct drm_crtc_state *crtc_state;
> struct drm_crtc *crtc;
>
> crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
> KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc);
> crtc->dev = &adev->ddev;
> crtc->state = NULL;
>
> - amdgpu_dm_crtc_reset_state(crtc);
> + crtc_state = amdgpu_dm_crtc_create_state(crtc);
> + KUNIT_EXPECT_NOT_ERR_OR_NULL(test, crtc_state);
>
> - KUNIT_EXPECT_NOT_NULL(test, crtc->state);
> -
> - if (crtc->state)
> - amdgpu_dm_crtc_destroy_state(crtc, crtc->state);
> + if (!IS_ERR(crtc_state))
> + amdgpu_dm_crtc_destroy_state(crtc, crtc_state);
> }
>
> /* Tests for amdgpu_dm_crtc_destroy_state() */
>
> /**
> @@ -1905,12 +1904,12 @@ static struct kunit_case amdgpu_dm_crtc_tests[] = {
> /* amdgpu_dm_crtc_count_crtc_active_planes */
> KUNIT_CASE(dm_test_count_crtc_active_planes_none),
> KUNIT_CASE(dm_test_count_crtc_active_planes_mixed),
> /* amdgpu_dm_crtc_duplicate_state */
> KUNIT_CASE(dm_test_crtc_duplicate_state_copies_fields),
> - /* amdgpu_dm_crtc_reset_state */
> - KUNIT_CASE(dm_test_crtc_reset_state_allocates_state),
> + /* amdgpu_dm_crtc_create_state */
> + KUNIT_CASE(dm_test_crtc_create_state_allocates_state),
> /* amdgpu_dm_crtc_destroy_state */
> KUNIT_CASE(dm_test_crtc_destroy_state_no_stream),
> KUNIT_CASE(dm_test_crtc_destroy_state_releases_stream),
> /* amdgpu_dm_crtc_handle_vblank */
> KUNIT_CASE(dm_test_crtc_handle_vblank_no_event),
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset
2026-09-04 9:07 [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
` (2 preceding siblings ...)
2026-09-10 15:20 ` [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset Javier Martinez Canillas
@ 2026-09-11 13:14 ` Maxime Ripard
3 siblings, 0 replies; 6+ messages in thread
From: Maxime Ripard @ 2026-09-11 13:14 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Christian König, Alex Deucher, amd-gfx,
Paul Kocialkowski, Jyri Sarha, Tomi Valkeinen, Harry Wentland,
Leo Li, Rodrigo Siqueira, Huacai Chen, Icenowy Zheng, Jianmin Lv,
Mingcong Bai, Qianhai Wu, Xi Ruoyao, AngeloGioacchino Del Regno,
Chun-Kuang Hu, Matthias Brugger, Philipp Zabel, Iker Pedrosa,
Dmitry Baryshkov
[-- Attachment #1: Type: text/plain, Size: 1578 bytes --]
On Fri, Sep 04, 2026 at 11:07:18AM +0200, Maxime Ripard wrote:
> This is a follow-up to the plane reset removal series, and part of a
> larger effort to remove the reset hook from all KMS objects.
>
> The CRTC reset hook is overloaded: it is called both at probe time to
> create the initial software state and during suspend/resume to reset
> hardware and software state. These two roles have different
> requirements, and the reset hook is not fallible, making error
> handling difficult for the initial state allocation path.
>
> While reset has the semantics to reset both the software and hardware
> state, the vast majority of implementations and all the helpers only
> reset the software state, making them equivalent to
> atomic_create_state in practice. The atomic_create_state hook makes
> this explicit: it only allocates and initializes a pristine state
> without any side effect, and returns the state pointer or an ERR_PTR
> on failure.
>
> This series converts all CRTC drivers tree-wide from the reset hook to
> atomic_create_state, then removes the reset hook from struct
> drm_crtc_funcs entirely. Two drivers (tilcdc and loongson) had actual
> hardware reset logic mixed into their reset hook; those are moved to
> CRTC creation instead. The conversions were done using a combination of
> Coccinelle semantic patches and manual adjustments.
>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
> ---
Pushed all patches but the ones removing the helpers and hook because
it would break the latest gm12u320 commit.
Maxime
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 273 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-09-11 13:14 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-04 9:07 [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset Maxime Ripard
2026-09-04 9:07 ` [PATCH v3 02/13] drm/amdgpu: vkms: Switch to drm_atomic_helper_crtc_create_state Maxime Ripard
2026-09-04 9:07 ` [PATCH v3 07/13] drm/amdgpu: dm: Convert to atomic_create_state Maxime Ripard
2026-09-10 16:41 ` Leo Li
2026-09-10 15:20 ` [PATCH v3 00/13] drm/crtc: Convert all drivers to atomic_create_state and remove reset Javier Martinez Canillas
2026-09-11 13:14 ` Maxime Ripard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox