mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drm/i915/vrr: Clamp guardband as per hardware and timing constraints
The maximum guardband value is constrained by two factors: - The actual vblank length minus set context latency (SCL) - The hardware register field width: - 8 bits for ICL/TGL (VRR_CTL_PIPELINE_FULL_MASK -> max 255) - 16 bits for ADL+ (XELPD_VRR_CTL_VRR_GUARDBAND_MASK -> max 65535) Remove the #FIXME and clamp the guardband to the maximum allowed value. v2: - Use REG_FIELD_MAX(). (Ville) - Separate out functions for intel_vrr_max_guardband(), intel_vrr_max_vblank_guardband(). (Ville) v3: - Fix Typo: Add the missing adjusted_mode->crtc_vdisplay in guardband computation. (Ville) - Refactor intel_vrr_max_hw_guardband() and use else for consistency. (Ville) v4: - Drop max_guardband from intel_vrr_max_hw_guardband(). (Ville) Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> (#v2) Link: https://lore.kernel.org/r/20250924141542.3122126-9-ankit.k.nautiyal@intel.com
This commit is contained in:
@@ -409,6 +409,38 @@ intel_vrr_compute_config(struct intel_crtc_state *crtc_state,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
intel_vrr_max_hw_guardband(const struct intel_crtc_state *crtc_state)
|
||||||
|
{
|
||||||
|
struct intel_display *display = to_intel_display(crtc_state);
|
||||||
|
int max_pipeline_full = REG_FIELD_MAX(VRR_CTL_PIPELINE_FULL_MASK);
|
||||||
|
|
||||||
|
if (DISPLAY_VER(display) >= 13)
|
||||||
|
return REG_FIELD_MAX(XELPD_VRR_CTL_VRR_GUARDBAND_MASK);
|
||||||
|
else
|
||||||
|
return intel_vrr_pipeline_full_to_guardband(crtc_state,
|
||||||
|
max_pipeline_full);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
intel_vrr_max_vblank_guardband(const 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;
|
||||||
|
|
||||||
|
return crtc_state->vrr.vmin -
|
||||||
|
adjusted_mode->crtc_vdisplay -
|
||||||
|
crtc_state->set_context_latency -
|
||||||
|
intel_vrr_extra_vblank_delay(display);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
intel_vrr_max_guardband(struct intel_crtc_state *crtc_state)
|
||||||
|
{
|
||||||
|
return min(intel_vrr_max_hw_guardband(crtc_state),
|
||||||
|
intel_vrr_max_vblank_guardband(crtc_state));
|
||||||
|
}
|
||||||
|
|
||||||
void intel_vrr_compute_config_late(struct intel_crtc_state *crtc_state)
|
void intel_vrr_compute_config_late(struct intel_crtc_state *crtc_state)
|
||||||
{
|
{
|
||||||
struct intel_display *display = to_intel_display(crtc_state);
|
struct intel_display *display = to_intel_display(crtc_state);
|
||||||
@@ -417,23 +449,14 @@ void intel_vrr_compute_config_late(struct intel_crtc_state *crtc_state)
|
|||||||
if (!intel_vrr_possible(crtc_state))
|
if (!intel_vrr_possible(crtc_state))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
crtc_state->vrr.guardband =
|
crtc_state->vrr.guardband = min(crtc_state->vrr.vmin - adjusted_mode->crtc_vdisplay,
|
||||||
crtc_state->vrr.vmin -
|
intel_vrr_max_guardband(crtc_state));
|
||||||
adjusted_mode->crtc_vdisplay -
|
|
||||||
crtc_state->set_context_latency -
|
|
||||||
intel_vrr_extra_vblank_delay(display);
|
|
||||||
|
|
||||||
if (DISPLAY_VER(display) < 13) {
|
|
||||||
/* FIXME handle the limit in a proper way */
|
|
||||||
crtc_state->vrr.guardband =
|
|
||||||
min(crtc_state->vrr.guardband,
|
|
||||||
intel_vrr_pipeline_full_to_guardband(crtc_state, 255));
|
|
||||||
|
|
||||||
|
if (DISPLAY_VER(display) < 13)
|
||||||
crtc_state->vrr.pipeline_full =
|
crtc_state->vrr.pipeline_full =
|
||||||
intel_vrr_guardband_to_pipeline_full(crtc_state,
|
intel_vrr_guardband_to_pipeline_full(crtc_state,
|
||||||
crtc_state->vrr.guardband);
|
crtc_state->vrr.guardband);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static u32 trans_vrr_ctl(const struct intel_crtc_state *crtc_state)
|
static u32 trans_vrr_ctl(const struct intel_crtc_state *crtc_state)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user