@@ -884,28 +884,26 @@ struct dsc_mst_fairness_params {
884884};
885885
886886#if defined(CONFIG_DRM_AMD_DC_FP )
887- static uint64_t kbps_to_pbn ( int kbps , bool is_peak_pbn )
887+ static uint16_t get_fec_overhead_multiplier ( struct dc_link * dc_link )
888888{
889- uint64_t effective_kbps = (uint64_t )kbps ;
889+ u8 link_coding_cap ;
890+ uint16_t fec_overhead_multiplier_x1000 = PBN_FEC_OVERHEAD_MULTIPLIER_8B_10B ;
890891
891- if (is_peak_pbn ) { // add 0.6% (1006/1000) overhead into effective kbps
892- effective_kbps *= 1006 ;
893- effective_kbps = div_u64 (effective_kbps , 1000 );
894- }
892+ link_coding_cap = dc_link_dp_mst_decide_link_encoding_format (dc_link );
893+ if (link_coding_cap == DP_128b_132b_ENCODING )
894+ fec_overhead_multiplier_x1000 = PBN_FEC_OVERHEAD_MULTIPLIER_128B_132B ;
895895
896- return ( uint64_t ) DIV64_U64_ROUND_UP ( effective_kbps * 64 , ( 54 * 8 * 1000 )) ;
896+ return fec_overhead_multiplier_x1000 ;
897897}
898898
899- static uint32_t pbn_to_kbps ( unsigned int pbn , bool with_margin )
899+ static int kbps_to_peak_pbn ( int kbps , uint16_t fec_overhead_multiplier_x1000 )
900900{
901- uint64_t pbn_effective = (uint64_t )pbn ;
902-
903- if (with_margin ) // deduct 0.6% (994/1000) overhead from effective pbn
904- pbn_effective *= (1000000 / PEAK_FACTOR_X1000 );
905- else
906- pbn_effective *= 1000 ;
901+ u64 peak_kbps = kbps ;
907902
908- return DIV_U64_ROUND_UP (pbn_effective * 8 * 54 , 64 );
903+ peak_kbps *= 1006 ;
904+ peak_kbps *= fec_overhead_multiplier_x1000 ;
905+ peak_kbps = div_u64 (peak_kbps , 1000 * 1000 );
906+ return (int ) DIV64_U64_ROUND_UP (peak_kbps * 64 , (54 * 8 * 1000 ));
909907}
910908
911909static void set_dsc_configs_from_fairness_vars (struct dsc_mst_fairness_params * params ,
@@ -976,7 +974,7 @@ static int bpp_x16_from_pbn(struct dsc_mst_fairness_params param, int pbn)
976974 dc_dsc_get_default_config_option (param .sink -> ctx -> dc , & dsc_options );
977975 dsc_options .max_target_bpp_limit_override_x16 = drm_connector -> display_info .max_dsc_bpp * 16 ;
978976
979- kbps = pbn_to_kbps ( pbn , false );
977+ kbps = div_u64 (( u64 ) pbn * 994 * 8 * 54 , 64 );
980978 dc_dsc_compute_config (
981979 param .sink -> ctx -> dc -> res_pool -> dscs [0 ],
982980 & param .sink -> dsc_caps .dsc_dec_caps ,
@@ -1005,11 +1003,12 @@ static int increase_dsc_bpp(struct drm_atomic_state *state,
10051003 int link_timeslots_used ;
10061004 int fair_pbn_alloc ;
10071005 int ret = 0 ;
1006+ uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier (dc_link );
10081007
10091008 for (i = 0 ; i < count ; i ++ ) {
10101009 if (vars [i + k ].dsc_enabled ) {
10111010 initial_slack [i ] =
1012- kbps_to_pbn (params [i ].bw_range .max_kbps , false ) - vars [i + k ].pbn ;
1011+ kbps_to_peak_pbn (params [i ].bw_range .max_kbps , fec_overhead_multiplier_x1000 ) - vars [i + k ].pbn ;
10131012 bpp_increased [i ] = false;
10141013 remaining_to_increase += 1 ;
10151014 } else {
@@ -1105,6 +1104,7 @@ static int try_disable_dsc(struct drm_atomic_state *state,
11051104 int next_index ;
11061105 int remaining_to_try = 0 ;
11071106 int ret ;
1107+ uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier (dc_link );
11081108 int var_pbn ;
11091109
11101110 for (i = 0 ; i < count ; i ++ ) {
@@ -1137,7 +1137,7 @@ static int try_disable_dsc(struct drm_atomic_state *state,
11371137
11381138 DRM_DEBUG_DRIVER ("MST_DSC index #%d, try no compression\n" , next_index );
11391139 var_pbn = vars [next_index ].pbn ;
1140- vars [next_index ].pbn = kbps_to_pbn (params [next_index ].bw_range .stream_kbps , true );
1140+ vars [next_index ].pbn = kbps_to_peak_pbn (params [next_index ].bw_range .stream_kbps , fec_overhead_multiplier_x1000 );
11411141 ret = drm_dp_atomic_find_time_slots (state ,
11421142 params [next_index ].port -> mgr ,
11431143 params [next_index ].port ,
@@ -1197,6 +1197,7 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
11971197 int count = 0 ;
11981198 int i , k , ret ;
11991199 bool debugfs_overwrite = false;
1200+ uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier (dc_link );
12001201 struct drm_connector_state * new_conn_state ;
12011202
12021203 memset (params , 0 , sizeof (params ));
@@ -1277,7 +1278,7 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
12771278 DRM_DEBUG_DRIVER ("MST_DSC Try no compression\n" );
12781279 for (i = 0 ; i < count ; i ++ ) {
12791280 vars [i + k ].aconnector = params [i ].aconnector ;
1280- vars [i + k ].pbn = kbps_to_pbn (params [i ].bw_range .stream_kbps , false );
1281+ vars [i + k ].pbn = kbps_to_peak_pbn (params [i ].bw_range .stream_kbps , fec_overhead_multiplier_x1000 );
12811282 vars [i + k ].dsc_enabled = false;
12821283 vars [i + k ].bpp_x16 = 0 ;
12831284 ret = drm_dp_atomic_find_time_slots (state , params [i ].port -> mgr , params [i ].port ,
@@ -1299,15 +1300,15 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
12991300 DRM_DEBUG_DRIVER ("MST_DSC Try max compression\n" );
13001301 for (i = 0 ; i < count ; i ++ ) {
13011302 if (params [i ].compression_possible && params [i ].clock_force_enable != DSC_CLK_FORCE_DISABLE ) {
1302- vars [i + k ].pbn = kbps_to_pbn (params [i ].bw_range .min_kbps , false );
1303+ vars [i + k ].pbn = kbps_to_peak_pbn (params [i ].bw_range .min_kbps , fec_overhead_multiplier_x1000 );
13031304 vars [i + k ].dsc_enabled = true;
13041305 vars [i + k ].bpp_x16 = params [i ].bw_range .min_target_bpp_x16 ;
13051306 ret = drm_dp_atomic_find_time_slots (state , params [i ].port -> mgr ,
13061307 params [i ].port , vars [i + k ].pbn );
13071308 if (ret < 0 )
13081309 return ret ;
13091310 } else {
1310- vars [i + k ].pbn = kbps_to_pbn (params [i ].bw_range .stream_kbps , false );
1311+ vars [i + k ].pbn = kbps_to_peak_pbn (params [i ].bw_range .stream_kbps , fec_overhead_multiplier_x1000 );
13111312 vars [i + k ].dsc_enabled = false;
13121313 vars [i + k ].bpp_x16 = 0 ;
13131314 ret = drm_dp_atomic_find_time_slots (state , params [i ].port -> mgr ,
@@ -1762,6 +1763,18 @@ int pre_validate_dsc(struct drm_atomic_state *state,
17621763 return ret ;
17631764}
17641765
1766+ static uint32_t kbps_from_pbn (unsigned int pbn )
1767+ {
1768+ uint64_t kbps = (uint64_t )pbn ;
1769+
1770+ kbps *= (1000000 / PEAK_FACTOR_X1000 );
1771+ kbps *= 8 ;
1772+ kbps *= 54 ;
1773+ kbps /= 64 ;
1774+
1775+ return (uint32_t )kbps ;
1776+ }
1777+
17651778static bool is_dsc_common_config_possible (struct dc_stream_state * stream ,
17661779 struct dc_dsc_bw_range * bw_range )
17671780{
@@ -1860,7 +1873,7 @@ enum dc_status dm_dp_mst_is_port_support_mode(
18601873 dc_link_get_highest_encoding_format (stream -> link ));
18611874 cur_link_settings = stream -> link -> verified_link_cap ;
18621875 root_link_bw_in_kbps = dc_link_bandwidth_kbps (aconnector -> dc_link , & cur_link_settings );
1863- virtual_channel_bw_in_kbps = pbn_to_kbps (aconnector -> mst_output_port -> full_pbn , true );
1876+ virtual_channel_bw_in_kbps = kbps_from_pbn (aconnector -> mst_output_port -> full_pbn );
18641877
18651878 /* pick the end to end bw bottleneck */
18661879 end_to_end_bw_in_kbps = min (root_link_bw_in_kbps , virtual_channel_bw_in_kbps );
@@ -1913,7 +1926,7 @@ enum dc_status dm_dp_mst_is_port_support_mode(
19131926 immediate_upstream_port = aconnector -> mst_output_port -> parent -> port_parent ;
19141927
19151928 if (immediate_upstream_port ) {
1916- virtual_channel_bw_in_kbps = pbn_to_kbps (immediate_upstream_port -> full_pbn , true );
1929+ virtual_channel_bw_in_kbps = kbps_from_pbn (immediate_upstream_port -> full_pbn );
19171930 virtual_channel_bw_in_kbps = min (root_link_bw_in_kbps , virtual_channel_bw_in_kbps );
19181931 } else {
19191932 /* For topology LCT 1 case - only one mstb*/
0 commit comments