@@ -243,16 +243,29 @@ bool dc_link_perform_frl_training(struct dc_link *link,
243243bool dc_link_perform_frl_training_with_retries (struct dc_link * link ,
244244 const struct link_resource * link_res )
245245{
246+ uint8_t min_rate ;
246247 bool success ;
247248 int i ;
248249
250+ /* We will attempt the highest rate first, then fall back to a lower rate */
251+ min_rate = link -> cur_link_settings .frl_rate ;
252+ link -> cur_link_settings .frl_rate = link -> local_sink -> edid_caps .frl_caps .max_rate ;
253+ link -> cur_link_settings .lane_count = link -> cur_link_settings .frl_rate <= 2 ? 3 : 4 ;
254+
249255 for (i = 0 ; i < FRL_TRAINING_RETRIES ; ++ i ) {
250256 success = dc_link_perform_frl_training (link , link_res );
251257
252258 if (success )
253259 break ;
254260
255- DC_LOG_HW_LINK_TRAINING ("FRL: Training attempt %d failed!" );
261+ if (link -> cur_link_settings .frl_rate > min_rate ) {
262+ link -> cur_link_settings .frl_rate -- ;
263+ link -> cur_link_settings .lane_count =
264+ link -> cur_link_settings .frl_rate <= 2 ? 3 : 4 ;
265+ }
266+
267+ DC_LOG_HW_LINK_TRAINING ("FRL: Training attempt %d failed! Will attempt rate %d next" ,
268+ i , link -> cur_link_settings .frl_rate );
256269 }
257270
258271 return success ;
@@ -567,7 +580,7 @@ bool hdmi_decide_link_settings(
567580 pipe_ctx -> link_config .dp_link_settings .frl_rate = frl_rate ;
568581 pipe_ctx -> link_config .dp_link_settings .lane_count = cfg .lanes ;
569582
570- pr_info ("HDMI FRL: Rate %d Supported. Borrowed: %d , Margin: %d ppm\n" ,
583+ DC_LOG_HW_LINK_TRAINING ("HDMI FRL: Rate %d Supported. Borrowed: %llu , Margin: %d ppm\n" ,
571584 frl_rate , res .tb_borrowed , res .margin_ppm );
572585 return true;
573586 }
0 commit comments