drm/amd/display: Add KUnit test for native backlight registration

[WHAT]
Add a KUnit case covering the successful path of
amdgpu_dm_register_backlight_device(). The test uses the standard DRM
KUnit device helpers to register a native backlight device, verifies the
calculated backlight properties and cached brightness, and unregisters
the device through KUnit cleanup to avoid leaking a class device across
cases.

Assisted-by: Copilot:GPT-5.6-Terra
Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Fangzhi Zuo <jerry.zuo@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Alex Hung 2026-07-13 17:09:17 -06:00 committed by Alex Deucher
parent b208e33f60
commit 36e7f55ec8

View File

@ -326,6 +326,11 @@ static int dm_test_get_backlight_level_error(const struct dc_link *link)
return DC_ERROR_UNEXPECTED;
}
static void dm_test_unregister_backlight_device(void *data)
{
backlight_device_unregister(data);
}
static bool dm_test_get_backlight_level_nits(struct dc_link *link,
uint32_t *avg,
uint32_t *peak)
@ -463,6 +468,52 @@ static void dm_test_register_backlight_device_negative_index(struct kunit *test)
KUNIT_EXPECT_NULL(test, adev->dm.backlight_dev[0]);
}
/**
* dm_test_register_backlight_device_success - Test native backlight registration
* @test: The KUnit test context
*
* A native backlight device must be registered with the calculated
* properties, and its initial readback must retain the initial brightness.
*/
static void dm_test_register_backlight_device_success(struct kunit *test)
{
struct amdgpu_device *adev = dm_kunit_alloc_adev(test);
struct amdgpu_dm_connector *aconnector;
struct amdgpu_dm_backlight_caps *caps;
struct dc_link *link = dm_kunit_alloc_link(test);
struct drm_minor *primary;
unsigned int max;
setup_test_link_service(test, link);
link->dc->link_srv->edp_get_backlight_level = dm_test_get_backlight_level_error;
primary = kunit_kzalloc(test, sizeof(*primary), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, primary);
adev->ddev.primary = primary;
adev->dm.backlight_link[0] = link;
aconnector = dm_kunit_alloc_connector(test, adev, link);
aconnector->bl_idx = 0;
aconnector->base.kdev = adev->ddev.dev;
caps = &adev->dm.backlight_caps[0];
caps->min_input_signal = AMDGPU_DM_DEFAULT_MIN_BACKLIGHT;
caps->max_input_signal = AMDGPU_DM_DEFAULT_MAX_BACKLIGHT;
caps->ac_level = 50;
caps->dc_level = 25;
max = 0x101 * AMDGPU_DM_DEFAULT_MAX_BACKLIGHT;
amdgpu_dm_register_backlight_device(aconnector);
KUNIT_ASSERT_NOT_NULL(test, adev->dm.backlight_dev[0]);
KUNIT_EXPECT_EQ(test, adev->dm.backlight_dev[0]->props.max_brightness, max);
KUNIT_EXPECT_EQ(test, adev->dm.backlight_dev[0]->props.brightness,
DIV_ROUND_CLOSEST(max * caps->ac_level, 100));
KUNIT_EXPECT_EQ(test, adev->dm.brightness[0],
adev->dm.backlight_dev[0]->props.brightness);
KUNIT_ASSERT_EQ(test, kunit_add_action_or_reset(test,
dm_test_unregister_backlight_device,
adev->dm.backlight_dev[0]), 0);
}
static struct drm_connector *setup_panel_power_savings_connector(struct kunit *test,
struct device **device_out,
struct dm_connector_state **state_out)
@ -1861,6 +1912,7 @@ static struct kunit_case dm_backlight_test_cases[] = {
KUNIT_CASE(dm_test_backlight_get_brightness_uses_device_index),
/* amdgpu_dm_register_backlight_device */
KUNIT_CASE(dm_test_register_backlight_device_negative_index),
KUNIT_CASE(dm_test_register_backlight_device_success),
/* panel_power_savings_show / store */
KUNIT_CASE(dm_test_panel_power_savings_show_maps_disable_to_zero),
KUNIT_CASE(dm_test_panel_power_savings_show_reports_level),