Double Buffered LUT registers can be programmed in the active region.
This patch implements the MMIO path for it. Program the registers after
evading vblank. The HW latches on to the registers after delayed vblank.
It takes around 1024 cdclk cycles(~one scanline) for this.

Following assumptions have been made while making this change

 - Current vblank evasion time is sufficient for programming
   the LUT registers.
 - Current guardband calculation would be sufficient for the HW
   to latch on to the new values

v2: move loading LUTs to commit_pipe_post_planes() since a vblank
    evasion failure for this is probably less drastic than
    for plane programming. (Ville)

Signed-off-by: Chaitanya Kumar Borah <chaitanya.kumar.bo...@intel.com>
Reviewed-by: Uma Shankar <uma.shan...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 128b2d865ac3..06f58c062b29 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -6638,6 +6638,7 @@ static void commit_pipe_post_planes(struct 
intel_atomic_state *state,
        struct intel_display *display = to_intel_display(state);
        const struct intel_crtc_state *new_crtc_state =
                intel_atomic_get_new_crtc_state(state, crtc);
+       bool modeset = intel_crtc_needs_modeset(new_crtc_state);
 
        drm_WARN_ON(display->drm, new_crtc_state->use_dsb);
 
@@ -6646,10 +6647,15 @@ static void commit_pipe_post_planes(struct 
intel_atomic_state *state,
         * get a catastrophic underrun even if the two operations
         * end up happening in two different frames.
         */
-       if (DISPLAY_VER(display) >= 9 &&
-           !intel_crtc_needs_modeset(new_crtc_state))
+       if (DISPLAY_VER(display) >= 9 && !modeset)
                skl_detach_scalers(NULL, new_crtc_state);
 
+       if (!modeset &&
+           intel_crtc_needs_color_update(new_crtc_state) &&
+           !intel_color_uses_dsb(new_crtc_state) &&
+           HAS_DOUBLE_BUFFERED_LUT(display))
+               intel_color_load_luts(new_crtc_state);
+
        if (intel_crtc_vrr_enabling(state, crtc))
                intel_vrr_enable(new_crtc_state);
 }
-- 
2.25.1

Reply via email to