[WHAT]
Add KUnit tests for amdgpu_dm_atomic_setup_commit() covering an empty
commit, changed color management, a modeset-only color update, and an
invalid degamma LUT.

[HOW]
Reuse the modeset fixture for active CRTC paths and attach a one-entry LUT
to exercise size validation without hardware programming.

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 |  5 +-
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  1 +
 .../display/amdgpu_dm/tests/amdgpu_dm_test.c  | 67 +++++++++++++++++++
 3 files changed, 71 insertions(+), 2 deletions(-)

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 8e62d451e0b1..71fe85498766 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -141,7 +141,7 @@ static int amdgpu_dm_initialize_drm_device(struct 
amdgpu_device *adev);
 /* removes and deallocates the drm structures, created by the above function */
 static void amdgpu_dm_destroy_drm_device(struct amdgpu_display_manager *dm);
 
-static int amdgpu_dm_atomic_setup_commit(struct drm_atomic_commit *state);
+STATIC_IFN_KUNIT int amdgpu_dm_atomic_setup_commit(struct drm_atomic_commit 
*state);
 static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_commit *state);
 STATIC_IFN_KUNIT void dm_enable_per_frame_crtc_master_sync(struct dc_state 
*context);
 
@@ -4901,7 +4901,7 @@ STATIC_IFN_KUNIT void amdgpu_dm_update_hdcp(struct 
drm_atomic_commit *state)
 }
 EXPORT_IF_KUNIT(amdgpu_dm_update_hdcp);
 
-static int amdgpu_dm_atomic_setup_commit(struct drm_atomic_commit *state)
+STATIC_IFN_KUNIT int amdgpu_dm_atomic_setup_commit(struct drm_atomic_commit 
*state)
 {
        struct drm_crtc *crtc;
        struct drm_crtc_state *old_crtc_state, *new_crtc_state;
@@ -4933,6 +4933,7 @@ static int amdgpu_dm_atomic_setup_commit(struct 
drm_atomic_commit *state)
 
        return 0;
 }
+EXPORT_IF_KUNIT(amdgpu_dm_atomic_setup_commit);
 
 STATIC_IFN_KUNIT void set_multisync_trigger_params(
                struct dc_stream_state *stream)
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 7308067b4d13..5ffaca8a6efe 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -1203,6 +1203,7 @@ bool amdgpu_dm_crtc_mem_type_changed(struct drm_device 
*dev,
                                     struct drm_crtc_state *crtc_state);
 void amdgpu_dm_dump_links_and_sinks(struct amdgpu_device *adev);
 void amdgpu_dm_update_hdcp(struct drm_atomic_commit *state);
+int amdgpu_dm_atomic_setup_commit(struct drm_atomic_commit *state);
 int do_aquire_global_lock(struct drm_device *dev,
                          struct drm_atomic_commit *state);
 void amdgpu_dm_mod_power_update_streams(struct drm_atomic_commit *state,
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 bb09ebc07435..a8140747c25d 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
@@ -2858,6 +2858,19 @@ static void dm_test_update_hdcp_no_workqueue(struct 
kunit *test)
        amdgpu_dm_update_hdcp(dm_test_alloc_commit(test, adev));
 }
 
+/**
+ * dm_test_atomic_setup_commit_empty - Test an empty commit needs no color 
setup
+ * @test: The KUnit test context
+ */
+static void dm_test_atomic_setup_commit_empty(struct kunit *test)
+{
+       struct amdgpu_device *adev = dm_kunit_alloc_adev(test);
+
+       KUNIT_EXPECT_EQ(test,
+                       
amdgpu_dm_atomic_setup_commit(dm_test_alloc_commit(test, adev)),
+                       0);
+}
+
 /*
  * A commit with one connector of @type bound to a CRTC that keeps its stream.
  * The content protection state is unchanged, so amdgpu_dm_update_hdcp() walks
@@ -3336,6 +3349,56 @@ static void 
dm_test_mod_power_setup_streams_no_modeset(struct kunit *test)
        amdgpu_dm_mod_power_setup_streams(ctx->state, &ctx->adev->dm);
 }
 
+/**
+ * dm_test_atomic_setup_commit_color_mgmt - Test color management is 
reprogrammed
+ * @test: The KUnit test context
+ */
+static void dm_test_atomic_setup_commit_color_mgmt(struct kunit *test)
+{
+       struct dm_test_modeset_ctx *ctx = dm_test_modeset_ctx_alloc(test);
+
+       ctx->new_crtc_state->base.active = true;
+       ctx->new_crtc_state->base.color_mgmt_changed = true;
+
+       KUNIT_EXPECT_EQ(test, amdgpu_dm_atomic_setup_commit(ctx->state), 0);
+}
+
+/**
+ * dm_test_atomic_setup_commit_modeset - Test a modeset alone reprograms color 
state
+ * @test: The KUnit test context
+ */
+static void dm_test_atomic_setup_commit_modeset(struct kunit *test)
+{
+       struct dm_test_modeset_ctx *ctx = dm_test_modeset_ctx_alloc(test);
+
+       ctx->new_crtc_state->base.active = true;
+
+       KUNIT_EXPECT_EQ(test, amdgpu_dm_atomic_setup_commit(ctx->state), 0);
+}
+
+/**
+ * dm_test_atomic_setup_commit_bad_lut - Test an invalid degamma LUT is 
rejected
+ * @test: The KUnit test context
+ */
+static void dm_test_atomic_setup_commit_bad_lut(struct kunit *test)
+{
+       struct dm_test_modeset_ctx *ctx = dm_test_modeset_ctx_alloc(test);
+       struct drm_property_blob *blob;
+       struct drm_color_lut *lut;
+
+       blob = kunit_kzalloc(test, sizeof(*blob), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, blob);
+       lut = kunit_kzalloc(test, sizeof(*lut), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, lut);
+
+       blob->length = sizeof(*lut);
+       blob->data = lut;
+       ctx->new_crtc_state->base.active = true;
+       ctx->new_crtc_state->base.degamma_lut = blob;
+
+       KUNIT_EXPECT_EQ(test, amdgpu_dm_atomic_setup_commit(ctx->state), 
-EINVAL);
+}
+
 static struct kunit_case amdgpu_dm_tests[] = {
        /* Simple DM callbacks */
        KUNIT_CASE(dm_test_wait_for_idle),
@@ -3482,6 +3545,10 @@ static struct kunit_case amdgpu_dm_tests[] = {
        KUNIT_CASE(dm_test_update_hdcp_no_workqueue),
        KUNIT_CASE(dm_test_update_hdcp_writeback_skipped),
        KUNIT_CASE(dm_test_update_hdcp_unchanged),
+       KUNIT_CASE(dm_test_atomic_setup_commit_empty),
+       KUNIT_CASE(dm_test_atomic_setup_commit_color_mgmt),
+       KUNIT_CASE(dm_test_atomic_setup_commit_modeset),
+       KUNIT_CASE(dm_test_atomic_setup_commit_bad_lut),
        KUNIT_CASE(dm_test_aquire_global_lock_no_crtc),
        KUNIT_CASE(dm_test_aquire_global_lock_no_commit),
        KUNIT_CASE(dm_test_aquire_global_lock_waits_commit),
-- 
2.43.0

Reply via email to