From: Bhawanpreet Lakha <[email protected]>

Add KUnit coverage for amdgpu_dm_create_validate_stream_for_sink()
and amdgpu_dm_connector_funcs_update_after_detect(): null dm_state,
MST no-op, and unchanged sink handling.

Assisted-by: Copilot:Claude-Opus-4.8
Reviewed-by: Alex Hung <[email protected]>
Signed-off-by: Bhawanpreet Lakha <[email protected]>
Signed-off-by: Wayne Lin <[email protected]>
---
 .../display/amdgpu_dm/amdgpu_dm_connector.c   |  2 +
 .../tests/amdgpu_dm_connector_test.c          | 68 +++++++++++++++++++
 2 files changed, 70 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
index 3fa2392549eb..da6ec75bb0f9 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
@@ -650,6 +650,7 @@ void amdgpu_dm_update_connector_after_detect(
        if (!drm_kms_helper_is_poll_worker())
                mutex_unlock(&dev->mode_config.mutex);
 }
+EXPORT_IF_KUNIT(amdgpu_dm_update_connector_after_detect);
 
 enum dc_color_depth
 amdgpu_dm_convert_color_depth_from_display_info(const struct drm_connector 
*connector,
@@ -2203,6 +2204,7 @@ amdgpu_dm_create_validate_stream_for_sink(struct 
drm_connector *connector,
 
        return stream;
 }
+EXPORT_IF_KUNIT(amdgpu_dm_create_validate_stream_for_sink);
 
 enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector 
*connector,
                                   const struct drm_display_mode *mode)
diff --git 
a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
index cfb114d5b879..b58bb2d3309c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
@@ -4997,6 +4997,69 @@ static void dm_test_s3_handle_hdmi_cec_resume(struct 
kunit *test)
        amdgpu_dm_s3_handle_hdmi_cec(drm, false);
 }
 
+/**
+ * dm_test_create_validate_stream_null_dm_state - Test NULL state returns NULL
+ * @test: The KUnit test context
+ *
+ * Without a connector state there is nothing to validate against, so the
+ * helper bails out with NULL before touching the dc handle.
+ */
+static void dm_test_create_validate_stream_null_dm_state(struct kunit *test)
+{
+       struct amdgpu_dm_connector *aconnector;
+
+       aconnector = kunit_kzalloc(test, sizeof(*aconnector), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, aconnector);
+
+       KUNIT_EXPECT_NULL(test,
+                         
amdgpu_dm_create_validate_stream_for_sink(&aconnector->base,
+                                                                   NULL, NULL, 
NULL));
+}
+
+/**
+ * dm_test_update_after_detect_mst_noop - Test MST connectors are left to 
drm_mst
+ * @test: The KUnit test context
+ *
+ * An MST connector is handled by the drm_mst framework, so the function
+ * returns immediately and never dereferences the (NULL) dc_link.
+ */
+static void dm_test_update_after_detect_mst_noop(struct kunit *test)
+{
+       struct amdgpu_dm_connector *aconnector;
+
+       aconnector = kunit_kzalloc(test, sizeof(*aconnector), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, aconnector);
+
+       aconnector->mst_mgr.mst_state = true;
+
+       amdgpu_dm_update_connector_after_detect(aconnector);
+}
+
+/**
+ * dm_test_update_after_detect_sink_unchanged - Test the short-pulse no-op path
+ * @test: The KUnit test context
+ *
+ * When the link reports no local sink and the connector already has no
+ * dc_sink, the "sink didn't change" path returns without touching DC.
+ */
+static void dm_test_update_after_detect_sink_unchanged(struct kunit *test)
+{
+       struct drm_device *drm = dm_test_alloc_drm(test);
+       struct amdgpu_dm_connector *aconnector;
+       struct dc_link *link;
+
+       aconnector = dm_test_add_connector(test, drm, DRM_MODE_CONNECTOR_HDMIA);
+       link = kunit_kzalloc(test, sizeof(*link), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, link);
+
+       aconnector->dc_link = link;
+
+       /* link->local_sink and aconnector->dc_sink are both NULL. */
+       amdgpu_dm_update_connector_after_detect(aconnector);
+
+       KUNIT_EXPECT_NULL(test, aconnector->dc_sink);
+}
+
 static struct kunit_case amdgpu_dm_connector_tests[] = {
        /* get_subconnector_type */
        KUNIT_CASE(dm_test_subconnector_type_none),
@@ -5271,6 +5334,11 @@ static struct kunit_case amdgpu_dm_connector_tests[] = {
        /* amdgpu_dm_s3_handle_hdmi_cec */
        KUNIT_CASE(dm_test_s3_handle_hdmi_cec_suspend),
        KUNIT_CASE(dm_test_s3_handle_hdmi_cec_resume),
+       /* amdgpu_dm_create_validate_stream_for_sink */
+       KUNIT_CASE(dm_test_create_validate_stream_null_dm_state),
+       /* amdgpu_dm_update_connector_after_detect */
+       KUNIT_CASE(dm_test_update_after_detect_mst_noop),
+       KUNIT_CASE(dm_test_update_after_detect_sink_unchanged),
        {}
 };
 
-- 
2.43.0

Reply via email to