[PATCH v3 1/2] drm/i915/display: Ensure enough lines between delayed VBlank and VBlank
Murthy, Arun R
arun.r.murthy at intel.com
Fri Apr 25 07:59:21 UTC 2025
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Jouni
> Högander
> Sent: Wednesday, April 23, 2025 3:57 PM
> To: intel-gfx at lists.freedesktop.org; intel-xe at lists.freedesktop.org
> Cc: Hogander, Jouni <jouni.hogander at intel.com>
> Subject: [PATCH v3 1/2] drm/i915/display: Ensure enough lines between
> delayed VBlank and VBlank
>
> To deterministically capture the transition of the state machine going from
> SRDOFFACK to IDLE, the delayed V. Blank should be at least one line after the
> non-delayed V. Blank.
>
> Ensure this by adding new interface into intel_psr to query number of lines
> needed for vblank delay and call it from intel_crtc_vblank_delay.
>
> v3: use existing intel_crtc_vblank_delay mechanism
> v2: apply limits only when needed (VRR TG vs. Legacy TG)
>
> Bspec: 69897
> Signed-off-by: Jouni Högander <jouni.hogander at intel.com>
Looks good to me
Reviewed-by: Arun R Murthy <arun.r.murthy at intel.com>
Thanks and Regards,
Arun R Murthy
-------------------
> ---
> drivers/gpu/drm/i915/display/intel_display.c | 2 +
> drivers/gpu/drm/i915/display/intel_psr.c | 39 ++++++++++++++++++++
> drivers/gpu/drm/i915/display/intel_psr.h | 1 +
> 3 files changed, 42 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 6bd55fd9dff85..a7b35fc13d7c8 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -2422,6 +2422,8 @@ static int intel_crtc_vblank_delay(const struct
> intel_crtc_state *crtc_state)
> if (intel_crtc_needs_wa_14015401596(crtc_state))
> vblank_delay = max(vblank_delay, 1);
>
> + vblank_delay = max(vblank_delay,
> +intel_psr_min_vblank_delay(crtc_state));
> +
> return vblank_delay;
> }
>
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> b/drivers/gpu/drm/i915/display/intel_psr.c
> index 127eec4272fda..1058134422bcf 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.c
> +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> @@ -2385,6 +2385,45 @@ void intel_psr_trigger_frame_change_event(struct
> intel_dsb *dsb,
> CURSURFLIVE(display, crtc->pipe), 0); }
>
> +/**
> + * intel_psr_min_vblank_delay - Minimum vblank delay needed by PSR
> + * @crtc_state: the crtc state
> + *
> + * Return minimum vblank delay needed by PSR.
> + */
> +int intel_psr_min_vblank_delay(const struct intel_crtc_state
> +*crtc_state) {
> + struct intel_display *display = to_intel_display(crtc_state);
> +
> + if (!crtc_state->has_psr || DISPLAY_VER(display) < 20)
> + return 0;
> +
> + /*
> + * Comment on SRD_STATUS register in Bspec for LunarLake and
> onwards:
> + *
> + * To deterministically capture the transition of the state machine
> + * going from SRDOFFACK to IDLE, the delayed V. Blank should be at
> least
> + * one line after the non-delayed V. Blank.
> + *
> + * Legacy TG: TRANS_SET_CONTEXT_LATENCY > 0
> + * VRR TG: TRANS_VRR_CTL[ VRR Guardband ] < (TRANS_VRR_VMAX[
> VRR Vmax ]
> + * - TRANS_VTOTAL[ Vertical Active ])
> + *
> + * SRD_STATUS is used only by PSR1 on PantherLake.
> + * SRD_STATUS is used by PSR1 and Panel Replay DP on LunarLake.
> + */
> +
> + if (DISPLAY_VER(display) >= 30 && (crtc_state->has_panel_replay ||
> + crtc_state->has_sel_update))
> + return 0;
> + else if (DISPLAY_VER(display) < 30 && (crtc_state->has_sel_update ||
> + intel_crtc_has_type(crtc_state,
> +
> INTEL_OUTPUT_EDP)))
> + return 0;
> + else
> + return 1;
> +}
> +
> static u32 man_trk_ctl_enable_bit_get(struct intel_display *display) {
> return display->platform.alderlake_p || DISPLAY_VER(display) >= 14 ? 0
> :
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.h
> b/drivers/gpu/drm/i915/display/intel_psr.h
> index c61384bb7382a..3838f01d1619c 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.h
> +++ b/drivers/gpu/drm/i915/display/intel_psr.h
> @@ -73,6 +73,7 @@ void intel_psr_unlock(const struct intel_crtc_state
> *crtc_state); void intel_psr_trigger_frame_change_event(struct intel_dsb *dsb,
> struct intel_atomic_state *state,
> struct intel_crtc *crtc);
> +int intel_psr_min_vblank_delay(const struct intel_crtc_state
> +*crtc_state);
> void intel_psr_connector_debugfs_add(struct intel_connector *connector);
> void intel_psr_debugfs_register(struct intel_display *display);
>
> --
> 2.43.0
More information about the Intel-xe
mailing list