intel_hdmi.c 35.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 24 25 26 27 28 29
/*
 * Copyright 2006 Dave Airlie <airlied@linux.ie>
 * Copyright © 2006-2009 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.
 *
 * Authors:
 *	Eric Anholt <eric@anholt.net>
 *	Jesse Barnes <jesse.barnes@intel.com>
 */

#include <linux/i2c.h>
30
#include <linux/slab.h>
31
#include <linux/delay.h>
32
#include <linux/hdmi.h>
33 34 35
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
#include <drm/drm_edid.h>
36
#include "intel_drv.h"
37
#include <drm/i915_drm.h>
38 39
#include "i915_drv.h"

40 41
static struct drm_device *intel_hdmi_to_dev(struct intel_hdmi *intel_hdmi)
{
42
	return hdmi_to_dig_port(intel_hdmi)->base.base.dev;
43 44
}

45 46 47
static void
assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
{
48
	struct drm_device *dev = intel_hdmi_to_dev(intel_hdmi);
49 50 51
	struct drm_i915_private *dev_priv = dev->dev_private;
	uint32_t enabled_bits;

P
Paulo Zanoni 已提交
52
	enabled_bits = HAS_DDI(dev) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
53

54
	WARN(I915_READ(intel_hdmi->hdmi_reg) & enabled_bits,
55 56 57
	     "HDMI port enabled, expecting disabled\n");
}

58
struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
C
Chris Wilson 已提交
59
{
60 61 62
	struct intel_digital_port *intel_dig_port =
		container_of(encoder, struct intel_digital_port, base.base);
	return &intel_dig_port->hdmi;
C
Chris Wilson 已提交
63 64
}

65 66
static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
{
67
	return enc_to_intel_hdmi(&intel_attached_encoder(connector)->base);
68 69
}

70
static u32 g4x_infoframe_index(enum hdmi_infoframe_type type)
71
{
72 73
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
74
		return VIDEO_DIP_SELECT_AVI;
75
	case HDMI_INFOFRAME_TYPE_SPD:
76
		return VIDEO_DIP_SELECT_SPD;
77
	default:
78
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
79
		return 0;
80 81 82
	}
}

83
static u32 g4x_infoframe_enable(enum hdmi_infoframe_type type)
84
{
85 86
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
87
		return VIDEO_DIP_ENABLE_AVI;
88
	case HDMI_INFOFRAME_TYPE_SPD:
89
		return VIDEO_DIP_ENABLE_SPD;
90
	default:
91
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
92
		return 0;
93 94 95
	}
}

96
static u32 hsw_infoframe_enable(enum hdmi_infoframe_type type)
97
{
98 99
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
100
		return VIDEO_DIP_ENABLE_AVI_HSW;
101
	case HDMI_INFOFRAME_TYPE_SPD:
102 103
		return VIDEO_DIP_ENABLE_SPD_HSW;
	default:
104
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
105 106 107 108
		return 0;
	}
}

109
static u32 hsw_infoframe_data_reg(enum hdmi_infoframe_type type,
110
				  enum transcoder cpu_transcoder)
111
{
112 113
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
114
		return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
115
	case HDMI_INFOFRAME_TYPE_SPD:
116
		return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
117
	default:
118
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
119 120 121 122
		return 0;
	}
}

123
static void g4x_write_infoframe(struct drm_encoder *encoder,
124 125
				enum hdmi_infoframe_type type,
				const uint8_t *frame, ssize_t len)
126 127
{
	uint32_t *data = (uint32_t *)frame;
128 129
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
130
	u32 val = I915_READ(VIDEO_DIP_CTL);
131
	int i;
132

133 134
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");

135
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
136
	val |= g4x_infoframe_index(type);
137

138
	val &= ~g4x_infoframe_enable(type);
139

140
	I915_WRITE(VIDEO_DIP_CTL, val);
141

142
	mmiowb();
143
	for (i = 0; i < len; i += 4) {
144 145 146
		I915_WRITE(VIDEO_DIP_DATA, *data);
		data++;
	}
147 148 149
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(VIDEO_DIP_DATA, 0);
150
	mmiowb();
151

152
	val |= g4x_infoframe_enable(type);
153
	val &= ~VIDEO_DIP_FREQ_MASK;
154
	val |= VIDEO_DIP_FREQ_VSYNC;
155

156
	I915_WRITE(VIDEO_DIP_CTL, val);
157
	POSTING_READ(VIDEO_DIP_CTL);
158 159
}

160
static void ibx_write_infoframe(struct drm_encoder *encoder,
161 162
				enum hdmi_infoframe_type type,
				const uint8_t *frame, ssize_t len)
163 164 165 166
{
	uint32_t *data = (uint32_t *)frame;
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
167
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
168
	int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
169 170
	u32 val = I915_READ(reg);

171 172
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");

173
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
174
	val |= g4x_infoframe_index(type);
175

176
	val &= ~g4x_infoframe_enable(type);
177 178 179

	I915_WRITE(reg, val);

180
	mmiowb();
181 182 183 184
	for (i = 0; i < len; i += 4) {
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
185 186 187
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
188
	mmiowb();
189

190
	val |= g4x_infoframe_enable(type);
191
	val &= ~VIDEO_DIP_FREQ_MASK;
192
	val |= VIDEO_DIP_FREQ_VSYNC;
193 194

	I915_WRITE(reg, val);
195
	POSTING_READ(reg);
196 197 198
}

static void cpt_write_infoframe(struct drm_encoder *encoder,
199 200
				enum hdmi_infoframe_type type,
				const uint8_t *frame, ssize_t len)
201
{
202
	uint32_t *data = (uint32_t *)frame;
203 204
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
205
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
206
	int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
207
	u32 val = I915_READ(reg);
208

209 210
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");

211
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
212
	val |= g4x_infoframe_index(type);
213

214 215
	/* The DIP control register spec says that we need to update the AVI
	 * infoframe without clearing its enable bit */
216 217
	if (type != HDMI_INFOFRAME_TYPE_AVI)
		val &= ~g4x_infoframe_enable(type);
218

219
	I915_WRITE(reg, val);
220

221
	mmiowb();
222
	for (i = 0; i < len; i += 4) {
223 224 225
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
226 227 228
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
229
	mmiowb();
230

231
	val |= g4x_infoframe_enable(type);
232
	val &= ~VIDEO_DIP_FREQ_MASK;
233
	val |= VIDEO_DIP_FREQ_VSYNC;
234

235
	I915_WRITE(reg, val);
236
	POSTING_READ(reg);
237
}
238 239

static void vlv_write_infoframe(struct drm_encoder *encoder,
240 241
				enum hdmi_infoframe_type type,
				const uint8_t *frame, ssize_t len)
242 243 244 245
{
	uint32_t *data = (uint32_t *)frame;
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
246
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
247
	int i, reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
248
	u32 val = I915_READ(reg);
249

250 251
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");

252
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
253
	val |= g4x_infoframe_index(type);
254

255
	val &= ~g4x_infoframe_enable(type);
256

257
	I915_WRITE(reg, val);
258

259
	mmiowb();
260 261 262 263
	for (i = 0; i < len; i += 4) {
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
264 265 266
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
267
	mmiowb();
268

269
	val |= g4x_infoframe_enable(type);
270
	val &= ~VIDEO_DIP_FREQ_MASK;
271
	val |= VIDEO_DIP_FREQ_VSYNC;
272

273
	I915_WRITE(reg, val);
274
	POSTING_READ(reg);
275 276
}

277
static void hsw_write_infoframe(struct drm_encoder *encoder,
278 279
				enum hdmi_infoframe_type type,
				const uint8_t *frame, ssize_t len)
280
{
281 282 283 284
	uint32_t *data = (uint32_t *)frame;
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
285
	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
286 287
	u32 data_reg;
	int i;
288
	u32 val = I915_READ(ctl_reg);
289

290 291
	data_reg = hsw_infoframe_data_reg(type,
					  intel_crtc->config.cpu_transcoder);
292 293 294
	if (data_reg == 0)
		return;

295
	val &= ~hsw_infoframe_enable(type);
296 297
	I915_WRITE(ctl_reg, val);

298
	mmiowb();
299 300 301 302
	for (i = 0; i < len; i += 4) {
		I915_WRITE(data_reg + i, *data);
		data++;
	}
303 304 305
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(data_reg + i, 0);
306
	mmiowb();
307

308
	val |= hsw_infoframe_enable(type);
309
	I915_WRITE(ctl_reg, val);
310
	POSTING_READ(ctl_reg);
311 312
}

313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
/*
 * The data we write to the DIP data buffer registers is 1 byte bigger than the
 * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting
 * at 0). It's also a byte used by DisplayPort so the same DIP registers can be
 * used for both technologies.
 *
 * DW0: Reserved/ECC/DP | HB2 | HB1 | HB0
 * DW1:       DB3       | DB2 | DB1 | DB0
 * DW2:       DB7       | DB6 | DB5 | DB4
 * DW3: ...
 *
 * (HB is Header Byte, DB is Data Byte)
 *
 * The hdmi pack() functions don't know about that hardware specific hole so we
 * trick them by giving an offset into the buffer and moving back the header
 * bytes by one.
 */
330 331
static void intel_write_infoframe(struct drm_encoder *encoder,
				  union hdmi_infoframe *frame)
332 333
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
334 335 336 337 338 339 340 341 342 343 344 345 346 347
	uint8_t buffer[VIDEO_DIP_DATA_SIZE];
	ssize_t len;

	/* see comment above for the reason for this offset */
	len = hdmi_infoframe_pack(frame, buffer + 1, sizeof(buffer) - 1);
	if (len < 0)
		return;

	/* Insert the 'hole' (see big comment above) at position 3 */
	buffer[0] = buffer[1];
	buffer[1] = buffer[2];
	buffer[2] = buffer[3];
	buffer[3] = 0;
	len++;
348

349
	intel_hdmi->write_infoframe(encoder, frame->any.type, buffer, len);
350 351
}

352
static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
P
Paulo Zanoni 已提交
353
					 struct drm_display_mode *adjusted_mode)
354
{
355
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
356
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
357 358 359 360 361 362 363 364 365
	union hdmi_infoframe frame;
	int ret;

	ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
						       adjusted_mode);
	if (ret < 0) {
		DRM_ERROR("couldn't fill AVI infoframe\n");
		return;
	}
366

367
	if (intel_hdmi->rgb_quant_range_selectable) {
368
		if (intel_crtc->config.limited_color_range)
369 370
			frame.avi.quantization_range =
				HDMI_QUANTIZATION_RANGE_LIMITED;
371
		else
372 373
			frame.avi.quantization_range =
				HDMI_QUANTIZATION_RANGE_FULL;
374 375
	}

376
	intel_write_infoframe(encoder, &frame);
377 378
}

379
static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
380
{
381 382 383 384 385 386 387 388
	union hdmi_infoframe frame;
	int ret;

	ret = hdmi_spd_infoframe_init(&frame.spd, "Intel", "Integrated gfx");
	if (ret < 0) {
		DRM_ERROR("couldn't fill SPD infoframe\n");
		return;
	}
389

390
	frame.spd.sdi = HDMI_SPD_SDI_PC;
391

392
	intel_write_infoframe(encoder, &frame);
393 394
}

395 396 397
static void g4x_set_infoframes(struct drm_encoder *encoder,
			       struct drm_display_mode *adjusted_mode)
{
398
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
399 400
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
401 402
	u32 reg = VIDEO_DIP_CTL;
	u32 val = I915_READ(reg);
403
	u32 port;
404

405 406
	assert_hdmi_port_disabled(intel_hdmi);

407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
	/* If the registers were not initialized yet, they might be zeroes,
	 * which means we're selecting the AVI DIP and we're setting its
	 * frequency to once. This seems to really confuse the HW and make
	 * things stop working (the register spec says the AVI always needs to
	 * be sent every VSync). So here we avoid writing to the register more
	 * than we need and also explicitly select the AVI DIP and explicitly
	 * set its frequency to every VSync. Avoiding to write it twice seems to
	 * be enough to solve the problem, but being defensive shouldn't hurt us
	 * either. */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

	if (!intel_hdmi->has_hdmi_sink) {
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~VIDEO_DIP_ENABLE;
		I915_WRITE(reg, val);
423
		POSTING_READ(reg);
424 425 426
		return;
	}

427 428
	switch (intel_dig_port->port) {
	case PORT_B:
429
		port = VIDEO_DIP_PORT_B;
430
		break;
431
	case PORT_C:
432
		port = VIDEO_DIP_PORT_C;
433 434
		break;
	default:
435
		BUG();
436 437 438
		return;
	}

439 440 441 442
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
		if (val & VIDEO_DIP_ENABLE) {
			val &= ~VIDEO_DIP_ENABLE;
			I915_WRITE(reg, val);
443
			POSTING_READ(reg);
444 445 446 447 448
		}
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

449
	val |= VIDEO_DIP_ENABLE;
450
	val &= ~VIDEO_DIP_ENABLE_VENDOR;
451

452
	I915_WRITE(reg, val);
453
	POSTING_READ(reg);
454

455 456 457 458 459 460 461
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
}

static void ibx_set_infoframes(struct drm_encoder *encoder,
			       struct drm_display_mode *adjusted_mode)
{
462 463
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
464 465
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
466 467
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);
468
	u32 port;
469

470 471
	assert_hdmi_port_disabled(intel_hdmi);

472 473 474 475 476 477 478 479
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

	if (!intel_hdmi->has_hdmi_sink) {
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~VIDEO_DIP_ENABLE;
		I915_WRITE(reg, val);
480
		POSTING_READ(reg);
481 482 483
		return;
	}

484 485
	switch (intel_dig_port->port) {
	case PORT_B:
486
		port = VIDEO_DIP_PORT_B;
487
		break;
488
	case PORT_C:
489
		port = VIDEO_DIP_PORT_C;
490
		break;
491
	case PORT_D:
492
		port = VIDEO_DIP_PORT_D;
493 494
		break;
	default:
495
		BUG();
496 497 498
		return;
	}

499 500 501 502
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
		if (val & VIDEO_DIP_ENABLE) {
			val &= ~VIDEO_DIP_ENABLE;
			I915_WRITE(reg, val);
503
			POSTING_READ(reg);
504 505 506 507 508
		}
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

509
	val |= VIDEO_DIP_ENABLE;
510 511
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_GCP);
512

513
	I915_WRITE(reg, val);
514
	POSTING_READ(reg);
515

516 517 518 519 520 521 522
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
}

static void cpt_set_infoframes(struct drm_encoder *encoder,
			       struct drm_display_mode *adjusted_mode)
{
523 524 525 526 527 528
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

529 530
	assert_hdmi_port_disabled(intel_hdmi);

531 532 533 534 535 536 537 538
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

	if (!intel_hdmi->has_hdmi_sink) {
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI);
		I915_WRITE(reg, val);
539
		POSTING_READ(reg);
540 541 542
		return;
	}

543 544
	/* Set both together, unset both together: see the spec. */
	val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
545 546
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_GCP);
547 548

	I915_WRITE(reg, val);
549
	POSTING_READ(reg);
550

551 552 553 554 555 556 557
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
}

static void vlv_set_infoframes(struct drm_encoder *encoder,
			       struct drm_display_mode *adjusted_mode)
{
558 559 560 561 562 563
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
	u32 reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

564 565
	assert_hdmi_port_disabled(intel_hdmi);

566 567 568 569 570 571 572 573
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

	if (!intel_hdmi->has_hdmi_sink) {
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~VIDEO_DIP_ENABLE;
		I915_WRITE(reg, val);
574
		POSTING_READ(reg);
575 576 577
		return;
	}

578
	val |= VIDEO_DIP_ENABLE;
579 580
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_GCP);
581 582

	I915_WRITE(reg, val);
583
	POSTING_READ(reg);
584

585 586 587 588 589 590 591
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
}

static void hsw_set_infoframes(struct drm_encoder *encoder,
			       struct drm_display_mode *adjusted_mode)
{
592 593 594
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
595
	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
596
	u32 val = I915_READ(reg);
597

598 599
	assert_hdmi_port_disabled(intel_hdmi);

600 601
	if (!intel_hdmi->has_hdmi_sink) {
		I915_WRITE(reg, 0);
602
		POSTING_READ(reg);
603 604 605
		return;
	}

606 607 608 609
	val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
		 VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW);

	I915_WRITE(reg, val);
610
	POSTING_READ(reg);
611

612 613 614 615
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
}

616
static void intel_hdmi_mode_set(struct intel_encoder *encoder)
617
{
618
	struct drm_device *dev = encoder->base.dev;
619
	struct drm_i915_private *dev_priv = dev->dev_private;
620 621 622
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	struct drm_display_mode *adjusted_mode = &crtc->config.adjusted_mode;
623
	u32 hdmi_val;
624

625
	hdmi_val = SDVO_ENCODING_HDMI;
626
	if (!HAS_PCH_SPLIT(dev))
627
		hdmi_val |= intel_hdmi->color_range;
628
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
629
		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
630
	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
631
		hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
632

633
	if (crtc->config.pipe_bpp > 24)
634
		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
635
	else
636
		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
637

638 639
	/* Required on CPT */
	if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev))
640
		hdmi_val |= HDMI_MODE_SELECT_HDMI;
641

642
	if (intel_hdmi->has_audio) {
643
		DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
644
				 pipe_name(crtc->pipe));
645
		hdmi_val |= SDVO_AUDIO_ENABLE;
646
		hdmi_val |= HDMI_MODE_SELECT_HDMI;
647
		intel_write_eld(&encoder->base, adjusted_mode);
648
	}
649

650
	if (HAS_PCH_CPT(dev))
651
		hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
652
	else
653
		hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
654

655 656
	I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
	POSTING_READ(intel_hdmi->hdmi_reg);
657

658
	intel_hdmi->set_infoframes(&encoder->base, adjusted_mode);
659 660
}

661 662
static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
				    enum pipe *pipe)
663
{
664
	struct drm_device *dev = encoder->base.dev;
665
	struct drm_i915_private *dev_priv = dev->dev_private;
666 667 668
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	u32 tmp;

669
	tmp = I915_READ(intel_hdmi->hdmi_reg);
670 671 672 673 674 675 676 677 678 679 680 681

	if (!(tmp & SDVO_ENABLE))
		return false;

	if (HAS_PCH_CPT(dev))
		*pipe = PORT_TO_PIPE_CPT(tmp);
	else
		*pipe = PORT_TO_PIPE(tmp);

	return true;
}

682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703
static void intel_hdmi_get_config(struct intel_encoder *encoder,
				  struct intel_crtc_config *pipe_config)
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
	u32 tmp, flags = 0;

	tmp = I915_READ(intel_hdmi->hdmi_reg);

	if (tmp & SDVO_HSYNC_ACTIVE_HIGH)
		flags |= DRM_MODE_FLAG_PHSYNC;
	else
		flags |= DRM_MODE_FLAG_NHSYNC;

	if (tmp & SDVO_VSYNC_ACTIVE_HIGH)
		flags |= DRM_MODE_FLAG_PVSYNC;
	else
		flags |= DRM_MODE_FLAG_NVSYNC;

	pipe_config->adjusted_mode.flags |= flags;
}

704
static void intel_enable_hdmi(struct intel_encoder *encoder)
705
{
706
	struct drm_device *dev = encoder->base.dev;
707
	struct drm_i915_private *dev_priv = dev->dev_private;
708
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
709
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
710
	u32 temp;
711 712 713 714
	u32 enable_bits = SDVO_ENABLE;

	if (intel_hdmi->has_audio)
		enable_bits |= SDVO_AUDIO_ENABLE;
715

716
	temp = I915_READ(intel_hdmi->hdmi_reg);
717

718
	/* HW workaround for IBX, we need to move the port to transcoder A
719 720 721
	 * before disabling it, so restore the transcoder select bit here. */
	if (HAS_PCH_IBX(dev))
		enable_bits |= SDVO_PIPE_SEL(intel_crtc->pipe);
722

723 724 725
	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
	 * we do this anyway which shows more stable in testing.
	 */
726
	if (HAS_PCH_SPLIT(dev)) {
727 728
		I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
		POSTING_READ(intel_hdmi->hdmi_reg);
729 730
	}

731 732
	temp |= enable_bits;

733 734
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
735 736 737 738 739

	/* HW workaround, need to write this twice for issue that may result
	 * in first write getting masked.
	 */
	if (HAS_PCH_SPLIT(dev)) {
740 741
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
742
	}
743
}
744

745 746
static void vlv_enable_hdmi(struct intel_encoder *encoder)
{
747 748 749 750 751 752 753 754
}

static void intel_disable_hdmi(struct intel_encoder *encoder)
{
	struct drm_device *dev = encoder->base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	u32 temp;
755
	u32 enable_bits = SDVO_ENABLE | SDVO_AUDIO_ENABLE;
756

757
	temp = I915_READ(intel_hdmi->hdmi_reg);
758 759 760 761 762 763 764 765 766

	/* HW workaround for IBX, we need to move the port to transcoder A
	 * before disabling it. */
	if (HAS_PCH_IBX(dev)) {
		struct drm_crtc *crtc = encoder->base.crtc;
		int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;

		if (temp & SDVO_PIPE_B_SELECT) {
			temp &= ~SDVO_PIPE_B_SELECT;
767 768
			I915_WRITE(intel_hdmi->hdmi_reg, temp);
			POSTING_READ(intel_hdmi->hdmi_reg);
769 770

			/* Again we need to write this twice. */
771 772
			I915_WRITE(intel_hdmi->hdmi_reg, temp);
			POSTING_READ(intel_hdmi->hdmi_reg);
773 774 775 776 777 778 779 780

			/* Transcoder selection bits only update
			 * effectively on vblank. */
			if (crtc)
				intel_wait_for_vblank(dev, pipe);
			else
				msleep(50);
		}
781
	}
782

783 784 785 786
	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
	 * we do this anyway which shows more stable in testing.
	 */
	if (HAS_PCH_SPLIT(dev)) {
787 788
		I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
		POSTING_READ(intel_hdmi->hdmi_reg);
789 790 791
	}

	temp &= ~enable_bits;
792

793 794
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
795 796 797 798

	/* HW workaround, need to write this twice for issue that may result
	 * in first write getting masked.
	 */
799
	if (HAS_PCH_SPLIT(dev)) {
800 801
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
802
	}
803 804 805 806 807 808 809 810
}

static int intel_hdmi_mode_valid(struct drm_connector *connector,
				 struct drm_display_mode *mode)
{
	if (mode->clock > 165000)
		return MODE_CLOCK_HIGH;
	if (mode->clock < 20000)
811
		return MODE_CLOCK_LOW;
812 813 814 815 816 817 818

	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
		return MODE_NO_DBLESCAN;

	return MODE_OK;
}

819 820
bool intel_hdmi_compute_config(struct intel_encoder *encoder,
			       struct intel_crtc_config *pipe_config)
821
{
822 823 824
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	struct drm_device *dev = encoder->base.dev;
	struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode;
825
	int clock_12bpc = pipe_config->requested_mode.clock * 3 / 2;
826
	int desired_bpp;
827

828 829 830
	if (intel_hdmi->color_range_auto) {
		/* See CEA-861-E - 5.1 Default Encoding Parameters */
		if (intel_hdmi->has_hdmi_sink &&
831
		    drm_match_cea_mode(adjusted_mode) > 1)
832
			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
833 834 835 836
		else
			intel_hdmi->color_range = 0;
	}

837
	if (intel_hdmi->color_range)
838
		pipe_config->limited_color_range = true;
839

840 841 842
	if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
		pipe_config->has_pch_encoder = true;

843 844 845
	/*
	 * HDMI is either 12 or 8, so if the display lets 10bpc sneak
	 * through, clamp it down. Note that g4x/vlv don't support 12bpc hdmi
846 847
	 * outputs. We also need to check that the higher clock still fits
	 * within limits.
848
	 */
849 850
	if (pipe_config->pipe_bpp > 8*3 && clock_12bpc <= 225000
	    && HAS_PCH_SPLIT(dev)) {
851 852
		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
		desired_bpp = 12*3;
853 854

		/* Need to adjust the port link by 1.5x for 12bpc. */
855
		pipe_config->port_clock = clock_12bpc;
856
	} else {
857 858 859 860 861 862 863
		DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
		desired_bpp = 8*3;
	}

	if (!pipe_config->bw_constrained) {
		DRM_DEBUG_KMS("forcing pipe bpc to %i for HDMI\n", desired_bpp);
		pipe_config->pipe_bpp = desired_bpp;
864 865
	}

866 867 868 869 870
	if (adjusted_mode->clock > 225000) {
		DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n");
		return false;
	}

871 872 873
	return true;
}

874
static enum drm_connector_status
875
intel_hdmi_detect(struct drm_connector *connector, bool force)
876
{
877
	struct drm_device *dev = connector->dev;
878
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
879 880 881
	struct intel_digital_port *intel_dig_port =
		hdmi_to_dig_port(intel_hdmi);
	struct intel_encoder *intel_encoder = &intel_dig_port->base;
882
	struct drm_i915_private *dev_priv = dev->dev_private;
883
	struct edid *edid;
884
	enum drm_connector_status status = connector_status_disconnected;
885

886 887 888
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, drm_get_connector_name(connector));

C
Chris Wilson 已提交
889
	intel_hdmi->has_hdmi_sink = false;
890
	intel_hdmi->has_audio = false;
891
	intel_hdmi->rgb_quant_range_selectable = false;
892
	edid = drm_get_edid(connector,
893 894
			    intel_gmbus_get_adapter(dev_priv,
						    intel_hdmi->ddc_bus));
895

896
	if (edid) {
897
		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
898
			status = connector_status_connected;
899 900 901
			if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
				intel_hdmi->has_hdmi_sink =
						drm_detect_hdmi_monitor(edid);
902
			intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
903 904
			intel_hdmi->rgb_quant_range_selectable =
				drm_rgb_quant_range_selectable(edid);
905 906
		}
		kfree(edid);
907
	}
908

909
	if (status == connector_status_connected) {
910 911 912
		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
			intel_hdmi->has_audio =
				(intel_hdmi->force_audio == HDMI_AUDIO_ON);
913
		intel_encoder->type = INTEL_OUTPUT_HDMI;
914 915
	}

916
	return status;
917 918 919 920
}

static int intel_hdmi_get_modes(struct drm_connector *connector)
{
921
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
922
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
923 924 925 926 927

	/* We should parse the EDID data and find out if it's an HDMI sink so
	 * we can send audio to it.
	 */

928
	return intel_ddc_get_modes(connector,
929 930
				   intel_gmbus_get_adapter(dev_priv,
							   intel_hdmi->ddc_bus));
931 932
}

933 934 935 936 937 938 939 940 941
static bool
intel_hdmi_detect_audio(struct drm_connector *connector)
{
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
	struct edid *edid;
	bool has_audio = false;

	edid = drm_get_edid(connector,
942 943
			    intel_gmbus_get_adapter(dev_priv,
						    intel_hdmi->ddc_bus));
944 945 946 947 948 949 950 951 952
	if (edid) {
		if (edid->input & DRM_EDID_INPUT_DIGITAL)
			has_audio = drm_detect_monitor_audio(edid);
		kfree(edid);
	}

	return has_audio;
}

953 954
static int
intel_hdmi_set_property(struct drm_connector *connector,
955 956
			struct drm_property *property,
			uint64_t val)
957 958
{
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
959 960
	struct intel_digital_port *intel_dig_port =
		hdmi_to_dig_port(intel_hdmi);
961
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
962 963
	int ret;

964
	ret = drm_object_property_set_value(&connector->base, property, val);
965 966 967
	if (ret)
		return ret;

968
	if (property == dev_priv->force_audio_property) {
969
		enum hdmi_force_audio i = val;
970 971 972
		bool has_audio;

		if (i == intel_hdmi->force_audio)
973 974
			return 0;

975
		intel_hdmi->force_audio = i;
976

977
		if (i == HDMI_AUDIO_AUTO)
978 979
			has_audio = intel_hdmi_detect_audio(connector);
		else
980
			has_audio = (i == HDMI_AUDIO_ON);
981

982 983
		if (i == HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink = 0;
984

985
		intel_hdmi->has_audio = has_audio;
986 987 988
		goto done;
	}

989
	if (property == dev_priv->broadcast_rgb_property) {
990 991 992
		bool old_auto = intel_hdmi->color_range_auto;
		uint32_t old_range = intel_hdmi->color_range;

993 994 995 996 997 998 999 1000 1001 1002
		switch (val) {
		case INTEL_BROADCAST_RGB_AUTO:
			intel_hdmi->color_range_auto = true;
			break;
		case INTEL_BROADCAST_RGB_FULL:
			intel_hdmi->color_range_auto = false;
			intel_hdmi->color_range = 0;
			break;
		case INTEL_BROADCAST_RGB_LIMITED:
			intel_hdmi->color_range_auto = false;
1003
			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
1004 1005 1006 1007
			break;
		default:
			return -EINVAL;
		}
1008 1009 1010 1011 1012

		if (old_auto == intel_hdmi->color_range_auto &&
		    old_range == intel_hdmi->color_range)
			return 0;

1013 1014 1015
		goto done;
	}

1016 1017 1018
	return -EINVAL;

done:
1019 1020
	if (intel_dig_port->base.base.crtc)
		intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
1021 1022 1023 1024

	return 0;
}

1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
static void intel_hdmi_pre_enable(struct intel_encoder *encoder)
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_device *dev = encoder->base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *intel_crtc =
		to_intel_crtc(encoder->base.crtc);
	int port = vlv_dport_to_channel(dport);
	int pipe = intel_crtc->pipe;
	u32 val;

	if (!IS_VALLEYVIEW(dev))
		return;

	/* Enable clock channels for this port */
1040
	mutex_lock(&dev_priv->dpio_lock);
1041
	val = vlv_dpio_read(dev_priv, DPIO_DATA_LANE_A(port));
1042 1043 1044 1045 1046 1047
	val = 0;
	if (pipe)
		val |= (1<<21);
	else
		val &= ~(1<<21);
	val |= 0x001000c4;
1048
	vlv_dpio_write(dev_priv, DPIO_DATA_CHANNEL(port), val);
1049 1050

	/* HDMI 1.0V-2dB */
1051 1052
	vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port), 0);
	vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL4(port),
1053
			 0x2b245f5f);
1054
	vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL2(port),
1055
			 0x5578b83a);
1056
	vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL3(port),
1057
			 0x0c782040);
1058
	vlv_dpio_write(dev_priv, DPIO_TX3_SWING_CTL4(port),
1059
			 0x2b247878);
1060 1061
	vlv_dpio_write(dev_priv, DPIO_PCS_STAGGER0(port), 0x00030000);
	vlv_dpio_write(dev_priv, DPIO_PCS_CTL_OVER1(port),
1062
			 0x00002000);
1063
	vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port),
1064 1065 1066
			 DPIO_TX_OCALINIT_EN);

	/* Program lane clock */
1067
	vlv_dpio_write(dev_priv, DPIO_PCS_CLOCKBUF0(port),
1068
			 0x00760018);
1069
	vlv_dpio_write(dev_priv, DPIO_PCS_CLOCKBUF8(port),
1070
			 0x00400888);
1071
	mutex_unlock(&dev_priv->dpio_lock);
1072 1073 1074 1075

	intel_enable_hdmi(encoder);

	vlv_wait_port_ready(dev_priv, port);
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
}

static void intel_hdmi_pre_pll_enable(struct intel_encoder *encoder)
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_device *dev = encoder->base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	int port = vlv_dport_to_channel(dport);

	if (!IS_VALLEYVIEW(dev))
		return;

	/* Program Tx lane resets to default */
1089
	mutex_lock(&dev_priv->dpio_lock);
1090
	vlv_dpio_write(dev_priv, DPIO_PCS_TX(port),
1091 1092
			 DPIO_PCS_TX_LANE2_RESET |
			 DPIO_PCS_TX_LANE1_RESET);
1093
	vlv_dpio_write(dev_priv, DPIO_PCS_CLK(port),
1094 1095 1096 1097 1098 1099
			 DPIO_PCS_CLK_CRI_RXEB_EIOS_EN |
			 DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN |
			 (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) |
			 DPIO_PCS_CLK_SOFT_RESET);

	/* Fix up inter-pair skew failure */
1100 1101 1102
	vlv_dpio_write(dev_priv, DPIO_PCS_STAGGER1(port), 0x00750f00);
	vlv_dpio_write(dev_priv, DPIO_TX_CTL(port), 0x00001500);
	vlv_dpio_write(dev_priv, DPIO_TX_LANE(port), 0x40400000);
1103

1104
	vlv_dpio_write(dev_priv, DPIO_PCS_CTL_OVER1(port),
1105
			 0x00002000);
1106
	vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port),
1107
			 DPIO_TX_OCALINIT_EN);
1108
	mutex_unlock(&dev_priv->dpio_lock);
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118
}

static void intel_hdmi_post_disable(struct intel_encoder *encoder)
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
	int port = vlv_dport_to_channel(dport);

	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
	mutex_lock(&dev_priv->dpio_lock);
1119 1120
	vlv_dpio_write(dev_priv, DPIO_PCS_TX(port), 0x00000000);
	vlv_dpio_write(dev_priv, DPIO_PCS_CLK(port), 0x00e00060);
1121 1122 1123
	mutex_unlock(&dev_priv->dpio_lock);
}

1124 1125 1126 1127
static void intel_hdmi_destroy(struct drm_connector *connector)
{
	drm_sysfs_connector_remove(connector);
	drm_connector_cleanup(connector);
1128
	kfree(connector);
1129 1130 1131
}

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1132
	.dpms = intel_connector_dpms,
1133 1134
	.detect = intel_hdmi_detect,
	.fill_modes = drm_helper_probe_single_connector_modes,
1135
	.set_property = intel_hdmi_set_property,
1136 1137 1138 1139 1140 1141
	.destroy = intel_hdmi_destroy,
};

static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
	.get_modes = intel_hdmi_get_modes,
	.mode_valid = intel_hdmi_mode_valid,
1142
	.best_encoder = intel_best_encoder,
1143 1144 1145
};

static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
C
Chris Wilson 已提交
1146
	.destroy = intel_encoder_destroy,
1147 1148
};

1149 1150 1151
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1152
	intel_attach_force_audio_property(connector);
1153
	intel_attach_broadcast_rgb_property(connector);
1154
	intel_hdmi->color_range_auto = true;
1155 1156
}

P
Paulo Zanoni 已提交
1157 1158
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
			       struct intel_connector *intel_connector)
1159
{
1160 1161 1162 1163
	struct drm_connector *connector = &intel_connector->base;
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
	struct intel_encoder *intel_encoder = &intel_dig_port->base;
	struct drm_device *dev = intel_encoder->base.dev;
1164
	struct drm_i915_private *dev_priv = dev->dev_private;
1165
	enum port port = intel_dig_port->port;
1166

1167
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1168
			   DRM_MODE_CONNECTOR_HDMIA);
1169 1170
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

1171
	connector->interlace_allowed = 1;
1172
	connector->doublescan_allowed = 0;
1173

1174 1175
	switch (port) {
	case PORT_B:
1176
		intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
1177
		intel_encoder->hpd_pin = HPD_PORT_B;
1178 1179
		break;
	case PORT_C:
1180
		intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
1181
		intel_encoder->hpd_pin = HPD_PORT_C;
1182 1183
		break;
	case PORT_D:
1184
		intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
1185
		intel_encoder->hpd_pin = HPD_PORT_D;
1186 1187
		break;
	case PORT_A:
1188
		intel_encoder->hpd_pin = HPD_PORT_A;
1189 1190
		/* Internal port only for eDP. */
	default:
1191
		BUG();
1192
	}
1193

1194
	if (IS_VALLEYVIEW(dev)) {
1195
		intel_hdmi->write_infoframe = vlv_write_infoframe;
1196
		intel_hdmi->set_infoframes = vlv_set_infoframes;
1197 1198 1199
	} else if (!HAS_PCH_SPLIT(dev)) {
		intel_hdmi->write_infoframe = g4x_write_infoframe;
		intel_hdmi->set_infoframes = g4x_set_infoframes;
1200
	} else if (HAS_DDI(dev)) {
1201
		intel_hdmi->write_infoframe = hsw_write_infoframe;
1202
		intel_hdmi->set_infoframes = hsw_set_infoframes;
1203 1204
	} else if (HAS_PCH_IBX(dev)) {
		intel_hdmi->write_infoframe = ibx_write_infoframe;
1205
		intel_hdmi->set_infoframes = ibx_set_infoframes;
1206 1207
	} else {
		intel_hdmi->write_infoframe = cpt_write_infoframe;
1208
		intel_hdmi->set_infoframes = cpt_set_infoframes;
1209
	}
1210

P
Paulo Zanoni 已提交
1211
	if (HAS_DDI(dev))
1212 1213 1214
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
	drm_sysfs_connector_add(connector);

	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
	 * 0xd.  Failure to do so will result in spurious interrupts being
	 * generated on the port when a cable is not attached.
	 */
	if (IS_G4X(dev) && !IS_GM45(dev)) {
		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
	}
}

1231
void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct drm_encoder *encoder;
	struct intel_connector *intel_connector;

	intel_dig_port = kzalloc(sizeof(struct intel_digital_port), GFP_KERNEL);
	if (!intel_dig_port)
		return;

	intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
	if (!intel_connector) {
		kfree(intel_dig_port);
		return;
	}

	intel_encoder = &intel_dig_port->base;
	encoder = &intel_encoder->base;

	drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
			 DRM_MODE_ENCODER_TMDS);
P
Paulo Zanoni 已提交
1253

1254
	intel_encoder->compute_config = intel_hdmi_compute_config;
1255
	intel_encoder->mode_set = intel_hdmi_mode_set;
P
Paulo Zanoni 已提交
1256 1257
	intel_encoder->disable = intel_disable_hdmi;
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
1258
	intel_encoder->get_config = intel_hdmi_get_config;
1259 1260
	if (IS_VALLEYVIEW(dev)) {
		intel_encoder->pre_pll_enable = intel_hdmi_pre_pll_enable;
1261 1262
		intel_encoder->pre_enable = intel_hdmi_pre_enable;
		intel_encoder->enable = vlv_enable_hdmi;
1263
		intel_encoder->post_disable = intel_hdmi_post_disable;
1264 1265
	} else {
		intel_encoder->enable = intel_enable_hdmi;
1266
	}
1267

1268 1269 1270
	intel_encoder->type = INTEL_OUTPUT_HDMI;
	intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
	intel_encoder->cloneable = false;
1271

1272
	intel_dig_port->port = port;
1273
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
1274
	intel_dig_port->dp.output_reg = 0;
1275

1276
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
1277
}