]> git.dujemihanovic.xyz Git - linux.git/commitdiff
drm/amd/display: Validate backlight caps are sane
authorMario Limonciello <mario.limonciello@amd.com>
Fri, 13 Sep 2024 18:00:39 +0000 (13:00 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 18 Sep 2024 20:15:08 +0000 (16:15 -0400)
Currently amdgpu takes backlight caps provided by the ACPI tables
on systems as is.  If the firmware sets maximums that are too low
this means that users don't get a good experience.

To avoid having to maintain a quirk list of such systems, do a sanity
check on the values.  Check that the spread is at least half of the
values that amdgpu would use if no ACPI table was found and if not
use the amdgpu defaults.

Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3020
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 4ab329e0071476b2741ad56c75833993de1adaef..08bcb47d70743137b4832de5db512625859841aa 100644 (file)
@@ -4469,6 +4469,7 @@ static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
 
 #define AMDGPU_DM_DEFAULT_MIN_BACKLIGHT 12
 #define AMDGPU_DM_DEFAULT_MAX_BACKLIGHT 255
+#define AMDGPU_DM_MIN_SPREAD ((AMDGPU_DM_DEFAULT_MAX_BACKLIGHT - AMDGPU_DM_DEFAULT_MIN_BACKLIGHT) / 2)
 #define AUX_BL_DEFAULT_TRANSITION_TIME_MS 50
 
 static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm,
@@ -4483,6 +4484,21 @@ static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm,
                return;
 
        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 < AMDGPU_DM_DEFAULT_MIN_BACKLIGHT ||
+                   spread > AMDGPU_DM_DEFAULT_MAX_BACKLIGHT ||
+                   spread < AMDGPU_DM_MIN_SPREAD) {
+                       DRM_DEBUG_KMS("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) {
                dm->backlight_caps[bl_idx].caps_valid = true;
                if (caps.aux_support)