intel_hdmi.c 52.3 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 78
	case HDMI_INFOFRAME_TYPE_VENDOR:
		return VIDEO_DIP_SELECT_VENDOR;
79
	default:
80
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
81
		return 0;
82 83 84
	}
}

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

100
static u32 hsw_infoframe_enable(enum hdmi_infoframe_type type)
101
{
102 103
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
104
		return VIDEO_DIP_ENABLE_AVI_HSW;
105
	case HDMI_INFOFRAME_TYPE_SPD:
106
		return VIDEO_DIP_ENABLE_SPD_HSW;
107 108
	case HDMI_INFOFRAME_TYPE_VENDOR:
		return VIDEO_DIP_ENABLE_VS_HSW;
109
	default:
110
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
111 112 113 114
		return 0;
	}
}

115
static u32 hsw_infoframe_data_reg(enum hdmi_infoframe_type type,
116 117
				  enum transcoder cpu_transcoder,
				  struct drm_i915_private *dev_priv)
118
{
119 120
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
121
		return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
122
	case HDMI_INFOFRAME_TYPE_SPD:
123
		return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
124 125
	case HDMI_INFOFRAME_TYPE_VENDOR:
		return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder);
126
	default:
127
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
128 129 130 131
		return 0;
	}
}

132
static void g4x_write_infoframe(struct drm_encoder *encoder,
133
				enum hdmi_infoframe_type type,
134
				const void *frame, ssize_t len)
135
{
136
	const uint32_t *data = frame;
137 138
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
139
	u32 val = I915_READ(VIDEO_DIP_CTL);
140
	int i;
141

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

144
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
145
	val |= g4x_infoframe_index(type);
146

147
	val &= ~g4x_infoframe_enable(type);
148

149
	I915_WRITE(VIDEO_DIP_CTL, val);
150

151
	mmiowb();
152
	for (i = 0; i < len; i += 4) {
153 154 155
		I915_WRITE(VIDEO_DIP_DATA, *data);
		data++;
	}
156 157 158
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(VIDEO_DIP_DATA, 0);
159
	mmiowb();
160

161
	val |= g4x_infoframe_enable(type);
162
	val &= ~VIDEO_DIP_FREQ_MASK;
163
	val |= VIDEO_DIP_FREQ_VSYNC;
164

165
	I915_WRITE(VIDEO_DIP_CTL, val);
166
	POSTING_READ(VIDEO_DIP_CTL);
167 168
}

169 170 171 172
static bool g4x_infoframe_enabled(struct drm_encoder *encoder)
{
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
173
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
174 175
	u32 val = I915_READ(VIDEO_DIP_CTL);

176 177 178 179
	if (VIDEO_DIP_PORT(intel_dig_port->port) == (val & VIDEO_DIP_PORT_MASK))
		return val & VIDEO_DIP_ENABLE;

	return false;
180 181
}

182
static void ibx_write_infoframe(struct drm_encoder *encoder,
183
				enum hdmi_infoframe_type type,
184
				const void *frame, ssize_t len)
185
{
186
	const uint32_t *data = frame;
187 188
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
189
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
190
	int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
191 192
	u32 val = I915_READ(reg);

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

195
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
196
	val |= g4x_infoframe_index(type);
197

198
	val &= ~g4x_infoframe_enable(type);
199 200 201

	I915_WRITE(reg, val);

202
	mmiowb();
203 204 205 206
	for (i = 0; i < len; i += 4) {
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
207 208 209
	/* 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);
210
	mmiowb();
211

212
	val |= g4x_infoframe_enable(type);
213
	val &= ~VIDEO_DIP_FREQ_MASK;
214
	val |= VIDEO_DIP_FREQ_VSYNC;
215 216

	I915_WRITE(reg, val);
217
	POSTING_READ(reg);
218 219
}

220 221 222 223 224 225 226 227 228 229 230
static bool ibx_infoframe_enabled(struct drm_encoder *encoder)
{
	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);
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

	return val & VIDEO_DIP_ENABLE;
}

231
static void cpt_write_infoframe(struct drm_encoder *encoder,
232
				enum hdmi_infoframe_type type,
233
				const void *frame, ssize_t len)
234
{
235
	const uint32_t *data = frame;
236 237
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
238
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
239
	int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
240
	u32 val = I915_READ(reg);
241

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

244
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
245
	val |= g4x_infoframe_index(type);
246

247 248
	/* The DIP control register spec says that we need to update the AVI
	 * infoframe without clearing its enable bit */
249 250
	if (type != HDMI_INFOFRAME_TYPE_AVI)
		val &= ~g4x_infoframe_enable(type);
251

252
	I915_WRITE(reg, val);
253

254
	mmiowb();
255
	for (i = 0; i < len; i += 4) {
256 257 258
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
259 260 261
	/* 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);
262
	mmiowb();
263

264
	val |= g4x_infoframe_enable(type);
265
	val &= ~VIDEO_DIP_FREQ_MASK;
266
	val |= VIDEO_DIP_FREQ_VSYNC;
267

268
	I915_WRITE(reg, val);
269
	POSTING_READ(reg);
270
}
271

272 273 274 275 276 277 278 279 280 281 282
static bool cpt_infoframe_enabled(struct drm_encoder *encoder)
{
	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);
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

	return val & VIDEO_DIP_ENABLE;
}

283
static void vlv_write_infoframe(struct drm_encoder *encoder,
284
				enum hdmi_infoframe_type type,
285
				const void *frame, ssize_t len)
286
{
287
	const uint32_t *data = frame;
288 289
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
290
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
291
	int i, reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
292
	u32 val = I915_READ(reg);
293

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

296
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
297
	val |= g4x_infoframe_index(type);
298

299
	val &= ~g4x_infoframe_enable(type);
300

301
	I915_WRITE(reg, val);
302

303
	mmiowb();
304 305 306 307
	for (i = 0; i < len; i += 4) {
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
308 309 310
	/* 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);
311
	mmiowb();
312

313
	val |= g4x_infoframe_enable(type);
314
	val &= ~VIDEO_DIP_FREQ_MASK;
315
	val |= VIDEO_DIP_FREQ_VSYNC;
316

317
	I915_WRITE(reg, val);
318
	POSTING_READ(reg);
319 320
}

321 322 323 324 325 326 327 328 329 330 331
static bool vlv_infoframe_enabled(struct drm_encoder *encoder)
{
	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);
	int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

	return val & VIDEO_DIP_ENABLE;
}

332
static void hsw_write_infoframe(struct drm_encoder *encoder,
333
				enum hdmi_infoframe_type type,
334
				const void *frame, ssize_t len)
335
{
336
	const uint32_t *data = frame;
337 338 339
	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);
340
	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
341 342
	u32 data_reg;
	int i;
343
	u32 val = I915_READ(ctl_reg);
344

345
	data_reg = hsw_infoframe_data_reg(type,
346 347
					  intel_crtc->config.cpu_transcoder,
					  dev_priv);
348 349 350
	if (data_reg == 0)
		return;

351
	val &= ~hsw_infoframe_enable(type);
352 353
	I915_WRITE(ctl_reg, val);

354
	mmiowb();
355 356 357 358
	for (i = 0; i < len; i += 4) {
		I915_WRITE(data_reg + i, *data);
		data++;
	}
359 360 361
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(data_reg + i, 0);
362
	mmiowb();
363

364
	val |= hsw_infoframe_enable(type);
365
	I915_WRITE(ctl_reg, val);
366
	POSTING_READ(ctl_reg);
367 368
}

369 370 371 372 373 374 375 376 377 378 379 380
static bool hsw_infoframe_enabled(struct drm_encoder *encoder)
{
	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);
	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
	u32 val = I915_READ(ctl_reg);

	return val & (VIDEO_DIP_ENABLE_AVI_HSW | VIDEO_DIP_ENABLE_SPD_HSW |
		      VIDEO_DIP_ENABLE_VS_HSW);
}

381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
/*
 * 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.
 */
398 399
static void intel_write_infoframe(struct drm_encoder *encoder,
				  union hdmi_infoframe *frame)
400 401
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
402 403
	uint8_t buffer[VIDEO_DIP_DATA_SIZE];
	ssize_t len;
404

405 406 407 408 409 410 411 412 413 414 415
	/* 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++;
416

417
	intel_hdmi->write_infoframe(encoder, frame->any.type, buffer, len);
418 419
}

420
static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
P
Paulo Zanoni 已提交
421
					 struct drm_display_mode *adjusted_mode)
422
{
423
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
424
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
425 426
	union hdmi_infoframe frame;
	int ret;
427

428 429 430
	/* Set user selected PAR to incoming mode's member */
	adjusted_mode->picture_aspect_ratio = intel_hdmi->aspect_ratio;

431 432 433 434 435 436
	ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
						       adjusted_mode);
	if (ret < 0) {
		DRM_ERROR("couldn't fill AVI infoframe\n");
		return;
	}
P
Paulo Zanoni 已提交
437

438
	if (intel_hdmi->rgb_quant_range_selectable) {
439
		if (intel_crtc->config.limited_color_range)
440 441
			frame.avi.quantization_range =
				HDMI_QUANTIZATION_RANGE_LIMITED;
442
		else
443 444
			frame.avi.quantization_range =
				HDMI_QUANTIZATION_RANGE_FULL;
445 446
	}

447
	intel_write_infoframe(encoder, &frame);
448 449
}

450
static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
451
{
452 453 454 455 456 457 458 459
	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;
	}
460

461
	frame.spd.sdi = HDMI_SPD_SDI_PC;
462

463
	intel_write_infoframe(encoder, &frame);
464 465
}

466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
static void
intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
			      struct drm_display_mode *adjusted_mode)
{
	union hdmi_infoframe frame;
	int ret;

	ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi,
							  adjusted_mode);
	if (ret < 0)
		return;

	intel_write_infoframe(encoder, &frame);
}

481
static void g4x_set_infoframes(struct drm_encoder *encoder,
482
			       bool enable,
483 484
			       struct drm_display_mode *adjusted_mode)
{
485
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
486 487
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
488 489
	u32 reg = VIDEO_DIP_CTL;
	u32 val = I915_READ(reg);
490
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
491

492 493
	assert_hdmi_port_disabled(intel_hdmi);

494 495 496 497 498 499 500 501 502 503 504
	/* 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;

505
	if (!enable) {
506 507 508 509
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~VIDEO_DIP_ENABLE;
		I915_WRITE(reg, val);
510
		POSTING_READ(reg);
511 512 513
		return;
	}

514 515 516 517
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
		if (val & VIDEO_DIP_ENABLE) {
			val &= ~VIDEO_DIP_ENABLE;
			I915_WRITE(reg, val);
518
			POSTING_READ(reg);
519 520 521 522 523
		}
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

524
	val |= VIDEO_DIP_ENABLE;
525
	val &= ~VIDEO_DIP_ENABLE_VENDOR;
526

527
	I915_WRITE(reg, val);
528
	POSTING_READ(reg);
529

530 531
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
532
	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
533 534 535
}

static void ibx_set_infoframes(struct drm_encoder *encoder,
536
			       bool enable,
537 538
			       struct drm_display_mode *adjusted_mode)
{
539 540
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
541 542
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
543 544
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);
545
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
546

547 548
	assert_hdmi_port_disabled(intel_hdmi);

549 550 551
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

552
	if (!enable) {
553 554 555 556
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~VIDEO_DIP_ENABLE;
		I915_WRITE(reg, val);
557
		POSTING_READ(reg);
558 559 560
		return;
	}

561 562 563 564
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
		if (val & VIDEO_DIP_ENABLE) {
			val &= ~VIDEO_DIP_ENABLE;
			I915_WRITE(reg, val);
565
			POSTING_READ(reg);
566 567 568 569 570
		}
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

571
	val |= VIDEO_DIP_ENABLE;
572 573
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_GCP);
574

575
	I915_WRITE(reg, val);
576
	POSTING_READ(reg);
577

578 579
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
580
	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
581 582 583
}

static void cpt_set_infoframes(struct drm_encoder *encoder,
584
			       bool enable,
585 586
			       struct drm_display_mode *adjusted_mode)
{
587 588 589 590 591 592
	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);

593 594
	assert_hdmi_port_disabled(intel_hdmi);

595 596 597
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

598
	if (!enable) {
599 600 601 602
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI);
		I915_WRITE(reg, val);
603
		POSTING_READ(reg);
604 605 606
		return;
	}

607 608
	/* Set both together, unset both together: see the spec. */
	val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
609 610
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_GCP);
611 612

	I915_WRITE(reg, val);
613
	POSTING_READ(reg);
614

615 616
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
617
	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
618 619 620
}

static void vlv_set_infoframes(struct drm_encoder *encoder,
621
			       bool enable,
622 623
			       struct drm_display_mode *adjusted_mode)
{
624
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
625
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
626 627 628 629
	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);
630
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
631

632 633
	assert_hdmi_port_disabled(intel_hdmi);

634 635 636
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

637
	if (!enable) {
638 639 640 641
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~VIDEO_DIP_ENABLE;
		I915_WRITE(reg, val);
642
		POSTING_READ(reg);
643 644 645
		return;
	}

646 647 648 649 650 651 652 653 654 655
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
		if (val & VIDEO_DIP_ENABLE) {
			val &= ~VIDEO_DIP_ENABLE;
			I915_WRITE(reg, val);
			POSTING_READ(reg);
		}
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

656
	val |= VIDEO_DIP_ENABLE;
657 658
	val &= ~(VIDEO_DIP_ENABLE_AVI | VIDEO_DIP_ENABLE_VENDOR |
		 VIDEO_DIP_ENABLE_GAMUT | VIDEO_DIP_ENABLE_GCP);
659 660

	I915_WRITE(reg, val);
661
	POSTING_READ(reg);
662

663 664
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
665
	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
666 667 668
}

static void hsw_set_infoframes(struct drm_encoder *encoder,
669
			       bool enable,
670 671
			       struct drm_display_mode *adjusted_mode)
{
672 673 674
	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);
675
	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
676
	u32 val = I915_READ(reg);
677

678 679
	assert_hdmi_port_disabled(intel_hdmi);

680
	if (!enable) {
681
		I915_WRITE(reg, 0);
682
		POSTING_READ(reg);
683 684 685
		return;
	}

686 687 688 689
	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);
690
	POSTING_READ(reg);
691

692 693
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
694
	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
695 696
}

697
static void intel_hdmi_prepare(struct intel_encoder *encoder)
698
{
699
	struct drm_device *dev = encoder->base.dev;
700
	struct drm_i915_private *dev_priv = dev->dev_private;
701 702 703
	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;
704
	u32 hdmi_val;
705

706
	hdmi_val = SDVO_ENCODING_HDMI;
707
	if (!HAS_PCH_SPLIT(dev))
708
		hdmi_val |= intel_hdmi->color_range;
709
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
710
		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
711
	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
712
		hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
713

714
	if (crtc->config.pipe_bpp > 24)
715
		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
716
	else
717
		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
718

719
	if (crtc->config.has_hdmi_sink)
720
		hdmi_val |= HDMI_MODE_SELECT_HDMI;
721

722
	if (HAS_PCH_CPT(dev))
723
		hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
724 725
	else if (IS_CHERRYVIEW(dev))
		hdmi_val |= SDVO_PIPE_SEL_CHV(crtc->pipe);
726
	else
727
		hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
728

729 730
	I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
	POSTING_READ(intel_hdmi->hdmi_reg);
731 732
}

733 734
static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
				    enum pipe *pipe)
735
{
736
	struct drm_device *dev = encoder->base.dev;
737
	struct drm_i915_private *dev_priv = dev->dev_private;
738
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
739
	enum intel_display_power_domain power_domain;
740 741
	u32 tmp;

742
	power_domain = intel_display_port_power_domain(encoder);
743
	if (!intel_display_power_is_enabled(dev_priv, power_domain))
744 745
		return false;

746
	tmp = I915_READ(intel_hdmi->hdmi_reg);
747 748 749 750 751 752

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

	if (HAS_PCH_CPT(dev))
		*pipe = PORT_TO_PIPE_CPT(tmp);
753 754
	else if (IS_CHERRYVIEW(dev))
		*pipe = SDVO_PORT_TO_PIPE_CHV(tmp);
755 756 757 758 759 760
	else
		*pipe = PORT_TO_PIPE(tmp);

	return true;
}

761 762 763 764
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);
765 766
	struct drm_device *dev = encoder->base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
767
	u32 tmp, flags = 0;
768
	int dotclock;
769 770 771 772 773 774 775 776 777 778 779 780 781

	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;

782 783 784
	if (tmp & HDMI_MODE_SELECT_HDMI)
		pipe_config->has_hdmi_sink = true;

785 786 787
	if (intel_hdmi->infoframe_enabled(&encoder->base))
		pipe_config->has_infoframe = true;

788
	if (tmp & SDVO_AUDIO_ENABLE)
789 790
		pipe_config->has_audio = true;

791 792 793 794
	if (!HAS_PCH_SPLIT(dev) &&
	    tmp & HDMI_COLOR_RANGE_16_235)
		pipe_config->limited_color_range = true;

795
	pipe_config->adjusted_mode.flags |= flags;
796 797 798 799 800 801 802 803 804

	if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc)
		dotclock = pipe_config->port_clock * 2 / 3;
	else
		dotclock = pipe_config->port_clock;

	if (HAS_PCH_SPLIT(dev_priv->dev))
		ironlake_check_encoder_dotclock(pipe_config, dotclock);

805
	pipe_config->adjusted_mode.crtc_clock = dotclock;
806 807
}

808
static void intel_enable_hdmi(struct intel_encoder *encoder)
809
{
810
	struct drm_device *dev = encoder->base.dev;
811
	struct drm_i915_private *dev_priv = dev->dev_private;
812
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
813
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
814
	u32 temp;
815 816
	u32 enable_bits = SDVO_ENABLE;

817
	if (intel_crtc->config.has_audio)
818
		enable_bits |= SDVO_AUDIO_ENABLE;
819

820
	temp = I915_READ(intel_hdmi->hdmi_reg);
821

822
	/* HW workaround for IBX, we need to move the port to transcoder A
823 824 825
	 * before disabling it, so restore the transcoder select bit here. */
	if (HAS_PCH_IBX(dev))
		enable_bits |= SDVO_PIPE_SEL(intel_crtc->pipe);
826

827 828 829
	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
	 * we do this anyway which shows more stable in testing.
	 */
830
	if (HAS_PCH_SPLIT(dev)) {
831 832
		I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
		POSTING_READ(intel_hdmi->hdmi_reg);
833 834
	}

835 836
	temp |= enable_bits;

837 838
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
839 840 841 842 843

	/* HW workaround, need to write this twice for issue that may result
	 * in first write getting masked.
	 */
	if (HAS_PCH_SPLIT(dev)) {
844 845
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
846
	}
847 848 849 850 851 852 853

	if (intel_crtc->config.has_audio) {
		WARN_ON(!intel_crtc->config.has_hdmi_sink);
		DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
				 pipe_name(intel_crtc->pipe));
		intel_audio_codec_enable(encoder);
	}
854
}
855

856 857
static void vlv_enable_hdmi(struct intel_encoder *encoder)
{
858 859 860 861 862 863 864
}

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);
865
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
866
	u32 temp;
867
	u32 enable_bits = SDVO_ENABLE | SDVO_AUDIO_ENABLE;
868

869 870 871
	if (crtc->config.has_audio)
		intel_audio_codec_disable(encoder);

872
	temp = I915_READ(intel_hdmi->hdmi_reg);
873 874 875 876 877 878 879 880 881

	/* 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;
882 883
			I915_WRITE(intel_hdmi->hdmi_reg, temp);
			POSTING_READ(intel_hdmi->hdmi_reg);
884 885

			/* Again we need to write this twice. */
886 887
			I915_WRITE(intel_hdmi->hdmi_reg, temp);
			POSTING_READ(intel_hdmi->hdmi_reg);
888 889 890 891 892 893 894 895

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

898 899 900 901
	/* 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)) {
902 903
		I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
		POSTING_READ(intel_hdmi->hdmi_reg);
904 905 906
	}

	temp &= ~enable_bits;
907

908 909
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
910 911 912 913

	/* HW workaround, need to write this twice for issue that may result
	 * in first write getting masked.
	 */
914
	if (HAS_PCH_SPLIT(dev)) {
915 916
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
917
	}
918 919
}

920
static int hdmi_portclock_limit(struct intel_hdmi *hdmi, bool respect_dvi_limit)
921 922 923
{
	struct drm_device *dev = intel_hdmi_to_dev(hdmi);

924
	if ((respect_dvi_limit && !hdmi->has_hdmi_sink) || IS_G4X(dev))
925
		return 165000;
926
	else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8)
927 928 929 930 931
		return 300000;
	else
		return 225000;
}

932 933 934
static enum drm_mode_status
intel_hdmi_mode_valid(struct drm_connector *connector,
		      struct drm_display_mode *mode)
935
{
936 937 938 939 940 941 942
	int clock = mode->clock;

	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
		clock *= 2;

	if (clock > hdmi_portclock_limit(intel_attached_hdmi(connector),
					 true))
943
		return MODE_CLOCK_HIGH;
944
	if (clock < 20000)
945
		return MODE_CLOCK_LOW;
946 947 948 949 950 951 952

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

	return MODE_OK;
}

953 954 955 956 957 958
static bool hdmi_12bpc_possible(struct intel_crtc *crtc)
{
	struct drm_device *dev = crtc->base.dev;
	struct intel_encoder *encoder;
	int count = 0, count_hdmi = 0;

959
	if (HAS_GMCH_DISPLAY(dev))
960 961
		return false;

962
	for_each_intel_encoder(dev, encoder) {
963 964 965 966 967 968 969 970 971 972 973 974 975 976
		if (encoder->new_crtc != crtc)
			continue;

		count_hdmi += encoder->type == INTEL_OUTPUT_HDMI;
		count++;
	}

	/*
	 * HDMI 12bpc affects the clocks, so it's only possible
	 * when not cloning with other encoder types.
	 */
	return count_hdmi > 0 && count_hdmi == count;
}

977 978
bool intel_hdmi_compute_config(struct intel_encoder *encoder,
			       struct intel_crtc_config *pipe_config)
979
{
980 981 982
	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;
983
	int clock_12bpc = pipe_config->adjusted_mode.crtc_clock * 3 / 2;
984
	int portclock_limit = hdmi_portclock_limit(intel_hdmi, false);
985
	int desired_bpp;
986

987 988
	pipe_config->has_hdmi_sink = intel_hdmi->has_hdmi_sink;

989 990 991
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

992 993
	if (intel_hdmi->color_range_auto) {
		/* See CEA-861-E - 5.1 Default Encoding Parameters */
994
		if (pipe_config->has_hdmi_sink &&
995
		    drm_match_cea_mode(adjusted_mode) > 1)
996
			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
997 998 999 1000
		else
			intel_hdmi->color_range = 0;
	}

1001 1002 1003 1004
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
		pipe_config->pixel_multiplier = 2;
	}

1005
	if (intel_hdmi->color_range)
1006
		pipe_config->limited_color_range = true;
1007

1008 1009 1010
	if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
		pipe_config->has_pch_encoder = true;

1011 1012 1013
	if (pipe_config->has_hdmi_sink && intel_hdmi->has_audio)
		pipe_config->has_audio = true;

1014 1015 1016
	/*
	 * 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
1017 1018
	 * outputs. We also need to check that the higher clock still fits
	 * within limits.
1019
	 */
1020
	if (pipe_config->pipe_bpp > 8*3 && pipe_config->has_hdmi_sink &&
1021 1022
	    clock_12bpc <= portclock_limit &&
	    hdmi_12bpc_possible(encoder->new_crtc)) {
1023 1024
		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
		desired_bpp = 12*3;
1025 1026

		/* Need to adjust the port link by 1.5x for 12bpc. */
1027
		pipe_config->port_clock = clock_12bpc;
1028
	} else {
1029 1030 1031 1032 1033 1034 1035
		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;
1036 1037
	}

1038
	if (adjusted_mode->crtc_clock > portclock_limit) {
1039 1040 1041 1042
		DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n");
		return false;
	}

1043 1044 1045
	return true;
}

1046 1047
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1048
{
1049
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1050

1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068
	intel_hdmi->has_hdmi_sink = false;
	intel_hdmi->has_audio = false;
	intel_hdmi->rgb_quant_range_selectable = false;

	kfree(to_intel_connector(connector)->detect_edid);
	to_intel_connector(connector)->detect_edid = NULL;
}

static bool
intel_hdmi_set_edid(struct drm_connector *connector)
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
	struct intel_encoder *intel_encoder =
		&hdmi_to_dig_port(intel_hdmi)->base;
	enum intel_display_power_domain power_domain;
	struct edid *edid;
	bool connected = false;
1069

1070 1071 1072
	power_domain = intel_display_port_power_domain(intel_encoder);
	intel_display_power_get(dev_priv, power_domain);

1073
	edid = drm_get_edid(connector,
1074 1075
			    intel_gmbus_get_adapter(dev_priv,
						    intel_hdmi->ddc_bus));
1076

1077
	intel_display_power_put(dev_priv, power_domain);
1078

1079 1080 1081 1082 1083 1084
	to_intel_connector(connector)->detect_edid = edid;
	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
		intel_hdmi->rgb_quant_range_selectable =
			drm_rgb_quant_range_selectable(edid);

		intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
1085 1086
		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
			intel_hdmi->has_audio =
1087 1088 1089 1090 1091 1092 1093
				intel_hdmi->force_audio == HDMI_AUDIO_ON;

		if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink =
				drm_detect_hdmi_monitor(edid);

		connected = true;
1094 1095
	}

1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
	return connected;
}

static enum drm_connector_status
intel_hdmi_detect(struct drm_connector *connector, bool force)
{
	enum drm_connector_status status;

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

	intel_hdmi_unset_edid(connector);

	if (intel_hdmi_set_edid(connector)) {
		struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);

		hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
		status = connector_status_connected;
	} else
		status = connector_status_disconnected;
1116

1117
	return status;
1118 1119
}

1120 1121
static void
intel_hdmi_force(struct drm_connector *connector)
1122
{
1123
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1124

1125 1126
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);
1127

1128
	intel_hdmi_unset_edid(connector);
1129

1130 1131
	if (connector->status != connector_status_connected)
		return;
1132

1133 1134 1135
	intel_hdmi_set_edid(connector);
	hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
}
1136

1137 1138 1139 1140 1141 1142 1143
static int intel_hdmi_get_modes(struct drm_connector *connector)
{
	struct edid *edid;

	edid = to_intel_connector(connector)->detect_edid;
	if (edid == NULL)
		return 0;
1144

1145
	return intel_connector_update_modes(connector, edid);
1146 1147
}

1148 1149 1150 1151
static bool
intel_hdmi_detect_audio(struct drm_connector *connector)
{
	bool has_audio = false;
1152
	struct edid *edid;
1153

1154 1155 1156
	edid = to_intel_connector(connector)->detect_edid;
	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL)
		has_audio = drm_detect_monitor_audio(edid);
1157

1158 1159 1160
	return has_audio;
}

1161 1162
static int
intel_hdmi_set_property(struct drm_connector *connector,
1163 1164
			struct drm_property *property,
			uint64_t val)
1165 1166
{
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1167 1168
	struct intel_digital_port *intel_dig_port =
		hdmi_to_dig_port(intel_hdmi);
1169
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
1170 1171
	int ret;

1172
	ret = drm_object_property_set_value(&connector->base, property, val);
1173 1174 1175
	if (ret)
		return ret;

1176
	if (property == dev_priv->force_audio_property) {
1177
		enum hdmi_force_audio i = val;
1178 1179 1180
		bool has_audio;

		if (i == intel_hdmi->force_audio)
1181 1182
			return 0;

1183
		intel_hdmi->force_audio = i;
1184

1185
		if (i == HDMI_AUDIO_AUTO)
1186 1187
			has_audio = intel_hdmi_detect_audio(connector);
		else
1188
			has_audio = (i == HDMI_AUDIO_ON);
1189

1190 1191
		if (i == HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink = 0;
1192

1193
		intel_hdmi->has_audio = has_audio;
1194 1195 1196
		goto done;
	}

1197
	if (property == dev_priv->broadcast_rgb_property) {
1198 1199 1200
		bool old_auto = intel_hdmi->color_range_auto;
		uint32_t old_range = intel_hdmi->color_range;

1201 1202 1203 1204 1205 1206 1207 1208 1209 1210
		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;
1211
			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
1212 1213 1214 1215
			break;
		default:
			return -EINVAL;
		}
1216 1217 1218 1219 1220

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

1221 1222 1223
		goto done;
	}

1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240
	if (property == connector->dev->mode_config.aspect_ratio_property) {
		switch (val) {
		case DRM_MODE_PICTURE_ASPECT_NONE:
			intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
			break;
		case DRM_MODE_PICTURE_ASPECT_4_3:
			intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_4_3;
			break;
		case DRM_MODE_PICTURE_ASPECT_16_9:
			intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_16_9;
			break;
		default:
			return -EINVAL;
		}
		goto done;
	}

1241 1242 1243
	return -EINVAL;

done:
1244 1245
	if (intel_dig_port->base.base.crtc)
		intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
1246 1247 1248 1249

	return 0;
}

1250 1251 1252 1253 1254 1255 1256
static void intel_hdmi_pre_enable(struct intel_encoder *encoder)
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
	struct drm_display_mode *adjusted_mode =
		&intel_crtc->config.adjusted_mode;

1257 1258
	intel_hdmi_prepare(encoder);

1259 1260 1261
	intel_hdmi->set_infoframes(&encoder->base,
				   intel_crtc->config.has_hdmi_sink,
				   adjusted_mode);
1262 1263
}

1264
static void vlv_hdmi_pre_enable(struct intel_encoder *encoder)
1265 1266
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1267
	struct intel_hdmi *intel_hdmi = &dport->hdmi;
1268 1269 1270 1271
	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);
1272 1273
	struct drm_display_mode *adjusted_mode =
		&intel_crtc->config.adjusted_mode;
1274
	enum dpio_channel port = vlv_dport_to_channel(dport);
1275 1276 1277 1278
	int pipe = intel_crtc->pipe;
	u32 val;

	/* Enable clock channels for this port */
1279
	mutex_lock(&dev_priv->dpio_lock);
1280
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port));
1281 1282 1283 1284 1285 1286
	val = 0;
	if (pipe)
		val |= (1<<21);
	else
		val &= ~(1<<21);
	val |= 0x001000c4;
1287
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW8(port), val);
1288 1289

	/* HDMI 1.0V-2dB */
1290 1291 1292 1293 1294 1295 1296 1297
	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0);
	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW4(port), 0x2b245f5f);
	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(port), 0x5578b83a);
	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW3(port), 0x0c782040);
	vlv_dpio_write(dev_priv, pipe, VLV_TX3_DW4(port), 0x2b247878);
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW11(port), 0x00030000);
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), 0x00002000);
	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), DPIO_TX_OCALINIT_EN);
1298 1299

	/* Program lane clock */
1300 1301
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018);
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888);
1302
	mutex_unlock(&dev_priv->dpio_lock);
1303

1304 1305 1306
	intel_hdmi->set_infoframes(&encoder->base,
				   intel_crtc->config.has_hdmi_sink,
				   adjusted_mode);
1307

1308 1309
	intel_enable_hdmi(encoder);

1310
	vlv_wait_port_ready(dev_priv, dport);
1311 1312
}

1313
static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder)
1314 1315 1316 1317
{
	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;
1318 1319
	struct intel_crtc *intel_crtc =
		to_intel_crtc(encoder->base.crtc);
1320
	enum dpio_channel port = vlv_dport_to_channel(dport);
1321
	int pipe = intel_crtc->pipe;
1322

1323 1324
	intel_hdmi_prepare(encoder);

1325
	/* Program Tx lane resets to default */
1326
	mutex_lock(&dev_priv->dpio_lock);
1327
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port),
1328 1329
			 DPIO_PCS_TX_LANE2_RESET |
			 DPIO_PCS_TX_LANE1_RESET);
1330
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port),
1331 1332 1333 1334 1335 1336
			 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 */
1337 1338 1339 1340 1341 1342
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW12(port), 0x00750f00);
	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW11(port), 0x00001500);
	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW14(port), 0x40400000);

	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), 0x00002000);
	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), DPIO_TX_OCALINIT_EN);
1343
	mutex_unlock(&dev_priv->dpio_lock);
1344 1345
}

1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356
static void chv_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;
	struct intel_crtc *intel_crtc =
		to_intel_crtc(encoder->base.crtc);
	enum dpio_channel ch = vlv_dport_to_channel(dport);
	enum pipe pipe = intel_crtc->pipe;
	u32 val;

1357 1358
	intel_hdmi_prepare(encoder);

1359 1360
	mutex_lock(&dev_priv->dpio_lock);

1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
	/* program left/right clock distribution */
	if (pipe != PIPE_B) {
		val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
		val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
		if (ch == DPIO_CH0)
			val |= CHV_BUFLEFTENA1_FORCE;
		if (ch == DPIO_CH1)
			val |= CHV_BUFRIGHTENA1_FORCE;
		vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
	} else {
		val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
		val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
		if (ch == DPIO_CH0)
			val |= CHV_BUFLEFTENA2_FORCE;
		if (ch == DPIO_CH1)
			val |= CHV_BUFRIGHTENA2_FORCE;
		vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
	}

1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411
	/* program clock channel usage */
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(ch));
	val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
	if (pipe != PIPE_B)
		val &= ~CHV_PCS_USEDCLKCHANNEL;
	else
		val |= CHV_PCS_USEDCLKCHANNEL;
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val);

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch));
	val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
	if (pipe != PIPE_B)
		val &= ~CHV_PCS_USEDCLKCHANNEL;
	else
		val |= CHV_PCS_USEDCLKCHANNEL;
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW8(ch), val);

	/*
	 * This a a bit weird since generally CL
	 * matches the pipe, but here we need to
	 * pick the CL based on the port.
	 */
	val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW19(ch));
	if (pipe != PIPE_B)
		val &= ~CHV_CMN_USEDCLKCHANNEL;
	else
		val |= CHV_CMN_USEDCLKCHANNEL;
	vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val);

	mutex_unlock(&dev_priv->dpio_lock);
}

1412
static void vlv_hdmi_post_disable(struct intel_encoder *encoder)
1413 1414 1415
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1416 1417
	struct intel_crtc *intel_crtc =
		to_intel_crtc(encoder->base.crtc);
1418
	enum dpio_channel port = vlv_dport_to_channel(dport);
1419
	int pipe = intel_crtc->pipe;
1420 1421 1422

	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
	mutex_lock(&dev_priv->dpio_lock);
1423 1424
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 0x00000000);
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port), 0x00e00060);
1425 1426 1427
	mutex_unlock(&dev_priv->dpio_lock);
}

1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441
static void chv_hdmi_post_disable(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);
	enum dpio_channel ch = vlv_dport_to_channel(dport);
	enum pipe pipe = intel_crtc->pipe;
	u32 val;

	mutex_lock(&dev_priv->dpio_lock);

	/* Propagate soft reset to data lane reset */
1442
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
1443
	val |= CHV_PCS_REQ_SOFTRESET_EN;
1444
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
1445

1446 1447 1448 1449 1450 1451 1452 1453 1454
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
	val |= CHV_PCS_REQ_SOFTRESET_EN;
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val);

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
	val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
1455
	val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
1456
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
1457 1458 1459 1460

	mutex_unlock(&dev_priv->dpio_lock);
}

1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473
static void chv_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);
	enum dpio_channel ch = vlv_dport_to_channel(dport);
	int pipe = intel_crtc->pipe;
	int data, i;
	u32 val;

	mutex_lock(&dev_priv->dpio_lock);
1474

1475 1476 1477 1478 1479 1480 1481 1482 1483
	/* allow hardware to manage TX FIFO reset source */
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
	val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
	val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);

1484
	/* Deassert soft data lane reset*/
1485
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
1486
	val |= CHV_PCS_REQ_SOFTRESET_EN;
1487 1488 1489 1490 1491 1492 1493 1494 1495
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
	val |= CHV_PCS_REQ_SOFTRESET_EN;
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val);

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
	val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
1496

1497
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
1498
	val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
1499
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
1500 1501

	/* Program Tx latency optimal setting */
1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517
	for (i = 0; i < 4; i++) {
		/* Set the latency optimal bit */
		data = (i == 1) ? 0x0 : 0x6;
		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW11(ch, i),
				data << DPIO_FRC_LATENCY_SHFIT);

		/* Set the upar bit */
		data = (i == 1) ? 0x0 : 0x1;
		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i),
				data << DPIO_UPAR_SHIFT);
	}

	/* Data lane stagger programming */
	/* FIXME: Fix up value only after power analysis */

	/* Clear calc init */
1518 1519
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
	val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
1520 1521
	val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
	val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
1522 1523 1524 1525
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
	val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
1526 1527
	val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
	val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
1528
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
1529

1530 1531 1532 1533 1534 1535 1536 1537 1538 1539
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch));
	val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
	val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val);

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch));
	val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
	val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val);

1540 1541
	/* FIXME: Program the support xxx V-dB */
	/* Use 800mV-0dB */
1542 1543 1544 1545 1546 1547
	for (i = 0; i < 4; i++) {
		val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW4(ch, i));
		val &= ~DPIO_SWING_DEEMPH9P5_MASK;
		val |= 128 << DPIO_SWING_DEEMPH9P5_SHIFT;
		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW4(ch, i), val);
	}
1548

1549 1550
	for (i = 0; i < 4; i++) {
		val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
1551 1552
		val &= ~DPIO_SWING_MARGIN000_MASK;
		val |= 102 << DPIO_SWING_MARGIN000_SHIFT;
1553 1554
		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
	}
1555 1556

	/* Disable unique transition scale */
1557 1558 1559 1560 1561
	for (i = 0; i < 4; i++) {
		val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW3(ch, i));
		val &= ~DPIO_TX_UNIQ_TRANS_SCALE_EN;
		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW3(ch, i), val);
	}
1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576

	/* Additional steps for 1200mV-0dB */
#if 0
	val = vlv_dpio_read(dev_priv, pipe, VLV_TX_DW3(ch));
	if (ch)
		val |= DPIO_TX_UNIQ_TRANS_SCALE_CH1;
	else
		val |= DPIO_TX_UNIQ_TRANS_SCALE_CH0;
	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW3(ch), val);

	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(ch),
			vlv_dpio_read(dev_priv, pipe, VLV_TX_DW2(ch)) |
				(0x9a << DPIO_UNIQ_TRANS_SCALE_SHIFT));
#endif
	/* Start swing calculation */
1577 1578 1579 1580 1581 1582 1583
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
	val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
	val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596

	/* LRC Bypass */
	val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW30);
	val |= DPIO_LRC_BYPASS;
	vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW30, val);

	mutex_unlock(&dev_priv->dpio_lock);

	intel_enable_hdmi(encoder);

	vlv_wait_port_ready(dev_priv, dport);
}

1597 1598
static void intel_hdmi_destroy(struct drm_connector *connector)
{
1599
	kfree(to_intel_connector(connector)->detect_edid);
1600
	drm_connector_cleanup(connector);
1601
	kfree(connector);
1602 1603 1604
}

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1605
	.dpms = intel_connector_dpms,
1606
	.detect = intel_hdmi_detect,
1607
	.force = intel_hdmi_force,
1608
	.fill_modes = drm_helper_probe_single_connector_modes,
1609
	.set_property = intel_hdmi_set_property,
1610 1611 1612 1613 1614 1615
	.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,
1616
	.best_encoder = intel_best_encoder,
1617 1618 1619
};

static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
C
Chris Wilson 已提交
1620
	.destroy = intel_encoder_destroy,
1621 1622
};

1623 1624 1625 1626 1627 1628 1629 1630 1631
static void
intel_attach_aspect_ratio_property(struct drm_connector *connector)
{
	if (!drm_mode_create_aspect_ratio_property(connector->dev))
		drm_object_attach_property(&connector->base,
			connector->dev->mode_config.aspect_ratio_property,
			DRM_MODE_PICTURE_ASPECT_NONE);
}

1632 1633 1634
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1635
	intel_attach_force_audio_property(connector);
1636
	intel_attach_broadcast_rgb_property(connector);
1637
	intel_hdmi->color_range_auto = true;
1638 1639
	intel_attach_aspect_ratio_property(connector);
	intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1640 1641
}

P
Paulo Zanoni 已提交
1642 1643
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
			       struct intel_connector *intel_connector)
1644
{
1645 1646 1647 1648
	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;
1649
	struct drm_i915_private *dev_priv = dev->dev_private;
1650
	enum port port = intel_dig_port->port;
1651

1652
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1653
			   DRM_MODE_CONNECTOR_HDMIA);
1654 1655
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

1656
	connector->interlace_allowed = 1;
1657
	connector->doublescan_allowed = 0;
1658
	connector->stereo_allowed = 1;
1659

1660 1661
	switch (port) {
	case PORT_B:
1662
		intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
1663
		intel_encoder->hpd_pin = HPD_PORT_B;
1664 1665
		break;
	case PORT_C:
1666
		intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
1667
		intel_encoder->hpd_pin = HPD_PORT_C;
1668 1669
		break;
	case PORT_D:
1670 1671 1672 1673
		if (IS_CHERRYVIEW(dev))
			intel_hdmi->ddc_bus = GMBUS_PORT_DPD_CHV;
		else
			intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
1674
		intel_encoder->hpd_pin = HPD_PORT_D;
1675 1676
		break;
	case PORT_A:
1677
		intel_encoder->hpd_pin = HPD_PORT_A;
1678 1679
		/* Internal port only for eDP. */
	default:
1680
		BUG();
1681
	}
1682

1683
	if (IS_VALLEYVIEW(dev)) {
1684
		intel_hdmi->write_infoframe = vlv_write_infoframe;
1685
		intel_hdmi->set_infoframes = vlv_set_infoframes;
1686
		intel_hdmi->infoframe_enabled = vlv_infoframe_enabled;
1687
	} else if (IS_G4X(dev)) {
1688 1689
		intel_hdmi->write_infoframe = g4x_write_infoframe;
		intel_hdmi->set_infoframes = g4x_set_infoframes;
1690
		intel_hdmi->infoframe_enabled = g4x_infoframe_enabled;
1691
	} else if (HAS_DDI(dev)) {
1692
		intel_hdmi->write_infoframe = hsw_write_infoframe;
1693
		intel_hdmi->set_infoframes = hsw_set_infoframes;
1694
		intel_hdmi->infoframe_enabled = hsw_infoframe_enabled;
1695 1696
	} else if (HAS_PCH_IBX(dev)) {
		intel_hdmi->write_infoframe = ibx_write_infoframe;
1697
		intel_hdmi->set_infoframes = ibx_set_infoframes;
1698
		intel_hdmi->infoframe_enabled = ibx_infoframe_enabled;
1699 1700
	} else {
		intel_hdmi->write_infoframe = cpt_write_infoframe;
1701
		intel_hdmi->set_infoframes = cpt_set_infoframes;
1702
		intel_hdmi->infoframe_enabled = cpt_infoframe_enabled;
1703
	}
1704

P
Paulo Zanoni 已提交
1705
	if (HAS_DDI(dev))
1706 1707 1708
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
1709
	intel_connector->unregister = intel_connector_unregister;
1710 1711 1712 1713

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
1714
	drm_connector_register(connector);
1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725

	/* 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);
	}
}

1726
void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
1727 1728 1729 1730 1731
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

1732
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
1733 1734 1735
	if (!intel_dig_port)
		return;

1736
	intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
1737 1738 1739 1740 1741 1742 1743 1744 1745
	if (!intel_connector) {
		kfree(intel_dig_port);
		return;
	}

	intel_encoder = &intel_dig_port->base;

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

1747
	intel_encoder->compute_config = intel_hdmi_compute_config;
P
Paulo Zanoni 已提交
1748 1749
	intel_encoder->disable = intel_disable_hdmi;
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
1750
	intel_encoder->get_config = intel_hdmi_get_config;
1751
	if (IS_CHERRYVIEW(dev)) {
1752
		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
1753 1754
		intel_encoder->pre_enable = chv_hdmi_pre_enable;
		intel_encoder->enable = vlv_enable_hdmi;
1755
		intel_encoder->post_disable = chv_hdmi_post_disable;
1756
	} else if (IS_VALLEYVIEW(dev)) {
1757 1758
		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
1759
		intel_encoder->enable = vlv_enable_hdmi;
1760
		intel_encoder->post_disable = vlv_hdmi_post_disable;
1761
	} else {
1762
		intel_encoder->pre_enable = intel_hdmi_pre_enable;
1763
		intel_encoder->enable = intel_enable_hdmi;
1764
	}
1765

1766
	intel_encoder->type = INTEL_OUTPUT_HDMI;
1767 1768 1769 1770 1771 1772 1773 1774
	if (IS_CHERRYVIEW(dev)) {
		if (port == PORT_D)
			intel_encoder->crtc_mask = 1 << 2;
		else
			intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
	} else {
		intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
	}
1775
	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
1776 1777 1778 1779 1780 1781 1782
	/*
	 * BSpec is unclear about HDMI+HDMI cloning on g4x, but it seems
	 * to work on real hardware. And since g4x can send infoframes to
	 * only one port anyway, nothing is lost by allowing it.
	 */
	if (IS_G4X(dev))
		intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
1783

1784
	intel_dig_port->port = port;
1785
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
1786
	intel_dig_port->dp.output_reg = 0;
1787

1788
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
1789
}