From: Wenjing Liu <wenjing....@amd.com>

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

Signed-off-by: Wenjing Liu <wenjing....@amd.com>
Reviewed-by: George Shen <george.s...@amd.com>
Acked-by: Stylon Wang <stylon.w...@amd.com>
Acked-by: Wesley Chalmers <wesley.chalm...@amd.com>
---
 .../gpu/drm/amd/display/dc/core/dc_link_dp.c  | 47 ++++++++++++-------
 .../amd/display/include/link_service_types.h  |  1 +
 2 files changed, 30 insertions(+), 18 deletions(-)

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 4b3467a5d2a5..e860d7cd4fc6 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
@@ -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,11 +1388,16 @@ 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;
 
-       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));
+       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,17 +1417,18 @@ static void configure_lttpr_mode_non_transparent(struct 
dc_link *link)
                        link->dpcd_caps.lttpr_caps.mode = repeater_mode;
                }
 
-               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));
-                       core_link_read_dpcd(
-                               link,
-                               aux_interval_address,
-                               (uint8_t 
*)&link->dpcd_caps.lttpr_caps.aux_rd_interval[repeater_id - 1],
-                               
sizeof(link->dpcd_caps.lttpr_caps.aux_rd_interval[repeater_id - 1]));
-                       link->dpcd_caps.lttpr_caps.aux_rd_interval[repeater_id 
- 1] &= 0x7F;
+               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));
+                               core_link_read_dpcd(
+                                       link,
+                                       aux_interval_address,
+                                       (uint8_t 
*)&link->dpcd_caps.lttpr_caps.aux_rd_interval[repeater_id - 1],
+                                       
sizeof(link->dpcd_caps.lttpr_caps.aux_rd_interval[repeater_id - 1]));
+                               
link->dpcd_caps.lttpr_caps.aux_rd_interval[repeater_id - 1] &= 0x7F;
+                       }
                }
        }
 }
@@ -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);
 
diff --git a/drivers/gpu/drm/amd/display/include/link_service_types.h 
b/drivers/gpu/drm/amd/display/include/link_service_types.h
index 73ada16658aa..7a30ca01e7d4 100644
--- a/drivers/gpu/drm/amd/display/include/link_service_types.h
+++ b/drivers/gpu/drm/amd/display/include/link_service_types.h
@@ -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*/
-- 
2.25.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to