On Mon, Jun 08, 2026 at 06:07:09PM +0530, Ankit Nautiyal wrote:
> In intel_dsb_wait_for_delayed_vblank() the VRR path issues a
> WAIT_DSL_OUT(safe_window_start, vmin_safe_window_end) followed by a
> WAIT_USEC for SCL+1 scanlines to land on the delayed vblank.
> 
> Experimentally, DSB appears to observe a slightly stale PIPEDSL value.
> When the actual scanline has just reached safe_window_start, the DSB
> may still see a value at or before that boundary when WAIT_DSL_OUT is
> evaluated, causing the wait to complete immediately.
> 
> As a result, the subsequent WAIT_USEC executes too early, and the
> flip-done interrupt fires roughly one frame ahead of the delayed vblank.
> 
> Shift the scanline start back by one to ensure the wait window is
> entered reliably.
> 
> v2: Replace explicit one-scanline delay with scanline boundary
>     adjustment (safe_window_start - 1). (Ville)
> 
> Signed-off-by: Ankit Nautiyal <[email protected]>

Reviewed-by: Ville Syrjälä <[email protected]>

> ---
>  drivers/gpu/drm/i915/display/intel_dsb.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c 
> b/drivers/gpu/drm/i915/display/intel_dsb.c
> index fec8a56e21ea..07dd6318d9cc 100644
> --- a/drivers/gpu/drm/i915/display/intel_dsb.c
> +++ b/drivers/gpu/drm/i915/display/intel_dsb.c
> @@ -902,9 +902,17 @@ void intel_dsb_wait_for_delayed_vblank(struct 
> intel_atomic_state *state,
>                * the hardware itself guarantees that we're SCL lines
>                * away from the delayed vblank, and we won't be inside
>                * the vmin safe window so this extra wait does nothing.
> +              *
> +              * Experimentally, DSB may observe a slightly stale
> +              * PIPEDSL value. When the actual scanline has just reached
> +              * safe_window_start, WAIT_DSL_OUT may complete immediately
> +              * due to the stale value.
> +              *
> +              * Shift the start back by one scanline to ensure the wait
> +              * window is entered reliably.
>                */
>               intel_dsb_wait_scanline_out(state, dsb,
> -                                         
> intel_vrr_safe_window_start(crtc_state),
> +                                         
> intel_vrr_safe_window_start(crtc_state) - 1,
>                                           
> intel_vrr_vmin_safe_window_end(crtc_state));
>               /*
>                * When the push is sent during vblank it will trigger
> -- 
> 2.45.2

-- 
Ville Syrjälä
Intel

Reply via email to