[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

Reply via email to