For variable refresh rate case, we wait for send push event and so the
flipdone via dsb interrupt and vblank are aligned.
Currently the guardband is same as vblank length and undelayed vblank
and the vblank and the flipdone with dsb interrupt are already aligned
for the fixed refresh rate case.

As we move towards a shorter optimized guardband for fixed refresh rate
we need to wait for the delayed vblank before the DSB interrupt to align
the flipdone event with the delayed vblank.

Add a helper to make sure we wait for the delayed vblank for fixed
refresh rate case.

Signed-off-by: Ankit Nautiyal <ankit.k.nauti...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c |  1 +
 drivers/gpu/drm/i915/display/intel_dsb.c     | 17 +++++++++++++++++
 drivers/gpu/drm/i915/display/intel_dsb.h     |  3 +++
 3 files changed, 21 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 787bb6ebdc75..0b5793e3b0ea 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7449,6 +7449,7 @@ static void intel_atomic_dsb_finish(struct 
intel_atomic_state *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_wait_for_guardband(state, new_crtc_state->dsb_commit);
                intel_dsb_interrupt(new_crtc_state->dsb_commit);
        }
 
diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c 
b/drivers/gpu/drm/i915/display/intel_dsb.c
index 53d8ae3a70e9..eb74ba302cbb 100644
--- a/drivers/gpu/drm/i915/display/intel_dsb.c
+++ b/drivers/gpu/drm/i915/display/intel_dsb.c
@@ -1020,3 +1020,20 @@ void intel_dsb_irq_handler(struct intel_display *display,
                drm_err(display->drm, "[CRTC:%d:%s] DSB %d GOSUB programming 
error\n",
                        crtc->base.base.id, crtc->base.name, dsb_id);
 }
+
+void intel_dsb_wait_for_guardband(struct intel_atomic_state *state,
+                                 struct intel_dsb *dsb)
+{
+       struct intel_crtc *crtc = dsb->crtc;
+       const struct intel_crtc_state *crtc_state =
+               intel_pre_commit_crtc_state(state, crtc);
+       int start, end;
+
+       if (crtc_state->vrr.enable)
+               return;
+
+       start = crtc_state->vrr.flipline - crtc_state->vrr.guardband;
+       end = crtc_state->vrr.flipline;
+
+       intel_dsb_wait_scanline_in(state, dsb, start, end);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_dsb.h 
b/drivers/gpu/drm/i915/display/intel_dsb.h
index c8f4499916eb..35ba83b84df1 100644
--- a/drivers/gpu/drm/i915/display/intel_dsb.h
+++ b/drivers/gpu/drm/i915/display/intel_dsb.h
@@ -74,4 +74,7 @@ void intel_dsb_wait(struct intel_dsb *dsb);
 void intel_dsb_irq_handler(struct intel_display *display,
                           enum pipe pipe, enum intel_dsb_id dsb_id);
 
+void intel_dsb_wait_for_guardband(struct intel_atomic_state *state,
+                                 struct intel_dsb *dsb);
+
 #endif
-- 
2.45.2

Reply via email to