[PATCH 44/59] drm/amd/display: Test atomic commit setup
Alex Hung <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
[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