Currently, the guardband is computed as: vmin - vdisplay, because the guardband matches the length of the vblank interval. We then make sure that this value is atmost equal to the max guardband with SCL and other delays taken into account.
However, with the optimized/reduced guardband logic, the delayed vblank will be positioned further away from the undelayed vblank. So with the optimization enabled, the guardband should instead be computed as: vmin - vblank_start. Update the guardband calculation in intel_vrr_compute_config_late() to use vblank_start when optimization is enabled. Signed-off-by: Ankit Nautiyal <ankit.k.nauti...@intel.com> --- drivers/gpu/drm/i915/display/intel_vrr.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c index ff6848de21b5..0b4694a1e2b5 100644 --- a/drivers/gpu/drm/i915/display/intel_vrr.c +++ b/drivers/gpu/drm/i915/display/intel_vrr.c @@ -443,12 +443,17 @@ void intel_vrr_compute_config_late(struct intel_crtc_state *crtc_state) { struct intel_display *display = to_intel_display(crtc_state); const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; + int guardband; if (!intel_vrr_possible(crtc_state)) return; - crtc_state->vrr.guardband = min(crtc_state->vrr.vmin - adjusted_mode->crtc_vdisplay, - intel_vrr_max_guardband(crtc_state)); + if (intel_vrr_use_optimized_guardband(crtc_state)) + guardband = crtc_state->vrr.vmin - adjusted_mode->crtc_vblank_start; + else + guardband = crtc_state->vrr.vmin - adjusted_mode->crtc_vdisplay; + + crtc_state->vrr.guardband = min(guardband, intel_vrr_max_guardband(crtc_state)); if (DISPLAY_VER(display) < 13) crtc_state->vrr.pipeline_full = -- 2.45.2