From: Ville Syrjälä <[email protected]>

Apparently using non-posted DSB writes to update the legacy
LUT can cause CPU MMIO accesses to fail on TGL. Stop using
them for the legacy LUT updates, and instead switch to using
the double write approach (which is the other empirically
found workaround for the issue of DSB failing to correctly
update the legacy LUT).

Cc: [email protected]
Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12494
Fixes: 25ea3411bd23 ("drm/i915/dsb: Use non-posted register writes for legacy 
LUT")
Signed-off-by: Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_color.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index 174753625bca..aa50ecaf368d 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1357,19 +1357,19 @@ static void ilk_load_lut_8(const struct 
intel_crtc_state *crtc_state,
        lut = blob->data;
 
        /*
-        * DSB fails to correctly load the legacy LUT
-        * unless we either write each entry twice,
-        * or use non-posted writes
+        * DSB fails to correctly load the legacy LUT unless
+        * we either write each entry twice, or use non-posted
+        * writes. However using non-posted writes can cause
+        * CPU MMIO accesses to fail on TGL, so we choose to
+        * use the double write approach.
         */
-       if (crtc_state->dsb_color_vblank)
-               intel_dsb_nonpost_start(crtc_state->dsb_color_vblank);
-
-       for (i = 0; i < 256; i++)
+       for (i = 0; i < 256; i++) {
                ilk_lut_write(crtc_state, LGC_PALETTE(pipe, i),
                              i9xx_lut_8(&lut[i]));
-
-       if (crtc_state->dsb_color_vblank)
-               intel_dsb_nonpost_end(crtc_state->dsb_color_vblank);
+               if (crtc_state->dsb_color_vblank)
+                       ilk_lut_write(crtc_state, LGC_PALETTE(pipe, i),
+                                     i9xx_lut_8(&lut[i]));
+       }
 }
 
 static void ilk_load_lut_10(const struct intel_crtc_state *crtc_state,
-- 
2.45.2

Reply via email to