| From 327e62f47eb57ae5ff63de82b0815557104e439a Mon Sep 17 00:00:00 2001 |
| From: Mario Limonciello <mario.limonciello@amd.com> |
| Date: Fri, 13 Sep 2024 13:00:39 -0500 |
| Subject: drm/amd/display: Validate backlight caps are sane |
| |
| From: Mario Limonciello <mario.limonciello@amd.com> |
| |
| commit 327e62f47eb57ae5ff63de82b0815557104e439a upstream. |
| |
| 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 |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 16 ++++++++++++++++ |
| 1 file changed, 16 insertions(+) |
| |
| --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| @@ -4441,6 +4441,7 @@ static int amdgpu_dm_mode_config_init(st |
| |
| #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, |
| @@ -4455,6 +4456,21 @@ static void amdgpu_dm_update_backlight_c |
| 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) |