On Wed, Oct 01, 2025 at 04:11:13PM +0530, Nautiyal, Ankit K wrote:
> 
> On 9/29/2025 2:30 PM, Ville Syrjälä wrote:
> > On Sun, Sep 28, 2025 at 12:35:40PM +0530, Ankit Nautiyal wrote:
> >> As we move towards using a shorter, optimized guardband, we need to adjust
> >> how the delayed vblank start is computed.
> >>
> >> Use the helper intel_vrr_compute_guardband() to calculate the optimized
> >> guardband. Since this is measured from the vblank end, we shift the
> >> vblank-start accordingly.
> >>
> >> Calculate the minimum delay required based on the guardband and apply it in
> >> intel_crtc_vblank_delay() to update crtc_vblank_start.
> >>
> >> Additionally, introduce a new allow_vblank_delay_fastset() helper that
> >> combines the existing LRR-based logic with an additional check for the
> >> optimized guardband usage.
> >>
> >> v2:
> >> - Check if optimized guardband is more than vblank length and add debug
> >>    print.
> >> - Extend vblank delay fastset logic to cover optimized guardband.
> >>
> >> Signed-off-by: Ankit Nautiyal <[email protected]>
> >> ---
> >>   drivers/gpu/drm/i915/display/intel_display.c | 79 +++++++++++++++++++-
> >>   1 file changed, 76 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
> >> b/drivers/gpu/drm/i915/display/intel_display.c
> >> index 4135f9be53fd..97a3121a204f 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_display.c
> >> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> >> @@ -2361,6 +2361,67 @@ static int intel_crtc_compute_pipe_mode(struct 
> >> intel_crtc_state *crtc_state)
> >>    return 0;
> >>   }
> >>   
> >> +static
> >> +int intel_crtc_min_guardband_delay(struct intel_atomic_state *state,
> >> +                             struct intel_crtc *crtc)
> >> +{
> >> +  struct intel_display *display = to_intel_display(state);
> >> +  struct intel_crtc_state *crtc_state =
> >> +          intel_atomic_get_new_crtc_state(state, crtc);
> >> +  const struct drm_display_mode *adjusted_mode =
> >> +          &crtc_state->hw.adjusted_mode;
> >> +  struct drm_connector_state *conn_state;
> >> +  struct drm_connector *drm_connector;
> >> +  int vblank_length;
> >> +  int i;
> >> +
> >> +  if (!intel_vrr_use_optimized_guardband(crtc_state))
> >> +          return 0;
> >> +
> >> +  vblank_length = crtc_state->vrr.vmin -
> >> +                  adjusted_mode->crtc_vdisplay;
> >> +
> >> +  for_each_new_connector_in_state(&state->base,
> >> +                                  drm_connector,
> >> +                                  conn_state, i) {
> >> +          int guardband;
> >> +          struct intel_connector *connector;
> >> +
> >> +          if (conn_state->crtc != &crtc->base)
> >> +                  continue;
> >> +
> >> +          connector = to_intel_connector(drm_connector);
> >> +          guardband = intel_vrr_compute_guardband(crtc_state,
> >> +                                                  connector);
> >> +          if (guardband > vblank_length) {
> >> +                  drm_dbg_kms(display->drm,
> >> +                              "[CRTC:%d:%s] Cannot optimize guardband 
> >> (%d) exceeds max (%d)\n",
> >> +                              crtc->base.base.id, crtc->base.name,
> >> +                              guardband,
> >> +                              vblank_length);
> >> +                  return 0;
> >> +          }
> >> +
> >> +          return vblank_length - guardband;
> >> +  }
> >> +
> >> +  return 0;
> >> +}
> >> +
> >> +static void intel_crtc_vblank_delay(struct intel_atomic_state *state,
> >> +                              struct intel_crtc *crtc)
> >> +{
> >> +  struct intel_crtc_state *crtc_state =
> >> +          intel_atomic_get_new_crtc_state(state, crtc);
> >> +  struct drm_display_mode *adjusted_mode =
> >> +          &crtc_state->hw.adjusted_mode;
> >> +  int vblank_delay = 0;
> >> +
> >> +  vblank_delay = intel_crtc_min_guardband_delay(state, crtc);
> >> +
> >> +  adjusted_mode->crtc_vblank_start += vblank_delay;
> >> +}
> >> +
> >>   static int intel_crtc_set_context_latency(struct intel_crtc_state 
> >> *crtc_state)
> >>   {
> >>    struct intel_display *display = to_intel_display(crtc_state);
> >> @@ -2413,6 +2474,7 @@ static int intel_crtc_compute_config(struct 
> >> intel_atomic_state *state,
> >>    ret = intel_crtc_compute_set_context_latency(state, crtc);
> >>    if (ret)
> >>            return ret;
> >> +  intel_crtc_vblank_delay(state, crtc);
> > IMO we should get rid of all this vblank_delay terminology here.
> > This one I think should just be our current
> > intel_vrr_compute_config_late() (renamed to eg.
> > intel_vrr_compute_guardband()).
> 
> Hmm ok so will rename this and call from intel_modeset_pipe_config_late().

I meant you should move the intel_vrr_compute_config_late() call
from intel_modeset_pipe_config_late() to here, and rename it to
eg. intel_vrr_compute_guardband().

-- 
Ville Syrjälä
Intel

Reply via email to