[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

Reply via email to