mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
drm/amd/display: Fix DP MST sinks removal issue
[ Upstream commitcbd6c1b17d] [Why] In USB4 DP tunneling, it's possible to have this scenario that the path becomes unavailable and CM tears down the path a little bit late. So, in this case, the HPD is high but fails to read any DPCD register. That causes the link connection type to be set to sst. And not all sinks are removed behind the MST branch. [How] Restore the link connection type if it fails to read DPCD register. Cc: stable@vger.kernel.org Cc: Mario Limonciello <mario.limonciello@amd.com> Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com> Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com> Signed-off-by: Cruise Hung <Cruise.Hung@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commitcbd6c1b17d) Modified for stable backport as a lot of the code in this file was moved in 6.3 to drivers/gpu/drm/amd/display/dc/link/link_detection.c. Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5564be74a2
commit
ee9caccc5e
@@ -1016,6 +1016,7 @@ static bool detect_link_and_local_sink(struct dc_link *link,
|
||||
struct dc_sink *prev_sink = NULL;
|
||||
struct dpcd_caps prev_dpcd_caps;
|
||||
enum dc_connection_type new_connection_type = dc_connection_none;
|
||||
enum dc_connection_type pre_connection_type = link->type;
|
||||
const uint32_t post_oui_delay = 30; // 30ms
|
||||
|
||||
DC_LOGGER_INIT(link->ctx->logger);
|
||||
@@ -1118,6 +1119,8 @@ static bool detect_link_and_local_sink(struct dc_link *link,
|
||||
}
|
||||
|
||||
if (!detect_dp(link, &sink_caps, reason)) {
|
||||
link->type = pre_connection_type;
|
||||
|
||||
if (prev_sink)
|
||||
dc_sink_release(prev_sink);
|
||||
return false;
|
||||
@@ -1349,6 +1352,8 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
bool is_delegated_to_mst_top_mgr = false;
|
||||
enum dc_connection_type pre_link_type = link->type;
|
||||
|
||||
DC_LOGGER_INIT(link->ctx->logger);
|
||||
|
||||
is_local_sink_detect_success = detect_link_and_local_sink(link, reason);
|
||||
|
||||
if (is_local_sink_detect_success && link->local_sink)
|
||||
@@ -1359,6 +1364,10 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
link->dpcd_caps.is_mst_capable)
|
||||
is_delegated_to_mst_top_mgr = discover_dp_mst_topology(link, reason);
|
||||
|
||||
DC_LOG_DC("%s: link_index=%d is_local_sink_detect_success=%d pre_link_type=%d link_type=%d\n", __func__,
|
||||
link->link_index, is_local_sink_detect_success, pre_link_type, link->type);
|
||||
|
||||
|
||||
if (is_local_sink_detect_success &&
|
||||
pre_link_type == dc_connection_mst_branch &&
|
||||
link->type != dc_connection_mst_branch)
|
||||
|
||||
Reference in New Issue
Block a user