Commit 5e771547 authored by Abel Vesa's avatar Abel Vesa Committed by Dmitry Baryshkov
Browse files

drm/dp: Add helper to set LTTPRs in transparent mode



According to the DisplayPort standard, LTTPRs have two operating
modes:
 - non-transparent - it replies to DPCD LTTPR field specific AUX
   requests, while passes through all other AUX requests
 - transparent - it passes through all AUX requests.

Switching between this two modes is done by the DPTX by issuing
an AUX write to the DPCD PHY_REPEATER_MODE register.

Add a generic helper that allows switching between these modes.

Also add a generic wrapper for the helper that handles the explicit
disabling of non-transparent mode and its disable->enable sequence
mentioned in the DP Standard v2.0 section 3.6.6.1. Do this in order
to move this handling out of the vendor specific driver implementation
into the generic framework.

Tested-by: default avatarJohan Hovold <johan+linaro@kernel.org>
Reviewed-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: default avatarJohan Hovold <johan+linaro@kernel.org>
Reviewed-by: default avatarAbhinav Kumar <quic_abhinavk@quicinc.com>
Signed-off-by: default avatarAbel Vesa <abel.vesa@linaro.org>
Acked-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250203-drm-dp-msm-add-lttpr-transparent-mode-set-v5-1-c865d0e56d6e@linaro.org


Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
parent 13037730
Loading
Loading
Loading
Loading
+61 −0
Original line number Diff line number Diff line
@@ -2875,6 +2875,67 @@ int drm_dp_lttpr_max_link_rate(const u8 caps[DP_LTTPR_COMMON_CAP_SIZE])
}
EXPORT_SYMBOL(drm_dp_lttpr_max_link_rate);

/**
 * drm_dp_lttpr_set_transparent_mode() - set the LTTPR in transparent mode
 * @aux: DisplayPort AUX channel
 * @enable: Enable or disable transparent mode
 *
 * Returns: 0 on success or a negative error code on failure.
 */
int drm_dp_lttpr_set_transparent_mode(struct drm_dp_aux *aux, bool enable)
{
	u8 val = enable ? DP_PHY_REPEATER_MODE_TRANSPARENT :
			  DP_PHY_REPEATER_MODE_NON_TRANSPARENT;
	int ret = drm_dp_dpcd_writeb(aux, DP_PHY_REPEATER_MODE, val);

	if (ret < 0)
		return ret;

	return (ret == 1) ? 0 : -EIO;
}
EXPORT_SYMBOL(drm_dp_lttpr_set_transparent_mode);

/**
 * drm_dp_lttpr_init() - init LTTPR transparency mode according to DP standard
 * @aux: DisplayPort AUX channel
 * @lttpr_count: Number of LTTPRs. Between 0 and 8, according to DP standard.
 *               Negative error code for any non-valid number.
 *               See drm_dp_lttpr_count().
 *
 * Returns: 0 on success or a negative error code on failure.
 */
int drm_dp_lttpr_init(struct drm_dp_aux *aux, int lttpr_count)
{
	int ret;

	if (!lttpr_count)
		return 0;

	/*
	 * See DP Standard v2.0 3.6.6.1 about the explicit disabling of
	 * non-transparent mode and the disable->enable non-transparent mode
	 * sequence.
	 */
	ret = drm_dp_lttpr_set_transparent_mode(aux, true);
	if (ret)
		return ret;

	if (lttpr_count < 0)
		return -ENODEV;

	if (drm_dp_lttpr_set_transparent_mode(aux, false)) {
		/*
		 * Roll-back to transparent mode if setting non-transparent
		 * mode has failed
		 */
		drm_dp_lttpr_set_transparent_mode(aux, true);
		return -EINVAL;
	}

	return 0;
}
EXPORT_SYMBOL(drm_dp_lttpr_init);

/**
 * drm_dp_lttpr_max_lane_count - get the maximum lane count supported by all LTTPRs
 * @caps: LTTPR common capabilities
+2 −0
Original line number Diff line number Diff line
@@ -630,6 +630,8 @@ int drm_dp_read_lttpr_phy_caps(struct drm_dp_aux *aux,
			       u8 caps[DP_LTTPR_PHY_CAP_SIZE]);
int drm_dp_lttpr_count(const u8 cap[DP_LTTPR_COMMON_CAP_SIZE]);
int drm_dp_lttpr_max_link_rate(const u8 caps[DP_LTTPR_COMMON_CAP_SIZE]);
int drm_dp_lttpr_set_transparent_mode(struct drm_dp_aux *aux, bool enable);
int drm_dp_lttpr_init(struct drm_dp_aux *aux, int lttpr_count);
int drm_dp_lttpr_max_lane_count(const u8 caps[DP_LTTPR_COMMON_CAP_SIZE]);
bool drm_dp_lttpr_voltage_swing_level_3_supported(const u8 caps[DP_LTTPR_PHY_CAP_SIZE]);
bool drm_dp_lttpr_pre_emphasis_level_3_supported(const u8 caps[DP_LTTPR_PHY_CAP_SIZE]);