Commit 63c0bf99 authored by George Shen's avatar George Shen Committed by Alex Deucher

drm/amd/display: Add link encoding to timing BW calculation parameters

[Why]
There certain cases where the timing BW is dependent on the type of link
encoding in use. Thus to calculate the correct BW required for a given
timing, the link encoding should be added as a parameter.
Reviewed-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Acked-by: default avatarAlan Liu <haoping.liu@amd.com>
Signed-off-by: default avatarGeorge Shen <george.shen@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 97476418
...@@ -5793,6 +5793,7 @@ static void apply_dsc_policy_for_edp(struct amdgpu_dm_connector *aconnector, ...@@ -5793,6 +5793,7 @@ static void apply_dsc_policy_for_edp(struct amdgpu_dm_connector *aconnector,
edp_min_bpp_x16, edp_max_bpp_x16, edp_min_bpp_x16, edp_max_bpp_x16,
dsc_caps, dsc_caps,
&stream->timing, &stream->timing,
dc_link_get_highest_encoding_format(aconnector->dc_link),
&bw_range)) { &bw_range)) {
if (bw_range.max_kbps < link_bw_in_kbps) { if (bw_range.max_kbps < link_bw_in_kbps) {
...@@ -5801,6 +5802,7 @@ static void apply_dsc_policy_for_edp(struct amdgpu_dm_connector *aconnector, ...@@ -5801,6 +5802,7 @@ static void apply_dsc_policy_for_edp(struct amdgpu_dm_connector *aconnector,
&dsc_options, &dsc_options,
0, 0,
&stream->timing, &stream->timing,
dc_link_get_highest_encoding_format(aconnector->dc_link),
&dsc_cfg)) { &dsc_cfg)) {
stream->timing.dsc_cfg = dsc_cfg; stream->timing.dsc_cfg = dsc_cfg;
stream->timing.flags.DSC = 1; stream->timing.flags.DSC = 1;
...@@ -5815,6 +5817,7 @@ static void apply_dsc_policy_for_edp(struct amdgpu_dm_connector *aconnector, ...@@ -5815,6 +5817,7 @@ static void apply_dsc_policy_for_edp(struct amdgpu_dm_connector *aconnector,
&dsc_options, &dsc_options,
link_bw_in_kbps, link_bw_in_kbps,
&stream->timing, &stream->timing,
dc_link_get_highest_encoding_format(aconnector->dc_link),
&dsc_cfg)) { &dsc_cfg)) {
stream->timing.dsc_cfg = dsc_cfg; stream->timing.dsc_cfg = dsc_cfg;
stream->timing.flags.DSC = 1; stream->timing.flags.DSC = 1;
...@@ -5858,12 +5861,14 @@ static void apply_dsc_policy_for_stream(struct amdgpu_dm_connector *aconnector, ...@@ -5858,12 +5861,14 @@ static void apply_dsc_policy_for_stream(struct amdgpu_dm_connector *aconnector,
&dsc_options, &dsc_options,
link_bandwidth_kbps, link_bandwidth_kbps,
&stream->timing, &stream->timing,
dc_link_get_highest_encoding_format(aconnector->dc_link),
&stream->timing.dsc_cfg)) { &stream->timing.dsc_cfg)) {
stream->timing.flags.DSC = 1; stream->timing.flags.DSC = 1;
DRM_DEBUG_DRIVER("%s: [%s] DSC is selected from SST RX\n", __func__, drm_connector->name); DRM_DEBUG_DRIVER("%s: [%s] DSC is selected from SST RX\n", __func__, drm_connector->name);
} }
} else if (sink->link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER) { } else if (sink->link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER) {
timing_bw_in_kbps = dc_bandwidth_in_kbps_from_timing(&stream->timing); timing_bw_in_kbps = dc_bandwidth_in_kbps_from_timing(&stream->timing,
dc_link_get_highest_encoding_format(aconnector->dc_link));
max_supported_bw_in_kbps = link_bandwidth_kbps; max_supported_bw_in_kbps = link_bandwidth_kbps;
dsc_max_supported_bw_in_kbps = link_bandwidth_kbps; dsc_max_supported_bw_in_kbps = link_bandwidth_kbps;
...@@ -5875,6 +5880,7 @@ static void apply_dsc_policy_for_stream(struct amdgpu_dm_connector *aconnector, ...@@ -5875,6 +5880,7 @@ static void apply_dsc_policy_for_stream(struct amdgpu_dm_connector *aconnector,
&dsc_options, &dsc_options,
dsc_max_supported_bw_in_kbps, dsc_max_supported_bw_in_kbps,
&stream->timing, &stream->timing,
dc_link_get_highest_encoding_format(aconnector->dc_link),
&stream->timing.dsc_cfg)) { &stream->timing.dsc_cfg)) {
stream->timing.flags.DSC = 1; stream->timing.flags.DSC = 1;
DRM_DEBUG_DRIVER("%s: [%s] DSC is selected from DP-HDMI PCON\n", DRM_DEBUG_DRIVER("%s: [%s] DSC is selected from DP-HDMI PCON\n",
......
...@@ -828,6 +828,7 @@ static void set_dsc_configs_from_fairness_vars(struct dsc_mst_fairness_params *p ...@@ -828,6 +828,7 @@ static void set_dsc_configs_from_fairness_vars(struct dsc_mst_fairness_params *p
&dsc_options, &dsc_options,
0, 0,
params[i].timing, params[i].timing,
dc_link_get_highest_encoding_format(params[i].aconnector->dc_link),
&params[i].timing->dsc_cfg)) { &params[i].timing->dsc_cfg)) {
params[i].timing->flags.DSC = 1; params[i].timing->flags.DSC = 1;
...@@ -878,7 +879,9 @@ static int bpp_x16_from_pbn(struct dsc_mst_fairness_params param, int pbn) ...@@ -878,7 +879,9 @@ static int bpp_x16_from_pbn(struct dsc_mst_fairness_params param, int pbn)
param.sink->ctx->dc->res_pool->dscs[0], param.sink->ctx->dc->res_pool->dscs[0],
&param.sink->dsc_caps.dsc_dec_caps, &param.sink->dsc_caps.dsc_dec_caps,
&dsc_options, &dsc_options,
(int) kbps, param.timing, &dsc_config); (int) kbps, param.timing,
dc_link_get_highest_encoding_format(param.aconnector->dc_link),
&dsc_config);
return dsc_config.bits_per_pixel; return dsc_config.bits_per_pixel;
} }
...@@ -1116,8 +1119,11 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state, ...@@ -1116,8 +1119,11 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
dsc_policy.min_target_bpp * 16, dsc_policy.min_target_bpp * 16,
dsc_policy.max_target_bpp * 16, dsc_policy.max_target_bpp * 16,
&stream->sink->dsc_caps.dsc_dec_caps, &stream->sink->dsc_caps.dsc_dec_caps,
&stream->timing, &params[count].bw_range)) &stream->timing,
params[count].bw_range.stream_kbps = dc_bandwidth_in_kbps_from_timing(&stream->timing); dc_link_get_highest_encoding_format(dc_link),
&params[count].bw_range))
params[count].bw_range.stream_kbps = dc_bandwidth_in_kbps_from_timing(&stream->timing,
dc_link_get_highest_encoding_format(dc_link));
count++; count++;
} }
...@@ -1577,7 +1583,7 @@ static bool is_dsc_common_config_possible(struct dc_stream_state *stream, ...@@ -1577,7 +1583,7 @@ static bool is_dsc_common_config_possible(struct dc_stream_state *stream,
dsc_policy.min_target_bpp * 16, dsc_policy.min_target_bpp * 16,
dsc_policy.max_target_bpp * 16, dsc_policy.max_target_bpp * 16,
&stream->sink->dsc_caps.dsc_dec_caps, &stream->sink->dsc_caps.dsc_dec_caps,
&stream->timing, bw_range); &stream->timing, dc_link_get_highest_encoding_format(stream->link), bw_range);
return bw_range->max_target_bpp_x16 && bw_range->min_target_bpp_x16; return bw_range->max_target_bpp_x16 && bw_range->min_target_bpp_x16;
} }
......
...@@ -314,6 +314,24 @@ const struct dc_link_settings *dc_link_get_link_cap(const struct dc_link *link) ...@@ -314,6 +314,24 @@ const struct dc_link_settings *dc_link_get_link_cap(const struct dc_link *link)
return link->dc->link_srv->dp_get_verified_link_cap(link); return link->dc->link_srv->dp_get_verified_link_cap(link);
} }
enum dc_link_encoding_format dc_link_get_highest_encoding_format(const struct dc_link *link)
{
if (dc_is_dp_signal(link->connector_signal)) {
if (link->dpcd_caps.dongle_type >= DISPLAY_DONGLE_DP_DVI_DONGLE &&
link->dpcd_caps.dongle_type <= DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE)
return DC_LINK_ENCODING_HDMI_TMDS;
else if (link->dc->link_srv->dp_get_encoding_format(&link->verified_link_cap) ==
DP_8b_10b_ENCODING)
return DC_LINK_ENCODING_DP_8b_10b;
else if (link->dc->link_srv->dp_get_encoding_format(&link->verified_link_cap) ==
DP_128b_132b_ENCODING)
return DC_LINK_ENCODING_DP_128b_132b;
} else if (dc_is_hdmi_signal(link->connector_signal)) {
}
return DC_LINK_ENCODING_UNSPECIFIED;
}
bool dc_link_is_dp_sink_present(struct dc_link *link) bool dc_link_is_dp_sink_present(struct dc_link *link)
{ {
return link->dc->link_srv->dp_is_sink_present(link); return link->dc->link_srv->dp_is_sink_present(link);
......
...@@ -1415,7 +1415,9 @@ void dc_set_disable_128b_132b_stream_overhead(bool disable); ...@@ -1415,7 +1415,9 @@ void dc_set_disable_128b_132b_stream_overhead(bool disable);
/* The function returns minimum bandwidth required to drive a given timing /* The function returns minimum bandwidth required to drive a given timing
* return - minimum required timing bandwidth in kbps. * return - minimum required timing bandwidth in kbps.
*/ */
uint32_t dc_bandwidth_in_kbps_from_timing(const struct dc_crtc_timing *timing); uint32_t dc_bandwidth_in_kbps_from_timing(
const struct dc_crtc_timing *timing,
const enum dc_link_encoding_format link_encoding);
/* Link Interfaces */ /* Link Interfaces */
/* /*
...@@ -1853,6 +1855,14 @@ enum dp_link_encoding dc_link_dp_mst_decide_link_encoding_format( ...@@ -1853,6 +1855,14 @@ enum dp_link_encoding dc_link_dp_mst_decide_link_encoding_format(
*/ */
const struct dc_link_settings *dc_link_get_link_cap(const struct dc_link *link); const struct dc_link_settings *dc_link_get_link_cap(const struct dc_link *link);
/* Get the highest encoding format that the link supports; highest meaning the
* encoding format which supports the maximum bandwidth.
*
* @link - a link with DP RX connection
* return - highest encoding format link supports.
*/
enum dc_link_encoding_format dc_link_get_highest_encoding_format(const struct dc_link *link);
/* Check if a RX (ex. DP sink, MST hub, passive or active dongle) is connected /* Check if a RX (ex. DP sink, MST hub, passive or active dongle) is connected
* to a link with dp connector signal type. * to a link with dp connector signal type.
* @link - a link with dp connector signal type * @link - a link with dp connector signal type
......
...@@ -73,6 +73,7 @@ bool dc_dsc_compute_bandwidth_range( ...@@ -73,6 +73,7 @@ bool dc_dsc_compute_bandwidth_range(
uint32_t max_bpp_x16, uint32_t max_bpp_x16,
const struct dsc_dec_dpcd_caps *dsc_sink_caps, const struct dsc_dec_dpcd_caps *dsc_sink_caps,
const struct dc_crtc_timing *timing, const struct dc_crtc_timing *timing,
const enum dc_link_encoding_format link_encoding,
struct dc_dsc_bw_range *range); struct dc_dsc_bw_range *range);
bool dc_dsc_compute_config( bool dc_dsc_compute_config(
...@@ -81,6 +82,7 @@ bool dc_dsc_compute_config( ...@@ -81,6 +82,7 @@ bool dc_dsc_compute_config(
const struct dc_dsc_config_options *options, const struct dc_dsc_config_options *options,
uint32_t target_bandwidth_kbps, uint32_t target_bandwidth_kbps,
const struct dc_crtc_timing *timing, const struct dc_crtc_timing *timing,
const enum dc_link_encoding_format link_encoding,
struct dc_dsc_config *dsc_cfg); struct dc_dsc_config *dsc_cfg);
uint32_t dc_dsc_stream_bandwidth_in_kbps(const struct dc_crtc_timing *timing, uint32_t dc_dsc_stream_bandwidth_in_kbps(const struct dc_crtc_timing *timing,
......
...@@ -878,7 +878,7 @@ struct dsc_dec_dpcd_caps { ...@@ -878,7 +878,7 @@ struct dsc_dec_dpcd_caps {
uint32_t branch_overall_throughput_0_mps; /* In MPs */ uint32_t branch_overall_throughput_0_mps; /* In MPs */
uint32_t branch_overall_throughput_1_mps; /* In MPs */ uint32_t branch_overall_throughput_1_mps; /* In MPs */
uint32_t branch_max_line_width; uint32_t branch_max_line_width;
bool is_dp; bool is_dp; /* Decoded format */
}; };
struct dc_golden_table { struct dc_golden_table {
...@@ -901,6 +901,14 @@ enum dc_gpu_mem_alloc_type { ...@@ -901,6 +901,14 @@ enum dc_gpu_mem_alloc_type {
DC_MEM_ALLOC_TYPE_AGP DC_MEM_ALLOC_TYPE_AGP
}; };
enum dc_link_encoding_format {
DC_LINK_ENCODING_UNSPECIFIED = 0,
DC_LINK_ENCODING_DP_8b_10b,
DC_LINK_ENCODING_DP_128b_132b,
DC_LINK_ENCODING_HDMI_TMDS,
DC_LINK_ENCODING_HDMI_FRL
};
enum dc_psr_version { enum dc_psr_version {
DC_PSR_VERSION_1 = 0, DC_PSR_VERSION_1 = 0,
DC_PSR_VERSION_SU_1 = 1, DC_PSR_VERSION_SU_1 = 1,
......
...@@ -85,7 +85,8 @@ static uint32_t apply_128b_132b_stream_overhead( ...@@ -85,7 +85,8 @@ static uint32_t apply_128b_132b_stream_overhead(
} }
uint32_t dc_bandwidth_in_kbps_from_timing( uint32_t dc_bandwidth_in_kbps_from_timing(
const struct dc_crtc_timing *timing) const struct dc_crtc_timing *timing,
const enum dc_link_encoding_format link_encoding)
{ {
uint32_t bits_per_channel = 0; uint32_t bits_per_channel = 0;
uint32_t kbps; uint32_t kbps;
...@@ -133,6 +134,9 @@ uint32_t dc_bandwidth_in_kbps_from_timing( ...@@ -133,6 +134,9 @@ uint32_t dc_bandwidth_in_kbps_from_timing(
kbps = kbps * 2 / 3; kbps = kbps * 2 / 3;
} }
if (link_encoding == DC_LINK_ENCODING_DP_128b_132b)
kbps = apply_128b_132b_stream_overhead(timing, kbps);
return kbps; return kbps;
} }
...@@ -144,6 +148,7 @@ static bool decide_dsc_bandwidth_range( ...@@ -144,6 +148,7 @@ static bool decide_dsc_bandwidth_range(
const uint32_t num_slices_h, const uint32_t num_slices_h,
const struct dsc_enc_caps *dsc_caps, const struct dsc_enc_caps *dsc_caps,
const struct dc_crtc_timing *timing, const struct dc_crtc_timing *timing,
const enum dc_link_encoding_format link_encoding,
struct dc_dsc_bw_range *range); struct dc_dsc_bw_range *range);
static uint32_t compute_bpp_x16_from_target_bandwidth( static uint32_t compute_bpp_x16_from_target_bandwidth(
...@@ -170,6 +175,7 @@ static bool setup_dsc_config( ...@@ -170,6 +175,7 @@ static bool setup_dsc_config(
int target_bandwidth_kbps, int target_bandwidth_kbps,
const struct dc_crtc_timing *timing, const struct dc_crtc_timing *timing,
const struct dc_dsc_config_options *options, const struct dc_dsc_config_options *options,
const enum dc_link_encoding_format link_encoding,
struct dc_dsc_config *dsc_cfg); struct dc_dsc_config *dsc_cfg);
static bool dsc_buff_block_size_from_dpcd(int dpcd_buff_block_size, int *buff_block_size) static bool dsc_buff_block_size_from_dpcd(int dpcd_buff_block_size, int *buff_block_size)
...@@ -435,6 +441,7 @@ bool dc_dsc_compute_bandwidth_range( ...@@ -435,6 +441,7 @@ bool dc_dsc_compute_bandwidth_range(
uint32_t max_bpp_x16, uint32_t max_bpp_x16,
const struct dsc_dec_dpcd_caps *dsc_sink_caps, const struct dsc_dec_dpcd_caps *dsc_sink_caps,
const struct dc_crtc_timing *timing, const struct dc_crtc_timing *timing,
const enum dc_link_encoding_format link_encoding,
struct dc_dsc_bw_range *range) struct dc_dsc_bw_range *range)
{ {
bool is_dsc_possible = false; bool is_dsc_possible = false;
...@@ -454,11 +461,11 @@ bool dc_dsc_compute_bandwidth_range( ...@@ -454,11 +461,11 @@ bool dc_dsc_compute_bandwidth_range(
if (is_dsc_possible) if (is_dsc_possible)
is_dsc_possible = setup_dsc_config(dsc_sink_caps, &dsc_enc_caps, 0, timing, is_dsc_possible = setup_dsc_config(dsc_sink_caps, &dsc_enc_caps, 0, timing,
&options, &config); &options, link_encoding, &config);
if (is_dsc_possible) if (is_dsc_possible)
is_dsc_possible = decide_dsc_bandwidth_range(min_bpp_x16, max_bpp_x16, is_dsc_possible = decide_dsc_bandwidth_range(min_bpp_x16, max_bpp_x16,
config.num_slices_h, &dsc_common_caps, timing, range); config.num_slices_h, &dsc_common_caps, timing, link_encoding, range);
return is_dsc_possible; return is_dsc_possible;
} }
...@@ -594,6 +601,7 @@ static bool decide_dsc_bandwidth_range( ...@@ -594,6 +601,7 @@ static bool decide_dsc_bandwidth_range(
const uint32_t num_slices_h, const uint32_t num_slices_h,
const struct dsc_enc_caps *dsc_caps, const struct dsc_enc_caps *dsc_caps,
const struct dc_crtc_timing *timing, const struct dc_crtc_timing *timing,
const enum dc_link_encoding_format link_encoding,
struct dc_dsc_bw_range *range) struct dc_dsc_bw_range *range)
{ {
uint32_t preferred_bpp_x16 = timing->dsc_fixed_bits_per_pixel_x16; uint32_t preferred_bpp_x16 = timing->dsc_fixed_bits_per_pixel_x16;
...@@ -623,7 +631,7 @@ static bool decide_dsc_bandwidth_range( ...@@ -623,7 +631,7 @@ static bool decide_dsc_bandwidth_range(
/* populate output structure */ /* populate output structure */
if (range->max_target_bpp_x16 >= range->min_target_bpp_x16 && range->min_target_bpp_x16 > 0) { if (range->max_target_bpp_x16 >= range->min_target_bpp_x16 && range->min_target_bpp_x16 > 0) {
/* native stream bandwidth */ /* native stream bandwidth */
range->stream_kbps = dc_bandwidth_in_kbps_from_timing(timing); range->stream_kbps = dc_bandwidth_in_kbps_from_timing(timing, link_encoding);
/* max dsc target bpp */ /* max dsc target bpp */
range->max_kbps = dc_dsc_stream_bandwidth_in_kbps(timing, range->max_kbps = dc_dsc_stream_bandwidth_in_kbps(timing,
...@@ -649,6 +657,7 @@ static bool decide_dsc_target_bpp_x16( ...@@ -649,6 +657,7 @@ static bool decide_dsc_target_bpp_x16(
const int target_bandwidth_kbps, const int target_bandwidth_kbps,
const struct dc_crtc_timing *timing, const struct dc_crtc_timing *timing,
const int num_slices_h, const int num_slices_h,
const enum dc_link_encoding_format link_encoding,
int *target_bpp_x16) int *target_bpp_x16)
{ {
struct dc_dsc_bw_range range; struct dc_dsc_bw_range range;
...@@ -656,7 +665,7 @@ static bool decide_dsc_target_bpp_x16( ...@@ -656,7 +665,7 @@ static bool decide_dsc_target_bpp_x16(
*target_bpp_x16 = 0; *target_bpp_x16 = 0;
if (decide_dsc_bandwidth_range(policy->min_target_bpp * 16, policy->max_target_bpp * 16, if (decide_dsc_bandwidth_range(policy->min_target_bpp * 16, policy->max_target_bpp * 16,
num_slices_h, dsc_common_caps, timing, &range)) { num_slices_h, dsc_common_caps, timing, link_encoding, &range)) {
if (target_bandwidth_kbps >= range.stream_kbps) { if (target_bandwidth_kbps >= range.stream_kbps) {
if (policy->enable_dsc_when_not_needed) if (policy->enable_dsc_when_not_needed)
/* enable max bpp even dsc is not needed */ /* enable max bpp even dsc is not needed */
...@@ -833,6 +842,7 @@ static bool setup_dsc_config( ...@@ -833,6 +842,7 @@ static bool setup_dsc_config(
int target_bandwidth_kbps, int target_bandwidth_kbps,
const struct dc_crtc_timing *timing, const struct dc_crtc_timing *timing,
const struct dc_dsc_config_options *options, const struct dc_dsc_config_options *options,
const enum dc_link_encoding_format link_encoding,
struct dc_dsc_config *dsc_cfg) struct dc_dsc_config *dsc_cfg)
{ {
struct dsc_enc_caps dsc_common_caps; struct dsc_enc_caps dsc_common_caps;
...@@ -1032,6 +1042,7 @@ static bool setup_dsc_config( ...@@ -1032,6 +1042,7 @@ static bool setup_dsc_config(
target_bandwidth_kbps, target_bandwidth_kbps,
timing, timing,
num_slices_h, num_slices_h,
link_encoding,
&target_bpp); &target_bpp);
dsc_cfg->bits_per_pixel = target_bpp; dsc_cfg->bits_per_pixel = target_bpp;
} }
...@@ -1060,6 +1071,7 @@ bool dc_dsc_compute_config( ...@@ -1060,6 +1071,7 @@ bool dc_dsc_compute_config(
const struct dc_dsc_config_options *options, const struct dc_dsc_config_options *options,
uint32_t target_bandwidth_kbps, uint32_t target_bandwidth_kbps,
const struct dc_crtc_timing *timing, const struct dc_crtc_timing *timing,
const enum dc_link_encoding_format link_encoding,
struct dc_dsc_config *dsc_cfg) struct dc_dsc_config *dsc_cfg)
{ {
bool is_dsc_possible = false; bool is_dsc_possible = false;
...@@ -1069,7 +1081,7 @@ bool dc_dsc_compute_config( ...@@ -1069,7 +1081,7 @@ bool dc_dsc_compute_config(
is_dsc_possible = setup_dsc_config(dsc_sink_caps, is_dsc_possible = setup_dsc_config(dsc_sink_caps,
&dsc_enc_caps, &dsc_enc_caps,
target_bandwidth_kbps, target_bandwidth_kbps,
timing, options, dsc_cfg); timing, options, link_encoding, dsc_cfg);
return is_dsc_possible; return is_dsc_possible;
} }
......
...@@ -1079,8 +1079,14 @@ static struct fixed31_32 get_pbn_from_bw_in_kbps(uint64_t kbps) ...@@ -1079,8 +1079,14 @@ static struct fixed31_32 get_pbn_from_bw_in_kbps(uint64_t kbps)
static struct fixed31_32 get_pbn_from_timing(struct pipe_ctx *pipe_ctx) static struct fixed31_32 get_pbn_from_timing(struct pipe_ctx *pipe_ctx)
{ {
uint64_t kbps; uint64_t kbps;
enum dc_link_encoding_format link_encoding;
kbps = dc_bandwidth_in_kbps_from_timing(&pipe_ctx->stream->timing); if (dp_is_128b_132b_signal(pipe_ctx))
link_encoding = DC_LINK_ENCODING_DP_128b_132b;
else
link_encoding = DC_LINK_ENCODING_DP_8b_10b;
kbps = dc_bandwidth_in_kbps_from_timing(&pipe_ctx->stream->timing, link_encoding);
return get_pbn_from_bw_in_kbps(kbps); return get_pbn_from_bw_in_kbps(kbps);
} }
...@@ -1538,7 +1544,8 @@ struct fixed31_32 link_calculate_sst_avg_time_slots_per_mtp( ...@@ -1538,7 +1544,8 @@ struct fixed31_32 link_calculate_sst_avg_time_slots_per_mtp(
dc_fixpt_div_int(link_bw_effective, MAX_MTP_SLOT_COUNT); dc_fixpt_div_int(link_bw_effective, MAX_MTP_SLOT_COUNT);
struct fixed31_32 timing_bw = struct fixed31_32 timing_bw =
dc_fixpt_from_int( dc_fixpt_from_int(
dc_bandwidth_in_kbps_from_timing(&stream->timing)); dc_bandwidth_in_kbps_from_timing(&stream->timing,
dc_link_get_highest_encoding_format(link)));
struct fixed31_32 avg_time_slots_per_mtp = struct fixed31_32 avg_time_slots_per_mtp =
dc_fixpt_div(timing_bw, timeslot_bw_effective); dc_fixpt_div(timing_bw, timeslot_bw_effective);
......
...@@ -130,7 +130,8 @@ static bool dp_active_dongle_validate_timing( ...@@ -130,7 +130,8 @@ static bool dp_active_dongle_validate_timing(
/* DP input has DSC, HDMI FRL output doesn't have DSC, remove DSC from output timing */ /* DP input has DSC, HDMI FRL output doesn't have DSC, remove DSC from output timing */
outputTiming.flags.DSC = 0; outputTiming.flags.DSC = 0;
#endif #endif
if (dc_bandwidth_in_kbps_from_timing(&outputTiming) > dongle_caps->dp_hdmi_frl_max_link_bw_in_kbps) if (dc_bandwidth_in_kbps_from_timing(&outputTiming, DC_LINK_ENCODING_HDMI_FRL) >
dongle_caps->dp_hdmi_frl_max_link_bw_in_kbps)
return false; return false;
} else { // DP to HDMI TMDS converter } else { // DP to HDMI TMDS converter
if (get_tmds_output_pixel_clock_100hz(timing) > (dongle_caps->dp_hdmi_max_pixel_clk_in_khz * 10)) if (get_tmds_output_pixel_clock_100hz(timing) > (dongle_caps->dp_hdmi_max_pixel_clk_in_khz * 10))
...@@ -285,7 +286,7 @@ static bool dp_validate_mode_timing( ...@@ -285,7 +286,7 @@ static bool dp_validate_mode_timing(
link_setting = &link->verified_link_cap; link_setting = &link->verified_link_cap;
*/ */
req_bw = dc_bandwidth_in_kbps_from_timing(timing); req_bw = dc_bandwidth_in_kbps_from_timing(timing, dc_link_get_highest_encoding_format(link));
max_bw = dp_link_bandwidth_kbps(link, link_setting); max_bw = dp_link_bandwidth_kbps(link, link_setting);
if (req_bw <= max_bw) { if (req_bw <= max_bw) {
...@@ -357,7 +358,8 @@ bool link_validate_dpia_bandwidth(const struct dc_stream_state *stream, const un ...@@ -357,7 +358,8 @@ bool link_validate_dpia_bandwidth(const struct dc_stream_state *stream, const un
for (uint8_t i = 0; i < num_streams; ++i) { for (uint8_t i = 0; i < num_streams; ++i) {
link[i] = stream[i].link; link[i] = stream[i].link;
bw_needed[i] = dc_bandwidth_in_kbps_from_timing(&stream[i].timing); bw_needed[i] = dc_bandwidth_in_kbps_from_timing(&stream[i].timing,
dc_link_get_highest_encoding_format(link[i]));
} }
ret = dpia_validate_usb4_bw(link, bw_needed, num_streams); ret = dpia_validate_usb4_bw(link, bw_needed, num_streams);
......
...@@ -906,7 +906,7 @@ bool link_decide_link_settings(struct dc_stream_state *stream, ...@@ -906,7 +906,7 @@ bool link_decide_link_settings(struct dc_stream_state *stream,
struct dc_link_settings *link_setting) struct dc_link_settings *link_setting)
{ {
struct dc_link *link = stream->link; struct dc_link *link = stream->link;
uint32_t req_bw = dc_bandwidth_in_kbps_from_timing(&stream->timing); uint32_t req_bw = dc_bandwidth_in_kbps_from_timing(&stream->timing, dc_link_get_highest_encoding_format(link));
memset(link_setting, 0, sizeof(*link_setting)); memset(link_setting, 0, sizeof(*link_setting));
...@@ -939,7 +939,8 @@ bool link_decide_link_settings(struct dc_stream_state *stream, ...@@ -939,7 +939,8 @@ bool link_decide_link_settings(struct dc_stream_state *stream,
tmp_link_setting.link_rate = LINK_RATE_UNKNOWN; tmp_link_setting.link_rate = LINK_RATE_UNKNOWN;
tmp_timing.flags.DSC = 0; tmp_timing.flags.DSC = 0;
orig_req_bw = dc_bandwidth_in_kbps_from_timing(&tmp_timing); orig_req_bw = dc_bandwidth_in_kbps_from_timing(&tmp_timing,
dc_link_get_highest_encoding_format(link));
edp_decide_link_settings(link, &tmp_link_setting, orig_req_bw); edp_decide_link_settings(link, &tmp_link_setting, orig_req_bw);
max_link_rate = tmp_link_setting.link_rate; max_link_rate = tmp_link_setting.link_rate;
} }
......
...@@ -1699,13 +1699,20 @@ bool perform_link_training_with_retries( ...@@ -1699,13 +1699,20 @@ bool perform_link_training_with_retries(
} else if (do_fallback) { /* Try training at lower link bandwidth if doing fallback. */ } else if (do_fallback) { /* Try training at lower link bandwidth if doing fallback. */
uint32_t req_bw; uint32_t req_bw;
uint32_t link_bw; uint32_t link_bw;
enum dc_link_encoding_format link_encoding = DC_LINK_ENCODING_UNSPECIFIED;
decide_fallback_link_setting(link, &max_link_settings, decide_fallback_link_setting(link, &max_link_settings,
&cur_link_settings, status); &cur_link_settings, status);
if (link_dp_get_encoding_format(&cur_link_settings) == DP_8b_10b_ENCODING)
link_encoding = DC_LINK_ENCODING_DP_8b_10b;
else if (link_dp_get_encoding_format(&cur_link_settings) == DP_128b_132b_ENCODING)
link_encoding = DC_LINK_ENCODING_DP_128b_132b;
/* Flag if reduced link bandwidth no longer meets stream requirements or fallen back to /* Flag if reduced link bandwidth no longer meets stream requirements or fallen back to
* minimum link bandwidth. * minimum link bandwidth.
*/ */
req_bw = dc_bandwidth_in_kbps_from_timing(&stream->timing); req_bw = dc_bandwidth_in_kbps_from_timing(&stream->timing, link_encoding);
link_bw = dp_link_bandwidth_kbps(link, &cur_link_settings); link_bw = dp_link_bandwidth_kbps(link, &cur_link_settings);
is_link_bw_low = (req_bw > link_bw); is_link_bw_low = (req_bw > link_bw);
is_link_bw_min = ((cur_link_settings.link_rate <= LINK_RATE_LOW) && is_link_bw_min = ((cur_link_settings.link_rate <= LINK_RATE_LOW) &&
......
...@@ -320,7 +320,7 @@ bool edp_is_ilr_optimization_required(struct dc_link *link, ...@@ -320,7 +320,7 @@ bool edp_is_ilr_optimization_required(struct dc_link *link,
core_link_read_dpcd(link, DP_LANE_COUNT_SET, core_link_read_dpcd(link, DP_LANE_COUNT_SET,
&lane_count_set.raw, sizeof(lane_count_set)); &lane_count_set.raw, sizeof(lane_count_set));
req_bw = dc_bandwidth_in_kbps_from_timing(crtc_timing); req_bw = dc_bandwidth_in_kbps_from_timing(crtc_timing, dc_link_get_highest_encoding_format(link));
if (!crtc_timing->flags.DSC) if (!crtc_timing->flags.DSC)
edp_decide_link_settings(link, &link_setting, req_bw); edp_decide_link_settings(link, &link_setting, req_bw);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment