Commit 1366bdf1 authored by Fangzhi Zuo's avatar Fangzhi Zuo Committed by Zheng Zengkai
Browse files

drm/amd/display: Fix DSC not Enabled on Direct MST Sink

stable inclusion
from stable-v6.6.3
commit 6c888a71d8d4358298305e3578b1664920af7168
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8LBQP

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=6c888a71d8d4358298305e3578b1664920af7168



--------------------------------

commit a58555359a9f870543aaddef277c3396159895ce upstream.

[WHY & HOW]
For the scenario when a dsc capable MST sink device is directly
connected, it needs to use max dsc compression as the link bw constraint.

Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Reviewed-by: default avatarRoman Li <roman.li@amd.com>
Acked-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarFangzhi Zuo <jerry.zuo@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 719fca74
Loading
Loading
Loading
Loading
+14 −15
Original line number Diff line number Diff line
@@ -1598,31 +1598,31 @@ enum dc_status dm_dp_mst_is_port_support_mode(
	unsigned int upper_link_bw_in_kbps = 0, down_link_bw_in_kbps = 0;
	unsigned int max_compressed_bw_in_kbps = 0;
	struct dc_dsc_bw_range bw_range = {0};
	struct drm_dp_mst_topology_mgr *mst_mgr;
	uint16_t full_pbn = aconnector->mst_output_port->full_pbn;

	/*
	 * check if the mode could be supported if DSC pass-through is supported
	 * AND check if there enough bandwidth available to support the mode
	 * with DSC enabled.
	 * Consider the case with the depth of the mst topology tree is equal or less than 2
	 * A. When dsc bitstream can be transmitted along the entire path
	 *    1. dsc is possible between source and branch/leaf device (common dsc params is possible), AND
	 *    2. dsc passthrough supported at MST branch, or
	 *    3. dsc decoding supported at leaf MST device
	 *    Use maximum dsc compression as bw constraint
	 * B. When dsc bitstream cannot be transmitted along the entire path
	 *    Use native bw as bw constraint
	 */
	if (is_dsc_common_config_possible(stream, &bw_range) &&
	    aconnector->mst_output_port->passthrough_aux) {
		mst_mgr = aconnector->mst_output_port->mgr;
		mutex_lock(&mst_mgr->lock);

	   (aconnector->mst_output_port->passthrough_aux ||
	    aconnector->dsc_aux == &aconnector->mst_output_port->aux)) {
		cur_link_settings = stream->link->verified_link_cap;

		upper_link_bw_in_kbps = dc_link_bandwidth_kbps(aconnector->dc_link,
							       &cur_link_settings
							       );
		down_link_bw_in_kbps = kbps_from_pbn(aconnector->mst_output_port->full_pbn);
							       &cur_link_settings);
		down_link_bw_in_kbps = kbps_from_pbn(full_pbn);

		/* pick the bottleneck */
		end_to_end_bw_in_kbps = min(upper_link_bw_in_kbps,
					    down_link_bw_in_kbps);

		mutex_unlock(&mst_mgr->lock);

		/*
		 * use the maximum dsc compression bandwidth as the required
		 * bandwidth for the mode
@@ -1637,8 +1637,7 @@ enum dc_status dm_dp_mst_is_port_support_mode(
		/* check if mode could be supported within full_pbn */
		bpp = convert_dc_color_depth_into_bpc(stream->timing.display_color_depth) * 3;
		pbn = drm_dp_calc_pbn_mode(stream->timing.pix_clk_100hz / 10, bpp, false);

		if (pbn > aconnector->mst_output_port->full_pbn)
		if (pbn > full_pbn)
			return DC_FAIL_BANDWIDTH_VALIDATE;
	}