| From 634231fcc32795eba1a7a48f06e46c3016b934f4 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 21 Jan 2020 16:12:45 -0500 |
| Subject: drm/amd/display: Retrain dongles when SINK_COUNT becomes non-zero |
| |
| From: Harry Wentland <harry.wentland@amd.com> |
| |
| [ Upstream commit 3eb6d7aca53d81ce888624f09cd44dc0302161e8 ] |
| |
| [WHY] |
| Two years ago the patch referenced by the Fixes tag stopped running |
| dp_verify_link_cap_with_retries during DP detection when the reason |
| for the detection was a short-pulse interrupt. This effectively meant |
| that we were no longer doing the verify_link_cap training on active |
| dongles when their SINK_COUNT changed from 0 to 1. |
| |
| A year ago this was partly remedied with: |
| commit 80adaebd2d41 ("drm/amd/display: Don't skip link training for empty dongle") |
| |
| This made sure that we trained the dongle on initial hotplug (without |
| connected downstream devices). |
| |
| This is all fine and dandy if it weren't for the fact that there are |
| some dongles on the market that don't like link training when SINK_COUNT |
| is 0 These dongles will in fact indicate a SINK_COUNT of 0 immediately |
| after hotplug, even when a downstream device is connected, and then |
| trigger a shortpulse interrupt indicating a SINK_COUNT change to 1. |
| |
| In order to play nicely we will need our policy to not link train an |
| active DP dongle when SINK_COUNT is 0 but ensure we train it when the |
| SINK_COUNT changes to 1. |
| |
| [HOW] |
| Call dp_verify_link_cap_with_retries on detection even when the detection |
| is triggered from a short pulse interrupt. |
| |
| With this change we can also revert this commit which we'll do in a separate |
| follow-up change: |
| commit 80adaebd2d41 ("drm/amd/display: Don't skip link training for empty dongle") |
| |
| Fixes: 0301ccbaf67d ("drm/amd/display: DP Compliance 400.1.1 failure") |
| Suggested-by: Louis Li <Ching-shih.Li@amd.com> |
| Tested-by: Louis Li <Ching-shih.Li@amd.com> |
| Cc: Wenjing Liu <Wenjing.Liu@amd.com> |
| Cc: Hersen Wu <hersenxs.wu@amd.com> |
| Cc: Eric Yang <Eric.Yang2@amd.com> |
| Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com> |
| Signed-off-by: Harry Wentland <harry.wentland@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.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c |
| index c0f1c62c59b42..3aedc724241ef 100644 |
| --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c |
| +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c |
| @@ -948,8 +948,7 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) |
| same_edid = is_same_edid(&prev_sink->dc_edid, &sink->dc_edid); |
| |
| if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT && |
| - sink_caps.transaction_type == DDC_TRANSACTION_TYPE_I2C_OVER_AUX && |
| - reason != DETECT_REASON_HPDRX) { |
| + sink_caps.transaction_type == DDC_TRANSACTION_TYPE_I2C_OVER_AUX) { |
| /* |
| * TODO debug why Dell 2413 doesn't like |
| * two link trainings |
| -- |
| 2.20.1 |
| |