diff options
| author | Alex Hung <alex.hung@amd.com> | 2026-08-14 12:54:12 -0600 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2026-09-10 12:01:06 -0400 |
| commit | afa47a06f256d2cd61b9abdc64639a9c956fd858 (patch) | |
| tree | 59be831d7b9ba13173d7f5239c4846979d71cecd | |
| parent | f487177db6202bcbcf040b52b117bc7db913bda4 (diff) | |
| download | linux-next-afa47a06f256d2cd61b9abdc64639a9c956fd858.tar.gz linux-next-afa47a06f256d2cd61b9abdc64639a9c956fd858.zip | |
drm/amd/display: Test MST resume guards
[Why]
Add KUnit tests for resume_mst_branch_status() without a primary
branch and s3_handle_mst() with an empty connector list.
[How]
Use the real topology mutex and DRM connector iterator. The tests
stop before AUX or topology-manager hardware operations are required.
Assisted-by: Copilot:Claude-Opus-5 GPT-5.6 Sol
Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Ray Wu <ray.wu@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c | 33 |
3 files changed, 39 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 86fd00984a9f..55a0ff6e6b9a 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -1252,7 +1252,7 @@ STATIC_IFN_KUNIT int dm_late_init(struct amdgpu_ip_block *ip_block) } EXPORT_IF_KUNIT(dm_late_init); -static void resume_mst_branch_status(struct drm_dp_mst_topology_mgr *mgr) +STATIC_IFN_KUNIT void resume_mst_branch_status(struct drm_dp_mst_topology_mgr *mgr) { u8 buf[UUID_SIZE]; guid_t guid; @@ -1302,8 +1302,9 @@ static void resume_mst_branch_status(struct drm_dp_mst_topology_mgr *mgr) out_fail: mutex_unlock(&mgr->lock); } +EXPORT_IF_KUNIT(resume_mst_branch_status); -static void s3_handle_mst(struct drm_device *dev, bool suspend) +STATIC_IFN_KUNIT void s3_handle_mst(struct drm_device *dev, bool suspend) { struct amdgpu_dm_connector *aconnector; struct drm_connector *connector; @@ -1344,6 +1345,7 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend) } drm_connector_list_iter_end(&iter); } +EXPORT_IF_KUNIT(s3_handle_mst); STATIC_IFN_KUNIT int dm_oem_i2c_hw_init(struct amdgpu_device *adev) { 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 df2e4d60e85a..739171d5365c 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -1215,6 +1215,8 @@ void amdgpu_dm_mod_power_setup_streams(struct drm_atomic_commit *state, int amdgpu_dm_early_fini(struct amdgpu_ip_block *ip_block); int dm_sw_fini(struct amdgpu_ip_block *ip_block); int dm_oem_i2c_hw_init(struct amdgpu_device *adev); +void resume_mst_branch_status(struct drm_dp_mst_topology_mgr *mgr); +void s3_handle_mst(struct drm_device *dev, bool suspend); void dm_gpureset_commit_state(struct dc_state *dc_state, struct amdgpu_display_manager *dm); int dm_plane_layer_index_cmp(const void *a, const void *b); bool update_planes_and_stream_adapter(struct dc *dc, 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 ed53bfa5a8c3..833f73972ab2 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 @@ -3297,6 +3297,37 @@ static void dm_test_oem_i2c_hw_init_no_device(struct kunit *test) } /** + * dm_test_resume_mst_no_primary - Test a missing primary branch releases the topology lock + * @test: The KUnit test context + */ +static void dm_test_resume_mst_no_primary(struct kunit *test) +{ + struct drm_dp_mst_topology_mgr *mgr; + + mgr = kunit_kzalloc(test, sizeof(*mgr), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, mgr); + mutex_init(&mgr->lock); + + resume_mst_branch_status(mgr); + + KUNIT_ASSERT_TRUE(test, mutex_trylock(&mgr->lock)); + mutex_unlock(&mgr->lock); +} + +/** + * dm_test_s3_handle_mst_empty - Test empty connector lists need no MST action + * @test: The KUnit test context + */ +static void dm_test_s3_handle_mst_empty(struct kunit *test) +{ + struct amdgpu_device *adev = dm_kunit_alloc_adev(test); + + s3_handle_mst(&adev->ddev, true); + + KUNIT_EXPECT_TRUE(test, list_empty(&adev->ddev.mode_config.connector_list)); +} + +/** * dm_test_gpureset_commit_state_no_streams - Test an empty DC state programs nothing * @test: The KUnit test context */ @@ -5127,6 +5158,8 @@ static struct kunit_case amdgpu_dm_tests[] = { KUNIT_CASE(dm_test_early_fini_audio_disabled), KUNIT_CASE(dm_test_sw_fini_releases_state), KUNIT_CASE(dm_test_oem_i2c_hw_init_no_device), + KUNIT_CASE(dm_test_resume_mst_no_primary), + KUNIT_CASE(dm_test_s3_handle_mst_empty), KUNIT_CASE(dm_test_gpureset_commit_state_no_streams), KUNIT_CASE(dm_test_emulated_link_detect_bad_signal), /* mmhub_read_system_context */ |
