@@ -681,12 +681,25 @@ struct dsc_mst_fairness_params {
681
681
struct amdgpu_dm_connector * aconnector ;
682
682
};
683
683
684
- static int kbps_to_peak_pbn (int kbps )
684
+ static uint16_t get_fec_overhead_multiplier (struct dc_link * dc_link )
685
+ {
686
+ u8 link_coding_cap ;
687
+ uint16_t fec_overhead_multiplier_x1000 = PBN_FEC_OVERHEAD_MULTIPLIER_8B_10B ;
688
+
689
+ link_coding_cap = dc_link_dp_mst_decide_link_encoding_format (dc_link );
690
+ if (link_coding_cap == DP_128b_132b_ENCODING )
691
+ fec_overhead_multiplier_x1000 = PBN_FEC_OVERHEAD_MULTIPLIER_128B_132B ;
692
+
693
+ return fec_overhead_multiplier_x1000 ;
694
+ }
695
+
696
+ static int kbps_to_peak_pbn (int kbps , uint16_t fec_overhead_multiplier_x1000 )
685
697
{
686
698
u64 peak_kbps = kbps ;
687
699
688
700
peak_kbps *= 1006 ;
689
- peak_kbps = div_u64 (peak_kbps , 1000 );
701
+ peak_kbps *= fec_overhead_multiplier_x1000 ;
702
+ peak_kbps = div_u64 (peak_kbps , 1000 * 1000 );
690
703
return (int ) DIV64_U64_ROUND_UP (peak_kbps * 64 , (54 * 8 * 1000 ));
691
704
}
692
705
@@ -780,11 +793,12 @@ static int increase_dsc_bpp(struct drm_atomic_state *state,
780
793
int link_timeslots_used ;
781
794
int fair_pbn_alloc ;
782
795
int ret = 0 ;
796
+ uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier (dc_link );
783
797
784
798
for (i = 0 ; i < count ; i ++ ) {
785
799
if (vars [i + k ].dsc_enabled ) {
786
800
initial_slack [i ] =
787
- kbps_to_peak_pbn (params [i ].bw_range .max_kbps ) - vars [i + k ].pbn ;
801
+ kbps_to_peak_pbn (params [i ].bw_range .max_kbps , fec_overhead_multiplier_x1000 ) - vars [i + k ].pbn ;
788
802
bpp_increased [i ] = false;
789
803
remaining_to_increase += 1 ;
790
804
} else {
@@ -880,6 +894,7 @@ static int try_disable_dsc(struct drm_atomic_state *state,
880
894
int next_index ;
881
895
int remaining_to_try = 0 ;
882
896
int ret ;
897
+ uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier (dc_link );
883
898
884
899
for (i = 0 ; i < count ; i ++ ) {
885
900
if (vars [i + k ].dsc_enabled
@@ -909,7 +924,7 @@ static int try_disable_dsc(struct drm_atomic_state *state,
909
924
if (next_index == -1 )
910
925
break ;
911
926
912
- vars [next_index ].pbn = kbps_to_peak_pbn (params [next_index ].bw_range .stream_kbps );
927
+ vars [next_index ].pbn = kbps_to_peak_pbn (params [next_index ].bw_range .stream_kbps , fec_overhead_multiplier_x1000 );
913
928
ret = drm_dp_atomic_find_time_slots (state ,
914
929
params [next_index ].port -> mgr ,
915
930
params [next_index ].port ,
@@ -922,7 +937,7 @@ static int try_disable_dsc(struct drm_atomic_state *state,
922
937
vars [next_index ].dsc_enabled = false;
923
938
vars [next_index ].bpp_x16 = 0 ;
924
939
} else {
925
- vars [next_index ].pbn = kbps_to_peak_pbn (params [next_index ].bw_range .max_kbps );
940
+ vars [next_index ].pbn = kbps_to_peak_pbn (params [next_index ].bw_range .max_kbps , fec_overhead_multiplier_x1000 );
926
941
ret = drm_dp_atomic_find_time_slots (state ,
927
942
params [next_index ].port -> mgr ,
928
943
params [next_index ].port ,
@@ -951,6 +966,7 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
951
966
int count = 0 ;
952
967
int i , k , ret ;
953
968
bool debugfs_overwrite = false;
969
+ uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier (dc_link );
954
970
955
971
memset (params , 0 , sizeof (params ));
956
972
@@ -1012,7 +1028,7 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
1012
1028
/* Try no compression */
1013
1029
for (i = 0 ; i < count ; i ++ ) {
1014
1030
vars [i + k ].aconnector = params [i ].aconnector ;
1015
- vars [i + k ].pbn = kbps_to_peak_pbn (params [i ].bw_range .stream_kbps );
1031
+ vars [i + k ].pbn = kbps_to_peak_pbn (params [i ].bw_range .stream_kbps , fec_overhead_multiplier_x1000 );
1016
1032
vars [i + k ].dsc_enabled = false;
1017
1033
vars [i + k ].bpp_x16 = 0 ;
1018
1034
ret = drm_dp_atomic_find_time_slots (state , params [i ].port -> mgr , params [i ].port ,
@@ -1031,15 +1047,15 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
1031
1047
/* Try max compression */
1032
1048
for (i = 0 ; i < count ; i ++ ) {
1033
1049
if (params [i ].compression_possible && params [i ].clock_force_enable != DSC_CLK_FORCE_DISABLE ) {
1034
- vars [i + k ].pbn = kbps_to_peak_pbn (params [i ].bw_range .min_kbps );
1050
+ vars [i + k ].pbn = kbps_to_peak_pbn (params [i ].bw_range .min_kbps , fec_overhead_multiplier_x1000 );
1035
1051
vars [i + k ].dsc_enabled = true;
1036
1052
vars [i + k ].bpp_x16 = params [i ].bw_range .min_target_bpp_x16 ;
1037
1053
ret = drm_dp_atomic_find_time_slots (state , params [i ].port -> mgr ,
1038
1054
params [i ].port , vars [i + k ].pbn );
1039
1055
if (ret < 0 )
1040
1056
return ret ;
1041
1057
} else {
1042
- vars [i + k ].pbn = kbps_to_peak_pbn (params [i ].bw_range .stream_kbps );
1058
+ vars [i + k ].pbn = kbps_to_peak_pbn (params [i ].bw_range .stream_kbps , fec_overhead_multiplier_x1000 );
1043
1059
vars [i + k ].dsc_enabled = false;
1044
1060
vars [i + k ].bpp_x16 = 0 ;
1045
1061
ret = drm_dp_atomic_find_time_slots (state , params [i ].port -> mgr ,
0 commit comments