diff options
| author | Maxime Ripard <mripard@kernel.org> | 2026-09-04 11:07:25 +0200 |
|---|---|---|
| committer | Maxime Ripard <mripard@kernel.org> | 2026-09-11 15:10:59 +0200 |
| commit | 32fbec62a3e9f00a558f2a0fc9bd1bc0e7d9d0fb (patch) | |
| tree | de9e369af84515d771bbd39b0236d54a9b421bb7 | |
| parent | 0470f2047ed498bf4ebbc0351032d539f43f32ad (diff) | |
| download | linux-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>
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), |
