[PATCH] drm/amd/display: Validate backlight caps are sane
Mario Limonciello
mario.limonciello at amd.com
Fri Sep 13 20:48:55 UTC 2024
On 9/13/2024 15:36, Alex Deucher wrote:
> On Fri, Sep 13, 2024 at 2:51 PM Mario Limonciello
> <mario.limonciello at amd.com> wrote:
>>
>> On 9/13/2024 13:47, Harry Wentland wrote:
>>>
>>>
>>> On 2024-09-13 14:00, Mario Limonciello wrote:
>>>> 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
>>>> Signed-off-by: Mario Limonciello <mario.limonciello at amd.com>
>>>> ---
>>>> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 16 ++++++++++++++++
>>>> 1 file changed, 16 insertions(+)
>>>>
>>>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> index 5942fc4e1c86..ad66f09cd0bb 100644
>>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> @@ -4428,6 +4428,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,
>>>> @@ -4442,6 +4443,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 ||
>>>
>>> Would we still want to allow signals below AMDGPU_DM_DEFAULT_MIN_BACKLIGHT
>>> (but above 0)? The min backlight value of 12 is a bit conservative and
>>> I wouldn't be surprised if systems set it lower via ACPI.
>>>
>>> The rest looks like great checks that we should absolutely have.
>>
>> I'm waffling about that one because Thomas' testing showed that there
>> was some problems with panel power savings when he quirked the Framework
>> panels below their ACPI default (12) in his v6 series of the Framework
>> quirks.
>
> What about systems without the need for a quirk? E.g., the vendor put
> a value less than AMDGPU_DM_DEFAULT_MIN_BACKLIGHT in the ACPI tables
> because they validated it and it works. Won't this break that?
>
From what I can tell from the observations that Thomas had (mentioned
in this commit message) setting it below 12 causes panel power saving to
not work properly; the issue should be specifically in how DC/DMCUB
handles that case.
I think once that's fixed we should open it up further.
> Alex
>
>>
>> So my thought process was we should put in an explicit check for now and
>> then when we have panel power savings working without a modeset landed
>> then we can also add code to the backlight set callback to turn off
>> panel power savings when set below AMDGPU_DM_DEFAULT_MIN_BACKLIGHT to
>> prevent the issue he found.
>>
>>>
>>> Harry
>>>
>>>> + 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)
>>>
>>
More information about the amd-gfx
mailing list