From: Alex Hung <[email protected]> [WHAT] Add KUnit coverage for the backlight level read path.
A faked link_service vtable returns canned PWM and AUX brightness values, letting the tests verify both the successful readback and the DC_ERROR/AUX-failure fallbacks to the cached brightness, plus the get_brightness() device-index wrapper. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Bhawanpreet Lakha <[email protected]> Signed-off-by: Alex Hung <[email protected]> Signed-off-by: George Zhang <[email protected]> --- .../display/amdgpu_dm/amdgpu_dm_backlight.c | 9 +- .../display/amdgpu_dm/amdgpu_dm_backlight.h | 2 + .../tests/amdgpu_dm_backlight_test.c | 156 ++++++++++++++++++ 3 files changed, 164 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c index d35b90912bd2..452e772ef136 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c @@ -362,8 +362,8 @@ int amdgpu_dm_backlight_update_status(struct backlight_device *bd) } EXPORT_IF_KUNIT(amdgpu_dm_backlight_update_status); -static u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm, - int bl_idx) +STATIC_IFN_KUNIT +u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm, int bl_idx) { int ret; struct amdgpu_dm_backlight_caps caps; @@ -387,14 +387,17 @@ static u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm, return convert_brightness_to_user(&caps, ret); } +EXPORT_IF_KUNIT(amdgpu_dm_backlight_get_level); -static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd) +STATIC_IFN_KUNIT +int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd) { struct amdgpu_display_manager *dm = bl_get_data(bd); int i = amdgpu_dm_backlight_get_device_index(dm, bd); return amdgpu_dm_backlight_get_level(dm, i); } +EXPORT_IF_KUNIT(amdgpu_dm_backlight_get_brightness); static const struct backlight_ops amdgpu_dm_backlight_ops = { .options = BL_CORE_SUSPENDRESUME, diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.h index 5fbaf67369f1..7b417c79980f 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.h @@ -54,6 +54,8 @@ extern const struct attribute_group amdgpu_group; struct dc_stream_state *dm_find_stream_with_link(struct amdgpu_display_manager *dm, struct dc_link *link); int amdgpu_dm_backlight_update_status(struct backlight_device *bd); +u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm, int bl_idx); +int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd); int get_brightness_range(const struct amdgpu_dm_backlight_caps *caps, unsigned int *min, unsigned int *max); void convert_custom_brightness(const struct amdgpu_dm_backlight_caps *caps, diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c index 732ac8db742d..10965306e29d 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c @@ -16,6 +16,7 @@ #include "amdgpu_dm_backlight.h" #include "amdgpu_dm_kunit_test_helpers.h" #include "amd_shared.h" +#include "link_service.h" #include "dc/inc/hw/panel_cntl.h" struct dm_backlight_connector_fixture { @@ -290,6 +291,155 @@ static void dm_test_backlight_update_status_no_stream(struct kunit *test) KUNIT_EXPECT_EQ(test, dm->brightness[1], 3456U); } +static void setup_test_link_service(struct kunit *test, struct dc_link *link) +{ + struct link_service *link_srv; + struct dc_context *ctx; + struct dc *dc; + + dc = kunit_kzalloc(test, sizeof(*dc), GFP_KERNEL); + ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); + link_srv = kunit_kzalloc(test, sizeof(*link_srv), GFP_KERNEL); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dc); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, link_srv); + + dc->ctx = ctx; + dc->link_srv = link_srv; + ctx->dc = dc; + link->dc = dc; + link->ctx = ctx; +} + +static int dm_test_get_backlight_level_mid(const struct dc_link *link) +{ + return (0x101 * AMDGPU_DM_DEFAULT_MIN_BACKLIGHT) + 1000; +} + +static int dm_test_get_backlight_level_error(const struct dc_link *link) +{ + return DC_ERROR_UNEXPECTED; +} + +static bool dm_test_get_backlight_level_nits(struct dc_link *link, + uint32_t *avg, + uint32_t *peak) +{ + *avg = 250000; + *peak = 300000; + + return true; +} + +static bool dm_test_get_backlight_level_nits_fail(struct dc_link *link, + uint32_t *avg, + uint32_t *peak) +{ + return false; +} + +/* Tests for amdgpu_dm_backlight_get_level()/get_brightness() */ + +/** + * dm_test_backlight_get_level_pwm_success - Test PWM brightness readback + * @test: The KUnit test context + */ +static void dm_test_backlight_get_level_pwm_success(struct kunit *test) +{ + struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test); + struct dc_link *link = dm_kunit_alloc_link(test); + u32 hw_level = dm_test_get_backlight_level_mid(link); + + setup_test_link_service(test, link); + link->dc->link_srv->edp_get_backlight_level = dm_test_get_backlight_level_mid; + dm->backlight_link[0] = link; + + KUNIT_EXPECT_EQ(test, amdgpu_dm_backlight_get_level(dm, 0), + convert_brightness_to_user(&dm->backlight_caps[0], hw_level)); +} + +/** + * dm_test_backlight_get_level_pwm_error - Test PWM readback fallback + * @test: The KUnit test context + */ +static void dm_test_backlight_get_level_pwm_error(struct kunit *test) +{ + struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test); + struct dc_link *link = dm_kunit_alloc_link(test); + + setup_test_link_service(test, link); + link->dc->link_srv->edp_get_backlight_level = dm_test_get_backlight_level_error; + dm->brightness[0] = 4321; + dm->backlight_link[0] = link; + + KUNIT_EXPECT_EQ(test, amdgpu_dm_backlight_get_level(dm, 0), 4321U); +} + +/** + * dm_test_backlight_get_level_aux_success - Test AUX brightness readback + * @test: The KUnit test context + */ +static void dm_test_backlight_get_level_aux_success(struct kunit *test) +{ + struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test); + struct dc_link *link = dm_kunit_alloc_link(test); + struct amdgpu_dm_backlight_caps *caps = &dm->backlight_caps[0]; + + setup_test_link_service(test, link); + link->dc->link_srv->edp_get_backlight_level_nits = dm_test_get_backlight_level_nits; + dm->backlight_link[0] = link; + caps->caps_valid = true; + caps->aux_support = true; + caps->aux_min_input_signal = 1; + caps->aux_max_input_signal = 512; + + KUNIT_EXPECT_EQ(test, amdgpu_dm_backlight_get_level(dm, 0), + convert_brightness_to_user(caps, 250000)); +} + +/** + * dm_test_backlight_get_level_aux_error - Test AUX readback fallback + * @test: The KUnit test context + */ +static void dm_test_backlight_get_level_aux_error(struct kunit *test) +{ + struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test); + struct dc_link *link = dm_kunit_alloc_link(test); + struct amdgpu_dm_backlight_caps *caps = &dm->backlight_caps[0]; + + setup_test_link_service(test, link); + link->dc->link_srv->edp_get_backlight_level_nits = dm_test_get_backlight_level_nits_fail; + dm->brightness[0] = 6789; + dm->backlight_link[0] = link; + caps->caps_valid = true; + caps->aux_support = true; + + KUNIT_EXPECT_EQ(test, amdgpu_dm_backlight_get_level(dm, 0), 6789U); +} + +/** + * dm_test_backlight_get_brightness_uses_device_index - Test get_brightness wrapper + * @test: The KUnit test context + */ +static void dm_test_backlight_get_brightness_uses_device_index(struct kunit *test) +{ + struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test); + struct dc_link *link = dm_kunit_alloc_link(test); + struct backlight_device *bd; + + setup_test_link_service(test, link); + link->dc->link_srv->edp_get_backlight_level = dm_test_get_backlight_level_error; + bd = kunit_kzalloc(test, sizeof(*bd), GFP_KERNEL); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bd); + dev_set_drvdata(&bd->dev, dm); + dm->num_of_edps = 2; + dm->backlight_dev[1] = bd; + dm->brightness[1] = 2468; + dm->backlight_link[1] = link; + + KUNIT_EXPECT_EQ(test, amdgpu_dm_backlight_get_brightness(bd), 2468); +} + /* Tests for amdgpu_dm_backlight_get_device_index() */ /** @@ -1460,6 +1610,12 @@ static struct kunit_case dm_backlight_test_cases[] = { KUNIT_CASE(dm_test_backlight_set_level_pwm_programs_power_module), KUNIT_CASE(dm_test_backlight_set_level_reallows_idle), KUNIT_CASE(dm_test_backlight_update_status_no_stream), + /* amdgpu_dm_backlight_get_level / get_brightness */ + KUNIT_CASE(dm_test_backlight_get_level_pwm_success), + KUNIT_CASE(dm_test_backlight_get_level_pwm_error), + KUNIT_CASE(dm_test_backlight_get_level_aux_success), + KUNIT_CASE(dm_test_backlight_get_level_aux_error), + KUNIT_CASE(dm_test_backlight_get_brightness_uses_device_index), /* amdgpu_dm_backlight_get_device_index */ KUNIT_CASE(dm_test_backlight_device_index_matches_second), KUNIT_CASE(dm_test_backlight_device_index_missing_fallback), -- 2.55.0
