[PATCH 30/59] drm/amd/display: Test DM atomic private state helpers
Alex Hung <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
[WHAT] Add KUnit tests for dm_atomic_get_state() covering the return taken when the caller already holds the DM state, and for dm_atomic_duplicate_state() covering the failure path when the old private state has no DC context. Assisted-by: Copilot:Claude-Opus-5 GPT-5.6-Sol Reviewed-by: Bhawanpreet Lakha <[email protected]> Signed-off-by: Alex Hung <[email protected]> --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 4 +- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 1 + .../display/amdgpu_dm/tests/amdgpu_dm_test.c | 53 +++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index eb00c62c6f72..5c4aac207e8f 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -2136,6 +2136,7 @@ int dm_atomic_get_state(struct drm_atomic_commit *state, return 0; } +EXPORT_IF_KUNIT(dm_atomic_get_state); STATIC_IFN_KUNIT struct dm_atomic_state * dm_atomic_get_new_state(struct drm_atomic_commit *state) @@ -2156,7 +2157,7 @@ dm_atomic_get_new_state(struct drm_atomic_commit *state) } EXPORT_IF_KUNIT(dm_atomic_get_new_state); -static struct drm_private_state * +STATIC_IFN_KUNIT struct drm_private_state * dm_atomic_duplicate_state(struct drm_private_obj *obj) { struct dm_atomic_state *old_state, *new_state; @@ -2179,6 +2180,7 @@ dm_atomic_duplicate_state(struct drm_private_obj *obj) return &new_state->base; } +EXPORT_IF_KUNIT(dm_atomic_duplicate_state); STATIC_IFN_KUNIT void dm_atomic_destroy_state(struct drm_private_obj *obj, struct drm_private_state *state) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h index a25942b5565f..6e078be5bc5e 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -1168,6 +1168,7 @@ u32 dm_vblank_get_counter(struct amdgpu_device *adev, int crtc); int dm_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc, u32 *vbl, u32 *position); struct dm_atomic_state *dm_atomic_get_new_state(struct drm_atomic_commit *state); +struct drm_private_state *dm_atomic_duplicate_state(struct drm_private_obj *obj); void dm_atomic_destroy_state(struct drm_private_obj *obj, struct drm_private_state *state); int dm_plane_layer_index_cmp(const void *a, const void *b); diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c index 33cca3f01b5b..66c35a22c45e 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c @@ -1232,6 +1232,56 @@ static void dm_test_crtc_get_scanoutpos_exits_idle(struct kunit *test) KUNIT_EXPECT_EQ(test, dm_crtc_get_scanoutpos(adev, 0, &vbl, &position), 0); } +static struct drm_atomic_commit *dm_test_alloc_commit(struct kunit *test, + struct amdgpu_device *adev) +{ + struct drm_atomic_commit *state; + + state = kunit_kzalloc(test, sizeof(*state), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, state); + state->dev = &adev->ddev; + + return state; +} + +/** + * dm_test_atomic_get_state_already_acquired - Test an acquired DM state is returned as is + * @test: The KUnit test context + */ +static void dm_test_atomic_get_state_already_acquired(struct kunit *test) +{ + struct amdgpu_device *adev = dm_kunit_alloc_adev(test); + struct drm_atomic_commit *state = dm_test_alloc_commit(test, adev); + struct dm_atomic_state *dm_state; + struct dm_atomic_state *acquired; + + dm_state = kunit_kzalloc(test, sizeof(*dm_state), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, dm_state); + acquired = dm_state; + + KUNIT_EXPECT_EQ(test, dm_atomic_get_state(state, &acquired), 0); + KUNIT_EXPECT_PTR_EQ(test, acquired, dm_state); +} + +/** + * dm_test_atomic_duplicate_state_no_context - Test duplication fails without a DC context + * @test: The KUnit test context + */ +static void dm_test_atomic_duplicate_state_no_context(struct kunit *test) +{ + struct dm_atomic_state *old_state; + struct drm_private_obj *obj; + + obj = kunit_kzalloc(test, sizeof(*obj), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, obj); + old_state = kunit_kzalloc(test, sizeof(*old_state), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, old_state); + + obj->state = &old_state->base; + + KUNIT_EXPECT_NULL(test, dm_atomic_duplicate_state(obj)); +} + static struct kunit_case amdgpu_dm_tests[] = { /* Simple DM callbacks */ KUNIT_CASE(dm_test_wait_for_idle), @@ -1302,6 +1352,9 @@ static struct kunit_case amdgpu_dm_tests[] = { KUNIT_CASE(dm_test_vblank_get_counter_unmapped_stream), KUNIT_CASE(dm_test_crtc_get_scanoutpos_unmapped_stream), KUNIT_CASE(dm_test_crtc_get_scanoutpos_exits_idle), + /* dm_atomic_get_state / dm_atomic_duplicate_state */ + KUNIT_CASE(dm_test_atomic_get_state_already_acquired), + KUNIT_CASE(dm_test_atomic_duplicate_state_no_context), {} }; -- 2.43.0