On Tue, 2026-08-25 at 11:15 +0530, Animesh Manna wrote:
> 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)))
See drivers/gpu/drm/i915/display/intel_psr.c::_psr_init_dpcd. There
PSR2 is depending on sink ALPM support. Is correct version >= 9 or
maybe this helper should be just dropped.
> + 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);
See my comment above. Sink DPCD capability could be read
unconditionally. If you want to keep this approach then you need to fix
intel_alpm_source_supported. Otherwise PSR2 breaks on display version <
20.
> +
> 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);
Same problem here. Another way could be to hide details into
intel_alpm_init and call intel_alpm_init unconditionally.
BR,
Jouni Högander
> +
> return true;
>
> fail: