From: Jani Nikula <jani.nik...@intel.com>

[ Upstream commit bb83d5fb550bb7db75b29e6342417fda2bbb691c ]

The pch_get_backlight(), lpt_get_backlight(), and lpt_set_backlight()
functions operate directly on the hardware registers. If inverting the
value is needed, using intel_panel_compute_brightness(), it should only
be done in the interface between hardware registers and
panel->backlight.level.

The CPU mode takeover code added in commit 5b1ec9ac7ab5
("drm/i915/backlight: Fix backlight takeover on LPT, v3.") reads the
hardware register and converts to panel->backlight.level correctly,
however the value written back should remain in the hardware register
"domain".

This hasn't been an issue, because GM45 machines are the only known
users of i915.invert_brightness and the brightness invert quirk, and
without one of them no conversion is made. It's likely nobody's ever hit
the problem.

Fixes: 5b1ec9ac7ab5 ("drm/i915/backlight: Fix backlight takeover on LPT, v3.")
Cc: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
Cc: Ville Syrjälä <ville.syrj...@linux.intel.com>
Cc: Lyude Paul <ly...@redhat.com>
Cc: <sta...@vger.kernel.org> # v5.1+
Reviewed-by: Lyude Paul <ly...@redhat.com>
Signed-off-by: Jani Nikula <jani.nik...@intel.com>
Link: 
https://patchwork.freedesktop.org/patch/msgid/20210108152841.6944-1-jani.nik...@intel.com
(cherry picked from commit 0d4ced1c5bfe649196877d90442d4fd618e19153)
Signed-off-by: Jani Nikula <jani.nik...@intel.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/gpu/drm/i915/display/intel_panel.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_panel.c 
b/drivers/gpu/drm/i915/display/intel_panel.c
index bc14e9c0285a0..23edc1b8e43fa 100644
--- a/drivers/gpu/drm/i915/display/intel_panel.c
+++ b/drivers/gpu/drm/i915/display/intel_panel.c
@@ -1603,20 +1603,21 @@ static int lpt_setup_backlight(struct intel_connector 
*connector, enum pipe unus
                val = pch_get_backlight(connector);
        else
                val = lpt_get_backlight(connector);
-       val = intel_panel_compute_brightness(connector, val);
-       panel->backlight.level = clamp(val, panel->backlight.min,
-                                      panel->backlight.max);
 
        if (cpu_mode) {
                DRM_DEBUG_KMS("CPU backlight register was enabled, switching to 
PCH override\n");
 
                /* Write converted CPU PWM value to PCH override register */
-               lpt_set_backlight(connector->base.state, 
panel->backlight.level);
+               lpt_set_backlight(connector->base.state, val);
                I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1 | 
BLM_PCH_OVERRIDE_ENABLE);
 
                I915_WRITE(BLC_PWM_CPU_CTL2, cpu_ctl2 & ~BLM_PWM_ENABLE);
        }
 
+       val = intel_panel_compute_brightness(connector, val);
+       panel->backlight.level = clamp(val, panel->backlight.min,
+                                      panel->backlight.max);
+
        return 0;
 }
 
-- 
2.27.0



Reply via email to