drm/amd/display: Test backlight caps validation

[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 <bhawanpreet.lakha@amd.com>
Signed-off-by: Alex Hung <alex.hung@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-08-17 19:10:49 -06:00 committed by Alex Deucher
parent 86b6d8b281
commit 4c812f0d8c
3 changed files with 66 additions and 12 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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),