Initialize ALPM for DP2.1 and separate out ALPM mutex-init
from alpm-init.

v2: Separate out mutex-init. [Jani]
v3: Refactor further to avoid DISPLAY_VER check in multiple places. [Jani]
V4: Cosmetic changes. [Suraj]

Cc: Jouni Högander <[email protected]>
Reviewed-by: Suraj Kandpal <[email protected]>
Signed-off-by: Animesh Manna <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_alpm.c | 13 +++++++++++++
 drivers/gpu/drm/i915/display/intel_alpm.h |  1 +
 drivers/gpu/drm/i915/display/intel_dp.c   |  8 ++++++--
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_alpm.c 
b/drivers/gpu/drm/i915/display/intel_alpm.c
index 542900e29a01..08ad77cd32f8 100644
--- a/drivers/gpu/drm/i915/display/intel_alpm.c
+++ b/drivers/gpu/drm/i915/display/intel_alpm.c
@@ -43,6 +43,19 @@ bool intel_alpm_is_alpm_aux_less(struct intel_dp *intel_dp,
                (crtc_state->has_lobf && 
intel_alpm_aux_less_wake_supported(intel_dp));
 }
 
+bool intel_alpm_source_supported(struct intel_connector *connector)
+{
+       struct intel_display *display = to_intel_display(connector);
+
+       if (!((connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort 
&&
+              DISPLAY_VER(display) >= 35) ||
+           (connector->base.connector_type == DRM_MODE_CONNECTOR_eDP &&
+            DISPLAY_VER(display) >= 20)))
+               return false;
+
+       return true;
+}
+
 void intel_alpm_init_dpcd(struct intel_dp *intel_dp)
 {
        u8 dpcd;
diff --git a/drivers/gpu/drm/i915/display/intel_alpm.h 
b/drivers/gpu/drm/i915/display/intel_alpm.h
index fae68d557960..7280865ed5f0 100644
--- a/drivers/gpu/drm/i915/display/intel_alpm.h
+++ b/drivers/gpu/drm/i915/display/intel_alpm.h
@@ -15,6 +15,7 @@ struct intel_connector;
 struct intel_atomic_state;
 struct intel_crtc;
 
+bool intel_alpm_source_supported(struct intel_connector *connector);
 void intel_alpm_init_dpcd(struct intel_dp *intel_dp);
 void intel_alpm_init(struct intel_dp *intel_dp);
 bool intel_alpm_compute_params(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 77d516f0bd07..042c6e8b8e60 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -6343,6 +6343,9 @@ intel_dp_detect(struct drm_connector *_connector,
        if (ret == 1)
                connector->base.epoch_counter++;
 
+       if (intel_alpm_source_supported(connector))
+               intel_alpm_init_dpcd(intel_dp);
+
        if (!intel_dp_is_edp(intel_dp))
                intel_psr_init_dpcd(intel_dp, connector);
 
@@ -6986,8 +6989,6 @@ static bool intel_edp_init_connector(struct intel_dp 
*intel_dp,
         */
        intel_hpd_enable_detection(encoder);
 
-       intel_alpm_init(intel_dp);
-
        /* Cache DPCD and EDID for edp. */
        has_dpcd = intel_edp_init_dpcd(intel_dp, connector);
 
@@ -7202,6 +7203,9 @@ intel_dp_init_connector(struct intel_digital_port 
*dig_port,
 
        intel_psr_init(intel_dp);
 
+       if (intel_alpm_source_supported(connector))
+               intel_alpm_init(intel_dp);
+
        return true;
 
 fail:
-- 
2.29.0

Reply via email to