From: Mario Limonciello <mario.limoncie...@amd.com>

[Why]
If the first data point for a custom brightness curve is not 0% luminance
then the first few luminance values will be ignored.

[How]
Check signal is below first data point and if so do linear interpolation to
0 instead.

Reviewed-by: Alex Hung <alex.h...@amd.com>
Signed-off-by: Mario Limonciello <mario.limoncie...@amd.com>
Signed-off-by: Ivan Lipski <ivan.lip...@amd.com>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 10 ++++++++++
 1 file changed, 10 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 b7b933a33316..2f856ed99b63 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4821,6 +4821,16 @@ static void convert_custom_brightness(const struct 
amdgpu_dm_backlight_caps *cap
        if (!caps->data_points)
                return;
 
+       /*
+        * Handle the case where brightness is below the first data point
+        * Interpolate between (0,0) and (first_signal, first_lum)
+        */
+       if (brightness < caps->luminance_data[0].input_signal) {
+               lum = DIV_ROUND_CLOSEST(caps->luminance_data[0].luminance * 
brightness,
+                                       caps->luminance_data[0].input_signal);
+               goto scale;
+       }
+
        left = 0;
        right = caps->data_points - 1;
        while (left <= right) {
-- 
2.43.0

Reply via email to