aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3403-drm-amd-display-Synchronous-DisplayPort-Link-Trainin.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3403-drm-amd-display-Synchronous-DisplayPort-Link-Trainin.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3403-drm-amd-display-Synchronous-DisplayPort-Link-Trainin.patch622
1 files changed, 622 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3403-drm-amd-display-Synchronous-DisplayPort-Link-Trainin.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3403-drm-amd-display-Synchronous-DisplayPort-Link-Trainin.patch
new file mode 100644
index 00000000..0aadd3bd
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3403-drm-amd-display-Synchronous-DisplayPort-Link-Trainin.patch
@@ -0,0 +1,622 @@
+From 3ad3e128c0b59e0b90a75a758470c275e3a64b70 Mon Sep 17 00:00:00 2001
+From: David Galiffi <david.galiffi@amd.com>
+Date: Mon, 24 Jun 2019 10:34:13 -0400
+Subject: [PATCH 3403/4256] drm/amd/display: Synchronous DisplayPort Link
+ Training
+
+[WHY]
+We require a method to perform synchronous link training.
+
+[HOW]
+Sync LT is broken into 3 basic steps.
+"Begin" starts the state machine, and resets "preferred" link settings.
+"Attempt" will attempt to train the link with a given set of training
+parameters.
+"End" stops the state machine, and will optionally disable the link phy.
+Between "Begin" and "End" DPCD:600h must not be set to "2"
+(D3:Powered Down).
+Between "Begin" and "End", there may be multiple "Attempts" with different
+training parameters.
+
+Signed-off-by: David Galiffi <david.galiffi@amd.com>
+Reviewed-by: Jun Lei <Jun.Lei@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_link.c | 53 +---
+ .../gpu/drm/amd/display/dc/core/dc_link_dp.c | 293 ++++++++++++++++--
+ .../drm/amd/display/dc/core/dc_link_hwss.c | 43 +--
+ drivers/gpu/drm/amd/display/dc/dc_dp_types.h | 3 +
+ drivers/gpu/drm/amd/display/dc/dc_link.h | 10 +
+ .../gpu/drm/amd/display/dc/inc/dc_link_dp.h | 3 +
+ .../gpu/drm/amd/display/dc/inc/link_hwss.h | 2 -
+ 7 files changed, 282 insertions(+), 125 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+index 333ce7a5d89c..ed8bdcf44c8e 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+@@ -1385,57 +1385,6 @@ void link_destroy(struct dc_link **link)
+ *link = NULL;
+ }
+
+-static void dpcd_configure_panel_mode(
+- struct dc_link *link,
+- enum dp_panel_mode panel_mode)
+-{
+- union dpcd_edp_config edp_config_set;
+- bool panel_mode_edp = false;
+- DC_LOGGER_INIT(link->ctx->logger);
+-
+- memset(&edp_config_set, '\0', sizeof(union dpcd_edp_config));
+-
+- if (DP_PANEL_MODE_DEFAULT != panel_mode) {
+-
+- switch (panel_mode) {
+- case DP_PANEL_MODE_EDP:
+- case DP_PANEL_MODE_SPECIAL:
+- panel_mode_edp = true;
+- break;
+-
+- default:
+- break;
+- }
+-
+- /*set edp panel mode in receiver*/
+- core_link_read_dpcd(
+- link,
+- DP_EDP_CONFIGURATION_SET,
+- &edp_config_set.raw,
+- sizeof(edp_config_set.raw));
+-
+- if (edp_config_set.bits.PANEL_MODE_EDP
+- != panel_mode_edp) {
+- enum ddc_result result = DDC_RESULT_UNKNOWN;
+-
+- edp_config_set.bits.PANEL_MODE_EDP =
+- panel_mode_edp;
+- result = core_link_write_dpcd(
+- link,
+- DP_EDP_CONFIGURATION_SET,
+- &edp_config_set.raw,
+- sizeof(edp_config_set.raw));
+-
+- ASSERT(result == DDC_RESULT_SUCESSFULL);
+- }
+- }
+- DC_LOG_DETECTION_DP_CAPS("Link: %d eDP panel mode supported: %d "
+- "eDP panel mode enabled: %d \n",
+- link->link_index,
+- link->dpcd_caps.panel_mode_edp,
+- panel_mode_edp);
+-}
+-
+ static void enable_stream_features(struct pipe_ctx *pipe_ctx)
+ {
+ struct dc_stream_state *stream = pipe_ctx->stream;
+@@ -1506,7 +1455,7 @@ static enum dc_status enable_link_dp(
+ }
+
+ panel_mode = dp_get_panel_mode(link);
+- dpcd_configure_panel_mode(link, panel_mode);
++ dp_set_panel_mode(link, panel_mode);
+
+ skip_video_pattern = true;
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+index 08bd9c96b9b0..8e66b2e9d6af 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+@@ -965,6 +965,7 @@ static inline enum link_training_result perform_link_training_int(
+ static void initialize_training_settings(
+ struct dc_link *link,
+ const struct dc_link_settings *link_setting,
++ const struct dc_link_training_overrides *overrides,
+ struct link_training_settings *lt_settings)
+ {
+ uint32_t lane;
+@@ -997,23 +998,23 @@ static void initialize_training_settings(
+ /* Initialize link spread */
+ if (link->dp_ss_off)
+ lt_settings->link_settings.link_spread = LINK_SPREAD_DISABLED;
+- else if (link->preferred_training_settings.downspread != NULL)
++ else if (overrides->downspread != NULL)
+ lt_settings->link_settings.link_spread
+- = *link->preferred_training_settings.downspread
++ = *overrides->downspread
+ ? LINK_SPREAD_05_DOWNSPREAD_30KHZ
+ : LINK_SPREAD_DISABLED;
+ else
+ lt_settings->link_settings.link_spread = LINK_SPREAD_05_DOWNSPREAD_30KHZ;
+
+ /* Initialize lane settings overrides */
+- if (link->preferred_training_settings.voltage_swing != NULL)
+- lt_settings->voltage_swing = link->preferred_training_settings.voltage_swing;
++ if (overrides->voltage_swing != NULL)
++ lt_settings->voltage_swing = overrides->voltage_swing;
+
+- if (link->preferred_training_settings.pre_emphasis != NULL)
+- lt_settings->pre_emphasis = link->preferred_training_settings.pre_emphasis;
++ if (overrides->pre_emphasis != NULL)
++ lt_settings->pre_emphasis = overrides->pre_emphasis;
+
+- if (link->preferred_training_settings.post_cursor2 != NULL)
+- lt_settings->post_cursor2 = link->preferred_training_settings.post_cursor2;
++ if (overrides->post_cursor2 != NULL)
++ lt_settings->post_cursor2 = overrides->post_cursor2;
+
+ /* Initialize lane settings (VS/PE/PC2) */
+ for (lane = 0; lane < LANE_COUNT_DP_MAX; lane++) {
+@@ -1032,23 +1033,23 @@ static void initialize_training_settings(
+ }
+
+ /* Initialize training timings */
+- if (link->preferred_training_settings.cr_pattern_time != NULL)
+- lt_settings->cr_pattern_time = *link->preferred_training_settings.cr_pattern_time;
++ if (overrides->cr_pattern_time != NULL)
++ lt_settings->cr_pattern_time = *overrides->cr_pattern_time;
+ else
+- lt_settings->cr_pattern_time = 100;
++ lt_settings->cr_pattern_time = get_training_aux_rd_interval(link, 100);
+
+- if (link->preferred_training_settings.eq_pattern_time != NULL)
+- lt_settings->eq_pattern_time = *link->preferred_training_settings.eq_pattern_time;
++ if (overrides->eq_pattern_time != NULL)
++ lt_settings->eq_pattern_time = *overrides->eq_pattern_time;
+ else
+ lt_settings->eq_pattern_time = get_training_aux_rd_interval(link, 400);
+
+- if (link->preferred_training_settings.pattern_for_eq != NULL)
+- lt_settings->pattern_for_eq = *link->preferred_training_settings.pattern_for_eq;
++ if (overrides->pattern_for_eq != NULL)
++ lt_settings->pattern_for_eq = *overrides->pattern_for_eq;
+ else
+ lt_settings->pattern_for_eq = get_supported_tp(link);
+
+- if (link->preferred_training_settings.enhanced_framing != NULL)
+- lt_settings->enhanced_framing = *link->preferred_training_settings.enhanced_framing;
++ if (overrides->enhanced_framing != NULL)
++ lt_settings->enhanced_framing = *overrides->enhanced_framing;
+ else
+ lt_settings->enhanced_framing = 1;
+ }
+@@ -1139,7 +1140,11 @@ bool dc_link_dp_perform_link_training_skip_aux(
+ struct link_training_settings lt_settings;
+ enum dc_dp_training_pattern pattern_for_cr = DP_TRAINING_PATTERN_SEQUENCE_1;
+
+- initialize_training_settings(link, link_setting, &lt_settings);
++ initialize_training_settings(
++ link,
++ link_setting,
++ &link->preferred_training_settings,
++ &lt_settings);
+
+ /* 1. Perform_clock_recovery_sequence. */
+
+@@ -1184,7 +1189,11 @@ enum link_training_result dc_link_dp_perform_link_training(
+ bool fec_enable;
+ #endif
+
+- initialize_training_settings(link, link_setting, &lt_settings);
++ initialize_training_settings(
++ link,
++ link_setting,
++ &link->preferred_training_settings,
++ &lt_settings);
+
+ /* 1. set link rate, lane count and spread. */
+ dpcd_set_link_settings(link, &lt_settings);
+@@ -1247,6 +1256,146 @@ bool perform_link_training_with_retries(
+ return false;
+ }
+
++static enum clock_source_id get_clock_source_id(struct dc_link *link)
++{
++ enum clock_source_id dp_cs_id = CLOCK_SOURCE_ID_UNDEFINED;
++ struct clock_source *dp_cs = link->dc->res_pool->dp_clock_source;
++
++ if (dp_cs != NULL) {
++ dp_cs_id = dp_cs->id;
++ } else {
++ /*
++ * dp clock source is not initialized for some reason.
++ * Should not happen, CLOCK_SOURCE_ID_EXTERNAL will be used
++ */
++ ASSERT(dp_cs);
++ }
++
++ return dp_cs_id;
++}
++
++static void set_dp_mst_mode(struct dc_link *link, bool mst_enable)
++{
++ if (mst_enable == false &&
++ link->type == dc_connection_mst_branch) {
++ /* Disable MST on link. Use only local sink. */
++ dp_disable_link_phy_mst(link, link->connector_signal);
++
++ link->type = dc_connection_single;
++ link->local_sink = link->remote_sinks[0];
++ link->local_sink->sink_signal = SIGNAL_TYPE_DISPLAY_PORT;
++ } else if (mst_enable == true &&
++ link->type == dc_connection_single &&
++ link->remote_sinks[0] != NULL) {
++ /* Re-enable MST on link. */
++ dp_disable_link_phy(link, link->connector_signal);
++ dp_enable_mst_on_sink(link, true);
++
++ link->type = dc_connection_mst_branch;
++ link->local_sink->sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST;
++ }
++}
++
++bool dc_link_dp_sync_lt_begin(struct dc_link *link)
++{
++ /* Begin Sync LT. During this time,
++ * DPCD:600h must not be powered down.
++ */
++ link->sync_lt_in_progress = true;
++
++ /*Clear any existing preferred settings.*/
++ memset(&link->preferred_training_settings, 0,
++ sizeof(struct dc_link_training_overrides));
++ memset(&link->preferred_link_setting, 0,
++ sizeof(struct dc_link_settings));
++
++ return true;
++}
++
++enum link_training_result dc_link_dp_sync_lt_attempt(
++ struct dc_link *link,
++ struct dc_link_settings *link_settings,
++ struct dc_link_training_overrides *lt_overrides)
++{
++ struct link_training_settings lt_settings;
++ enum link_training_result lt_status = LINK_TRAINING_SUCCESS;
++ enum dp_panel_mode panel_mode = DP_PANEL_MODE_DEFAULT;
++ enum clock_source_id dp_cs_id = CLOCK_SOURCE_ID_EXTERNAL;
++#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
++ bool fec_enable = false;
++#endif
++
++ initialize_training_settings(
++ link,
++ link_settings,
++ lt_overrides,
++ &lt_settings);
++
++ /* Setup MST Mode */
++ if (lt_overrides->mst_enable)
++ set_dp_mst_mode(link, *lt_overrides->mst_enable);
++
++ /* Disable link */
++ dp_disable_link_phy(link, link->connector_signal);
++
++ /* Enable link */
++ dp_cs_id = get_clock_source_id(link);
++ dp_enable_link_phy(link, link->connector_signal,
++ dp_cs_id, link_settings);
++
++#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
++ /* Set FEC enable */
++ fec_enable = lt_overrides->fec_enable && *lt_overrides->fec_enable;
++ dp_set_fec_ready(link, fec_enable);
++#endif
++
++ if (lt_overrides->alternate_scrambler_reset) {
++ if (*lt_overrides->alternate_scrambler_reset)
++ panel_mode = DP_PANEL_MODE_EDP;
++ else
++ panel_mode = DP_PANEL_MODE_DEFAULT;
++ } else
++ panel_mode = dp_get_panel_mode(link);
++
++ dp_set_panel_mode(link, panel_mode);
++
++ /* Attempt to train with given link training settings */
++
++ /* Set link rate, lane count and spread. */
++ dpcd_set_link_settings(link, &lt_settings);
++
++ /* 2. perform link training (set link training done
++ * to false is done as well)
++ */
++ lt_status = perform_clock_recovery_sequence(link, &lt_settings);
++ if (lt_status == LINK_TRAINING_SUCCESS) {
++ lt_status = perform_channel_equalization_sequence(link,
++ &lt_settings);
++ }
++
++ /* 3. Sync LT must skip TRAINING_PATTERN_SET:0 (video pattern)*/
++ /* 4. print status message*/
++ print_status_message(link, &lt_settings, lt_status);
++
++ return lt_status;
++}
++
++bool dc_link_dp_sync_lt_end(struct dc_link *link, bool link_down)
++{
++ /* If input parameter is set, shut down phy.
++ * Still shouldn't turn off dp_receiver (DPCD:600h)
++ */
++ if (link_down == true) {
++ dp_disable_link_phy(link, link->connector_signal);
++#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
++ dp_set_fec_ready(link, false);
++#endif
++ }
++
++ link->sync_lt_in_progress = false;
++ return true;
++}
++
+ static struct dc_link_settings get_max_link_cap(struct dc_link *link)
+ {
+ /* Set Default link settings */
+@@ -1401,7 +1550,6 @@ bool dp_verify_link_cap(
+ bool success;
+ bool skip_link_training;
+ bool skip_video_pattern;
+- struct clock_source *dp_cs;
+ enum clock_source_id dp_cs_id = CLOCK_SOURCE_ID_EXTERNAL;
+ enum link_training_result status;
+ union hpd_irq_data irq_data;
+@@ -1425,17 +1573,7 @@ bool dp_verify_link_cap(
+ /* disable PHY done possible by BIOS, will be done by driver itself */
+ dp_disable_link_phy(link, link->connector_signal);
+
+- dp_cs = link->dc->res_pool->dp_clock_source;
+-
+- if (dp_cs)
+- dp_cs_id = dp_cs->id;
+- else {
+- /*
+- * dp clock source is not initialized for some reason.
+- * Should not happen, CLOCK_SOURCE_ID_EXTERNAL will be used
+- */
+- ASSERT(dp_cs);
+- }
++ dp_cs_id = get_clock_source_id(link);
+
+ /* link training starts with the maximum common settings
+ * supported by both sink and ASIC.
+@@ -2307,6 +2445,11 @@ bool is_mst_supported(struct dc_link *link)
+ union dpcd_rev rev;
+ union mstm_cap cap;
+
++ if (link->preferred_training_settings.mst_enable &&
++ *link->preferred_training_settings.mst_enable == false) {
++ return false;
++ }
++
+ rev.raw = 0;
+ cap.raw = 0;
+
+@@ -3158,6 +3301,94 @@ void dp_enable_mst_on_sink(struct dc_link *link, bool enable)
+ core_link_write_dpcd(link, DP_MSTM_CTRL, &mstmCntl, 1);
+ }
+
++void dp_set_panel_mode(struct dc_link *link, enum dp_panel_mode panel_mode)
++{
++ union dpcd_edp_config edp_config_set;
++ bool panel_mode_edp = false;
++
++ memset(&edp_config_set, '\0', sizeof(union dpcd_edp_config));
++
++ if (panel_mode != DP_PANEL_MODE_DEFAULT) {
++
++ switch (panel_mode) {
++ case DP_PANEL_MODE_EDP:
++ case DP_PANEL_MODE_SPECIAL:
++ panel_mode_edp = true;
++ break;
++
++ default:
++ break;
++ }
++
++ /*set edp panel mode in receiver*/
++ core_link_read_dpcd(
++ link,
++ DP_EDP_CONFIGURATION_SET,
++ &edp_config_set.raw,
++ sizeof(edp_config_set.raw));
++
++ if (edp_config_set.bits.PANEL_MODE_EDP
++ != panel_mode_edp) {
++ enum ddc_result result = DDC_RESULT_UNKNOWN;
++
++ edp_config_set.bits.PANEL_MODE_EDP =
++ panel_mode_edp;
++ result = core_link_write_dpcd(
++ link,
++ DP_EDP_CONFIGURATION_SET,
++ &edp_config_set.raw,
++ sizeof(edp_config_set.raw));
++
++ ASSERT(result == DDC_RESULT_SUCESSFULL);
++ }
++ }
++ DC_LOG_DETECTION_DP_CAPS("Link: %d eDP panel mode supported: %d "
++ "eDP panel mode enabled: %d \n",
++ link->link_index,
++ link->dpcd_caps.panel_mode_edp,
++ panel_mode_edp);
++}
++
++enum dp_panel_mode dp_get_panel_mode(struct dc_link *link)
++{
++ /* We need to explicitly check that connector
++ * is not DP. Some Travis_VGA get reported
++ * by video bios as DP.
++ */
++ if (link->connector_signal != SIGNAL_TYPE_DISPLAY_PORT) {
++
++ switch (link->dpcd_caps.branch_dev_id) {
++ case DP_BRANCH_DEVICE_ID_2:
++ if (strncmp(
++ link->dpcd_caps.branch_dev_name,
++ DP_VGA_LVDS_CONVERTER_ID_2,
++ sizeof(
++ link->dpcd_caps.
++ branch_dev_name)) == 0) {
++ return DP_PANEL_MODE_SPECIAL;
++ }
++ break;
++ case DP_BRANCH_DEVICE_ID_3:
++ if (strncmp(link->dpcd_caps.branch_dev_name,
++ DP_VGA_LVDS_CONVERTER_ID_3,
++ sizeof(
++ link->dpcd_caps.
++ branch_dev_name)) == 0) {
++ return DP_PANEL_MODE_SPECIAL;
++ }
++ break;
++ default:
++ break;
++ }
++ }
++
++ if (link->dpcd_caps.panel_mode_edp) {
++ return DP_PANEL_MODE_EDP;
++ }
++
++ return DP_PANEL_MODE_DEFAULT;
++}
++
+ #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
+ void dp_set_fec_ready(struct dc_link *link, bool ready)
+ {
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
+index 878f47b59d5a..daaff7319413 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
+@@ -55,6 +55,9 @@ void dp_receiver_power_ctrl(struct dc_link *link, bool on)
+
+ state = on ? DP_POWER_STATE_D0 : DP_POWER_STATE_D3;
+
++ if (link->sync_lt_in_progress)
++ return;
++
+ core_link_write_dpcd(link, DP_SET_POWER, &state,
+ sizeof(state));
+ }
+@@ -245,46 +248,6 @@ void dp_set_hw_lane_settings(
+ encoder->funcs->dp_set_lane_settings(encoder, link_settings);
+ }
+
+-enum dp_panel_mode dp_get_panel_mode(struct dc_link *link)
+-{
+- /* We need to explicitly check that connector
+- * is not DP. Some Travis_VGA get reported
+- * by video bios as DP.
+- */
+- if (link->connector_signal != SIGNAL_TYPE_DISPLAY_PORT) {
+-
+- switch (link->dpcd_caps.branch_dev_id) {
+- case DP_BRANCH_DEVICE_ID_2:
+- if (strncmp(
+- link->dpcd_caps.branch_dev_name,
+- DP_VGA_LVDS_CONVERTER_ID_2,
+- sizeof(
+- link->dpcd_caps.
+- branch_dev_name)) == 0) {
+- return DP_PANEL_MODE_SPECIAL;
+- }
+- break;
+- case DP_BRANCH_DEVICE_ID_3:
+- if (strncmp(link->dpcd_caps.branch_dev_name,
+- DP_VGA_LVDS_CONVERTER_ID_3,
+- sizeof(
+- link->dpcd_caps.
+- branch_dev_name)) == 0) {
+- return DP_PANEL_MODE_SPECIAL;
+- }
+- break;
+- default:
+- break;
+- }
+- }
+-
+- if (link->dpcd_caps.panel_mode_edp) {
+- return DP_PANEL_MODE_EDP;
+- }
+-
+- return DP_PANEL_MODE_DEFAULT;
+-}
+-
+ void dp_set_hw_test_pattern(
+ struct dc_link *link,
+ enum dp_test_pattern test_pattern,
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_dp_types.h b/drivers/gpu/drm/amd/display/dc/dc_dp_types.h
+index efa7a47f6b7e..ef79a686e4c2 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_dp_types.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_dp_types.h
+@@ -128,7 +128,10 @@ struct dc_link_training_overrides {
+ enum dc_link_spread *downspread;
+ bool *alternate_scrambler_reset;
+ bool *enhanced_framing;
++ bool *mst_enable;
++#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
+ bool *fec_enable;
++#endif
+ };
+
+ union dpcd_rev {
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
+index d6ff5af70c71..9ea75db3484e 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
+@@ -84,6 +84,7 @@ struct dc_link {
+ bool dp_ss_off;
+ bool link_state_valid;
+ bool aux_access_disabled;
++ bool sync_lt_in_progress;
+
+ /* caps is the same as reported_link_cap. link_traing use
+ * reported_link_cap. Will clean up. TODO
+@@ -228,6 +229,15 @@ enum link_training_result dc_link_dp_perform_link_training(
+ const struct dc_link_settings *link_setting,
+ bool skip_video_pattern);
+
++bool dc_link_dp_sync_lt_begin(struct dc_link *link);
++
++enum link_training_result dc_link_dp_sync_lt_attempt(
++ struct dc_link *link,
++ struct dc_link_settings *link_setting,
++ struct dc_link_training_overrides *lt_settings);
++
++bool dc_link_dp_sync_lt_end(struct dc_link *link, bool link_down);
++
+ void dc_link_dp_enable_hpd(const struct dc_link *link);
+
+ void dc_link_dp_disable_hpd(const struct dc_link *link);
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h b/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
+index c5293f9508fa..2ef23963e1f7 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
+@@ -62,6 +62,9 @@ bool is_dp_active_dongle(const struct dc_link *link);
+
+ void dp_enable_mst_on_sink(struct dc_link *link, bool enable);
+
++enum dp_panel_mode dp_get_panel_mode(struct dc_link *link);
++void dp_set_panel_mode(struct dc_link *link, enum dp_panel_mode panel_mode);
++
+ #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
+ void dp_set_fec_ready(struct dc_link *link, bool ready);
+ void dp_set_fec_enable(struct dc_link *link, bool enable);
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h b/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h
+index 3680846674e8..4eff5d38a2f9 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h
+@@ -72,8 +72,6 @@ void dp_set_hw_test_pattern(
+ uint8_t *custom_pattern,
+ uint32_t custom_pattern_size);
+
+-enum dp_panel_mode dp_get_panel_mode(struct dc_link *link);
+-
+ void dp_retrain_link_dp_test(struct dc_link *link,
+ struct dc_link_settings *link_setting,
+ bool skip_video_pattern);
+--
+2.17.1
+