From: Bhawanpreet Lakha <[email protected]> Add KUnit tests for amdgpu_dm_connector_atomic_check() covering the no-CRTC early return, the DP-MST connector path, and an unchanged state that skips revalidation.
Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <[email protected]> Signed-off-by: Bhawanpreet Lakha <[email protected]> Signed-off-by: Ivan Lipski <[email protected]> --- .../display/amdgpu_dm/amdgpu_dm_connector.c | 3 +- .../display/amdgpu_dm/amdgpu_dm_connector.h | 3 + .../tests/amdgpu_dm_connector_test.c | 109 ++++++++++++++++++ 3 files changed, 114 insertions(+), 1 deletion(-) 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 ed16e01987726..44c223b178c50 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 @@ -2526,7 +2526,7 @@ int amdgpu_dm_fill_hdr_info_packet(const struct drm_connector_state *state, } EXPORT_IF_KUNIT(amdgpu_dm_fill_hdr_info_packet); -static int +STATIC_IFN_KUNIT int amdgpu_dm_connector_atomic_check(struct drm_connector *conn, struct drm_atomic_commit *state) { @@ -2607,6 +2607,7 @@ amdgpu_dm_connector_atomic_check(struct drm_connector *conn, return 0; } +EXPORT_IF_KUNIT(amdgpu_dm_connector_atomic_check); static const struct drm_connector_helper_funcs amdgpu_dm_connector_helper_funcs = { diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h index 4e9eb3ff2c904..3571378654fd7 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h @@ -222,5 +222,8 @@ void decide_crtc_timing_for_drm_display_mode(struct drm_display_mode *drm_mode, bool scale_enabled); void amdgpu_dm_set_panel_type(struct amdgpu_dm_connector *aconnector); void amdgpu_dm_update_cacp_caps(struct amdgpu_dm_connector *aconnector); +struct drm_atomic_commit; +int amdgpu_dm_connector_atomic_check(struct drm_connector *conn, + struct drm_atomic_commit *state); #endif #endif /* __AMDGPU_DM_CONNECTOR_H__ */ 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 5c701c6b0511d..47c6caba46889 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 @@ -6463,6 +6463,111 @@ static void dm_test_mode_valid_edid_mgmt_forced(struct kunit *test) MODE_ERROR); } +/* Tests for amdgpu_dm_connector_atomic_check() */ + +/* + * Build a single-connector atomic commit for amdgpu_dm_connector_atomic_check(). + * The connector lives at index 0 so the hand-rolled connectors[] slot resolves + * both the old and new connector state; leaving crtc NULL keeps the check off + * the crtc-state machinery that a real atomic path would require. + */ +struct dm_test_conn_ac_ctx { + struct amdgpu_dm_connector *aconn; + struct drm_atomic_commit *state; + struct drm_connector_state *old_state; + struct drm_connector_state *new_state; +}; + +static struct dm_test_conn_ac_ctx * +dm_test_conn_ac_ctx_alloc(struct kunit *test, int connector_type) +{ + struct dm_test_conn_ac_ctx *ctx; + + ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, ctx); + + ctx->aconn = kunit_kzalloc(test, sizeof(*ctx->aconn), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, ctx->aconn); + ctx->old_state = kunit_kzalloc(test, sizeof(*ctx->old_state), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, ctx->old_state); + ctx->new_state = kunit_kzalloc(test, sizeof(*ctx->new_state), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, ctx->new_state); + + ctx->state = dm_test_alloc_atomic_state(test, 1); + + ctx->aconn->base.connector_type = connector_type; + ctx->new_state->connector = &ctx->aconn->base; + ctx->new_state->state = ctx->state; + ctx->old_state->connector = &ctx->aconn->base; + + ctx->state->connectors[0].ptr = &ctx->aconn->base; + ctx->state->connectors[0].old_state = ctx->old_state; + ctx->state->connectors[0].new_state = ctx->new_state; + + return ctx; +} + +/** + * dm_test_conn_atomic_check_no_crtc - Test the unbound-connector short-circuit + * @test: The KUnit test context + * + * A non-DisplayPort connector with no crtc has nothing to validate and returns + * 0 immediately. + */ +static void dm_test_conn_atomic_check_no_crtc(struct kunit *test) +{ + struct dm_test_conn_ac_ctx *ctx = + dm_test_conn_ac_ctx_alloc(test, DRM_MODE_CONNECTOR_HDMIA); + int ret; + + ret = amdgpu_dm_connector_atomic_check(&ctx->aconn->base, ctx->state); + + KUNIT_EXPECT_EQ(test, ret, 0); +} + +/** + * dm_test_conn_atomic_check_dp_mst - Test the DisplayPort MST root check + * @test: The KUnit test context + * + * A DisplayPort connector runs the MST root atomic check; with no crtc bound on + * either state it finds nothing to reserve and returns 0. + */ +static void dm_test_conn_atomic_check_dp_mst(struct kunit *test) +{ + struct dm_test_conn_ac_ctx *ctx = + dm_test_conn_ac_ctx_alloc(test, DRM_MODE_CONNECTOR_DisplayPort); + int ret; + + ret = amdgpu_dm_connector_atomic_check(&ctx->aconn->base, ctx->state); + + KUNIT_EXPECT_EQ(test, ret, 0); +} + +/** + * dm_test_conn_atomic_check_no_change - Test the bound-but-unchanged path + * @test: The KUnit test context + * + * With a crtc bound but no privacy/colorspace/content-type/HDR differences the + * check skips every modeset trigger and returns 0 without touching the crtc + * state. + */ +static void dm_test_conn_atomic_check_no_change(struct kunit *test) +{ + struct dm_test_conn_ac_ctx *ctx = + dm_test_conn_ac_ctx_alloc(test, DRM_MODE_CONNECTOR_HDMIA); + struct drm_crtc *crtc; + int ret; + + crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, crtc); + + ctx->new_state->crtc = crtc; + + ret = amdgpu_dm_connector_atomic_check(&ctx->aconn->base, ctx->state); + + KUNIT_EXPECT_EQ(test, ret, 0); +} + /** * dm_test_update_after_detect_mst_noop - Test MST connectors are left to drm_mst * @test: The KUnit test context @@ -7140,6 +7245,10 @@ static struct kunit_case amdgpu_dm_connector_tests[] = { KUNIT_CASE(dm_test_fill_hdr_dp), KUNIT_CASE(dm_test_fill_hdr_unsupported_connector), KUNIT_CASE(dm_test_fill_hdr_bad_metadata), + /* amdgpu_dm_connector_atomic_check */ + KUNIT_CASE(dm_test_conn_atomic_check_no_crtc), + KUNIT_CASE(dm_test_conn_atomic_check_dp_mst), + KUNIT_CASE(dm_test_conn_atomic_check_no_change), /* amdgpu_dm_connector_atomic_set_property */ KUNIT_CASE(dm_test_set_property_scaling_center), KUNIT_CASE(dm_test_set_property_scaling_aspect), -- 2.43.0
