mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 23:22:31 +02:00
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:
parent
5e32a46f56
commit
5bb6250c34
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user