Currently, optimized guardband is only used on platforms where the VRR
timing generator is always enabled. We want to use the optimized/reduced
guardband whenever we are using the VRR timing generator, as the legacy
timing generator doesn't need vrr guardband.

On platforms where the VRR timing generator is always ON, we optimize the
guardband regardless of whether the display is operating in fixed or
variable refresh rate mode.

On platforms where the VRR timing generator is not always ON, we optimize
the guardband only when VRR is enabled.

Add a helper intel_vrr_use_optimized_guardband() to determine if the
optimized/reduced guardband should be used.

The actual computation is now performed internally within
intel_vrr_compute_guardband() which calls
intel_vrr_compute_optimized_guardband() when appropriate.

This completes the transition to optimized guardband usage across all
supported platforms.

Signed-off-by: Ankit Nautiyal <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_display.c |  5 +----
 drivers/gpu/drm/i915/display/intel_vrr.c     | 23 +++++++++++++++-----
 drivers/gpu/drm/i915/display/intel_vrr.h     |  5 ++---
 3 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 6f61278a36c2..84f830294007 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -2425,17 +2425,14 @@ static void intel_crtc_compute_vrr_guardband(struct 
intel_atomic_state *state,
                        continue;
 
                connector = to_intel_connector(drm_connector);
+               intel_vrr_compute_guardband(crtc_state, connector);
                if (intel_vrr_always_use_vrr_tg(display)) {
-                       intel_vrr_compute_optimized_guardband(crtc_state, 
connector);
-
                        vblank_length = adjusted_mode->crtc_vtotal -
                                        (crtc_state->set_context_latency +
                                         adjusted_mode->crtc_vdisplay);
 
                        adjusted_mode->crtc_vblank_start +=
                                vblank_length - crtc_state->vrr.guardband;
-               } else {
-                       intel_vrr_compute_guardband(crtc_state);
                }
        }
 }
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c 
b/drivers/gpu/drm/i915/display/intel_vrr.c
index 2dca4be28a9c..24f608d4a28f 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -495,8 +495,15 @@ int dsc_prefill_latency(struct intel_crtc_state 
*crtc_state, int linetime_us)
                                           linetime_us);
 }
 
-int intel_vrr_compute_optimized_guardband(struct intel_crtc_state *crtc_state,
-                                         struct intel_connector *connector)
+static bool intel_vrr_use_optimized_guardband(const struct intel_crtc_state 
*crtc_state)
+{
+       struct intel_display *display = to_intel_display(crtc_state);
+
+       return intel_vrr_always_use_vrr_tg(display) || crtc_state->vrr.enable;
+}
+
+static int intel_vrr_compute_optimized_guardband(struct intel_crtc_state 
*crtc_state,
+                                                struct intel_connector 
*connector)
 {
        const struct drm_display_mode *adjusted_mode = 
&crtc_state->hw.adjusted_mode;
        struct intel_display *display = to_intel_display(crtc_state);
@@ -550,16 +557,22 @@ int intel_vrr_compute_optimized_guardband(struct 
intel_crtc_state *crtc_state,
        return guardband;
 }
 
-void intel_vrr_compute_guardband(struct intel_crtc_state *crtc_state)
+void intel_vrr_compute_guardband(struct intel_crtc_state *crtc_state,
+                                struct intel_connector *connector)
 {
        struct intel_display *display = to_intel_display(crtc_state);
        const struct drm_display_mode *adjusted_mode = 
&crtc_state->hw.adjusted_mode;
+       int guardband;
 
        if (!intel_vrr_possible(crtc_state))
                return;
 
-       crtc_state->vrr.guardband = min(crtc_state->vrr.vmin - 
adjusted_mode->crtc_vdisplay,
-                                       intel_vrr_max_guardband(crtc_state));
+       if (intel_vrr_use_optimized_guardband(crtc_state))
+               guardband = intel_vrr_compute_optimized_guardband(crtc_state, 
connector);
+       else
+               guardband = crtc_state->vrr.vmin - adjusted_mode->crtc_vdisplay;
+
+       crtc_state->vrr.guardband = min(guardband, 
intel_vrr_max_guardband(crtc_state));
 
        if (DISPLAY_VER(display) < 13)
                crtc_state->vrr.pipeline_full =
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.h 
b/drivers/gpu/drm/i915/display/intel_vrr.h
index 8d1f31ae92df..6986e8f122dc 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.h
+++ b/drivers/gpu/drm/i915/display/intel_vrr.h
@@ -21,7 +21,8 @@ bool intel_vrr_possible(const struct intel_crtc_state 
*crtc_state);
 void intel_vrr_check_modeset(struct intel_atomic_state *state);
 void intel_vrr_compute_config(struct intel_crtc_state *crtc_state,
                              struct drm_connector_state *conn_state);
-void intel_vrr_compute_guardband(struct intel_crtc_state *crtc_state);
+void intel_vrr_compute_guardband(struct intel_crtc_state *crtc_state,
+                                struct intel_connector *connector);
 void intel_vrr_set_transcoder_timings(const struct intel_crtc_state 
*crtc_state);
 void intel_vrr_enable(const struct intel_crtc_state *crtc_state);
 void intel_vrr_send_push(struct intel_dsb *dsb,
@@ -42,7 +43,5 @@ void intel_vrr_set_fixed_rr_timings(const struct 
intel_crtc_state *crtc_state);
 bool intel_vrr_always_use_vrr_tg(struct intel_display *display);
 int intel_vrr_safe_window_start(const struct intel_crtc_state *crtc_state);
 int intel_vrr_vmin_safe_window_end(const struct intel_crtc_state *crtc_state);
-int intel_vrr_compute_optimized_guardband(struct intel_crtc_state *crtc_state,
-                                         struct intel_connector *connector);
 
 #endif /* __INTEL_VRR_H__ */
-- 
2.45.2

Reply via email to