intel_dp_link_training.c 44.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * Copyright © 2008-2015 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 */

24
#include "i915_drv.h"
25
#include "intel_display_types.h"
26
#include "intel_dp.h"
27
#include "intel_dp_link_training.h"
28

29 30
static void intel_dp_reset_lttpr_common_caps(struct intel_dp *intel_dp)
{
31
	memset(intel_dp->lttpr_common_caps, 0, sizeof(intel_dp->lttpr_common_caps));
32 33
}

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
static void intel_dp_reset_lttpr_count(struct intel_dp *intel_dp)
{
	intel_dp->lttpr_common_caps[DP_PHY_REPEATER_CNT -
				    DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV] = 0;
}

static const char *intel_dp_phy_name(enum drm_dp_phy dp_phy,
				     char *buf, size_t buf_size)
{
	if (dp_phy == DP_PHY_DPRX)
		snprintf(buf, buf_size, "DPRX");
	else
		snprintf(buf, buf_size, "LTTPR %d", dp_phy - DP_PHY_LTTPR1 + 1);

	return buf;
}

static u8 *intel_dp_lttpr_phy_caps(struct intel_dp *intel_dp,
				   enum drm_dp_phy dp_phy)
{
	return intel_dp->lttpr_phy_caps[dp_phy - DP_PHY_LTTPR1];
}

static void intel_dp_read_lttpr_phy_caps(struct intel_dp *intel_dp,
					 enum drm_dp_phy dp_phy)
{
60
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
61 62 63 64 65 66 67
	u8 *phy_caps = intel_dp_lttpr_phy_caps(intel_dp, dp_phy);
	char phy_name[10];

	intel_dp_phy_name(dp_phy, phy_name, sizeof(phy_name));

	if (drm_dp_read_lttpr_phy_caps(&intel_dp->aux, dp_phy, phy_caps) < 0) {
		drm_dbg_kms(&dp_to_i915(intel_dp)->drm,
68 69
			    "[ENCODER:%d:%s][%s] failed to read the PHY caps\n",
			    encoder->base.base.id, encoder->base.name, phy_name);
70 71 72 73
		return;
	}

	drm_dbg_kms(&dp_to_i915(intel_dp)->drm,
74 75
		    "[ENCODER:%d:%s][%s] PHY capabilities: %*ph\n",
		    encoder->base.base.id, encoder->base.name, phy_name,
76 77 78 79
		    (int)sizeof(intel_dp->lttpr_phy_caps[0]),
		    phy_caps);
}

80 81
static bool intel_dp_read_lttpr_common_caps(struct intel_dp *intel_dp)
{
82 83
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
84 85 86 87 88 89 90 91

	if (intel_dp_is_edp(intel_dp))
		return false;

	/*
	 * Detecting LTTPRs must be avoided on platforms with an AUX timeout
	 * period < 3.2ms. (see DP Standard v2.0, 2.11.2, 3.6.6.1).
	 */
92
	if (DISPLAY_VER(i915) < 10 || IS_GEMINILAKE(i915))
93 94
		return false;

95
	if (drm_dp_read_lttpr_common_caps(&intel_dp->aux,
96 97
					  intel_dp->lttpr_common_caps) < 0)
		goto reset_caps;
98 99

	drm_dbg_kms(&dp_to_i915(intel_dp)->drm,
100 101
		    "[ENCODER:%d:%s] LTTPR common capabilities: %*ph\n",
		    encoder->base.base.id, encoder->base.name,
102 103 104
		    (int)sizeof(intel_dp->lttpr_common_caps),
		    intel_dp->lttpr_common_caps);

105 106 107 108
	/* The minimum value of LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV is 1.4 */
	if (intel_dp->lttpr_common_caps[0] < 0x14)
		goto reset_caps;

109
	return true;
110 111 112 113

reset_caps:
	intel_dp_reset_lttpr_common_caps(intel_dp);
	return false;
114 115 116 117 118 119 120 121 122 123 124
}

static bool
intel_dp_set_lttpr_transparent_mode(struct intel_dp *intel_dp, bool enable)
{
	u8 val = enable ? DP_PHY_REPEATER_MODE_TRANSPARENT :
			  DP_PHY_REPEATER_MODE_NON_TRANSPARENT;

	return drm_dp_dpcd_write(&intel_dp->aux, DP_PHY_REPEATER_MODE, &val, 1) == 1;
}

125
static int intel_dp_init_lttpr(struct intel_dp *intel_dp)
126
{
127 128
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
129 130 131
	int lttpr_count;
	int i;

132
	if (!intel_dp_read_lttpr_common_caps(intel_dp))
133 134
		return 0;

135 136 137 138 139 140 141 142
	lttpr_count = drm_dp_lttpr_count(intel_dp->lttpr_common_caps);
	/*
	 * Prevent setting LTTPR transparent mode explicitly if no LTTPRs are
	 * detected as this breaks link training at least on the Dell WD19TB
	 * dock.
	 */
	if (lttpr_count == 0)
		return 0;
143 144 145

	/*
	 * See DP Standard v2.0 3.6.6.1. about the explicit disabling of
146 147
	 * non-transparent mode and the disable->enable non-transparent mode
	 * sequence.
148 149 150
	 */
	intel_dp_set_lttpr_transparent_mode(intel_dp, true);

151 152 153 154 155
	/*
	 * In case of unsupported number of LTTPRs or failing to switch to
	 * non-transparent mode fall-back to transparent link training mode,
	 * still taking into account any LTTPR common lane- rate/count limits.
	 */
156
	if (lttpr_count < 0)
157 158 159
		return 0;

	if (!intel_dp_set_lttpr_transparent_mode(intel_dp, false)) {
160 161 162
		drm_dbg_kms(&i915->drm,
			    "[ENCODER:%d:%s] Switching to LTTPR non-transparent LT mode failed, fall-back to transparent mode\n",
			    encoder->base.base.id, encoder->base.name);
163 164 165 166 167 168 169 170 171 172 173

		intel_dp_set_lttpr_transparent_mode(intel_dp, true);
		intel_dp_reset_lttpr_count(intel_dp);

		return 0;
	}

	for (i = 0; i < lttpr_count; i++)
		intel_dp_read_lttpr_phy_caps(intel_dp, DP_PHY_LTTPR(i));

	return lttpr_count;
174
}
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205

/**
 * intel_dp_init_lttpr_and_dprx_caps - detect LTTPR and DPRX caps, init the LTTPR link training mode
 * @intel_dp: Intel DP struct
 *
 * Read the LTTPR common and DPRX capabilities and switch to non-transparent
 * link training mode if any is detected and read the PHY capabilities for all
 * detected LTTPRs. In case of an LTTPR detection error or if the number of
 * LTTPRs is more than is supported (8), fall back to the no-LTTPR,
 * transparent mode link training mode.
 *
 * Returns:
 *   >0  if LTTPRs were detected and the non-transparent LT mode was set. The
 *       DPRX capabilities are read out.
 *    0  if no LTTPRs or more than 8 LTTPRs were detected or in case of a
 *       detection failure and the transparent LT mode was set. The DPRX
 *       capabilities are read out.
 *   <0  Reading out the DPRX capabilities failed.
 */
int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp *intel_dp)
{
	int lttpr_count = intel_dp_init_lttpr(intel_dp);

	/* The DPTX shall read the DPRX caps after LTTPR detection. */
	if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd)) {
		intel_dp_reset_lttpr_common_caps(intel_dp);
		return -EIO;
	}

	return lttpr_count;
}
206

207
static u8 dp_voltage_max(u8 preemph)
208
{
209 210 211 212 213 214 215 216
	switch (preemph & DP_TRAIN_PRE_EMPHASIS_MASK) {
	case DP_TRAIN_PRE_EMPH_LEVEL_0:
		return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
	case DP_TRAIN_PRE_EMPH_LEVEL_1:
		return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
	case DP_TRAIN_PRE_EMPH_LEVEL_2:
		return DP_TRAIN_VOLTAGE_SWING_LEVEL_1;
	case DP_TRAIN_PRE_EMPH_LEVEL_3:
217
	default:
218
		return DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
219 220 221
	}
}

222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
static u8 intel_dp_lttpr_voltage_max(struct intel_dp *intel_dp,
				     enum drm_dp_phy dp_phy)
{
	const u8 *phy_caps = intel_dp_lttpr_phy_caps(intel_dp, dp_phy);

	if (drm_dp_lttpr_voltage_swing_level_3_supported(phy_caps))
		return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
	else
		return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
}

static u8 intel_dp_lttpr_preemph_max(struct intel_dp *intel_dp,
				     enum drm_dp_phy dp_phy)
{
	const u8 *phy_caps = intel_dp_lttpr_phy_caps(intel_dp, dp_phy);

	if (drm_dp_lttpr_pre_emphasis_level_3_supported(phy_caps))
		return DP_TRAIN_PRE_EMPH_LEVEL_3;
	else
		return DP_TRAIN_PRE_EMPH_LEVEL_2;
}

static bool
intel_dp_phy_is_downstream_of_source(struct intel_dp *intel_dp,
				     enum drm_dp_phy dp_phy)
{
	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
249
	int lttpr_count = drm_dp_lttpr_count(intel_dp->lttpr_common_caps);
250

251
	drm_WARN_ON_ONCE(&i915->drm, lttpr_count <= 0 && dp_phy != DP_PHY_DPRX);
252

253
	return lttpr_count <= 0 || dp_phy == DP_PHY_LTTPR(lttpr_count - 1);
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
}

static u8 intel_dp_phy_voltage_max(struct intel_dp *intel_dp,
				   const struct intel_crtc_state *crtc_state,
				   enum drm_dp_phy dp_phy)
{
	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
	u8 voltage_max;

	/*
	 * Get voltage_max from the DPTX_PHY (source or LTTPR) upstream from
	 * the DPRX_PHY we train.
	 */
	if (intel_dp_phy_is_downstream_of_source(intel_dp, dp_phy))
		voltage_max = intel_dp->voltage_max(intel_dp, crtc_state);
	else
		voltage_max = intel_dp_lttpr_voltage_max(intel_dp, dp_phy + 1);

	drm_WARN_ON_ONCE(&i915->drm,
			 voltage_max != DP_TRAIN_VOLTAGE_SWING_LEVEL_2 &&
			 voltage_max != DP_TRAIN_VOLTAGE_SWING_LEVEL_3);

	return voltage_max;
}

static u8 intel_dp_phy_preemph_max(struct intel_dp *intel_dp,
				   enum drm_dp_phy dp_phy)
{
	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
	u8 preemph_max;

	/*
	 * Get preemph_max from the DPTX_PHY (source or LTTPR) upstream from
	 * the DPRX_PHY we train.
	 */
	if (intel_dp_phy_is_downstream_of_source(intel_dp, dp_phy))
		preemph_max = intel_dp->preemph_max(intel_dp);
	else
		preemph_max = intel_dp_lttpr_preemph_max(intel_dp, dp_phy + 1);

	drm_WARN_ON_ONCE(&i915->drm,
			 preemph_max != DP_TRAIN_PRE_EMPH_LEVEL_2 &&
			 preemph_max != DP_TRAIN_PRE_EMPH_LEVEL_3);

	return preemph_max;
}

301 302 303
static bool has_per_lane_signal_levels(struct intel_dp *intel_dp,
				       enum drm_dp_phy dp_phy)
{
304 305 306 307
	struct drm_i915_private *i915 = dp_to_i915(intel_dp);

	return !intel_dp_phy_is_downstream_of_source(intel_dp, dp_phy) ||
		DISPLAY_VER(i915) >= 11;
308 309
}

310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
/* 128b/132b */
static u8 intel_dp_get_lane_adjust_tx_ffe_preset(struct intel_dp *intel_dp,
						 const struct intel_crtc_state *crtc_state,
						 enum drm_dp_phy dp_phy,
						 const u8 link_status[DP_LINK_STATUS_SIZE],
						 int lane)
{
	u8 tx_ffe = 0;

	if (has_per_lane_signal_levels(intel_dp, dp_phy)) {
		lane = min(lane, crtc_state->lane_count - 1);
		tx_ffe = drm_dp_get_adjust_tx_ffe_preset(link_status, lane);
	} else {
		for (lane = 0; lane < crtc_state->lane_count; lane++)
			tx_ffe = max(tx_ffe, drm_dp_get_adjust_tx_ffe_preset(link_status, lane));
	}

	return tx_ffe;
}

/* 8b/10b */
static u8 intel_dp_get_lane_adjust_vswing_preemph(struct intel_dp *intel_dp,
						  const struct intel_crtc_state *crtc_state,
						  enum drm_dp_phy dp_phy,
						  const u8 link_status[DP_LINK_STATUS_SIZE],
						  int lane)
336
{
337 338 339 340
	u8 v = 0;
	u8 p = 0;
	u8 voltage_max;
	u8 preemph_max;
341

342 343 344 345 346 347 348 349 350 351
	if (has_per_lane_signal_levels(intel_dp, dp_phy)) {
		lane = min(lane, crtc_state->lane_count - 1);

		v = drm_dp_get_adjust_request_voltage(link_status, lane);
		p = drm_dp_get_adjust_request_pre_emphasis(link_status, lane);
	} else {
		for (lane = 0; lane < crtc_state->lane_count; lane++) {
			v = max(v, drm_dp_get_adjust_request_voltage(link_status, lane));
			p = max(p, drm_dp_get_adjust_request_pre_emphasis(link_status, lane));
		}
352 353
	}

354
	preemph_max = intel_dp_phy_preemph_max(intel_dp, dp_phy);
355 356 357
	if (p >= preemph_max)
		p = preemph_max | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;

358 359
	v = min(v, dp_voltage_max(p));

360
	voltage_max = intel_dp_phy_voltage_max(intel_dp, crtc_state, dp_phy);
361 362 363
	if (v >= voltage_max)
		v = voltage_max | DP_TRAIN_MAX_SWING_REACHED;

364 365 366
	return v | p;
}

367 368 369 370 371 372 373 374 375 376 377 378 379 380
static u8 intel_dp_get_lane_adjust_train(struct intel_dp *intel_dp,
					 const struct intel_crtc_state *crtc_state,
					 enum drm_dp_phy dp_phy,
					 const u8 link_status[DP_LINK_STATUS_SIZE],
					 int lane)
{
	if (intel_dp_is_uhbr(crtc_state))
		return intel_dp_get_lane_adjust_tx_ffe_preset(intel_dp, crtc_state,
							      dp_phy, link_status, lane);
	else
		return intel_dp_get_lane_adjust_vswing_preemph(intel_dp, crtc_state,
							       dp_phy, link_status, lane);
}

381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
#define TRAIN_REQ_FMT "%d/%d/%d/%d"
#define _TRAIN_REQ_VSWING_ARGS(link_status, lane) \
	(drm_dp_get_adjust_request_voltage((link_status), (lane)) >> DP_TRAIN_VOLTAGE_SWING_SHIFT)
#define TRAIN_REQ_VSWING_ARGS(link_status) \
	_TRAIN_REQ_VSWING_ARGS(link_status, 0), \
	_TRAIN_REQ_VSWING_ARGS(link_status, 1), \
	_TRAIN_REQ_VSWING_ARGS(link_status, 2), \
	_TRAIN_REQ_VSWING_ARGS(link_status, 3)
#define _TRAIN_REQ_PREEMPH_ARGS(link_status, lane) \
	(drm_dp_get_adjust_request_pre_emphasis((link_status), (lane)) >> DP_TRAIN_PRE_EMPHASIS_SHIFT)
#define TRAIN_REQ_PREEMPH_ARGS(link_status) \
	_TRAIN_REQ_PREEMPH_ARGS(link_status, 0), \
	_TRAIN_REQ_PREEMPH_ARGS(link_status, 1), \
	_TRAIN_REQ_PREEMPH_ARGS(link_status, 2), \
	_TRAIN_REQ_PREEMPH_ARGS(link_status, 3)
396 397 398 399 400 401 402
#define _TRAIN_REQ_TX_FFE_ARGS(link_status, lane) \
	drm_dp_get_adjust_tx_ffe_preset((link_status), (lane))
#define TRAIN_REQ_TX_FFE_ARGS(link_status) \
	_TRAIN_REQ_TX_FFE_ARGS(link_status, 0), \
	_TRAIN_REQ_TX_FFE_ARGS(link_status, 1), \
	_TRAIN_REQ_TX_FFE_ARGS(link_status, 2), \
	_TRAIN_REQ_TX_FFE_ARGS(link_status, 3)
403

404 405 406 407 408 409
void
intel_dp_get_adjust_train(struct intel_dp *intel_dp,
			  const struct intel_crtc_state *crtc_state,
			  enum drm_dp_phy dp_phy,
			  const u8 link_status[DP_LINK_STATUS_SIZE])
{
410
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
411
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
412
	char phy_name[10];
413 414
	int lane;

415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431
	if (intel_dp_is_uhbr(crtc_state)) {
		drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s][%s] 128b/132b, lanes: %d, "
			    "TX FFE request: " TRAIN_REQ_FMT "\n",
			    encoder->base.base.id, encoder->base.name,
			    intel_dp_phy_name(dp_phy, phy_name, sizeof(phy_name)),
			    crtc_state->lane_count,
			    TRAIN_REQ_TX_FFE_ARGS(link_status));
	} else {
		drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s][%s] 8b/10b, lanes: %d, "
			    "vswing request: " TRAIN_REQ_FMT ", "
			    "pre-emphasis request: " TRAIN_REQ_FMT "\n",
			    encoder->base.base.id, encoder->base.name,
			    intel_dp_phy_name(dp_phy, phy_name, sizeof(phy_name)),
			    crtc_state->lane_count,
			    TRAIN_REQ_VSWING_ARGS(link_status),
			    TRAIN_REQ_PREEMPH_ARGS(link_status));
	}
432

433
	for (lane = 0; lane < 4; lane++)
434 435 436
		intel_dp->train_set[lane] =
			intel_dp_get_lane_adjust_train(intel_dp, crtc_state,
						       dp_phy, link_status, lane);
437 438
}

439 440 441 442 443 444 445 446
static int intel_dp_training_pattern_set_reg(struct intel_dp *intel_dp,
					     enum drm_dp_phy dp_phy)
{
	return dp_phy == DP_PHY_DPRX ?
		DP_TRAINING_PATTERN_SET :
		DP_TRAINING_PATTERN_SET_PHY_REPEATER(dp_phy);
}

447 448
static bool
intel_dp_set_link_train(struct intel_dp *intel_dp,
449
			const struct intel_crtc_state *crtc_state,
450
			enum drm_dp_phy dp_phy,
451
			u8 dp_train_pat)
452
{
453
	int reg = intel_dp_training_pattern_set_reg(intel_dp, dp_phy);
454
	u8 buf[sizeof(intel_dp->train_set) + 1];
455
	int len;
456

457
	intel_dp_program_link_training_pattern(intel_dp, crtc_state,
458
					       dp_phy, dp_train_pat);
459 460

	buf[0] = dp_train_pat;
461 462 463
	/* DP_TRAINING_LANEx_SET follow DP_TRAINING_PATTERN_SET */
	memcpy(buf + 1, intel_dp->train_set, crtc_state->lane_count);
	len = crtc_state->lane_count + 1;
464

465
	return drm_dp_dpcd_write(&intel_dp->aux, reg, buf, len) == len;
466 467
}

468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
static char dp_training_pattern_name(u8 train_pat)
{
	switch (train_pat) {
	case DP_TRAINING_PATTERN_1:
	case DP_TRAINING_PATTERN_2:
	case DP_TRAINING_PATTERN_3:
		return '0' + train_pat;
	case DP_TRAINING_PATTERN_4:
		return '4';
	default:
		MISSING_CASE(train_pat);
		return '?';
	}
}

void
intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
				       const struct intel_crtc_state *crtc_state,
486
				       enum drm_dp_phy dp_phy,
487 488 489
				       u8 dp_train_pat)
{
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
490
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
491
	u8 train_pat = intel_dp_training_pattern_symbol(dp_train_pat);
492
	char phy_name[10];
493 494

	if (train_pat != DP_TRAINING_PATTERN_DISABLE)
495 496
		drm_dbg_kms(&i915->drm,
			    "[ENCODER:%d:%s][%s] Using DP training pattern TPS%c\n",
497
			    encoder->base.base.id, encoder->base.name,
498 499
			    intel_dp_phy_name(dp_phy, phy_name, sizeof(phy_name)),
			    dp_training_pattern_name(train_pat));
500 501 502 503

	intel_dp->set_link_train(intel_dp, crtc_state, dp_train_pat);
}

504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520
#define TRAIN_SET_FMT "%d%s/%d%s/%d%s/%d%s"
#define _TRAIN_SET_VSWING_ARGS(train_set) \
	((train_set) & DP_TRAIN_VOLTAGE_SWING_MASK) >> DP_TRAIN_VOLTAGE_SWING_SHIFT, \
	(train_set) & DP_TRAIN_MAX_SWING_REACHED ? "(max)" : ""
#define TRAIN_SET_VSWING_ARGS(train_set) \
	_TRAIN_SET_VSWING_ARGS((train_set)[0]), \
	_TRAIN_SET_VSWING_ARGS((train_set)[1]), \
	_TRAIN_SET_VSWING_ARGS((train_set)[2]), \
	_TRAIN_SET_VSWING_ARGS((train_set)[3])
#define _TRAIN_SET_PREEMPH_ARGS(train_set) \
	((train_set) & DP_TRAIN_PRE_EMPHASIS_MASK) >> DP_TRAIN_PRE_EMPHASIS_SHIFT, \
	(train_set) & DP_TRAIN_MAX_PRE_EMPHASIS_REACHED ? "(max)" : ""
#define TRAIN_SET_PREEMPH_ARGS(train_set) \
	_TRAIN_SET_PREEMPH_ARGS((train_set)[0]), \
	_TRAIN_SET_PREEMPH_ARGS((train_set)[1]), \
	_TRAIN_SET_PREEMPH_ARGS((train_set)[2]), \
	_TRAIN_SET_PREEMPH_ARGS((train_set)[3])
521 522 523 524 525 526 527
#define _TRAIN_SET_TX_FFE_ARGS(train_set) \
	((train_set) & DP_TX_FFE_PRESET_VALUE_MASK), ""
#define TRAIN_SET_TX_FFE_ARGS(train_set) \
	_TRAIN_SET_TX_FFE_ARGS((train_set)[0]), \
	_TRAIN_SET_TX_FFE_ARGS((train_set)[1]), \
	_TRAIN_SET_TX_FFE_ARGS((train_set)[2]), \
	_TRAIN_SET_TX_FFE_ARGS((train_set)[3])
528

529
void intel_dp_set_signal_levels(struct intel_dp *intel_dp,
530 531
				const struct intel_crtc_state *crtc_state,
				enum drm_dp_phy dp_phy)
532
{
533
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
534
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
535
	char phy_name[10];
536

537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
	if (intel_dp_is_uhbr(crtc_state)) {
		drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s][%s] 128b/132b, lanes: %d, "
			    "TX FFE presets: " TRAIN_SET_FMT "\n",
			    encoder->base.base.id, encoder->base.name,
			    intel_dp_phy_name(dp_phy, phy_name, sizeof(phy_name)),
			    crtc_state->lane_count,
			    TRAIN_SET_TX_FFE_ARGS(intel_dp->train_set));
	} else {
		drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s][%s] 8b/10b, lanes: %d, "
			    "vswing levels: " TRAIN_SET_FMT ", "
			    "pre-emphasis levels: " TRAIN_SET_FMT "\n",
			    encoder->base.base.id, encoder->base.name,
			    intel_dp_phy_name(dp_phy, phy_name, sizeof(phy_name)),
			    crtc_state->lane_count,
			    TRAIN_SET_VSWING_ARGS(intel_dp->train_set),
			    TRAIN_SET_PREEMPH_ARGS(intel_dp->train_set));
	}
554

555
	if (intel_dp_phy_is_downstream_of_source(intel_dp, dp_phy))
556
		encoder->set_signal_levels(encoder, crtc_state);
557 558
}

559 560
static bool
intel_dp_reset_link_train(struct intel_dp *intel_dp,
561
			  const struct intel_crtc_state *crtc_state,
562
			  enum drm_dp_phy dp_phy,
563
			  u8 dp_train_pat)
564
{
565
	memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
566
	intel_dp_set_signal_levels(intel_dp, crtc_state, dp_phy);
567
	return intel_dp_set_link_train(intel_dp, crtc_state, dp_phy, dp_train_pat);
568 569 570
}

static bool
571
intel_dp_update_link_train(struct intel_dp *intel_dp,
572 573
			   const struct intel_crtc_state *crtc_state,
			   enum drm_dp_phy dp_phy)
574
{
575 576 577
	int reg = dp_phy == DP_PHY_DPRX ?
			    DP_TRAINING_LANE0_SET :
			    DP_TRAINING_LANE0_SET_PHY_REPEATER(dp_phy);
578 579
	int ret;

580
	intel_dp_set_signal_levels(intel_dp, crtc_state, dp_phy);
581

582
	ret = drm_dp_dpcd_write(&intel_dp->aux, reg,
583
				intel_dp->train_set, crtc_state->lane_count);
584

585
	return ret == crtc_state->lane_count;
586 587
}

588 589 590 591 592 593 594
/* 128b/132b */
static bool intel_dp_lane_max_tx_ffe_reached(u8 train_set_lane)
{
	return (train_set_lane & DP_TX_FFE_PRESET_VALUE_MASK) ==
		DP_TX_FFE_PRESET_VALUE_MASK;
}

595
/*
596 597
 * 8b/10b
 *
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620
 * FIXME: The DP spec is very confusing here, also the Link CTS spec seems to
 * have self contradicting tests around this area.
 *
 * In lieu of better ideas let's just stop when we've reached the max supported
 * vswing with its max pre-emphasis, which is either 2+1 or 3+0 depending on
 * whether vswing level 3 is supported or not.
 */
static bool intel_dp_lane_max_vswing_reached(u8 train_set_lane)
{
	u8 v = (train_set_lane & DP_TRAIN_VOLTAGE_SWING_MASK) >>
		DP_TRAIN_VOLTAGE_SWING_SHIFT;
	u8 p = (train_set_lane & DP_TRAIN_PRE_EMPHASIS_MASK) >>
		DP_TRAIN_PRE_EMPHASIS_SHIFT;

	if ((train_set_lane & DP_TRAIN_MAX_SWING_REACHED) == 0)
		return false;

	if (v + p != 3)
		return false;

	return true;
}

621 622
static bool intel_dp_link_max_vswing_reached(struct intel_dp *intel_dp,
					     const struct intel_crtc_state *crtc_state)
623 624 625
{
	int lane;

626
	for (lane = 0; lane < crtc_state->lane_count; lane++) {
627 628 629 630 631 632 633 634 635
		u8 train_set_lane = intel_dp->train_set[lane];

		if (intel_dp_is_uhbr(crtc_state)) {
			if (!intel_dp_lane_max_tx_ffe_reached(train_set_lane))
				return false;
		} else {
			if (!intel_dp_lane_max_vswing_reached(train_set_lane))
				return false;
		}
636 637
	}

638 639 640
	return true;
}

641 642 643 644
/*
 * Prepare link training by configuring the link parameters. On DDI platforms
 * also enable the port here.
 */
645
static bool
646 647
intel_dp_prepare_link_train(struct intel_dp *intel_dp,
			    const struct intel_crtc_state *crtc_state)
648
{
649 650
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
651 652
	u8 link_config[2];
	u8 link_bw, rate_select;
653

654
	if (intel_dp->prepare_link_retrain)
655
		intel_dp->prepare_link_retrain(intel_dp, crtc_state);
656

657
	intel_dp_compute_rate(intel_dp, crtc_state->port_clock,
658 659
			      &link_bw, &rate_select);

660
	if (link_bw)
661
		drm_dbg_kms(&i915->drm,
662 663
			    "[ENCODER:%d:%s] Using LINK_BW_SET value %02x\n",
			    encoder->base.base.id, encoder->base.name, link_bw);
664
	else
665
		drm_dbg_kms(&i915->drm,
666 667
			    "[ENCODER:%d:%s] Using LINK_RATE_SET value %02x\n",
			    encoder->base.base.id, encoder->base.name, rate_select);
668

669 670
	/* Write the link configuration data */
	link_config[0] = link_bw;
671
	link_config[1] = crtc_state->lane_count;
672 673 674
	if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
		link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
	drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, link_config, 2);
675

676 677
	/* eDP 1.4 rate select method. */
	if (!link_bw)
678 679 680
		drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_RATE_SET,
				  &rate_select, 1);

681
	link_config[0] = crtc_state->vrr.enable ? DP_MSA_TIMING_PAR_IGNORE_EN : 0;
682 683
	link_config[1] = intel_dp_is_uhbr(crtc_state) ?
		DP_SET_ANSI_128B132B : DP_SET_ANSI_8B10B;
684 685
	drm_dp_dpcd_write(&intel_dp->aux, DP_DOWNSPREAD_CTRL, link_config, 2);

686 687 688
	return true;
}

689
static bool intel_dp_adjust_request_changed(const struct intel_crtc_state *crtc_state,
690 691 692 693 694
					    const u8 old_link_status[DP_LINK_STATUS_SIZE],
					    const u8 new_link_status[DP_LINK_STATUS_SIZE])
{
	int lane;

695 696 697 698 699 700 701 702 703 704 705 706
	for (lane = 0; lane < crtc_state->lane_count; lane++) {
		u8 old, new;

		if (intel_dp_is_uhbr(crtc_state)) {
			old = drm_dp_get_adjust_tx_ffe_preset(old_link_status, lane);
			new = drm_dp_get_adjust_tx_ffe_preset(new_link_status, lane);
		} else {
			old = drm_dp_get_adjust_request_voltage(old_link_status, lane) |
				drm_dp_get_adjust_request_pre_emphasis(old_link_status, lane);
			new = drm_dp_get_adjust_request_voltage(new_link_status, lane) |
				drm_dp_get_adjust_request_pre_emphasis(new_link_status, lane);
		}
707 708 709 710 711 712 713 714

		if (old != new)
			return true;
	}

	return false;
}

715
void
716 717 718 719 720 721 722 723 724 725 726 727 728 729 730
intel_dp_dump_link_status(struct intel_dp *intel_dp, enum drm_dp_phy dp_phy,
			  const u8 link_status[DP_LINK_STATUS_SIZE])
{
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
	char phy_name[10];

	drm_dbg_kms(&i915->drm,
		    "[ENCODER:%d:%s][%s] ln0_1:0x%x ln2_3:0x%x align:0x%x sink:0x%x adj_req0_1:0x%x adj_req2_3:0x%x\n",
		    encoder->base.base.id, encoder->base.name,
		    intel_dp_phy_name(dp_phy, phy_name, sizeof(phy_name)),
		    link_status[0], link_status[1], link_status[2],
		    link_status[3], link_status[4], link_status[5]);
}

731 732 733 734
/*
 * Perform the link training clock recovery phase on the given DP PHY using
 * training pattern 1.
 */
735 736
static bool
intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp,
737 738
				      const struct intel_crtc_state *crtc_state,
				      enum drm_dp_phy dp_phy)
739
{
740 741
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
742
	u8 old_link_status[DP_LINK_STATUS_SIZE] = {};
743
	int voltage_tries, cr_tries, max_cr_tries;
744
	u8 link_status[DP_LINK_STATUS_SIZE];
745
	bool max_vswing_reached = false;
746
	char phy_name[10];
747 748 749 750 751
	int delay_us;

	delay_us = drm_dp_read_clock_recovery_delay(&intel_dp->aux,
						    intel_dp->dpcd, dp_phy,
						    intel_dp_is_uhbr(crtc_state));
752 753

	intel_dp_phy_name(dp_phy, phy_name, sizeof(phy_name));
754

755
	/* clock recovery */
756
	if (!intel_dp_reset_link_train(intel_dp, crtc_state, dp_phy,
757 758
				       DP_TRAINING_PATTERN_1 |
				       DP_LINK_SCRAMBLING_DISABLE)) {
759 760
		drm_err(&i915->drm, "[ENCODER:%d:%s][%s] Failed to enable link training\n",
			encoder->base.base.id, encoder->base.name, phy_name);
761
		return false;
762 763
	}

764
	/*
765 766 767 768 769 770
	 * The DP 1.4 spec defines the max clock recovery retries value
	 * as 10 but for pre-DP 1.4 devices we set a very tolerant
	 * retry limit of 80 (4 voltage levels x 4 preemphasis levels x
	 * x 5 identical voltage retries). Since the previous specs didn't
	 * define a limit and created the possibility of an infinite loop
	 * we want to prevent any sync from triggering that corner case.
771 772 773 774 775 776
	 */
	if (intel_dp->dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14)
		max_cr_tries = 10;
	else
		max_cr_tries = 80;

777
	voltage_tries = 1;
778
	for (cr_tries = 0; cr_tries < max_cr_tries; ++cr_tries) {
779
		usleep_range(delay_us, 2 * delay_us);
780

781 782
		if (drm_dp_dpcd_read_phy_link_status(&intel_dp->aux, dp_phy,
						     link_status) < 0) {
783 784
			drm_err(&i915->drm, "[ENCODER:%d:%s][%s] Failed to get link status\n",
				encoder->base.base.id, encoder->base.name, phy_name);
785
			return false;
786 787
		}

788
		if (drm_dp_clock_recovery_ok(link_status, crtc_state->lane_count)) {
789 790 791
			drm_dbg_kms(&i915->drm,
				    "[ENCODER:%d:%s][%s] Clock recovery OK\n",
				    encoder->base.base.id, encoder->base.name, phy_name);
792
			return true;
793 794
		}

795
		if (voltage_tries == 5) {
796
			intel_dp_dump_link_status(intel_dp, dp_phy, link_status);
797
			drm_dbg_kms(&i915->drm,
798 799
				    "[ENCODER:%d:%s][%s] Same voltage tried 5 times\n",
				    encoder->base.base.id, encoder->base.name, phy_name);
800 801 802
			return false;
		}

803
		if (max_vswing_reached) {
804
			intel_dp_dump_link_status(intel_dp, dp_phy, link_status);
805 806 807
			drm_dbg_kms(&i915->drm,
				    "[ENCODER:%d:%s][%s] Max Voltage Swing reached\n",
				    encoder->base.base.id, encoder->base.name, phy_name);
808
			return false;
809 810 811
		}

		/* Update training set as requested by target */
812 813 814
		intel_dp_get_adjust_train(intel_dp, crtc_state, dp_phy,
					  link_status);
		if (!intel_dp_update_link_train(intel_dp, crtc_state, dp_phy)) {
815
			drm_err(&i915->drm,
816 817
				"[ENCODER:%d:%s][%s] Failed to update link training\n",
				encoder->base.base.id, encoder->base.name, phy_name);
818
			return false;
819
		}
820

821
		if (!intel_dp_adjust_request_changed(crtc_state, old_link_status, link_status))
822 823 824 825
			++voltage_tries;
		else
			voltage_tries = 1;

826 827
		memcpy(old_link_status, link_status, sizeof(link_status));

828
		if (intel_dp_link_max_vswing_reached(intel_dp, crtc_state))
829
			max_vswing_reached = true;
830
	}
831

832
	intel_dp_dump_link_status(intel_dp, dp_phy, link_status);
833
	drm_err(&i915->drm,
834 835 836
		"[ENCODER:%d:%s][%s] Failed clock recovery %d times, giving up!\n",
		encoder->base.base.id, encoder->base.name, phy_name, max_cr_tries);

837
	return false;
838 839
}

840
/*
841 842 843
 * Pick Training Pattern Sequence (TPS) for channel equalization. 128b/132b TPS2
 * for UHBR+, TPS4 for HBR3 or for 1.4 devices that support it, TPS3 for HBR2 or
 * 1.2 devices that support it, TPS2 otherwise.
844
 */
845
static u32 intel_dp_training_pattern(struct intel_dp *intel_dp,
846 847
				     const struct intel_crtc_state *crtc_state,
				     enum drm_dp_phy dp_phy)
848
{
849
	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
850
	bool source_tps3, sink_tps3, source_tps4, sink_tps4;
851

852 853 854 855
	/* UHBR+ use separate 128b/132b TPS2 */
	if (intel_dp_is_uhbr(crtc_state))
		return DP_TRAINING_PATTERN_2;

856
	/*
857 858 859
	 * TPS4 support is mandatory for all downstream devices that
	 * support HBR3. There are no known eDP panels that support
	 * TPS4 as of Feb 2018 as per VESA eDP_v1.4b_E1 specification.
860
	 * LTTPRs must support TPS4.
861
	 */
862
	source_tps4 = intel_dp_source_supports_tps4(i915);
863 864
	sink_tps4 = dp_phy != DP_PHY_DPRX ||
		    drm_dp_tps4_supported(intel_dp->dpcd);
865 866
	if (source_tps4 && sink_tps4) {
		return DP_TRAINING_PATTERN_4;
867
	} else if (crtc_state->port_clock == 810000) {
868
		if (!source_tps4)
869 870
			drm_dbg_kms(&i915->drm,
				    "8.1 Gbps link rate without source TPS4 support\n");
871
		if (!sink_tps4)
872
			drm_dbg_kms(&i915->drm,
873
				    "8.1 Gbps link rate without sink TPS4 support\n");
874
	}
875

876
	/*
877 878
	 * TPS3 support is mandatory for downstream devices that
	 * support HBR2. However, not all sinks follow the spec.
879
	 */
880
	source_tps3 = intel_dp_source_supports_tps3(i915);
881 882
	sink_tps3 = dp_phy != DP_PHY_DPRX ||
		    drm_dp_tps3_supported(intel_dp->dpcd);
883
	if (source_tps3 && sink_tps3) {
884
		return  DP_TRAINING_PATTERN_3;
885
	} else if (crtc_state->port_clock >= 540000) {
886
		if (!source_tps3)
887 888
			drm_dbg_kms(&i915->drm,
				    ">=5.4/6.48 Gbps link rate without source TPS3 support\n");
889
		if (!sink_tps3)
890
			drm_dbg_kms(&i915->drm,
891
				    ">=5.4/6.48 Gbps link rate without sink TPS3 support\n");
892
	}
893

894
	return DP_TRAINING_PATTERN_2;
895 896
}

897
/*
898 899 900
 * Perform the link training channel equalization phase on the given DP PHY
 * using one of training pattern 2, 3 or 4 depending on the source and
 * sink capabilities.
901
 */
902
static bool
903
intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp,
904 905
					    const struct intel_crtc_state *crtc_state,
					    enum drm_dp_phy dp_phy)
906
{
907 908
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
909
	int tries;
910
	u32 training_pattern;
911
	u8 link_status[DP_LINK_STATUS_SIZE];
912
	bool channel_eq = false;
913
	char phy_name[10];
914 915 916 917 918
	int delay_us;

	delay_us = drm_dp_read_channel_eq_delay(&intel_dp->aux,
						intel_dp->dpcd, dp_phy,
						intel_dp_is_uhbr(crtc_state));
919 920

	intel_dp_phy_name(dp_phy, phy_name, sizeof(phy_name));
921

922
	training_pattern = intel_dp_training_pattern(intel_dp, crtc_state, dp_phy);
923 924 925
	/* Scrambling is disabled for TPS2/3 and enabled for TPS4 */
	if (training_pattern != DP_TRAINING_PATTERN_4)
		training_pattern |= DP_LINK_SCRAMBLING_DISABLE;
926

927
	/* channel equalization */
928
	if (!intel_dp_set_link_train(intel_dp, crtc_state, dp_phy,
929
				     training_pattern)) {
930 931 932 933
		drm_err(&i915->drm,
			"[ENCODER:%d:%s][%s] Failed to start channel equalization\n",
			encoder->base.base.id, encoder->base.name,
			phy_name);
934
		return false;
935 936
	}

937
	for (tries = 0; tries < 5; tries++) {
938 939
		usleep_range(delay_us, 2 * delay_us);

940 941
		if (drm_dp_dpcd_read_phy_link_status(&intel_dp->aux, dp_phy,
						     link_status) < 0) {
942
			drm_err(&i915->drm,
943 944
				"[ENCODER:%d:%s][%s] Failed to get link status\n",
				encoder->base.base.id, encoder->base.name, phy_name);
945 946 947 948 949
			break;
		}

		/* Make sure clock is still ok */
		if (!drm_dp_clock_recovery_ok(link_status,
950
					      crtc_state->lane_count)) {
951
			intel_dp_dump_link_status(intel_dp, dp_phy, link_status);
952
			drm_dbg_kms(&i915->drm,
953 954 955
				    "[ENCODER:%d:%s][%s] Clock recovery check failed, cannot "
				    "continue channel equalization\n",
				    encoder->base.base.id, encoder->base.name, phy_name);
956
			break;
957 958 959
		}

		if (drm_dp_channel_eq_ok(link_status,
960
					 crtc_state->lane_count)) {
961
			channel_eq = true;
962 963 964
			drm_dbg_kms(&i915->drm,
				    "[ENCODER:%d:%s][%s] Channel EQ done. DP Training successful\n",
				    encoder->base.base.id, encoder->base.name, phy_name);
965 966 967 968
			break;
		}

		/* Update training set as requested by target */
969 970 971
		intel_dp_get_adjust_train(intel_dp, crtc_state, dp_phy,
					  link_status);
		if (!intel_dp_update_link_train(intel_dp, crtc_state, dp_phy)) {
972
			drm_err(&i915->drm,
973 974
				"[ENCODER:%d:%s][%s] Failed to update link training\n",
				encoder->base.base.id, encoder->base.name, phy_name);
975 976
			break;
		}
977 978 979 980
	}

	/* Try 5 times, else fail and try at lower BW */
	if (tries == 5) {
981
		intel_dp_dump_link_status(intel_dp, dp_phy, link_status);
982
		drm_dbg_kms(&i915->drm,
983 984
			    "[ENCODER:%d:%s][%s] Channel equalization failed 5 times\n",
			    encoder->base.base.id, encoder->base.name, phy_name);
985 986
	}

987
	return channel_eq;
988 989
}

990 991
static bool intel_dp_disable_dpcd_training_pattern(struct intel_dp *intel_dp,
						   enum drm_dp_phy dp_phy)
992
{
993
	int reg = intel_dp_training_pattern_set_reg(intel_dp, dp_phy);
994 995
	u8 val = DP_TRAINING_PATTERN_DISABLE;

996
	return drm_dp_dpcd_write(&intel_dp->aux, reg, &val, 1) == 1;
997 998
}

999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
static int
intel_dp_128b132b_intra_hop(struct intel_dp *intel_dp,
			    const struct intel_crtc_state *crtc_state)
{
	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
	u8 sink_status;
	int ret;

	ret = drm_dp_dpcd_readb(&intel_dp->aux, DP_SINK_STATUS, &sink_status);
	if (ret != 1) {
		drm_dbg_kms(&i915->drm, "Failed to read sink status\n");
		return ret < 0 ? ret : -EIO;
	}

	return sink_status & DP_INTRA_HOP_AUX_REPLY_INDICATION ? 1 : 0;
}

1016 1017 1018 1019 1020
/**
 * intel_dp_stop_link_train - stop link training
 * @intel_dp: DP struct
 * @crtc_state: state for CRTC attached to the encoder
 *
1021 1022 1023
 * Stop the link training of the @intel_dp port, disabling the training
 * pattern in the sink's DPCD, and disabling the test pattern symbol
 * generation on the port.
1024 1025 1026 1027 1028 1029 1030 1031
 *
 * What symbols are output on the port after this point is
 * platform specific: On DDI/VLV/CHV platforms it will be the idle pattern
 * with the pipe being disabled, on older platforms it's HW specific if/how an
 * idle pattern is generated, as the pipe is already enabled here for those.
 *
 * This function must be called after intel_dp_start_link_train().
 */
1032 1033
void intel_dp_stop_link_train(struct intel_dp *intel_dp,
			      const struct intel_crtc_state *crtc_state)
1034
{
1035 1036 1037
	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;

1038 1039
	intel_dp->link_trained = true;

1040
	intel_dp_disable_dpcd_training_pattern(intel_dp, DP_PHY_DPRX);
1041
	intel_dp_program_link_training_pattern(intel_dp, crtc_state, DP_PHY_DPRX,
1042
					       DP_TRAINING_PATTERN_DISABLE);
1043 1044 1045 1046 1047 1048 1049

	if (intel_dp_is_uhbr(crtc_state) &&
	    wait_for(intel_dp_128b132b_intra_hop(intel_dp, crtc_state) == 0, 500)) {
		drm_dbg_kms(&i915->drm,
			    "[ENCODER:%d:%s] 128b/132b intra-hop not clearing\n",
			    encoder->base.base.id, encoder->base.name);
	}
1050 1051
}

1052
static bool
1053 1054 1055
intel_dp_link_train_phy(struct intel_dp *intel_dp,
			const struct intel_crtc_state *crtc_state,
			enum drm_dp_phy dp_phy)
1056
{
1057 1058
	struct intel_connector *connector = intel_dp->attached_connector;
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
1059
	char phy_name[10];
1060 1061
	bool ret = false;

1062
	if (!intel_dp_link_training_clock_recovery(intel_dp, crtc_state, dp_phy))
1063 1064
		goto out;

1065
	if (!intel_dp_link_training_channel_equalization(intel_dp, crtc_state, dp_phy))
1066
		goto out;
1067

1068
	ret = true;
1069

1070
out:
1071
	drm_dbg_kms(&dp_to_i915(intel_dp)->drm,
1072 1073 1074 1075
		    "[CONNECTOR:%d:%s][ENCODER:%d:%s][%s] Link Training %s at link rate = %d, lane count = %d\n",
		    connector->base.base.id, connector->base.name,
		    encoder->base.base.id, encoder->base.name,
		    intel_dp_phy_name(dp_phy, phy_name, sizeof(phy_name)),
1076
		    ret ? "passed" : "failed",
1077
		    crtc_state->port_clock, crtc_state->lane_count);
1078

1079 1080 1081 1082 1083 1084 1085
	return ret;
}

static void intel_dp_schedule_fallback_link_training(struct intel_dp *intel_dp,
						     const struct intel_crtc_state *crtc_state)
{
	struct intel_connector *intel_connector = intel_dp->attached_connector;
1086
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
1087

1088 1089
	if (intel_dp->hobl_active) {
		drm_dbg_kms(&dp_to_i915(intel_dp)->drm,
1090 1091 1092
			    "[ENCODER:%d:%s] Link Training failed with HOBL active, "
			    "not enabling it from now on",
			    encoder->base.base.id, encoder->base.name);
1093 1094
		intel_dp->hobl_failed = true;
	} else if (intel_dp_get_link_train_fallback_values(intel_dp,
1095 1096
							   crtc_state->port_clock,
							   crtc_state->lane_count)) {
1097 1098 1099 1100 1101
		return;
	}

	/* Schedule a Hotplug Uevent to userspace to start modeset */
	schedule_work(&intel_connector->modeset_retry_work);
1102
}
1103

1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123
/* Perform the link training on all LTTPRs and the DPRX on a link. */
static bool
intel_dp_link_train_all_phys(struct intel_dp *intel_dp,
			     const struct intel_crtc_state *crtc_state,
			     int lttpr_count)
{
	bool ret = true;
	int i;

	for (i = lttpr_count - 1; i >= 0; i--) {
		enum drm_dp_phy dp_phy = DP_PHY_LTTPR(i);

		ret = intel_dp_link_train_phy(intel_dp, crtc_state, dp_phy);
		intel_dp_disable_dpcd_training_pattern(intel_dp, dp_phy);

		if (!ret)
			break;
	}

	if (ret)
1124
		ret = intel_dp_link_train_phy(intel_dp, crtc_state, DP_PHY_DPRX);
1125 1126 1127 1128 1129 1130 1131

	if (intel_dp->set_idle_link_train)
		intel_dp->set_idle_link_train(intel_dp, crtc_state);

	return ret;
}

1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397
/*
 * 128b/132b DP LANEx_EQ_DONE Sequence (DP 2.0 E11 3.5.2.16.1)
 */
static bool
intel_dp_128b132b_lane_eq(struct intel_dp *intel_dp,
			  const struct intel_crtc_state *crtc_state)
{
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
	u8 link_status[DP_LINK_STATUS_SIZE];
	int delay_us;
	int try, max_tries = 20;
	unsigned long deadline;
	bool timeout = false;

	/*
	 * Reset signal levels. Start transmitting 128b/132b TPS1.
	 *
	 * Put DPRX and LTTPRs (if any) into intra-hop AUX mode by writing TPS1
	 * in DP_TRAINING_PATTERN_SET.
	 */
	if (!intel_dp_reset_link_train(intel_dp, crtc_state, DP_PHY_DPRX,
				       DP_TRAINING_PATTERN_1)) {
		drm_err(&i915->drm,
			"[ENCODER:%d:%s] Failed to start 128b/132b TPS1\n",
			encoder->base.base.id, encoder->base.name);
		return false;
	}

	delay_us = drm_dp_128b132b_read_aux_rd_interval(&intel_dp->aux);

	/* Read the initial TX FFE settings. */
	if (drm_dp_dpcd_read_link_status(&intel_dp->aux, link_status) < 0) {
		drm_err(&i915->drm,
			"[ENCODER:%d:%s] Failed to read TX FFE presets\n",
			encoder->base.base.id, encoder->base.name);
		return false;
	}

	/* Update signal levels and training set as requested. */
	intel_dp_get_adjust_train(intel_dp, crtc_state, DP_PHY_DPRX, link_status);
	if (!intel_dp_update_link_train(intel_dp, crtc_state, DP_PHY_DPRX)) {
		drm_err(&i915->drm,
			"[ENCODER:%d:%s] Failed to set initial TX FFE settings\n",
			encoder->base.base.id, encoder->base.name);
		return false;
	}

	/* Start transmitting 128b/132b TPS2. */
	if (!intel_dp_set_link_train(intel_dp, crtc_state, DP_PHY_DPRX,
				     DP_TRAINING_PATTERN_2)) {
		drm_err(&i915->drm,
			"[ENCODER:%d:%s] Failed to start 128b/132b TPS2\n",
			encoder->base.base.id, encoder->base.name);
		return false;
	}

	/* Time budget for the LANEx_EQ_DONE Sequence */
	deadline = jiffies + msecs_to_jiffies_timeout(400);

	for (try = 0; try < max_tries; try++) {
		usleep_range(delay_us, 2 * delay_us);

		/*
		 * The delay may get updated. The transmitter shall read the
		 * delay before link status during link training.
		 */
		delay_us = drm_dp_128b132b_read_aux_rd_interval(&intel_dp->aux);

		if (drm_dp_dpcd_read_link_status(&intel_dp->aux, link_status) < 0) {
			drm_err(&i915->drm,
				"[ENCODER:%d:%s] Failed to read link status\n",
				encoder->base.base.id, encoder->base.name);
			return false;
		}

		if (drm_dp_128b132b_link_training_failed(link_status)) {
			intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status);
			drm_err(&i915->drm,
				"[ENCODER:%d:%s] Downstream link training failure\n",
				encoder->base.base.id, encoder->base.name);
			return false;
		}

		if (drm_dp_128b132b_lane_channel_eq_done(link_status, crtc_state->lane_count)) {
			drm_dbg_kms(&i915->drm,
				    "[ENCODER:%d:%s] Lane channel eq done\n",
				    encoder->base.base.id, encoder->base.name);
			break;
		}

		if (timeout) {
			intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status);
			drm_err(&i915->drm,
				"[ENCODER:%d:%s] Lane channel eq timeout\n",
				encoder->base.base.id, encoder->base.name);
			return false;
		}

		if (time_after(jiffies, deadline))
			timeout = true; /* try one last time after deadline */

		/* Update signal levels and training set as requested. */
		intel_dp_get_adjust_train(intel_dp, crtc_state, DP_PHY_DPRX, link_status);
		if (!intel_dp_update_link_train(intel_dp, crtc_state, DP_PHY_DPRX)) {
			drm_err(&i915->drm,
				"[ENCODER:%d:%s] Failed to update TX FFE settings\n",
				encoder->base.base.id, encoder->base.name);
			return false;
		}
	}

	if (try == max_tries) {
		intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status);
		drm_err(&i915->drm,
			"[ENCODER:%d:%s] Max loop count reached\n",
			encoder->base.base.id, encoder->base.name);
		return false;
	}

	for (;;) {
		if (time_after(jiffies, deadline))
			timeout = true; /* try one last time after deadline */

		if (drm_dp_dpcd_read_link_status(&intel_dp->aux, link_status) < 0) {
			drm_err(&i915->drm,
				"[ENCODER:%d:%s] Failed to read link status\n",
				encoder->base.base.id, encoder->base.name);
			return false;
		}

		if (drm_dp_128b132b_link_training_failed(link_status)) {
			intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status);
			drm_err(&i915->drm,
				"[ENCODER:%d:%s] Downstream link training failure\n",
				encoder->base.base.id, encoder->base.name);
			return false;
		}

		if (drm_dp_128b132b_eq_interlane_align_done(link_status)) {
			drm_dbg_kms(&i915->drm,
				    "[ENCODER:%d:%s] Interlane align done\n",
				    encoder->base.base.id, encoder->base.name);
			break;
		}

		if (timeout) {
			intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status);
			drm_err(&i915->drm,
				"[ENCODER:%d:%s] Interlane align timeout\n",
				encoder->base.base.id, encoder->base.name);
			return false;
		}

		usleep_range(2000, 3000);
	}

	return true;
}

/*
 * 128b/132b DP LANEx_CDS_DONE Sequence (DP 2.0 E11 3.5.2.16.2)
 */
static bool
intel_dp_128b132b_lane_cds(struct intel_dp *intel_dp,
			   const struct intel_crtc_state *crtc_state,
			   int lttpr_count)
{
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
	u8 link_status[DP_LINK_STATUS_SIZE];
	unsigned long deadline;

	if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TRAINING_PATTERN_SET,
			       DP_TRAINING_PATTERN_2_CDS) != 1) {
		drm_err(&i915->drm,
			"[ENCODER:%d:%s] Failed to start 128b/132b TPS2 CDS\n",
			encoder->base.base.id, encoder->base.name);
		return false;
	}

	/* Time budget for the LANEx_CDS_DONE Sequence */
	deadline = jiffies + msecs_to_jiffies_timeout((lttpr_count + 1) * 20);

	for (;;) {
		bool timeout = false;

		if (time_after(jiffies, deadline))
			timeout = true; /* try one last time after deadline */

		usleep_range(2000, 3000);

		if (drm_dp_dpcd_read_link_status(&intel_dp->aux, link_status) < 0) {
			drm_err(&i915->drm,
				"[ENCODER:%d:%s] Failed to read link status\n",
				encoder->base.base.id, encoder->base.name);
			return false;
		}

		if (drm_dp_128b132b_eq_interlane_align_done(link_status) &&
		    drm_dp_128b132b_cds_interlane_align_done(link_status) &&
		    drm_dp_128b132b_lane_symbol_locked(link_status, crtc_state->lane_count)) {
			drm_dbg_kms(&i915->drm,
				    "[ENCODER:%d:%s] CDS interlane align done\n",
				    encoder->base.base.id, encoder->base.name);
			break;
		}

		if (drm_dp_128b132b_link_training_failed(link_status)) {
			intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status);
			drm_err(&i915->drm,
				"[ENCODER:%d:%s] Downstream link training failure\n",
				encoder->base.base.id, encoder->base.name);
			return false;
		}

		if (timeout) {
			intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status);
			drm_err(&i915->drm,
				"[ENCODER:%d:%s] CDS timeout\n",
				encoder->base.base.id, encoder->base.name);
			return false;
		}
	}

	/* FIXME: Should DP_TRAINING_PATTERN_DISABLE be written first? */
	if (intel_dp->set_idle_link_train)
		intel_dp->set_idle_link_train(intel_dp, crtc_state);

	return true;
}

/*
 * 128b/132b link training sequence. (DP 2.0 E11 SCR on link training.)
 */
static bool
intel_dp_128b132b_link_train(struct intel_dp *intel_dp,
			     const struct intel_crtc_state *crtc_state,
			     int lttpr_count)
{
	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
	struct intel_connector *connector = intel_dp->attached_connector;
	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
	bool passed = false;

	if (wait_for(intel_dp_128b132b_intra_hop(intel_dp, crtc_state) == 0, 500)) {
		drm_err(&i915->drm,
			"[ENCODER:%d:%s] 128b/132b intra-hop not clear\n",
			encoder->base.base.id, encoder->base.name);
		return false;
	}

	if (intel_dp_128b132b_lane_eq(intel_dp, crtc_state) &&
	    intel_dp_128b132b_lane_cds(intel_dp, crtc_state, lttpr_count))
		passed = true;

	drm_dbg_kms(&i915->drm,
		    "[CONNECTOR:%d:%s][ENCODER:%d:%s] 128b/132b Link Training %s at link rate = %d, lane count = %d\n",
		    connector->base.base.id, connector->base.name,
		    encoder->base.base.id, encoder->base.name,
		    passed ? "passed" : "failed",
		    crtc_state->port_clock, crtc_state->lane_count);

	return passed;
}

1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410
/**
 * intel_dp_start_link_train - start link training
 * @intel_dp: DP struct
 * @crtc_state: state for CRTC attached to the encoder
 *
 * Start the link training of the @intel_dp port, scheduling a fallback
 * retraining with reduced link rate/lane parameters if the link training
 * fails.
 * After calling this function intel_dp_stop_link_train() must be called.
 */
void intel_dp_start_link_train(struct intel_dp *intel_dp,
			       const struct intel_crtc_state *crtc_state)
{
1411
	bool passed;
1412 1413 1414 1415
	/*
	 * TODO: Reiniting LTTPRs here won't be needed once proper connector
	 * HW state readout is added.
	 */
1416 1417 1418
	int lttpr_count = intel_dp_init_lttpr_and_dprx_caps(intel_dp);

	if (lttpr_count < 0)
1419 1420
		/* Still continue with enabling the port and link training. */
		lttpr_count = 0;
1421

1422 1423
	intel_dp_prepare_link_train(intel_dp, crtc_state);

1424 1425 1426 1427 1428 1429
	if (intel_dp_is_uhbr(crtc_state))
		passed = intel_dp_128b132b_link_train(intel_dp, crtc_state, lttpr_count);
	else
		passed = intel_dp_link_train_all_phys(intel_dp, crtc_state, lttpr_count);

	if (!passed)
1430 1431
		intel_dp_schedule_fallback_link_training(intel_dp, crtc_state);
}