Currently intel_alpm_lobf_compute_config() tries to account for
guardband +SCL requirements during encoder->compute_config() phase,
even before guardband is computed.
Also, LOBF depends on crtc_state->has_psr which can be modified in
encoder->compute_config_late().

Move the  lobf computation in encoder->compute_config_late() phase after
the guardband and the final state of crtc_state->has_psr are already
computed.

Use crtc_state->vrr.guardband and crtc_state->set_context_latency for
the computation and add more documentation for the dependency of first
sdp position, guardband, set context latency and wake lines.

Bspec:71041
Signed-off-by: Ankit Nautiyal <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_alpm.c | 28 +++++++++++++++--------
 drivers/gpu/drm/i915/display/intel_alpm.h |  6 ++---
 drivers/gpu/drm/i915/display/intel_dp.c   |  3 ++-
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_alpm.c 
b/drivers/gpu/drm/i915/display/intel_alpm.c
index 6372f533f65b..1c240dd8d668 100644
--- a/drivers/gpu/drm/i915/display/intel_alpm.c
+++ b/drivers/gpu/drm/i915/display/intel_alpm.c
@@ -248,14 +248,13 @@ bool intel_alpm_compute_params(struct intel_dp *intel_dp,
        return true;
 }
 
-void intel_alpm_lobf_compute_config(struct intel_dp *intel_dp,
-                                   struct intel_crtc_state *crtc_state,
-                                   struct drm_connector_state *conn_state)
+void intel_alpm_lobf_compute_config_late(struct intel_dp *intel_dp,
+                                        struct intel_crtc_state *crtc_state,
+                                        struct drm_connector_state *conn_state)
 {
        struct intel_display *display = to_intel_display(intel_dp);
        struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
        int waketime_in_lines, first_sdp_position;
-       int context_latency, guardband;
 
        if (intel_dp->alpm.lobf_disable_debug) {
                drm_dbg_kms(display->drm, "LOBF is disabled by debug flag\n");
@@ -288,17 +287,28 @@ void intel_alpm_lobf_compute_config(struct intel_dp 
*intel_dp,
        if (!intel_alpm_compute_params(intel_dp, crtc_state))
                return;
 
-       context_latency = adjusted_mode->crtc_vblank_start - 
adjusted_mode->crtc_vdisplay;
-       guardband = adjusted_mode->crtc_vtotal -
-                   adjusted_mode->crtc_vdisplay - context_latency;
+       /*
+        * LOBF can only be enabled if the time from the start of the 
SCL+Guardband
+        * window to the position of the first SDP is greater than the time it 
takes
+        * to wake the main link.
+        *
+        * Position of first sdp : vsync_start
+        * start of scl + guardband : vtotal - (scl + guardband)
+        * time in lines to wake main link : waketime_in_lines
+        *
+        * Position of first sdp - start of (scl + guardband) > time in lines 
to wake main link
+        * vsync_start - (vtotal - (scl + guardband)) > waketime_in_lines
+        * vsync_start - vtotal + scl + guardband > waketime_in_lines
+        * scl + guardband > waketime_in_lines + (vtotal - vsync_start)
+        */
        first_sdp_position = adjusted_mode->crtc_vtotal - 
adjusted_mode->crtc_vsync_start;
        if (intel_alpm_aux_less_wake_supported(intel_dp))
                waketime_in_lines = crtc_state->alpm_state.io_wake_lines;
        else
                waketime_in_lines = crtc_state->alpm_state.aux_less_wake_lines;
 
-       crtc_state->has_lobf = (context_latency + guardband) >
-               (first_sdp_position + waketime_in_lines);
+       crtc_state->has_lobf = (crtc_state->set_context_latency + 
crtc_state->vrr.guardband) >
+                              (first_sdp_position + waketime_in_lines);
 }
 
 static void lnl_alpm_configure(struct intel_dp *intel_dp,
diff --git a/drivers/gpu/drm/i915/display/intel_alpm.h 
b/drivers/gpu/drm/i915/display/intel_alpm.h
index 53599b464dea..138d56a499ee 100644
--- a/drivers/gpu/drm/i915/display/intel_alpm.h
+++ b/drivers/gpu/drm/i915/display/intel_alpm.h
@@ -18,9 +18,9 @@ struct intel_crtc;
 void intel_alpm_init(struct intel_dp *intel_dp);
 bool intel_alpm_compute_params(struct intel_dp *intel_dp,
                               struct intel_crtc_state *crtc_state);
-void intel_alpm_lobf_compute_config(struct intel_dp *intel_dp,
-                                   struct intel_crtc_state *crtc_state,
-                                   struct drm_connector_state *conn_state);
+void intel_alpm_lobf_compute_config_late(struct intel_dp *intel_dp,
+                                        struct intel_crtc_state *crtc_state,
+                                        struct drm_connector_state 
*conn_state);
 void intel_alpm_configure(struct intel_dp *intel_dp,
                          const struct intel_crtc_state *crtc_state);
 void intel_alpm_enable_sink(struct intel_dp *intel_dp,
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index d68a2cde15f1..176b0efb40f1 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3424,7 +3424,6 @@ intel_dp_compute_config(struct intel_encoder *encoder,
        intel_vrr_compute_config(pipe_config, conn_state);
        intel_dp_compute_as_sdp(intel_dp, pipe_config);
        intel_psr_compute_config(intel_dp, pipe_config, conn_state);
-       intel_alpm_lobf_compute_config(intel_dp, pipe_config, conn_state);
        intel_dp_drrs_compute_config(connector, pipe_config, link_bpp_x16);
        intel_dp_compute_vsc_sdp(intel_dp, pipe_config, conn_state);
        intel_dp_compute_hdr_metadata_infoframe_sdp(intel_dp, pipe_config, 
conn_state);
@@ -7028,6 +7027,8 @@ int intel_dp_compute_config_late(struct intel_encoder 
*encoder,
        if (ret)
                return ret;
 
+       intel_alpm_lobf_compute_config_late(intel_dp, crtc_state, conn_state);
+
        return 0;
 }
 
-- 
2.45.2

Reply via email to