atombios_dp.c 23.4 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 24
/*
 * Copyright 2007-8 Advanced Micro Devices, Inc.
 * Copyright 2008 Red Hat Inc.
 *
 * 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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.
 *
 * Authors: Dave Airlie
 *          Alex Deucher
25
 *          Jerome Glisse
26
 */
27 28
#include <drm/drmP.h>
#include <drm/radeon_drm.h>
29 30 31 32
#include "radeon.h"

#include "atom.h"
#include "atom-bits.h"
33
#include <drm/drm_dp_helper.h>
34

35
/* move these to drm_dp_helper.c/h */
36
#define DP_LINK_CONFIGURATION_SIZE 9
37
#define DP_DPCD_SIZE DP_RECEIVER_CAP_SIZE
38 39 40 41 42 43 44

static char *voltage_names[] = {
        "0.4V", "0.6V", "0.8V", "1.2V"
};
static char *pre_emph_names[] = {
        "0dB", "3.5dB", "6dB", "9.5dB"
};
45

46
/***** radeon AUX functions *****/
47 48 49 50 51 52

/* Atom needs data in little endian format
 * so swap as appropriate when copying data to
 * or from atom. Note that atom operates on
 * dw units.
 */
53
void radeon_atom_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le)
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
{
#ifdef __BIG_ENDIAN
	u8 src_tmp[20], dst_tmp[20]; /* used for byteswapping */
	u32 *dst32, *src32;
	int i;

	memcpy(src_tmp, src, num_bytes);
	src32 = (u32 *)src_tmp;
	dst32 = (u32 *)dst_tmp;
	if (to_le) {
		for (i = 0; i < ((num_bytes + 3) / 4); i++)
			dst32[i] = cpu_to_le32(src32[i]);
		memcpy(dst, dst_tmp, num_bytes);
	} else {
		u8 dws = num_bytes & ~3;
		for (i = 0; i < ((num_bytes + 3) / 4); i++)
			dst32[i] = le32_to_cpu(src32[i]);
		memcpy(dst, dst_tmp, dws);
		if (num_bytes % 4) {
			for (i = 0; i < (num_bytes % 4); i++)
				dst[dws+i] = dst_tmp[dws+i];
		}
	}
#else
	memcpy(dst, src, num_bytes);
#endif
}

82 83 84
union aux_channel_transaction {
	PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION v1;
	PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2 v2;
85 86
};

87 88 89 90 91 92 93 94 95 96 97 98 99
static int radeon_process_aux_ch(struct radeon_i2c_chan *chan,
				 u8 *send, int send_bytes,
				 u8 *recv, int recv_size,
				 u8 delay, u8 *ack)
{
	struct drm_device *dev = chan->dev;
	struct radeon_device *rdev = dev->dev_private;
	union aux_channel_transaction args;
	int index = GetIndexIntoMasterTable(COMMAND, ProcessAuxChannelTransaction);
	unsigned char *base;
	int recv_bytes;

	memset(&args, 0, sizeof(args));
100

101
	base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1);
102

103
	radeon_atom_copy_swap(base, send, send_bytes, true);
104

105 106
	args.v1.lpAuxRequest = cpu_to_le16((u16)(0 + 4));
	args.v1.lpDataOut = cpu_to_le16((u16)(16 + 4));
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
	args.v1.ucDataOutLen = 0;
	args.v1.ucChannelID = chan->rec.i2c_id;
	args.v1.ucDelay = delay / 10;
	if (ASIC_IS_DCE4(rdev))
		args.v2.ucHPD_ID = chan->rec.hpd;

	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);

	*ack = args.v1.ucReplyStatus;

	/* timeout */
	if (args.v1.ucReplyStatus == 1) {
		DRM_DEBUG_KMS("dp_aux_ch timeout\n");
		return -ETIMEDOUT;
	}

	/* flags not zero */
	if (args.v1.ucReplyStatus == 2) {
		DRM_DEBUG_KMS("dp_aux_ch flags not zero\n");
		return -EBUSY;
	}

	/* error */
	if (args.v1.ucReplyStatus == 3) {
		DRM_DEBUG_KMS("dp_aux_ch error\n");
		return -EIO;
	}

	recv_bytes = args.v1.ucDataOutLen;
	if (recv_bytes > recv_size)
		recv_bytes = recv_size;

	if (recv && recv_size)
140
		radeon_atom_copy_swap(recv, base + 16, recv_bytes, false);
141 142 143 144

	return recv_bytes;
}

145 146
#define BARE_ADDRESS_SIZE 3
#define HEADER_SIZE (BARE_ADDRESS_SIZE + 1)
147

148 149
static ssize_t
radeon_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
150
{
151 152
	struct radeon_i2c_chan *chan =
		container_of(aux, struct radeon_i2c_chan, aux);
153
	int ret;
154 155 156 157 158 159 160 161 162 163
	u8 tx_buf[20];
	size_t tx_size;
	u8 ack, delay = 0;

	if (WARN_ON(msg->size > 16))
		return -E2BIG;

	tx_buf[0] = msg->address & 0xff;
	tx_buf[1] = msg->address >> 8;
	tx_buf[2] = msg->request << 4;
164
	tx_buf[3] = msg->size ? (msg->size - 1) : 0;
165 166 167 168

	switch (msg->request & ~DP_AUX_I2C_MOT) {
	case DP_AUX_NATIVE_WRITE:
	case DP_AUX_I2C_WRITE:
169 170 171
		/* tx_size needs to be 4 even for bare address packets since the atom
		 * table needs the info in tx_buf[3].
		 */
172
		tx_size = HEADER_SIZE + msg->size;
173 174 175 176
		if (msg->size == 0)
			tx_buf[3] |= BARE_ADDRESS_SIZE << 4;
		else
			tx_buf[3] |= tx_size << 4;
177 178 179 180 181 182 183 184 185
		memcpy(tx_buf + HEADER_SIZE, msg->buffer, msg->size);
		ret = radeon_process_aux_ch(chan,
					    tx_buf, tx_size, NULL, 0, delay, &ack);
		if (ret >= 0)
			/* Return payload size. */
			ret = msg->size;
		break;
	case DP_AUX_NATIVE_READ:
	case DP_AUX_I2C_READ:
186 187 188
		/* tx_size needs to be 4 even for bare address packets since the atom
		 * table needs the info in tx_buf[3].
		 */
189
		tx_size = HEADER_SIZE;
190 191 192 193
		if (msg->size == 0)
			tx_buf[3] |= BARE_ADDRESS_SIZE << 4;
		else
			tx_buf[3] |= tx_size << 4;
194 195 196 197 198 199
		ret = radeon_process_aux_ch(chan,
					    tx_buf, tx_size, msg->buffer, msg->size, delay, &ack);
		break;
	default:
		ret = -EINVAL;
		break;
200
	}
201

202
	if (ret >= 0)
203
		msg->reply = ack >> 4;
204

205
	return ret;
206 207
}

208
void radeon_dp_aux_init(struct radeon_connector *radeon_connector)
209 210
{
	int ret;
211

212
	radeon_connector->ddc_bus->rec.hpd = radeon_connector->hpd.hpd;
213 214 215 216 217
	radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
	radeon_connector->ddc_bus->aux.transfer = radeon_dp_aux_transfer;
	ret = drm_dp_aux_register_i2c_bus(&radeon_connector->ddc_bus->aux);
	if (!ret)
		radeon_connector->ddc_bus->has_aux = true;
218

219
	WARN(ret, "drm_dp_aux_register_i2c_bus() failed with error %d\n", ret);
220 221
}

222 223
/***** general DP utility functions *****/

224
#define DP_VOLTAGE_MAX         DP_TRAIN_VOLTAGE_SWING_1200
225
#define DP_PRE_EMPHASIS_MAX    DP_TRAIN_PRE_EMPHASIS_9_5
226 227 228 229 230 231 232 233 234 235

static void dp_get_adjust_train(u8 link_status[DP_LINK_STATUS_SIZE],
				int lane_count,
				u8 train_set[4])
{
	u8 v = 0;
	u8 p = 0;
	int lane;

	for (lane = 0; lane < lane_count; lane++) {
236 237
		u8 this_v = drm_dp_get_adjust_request_voltage(link_status, lane);
		u8 this_p = drm_dp_get_adjust_request_pre_emphasis(link_status, lane);
238

239
		DRM_DEBUG_KMS("requested signal parameters: lane %d voltage %s pre_emph %s\n",
240 241 242
			  lane,
			  voltage_names[this_v >> DP_TRAIN_VOLTAGE_SWING_SHIFT],
			  pre_emph_names[this_p >> DP_TRAIN_PRE_EMPHASIS_SHIFT]);
243 244 245 246 247 248 249 250

		if (this_v > v)
			v = this_v;
		if (this_p > p)
			p = this_p;
	}

	if (v >= DP_VOLTAGE_MAX)
251
		v |= DP_TRAIN_MAX_SWING_REACHED;
252

253 254
	if (p >= DP_PRE_EMPHASIS_MAX)
		p |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
255

256
	DRM_DEBUG_KMS("using signal parameters: voltage %s pre_emph %s\n",
257 258
		  voltage_names[(v & DP_TRAIN_VOLTAGE_SWING_MASK) >> DP_TRAIN_VOLTAGE_SWING_SHIFT],
		  pre_emph_names[(p & DP_TRAIN_PRE_EMPHASIS_MASK) >> DP_TRAIN_PRE_EMPHASIS_SHIFT]);
259 260 261 262 263

	for (lane = 0; lane < 4; lane++)
		train_set[lane] = v | p;
}

264 265 266
/* convert bits per color to bits per pixel */
/* get bpc from the EDID */
static int convert_bpc_to_bpp(int bpc)
267
{
268 269 270 271 272
	if (bpc == 0)
		return 24;
	else
		return bpc * 3;
}
273

274 275 276 277 278 279 280
/* get the max pix clock supported by the link rate and lane num */
static int dp_get_max_dp_pix_clock(int link_rate,
				   int lane_num,
				   int bpp)
{
	return (link_rate * lane_num * 8) / bpp;
}
281

282
/***** radeon specific DP functions *****/
283

284 285 286 287 288 289 290 291
/* First get the min lane# when low rate is used according to pixel clock
 * (prefer low rate), second check max lane# supported by DP panel,
 * if the max lane# < low rate lane# then use max lane# instead.
 */
static int radeon_dp_get_dp_lane_number(struct drm_connector *connector,
					u8 dpcd[DP_DPCD_SIZE],
					int pix_clock)
{
292
	int bpp = convert_bpc_to_bpp(radeon_get_monitor_bpc(connector));
D
Daniel Vetter 已提交
293
	int max_link_rate = drm_dp_max_link_rate(dpcd);
294
	int max_lane_num = drm_dp_max_lane_count(dpcd);
295 296 297 298 299 300 301
	int lane_num;
	int max_dp_pix_clock;

	for (lane_num = 1; lane_num < max_lane_num; lane_num <<= 1) {
		max_dp_pix_clock = dp_get_max_dp_pix_clock(max_link_rate, lane_num, bpp);
		if (pix_clock <= max_dp_pix_clock)
			break;
302
	}
303

304
	return lane_num;
305 306
}

307 308 309
static int radeon_dp_get_dp_link_clock(struct drm_connector *connector,
				       u8 dpcd[DP_DPCD_SIZE],
				       int pix_clock)
310
{
311
	int bpp = convert_bpc_to_bpp(radeon_get_monitor_bpc(connector));
312 313
	int lane_num, max_pix_clock;

314 315
	if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) ==
	    ENCODER_OBJECT_ID_NUTMEG)
316 317 318 319 320 321 322 323 324 325 326 327 328
		return 270000;

	lane_num = radeon_dp_get_dp_lane_number(connector, dpcd, pix_clock);
	max_pix_clock = dp_get_max_dp_pix_clock(162000, lane_num, bpp);
	if (pix_clock <= max_pix_clock)
		return 162000;
	max_pix_clock = dp_get_max_dp_pix_clock(270000, lane_num, bpp);
	if (pix_clock <= max_pix_clock)
		return 270000;
	if (radeon_connector_is_dp12_capable(connector)) {
		max_pix_clock = dp_get_max_dp_pix_clock(540000, lane_num, bpp);
		if (pix_clock <= max_pix_clock)
			return 540000;
329
	}
330

D
Daniel Vetter 已提交
331
	return drm_dp_max_link_rate(dpcd);
332 333
}

334 335
static u8 radeon_dp_encoder_service(struct radeon_device *rdev,
				    int action, int dp_clock,
336
				    u8 ucconfig, u8 lane_num)
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
{
	DP_ENCODER_SERVICE_PARAMETERS args;
	int index = GetIndexIntoMasterTable(COMMAND, DPEncoderService);

	memset(&args, 0, sizeof(args));
	args.ucLinkClock = dp_clock / 10;
	args.ucConfig = ucconfig;
	args.ucAction = action;
	args.ucLaneNum = lane_num;
	args.ucStatus = 0;

	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
	return args.ucStatus;
}

u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector)
{
	struct drm_device *dev = radeon_connector->base.dev;
	struct radeon_device *rdev = dev->dev_private;

	return radeon_dp_encoder_service(rdev, ATOM_DP_ACTION_GET_SINK_TYPE, 0,
358
					 radeon_connector->ddc_bus->rec.i2c_id, 0);
359 360
}

361 362 363 364 365 366 367 368
static void radeon_dp_probe_oui(struct radeon_connector *radeon_connector)
{
	struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv;
	u8 buf[3];

	if (!(dig_connector->dpcd[DP_DOWN_STREAM_PORT_COUNT] & DP_OUI_SUPPORT))
		return;

369
	if (drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_SINK_OUI, buf, 3))
370 371 372
		DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n",
			      buf[0], buf[1], buf[2]);

373
	if (drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_BRANCH_OUI, buf, 3))
374 375 376 377
		DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n",
			      buf[0], buf[1], buf[2]);
}

A
Alex Deucher 已提交
378
bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector)
379
{
380
	struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv;
381
	u8 msg[DP_DPCD_SIZE];
382
	int ret, i;
383

384
	ret = drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_DPCD_REV, msg,
385
			       DP_DPCD_SIZE);
386
	if (ret > 0) {
387
		memcpy(dig_connector->dpcd, msg, DP_DPCD_SIZE);
388
		DRM_DEBUG_KMS("DPCD: ");
389
		for (i = 0; i < DP_DPCD_SIZE; i++)
390 391
			DRM_DEBUG_KMS("%02x ", msg[i]);
		DRM_DEBUG_KMS("\n");
392 393 394

		radeon_dp_probe_oui(radeon_connector);

A
Alex Deucher 已提交
395
		return true;
396
	}
397
	dig_connector->dpcd[0] = 0;
A
Alex Deucher 已提交
398
	return false;
399 400
}

401 402
int radeon_dp_get_panel_mode(struct drm_encoder *encoder,
			     struct drm_connector *connector)
403 404 405
{
	struct drm_device *dev = encoder->dev;
	struct radeon_device *rdev = dev->dev_private;
406
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
407
	struct radeon_connector_atom_dig *dig_connector;
408
	int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
409 410
	u16 dp_bridge = radeon_connector_encoder_get_dp_bridge_encoder_id(connector);
	u8 tmp;
411 412

	if (!ASIC_IS_DCE4(rdev))
413
		return panel_mode;
414

415 416 417 418 419
	if (!radeon_connector->con_priv)
		return panel_mode;

	dig_connector = radeon_connector->con_priv;

420 421
	if (dp_bridge != ENCODER_OBJECT_ID_NONE) {
		/* DP bridge chips */
422
		drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux,
423
				  DP_EDP_CONFIGURATION_CAP, &tmp);
424 425 426 427
		if (tmp & 1)
			panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
		else if ((dp_bridge == ENCODER_OBJECT_ID_NUTMEG) ||
			 (dp_bridge == ENCODER_OBJECT_ID_TRAVIS))
428 429
			panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
		else
430
			panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
431
	} else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
432
		/* eDP */
433
		drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux,
434
				  DP_EDP_CONFIGURATION_CAP, &tmp);
435 436 437
		if (tmp & 1)
			panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
	}
438

439
	return panel_mode;
440 441
}

442
void radeon_dp_set_link_config(struct drm_connector *connector,
443
			       const struct drm_display_mode *mode)
444
{
445
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
446 447 448 449 450 451
	struct radeon_connector_atom_dig *dig_connector;

	if (!radeon_connector->con_priv)
		return;
	dig_connector = radeon_connector->con_priv;

452 453 454 455 456 457 458
	if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
	    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
		dig_connector->dp_clock =
			radeon_dp_get_dp_link_clock(connector, dig_connector->dpcd, mode->clock);
		dig_connector->dp_lane_count =
			radeon_dp_get_dp_lane_number(connector, dig_connector->dpcd, mode->clock);
	}
459 460
}

461
int radeon_dp_mode_valid_helper(struct drm_connector *connector,
462 463
				struct drm_display_mode *mode)
{
464 465 466
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	struct radeon_connector_atom_dig *dig_connector;
	int dp_clock;
467

468 469 470 471 472 473 474 475 476 477 478 479
	if (!radeon_connector->con_priv)
		return MODE_CLOCK_HIGH;
	dig_connector = radeon_connector->con_priv;

	dp_clock =
		radeon_dp_get_dp_link_clock(connector, dig_connector->dpcd, mode->clock);

	if ((dp_clock == 540000) &&
	    (!radeon_connector_is_dp12_capable(connector)))
		return MODE_CLOCK_HIGH;

	return MODE_OK;
480 481
}

482 483 484 485 486
bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector)
{
	u8 link_status[DP_LINK_STATUS_SIZE];
	struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;

487 488
	if (drm_dp_dpcd_read_link_status(&radeon_connector->ddc_bus->aux, link_status)
	    <= 0)
489
		return false;
490
	if (drm_dp_channel_eq_ok(link_status, dig->dp_lane_count))
491 492 493 494
		return false;
	return true;
}

495 496 497 498 499 500 501 502 503 504 505 506 507
void radeon_dp_set_rx_power_state(struct drm_connector *connector,
				  u8 power_state)
{
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	struct radeon_connector_atom_dig *dig_connector;

	if (!radeon_connector->con_priv)
		return;

	dig_connector = radeon_connector->con_priv;

	/* power up/down the sink */
	if (dig_connector->dpcd[0] >= 0x11) {
508
		drm_dp_dpcd_writeb(&radeon_connector->ddc_bus->aux,
509 510 511 512 513 514
				   DP_SET_POWER, power_state);
		usleep_range(1000, 2000);
	}
}


515 516 517 518 519 520 521 522
struct radeon_dp_link_train_info {
	struct radeon_device *rdev;
	struct drm_encoder *encoder;
	struct drm_connector *connector;
	int enc_id;
	int dp_clock;
	int dp_lane_count;
	bool tp3_supported;
523
	u8 dpcd[DP_RECEIVER_CAP_SIZE];
524 525 526
	u8 train_set[4];
	u8 link_status[DP_LINK_STATUS_SIZE];
	u8 tries;
527
	bool use_dpencoder;
528
	struct drm_dp_aux *aux;
529
};
530

531
static void radeon_dp_update_vs_emph(struct radeon_dp_link_train_info *dp_info)
532
{
533 534 535 536 537 538
	/* set the initial vs/emph on the source */
	atombios_dig_transmitter_setup(dp_info->encoder,
				       ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH,
				       0, dp_info->train_set[0]); /* sets all lanes at once */

	/* set the vs/emph on the sink */
539 540
	drm_dp_dpcd_write(dp_info->aux, DP_TRAINING_LANE0_SET,
			  dp_info->train_set, dp_info->dp_lane_count);
541 542
}

543
static void radeon_dp_set_tp(struct radeon_dp_link_train_info *dp_info, int tp)
544
{
545
	int rtp = 0;
546

547
	/* set training pattern on the source */
548
	if (ASIC_IS_DCE4(dp_info->rdev) || !dp_info->use_dpencoder) {
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572
		switch (tp) {
		case DP_TRAINING_PATTERN_1:
			rtp = ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1;
			break;
		case DP_TRAINING_PATTERN_2:
			rtp = ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN2;
			break;
		case DP_TRAINING_PATTERN_3:
			rtp = ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN3;
			break;
		}
		atombios_dig_encoder_setup(dp_info->encoder, rtp, 0);
	} else {
		switch (tp) {
		case DP_TRAINING_PATTERN_1:
			rtp = 0;
			break;
		case DP_TRAINING_PATTERN_2:
			rtp = 1;
			break;
		}
		radeon_dp_encoder_service(dp_info->rdev, ATOM_DP_ACTION_TRAINING_PATTERN_SEL,
					  dp_info->dp_clock, dp_info->enc_id, rtp);
	}
573

574
	/* enable training pattern on the sink */
575
	drm_dp_dpcd_writeb(dp_info->aux, DP_TRAINING_PATTERN_SET, tp);
576 577
}

578
static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info)
579
{
580 581
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(dp_info->encoder);
	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
582
	u8 tmp;
583

584
	/* power up the sink */
585
	radeon_dp_set_rx_power_state(dp_info->connector, DP_SET_POWER_D0);
586 587 588

	/* possibly enable downspread on the sink */
	if (dp_info->dpcd[3] & 0x1)
589 590
		drm_dp_dpcd_writeb(dp_info->aux,
				   DP_DOWNSPREAD_CTRL, DP_SPREAD_AMP_0_5);
591
	else
592 593
		drm_dp_dpcd_writeb(dp_info->aux,
				   DP_DOWNSPREAD_CTRL, 0);
594

595 596
	if ((dp_info->connector->connector_type == DRM_MODE_CONNECTOR_eDP) &&
	    (dig->panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) {
597
		drm_dp_dpcd_writeb(dp_info->aux, DP_EDP_CONFIGURATION_SET, 1);
598
	}
599

600 601
	/* set the lane count on the sink */
	tmp = dp_info->dp_lane_count;
602
	if (drm_dp_enhanced_frame_cap(dp_info->dpcd))
603
		tmp |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
604
	drm_dp_dpcd_writeb(dp_info->aux, DP_LANE_COUNT_SET, tmp);
605

606
	/* set the link rate on the sink */
D
Daniel Vetter 已提交
607
	tmp = drm_dp_link_rate_to_bw_code(dp_info->dp_clock);
608
	drm_dp_dpcd_writeb(dp_info->aux, DP_LINK_BW_SET, tmp);
609

610
	/* start training on the source */
611
	if (ASIC_IS_DCE4(dp_info->rdev) || !dp_info->use_dpencoder)
612 613
		atombios_dig_encoder_setup(dp_info->encoder,
					   ATOM_ENCODER_CMD_DP_LINK_TRAINING_START, 0);
614
	else
615 616
		radeon_dp_encoder_service(dp_info->rdev, ATOM_DP_ACTION_TRAINING_START,
					  dp_info->dp_clock, dp_info->enc_id, 0);
617 618

	/* disable the training pattern on the sink */
619 620 621
	drm_dp_dpcd_writeb(dp_info->aux,
			   DP_TRAINING_PATTERN_SET,
			   DP_TRAINING_PATTERN_DISABLE);
622 623 624

	return 0;
}
625

626 627
static int radeon_dp_link_train_finish(struct radeon_dp_link_train_info *dp_info)
{
628 629
	udelay(400);

630
	/* disable the training pattern on the sink */
631 632 633
	drm_dp_dpcd_writeb(dp_info->aux,
			   DP_TRAINING_PATTERN_SET,
			   DP_TRAINING_PATTERN_DISABLE);
634 635

	/* disable the training pattern on the source */
636
	if (ASIC_IS_DCE4(dp_info->rdev) || !dp_info->use_dpencoder)
637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656
		atombios_dig_encoder_setup(dp_info->encoder,
					   ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE, 0);
	else
		radeon_dp_encoder_service(dp_info->rdev, ATOM_DP_ACTION_TRAINING_COMPLETE,
					  dp_info->dp_clock, dp_info->enc_id, 0);

	return 0;
}

static int radeon_dp_link_train_cr(struct radeon_dp_link_train_info *dp_info)
{
	bool clock_recovery;
 	u8 voltage;
	int i;

	radeon_dp_set_tp(dp_info, DP_TRAINING_PATTERN_1);
	memset(dp_info->train_set, 0, 4);
	radeon_dp_update_vs_emph(dp_info);

	udelay(400);
657

658 659
	/* clock recovery loop */
	clock_recovery = false;
660
	dp_info->tries = 0;
661
	voltage = 0xff;
662
	while (1) {
663
		drm_dp_link_train_clock_recovery_delay(dp_info->dpcd);
664

665 666
		if (drm_dp_dpcd_read_link_status(dp_info->aux,
						 dp_info->link_status) <= 0) {
667
			DRM_ERROR("displayport link status failed\n");
668
			break;
669
		}
670

671
		if (drm_dp_clock_recovery_ok(dp_info->link_status, dp_info->dp_lane_count)) {
672 673 674 675
			clock_recovery = true;
			break;
		}

676 677
		for (i = 0; i < dp_info->dp_lane_count; i++) {
			if ((dp_info->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)
678 679
				break;
		}
680
		if (i == dp_info->dp_lane_count) {
681 682 683 684
			DRM_ERROR("clock recovery reached max voltage\n");
			break;
		}

685 686 687
		if ((dp_info->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) {
			++dp_info->tries;
			if (dp_info->tries == 5) {
688 689 690 691
				DRM_ERROR("clock recovery tried 5 times\n");
				break;
			}
		} else
692
			dp_info->tries = 0;
693

694
		voltage = dp_info->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
695 696

		/* Compute new train_set as requested by sink */
697 698 699
		dp_get_adjust_train(dp_info->link_status, dp_info->dp_lane_count, dp_info->train_set);

		radeon_dp_update_vs_emph(dp_info);
700
	}
701
	if (!clock_recovery) {
702
		DRM_ERROR("clock recovery failed\n");
703 704
		return -1;
	} else {
705
		DRM_DEBUG_KMS("clock recovery at voltage %d pre-emphasis %d\n",
706 707
			  dp_info->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK,
			  (dp_info->train_set[0] & DP_TRAIN_PRE_EMPHASIS_MASK) >>
708
			  DP_TRAIN_PRE_EMPHASIS_SHIFT);
709 710 711
		return 0;
	}
}
712

713 714 715
static int radeon_dp_link_train_ce(struct radeon_dp_link_train_info *dp_info)
{
	bool channel_eq;
716

717 718
	if (dp_info->tp3_supported)
		radeon_dp_set_tp(dp_info, DP_TRAINING_PATTERN_3);
719
	else
720
		radeon_dp_set_tp(dp_info, DP_TRAINING_PATTERN_2);
721 722

	/* channel equalization loop */
723
	dp_info->tries = 0;
724
	channel_eq = false;
725
	while (1) {
726
		drm_dp_link_train_channel_eq_delay(dp_info->dpcd);
727

728 729
		if (drm_dp_dpcd_read_link_status(dp_info->aux,
						 dp_info->link_status) <= 0) {
730
			DRM_ERROR("displayport link status failed\n");
731
			break;
732
		}
733

734
		if (drm_dp_channel_eq_ok(dp_info->link_status, dp_info->dp_lane_count)) {
735 736 737 738 739
			channel_eq = true;
			break;
		}

		/* Try 5 times */
740
		if (dp_info->tries > 5) {
741 742 743 744 745
			DRM_ERROR("channel eq failed: 5 tries\n");
			break;
		}

		/* Compute new train_set as requested by sink */
746
		dp_get_adjust_train(dp_info->link_status, dp_info->dp_lane_count, dp_info->train_set);
747

748 749
		radeon_dp_update_vs_emph(dp_info);
		dp_info->tries++;
750 751
	}

752
	if (!channel_eq) {
753
		DRM_ERROR("channel eq failed\n");
754 755
		return -1;
	} else {
756
		DRM_DEBUG_KMS("channel eq at voltage %d pre-emphasis %d\n",
757 758
			  dp_info->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK,
			  (dp_info->train_set[0] & DP_TRAIN_PRE_EMPHASIS_MASK)
759
			  >> DP_TRAIN_PRE_EMPHASIS_SHIFT);
760 761
		return 0;
	}
762 763
}

764 765
void radeon_dp_link_train(struct drm_encoder *encoder,
			  struct drm_connector *connector)
766
{
767 768 769 770 771 772 773
	struct drm_device *dev = encoder->dev;
	struct radeon_device *rdev = dev->dev_private;
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
	struct radeon_encoder_atom_dig *dig;
	struct radeon_connector *radeon_connector;
	struct radeon_connector_atom_dig *dig_connector;
	struct radeon_dp_link_train_info dp_info;
774 775
	int index;
	u8 tmp, frev, crev;
776

777 778 779
	if (!radeon_encoder->enc_priv)
		return;
	dig = radeon_encoder->enc_priv;
780

781 782 783 784
	radeon_connector = to_radeon_connector(connector);
	if (!radeon_connector->con_priv)
		return;
	dig_connector = radeon_connector->con_priv;
785

786 787 788
	if ((dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_DISPLAYPORT) &&
	    (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_eDP))
		return;
789

790 791 792 793 794 795 796 797 798 799 800 801
	/* DPEncoderService newer than 1.1 can't program properly the
	 * training pattern. When facing such version use the
	 * DIGXEncoderControl (X== 1 | 2)
	 */
	dp_info.use_dpencoder = true;
	index = GetIndexIntoMasterTable(COMMAND, DPEncoderService);
	if (atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) {
		if (crev > 1) {
			dp_info.use_dpencoder = false;
		}
	}

802 803 804 805 806 807 808 809 810
	dp_info.enc_id = 0;
	if (dig->dig_encoder)
		dp_info.enc_id |= ATOM_DP_CONFIG_DIG2_ENCODER;
	else
		dp_info.enc_id |= ATOM_DP_CONFIG_DIG1_ENCODER;
	if (dig->linkb)
		dp_info.enc_id |= ATOM_DP_CONFIG_LINK_B;
	else
		dp_info.enc_id |= ATOM_DP_CONFIG_LINK_A;
811

812
	drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux, DP_MAX_LANE_COUNT, &tmp);
813 814 815 816 817
	if (ASIC_IS_DCE5(rdev) && (tmp & DP_TPS3_SUPPORTED))
		dp_info.tp3_supported = true;
	else
		dp_info.tp3_supported = false;

818
	memcpy(dp_info.dpcd, dig_connector->dpcd, DP_RECEIVER_CAP_SIZE);
819 820 821 822 823
	dp_info.rdev = rdev;
	dp_info.encoder = encoder;
	dp_info.connector = connector;
	dp_info.dp_lane_count = dig_connector->dp_lane_count;
	dp_info.dp_clock = dig_connector->dp_clock;
824
	dp_info.aux = &radeon_connector->ddc_bus->aux;
825 826 827 828 829 830 831 832 833 834

	if (radeon_dp_link_train_init(&dp_info))
		goto done;
	if (radeon_dp_link_train_cr(&dp_info))
		goto done;
	if (radeon_dp_link_train_ce(&dp_info))
		goto done;
done:
	if (radeon_dp_link_train_finish(&dp_info))
		return;
835
}