@@ -1172,15 +1172,15 @@ static void configure_lttpr_mode(struct dc_link *link)
1172
1172
uint8_t repeater_cnt ;
1173
1173
uint32_t aux_interval_address ;
1174
1174
uint8_t repeater_id ;
1175
- enum lttpr_mode repeater_mode = phy_repeater_mode_transparent ;
1175
+ uint8_t repeater_mode = DP_PHY_REPEATER_MODE_TRANSPARENT ;
1176
1176
1177
1177
core_link_write_dpcd (link ,
1178
1178
DP_PHY_REPEATER_MODE ,
1179
1179
(uint8_t * )& repeater_mode ,
1180
1180
sizeof (repeater_mode ));
1181
1181
1182
1182
if (!link -> is_lttpr_mode_transparent ) {
1183
- repeater_mode = phy_repeater_mode_non_transparent ;
1183
+ repeater_mode = DP_PHY_REPEATER_MODE_NON_TRANSPARENT ;
1184
1184
core_link_write_dpcd (link ,
1185
1185
DP_PHY_REPEATER_MODE ,
1186
1186
(uint8_t * )& repeater_mode ,
@@ -2964,7 +2964,11 @@ static void dp_wa_power_up_0010FA(struct dc_link *link, uint8_t *dpcd_data,
2964
2964
2965
2965
static bool retrieve_link_cap (struct dc_link * link )
2966
2966
{
2967
- uint8_t dpcd_data [DP_ADAPTER_CAP - DP_DPCD_REV + 1 ];
2967
+ /* DP_ADAPTER_CAP - DP_DPCD_REV + 1 == 16 and also DP_DSC_BITS_PER_PIXEL_INC - DP_DSC_SUPPORT + 1 == 16,
2968
+ * which means size 16 will be good for both of those DPCD register block reads
2969
+ */
2970
+ uint8_t dpcd_data [16 ];
2971
+ uint8_t lttpr_dpcd_data [6 ];
2968
2972
2969
2973
/*Only need to read 1 byte starting from DP_DPRX_FEATURE_ENUMERATION_LIST.
2970
2974
*/
@@ -2977,7 +2981,6 @@ static bool retrieve_link_cap(struct dc_link *link)
2977
2981
union dp_downstream_port_present ds_port = { 0 };
2978
2982
enum dc_status status = DC_ERROR_UNEXPECTED ;
2979
2983
uint32_t read_dpcd_retry_cnt = 3 ;
2980
- uint32_t prev_timeout_val ;
2981
2984
int i ;
2982
2985
struct dp_sink_hw_fw_revision dp_hw_fw_revision ;
2983
2986
@@ -2988,12 +2991,12 @@ static bool retrieve_link_cap(struct dc_link *link)
2988
2991
link -> is_lttpr_mode_transparent = true;
2989
2992
2990
2993
if (ext_timeout_support ) {
2991
- prev_timeout_val =
2992
- dc_link_aux_configure_timeout (link -> ddc ,
2993
- LINK_AUX_DEFAULT_EXTENDED_TIMEOUT_PERIOD );
2994
+ dc_link_aux_configure_timeout (link -> ddc ,
2995
+ LINK_AUX_DEFAULT_EXTENDED_TIMEOUT_PERIOD );
2994
2996
}
2995
2997
2996
2998
memset (dpcd_data , '\0' , sizeof (dpcd_data ));
2999
+ memset (lttpr_dpcd_data , '\0' , sizeof (lttpr_dpcd_data ));
2997
3000
memset (& down_strm_port_count ,
2998
3001
'\0' , sizeof (union down_stream_port_count ));
2999
3002
memset (& edp_config_cap , '\0' ,
@@ -3026,47 +3029,46 @@ static bool retrieve_link_cap(struct dc_link *link)
3026
3029
}
3027
3030
3028
3031
if (ext_timeout_support ) {
3032
+
3029
3033
status = core_link_read_dpcd (
3030
3034
link ,
3031
- DP_PHY_REPEATER_CNT ,
3032
- & link -> dpcd_caps .lttpr_caps .phy_repeater_cnt ,
3033
- sizeof (link -> dpcd_caps .lttpr_caps .phy_repeater_cnt ));
3034
-
3035
- if (link -> dpcd_caps .lttpr_caps .phy_repeater_cnt > 0 ) {
3036
-
3035
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV ,
3036
+ lttpr_dpcd_data ,
3037
+ sizeof (lttpr_dpcd_data ));
3038
+
3039
+ link -> dpcd_caps .lttpr_caps .revision .raw =
3040
+ lttpr_dpcd_data [DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV -
3041
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV ];
3042
+
3043
+ link -> dpcd_caps .lttpr_caps .max_link_rate =
3044
+ lttpr_dpcd_data [DP_MAX_LINK_RATE_PHY_REPEATER -
3045
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV ];
3046
+
3047
+ link -> dpcd_caps .lttpr_caps .phy_repeater_cnt =
3048
+ lttpr_dpcd_data [DP_PHY_REPEATER_CNT -
3049
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV ];
3050
+
3051
+ link -> dpcd_caps .lttpr_caps .max_lane_count =
3052
+ lttpr_dpcd_data [DP_MAX_LANE_COUNT_PHY_REPEATER -
3053
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV ];
3054
+
3055
+ link -> dpcd_caps .lttpr_caps .mode =
3056
+ lttpr_dpcd_data [DP_PHY_REPEATER_MODE -
3057
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV ];
3058
+
3059
+ link -> dpcd_caps .lttpr_caps .max_ext_timeout =
3060
+ lttpr_dpcd_data [DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT -
3061
+ DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV ];
3062
+
3063
+ if (link -> dpcd_caps .lttpr_caps .phy_repeater_cnt > 0 &&
3064
+ link -> dpcd_caps .lttpr_caps .max_lane_count > 0 &&
3065
+ link -> dpcd_caps .lttpr_caps .max_lane_count <= 4 &&
3066
+ link -> dpcd_caps .lttpr_caps .revision .raw >= 0x14 ) {
3037
3067
link -> is_lttpr_mode_transparent = false;
3038
-
3039
- status = core_link_read_dpcd (
3040
- link ,
3041
- DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV ,
3042
- (uint8_t * )& link -> dpcd_caps .lttpr_caps .revision ,
3043
- sizeof (link -> dpcd_caps .lttpr_caps .revision ));
3044
-
3045
- status = core_link_read_dpcd (
3046
- link ,
3047
- DP_MAX_LINK_RATE_PHY_REPEATER ,
3048
- & link -> dpcd_caps .lttpr_caps .max_link_rate ,
3049
- sizeof (link -> dpcd_caps .lttpr_caps .max_link_rate ));
3050
-
3051
- status = core_link_read_dpcd (
3052
- link ,
3053
- DP_PHY_REPEATER_MODE ,
3054
- (uint8_t * )& link -> dpcd_caps .lttpr_caps .mode ,
3055
- sizeof (link -> dpcd_caps .lttpr_caps .mode ));
3056
-
3057
- status = core_link_read_dpcd (
3058
- link ,
3059
- DP_MAX_LANE_COUNT_PHY_REPEATER ,
3060
- & link -> dpcd_caps .lttpr_caps .max_lane_count ,
3061
- sizeof (link -> dpcd_caps .lttpr_caps .max_lane_count ));
3062
-
3063
- status = core_link_read_dpcd (
3064
- link ,
3065
- DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT ,
3066
- & link -> dpcd_caps .lttpr_caps .max_ext_timeout ,
3067
- sizeof (link -> dpcd_caps .lttpr_caps .max_ext_timeout ));
3068
3068
} else {
3069
- dc_link_aux_configure_timeout (link -> ddc , prev_timeout_val );
3069
+ /*No lttpr reset timeout to its default value*/
3070
+ link -> is_lttpr_mode_transparent = true;
3071
+ dc_link_aux_configure_timeout (link -> ddc , LINK_AUX_DEFAULT_TIMEOUT_PERIOD );
3070
3072
}
3071
3073
}
3072
3074
0 commit comments