drm/amd/display: Implement end of training for hop in DPIA display path
[Why & How] Clear training pattern sequence for hop in display path once clock recovery and equalization phases of DP tunnel link training completed. Reviewed-by: Jun Lei <Jun.Lei@amd.com> Acked-by: Wayne Lin <Wayne.Lin@amd.com> Acked-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Acked-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Jimmy Kizito <Jimmy.Kizito@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
847a9038c2
commit
80789bcffe
|
@ -2389,14 +2389,21 @@ bool perform_link_training_with_retries(
|
|||
dc_link_dp_perform_link_training_skip_aux(link, ¤t_setting);
|
||||
return true;
|
||||
} else {
|
||||
if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA)
|
||||
/** @todo Consolidate USB4 DP and DPx.x training. */
|
||||
if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) {
|
||||
status = dc_link_dpia_perform_link_training(link,
|
||||
¤t_setting,
|
||||
skip_video_pattern);
|
||||
else
|
||||
|
||||
/* Transmit idle pattern once training successful. */
|
||||
if (status == LINK_TRAINING_SUCCESS)
|
||||
dp_set_hw_test_pattern(link, DP_TEST_PATTERN_VIDEO_MODE,
|
||||
NULL, 0);
|
||||
} else {
|
||||
status = dc_link_dp_perform_link_training(link,
|
||||
¤t_setting,
|
||||
skip_video_pattern);
|
||||
}
|
||||
|
||||
if (status == LINK_TRAINING_SUCCESS)
|
||||
return true;
|
||||
|
|
|
@ -737,13 +737,84 @@ static enum link_training_result dpia_training_eq_phase(struct dc_link *link,
|
|||
}
|
||||
|
||||
/* End training of specified hop in display path. */
|
||||
static enum dc_status dpcd_clear_lt_pattern(struct dc_link *link, uint32_t hop)
|
||||
{
|
||||
union dpcd_training_pattern dpcd_pattern = { {0} };
|
||||
uint32_t dpcd_tps_offset = DP_TRAINING_PATTERN_SET;
|
||||
enum dc_status status;
|
||||
|
||||
if (hop != DPRX)
|
||||
dpcd_tps_offset = DP_TRAINING_PATTERN_SET_PHY_REPEATER1 +
|
||||
((DP_REPEATER_CONFIGURATION_AND_STATUS_SIZE) * (hop - 1));
|
||||
|
||||
status = core_link_write_dpcd(link,
|
||||
DP_TRAINING_PATTERN_SET,
|
||||
&dpcd_pattern.raw,
|
||||
sizeof(dpcd_pattern.raw));
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/* End training of specified hop in display path.
|
||||
*
|
||||
* In transparent LTTPR mode:
|
||||
* - driver clears training pattern for the specified hop in DPCD.
|
||||
* In non-transparent LTTPR mode:
|
||||
* - in addition to clearing training pattern, driver issues USB4 tunneling
|
||||
* (SET_CONFIG) messages to notify DPOA when training is done for first hop
|
||||
* (DPTX-to-DPIA) and last hop (DPRX).
|
||||
*
|
||||
* @param link DPIA link being trained.
|
||||
* @param hop The Hop in display path. DPRX = 0.
|
||||
*/
|
||||
static enum link_training_result dpia_training_end(struct dc_link *link,
|
||||
uint32_t hop)
|
||||
{
|
||||
enum link_training_result result;
|
||||
enum link_training_result result = LINK_TRAINING_SUCCESS;
|
||||
uint8_t repeater_cnt = 0; /* Number of hops/repeaters in display path. */
|
||||
enum dc_status status;
|
||||
|
||||
/** @todo Fail until implemented. */
|
||||
if (link->lttpr_mode == LTTPR_MODE_NON_TRANSPARENT) {
|
||||
repeater_cnt = dp_convert_to_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt);
|
||||
|
||||
if (hop == repeater_cnt) { /* DPTX-to-DPIA */
|
||||
/* Send SET_CONFIG(SET_TRAINING:0xff) to notify DPOA that
|
||||
* DPTX-to-DPIA hop trained. No DPCD write needed for first hop.
|
||||
*/
|
||||
status = core_link_send_set_config(link,
|
||||
DPIA_SET_CFG_SET_TRAINING,
|
||||
DPIA_TS_UFP_DONE);
|
||||
if (status != DC_OK)
|
||||
result = LINK_TRAINING_ABORT;
|
||||
} else { /* DPOA-to-x */
|
||||
/* Write 0x0 to TRAINING_PATTERN_SET */
|
||||
status = dpcd_clear_lt_pattern(link, hop);
|
||||
if (status != DC_OK)
|
||||
result = LINK_TRAINING_ABORT;
|
||||
}
|
||||
|
||||
/* Notify DPOA that non-transparent link training of DPRX done. */
|
||||
if (hop == DPRX && result != LINK_TRAINING_ABORT) {
|
||||
status = core_link_send_set_config(link,
|
||||
DPIA_SET_CFG_SET_TRAINING,
|
||||
DPIA_TS_DPRX_DONE);
|
||||
if (status != DC_OK)
|
||||
result = LINK_TRAINING_ABORT;
|
||||
}
|
||||
|
||||
} else { /* non-LTTPR or transparent LTTPR. */
|
||||
/* Write 0x0 to TRAINING_PATTERN_SET */
|
||||
status = dpcd_clear_lt_pattern(link, hop);
|
||||
if (status != DC_OK)
|
||||
result = LINK_TRAINING_ABORT;
|
||||
}
|
||||
|
||||
DC_LOG_HW_LINK_TRAINING("%s\n DPIA(%d) end\n - hop(%d)\n - result(%d)\n - LTTPR mode(%d)\n",
|
||||
__func__,
|
||||
link->link_id.enum_id - ENUM_ID_1,
|
||||
hop,
|
||||
result,
|
||||
link->lttpr_mode);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue