From: Bhawanpreet Lakha <[email protected]> Add a KUnit test that initializes a TMDS encoder on a DRM device embedded in an amdgpu_device and verifies the derived possible_crtcs mask, the encoder id set from the link index, and the attached helper funcs.
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 | 2 + .../tests/amdgpu_dm_connector_test.c | 38 +++++++++++++++++++ 2 files changed, 40 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 2cc3734c992bd..ed16e01987726 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 @@ -171,6 +171,7 @@ const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs = { .disable = dm_encoder_helper_disable, .atomic_check = dm_encoder_helper_atomic_check }; +EXPORT_IF_KUNIT(amdgpu_dm_encoder_helper_funcs); int amdgpu_dm_get_encoder_crtc_mask(struct amdgpu_device *adev) { @@ -215,6 +216,7 @@ int amdgpu_dm_encoder_init(struct drm_device *dev, return res; } +EXPORT_IF_KUNIT(amdgpu_dm_encoder_init); STATIC_IFN_KUNIT enum drm_mode_subconnector get_subconnector_type(struct dc_link *link) { 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 d209e26b684eb..b51aba8c07c3c 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 @@ -4289,6 +4289,43 @@ static void dm_test_encoder_disable_noop(struct kunit *test) * connector and connector-state are stacked in their containers and wired * together through conn_state->connector. */ +/* Tests for amdgpu_dm_encoder_init() */ + +/** + * dm_test_encoder_init_success - Test encoder init wires id, crtc mask and helpers + * @test: The KUnit test context + * + * On a DRM device embedded in an amdgpu_device, amdgpu_dm_encoder_init() + * registers a TMDS encoder, derives possible_crtcs from mode_info.num_crtc, + * records the link index as the encoder id and attaches the helper funcs. + */ +static void dm_test_encoder_init_success(struct kunit *test) +{ + struct device *dev; + struct drm_device *drm; + struct amdgpu_device *adev; + struct amdgpu_encoder *aencoder; + + dev = drm_kunit_helper_alloc_device(test); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev); + drm = __drm_kunit_helper_alloc_drm_device(test, dev, sizeof(*adev), + offsetof(struct amdgpu_device, ddev), + DRIVER_MODESET); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm); + adev = drm_to_adev(drm); + adev->mode_info.num_crtc = 4; + + /* Plain kzalloc: amdgpu_dm_encoder_destroy() kfree()s it on teardown. */ + aencoder = kzalloc_obj(*aencoder); + KUNIT_ASSERT_NOT_NULL(test, aencoder); + + KUNIT_EXPECT_EQ(test, amdgpu_dm_encoder_init(drm, aencoder, 2), 0); + KUNIT_EXPECT_EQ(test, aencoder->encoder_id, 2); + KUNIT_EXPECT_EQ(test, (int)aencoder->base.possible_crtcs, 0xf); + KUNIT_EXPECT_PTR_EQ(test, (const void *)aencoder->base.helper_private, + (const void *)&amdgpu_dm_encoder_helper_funcs); +} + struct dm_test_atomic_check_ctx { struct drm_device *drm; struct amdgpu_encoder *aenc; @@ -5863,6 +5900,7 @@ static struct kunit_case amdgpu_dm_connector_tests[] = { KUNIT_CASE(dm_test_atomic_check_mst_duplicated_skips_pbn), KUNIT_CASE(dm_test_atomic_check_mst_topology_err_propagates), KUNIT_CASE(dm_test_atomic_check_mst_vcpi_error_propagates), + KUNIT_CASE(dm_test_encoder_init_success), /* hdmi_cec_unset_edid */ KUNIT_CASE(dm_test_hdmi_cec_unset_edid_no_notifier), /* create_eml_sink */ -- 2.43.0
