Commit 187c236a authored by Jimmy Kizito's avatar Jimmy Kizito Committed by Alex Deucher

drm/amd/display: Implement DPIA link configuration

[Why]
Training settings need to be applied to DPIA link at start of each
training loop. Note: FEC readiness should be configured before link
training while FEC enablement should be configured once training is
complete.

[How]
- Implement DPIA link configuration function.
- Account for dynamically assigned link encoders during link
configuration.
Reviewed-by: default avatarJun Lei <Jun.Lei@amd.com>
Acked-by: default avatarWayne Lin <Wayne.Lin@amd.com>
Acked-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarJimmy Kizito <Jimmy.Kizito@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 178fbb6d
...@@ -30,6 +30,9 @@ ...@@ -30,6 +30,9 @@
#include "dc_link.h" #include "dc_link.h"
#include "dc_link_dp.h" #include "dc_link_dp.h"
#define DC_LOGGER \
link->ctx->logger
enum dc_status dpcd_get_tunneling_device_data(struct dc_link *link) enum dc_status dpcd_get_tunneling_device_data(struct dc_link *link)
{ {
/** @todo Read corresponding DPCD region and update link caps. */ /** @todo Read corresponding DPCD region and update link caps. */
...@@ -38,17 +41,51 @@ enum dc_status dpcd_get_tunneling_device_data(struct dc_link *link) ...@@ -38,17 +41,51 @@ enum dc_status dpcd_get_tunneling_device_data(struct dc_link *link)
/* Configure link as prescribed in link_setting; set LTTPR mode; and /* Configure link as prescribed in link_setting; set LTTPR mode; and
* Initialize link training settings. * Initialize link training settings.
* Abort link training if sink unplug detected.
*
* @param link DPIA link being trained.
* @param[in] link_setting Lane count, link rate and downspread control.
* @param[out] lt_settings Link settings and drive settings (voltage swing and pre-emphasis).
*/ */
static enum link_training_result dpia_configure_link(struct dc_link *link, static enum link_training_result dpia_configure_link(struct dc_link *link,
const struct dc_link_settings *link_setting, const struct dc_link_settings *link_setting,
struct link_training_settings *lt_settings) struct link_training_settings *lt_settings)
{ {
enum link_training_result result; enum dc_status status;
bool fec_enable;
/** @todo Fail until implemented. */
result = LINK_TRAINING_ABORT; DC_LOG_HW_LINK_TRAINING("%s\n DPIA(%d) configuring\n - LTTPR mode(%d)\n",
__func__,
return result; link->link_id.enum_id - ENUM_ID_1,
link->lttpr_mode);
dp_decide_training_settings(link,
link_setting,
lt_settings);
status = dpcd_configure_channel_coding(link, lt_settings);
if (status != DC_OK && !link->hpd_status)
return LINK_TRAINING_ABORT;
/* Configure lttpr mode */
status = dpcd_configure_lttpr_mode(link, lt_settings);
if (status != DC_OK && !link->hpd_status)
return LINK_TRAINING_ABORT;
/* Set link rate, lane count and spread. */
status = dpcd_set_link_settings(link, lt_settings);
if (status != DC_OK && !link->hpd_status)
return LINK_TRAINING_ABORT;
if (link->preferred_training_settings.fec_enable)
fec_enable = *link->preferred_training_settings.fec_enable;
else
fec_enable = true;
status = dp_set_fec_ready(link, fec_enable);
if (status != DC_OK && !link->hpd_status)
return LINK_TRAINING_ABORT;
return LINK_TRAINING_SUCCESS;
} }
/* Execute clock recovery phase of link training for specified hop in display /* Execute clock recovery phase of link training for specified hop in display
......
...@@ -428,6 +428,7 @@ void dcn31_link_encoder_enable_dp_output( ...@@ -428,6 +428,7 @@ void dcn31_link_encoder_enable_dp_output(
if (link) { if (link) {
dpia_control.dpia_id = link->ddc_hw_inst; dpia_control.dpia_id = link->ddc_hw_inst;
dpia_control.fec_rdy = link->fec_state == dc_link_fec_ready ? 1 : 0;
} else { } else {
DC_LOG_ERROR("%s: Failed to execute DPIA enable DMUB command.\n", __func__); DC_LOG_ERROR("%s: Failed to execute DPIA enable DMUB command.\n", __func__);
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
...@@ -469,6 +470,7 @@ void dcn31_link_encoder_enable_dp_mst_output( ...@@ -469,6 +470,7 @@ void dcn31_link_encoder_enable_dp_mst_output(
if (link) { if (link) {
dpia_control.dpia_id = link->ddc_hw_inst; dpia_control.dpia_id = link->ddc_hw_inst;
dpia_control.fec_rdy = link->fec_state == dc_link_fec_ready ? 1 : 0;
} else { } else {
DC_LOG_ERROR("%s: Failed to execute DPIA enable DMUB command.\n", __func__); DC_LOG_ERROR("%s: Failed to execute DPIA enable DMUB command.\n", __func__);
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment