Skip to content

Commit 68dc184

Browse files
Fangzhi Zuoalexdeucher
authored andcommitted
drm/amd/display: Take FEC Overhead into Timeslot Calculation
8b/10b encoding needs to add 3% fec overhead into the pbn. In the Synapcis Cascaded MST hub, the first stage MST branch device needs the information to determine the timeslot count for the second stage MST branch device. Missing this overhead will leads to insufficient timeslot allocation. Cc: [email protected] Cc: Mario Limonciello <[email protected]> Reviewed-by: Hersen Wu <[email protected]> Acked-by: Qingqing Zhuo <[email protected]> Signed-off-by: Fangzhi Zuo <[email protected]> Tested-by: Daniel Wheeler <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent f4f3b7d commit 68dc184

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -681,12 +681,25 @@ struct dsc_mst_fairness_params {
681681
struct amdgpu_dm_connector *aconnector;
682682
};
683683

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)
685697
{
686698
u64 peak_kbps = kbps;
687699

688700
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);
690703
return (int) DIV64_U64_ROUND_UP(peak_kbps * 64, (54 * 8 * 1000));
691704
}
692705

@@ -780,11 +793,12 @@ static int increase_dsc_bpp(struct drm_atomic_state *state,
780793
int link_timeslots_used;
781794
int fair_pbn_alloc;
782795
int ret = 0;
796+
uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier(dc_link);
783797

784798
for (i = 0; i < count; i++) {
785799
if (vars[i + k].dsc_enabled) {
786800
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;
788802
bpp_increased[i] = false;
789803
remaining_to_increase += 1;
790804
} else {
@@ -880,6 +894,7 @@ static int try_disable_dsc(struct drm_atomic_state *state,
880894
int next_index;
881895
int remaining_to_try = 0;
882896
int ret;
897+
uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier(dc_link);
883898

884899
for (i = 0; i < count; i++) {
885900
if (vars[i + k].dsc_enabled
@@ -909,7 +924,7 @@ static int try_disable_dsc(struct drm_atomic_state *state,
909924
if (next_index == -1)
910925
break;
911926

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);
913928
ret = drm_dp_atomic_find_time_slots(state,
914929
params[next_index].port->mgr,
915930
params[next_index].port,
@@ -922,7 +937,7 @@ static int try_disable_dsc(struct drm_atomic_state *state,
922937
vars[next_index].dsc_enabled = false;
923938
vars[next_index].bpp_x16 = 0;
924939
} 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);
926941
ret = drm_dp_atomic_find_time_slots(state,
927942
params[next_index].port->mgr,
928943
params[next_index].port,
@@ -951,6 +966,7 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
951966
int count = 0;
952967
int i, k, ret;
953968
bool debugfs_overwrite = false;
969+
uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier(dc_link);
954970

955971
memset(params, 0, sizeof(params));
956972

@@ -1012,7 +1028,7 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
10121028
/* Try no compression */
10131029
for (i = 0; i < count; i++) {
10141030
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);
10161032
vars[i + k].dsc_enabled = false;
10171033
vars[i + k].bpp_x16 = 0;
10181034
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,
10311047
/* Try max compression */
10321048
for (i = 0; i < count; i++) {
10331049
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);
10351051
vars[i + k].dsc_enabled = true;
10361052
vars[i + k].bpp_x16 = params[i].bw_range.min_target_bpp_x16;
10371053
ret = drm_dp_atomic_find_time_slots(state, params[i].port->mgr,
10381054
params[i].port, vars[i + k].pbn);
10391055
if (ret < 0)
10401056
return ret;
10411057
} 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);
10431059
vars[i + k].dsc_enabled = false;
10441060
vars[i + k].bpp_x16 = 0;
10451061
ret = drm_dp_atomic_find_time_slots(state, params[i].port->mgr,

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@
4646
#define SYNAPTICS_CASCADED_HUB_ID 0x5A
4747
#define IS_SYNAPTICS_CASCADED_PANAMERA(devName, data) ((IS_SYNAPTICS_PANAMERA(devName) && ((int)data[2] == SYNAPTICS_CASCADED_HUB_ID)) ? 1 : 0)
4848

49+
#define PBN_FEC_OVERHEAD_MULTIPLIER_8B_10B 1031
50+
#define PBN_FEC_OVERHEAD_MULTIPLIER_128B_132B 1000
51+
4952
struct amdgpu_display_manager;
5053
struct amdgpu_dm_connector;
5154

0 commit comments

Comments
 (0)