Skip to content

Commit 3c0b873

Browse files
vsyrjalalutzbichler
authored andcommitted
drm/i915/vrr: Introduce intel_vrr_vblank_delay()
Introduce a VRR specific function for determining the current vblank delay. Currently thus will give the same answer as intel_mode_vblank_delay() but that will change later. Signed-off-by: Ville Syrjälä <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Reviewed-by: Ankit Nautiyal <[email protected]>
1 parent 51df92c commit 3c0b873

File tree

4 files changed

+27
-5
lines changed

4 files changed

+27
-5
lines changed

drivers/gpu/drm/i915/display/intel_dsb.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,16 @@ static bool pre_commit_is_vrr_active(struct intel_atomic_state *state,
109109
return old_crtc_state->vrr.enable && !intel_crtc_vrr_disabling(state, crtc);
110110
}
111111

112-
static int dsb_vblank_delay(const struct intel_crtc_state *crtc_state)
112+
static int dsb_vblank_delay(struct intel_atomic_state *state,
113+
struct intel_crtc *crtc)
113114
{
114-
return intel_mode_vblank_delay(&crtc_state->hw.adjusted_mode);
115+
const struct intel_crtc_state *crtc_state =
116+
intel_pre_commit_crtc_state(state, crtc);
117+
118+
if (pre_commit_is_vrr_active(state, crtc))
119+
return intel_vrr_vblank_delay(crtc_state);
120+
else
121+
return intel_mode_vblank_delay(&crtc_state->hw.adjusted_mode);
115122
}
116123

117124
static int dsb_vtotal(struct intel_atomic_state *state,
@@ -520,10 +527,11 @@ void intel_dsb_vblank_evade(struct intel_atomic_state *state,
520527
intel_pre_commit_crtc_state(state, crtc);
521528
/* FIXME calibrate sensibly */
522529
int latency = intel_usecs_to_scanlines(&crtc_state->hw.adjusted_mode, 20);
523-
int vblank_delay = dsb_vblank_delay(crtc_state);
524530
int start, end;
525531

526532
if (pre_commit_is_vrr_active(state, crtc)) {
533+
int vblank_delay = intel_vrr_vblank_delay(crtc_state);
534+
527535
end = intel_vrr_vmin_vblank_start(crtc_state);
528536
start = end - vblank_delay - latency;
529537
intel_dsb_wait_scanline_out(state, dsb, start, end);
@@ -532,6 +540,8 @@ void intel_dsb_vblank_evade(struct intel_atomic_state *state,
532540
start = end - vblank_delay - latency;
533541
intel_dsb_wait_scanline_out(state, dsb, start, end);
534542
} else {
543+
int vblank_delay = intel_mode_vblank_delay(&crtc_state->hw.adjusted_mode);
544+
535545
end = intel_mode_vblank_start(&crtc_state->hw.adjusted_mode);
536546
start = end - vblank_delay - latency;
537547
intel_dsb_wait_scanline_out(state, dsb, start, end);
@@ -612,7 +622,7 @@ void intel_dsb_wait_vblank_delay(struct intel_atomic_state *state,
612622
const struct intel_crtc_state *crtc_state =
613623
intel_pre_commit_crtc_state(state, crtc);
614624
int usecs = intel_scanlines_to_usecs(&crtc_state->hw.adjusted_mode,
615-
dsb_vblank_delay(crtc_state)) + 1;
625+
dsb_vblank_delay(state, crtc)) + 1;
616626

617627
intel_dsb_wait_usec(dsb, usecs);
618628
}

drivers/gpu/drm/i915/display/intel_vblank.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,7 @@ void intel_vblank_evade_init(const struct intel_crtc_state *old_crtc_state,
641641
struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
642642
const struct intel_crtc_state *crtc_state;
643643
const struct drm_display_mode *adjusted_mode;
644+
int vblank_delay;
644645

645646
evade->crtc = crtc;
646647

@@ -662,8 +663,12 @@ void intel_vblank_evade_init(const struct intel_crtc_state *old_crtc_state,
662663
evade->vblank_start = intel_vrr_vmin_vblank_start(crtc_state);
663664
else
664665
evade->vblank_start = intel_vrr_vmax_vblank_start(crtc_state);
666+
667+
vblank_delay = intel_vrr_vblank_delay(crtc_state);
665668
} else {
666669
evade->vblank_start = intel_mode_vblank_start(adjusted_mode);
670+
671+
vblank_delay = intel_mode_vblank_delay(adjusted_mode);
667672
}
668673

669674
/* FIXME needs to be calibrated sensibly */
@@ -681,7 +686,7 @@ void intel_vblank_evade_init(const struct intel_crtc_state *old_crtc_state,
681686
*/
682687
if (intel_color_uses_dsb(new_crtc_state) ||
683688
new_crtc_state->update_m_n || new_crtc_state->update_lrr)
684-
evade->min -= intel_mode_vblank_delay(adjusted_mode);
689+
evade->min -= vblank_delay;
685690
}
686691

687692
/* must be called with vblank interrupt already enabled! */

drivers/gpu/drm/i915/display/intel_vrr.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ intel_vrr_check_modeset(struct intel_atomic_state *state)
7575
}
7676
}
7777

78+
int intel_vrr_vblank_delay(const struct intel_crtc_state *crtc_state)
79+
{
80+
return crtc_state->hw.adjusted_mode.crtc_vblank_start -
81+
crtc_state->hw.adjusted_mode.crtc_vdisplay;
82+
}
83+
7884
/*
7985
* Without VRR registers get latched at:
8086
* vblank_start

drivers/gpu/drm/i915/display/intel_vrr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ int intel_vrr_vmax_vtotal(const struct intel_crtc_state *crtc_state);
3030
int intel_vrr_vmin_vtotal(const struct intel_crtc_state *crtc_state);
3131
int intel_vrr_vmax_vblank_start(const struct intel_crtc_state *crtc_state);
3232
int intel_vrr_vmin_vblank_start(const struct intel_crtc_state *crtc_state);
33+
int intel_vrr_vblank_delay(const struct intel_crtc_state *crtc_state);
3334

3435
#endif /* __INTEL_VRR_H__ */

0 commit comments

Comments
 (0)