summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Hung <alex.hung@amd.com>2026-08-14 12:54:12 -0600
committerAlex Deucher <alexander.deucher@amd.com>2026-09-10 12:01:06 -0400
commitafa47a06f256d2cd61b9abdc64639a9c956fd858 (patch)
tree59be831d7b9ba13173d7f5239c4846979d71cecd
parentf487177db6202bcbcf040b52b117bc7db913bda4 (diff)
downloadlinux-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.c6
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h2
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c33
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 */