Skip to content

Commit 72e2445

Browse files
superm1alexdeucher
authored andcommitted
Revert "drm/amd/display: Fix pbn to kbps Conversion"
Deeply daisy chained DP/MST displays are no longer able to light up. This reverts commit e0dec00 ("drm/amd/display: Fix pbn to kbps Conversion") Cc: Jerry Zuo <jerry.zuo@amd.com> Reported-by: nat@nullable.se Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4756 Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commit e1c9410) Cc: stable@vger.kernel.org # 6.17+
1 parent 93a0162 commit 72e2445

1 file changed

Lines changed: 36 additions & 23 deletions

File tree

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

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

911909
static 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+
17651778
static 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

Comments
 (0)