Commit f1900a9b authored by Wenjing Liu's avatar Wenjing Liu Committed by Alex Deucher
Browse files

drm/amd/display: consider channel coding in configure lttpr mode



[why]
Some lttpr configuration steps are exclusive to 8b/10b channel
coding mode. We need to take channel conding into account.

Signed-off-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Reviewed-by: default avatarGeorge Shen <George.Shen@amd.com>
Acked-by: default avatarStylon Wang <stylon.wang@amd.com>
Acked-by: default avatarWesley Chalmers <Wesley.Chalmers@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 37f270c6
Loading
Loading
Loading
Loading
+29 −18
Original line number Diff line number Diff line
@@ -1275,6 +1275,8 @@ static inline void decide_8b_10b_training_settings(
	else
		lt_settings->link_settings.link_spread = LINK_SPREAD_05_DOWNSPREAD_30KHZ;

	lt_settings->lttpr_mode = link->lttpr_mode;

	/* Initialize lane settings overrides */
	if (overrides->voltage_swing != NULL)
		lt_settings->voltage_swing = overrides->voltage_swing;
@@ -1367,13 +1369,16 @@ static void configure_lttpr_mode_transparent(struct dc_link *link)
{
	uint8_t repeater_mode = DP_PHY_REPEATER_MODE_TRANSPARENT;

	DC_LOG_HW_LINK_TRAINING("%s\n Set LTTPR to Transparent Mode\n", __func__);
	core_link_write_dpcd(link,
			DP_PHY_REPEATER_MODE,
			(uint8_t *)&repeater_mode,
			sizeof(repeater_mode));
}

static void configure_lttpr_mode_non_transparent(struct dc_link *link)
static void configure_lttpr_mode_non_transparent(
		struct dc_link *link,
		const struct link_training_settings *lt_settings)
{
	/* aux timeout is already set to extended */
	/* RESET/SET lttpr mode to enable non transparent mode */
@@ -1383,12 +1388,17 @@ static void configure_lttpr_mode_non_transparent(struct dc_link *link)
	enum dc_status result = DC_ERROR_UNEXPECTED;
	uint8_t repeater_mode = DP_PHY_REPEATER_MODE_TRANSPARENT;

	enum dp_link_encoding encoding = dp_get_link_encoding_format(&lt_settings->link_settings);

	if (encoding == DP_8b_10b_ENCODING) {
		DC_LOG_HW_LINK_TRAINING("%s\n Set LTTPR to Transparent Mode\n", __func__);
		result = core_link_write_dpcd(link,
				DP_PHY_REPEATER_MODE,
				(uint8_t *)&repeater_mode,
				sizeof(repeater_mode));

	}

	if (result == DC_OK) {
		link->dpcd_caps.lttpr_caps.mode = repeater_mode;
	}
@@ -1407,8 +1417,8 @@ static void configure_lttpr_mode_non_transparent(struct dc_link *link)
			link->dpcd_caps.lttpr_caps.mode = repeater_mode;
		}

		if (encoding == DP_8b_10b_ENCODING) {
			repeater_cnt = dp_convert_to_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt);

			for (repeater_id = repeater_cnt; repeater_id > 0; repeater_id--) {
				aux_interval_address = DP_TRAINING_AUX_RD_INTERVAL_PHY_REPEATER1 +
							((DP_REPEATER_CONFIGURATION_AND_STATUS_SIZE) * (repeater_id - 1));
@@ -1421,6 +1431,7 @@ static void configure_lttpr_mode_non_transparent(struct dc_link *link)
			}
		}
	}
}

static void repeater_training_done(struct dc_link *link, uint32_t offset)
{
@@ -1611,7 +1622,7 @@ enum link_training_result dc_link_dp_perform_link_training(

	/* Configure lttpr mode */
	if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT)
		configure_lttpr_mode_non_transparent(link);
		configure_lttpr_mode_non_transparent(link, &lt_settings);
	else if (link->lttpr_mode == LTTPR_MODE_TRANSPARENT)
		configure_lttpr_mode_transparent(link);

+1 −0
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ struct link_training_settings {

	bool enhanced_framing;
	bool allow_invalid_msa_timing_param;
	enum lttpr_mode lttpr_mode;
};

/*TODO: Move this enum test harness*/