@@ -1034,10 +1034,12 @@ static int msm_dp_ctrl_set_vx_px(struct msm_dp_ctrl_private *ctrl,
1034
1034
return 0 ;
1035
1035
}
1036
1036
1037
- static int msm_dp_ctrl_update_vx_px (struct msm_dp_ctrl_private * ctrl )
1037
+ static int msm_dp_ctrl_update_phy_vx_px (struct msm_dp_ctrl_private * ctrl ,
1038
+ enum drm_dp_phy dp_phy )
1038
1039
{
1039
1040
struct msm_dp_link * link = ctrl -> link ;
1040
- int ret = 0 , lane , lane_cnt ;
1041
+ int lane , lane_cnt , reg ;
1042
+ int ret = 0 ;
1041
1043
u8 buf [4 ];
1042
1044
u32 max_level_reached = 0 ;
1043
1045
u32 voltage_swing_level = link -> phy_params .v_level ;
@@ -1075,18 +1077,24 @@ static int msm_dp_ctrl_update_vx_px(struct msm_dp_ctrl_private *ctrl)
1075
1077
1076
1078
drm_dbg_dp (ctrl -> drm_dev , "sink: p|v=0x%x\n" ,
1077
1079
voltage_swing_level | pre_emphasis_level );
1078
- ret = drm_dp_dpcd_write (ctrl -> aux , DP_TRAINING_LANE0_SET ,
1079
- buf , lane_cnt );
1080
+
1081
+ if (dp_phy == DP_PHY_DPRX )
1082
+ reg = DP_TRAINING_LANE0_SET ;
1083
+ else
1084
+ reg = DP_TRAINING_LANE0_SET_PHY_REPEATER (dp_phy );
1085
+
1086
+ ret = drm_dp_dpcd_write (ctrl -> aux , reg , buf , lane_cnt );
1080
1087
if (ret == lane_cnt )
1081
1088
ret = 0 ;
1082
1089
1083
1090
return ret ;
1084
1091
}
1085
1092
1086
1093
static bool msm_dp_ctrl_train_pattern_set (struct msm_dp_ctrl_private * ctrl ,
1087
- u8 pattern )
1094
+ u8 pattern , enum drm_dp_phy dp_phy )
1088
1095
{
1089
1096
u8 buf ;
1097
+ int reg ;
1090
1098
int ret = 0 ;
1091
1099
1092
1100
drm_dbg_dp (ctrl -> drm_dev , "sink: pattern=%x\n" , pattern );
@@ -1096,17 +1104,26 @@ static bool msm_dp_ctrl_train_pattern_set(struct msm_dp_ctrl_private *ctrl,
1096
1104
if (pattern && pattern != DP_TRAINING_PATTERN_4 )
1097
1105
buf |= DP_LINK_SCRAMBLING_DISABLE ;
1098
1106
1099
- ret = drm_dp_dpcd_writeb (ctrl -> aux , DP_TRAINING_PATTERN_SET , buf );
1107
+ if (dp_phy == DP_PHY_DPRX )
1108
+ reg = DP_TRAINING_PATTERN_SET ;
1109
+ else
1110
+ reg = DP_TRAINING_PATTERN_SET_PHY_REPEATER (dp_phy );
1111
+
1112
+ ret = drm_dp_dpcd_writeb (ctrl -> aux , reg , buf );
1100
1113
return ret == 1 ;
1101
1114
}
1102
1115
1103
1116
static int msm_dp_ctrl_link_train_1 (struct msm_dp_ctrl_private * ctrl ,
1104
- int * training_step )
1117
+ int * training_step , enum drm_dp_phy dp_phy )
1105
1118
{
1119
+ int delay_us ;
1106
1120
int tries , old_v_level , ret = 0 ;
1107
1121
u8 link_status [DP_LINK_STATUS_SIZE ];
1108
1122
int const maximum_retries = 4 ;
1109
1123
1124
+ delay_us = drm_dp_read_clock_recovery_delay (ctrl -> aux ,
1125
+ ctrl -> panel -> dpcd , dp_phy , false);
1126
+
1110
1127
msm_dp_catalog_ctrl_state_ctrl (ctrl -> catalog , 0 );
1111
1128
1112
1129
* training_step = DP_TRAINING_1 ;
@@ -1115,18 +1132,19 @@ static int msm_dp_ctrl_link_train_1(struct msm_dp_ctrl_private *ctrl,
1115
1132
if (ret )
1116
1133
return ret ;
1117
1134
msm_dp_ctrl_train_pattern_set (ctrl , DP_TRAINING_PATTERN_1 |
1118
- DP_LINK_SCRAMBLING_DISABLE );
1135
+ DP_LINK_SCRAMBLING_DISABLE , dp_phy );
1119
1136
1120
- ret = msm_dp_ctrl_update_vx_px (ctrl );
1137
+ msm_dp_link_reset_phy_params_vx_px (ctrl -> link );
1138
+ ret = msm_dp_ctrl_update_phy_vx_px (ctrl , dp_phy );
1121
1139
if (ret )
1122
1140
return ret ;
1123
1141
1124
1142
tries = 0 ;
1125
1143
old_v_level = ctrl -> link -> phy_params .v_level ;
1126
1144
for (tries = 0 ; tries < maximum_retries ; tries ++ ) {
1127
- drm_dp_link_train_clock_recovery_delay ( ctrl -> aux , ctrl -> panel -> dpcd );
1145
+ fsleep ( delay_us );
1128
1146
1129
- ret = drm_dp_dpcd_read_link_status (ctrl -> aux , link_status );
1147
+ ret = drm_dp_dpcd_read_phy_link_status (ctrl -> aux , dp_phy , link_status );
1130
1148
if (ret )
1131
1149
return ret ;
1132
1150
@@ -1147,7 +1165,7 @@ static int msm_dp_ctrl_link_train_1(struct msm_dp_ctrl_private *ctrl,
1147
1165
}
1148
1166
1149
1167
msm_dp_link_adjust_levels (ctrl -> link , link_status );
1150
- ret = msm_dp_ctrl_update_vx_px (ctrl );
1168
+ ret = msm_dp_ctrl_update_phy_vx_px (ctrl , dp_phy );
1151
1169
if (ret )
1152
1170
return ret ;
1153
1171
}
@@ -1199,21 +1217,31 @@ static int msm_dp_ctrl_link_lane_down_shift(struct msm_dp_ctrl_private *ctrl)
1199
1217
return 0 ;
1200
1218
}
1201
1219
1202
- static void msm_dp_ctrl_clear_training_pattern (struct msm_dp_ctrl_private * ctrl )
1220
+ static void msm_dp_ctrl_clear_training_pattern (struct msm_dp_ctrl_private * ctrl ,
1221
+ enum drm_dp_phy dp_phy )
1203
1222
{
1204
- msm_dp_ctrl_train_pattern_set (ctrl , DP_TRAINING_PATTERN_DISABLE );
1205
- drm_dp_link_train_channel_eq_delay (ctrl -> aux , ctrl -> panel -> dpcd );
1223
+ int delay_us ;
1224
+
1225
+ msm_dp_ctrl_train_pattern_set (ctrl , DP_TRAINING_PATTERN_DISABLE , dp_phy );
1226
+
1227
+ delay_us = drm_dp_read_channel_eq_delay (ctrl -> aux ,
1228
+ ctrl -> panel -> dpcd , dp_phy , false);
1229
+ fsleep (delay_us );
1206
1230
}
1207
1231
1208
1232
static int msm_dp_ctrl_link_train_2 (struct msm_dp_ctrl_private * ctrl ,
1209
- int * training_step )
1233
+ int * training_step , enum drm_dp_phy dp_phy )
1210
1234
{
1235
+ int delay_us ;
1211
1236
int tries = 0 , ret = 0 ;
1212
1237
u8 pattern ;
1213
1238
u32 state_ctrl_bit ;
1214
1239
int const maximum_retries = 5 ;
1215
1240
u8 link_status [DP_LINK_STATUS_SIZE ];
1216
1241
1242
+ delay_us = drm_dp_read_channel_eq_delay (ctrl -> aux ,
1243
+ ctrl -> panel -> dpcd , dp_phy , false);
1244
+
1217
1245
msm_dp_catalog_ctrl_state_ctrl (ctrl -> catalog , 0 );
1218
1246
1219
1247
* training_step = DP_TRAINING_2 ;
@@ -1233,12 +1261,12 @@ static int msm_dp_ctrl_link_train_2(struct msm_dp_ctrl_private *ctrl,
1233
1261
if (ret )
1234
1262
return ret ;
1235
1263
1236
- msm_dp_ctrl_train_pattern_set (ctrl , pattern );
1264
+ msm_dp_ctrl_train_pattern_set (ctrl , pattern , dp_phy );
1237
1265
1238
1266
for (tries = 0 ; tries <= maximum_retries ; tries ++ ) {
1239
- drm_dp_link_train_channel_eq_delay ( ctrl -> aux , ctrl -> panel -> dpcd );
1267
+ fsleep ( delay_us );
1240
1268
1241
- ret = drm_dp_dpcd_read_link_status (ctrl -> aux , link_status );
1269
+ ret = drm_dp_dpcd_read_phy_link_status (ctrl -> aux , dp_phy , link_status );
1242
1270
if (ret )
1243
1271
return ret ;
1244
1272
@@ -1248,7 +1276,7 @@ static int msm_dp_ctrl_link_train_2(struct msm_dp_ctrl_private *ctrl,
1248
1276
}
1249
1277
1250
1278
msm_dp_link_adjust_levels (ctrl -> link , link_status );
1251
- ret = msm_dp_ctrl_update_vx_px (ctrl );
1279
+ ret = msm_dp_ctrl_update_phy_vx_px (ctrl , dp_phy );
1252
1280
if (ret )
1253
1281
return ret ;
1254
1282
@@ -1257,9 +1285,32 @@ static int msm_dp_ctrl_link_train_2(struct msm_dp_ctrl_private *ctrl,
1257
1285
return - ETIMEDOUT ;
1258
1286
}
1259
1287
1288
+ static int msm_dp_ctrl_link_train_1_2 (struct msm_dp_ctrl_private * ctrl ,
1289
+ int * training_step , enum drm_dp_phy dp_phy )
1290
+ {
1291
+ int ret ;
1292
+
1293
+ ret = msm_dp_ctrl_link_train_1 (ctrl , training_step , dp_phy );
1294
+ if (ret ) {
1295
+ DRM_ERROR ("link training #1 on phy %d failed. ret=%d\n" , dp_phy , ret );
1296
+ return ret ;
1297
+ }
1298
+ drm_dbg_dp (ctrl -> drm_dev , "link training #1 on phy %d successful\n" , dp_phy );
1299
+
1300
+ ret = msm_dp_ctrl_link_train_2 (ctrl , training_step , dp_phy );
1301
+ if (ret ) {
1302
+ DRM_ERROR ("link training #2 on phy %d failed. ret=%d\n" , dp_phy , ret );
1303
+ return ret ;
1304
+ }
1305
+ drm_dbg_dp (ctrl -> drm_dev , "link training #2 on phy %d successful\n" , dp_phy );
1306
+
1307
+ return 0 ;
1308
+ }
1309
+
1260
1310
static int msm_dp_ctrl_link_train (struct msm_dp_ctrl_private * ctrl ,
1261
1311
int * training_step )
1262
1312
{
1313
+ int i ;
1263
1314
int ret = 0 ;
1264
1315
const u8 * dpcd = ctrl -> panel -> dpcd ;
1265
1316
u8 encoding [] = { 0 , DP_SET_ANSI_8B10B };
@@ -1272,8 +1323,6 @@ static int msm_dp_ctrl_link_train(struct msm_dp_ctrl_private *ctrl,
1272
1323
link_info .rate = ctrl -> link -> link_params .rate ;
1273
1324
link_info .capabilities = DP_LINK_CAP_ENHANCED_FRAMING ;
1274
1325
1275
- msm_dp_link_reset_phy_params_vx_px (ctrl -> link );
1276
-
1277
1326
msm_dp_aux_link_configure (ctrl -> aux , & link_info );
1278
1327
1279
1328
if (drm_dp_max_downspread (dpcd ))
@@ -1288,24 +1337,27 @@ static int msm_dp_ctrl_link_train(struct msm_dp_ctrl_private *ctrl,
1288
1337
& assr , 1 );
1289
1338
}
1290
1339
1291
- ret = msm_dp_ctrl_link_train_1 (ctrl , training_step );
1340
+ for (i = ctrl -> link -> lttpr_count - 1 ; i >= 0 ; i -- ) {
1341
+ enum drm_dp_phy dp_phy = DP_PHY_LTTPR (i );
1342
+
1343
+ ret = msm_dp_ctrl_link_train_1_2 (ctrl , training_step , dp_phy );
1344
+ msm_dp_ctrl_clear_training_pattern (ctrl , dp_phy );
1345
+
1346
+ if (ret )
1347
+ break ;
1348
+ }
1349
+
1292
1350
if (ret ) {
1293
- DRM_ERROR ("link training #1 failed. ret=%d\n" , ret );
1351
+ DRM_ERROR ("link training of LTTPR(s) failed. ret=%d\n" , ret );
1294
1352
goto end ;
1295
1353
}
1296
1354
1297
- /* print success info as this is a result of user initiated action */
1298
- drm_dbg_dp (ctrl -> drm_dev , "link training #1 successful\n" );
1299
-
1300
- ret = msm_dp_ctrl_link_train_2 (ctrl , training_step );
1355
+ ret = msm_dp_ctrl_link_train_1_2 (ctrl , training_step , DP_PHY_DPRX );
1301
1356
if (ret ) {
1302
- DRM_ERROR ("link training #2 failed. ret=%d\n" , ret );
1357
+ DRM_ERROR ("link training on sink failed. ret=%d\n" , ret );
1303
1358
goto end ;
1304
1359
}
1305
1360
1306
- /* print success info as this is a result of user initiated action */
1307
- drm_dbg_dp (ctrl -> drm_dev , "link training #2 successful\n" );
1308
-
1309
1361
end :
1310
1362
msm_dp_catalog_ctrl_state_ctrl (ctrl -> catalog , 0 );
1311
1363
@@ -1622,7 +1674,7 @@ static int msm_dp_ctrl_link_maintenance(struct msm_dp_ctrl_private *ctrl)
1622
1674
if (ret )
1623
1675
goto end ;
1624
1676
1625
- msm_dp_ctrl_clear_training_pattern (ctrl );
1677
+ msm_dp_ctrl_clear_training_pattern (ctrl , DP_PHY_DPRX );
1626
1678
1627
1679
msm_dp_catalog_ctrl_state_ctrl (ctrl -> catalog , DP_STATE_CTRL_SEND_VIDEO );
1628
1680
@@ -1646,7 +1698,7 @@ static bool msm_dp_ctrl_send_phy_test_pattern(struct msm_dp_ctrl_private *ctrl)
1646
1698
return false;
1647
1699
}
1648
1700
msm_dp_catalog_ctrl_send_phy_pattern (ctrl -> catalog , pattern_requested );
1649
- msm_dp_ctrl_update_vx_px (ctrl );
1701
+ msm_dp_ctrl_update_phy_vx_px (ctrl , DP_PHY_DPRX );
1650
1702
msm_dp_link_send_test_response (ctrl -> link );
1651
1703
1652
1704
pattern_sent = msm_dp_catalog_ctrl_read_phy_pattern (ctrl -> catalog );
@@ -1888,7 +1940,7 @@ int msm_dp_ctrl_on_link(struct msm_dp_ctrl *msm_dp_ctrl)
1888
1940
}
1889
1941
1890
1942
/* stop link training before start re training */
1891
- msm_dp_ctrl_clear_training_pattern (ctrl );
1943
+ msm_dp_ctrl_clear_training_pattern (ctrl , DP_PHY_DPRX );
1892
1944
}
1893
1945
1894
1946
rc = msm_dp_ctrl_reinitialize_mainlink (ctrl );
@@ -1912,7 +1964,7 @@ int msm_dp_ctrl_on_link(struct msm_dp_ctrl *msm_dp_ctrl)
1912
1964
* link training failed
1913
1965
* end txing train pattern here
1914
1966
*/
1915
- msm_dp_ctrl_clear_training_pattern (ctrl );
1967
+ msm_dp_ctrl_clear_training_pattern (ctrl , DP_PHY_DPRX );
1916
1968
1917
1969
msm_dp_ctrl_deinitialize_mainlink (ctrl );
1918
1970
rc = - ECONNRESET ;
@@ -1983,7 +2035,7 @@ int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, bool force_link_train
1983
2035
msm_dp_ctrl_link_retrain (ctrl );
1984
2036
1985
2037
/* stop txing train pattern to end link training */
1986
- msm_dp_ctrl_clear_training_pattern (ctrl );
2038
+ msm_dp_ctrl_clear_training_pattern (ctrl , DP_PHY_DPRX );
1987
2039
1988
2040
/*
1989
2041
* Set up transfer unit values and set controller state to send
0 commit comments