drm/amd/display: Assume an LTTPR is always present on fixed_vs links
authorMichael Strauss <michael.strauss@amd.com>
Wed, 31 Aug 2022 19:10:43 +0000 (15:10 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 Oct 2022 07:53:27 +0000 (09:53 +0200)
[ Upstream commit 29956d0fded036a570bd8e7d4ea4b1a1730307d2 ]

[WHY]
LTTPRs can in very rare instsances fail to increment DPCD LTTPR count.
This results in aux-i LTTPR requests to be sent to the wrong DPCD
address, which causes link training failure.

[HOW]
Override internal repeater count if fixed_vs flag is set for a given link

Reviewed-by: George Shen <George.Shen@amd.com>
Acked-by: Wayne Lin <wayne.lin@amd.com>
Signed-off-by: Michael Strauss <michael.strauss@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c

index 6d5dc5a..a6ff1b1 100644 (file)
@@ -3703,6 +3703,14 @@ bool dp_retrieve_lttpr_cap(struct dc_link *link)
                                lttpr_dpcd_data[DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT -
                                                                DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
 
+               /* If this chip cap is set, at least one retimer must exist in the chain
+                * Override count to 1 if we receive a known bad count (0 or an invalid value) */
+               if (link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN &&
+                               (dp_convert_to_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt) == 0)) {
+                       ASSERT(0);
+                       link->dpcd_caps.lttpr_caps.phy_repeater_cnt = 0x80;
+               }
+
                /* Attempt to train in LTTPR transparent mode if repeater count exceeds 8. */
                is_lttpr_present = (dp_convert_to_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt) != 0 &&
                                link->dpcd_caps.lttpr_caps.max_lane_count > 0 &&