drm/amd/display: Add stream validation tests for connector

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 <alex.hung@amd.com>
Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Bhawanpreet Lakha
2026-06-25 11:25:53 -04:00
committed by Alex Deucher
parent ec3938e1a9
commit 5af478e1dd
2 changed files with 70 additions and 0 deletions

View File

@@ -659,6 +659,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,
@@ -2276,6 +2277,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)

View File

@@ -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),
{}
};