diff mbox series

[v6,2/4] drm/amd/display: Add support for minimum backlight quirk

Message ID 20240824-amdgpu-min-backlight-quirk-v6-2-1ed776a17fb3@weissschuh.net (mailing list archive)
State New, archived
Headers show
Series drm: Minimum backlight overrides and implementation for amdgpu | expand

Commit Message

Thomas Weißschuh Aug. 24, 2024, 6:33 p.m. UTC
Not all platforms provide the full range of PWM backlight capabilities
supported by the hardware through ATIF.
Use the generic drm panel minimum backlight quirk infrastructure to
override the capabilities where necessary.

Testing the backlight quirk together with the "panel_power_savings"
sysfs file has not shown any negative impact.
One quirk seems to be that 0% at panel_power_savings=0 seems to be
slightly darker than at panel_power_savings=4.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Tested-by: Dustin L. Howett <dustin@howett.net>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/Kconfig                |  1 +
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 10 ++++++++++
 2 files changed, 11 insertions(+)

Comments

Mario Limonciello Aug. 26, 2024, 4:57 p.m. UTC | #1
On 8/24/2024 13:33, Thomas Weißschuh wrote:
> Not all platforms provide the full range of PWM backlight capabilities
> supported by the hardware through ATIF.
> Use the generic drm panel minimum backlight quirk infrastructure to
> override the capabilities where necessary.
> 
> Testing the backlight quirk together with the "panel_power_savings"
> sysfs file has not shown any negative impact.
> One quirk seems to be that 0% at panel_power_savings=0 seems to be
> slightly darker than at panel_power_savings=4.

Thanks; This is the kind of thing I was worried about.

Harry, Leo,

Is that expected?  I wonder if we need to internally turn off panel 
power savings in display code when brightness falls a threshold (12 IIRC 
was the real "minimum" advertised in the table?).

> 
> Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
> Tested-by: Dustin L. Howett <dustin@howett.net>
> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/Kconfig                |  1 +
>   drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 10 ++++++++++
>   2 files changed, 11 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
> index 0051fb1b437f..655c10aef2e3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/Kconfig
> +++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
> @@ -23,6 +23,7 @@ config DRM_AMDGPU
>   	select DRM_BUDDY
>   	select DRM_SUBALLOC_HELPER
>   	select DRM_EXEC
> +	select DRM_PANEL_BACKLIGHT_QUIRKS
>   	# amdgpu depends on ACPI_VIDEO when ACPI is enabled, for select to work
>   	# ACPI_VIDEO's dependencies must also be selected.
>   	select INPUT if ACPI
> 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 983a977632ff..056960ea335c 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -93,6 +93,7 @@
>   #include <drm/drm_fourcc.h>
>   #include <drm/drm_edid.h>
>   #include <drm/drm_eld.h>
> +#include <drm/drm_utils.h>
>   #include <drm/drm_vblank.h>
>   #include <drm/drm_audio_component.h>
>   #include <drm/drm_gem_atomic_helper.h>
> @@ -3333,6 +3334,8 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
>   	struct drm_connector *conn_base;
>   	struct amdgpu_device *adev;
>   	struct drm_luminance_range_info *luminance_range;
> +	const struct drm_edid *drm_edid;
> +	int min_input_signal_override;
>   
>   	if (aconnector->bl_idx == -1 ||
>   	    aconnector->dc_link->connector_signal != SIGNAL_TYPE_EDP)
> @@ -3367,6 +3370,13 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
>   		caps->aux_min_input_signal = 0;
>   		caps->aux_max_input_signal = 512;
>   	}
> +
> +	drm_edid = drm_edid_alloc(aconnector->edid,
> +				  EDID_LENGTH * (aconnector->edid->extensions + 1));
> +	min_input_signal_override = drm_get_panel_min_brightness_quirk(drm_edid);
> +	drm_edid_free(drm_edid);
> +	if (min_input_signal_override >= 0)
> +		caps->min_input_signal = min_input_signal_override;
>   }
>   
>   void amdgpu_dm_update_connector_after_detect(
>
Harry Wentland Sept. 16, 2024, 7:43 p.m. UTC | #2
On 2024-08-26 12:57, Mario Limonciello wrote:
> On 8/24/2024 13:33, Thomas Weißschuh wrote:
>> Not all platforms provide the full range of PWM backlight capabilities
>> supported by the hardware through ATIF.
>> Use the generic drm panel minimum backlight quirk infrastructure to
>> override the capabilities where necessary.
>>
>> Testing the backlight quirk together with the "panel_power_savings"
>> sysfs file has not shown any negative impact.
>> One quirk seems to be that 0% at panel_power_savings=0 seems to be
>> slightly darker than at panel_power_savings=4.
> 
> Thanks; This is the kind of thing I was worried about.
> 
> Harry, Leo,
> 
> Is that expected?  I wonder if we need to internally turn off panel power savings in display code when brightness falls a threshold (12 IIRC was the real "minimum" advertised in the table?).

How much darker? Is it bothersome?

I wonder the FW and driver have different min backlight values now.

Leo, any thoughts?

Harry

> 
>>
>> Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
>> Tested-by: Dustin L. Howett <dustin@howett.net>
>> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/Kconfig                |  1 +
>>   drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 10 ++++++++++
>>   2 files changed, 11 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
>> index 0051fb1b437f..655c10aef2e3 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/Kconfig
>> +++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
>> @@ -23,6 +23,7 @@ config DRM_AMDGPU
>>       select DRM_BUDDY
>>       select DRM_SUBALLOC_HELPER
>>       select DRM_EXEC
>> +    select DRM_PANEL_BACKLIGHT_QUIRKS
>>       # amdgpu depends on ACPI_VIDEO when ACPI is enabled, for select to work
>>       # ACPI_VIDEO's dependencies must also be selected.
>>       select INPUT if ACPI
>> 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 983a977632ff..056960ea335c 100644
>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> @@ -93,6 +93,7 @@
>>   #include <drm/drm_fourcc.h>
>>   #include <drm/drm_edid.h>
>>   #include <drm/drm_eld.h>
>> +#include <drm/drm_utils.h>
>>   #include <drm/drm_vblank.h>
>>   #include <drm/drm_audio_component.h>
>>   #include <drm/drm_gem_atomic_helper.h>
>> @@ -3333,6 +3334,8 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
>>       struct drm_connector *conn_base;
>>       struct amdgpu_device *adev;
>>       struct drm_luminance_range_info *luminance_range;
>> +    const struct drm_edid *drm_edid;
>> +    int min_input_signal_override;
>>         if (aconnector->bl_idx == -1 ||
>>           aconnector->dc_link->connector_signal != SIGNAL_TYPE_EDP)
>> @@ -3367,6 +3370,13 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
>>           caps->aux_min_input_signal = 0;
>>           caps->aux_max_input_signal = 512;
>>       }
>> +
>> +    drm_edid = drm_edid_alloc(aconnector->edid,
>> +                  EDID_LENGTH * (aconnector->edid->extensions + 1));
>> +    min_input_signal_override = drm_get_panel_min_brightness_quirk(drm_edid);
>> +    drm_edid_free(drm_edid);
>> +    if (min_input_signal_override >= 0)
>> +        caps->min_input_signal = min_input_signal_override;
>>   }
>>     void amdgpu_dm_update_connector_after_detect(
>>
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
index 0051fb1b437f..655c10aef2e3 100644
--- a/drivers/gpu/drm/amd/amdgpu/Kconfig
+++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
@@ -23,6 +23,7 @@  config DRM_AMDGPU
 	select DRM_BUDDY
 	select DRM_SUBALLOC_HELPER
 	select DRM_EXEC
+	select DRM_PANEL_BACKLIGHT_QUIRKS
 	# amdgpu depends on ACPI_VIDEO when ACPI is enabled, for select to work
 	# ACPI_VIDEO's dependencies must also be selected.
 	select INPUT if ACPI
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 983a977632ff..056960ea335c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -93,6 +93,7 @@ 
 #include <drm/drm_fourcc.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_eld.h>
+#include <drm/drm_utils.h>
 #include <drm/drm_vblank.h>
 #include <drm/drm_audio_component.h>
 #include <drm/drm_gem_atomic_helper.h>
@@ -3333,6 +3334,8 @@  static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
 	struct drm_connector *conn_base;
 	struct amdgpu_device *adev;
 	struct drm_luminance_range_info *luminance_range;
+	const struct drm_edid *drm_edid;
+	int min_input_signal_override;
 
 	if (aconnector->bl_idx == -1 ||
 	    aconnector->dc_link->connector_signal != SIGNAL_TYPE_EDP)
@@ -3367,6 +3370,13 @@  static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
 		caps->aux_min_input_signal = 0;
 		caps->aux_max_input_signal = 512;
 	}
+
+	drm_edid = drm_edid_alloc(aconnector->edid,
+				  EDID_LENGTH * (aconnector->edid->extensions + 1));
+	min_input_signal_override = drm_get_panel_min_brightness_quirk(drm_edid);
+	drm_edid_free(drm_edid);
+	if (min_input_signal_override >= 0)
+		caps->min_input_signal = min_input_signal_override;
 }
 
 void amdgpu_dm_update_connector_after_detect(