drm/i915/vrr: Implement vblank evasion with DC balancing

Add vblank evasion logic when vrr is already enabled along with
dc balance is computed.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Link: https://patch.msgid.link/20251223104542.2688548-14-mitulkumar.ajitkumar.golani@intel.com
This commit is contained in:
Ville Syrjälä 2025-12-23 16:15:35 +05:30 committed by Ankit Nautiyal
parent 5e32a46f56
commit 5bb6250c34
2 changed files with 53 additions and 4 deletions

View File

@ -704,7 +704,36 @@ void intel_dsb_vblank_evade(struct intel_atomic_state *state,
if (crtc_state->has_psr)
intel_dsb_emit_wait_dsl(dsb, DSB_OPCODE_WAIT_DSL_OUT, 0, 0);
if (pre_commit_is_vrr_active(state, crtc)) {
if (pre_commit_is_vrr_active(state, crtc) && crtc_state->vrr.dc_balance.enable) {
int vblank_delay = crtc_state->set_context_latency;
int vmin_vblank_start, vmax_vblank_start;
vmin_vblank_start = intel_vrr_dcb_vmin_vblank_start_next(crtc_state);
if (vmin_vblank_start >= 0) {
end = vmin_vblank_start;
start = end - vblank_delay - latency;
intel_dsb_wait_scanline_out(state, dsb, start, end);
}
vmax_vblank_start = intel_vrr_dcb_vmax_vblank_start_next(crtc_state);
if (vmax_vblank_start >= 0) {
end = vmax_vblank_start;
start = end - vblank_delay - latency;
intel_dsb_wait_scanline_out(state, dsb, start, end);
}
vmin_vblank_start = intel_vrr_dcb_vmin_vblank_start_final(crtc_state);
end = vmin_vblank_start;
start = end - vblank_delay - latency;
intel_dsb_wait_scanline_out(state, dsb, start, end);
vmax_vblank_start = intel_vrr_dcb_vmax_vblank_start_final(crtc_state);
end = vmax_vblank_start;
start = end - vblank_delay - latency;
intel_dsb_wait_scanline_out(state, dsb, start, end);
} else if (pre_commit_is_vrr_active(state, crtc)) {
int vblank_delay = crtc_state->set_context_latency;
end = intel_vrr_vmin_vblank_start(crtc_state);

View File

@ -653,10 +653,30 @@ intel_pre_commit_crtc_state(struct intel_atomic_state *state,
static int vrr_vblank_start(const struct intel_crtc_state *crtc_state)
{
if (intel_vrr_is_push_sent(crtc_state))
return intel_vrr_vmin_vblank_start(crtc_state);
bool is_push_sent = intel_vrr_is_push_sent(crtc_state);
int vblank_start;
if (!crtc_state->vrr.dc_balance.enable) {
if (is_push_sent)
return intel_vrr_vmin_vblank_start(crtc_state);
else
return intel_vrr_vmax_vblank_start(crtc_state);
}
if (is_push_sent)
vblank_start = intel_vrr_dcb_vmin_vblank_start_next(crtc_state);
else
return intel_vrr_vmax_vblank_start(crtc_state);
vblank_start = intel_vrr_dcb_vmax_vblank_start_next(crtc_state);
if (vblank_start >= 0)
return vblank_start;
if (is_push_sent)
vblank_start = intel_vrr_dcb_vmin_vblank_start_final(crtc_state);
else
vblank_start = intel_vrr_dcb_vmax_vblank_start_final(crtc_state);
return vblank_start;
}
void intel_vblank_evade_init(const struct intel_crtc_state *old_crtc_state,