Skip to content

Commit 984982f

Browse files
committed
drm/i915/ilk-glk: Fix link training on links with LTTPRs
The spec requires to use at least 3.2ms for the AUX timeout period if there are LT-tunable PHY Repeaters on the link (2.11.2). An upcoming spec update makes this more specific, by requiring a 3.2ms minimum timeout period for the LTTPR detection reading the 0xF0000-0xF0007 range (3.6.5.1). Accordingly disable LTTPR detection until GLK, where the maximum timeout we can set is only 1.6ms. Link training in the non-transparent mode is known to fail at least on some SKL systems with a WD19 dock on the link, which exposes an LTTPR (see the References below). While this could have different reasons besides the too short AUX timeout used, not detecting LTTPRs (and so not using the non-transparent LT mode) fixes link training on these systems. While at it add a code comment about the platform specific maximum timeout values. v2: Add a comment about the g4x maximum timeout as well. (Ville) Reported-by: Takashi Iwai <tiwai@suse.de> Reported-and-tested-by: Santiago Zarate <santiago.zarate@suse.com> Reported-and-tested-by: Bodo Graumann <mail@bodograumann.de> References: https://gitlab.freedesktop.org/drm/intel/-/issues/3166 Fixes: b30edfd ("drm/i915: Switch to LTTPR non-transparent mode link training") Cc: <stable@vger.kernel.org> # v5.11 Cc: Takashi Iwai <tiwai@suse.de> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210317184901.4029798-2-imre.deak@intel.com
1 parent e5dd4e2 commit 984982f

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

drivers/gpu/drm/i915/display/intel_dp_aux.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ static u32 g4x_get_aux_send_ctl(struct intel_dp *intel_dp,
133133
else
134134
precharge = 5;
135135

136+
/* Max timeout value on G4x-BDW: 1.6ms */
136137
if (IS_BROADWELL(dev_priv))
137138
timeout = DP_AUX_CH_CTL_TIME_OUT_600us;
138139
else
@@ -159,6 +160,12 @@ static u32 skl_get_aux_send_ctl(struct intel_dp *intel_dp,
159160
enum phy phy = intel_port_to_phy(i915, dig_port->base.port);
160161
u32 ret;
161162

163+
/*
164+
* Max timeout values:
165+
* SKL-GLK: 1.6ms
166+
* CNL: 3.2ms
167+
* ICL+: 4ms
168+
*/
162169
ret = DP_AUX_CH_CTL_SEND_BUSY |
163170
DP_AUX_CH_CTL_DONE |
164171
DP_AUX_CH_CTL_INTERRUPT |

drivers/gpu/drm/i915/display/intel_dp_link_training.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,18 @@ static void intel_dp_read_lttpr_phy_caps(struct intel_dp *intel_dp,
8282

8383
static bool intel_dp_read_lttpr_common_caps(struct intel_dp *intel_dp)
8484
{
85+
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
86+
87+
if (intel_dp_is_edp(intel_dp))
88+
return false;
89+
90+
/*
91+
* Detecting LTTPRs must be avoided on platforms with an AUX timeout
92+
* period < 3.2ms. (see DP Standard v2.0, 2.11.2, 3.6.6.1).
93+
*/
94+
if (INTEL_GEN(i915) < 10)
95+
return false;
96+
8597
if (drm_dp_read_lttpr_common_caps(&intel_dp->aux,
8698
intel_dp->lttpr_common_caps) < 0) {
8799
memset(intel_dp->lttpr_common_caps, 0,
@@ -127,9 +139,6 @@ int intel_dp_lttpr_init(struct intel_dp *intel_dp)
127139
bool ret;
128140
int i;
129141

130-
if (intel_dp_is_edp(intel_dp))
131-
return 0;
132-
133142
ret = intel_dp_read_lttpr_common_caps(intel_dp);
134143
if (!ret)
135144
return 0;

0 commit comments

Comments
 (0)