[PATCH v2 08/11] drm/i915: use GOSUB to program doubled buffered LUT registers
Shankar, Uma
uma.shankar at intel.com
Wed May 14 11:40:28 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 08/11] drm/i915: use GOSUB to program doubled buffered
Nit: s/doubled/double
Also add display as prefix in header (drm/i915/display)
Overall changes look good to me.
Reviewed-by: Uma Shankar <uma.shankar at intel.com>
> LUT registers
>
> With addition of double buffered GAMMA registers in PTL, we can now program
> them in the active region. Use GOSUB instruction of DSB to program them.
>
> It is done in the following steps:
> 1. intel_color_prepare_commit()
> - If the platform supports, prepare a dsb instance (dsb_color)
> hooked to DSB0.
> - Add all the register write instructions to dsb_color through
> the load_lut() hook
> - Do not add the vrr_send_push() logic to the buffer as it
> should be taken care by dsb_commit instance of DSB0
> - Finish preparation of the buffer by aligning it to 64 bit
>
> 2. intel_atomic_dsb_finish()
> - Add the gosub instruction into the dsb_commit instance of
> DSB0
> using intel_dsb_gosub()
> - If needed, add the vrr_send_push() logic to dsb_commit after it
>
> v2: Refactor code to simplify commit completion flow.
> Add some helpers along the way (Ville)
>
> Signed-off-by: Chaitanya Kumar Borah <chaitanya.kumar.borah at intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_color.c | 39 ++++++++++++++-----
> drivers/gpu/drm/i915/display/intel_color.h | 2 +
> drivers/gpu/drm/i915/display/intel_display.c | 24 +++++++-----
> .../drm/i915/display/intel_display_device.h | 1 +
> 4 files changed, 47 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_color.c
> b/drivers/gpu/drm/i915/display/intel_color.c
> index bb2da3a53e9c..ac00b86798fb 100644
> --- a/drivers/gpu/drm/i915/display/intel_color.c
> +++ b/drivers/gpu/drm/i915/display/intel_color.c
> @@ -1965,6 +1965,25 @@ void intel_color_modeset(const struct
> intel_crtc_state *crtc_state)
> }
> }
>
> +bool intel_color_uses_dsb(const struct intel_crtc_state *crtc_state) {
> + return crtc_state->dsb_color;
> +}
> +
> +bool intel_color_uses_chained_dsb(const struct intel_crtc_state
> +*crtc_state) {
> + struct intel_display *display = to_intel_display(crtc_state);
> +
> + return crtc_state->dsb_color &&
> !HAS_DOUBLE_BUFFERED_LUT(display);
> +}
> +
> +bool intel_color_uses_gosub_dsb(const struct intel_crtc_state
> +*crtc_state) {
> + struct intel_display *display = to_intel_display(crtc_state);
> +
> + return crtc_state->dsb_color && HAS_DOUBLE_BUFFERED_LUT(display);
> }
> +
> void intel_color_prepare_commit(struct intel_atomic_state *state,
> struct intel_crtc *crtc)
> {
> @@ -1982,20 +2001,27 @@ void intel_color_prepare_commit(struct
> intel_atomic_state *state,
> if (!crtc_state->pre_csc_lut && !crtc_state->post_csc_lut)
> return;
>
> - crtc_state->dsb_color = intel_dsb_prepare(state, crtc, INTEL_DSB_1,
> 1024);
> - if (!crtc_state->dsb_color)
> + if (HAS_DOUBLE_BUFFERED_LUT(display))
> + crtc_state->dsb_color = intel_dsb_prepare(state, crtc,
> INTEL_DSB_0, 1024);
> + else
> + crtc_state->dsb_color = intel_dsb_prepare(state, crtc,
> INTEL_DSB_1,
> +1024);
> +
> + if (!intel_color_uses_dsb(crtc_state))
> return;
>
> display->funcs.color->load_luts(crtc_state);
>
> - if (crtc_state->use_dsb) {
> + if (crtc_state->use_dsb && intel_color_uses_chained_dsb(crtc_state)) {
> intel_vrr_send_push(crtc_state->dsb_color, crtc_state);
> intel_dsb_wait_vblank_delay(state, crtc_state->dsb_color);
> intel_vrr_check_push_sent(crtc_state->dsb_color, crtc_state);
> intel_dsb_interrupt(crtc_state->dsb_color);
> }
>
> - intel_dsb_finish(crtc_state->dsb_color);
> + if (intel_color_uses_gosub_dsb(crtc_state))
> + intel_dsb_gosub_finish(crtc_state->dsb_color);
> + else
> + intel_dsb_finish(crtc_state->dsb_color);
> }
>
> void intel_color_cleanup_commit(struct intel_crtc_state *crtc_state) @@ -
> 2012,11 +2038,6 @@ void intel_color_wait_commit(const struct intel_crtc_state
> *crtc_state)
> intel_dsb_wait(crtc_state->dsb_color);
> }
>
> -bool intel_color_uses_dsb(const struct intel_crtc_state *crtc_state) -{
> - return crtc_state->dsb_color;
> -}
> -
> static bool intel_can_preload_luts(struct intel_atomic_state *state,
> struct intel_crtc *crtc)
> {
> diff --git a/drivers/gpu/drm/i915/display/intel_color.h
> b/drivers/gpu/drm/i915/display/intel_color.h
> index 9d66457c1e89..bf7a12ce9df0 100644
> --- a/drivers/gpu/drm/i915/display/intel_color.h
> +++ b/drivers/gpu/drm/i915/display/intel_color.h
> @@ -24,6 +24,8 @@ void intel_color_prepare_commit(struct intel_atomic_state
> *state,
> struct intel_crtc *crtc);
> void intel_color_cleanup_commit(struct intel_crtc_state *crtc_state); bool
> intel_color_uses_dsb(const struct intel_crtc_state *crtc_state);
> +bool intel_color_uses_chained_dsb(const struct intel_crtc_state
> +*crtc_state); bool intel_color_uses_gosub_dsb(const struct
> +intel_crtc_state *crtc_state);
> void intel_color_wait_commit(const struct intel_crtc_state *crtc_state); void
> intel_color_commit_noarm(struct intel_dsb *dsb,
> const struct intel_crtc_state *crtc_state); diff --git
> a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index c940ffb500e0..58a84829fe58 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -7230,20 +7230,24 @@ static void intel_atomic_dsb_finish(struct
> intel_atomic_state *state,
> if (DISPLAY_VER(display) >= 9)
> skl_detach_scalers(new_crtc_state->dsb_commit,
> new_crtc_state);
> -
> - if (!new_crtc_state->dsb_color) {
> - intel_dsb_wait_vblanks(new_crtc_state->dsb_commit,
> 1);
> -
> - intel_vrr_send_push(new_crtc_state->dsb_commit,
> new_crtc_state);
> - intel_dsb_wait_vblank_delay(state, new_crtc_state-
> >dsb_commit);
> - intel_vrr_check_push_sent(new_crtc_state-
> >dsb_commit, new_crtc_state);
> - intel_dsb_interrupt(new_crtc_state->dsb_commit);
> - }
> }
>
> - if (new_crtc_state->dsb_color)
> + if (intel_color_uses_chained_dsb(new_crtc_state))
> intel_dsb_chain(state, new_crtc_state->dsb_commit,
> new_crtc_state->dsb_color, true);
> + else if (intel_color_uses_gosub_dsb(new_crtc_state))
> + intel_dsb_gosub(new_crtc_state->dsb_commit,
> + new_crtc_state->dsb_color);
> +
> + if (new_crtc_state->use_dsb &&
> !intel_color_uses_chained_dsb(new_crtc_state)) {
> + intel_dsb_wait_vblanks(new_crtc_state->dsb_commit, 1);
> +
> + intel_vrr_send_push(new_crtc_state->dsb_commit,
> new_crtc_state);
> + intel_dsb_wait_vblank_delay(state, new_crtc_state-
> >dsb_commit);
> + intel_vrr_check_push_sent(new_crtc_state->dsb_commit,
> + new_crtc_state);
> + intel_dsb_interrupt(new_crtc_state->dsb_commit);
> + }
>
> intel_dsb_finish(new_crtc_state->dsb_commit);
> }
> diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h
> b/drivers/gpu/drm/i915/display/intel_display_device.h
> index 368b0d3417c2..14943b47824b 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_device.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_device.h
> @@ -157,6 +157,7 @@ struct intel_display_platforms {
> #define HAS_DMC(__display) (DISPLAY_RUNTIME_INFO(__display)-
> >has_dmc)
> #define HAS_DMC_WAKELOCK(__display) (DISPLAY_VER(__display) >= 20)
> #define HAS_DOUBLE_BUFFERED_M_N(__display)
> (DISPLAY_VER(__display) >= 9 || (__display)->platform.broadwell)
> +#define HAS_DOUBLE_BUFFERED_LUT(__display)
> (DISPLAY_VER(__display) >= 30)
> #define HAS_DOUBLE_WIDE(__display) (DISPLAY_VER(__display) < 4)
> #define HAS_DP20(__display) ((__display)->platform.dg2 ||
> DISPLAY_VER(__display) >= 14)
> #define HAS_DPT(__display) (DISPLAY_VER(__display) >= 13)
> --
> 2.25.1
More information about the Intel-gfx
mailing list