[PATCH 26/59] drm/amd/display: Test backlight caps validation
Alex Hung <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
[WHAT] The sanity check applied to the backlight caps reported by the firmware sits inside a CONFIG_ACPI block. The UML KUnit build cannot enable CONFIG_ACPI, so that logic is never built and stays uncovered. [HOW] Move the check into amdgpu_dm_validate_backlight_caps() and build it whenever CONFIG_ACPI or the KUnit tests are enabled. Behaviour of amdgpu_dm_update_backlight_caps() is unchanged. Add a parameterized test for amdgpu_dm_validate_backlight_caps() covering sane caps, a max above the 8-bit range, a negative min and a spread narrower than AMDGPU_DM_MIN_SPREAD. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <[email protected]> Signed-off-by: Alex Hung <[email protected]> --- .../display/amdgpu_dm/amdgpu_dm_backlight.c | 33 +++++++++----- .../display/amdgpu_dm/amdgpu_dm_backlight.h | 1 + .../tests/amdgpu_dm_backlight_test.c | 44 +++++++++++++++++++ 3 files changed, 66 insertions(+), 12 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 e61bbc310f33..a5ad59ec3e81 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 @@ -49,6 +49,25 @@ #include "amd_shared.h" #include "dm_helpers.h" +#if defined(CONFIG_ACPI) || IS_ENABLED(CONFIG_DRM_AMD_DC_KUNIT_TEST) +STATIC_IFN_KUNIT +void amdgpu_dm_validate_backlight_caps(struct amdgpu_display_manager *dm, int bl_idx) +{ + struct amdgpu_dm_backlight_caps *caps = &dm->backlight_caps[bl_idx]; + int spread = caps->max_input_signal - caps->min_input_signal; + + if (caps->max_input_signal > AMDGPU_DM_DEFAULT_MAX_BACKLIGHT || + caps->min_input_signal < 0 || + spread > AMDGPU_DM_DEFAULT_MAX_BACKLIGHT || + spread < AMDGPU_DM_MIN_SPREAD) { + drm_dbg_kms(adev_to_drm(dm->adev), "DM: Invalid backlight caps: min=%d, max=%d\n", + caps->min_input_signal, caps->max_input_signal); + caps->caps_valid = false; + } +} +EXPORT_IF_KUNIT(amdgpu_dm_validate_backlight_caps); +#endif + void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm, int bl_idx) { @@ -61,18 +80,8 @@ void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm, amdgpu_acpi_get_backlight_caps(caps); /* validate the firmware value is sane */ - if (caps->caps_valid) { - int spread = caps->max_input_signal - caps->min_input_signal; - - if (caps->max_input_signal > AMDGPU_DM_DEFAULT_MAX_BACKLIGHT || - caps->min_input_signal < 0 || - spread > AMDGPU_DM_DEFAULT_MAX_BACKLIGHT || - spread < AMDGPU_DM_MIN_SPREAD) { - drm_dbg_kms(adev_to_drm(dm->adev), "DM: Invalid backlight caps: min=%d, max=%d\n", - caps->min_input_signal, caps->max_input_signal); - caps->caps_valid = false; - } - } + if (caps->caps_valid) + amdgpu_dm_validate_backlight_caps(dm, bl_idx); #else if (caps->aux_support) return; 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 07b75064847c..9ad888d3ae7b 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 @@ -53,6 +53,7 @@ bool amdgpu_dm_should_create_sysfs(struct amdgpu_dm_connector *aconnector); extern const struct attribute_group amdgpu_group; #if IS_ENABLED(CONFIG_DRM_AMD_DC_KUNIT_TEST) +void amdgpu_dm_validate_backlight_caps(struct amdgpu_display_manager *dm, int bl_idx); 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); 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 7ca17f803f9d..5a8eb9e54b6c 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 @@ -792,6 +792,48 @@ static void dm_test_backlight_caps_non_aux_sets_defaults(struct kunit *test) } #endif +/* Tests for amdgpu_dm_validate_backlight_caps() */ + +struct dm_validate_caps_param { + const char *name; + int min_input_signal; + int max_input_signal; + bool caps_valid; +}; + +static const struct dm_validate_caps_param dm_validate_caps_params[] = { + { "sane", AMDGPU_DM_DEFAULT_MIN_BACKLIGHT, AMDGPU_DM_DEFAULT_MAX_BACKLIGHT, true }, + { "max_too_large", AMDGPU_DM_DEFAULT_MIN_BACKLIGHT, + AMDGPU_DM_DEFAULT_MAX_BACKLIGHT + 1, false }, + { "negative_min", -1, AMDGPU_DM_DEFAULT_MAX_BACKLIGHT, false }, + { "narrow_spread", 100, 100 + AMDGPU_DM_MIN_SPREAD - 1, false }, +}; + +KUNIT_ARRAY_PARAM_DESC(dm_validate_caps, dm_validate_caps_params, name); + +/** + * dm_test_validate_backlight_caps - Test the firmware caps sanity check + * @test: The KUnit test context + * + * Caps above the 8-bit range, with a negative min or with a spread narrower + * than AMDGPU_DM_MIN_SPREAD must be rejected. + */ +static void dm_test_validate_backlight_caps(struct kunit *test) +{ + const struct dm_validate_caps_param *param = test->param_value; + struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test); + struct amdgpu_dm_backlight_caps *caps = &dm->backlight_caps[0]; + + dm->adev = dm_kunit_alloc_adev(test); + caps->caps_valid = true; + caps->min_input_signal = param->min_input_signal; + caps->max_input_signal = param->max_input_signal; + + amdgpu_dm_validate_backlight_caps(dm, 0); + + KUNIT_EXPECT_EQ(test, caps->caps_valid, param->caps_valid); +} + /* Tests for get_brightness_range() */ /** @@ -1928,6 +1970,8 @@ static struct kunit_case dm_backlight_test_cases[] = { KUNIT_CASE(dm_test_backlight_caps_aux_support_noop), KUNIT_CASE(dm_test_backlight_caps_non_aux_sets_defaults), #endif + /* amdgpu_dm_validate_backlight_caps */ + KUNIT_CASE_PARAM(dm_test_validate_backlight_caps, dm_validate_caps_gen_params), /* get_brightness_range */ KUNIT_CASE(dm_test_brightness_range_null_caps), KUNIT_CASE(dm_test_brightness_range_pwm), -- 2.43.0