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

Reply via email to