The ALPM params are computed by alpm_config_valid() while computing the
PSR config and again by intel_alpm_lobf_compute_config() for LOBF.

Add intel_alpm_compute_config() which computes the ALPM params once
before the PSR config and records whether AUX wake and AUX-less ALPM
are possible in alpm_state.aux_wake_possible and
alpm_state.aux_less_possible. Do the LOBF compute from there as well.
alpm_config_valid() now uses these flags to choose between PSR, PSR2
and Panel Replay.

No functional change intended.

Suggested-by: Jouni Högander <[email protected]>
Cc: Jouni Högander <[email protected]>
Signed-off-by: Animesh Manna <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_alpm.c     | 33 +++++++++++++++----
 drivers/gpu/drm/i915/display/intel_alpm.h     |  6 +---
 .../drm/i915/display/intel_display_types.h    |  4 +++
 drivers/gpu/drm/i915/display/intel_dp.c       |  2 +-
 drivers/gpu/drm/i915/display/intel_psr.c      |  8 +++--
 5 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_alpm.c 
b/drivers/gpu/drm/i915/display/intel_alpm.c
index 3123296df6b2..65d06e8ebbe0 100644
--- a/drivers/gpu/drm/i915/display/intel_alpm.c
+++ b/drivers/gpu/drm/i915/display/intel_alpm.c
@@ -426,8 +426,8 @@ static int io_buffer_wake_time(const struct 
intel_crtc_state *crtc_state)
                return skl_io_buffer_wake_time();
 }
 
-bool intel_alpm_compute_params(struct intel_dp *intel_dp,
-                              struct intel_crtc_state *crtc_state)
+static bool intel_alpm_compute_params(struct intel_dp *intel_dp,
+                                     struct intel_crtc_state *crtc_state)
 {
        struct intel_display *display = to_intel_display(intel_dp);
        int io_wake_lines, io_wake_time, fast_wake_lines, fast_wake_time;
@@ -549,9 +549,8 @@ void intel_alpm_lobf_compute_config_late(struct intel_dp 
*intel_dp,
                               (first_sdp_position + waketime_in_lines);
 }
 
-void intel_alpm_lobf_compute_config(struct intel_dp *intel_dp,
-                                   struct intel_crtc_state *crtc_state,
-                                   struct drm_connector_state *conn_state)
+static void intel_alpm_lobf_compute_config(struct intel_dp *intel_dp,
+                                          struct intel_crtc_state *crtc_state)
 {
        struct intel_display *display = to_intel_display(intel_dp);
 
@@ -579,10 +578,32 @@ void intel_alpm_lobf_compute_config(struct intel_dp 
*intel_dp,
              intel_alpm_aux_less_wake_supported(intel_dp)))
                return;
 
+       crtc_state->has_lobf = true;
+}
+
+/*
+ * Compute the ALPM params and whether AUX wake / AUX-less ALPM is possible for
+ * the mode and the sink. PSR and Panel Replay use these to choose the feature.
+ */
+void intel_alpm_compute_config(struct intel_dp *intel_dp,
+                              struct intel_crtc_state *crtc_state)
+{
+       struct intel_display *display = to_intel_display(intel_dp);
+
+       if (!intel_dp_is_edp(intel_dp) && !intel_alpm_is_possible(intel_dp, 
crtc_state))
+               return;
+
        if (!intel_alpm_compute_params(intel_dp, crtc_state))
                return;
 
-       crtc_state->has_lobf = true;
+       crtc_state->alpm_state.aux_wake_possible = true;
+       crtc_state->alpm_state.aux_less_possible =
+               DISPLAY_VER(display) >= 20 &&
+               (intel_dp_is_edp(intel_dp) ||
+                (intel_alpm_is_possible(intel_dp, crtc_state) &&
+                 intel_alpm_aux_less_wake_supported(intel_dp)));
+
+       intel_alpm_lobf_compute_config(intel_dp, crtc_state);
 }
 
 static u32 get_pr_alpm_as_sdp_transmission_time(const struct intel_crtc_state 
*crtc_state)
diff --git a/drivers/gpu/drm/i915/display/intel_alpm.h 
b/drivers/gpu/drm/i915/display/intel_alpm.h
index 24c319bc5eff..be9b4d761c13 100644
--- a/drivers/gpu/drm/i915/display/intel_alpm.h
+++ b/drivers/gpu/drm/i915/display/intel_alpm.h
@@ -10,7 +10,6 @@
 
 struct intel_dp;
 struct intel_crtc_state;
-struct drm_connector_state;
 struct intel_connector;
 struct intel_atomic_state;
 struct intel_crtc;
@@ -19,11 +18,8 @@ int intel_alpm_init_dpcd(struct intel_dp *intel_dp);
 void intel_alpm_init(struct intel_dp *intel_dp);
 bool intel_alpm_is_possible(struct intel_dp *intel_dp,
                            const struct intel_crtc_state *crtc_state);
-bool intel_alpm_compute_params(struct intel_dp *intel_dp,
+void intel_alpm_compute_config(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_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_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 82a63a2e7fa3..ce7dc3375f2e 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1470,6 +1470,10 @@ struct intel_crtc_state {
                u8 silence_period_sym_clocks;
                u8 lfps_half_cycle_num_of_syms;
                int switch_to_active;
+
+               /* ALPM params are valid for the mode and the sink */
+               bool aux_wake_possible;
+               bool aux_less_possible;
        } alpm_state;
 
        /* to track changes in plane color blocks */
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index c543fe551eb8..7827de39e826 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3822,9 +3822,9 @@ intel_dp_compute_config(struct intel_atomic_state *state,
                pipe_config->dp_m_n.data_m *= pipe_config->splitter.link_count;
 
        intel_vrr_compute_config(pipe_config, conn_state);
+       intel_alpm_compute_config(intel_dp, pipe_config);
        intel_psr_compute_config(intel_dp, pipe_config, conn_state);
        intel_dp_compute_as_sdp(intel_dp, pipe_config);
-       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);
diff --git a/drivers/gpu/drm/i915/display/intel_psr.c 
b/drivers/gpu/drm/i915/display/intel_psr.c
index 4ae47d33096a..c00ec3f64202 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -1462,16 +1462,18 @@ static bool wake_lines_fit_into_vblank(struct intel_dp 
*intel_dp,
 }
 
 static bool alpm_config_valid(struct intel_dp *intel_dp,
-                             struct intel_crtc_state *crtc_state,
+                             const struct intel_crtc_state *crtc_state,
                              bool aux_less,
                              bool needs_panel_replay,
                              bool needs_sel_update)
 {
        struct intel_display *display = to_intel_display(intel_dp);
+       bool alpm_possible = aux_less ? 
crtc_state->alpm_state.aux_less_possible :
+                                       
crtc_state->alpm_state.aux_wake_possible;
 
-       if (!intel_alpm_compute_params(intel_dp, crtc_state)) {
+       if (!alpm_possible) {
                drm_dbg_kms(display->drm,
-                           "PSR2/Panel Replay  not enabled, Unable to use long 
enough wake times\n");
+                           "PSR2/Panel Replay not enabled, ALPM not 
possible\n");
                return false;
        }
 
-- 
2.43.0

Reply via email to