summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Ripard <mripard@kernel.org>2026-09-04 11:07:25 +0200
committerMaxime Ripard <mripard@kernel.org>2026-09-11 15:10:59 +0200
commit32fbec62a3e9f00a558f2a0fc9bd1bc0e7d9d0fb (patch)
treede9e369af84515d771bbd39b0236d54a9b421bb7
parent0470f2047ed498bf4ebbc0351032d539f43f32ad (diff)
downloadlinux-next-32fbec62a3e9f00a558f2a0fc9bd1bc0e7d9d0fb.tar.gz
linux-next-32fbec62a3e9f00a558f2a0fc9bd1bc0e7d9d0fb.zip
drm/amdgpu: dm: Convert to atomic_create_state
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> Reviewed-by: Leo Li <sunpeng.li@amd.com> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> Link: https://lore.kernel.org/r/20260904-drm-no-more-crtc-reset-v3-7-27d9891512ce@kernel.org Signed-off-by: Maxime Ripard <mripard@kernel.org>
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c31
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h2
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_crtc_test.c23
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
@@ -475,20 +475,19 @@ static void amdgpu_dm_crtc_destroy(struct drm_crtc *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)
@@ -565,7 +564,7 @@ amdgpu_dm_atomic_crtc_get_property(struct drm_crtc *crtc,
/* 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,
@@ -781,9 +780,18 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
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;
@@ -815,6 +823,9 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
#endif
return 0;
+error_ism_fini:
+ amdgpu_dm_ism_fini(&acrtc->ism);
+ drm_crtc_cleanup(&acrtc->base);
fail:
kfree(acrtc);
kfree(cursor_plane);
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
@@ -49,7 +49,7 @@ bool amdgpu_dm_crtc_helper_mode_fixup(struct drm_crtc *crtc,
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);
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 0d998f204250..17bd64611a82 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
@@ -1404,18 +1404,18 @@ static void dm_test_crtc_duplicate_state_copies_fields(struct kunit *test)
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);
@@ -1423,12 +1423,11 @@ static void dm_test_crtc_reset_state_allocates_state(struct kunit *test)
crtc->dev = &adev->ddev;
crtc->state = NULL;
- amdgpu_dm_crtc_reset_state(crtc);
-
- KUNIT_EXPECT_NOT_NULL(test, crtc->state);
+ crtc_state = amdgpu_dm_crtc_create_state(crtc);
+ KUNIT_EXPECT_NOT_ERR_OR_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() */
@@ -1907,8 +1906,8 @@ static struct kunit_case amdgpu_dm_crtc_tests[] = {
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),