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] v5: Reset alpm_dpcd and simplify source-supported check. v6: Drop display-version check for eDP for backward compatible. v7: - Read ALPM DPCD in detect only for DP, eDP already does it. [Jouni] - Move source-supported check into intel_alpm_init/_dpcd(). [Jouni] - Check source support instead of sink caps in intel_alpm_disable() as alpm_dpcd is reset on disconnect before the CRTC is disabled. [Sashiko]
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 | 19 ++++++++++++++++++- drivers/gpu/drm/i915/display/intel_dp.c | 9 ++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_alpm.c b/drivers/gpu/drm/i915/display/intel_alpm.c index cb1d68fef198..b6307862b756 100644 --- a/drivers/gpu/drm/i915/display/intel_alpm.c +++ b/drivers/gpu/drm/i915/display/intel_alpm.c @@ -43,11 +43,21 @@ bool intel_alpm_is_alpm_aux_less(struct intel_dp *intel_dp, (crtc_state->has_lobf && intel_alpm_aux_less_wake_supported(intel_dp)); } +static bool intel_alpm_source_supported(struct intel_dp *intel_dp) +{ + struct intel_display *display = to_intel_display(intel_dp); + + return intel_dp_is_edp(intel_dp) || DISPLAY_VER(display) >= 35; +} + int intel_alpm_init_dpcd(struct intel_dp *intel_dp) { u8 dpcd; int ret; + if (!intel_alpm_source_supported(intel_dp)) + return 0; + ret = drm_dp_dpcd_read_byte(&intel_dp->aux, DP_RECEIVER_ALPM_CAP, &dpcd); if (ret < 0) return ret; @@ -59,6 +69,9 @@ int intel_alpm_init_dpcd(struct intel_dp *intel_dp) void intel_alpm_init(struct intel_dp *intel_dp) { + if (!intel_alpm_source_supported(intel_dp)) + return; + mutex_init(&intel_dp->alpm.lock); } @@ -750,7 +763,11 @@ void intel_alpm_disable(struct intel_dp *intel_dp) struct intel_display *display = to_intel_display(intel_dp); enum transcoder cpu_transcoder = intel_dp->alpm.transcoder; - if (DISPLAY_VER(display) < 20 || !intel_dp->alpm_dpcd) + /* + * Don't check sink ALPM caps here, they are reset on disconnect + * before the CRTC is disabled. + */ + if (DISPLAY_VER(display) < 20 || !intel_alpm_source_supported(intel_dp)) return; mutex_lock(&intel_dp->alpm.lock); diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 816337efeb91..c543fe551eb8 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -6607,6 +6607,7 @@ intel_dp_detect(struct drm_connector *_connector, connector->dp.panel_replay_caps.su_support = false; connector->dp.panel_replay_caps.dsc_support = INTEL_DP_PANEL_REPLAY_DSC_NOT_SUPPORTED; + intel_dp->alpm_dpcd = 0; intel_dp_mst_disconnect(intel_dp); @@ -6629,8 +6630,10 @@ intel_dp_detect(struct drm_connector *_connector, if (ret == 1) connector->base.epoch_counter++; - if (!intel_dp_is_edp(intel_dp)) + if (!intel_dp_is_edp(intel_dp)) { + intel_alpm_init_dpcd(intel_dp); intel_psr_init_dpcd(intel_dp, connector); + } intel_dp_detect_dsc_caps(intel_dp, connector); @@ -7272,8 +7275,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); @@ -7488,6 +7489,8 @@ intel_dp_init_connector(struct intel_digital_port *dig_port, intel_psr_init(intel_dp); + intel_alpm_init(intel_dp); + return true; fail: -- 2.43.0
