[PATCH v2 09/11] drm/i915: Program DB LUT registers before vblank

Shankar, Uma uma.shankar at intel.com
Wed May 14 11:44:24 UTC 2025



> -----Original Message-----
> From: Borah, Chaitanya Kumar <chaitanya.kumar.borah at intel.com>
> Sent: Tuesday, April 8, 2025 4:30 PM
> To: intel-xe at lists.freedesktop.org; intel-gfx at lists.freedesktop.org
> Cc: ville.syrjala at linux.intel.com; Shankar, Uma <uma.shankar at intel.com>;
> Borah, Chaitanya Kumar <chaitanya.kumar.borah at intel.com>; Manna, Animesh
> <animesh.manna at intel.com>
> Subject: [PATCH v2 09/11] drm/i915: Program DB LUT registers before vblank
> 
> 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)

Looks Good to me.
Reviewed-by: Uma Shankar <uma.shankar at intel.com>

> Signed-off-by: Chaitanya Kumar Borah <chaitanya.kumar.borah at 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 58a84829fe58..398606f328e9 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -6634,6 +6634,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);
> 
> @@ -6642,10 +6643,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



More information about the Intel-gfx mailing list