[PATCH 31/59] drm/amd/display: Test affected MST DSC CRTC selection
Alex Hung <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
[WHAT] Add KUnit tests for add_affected_mst_dsc_crtcs() covering an empty commit, a writeback connector, a connector that is not behind an MST branch, a connector bound to a different CRTC, and a disabled connector whose old state decides which CRTC is affected. 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 | 2 + .../display/amdgpu_dm/tests/amdgpu_dm_test.c | 142 ++++++++++++++++++ 3 files changed, 147 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 5c4aac207e8f..9d233b18f2df 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -6007,7 +6007,8 @@ struct __drm_planes_state *amdgpu_dm_get_next_zpos( return &state->planes[highest_i]; } -static int add_affected_mst_dsc_crtcs(struct drm_atomic_commit *state, struct drm_crtc *crtc) +STATIC_IFN_KUNIT int add_affected_mst_dsc_crtcs(struct drm_atomic_commit *state, + struct drm_crtc *crtc) { struct drm_connector *connector; struct drm_connector_state *conn_state, *old_conn_state; @@ -6036,6 +6037,7 @@ static int add_affected_mst_dsc_crtcs(struct drm_atomic_commit *state, struct dr return drm_dp_mst_add_affected_dsc_crtcs(state, &aconnector->mst_root->mst_mgr); } +EXPORT_IF_KUNIT(add_affected_mst_dsc_crtcs); static bool amdgpu_dm_crtc_mem_type_changed(struct drm_device *dev, struct drm_atomic_commit *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 6e078be5bc5e..a48154ea62ae 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -1171,6 +1171,8 @@ 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 add_affected_mst_dsc_crtcs(struct drm_atomic_commit *state, + struct drm_crtc *crtc); int dm_plane_layer_index_cmp(const void *a, const void *b); int fill_plane_color_attributes(const struct drm_plane_state *plane_state, const enum surface_pixel_format format, 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 66c35a22c45e..2afa73a07ebd 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 @@ -1282,6 +1282,142 @@ static void dm_test_atomic_duplicate_state_no_context(struct kunit *test) KUNIT_EXPECT_NULL(test, dm_atomic_duplicate_state(obj)); } +/* Tests for add_affected_mst_dsc_crtcs() */ + +/** + * dm_test_add_affected_mst_dsc_crtcs_no_connector - Test an empty state adds nothing + * @test: The KUnit test context + */ +static void dm_test_add_affected_mst_dsc_crtcs_no_connector(struct kunit *test) +{ + struct amdgpu_device *adev = dm_kunit_alloc_adev(test); + struct drm_atomic_commit *state = dm_test_alloc_commit(test, adev); + struct drm_crtc *crtc; + + crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, crtc); + + KUNIT_EXPECT_EQ(test, add_affected_mst_dsc_crtcs(state, crtc), 0); +} + +/* + * Build an atomic state holding a single connector bound to @crtc. + */ +static struct drm_atomic_commit * +dm_test_state_with_connector(struct kunit *test, struct drm_connector *connector, + struct drm_crtc *crtc) +{ + struct drm_connector_state *conn_state; + struct drm_atomic_commit *state; + + state = kunit_kzalloc(test, sizeof(*state), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, state); + conn_state = kunit_kzalloc(test, sizeof(*conn_state), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, conn_state); + + state->connectors = kunit_kzalloc(test, sizeof(*state->connectors), + GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, state->connectors); + + conn_state->crtc = crtc; + state->num_connector = 1; + state->connectors[0].ptr = connector; + state->connectors[0].old_state = conn_state; + state->connectors[0].new_state = conn_state; + + return state; +} + +/** + * dm_test_add_affected_mst_dsc_crtcs_writeback - Test writeback connectors are ignored + * @test: The KUnit test context + */ +static void dm_test_add_affected_mst_dsc_crtcs_writeback(struct kunit *test) +{ + struct amdgpu_dm_connector *aconnector; + struct drm_atomic_commit *state; + struct drm_crtc *crtc; + + aconnector = kunit_kzalloc(test, sizeof(*aconnector), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, aconnector); + crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, crtc); + + aconnector->base.connector_type = DRM_MODE_CONNECTOR_WRITEBACK; + state = dm_test_state_with_connector(test, &aconnector->base, crtc); + + KUNIT_EXPECT_EQ(test, add_affected_mst_dsc_crtcs(state, crtc), 0); +} + +/** + * dm_test_add_affected_mst_dsc_crtcs_not_mst - Test a non-MST connector adds nothing + * @test: The KUnit test context + */ +static void dm_test_add_affected_mst_dsc_crtcs_not_mst(struct kunit *test) +{ + struct amdgpu_dm_connector *aconnector; + struct drm_atomic_commit *state; + struct drm_crtc *crtc; + + aconnector = kunit_kzalloc(test, sizeof(*aconnector), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, aconnector); + crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, crtc); + + aconnector->base.connector_type = DRM_MODE_CONNECTOR_DisplayPort; + state = dm_test_state_with_connector(test, &aconnector->base, crtc); + + KUNIT_EXPECT_EQ(test, add_affected_mst_dsc_crtcs(state, crtc), 0); +} + +/** + * dm_test_add_affected_mst_dsc_crtcs_other_crtc - Test connectors on other CRTCs are skipped + * @test: The KUnit test context + */ +static void dm_test_add_affected_mst_dsc_crtcs_other_crtc(struct kunit *test) +{ + struct amdgpu_dm_connector *aconnector; + struct drm_atomic_commit *state; + struct drm_crtc *crtc, *other_crtc; + + aconnector = kunit_kzalloc(test, sizeof(*aconnector), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, aconnector); + crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, crtc); + other_crtc = kunit_kzalloc(test, sizeof(*other_crtc), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, other_crtc); + + aconnector->base.connector_type = DRM_MODE_CONNECTOR_DisplayPort; + state = dm_test_state_with_connector(test, &aconnector->base, other_crtc); + + KUNIT_EXPECT_EQ(test, add_affected_mst_dsc_crtcs(state, crtc), 0); +} + +/** + * dm_test_add_affected_mst_dsc_crtcs_disabled - Test a disabled connector uses its old state + * @test: The KUnit test context + */ +static void dm_test_add_affected_mst_dsc_crtcs_disabled(struct kunit *test) +{ + struct amdgpu_dm_connector *aconnector; + struct drm_connector_state *new_conn_state; + struct drm_atomic_commit *state; + struct drm_crtc *crtc; + + aconnector = kunit_kzalloc(test, sizeof(*aconnector), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, aconnector); + crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, crtc); + new_conn_state = kunit_kzalloc(test, sizeof(*new_conn_state), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, new_conn_state); + + aconnector->base.connector_type = DRM_MODE_CONNECTOR_DisplayPort; + state = dm_test_state_with_connector(test, &aconnector->base, crtc); + state->connectors[0].new_state = new_conn_state; + + KUNIT_EXPECT_EQ(test, add_affected_mst_dsc_crtcs(state, crtc), 0); +} + static struct kunit_case amdgpu_dm_tests[] = { /* Simple DM callbacks */ KUNIT_CASE(dm_test_wait_for_idle), @@ -1355,6 +1491,12 @@ static struct kunit_case amdgpu_dm_tests[] = { /* 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), + /* add_affected_mst_dsc_crtcs */ + KUNIT_CASE(dm_test_add_affected_mst_dsc_crtcs_no_connector), + KUNIT_CASE(dm_test_add_affected_mst_dsc_crtcs_writeback), + KUNIT_CASE(dm_test_add_affected_mst_dsc_crtcs_not_mst), + KUNIT_CASE(dm_test_add_affected_mst_dsc_crtcs_other_crtc), + KUNIT_CASE(dm_test_add_affected_mst_dsc_crtcs_disabled), {} }; -- 2.43.0