intel_hdmi.c 63.6 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
#include <drm/drmP.h>
34
#include <drm/drm_atomic_helper.h>
35 36
#include <drm/drm_crtc.h>
#include <drm/drm_edid.h>
37
#include "intel_drv.h"
38
#include <drm/i915_drm.h>
39 40
#include "i915_drv.h"

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

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

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

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

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

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

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

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

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

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

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

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

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

148
	val &= ~g4x_infoframe_enable(type);
149

150
	I915_WRITE(VIDEO_DIP_CTL, val);
151

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

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

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

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

177 178
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;
179

180 181 182 183 184
	if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->port))
		return false;

	return val & (VIDEO_DIP_ENABLE_AVI |
		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
185 186
}

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

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

200
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
201
	val |= g4x_infoframe_index(type);
202

203
	val &= ~g4x_infoframe_enable(type);
204 205 206

	I915_WRITE(reg, val);

207
	mmiowb();
208 209 210 211
	for (i = 0; i < len; i += 4) {
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
212 213 214
	/* 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);
215
	mmiowb();
216

217
	val |= g4x_infoframe_enable(type);
218
	val &= ~VIDEO_DIP_FREQ_MASK;
219
	val |= VIDEO_DIP_FREQ_VSYNC;
220 221

	I915_WRITE(reg, val);
222
	POSTING_READ(reg);
223 224
}

225 226 227 228 229
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);
230
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
231 232 233
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

234 235 236 237 238
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;

	if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->port))
		return false;
239

240 241 242
	return val & (VIDEO_DIP_ENABLE_AVI |
		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
243 244
}

245
static void cpt_write_infoframe(struct drm_encoder *encoder,
246
				enum hdmi_infoframe_type type,
247
				const void *frame, ssize_t len)
248
{
249
	const uint32_t *data = frame;
250 251
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
252
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
253
	int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
254
	u32 val = I915_READ(reg);
255

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

258
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
259
	val |= g4x_infoframe_index(type);
260

261 262
	/* The DIP control register spec says that we need to update the AVI
	 * infoframe without clearing its enable bit */
263 264
	if (type != HDMI_INFOFRAME_TYPE_AVI)
		val &= ~g4x_infoframe_enable(type);
265

266
	I915_WRITE(reg, val);
267

268
	mmiowb();
269
	for (i = 0; i < len; i += 4) {
270 271 272
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
273 274 275
	/* 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);
276
	mmiowb();
277

278
	val |= g4x_infoframe_enable(type);
279
	val &= ~VIDEO_DIP_FREQ_MASK;
280
	val |= VIDEO_DIP_FREQ_VSYNC;
281

282
	I915_WRITE(reg, val);
283
	POSTING_READ(reg);
284
}
285

286 287 288 289 290 291 292 293
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);

294 295 296 297 298 299
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;

	return val & (VIDEO_DIP_ENABLE_AVI |
		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
300 301
}

302
static void vlv_write_infoframe(struct drm_encoder *encoder,
303
				enum hdmi_infoframe_type type,
304
				const void *frame, ssize_t len)
305
{
306
	const uint32_t *data = frame;
307 308
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
309
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
310
	int i, reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
311
	u32 val = I915_READ(reg);
312

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

315
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
316
	val |= g4x_infoframe_index(type);
317

318
	val &= ~g4x_infoframe_enable(type);
319

320
	I915_WRITE(reg, val);
321

322
	mmiowb();
323 324 325 326
	for (i = 0; i < len; i += 4) {
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
327 328 329
	/* 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);
330
	mmiowb();
331

332
	val |= g4x_infoframe_enable(type);
333
	val &= ~VIDEO_DIP_FREQ_MASK;
334
	val |= VIDEO_DIP_FREQ_VSYNC;
335

336
	I915_WRITE(reg, val);
337
	POSTING_READ(reg);
338 339
}

340 341 342 343 344
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);
345
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
346 347 348
	int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

349 350 351 352 353
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;

	if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->port))
		return false;
354

355 356 357
	return val & (VIDEO_DIP_ENABLE_AVI |
		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
358 359
}

360
static void hsw_write_infoframe(struct drm_encoder *encoder,
361
				enum hdmi_infoframe_type type,
362
				const void *frame, ssize_t len)
363
{
364
	const uint32_t *data = frame;
365 366 367
	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);
368
	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
369 370
	u32 data_reg;
	int i;
371
	u32 val = I915_READ(ctl_reg);
372

373
	data_reg = hsw_infoframe_data_reg(type,
374
					  intel_crtc->config->cpu_transcoder,
375
					  dev_priv);
376 377 378
	if (data_reg == 0)
		return;

379
	val &= ~hsw_infoframe_enable(type);
380 381
	I915_WRITE(ctl_reg, val);

382
	mmiowb();
383 384 385 386
	for (i = 0; i < len; i += 4) {
		I915_WRITE(data_reg + i, *data);
		data++;
	}
387 388 389
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(data_reg + i, 0);
390
	mmiowb();
391

392
	val |= hsw_infoframe_enable(type);
393
	I915_WRITE(ctl_reg, val);
394
	POSTING_READ(ctl_reg);
395 396
}

397 398 399 400 401
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);
402
	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
403 404
	u32 val = I915_READ(ctl_reg);

405 406 407
	return val & (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
		      VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
		      VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);
408 409
}

410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
/*
 * 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.
 */
427 428
static void intel_write_infoframe(struct drm_encoder *encoder,
				  union hdmi_infoframe *frame)
429 430
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
431 432
	uint8_t buffer[VIDEO_DIP_DATA_SIZE];
	ssize_t len;
433

434 435 436 437 438 439 440 441 442 443 444
	/* 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++;
445

446
	intel_hdmi->write_infoframe(encoder, frame->any.type, buffer, len);
447 448
}

449
static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
P
Paulo Zanoni 已提交
450
					 struct drm_display_mode *adjusted_mode)
451
{
452
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
453
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
454 455
	union hdmi_infoframe frame;
	int ret;
456

457 458 459
	/* Set user selected PAR to incoming mode's member */
	adjusted_mode->picture_aspect_ratio = intel_hdmi->aspect_ratio;

460 461 462 463 464 465
	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 已提交
466

467
	if (intel_hdmi->rgb_quant_range_selectable) {
468
		if (intel_crtc->config->limited_color_range)
469 470
			frame.avi.quantization_range =
				HDMI_QUANTIZATION_RANGE_LIMITED;
471
		else
472 473
			frame.avi.quantization_range =
				HDMI_QUANTIZATION_RANGE_FULL;
474 475
	}

476
	intel_write_infoframe(encoder, &frame);
477 478
}

479
static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
480
{
481 482 483 484 485 486 487 488
	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;
	}
489

490
	frame.spd.sdi = HDMI_SPD_SDI_PC;
491

492
	intel_write_infoframe(encoder, &frame);
493 494
}

495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
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);
}

510
static void g4x_set_infoframes(struct drm_encoder *encoder,
511
			       bool enable,
512 513
			       struct drm_display_mode *adjusted_mode)
{
514
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
515 516
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
517 518
	u32 reg = VIDEO_DIP_CTL;
	u32 val = I915_READ(reg);
519
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
520

521 522
	assert_hdmi_port_disabled(intel_hdmi);

523 524 525 526 527 528 529 530 531 532 533
	/* 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;

534
	if (!enable) {
535 536
		if (!(val & VIDEO_DIP_ENABLE))
			return;
537 538 539 540 541 542 543
		if (port != (val & VIDEO_DIP_PORT_MASK)) {
			DRM_DEBUG_KMS("video DIP still enabled on port %c\n",
				      (val & VIDEO_DIP_PORT_MASK) >> 29);
			return;
		}
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
544
		I915_WRITE(reg, val);
545
		POSTING_READ(reg);
546 547 548
		return;
	}

549 550
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
		if (val & VIDEO_DIP_ENABLE) {
551 552 553
			DRM_DEBUG_KMS("video DIP already enabled on port %c\n",
				      (val & VIDEO_DIP_PORT_MASK) >> 29);
			return;
554 555 556 557 558
		}
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

559
	val |= VIDEO_DIP_ENABLE;
560 561
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
562

563
	I915_WRITE(reg, val);
564
	POSTING_READ(reg);
565

566 567
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
568
	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
569 570
}

571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589
static bool hdmi_sink_is_deep_color(struct drm_encoder *encoder)
{
	struct drm_device *dev = encoder->dev;
	struct drm_connector *connector;

	WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));

	/*
	 * HDMI cloning is only supported on g4x which doesn't
	 * support deep color or GCP infoframes anyway so no
	 * need to worry about multiple HDMI sinks here.
	 */
	list_for_each_entry(connector, &dev->mode_config.connector_list, head)
		if (connector->encoder == encoder)
			return connector->display_info.bpc > 8;

	return false;
}

590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632
/*
 * Determine if default_phase=1 can be indicated in the GCP infoframe.
 *
 * From HDMI specification 1.4a:
 * - The first pixel of each Video Data Period shall always have a pixel packing phase of 0
 * - The first pixel following each Video Data Period shall have a pixel packing phase of 0
 * - The PP bits shall be constant for all GCPs and will be equal to the last packing phase
 * - The first pixel following every transition of HSYNC or VSYNC shall have a pixel packing
 *   phase of 0
 */
static bool gcp_default_phase_possible(int pipe_bpp,
				       const struct drm_display_mode *mode)
{
	unsigned int pixels_per_group;

	switch (pipe_bpp) {
	case 30:
		/* 4 pixels in 5 clocks */
		pixels_per_group = 4;
		break;
	case 36:
		/* 2 pixels in 3 clocks */
		pixels_per_group = 2;
		break;
	case 48:
		/* 1 pixel in 2 clocks */
		pixels_per_group = 1;
		break;
	default:
		/* phase information not relevant for 8bpc */
		return false;
	}

	return mode->crtc_hdisplay % pixels_per_group == 0 &&
		mode->crtc_htotal % pixels_per_group == 0 &&
		mode->crtc_hblank_start % pixels_per_group == 0 &&
		mode->crtc_hblank_end % pixels_per_group == 0 &&
		mode->crtc_hsync_start % pixels_per_group == 0 &&
		mode->crtc_hsync_end % pixels_per_group == 0 &&
		((mode->flags & DRM_MODE_FLAG_INTERLACE) == 0 ||
		 mode->crtc_htotal/2 % pixels_per_group == 0);
}

633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
static bool intel_hdmi_set_gcp_infoframe(struct drm_encoder *encoder)
{
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
	u32 reg, val = 0;

	if (HAS_DDI(dev_priv))
		reg = HSW_TVIDEO_DIP_GCP(crtc->config->cpu_transcoder);
	else if (IS_VALLEYVIEW(dev_priv))
		reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
	else if (HAS_PCH_SPLIT(dev_priv->dev))
		reg = TVIDEO_DIP_GCP(crtc->pipe);
	else
		return false;

	/* Indicate color depth whenever the sink supports deep color */
	if (hdmi_sink_is_deep_color(encoder))
		val |= GCP_COLOR_INDICATION;

652 653 654 655 656
	/* Enable default_phase whenever the display mode is suitably aligned */
	if (gcp_default_phase_possible(crtc->config->pipe_bpp,
				       &crtc->config->base.adjusted_mode))
		val |= GCP_DEFAULT_PHASE_ENABLE;

657 658 659 660 661
	I915_WRITE(reg, val);

	return val != 0;
}

662
static void ibx_set_infoframes(struct drm_encoder *encoder,
663
			       bool enable,
664 665
			       struct drm_display_mode *adjusted_mode)
{
666 667
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
668 669
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
670 671
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);
672
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
673

674 675
	assert_hdmi_port_disabled(intel_hdmi);

676 677 678
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

679
	if (!enable) {
680 681
		if (!(val & VIDEO_DIP_ENABLE))
			return;
682 683 684
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
			 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
685
		I915_WRITE(reg, val);
686
		POSTING_READ(reg);
687 688 689
		return;
	}

690
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
691 692 693
		WARN(val & VIDEO_DIP_ENABLE,
		     "DIP already enabled on port %c\n",
		     (val & VIDEO_DIP_PORT_MASK) >> 29);
694 695 696 697
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

698
	val |= VIDEO_DIP_ENABLE;
699 700 701
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
702

703 704 705
	if (intel_hdmi_set_gcp_infoframe(encoder))
		val |= VIDEO_DIP_ENABLE_GCP;

706
	I915_WRITE(reg, val);
707
	POSTING_READ(reg);
708

709 710
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
711
	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
712 713 714
}

static void cpt_set_infoframes(struct drm_encoder *encoder,
715
			       bool enable,
716 717
			       struct drm_display_mode *adjusted_mode)
{
718 719 720 721 722 723
	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);

724 725
	assert_hdmi_port_disabled(intel_hdmi);

726 727 728
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

729
	if (!enable) {
730 731
		if (!(val & VIDEO_DIP_ENABLE))
			return;
732 733 734
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
			 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
735
		I915_WRITE(reg, val);
736
		POSTING_READ(reg);
737 738 739
		return;
	}

740 741
	/* Set both together, unset both together: see the spec. */
	val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
742
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
743
		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
744

745 746 747
	if (intel_hdmi_set_gcp_infoframe(encoder))
		val |= VIDEO_DIP_ENABLE_GCP;

748
	I915_WRITE(reg, val);
749
	POSTING_READ(reg);
750

751 752
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
753
	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
754 755 756
}

static void vlv_set_infoframes(struct drm_encoder *encoder,
757
			       bool enable,
758 759
			       struct drm_display_mode *adjusted_mode)
{
760
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
761
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
762 763 764 765
	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);
766
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
767

768 769
	assert_hdmi_port_disabled(intel_hdmi);

770 771 772
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

773
	if (!enable) {
774 775
		if (!(val & VIDEO_DIP_ENABLE))
			return;
776 777 778
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
			 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
779
		I915_WRITE(reg, val);
780
		POSTING_READ(reg);
781 782 783
		return;
	}

784
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
785 786 787
		WARN(val & VIDEO_DIP_ENABLE,
		     "DIP already enabled on port %c\n",
		     (val & VIDEO_DIP_PORT_MASK) >> 29);
788 789 790 791
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

792
	val |= VIDEO_DIP_ENABLE;
793 794 795
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
796

797 798 799
	if (intel_hdmi_set_gcp_infoframe(encoder))
		val |= VIDEO_DIP_ENABLE_GCP;

800
	I915_WRITE(reg, val);
801
	POSTING_READ(reg);
802

803 804
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
805
	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
806 807 808
}

static void hsw_set_infoframes(struct drm_encoder *encoder,
809
			       bool enable,
810 811
			       struct drm_display_mode *adjusted_mode)
{
812 813 814
	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);
815
	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
816
	u32 val = I915_READ(reg);
817

818 819
	assert_hdmi_port_disabled(intel_hdmi);

820 821 822 823
	val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
		 VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
		 VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);

824
	if (!enable) {
825
		I915_WRITE(reg, val);
826
		POSTING_READ(reg);
827 828 829
		return;
	}

830 831 832
	if (intel_hdmi_set_gcp_infoframe(encoder))
		val |= VIDEO_DIP_ENABLE_GCP_HSW;

833
	I915_WRITE(reg, val);
834
	POSTING_READ(reg);
835

836 837
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
838
	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
839 840
}

841
static void intel_hdmi_prepare(struct intel_encoder *encoder)
842
{
843
	struct drm_device *dev = encoder->base.dev;
844
	struct drm_i915_private *dev_priv = dev->dev_private;
845 846
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
847
	struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
848
	u32 hdmi_val;
849

850
	hdmi_val = SDVO_ENCODING_HDMI;
851 852
	if (!HAS_PCH_SPLIT(dev) && crtc->config->limited_color_range)
		hdmi_val |= HDMI_COLOR_RANGE_16_235;
853
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
854
		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
855
	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
856
		hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
857

858
	if (crtc->config->pipe_bpp > 24)
859
		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
860
	else
861
		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
862

863
	if (crtc->config->has_hdmi_sink)
864
		hdmi_val |= HDMI_MODE_SELECT_HDMI;
865

866
	if (HAS_PCH_CPT(dev))
867
		hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
868 869
	else if (IS_CHERRYVIEW(dev))
		hdmi_val |= SDVO_PIPE_SEL_CHV(crtc->pipe);
870
	else
871
		hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
872

873 874
	I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
	POSTING_READ(intel_hdmi->hdmi_reg);
875 876
}

877 878
static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
				    enum pipe *pipe)
879
{
880
	struct drm_device *dev = encoder->base.dev;
881
	struct drm_i915_private *dev_priv = dev->dev_private;
882
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
883
	enum intel_display_power_domain power_domain;
884 885
	u32 tmp;

886
	power_domain = intel_display_port_power_domain(encoder);
887
	if (!intel_display_power_is_enabled(dev_priv, power_domain))
888 889
		return false;

890
	tmp = I915_READ(intel_hdmi->hdmi_reg);
891 892 893 894 895 896

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

	if (HAS_PCH_CPT(dev))
		*pipe = PORT_TO_PIPE_CPT(tmp);
897 898
	else if (IS_CHERRYVIEW(dev))
		*pipe = SDVO_PORT_TO_PIPE_CHV(tmp);
899 900 901 902 903 904
	else
		*pipe = PORT_TO_PIPE(tmp);

	return true;
}

905
static void intel_hdmi_get_config(struct intel_encoder *encoder,
906
				  struct intel_crtc_state *pipe_config)
907 908
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
909 910
	struct drm_device *dev = encoder->base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
911
	u32 tmp, flags = 0;
912
	int dotclock;
913 914 915 916 917 918 919 920 921 922 923 924 925

	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;

926 927 928
	if (tmp & HDMI_MODE_SELECT_HDMI)
		pipe_config->has_hdmi_sink = true;

929 930 931
	if (intel_hdmi->infoframe_enabled(&encoder->base))
		pipe_config->has_infoframe = true;

932
	if (tmp & SDVO_AUDIO_ENABLE)
933 934
		pipe_config->has_audio = true;

935 936 937 938
	if (!HAS_PCH_SPLIT(dev) &&
	    tmp & HDMI_COLOR_RANGE_16_235)
		pipe_config->limited_color_range = true;

939
	pipe_config->base.adjusted_mode.flags |= flags;
940 941 942 943 944 945

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

946 947 948
	if (pipe_config->pixel_multiplier)
		dotclock /= pipe_config->pixel_multiplier;

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

952
	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
953 954
}

955 956 957 958 959 960 961 962 963 964
static void intel_enable_hdmi_audio(struct intel_encoder *encoder)
{
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);

	WARN_ON(!crtc->config->has_hdmi_sink);
	DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
			 pipe_name(crtc->pipe));
	intel_audio_codec_enable(encoder);
}

965
static void g4x_enable_hdmi(struct intel_encoder *encoder)
966
{
967
	struct drm_device *dev = encoder->base.dev;
968
	struct drm_i915_private *dev_priv = dev->dev_private;
969
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
970
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
971 972
	u32 temp;

973
	temp = I915_READ(intel_hdmi->hdmi_reg);
974

975 976 977
	temp |= SDVO_ENABLE;
	if (crtc->config->has_audio)
		temp |= SDVO_AUDIO_ENABLE;
978

979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);

	if (crtc->config->has_audio)
		intel_enable_hdmi_audio(encoder);
}

static void ibx_enable_hdmi(struct intel_encoder *encoder)
{
	struct drm_device *dev = encoder->base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	u32 temp;

	temp = I915_READ(intel_hdmi->hdmi_reg);
995

996 997 998
	temp |= SDVO_ENABLE;
	if (crtc->config->has_audio)
		temp |= SDVO_AUDIO_ENABLE;
999

1000 1001 1002 1003 1004 1005
	/*
	 * HW workaround, need to write this twice for issue
	 * that may result in first write getting masked.
	 */
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
1006 1007
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
1008

1009 1010 1011 1012 1013 1014
	/*
	 * HW workaround, need to toggle enable bit off and on
	 * for 12bpc with pixel repeat.
	 *
	 * FIXME: BSpec says this should be done at the end of
	 * of the modeset sequence, so not sure if this isn't too soon.
1015
	 */
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026
	if (crtc->config->pipe_bpp > 24 &&
	    crtc->config->pixel_multiplier > 1) {
		I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
		POSTING_READ(intel_hdmi->hdmi_reg);

		/*
		 * HW workaround, need to write this twice for issue
		 * that may result in first write getting masked.
		 */
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
1027 1028
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
1029
	}
1030

1031
	if (crtc->config->has_audio)
1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
		intel_enable_hdmi_audio(encoder);
}

static void cpt_enable_hdmi(struct intel_encoder *encoder)
{
	struct drm_device *dev = encoder->base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	enum pipe pipe = crtc->pipe;
	u32 temp;

	temp = I915_READ(intel_hdmi->hdmi_reg);

	temp |= SDVO_ENABLE;
	if (crtc->config->has_audio)
		temp |= SDVO_AUDIO_ENABLE;

	/*
	 * WaEnableHDMI8bpcBefore12bpc:snb,ivb
	 *
	 * The procedure for 12bpc is as follows:
	 * 1. disable HDMI clock gating
	 * 2. enable HDMI with 8bpc
	 * 3. enable HDMI with 12bpc
	 * 4. enable HDMI clock gating
	 */

	if (crtc->config->pipe_bpp > 24) {
		I915_WRITE(TRANS_CHICKEN1(pipe),
			   I915_READ(TRANS_CHICKEN1(pipe)) |
			   TRANS_CHICKEN1_HDMIUNIT_GC_DISABLE);

		temp &= ~SDVO_COLOR_FORMAT_MASK;
		temp |= SDVO_COLOR_FORMAT_8bpc;
1067
	}
1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085

	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);

	if (crtc->config->pipe_bpp > 24) {
		temp &= ~SDVO_COLOR_FORMAT_MASK;
		temp |= HDMI_COLOR_FORMAT_12bpc;

		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);

		I915_WRITE(TRANS_CHICKEN1(pipe),
			   I915_READ(TRANS_CHICKEN1(pipe)) &
			   ~TRANS_CHICKEN1_HDMIUNIT_GC_DISABLE);
	}

	if (crtc->config->has_audio)
		intel_enable_hdmi_audio(encoder);
1086
}
1087

1088 1089
static void vlv_enable_hdmi(struct intel_encoder *encoder)
{
1090 1091 1092 1093 1094 1095 1096
}

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);
1097
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
1098 1099
	u32 temp;

1100
	temp = I915_READ(intel_hdmi->hdmi_reg);
1101

1102
	temp &= ~(SDVO_ENABLE | SDVO_AUDIO_ENABLE);
1103 1104
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126

	/*
	 * HW workaround for IBX, we need to move the port
	 * to transcoder A after disabling it to allow the
	 * matching DP port to be enabled on transcoder A.
	 */
	if (HAS_PCH_IBX(dev) && crtc->pipe == PIPE_B) {
		temp &= ~SDVO_PIPE_B_SELECT;
		temp |= SDVO_ENABLE;
		/*
		 * HW workaround, need to write this twice for issue
		 * that may result in first write getting masked.
		 */
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);

		temp &= ~SDVO_ENABLE;
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
	}
1127

1128
	intel_hdmi->set_infoframes(&encoder->base, false, NULL);
1129 1130
}

1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153
static void g4x_disable_hdmi(struct intel_encoder *encoder)
{
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);

	if (crtc->config->has_audio)
		intel_audio_codec_disable(encoder);

	intel_disable_hdmi(encoder);
}

static void pch_disable_hdmi(struct intel_encoder *encoder)
{
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);

	if (crtc->config->has_audio)
		intel_audio_codec_disable(encoder);
}

static void pch_post_disable_hdmi(struct intel_encoder *encoder)
{
	intel_disable_hdmi(encoder);
}

1154
static int hdmi_port_clock_limit(struct intel_hdmi *hdmi, bool respect_dvi_limit)
1155 1156 1157
{
	struct drm_device *dev = intel_hdmi_to_dev(hdmi);

1158
	if ((respect_dvi_limit && !hdmi->has_hdmi_sink) || IS_G4X(dev))
1159
		return 165000;
1160
	else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8)
1161 1162 1163 1164 1165
		return 300000;
	else
		return 225000;
}

1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176
static enum drm_mode_status
hdmi_port_clock_valid(struct intel_hdmi *hdmi,
		      int clock, bool respect_dvi_limit)
{
	struct drm_device *dev = intel_hdmi_to_dev(hdmi);

	if (clock < 25000)
		return MODE_CLOCK_LOW;
	if (clock > hdmi_port_clock_limit(hdmi, respect_dvi_limit))
		return MODE_CLOCK_HIGH;

1177 1178 1179 1180 1181 1182
	/* BXT DPLL can't generate 223-240 MHz */
	if (IS_BROXTON(dev) && clock > 223333 && clock < 240000)
		return MODE_CLOCK_RANGE;

	/* CHV DPLL can't generate 216-240 MHz */
	if (IS_CHERRYVIEW(dev) && clock > 216000 && clock < 240000)
1183 1184 1185 1186 1187
		return MODE_CLOCK_RANGE;

	return MODE_OK;
}

1188 1189 1190
static enum drm_mode_status
intel_hdmi_mode_valid(struct drm_connector *connector,
		      struct drm_display_mode *mode)
1191
{
1192 1193 1194 1195 1196 1197 1198
	struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
	struct drm_device *dev = intel_hdmi_to_dev(hdmi);
	enum drm_mode_status status;
	int clock;

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

1200
	clock = mode->clock;
1201 1202 1203
	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
		clock *= 2;

1204 1205
	/* check if we can do 8bpc */
	status = hdmi_port_clock_valid(hdmi, clock, true);
1206

1207 1208 1209
	/* if we can't do 8bpc we may still be able to do 12bpc */
	if (!HAS_GMCH_DISPLAY(dev) && status != MODE_OK)
		status = hdmi_port_clock_valid(hdmi, clock * 3 / 2, true);
1210

1211
	return status;
1212 1213
}

1214
static bool hdmi_12bpc_possible(struct intel_crtc_state *crtc_state)
1215
{
1216 1217
	struct drm_device *dev = crtc_state->base.crtc->dev;
	struct drm_atomic_state *state;
1218
	struct intel_encoder *encoder;
1219
	struct drm_connector *connector;
1220
	struct drm_connector_state *connector_state;
1221
	int count = 0, count_hdmi = 0;
1222
	int i;
1223

1224
	if (HAS_GMCH_DISPLAY(dev))
1225 1226
		return false;

1227 1228
	state = crtc_state->base.state;

1229
	for_each_connector_in_state(state, connector, connector_state, i) {
1230 1231 1232 1233 1234
		if (connector_state->crtc != crtc_state->base.crtc)
			continue;

		encoder = to_intel_encoder(connector_state->best_encoder);

1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245
		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;
}

1246
bool intel_hdmi_compute_config(struct intel_encoder *encoder,
1247
			       struct intel_crtc_state *pipe_config)
1248
{
1249 1250
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	struct drm_device *dev = encoder->base.dev;
1251
	struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
1252 1253
	int clock_8bpc = pipe_config->base.adjusted_mode.crtc_clock;
	int clock_12bpc = clock_8bpc * 3 / 2;
1254
	int desired_bpp;
1255

1256 1257
	pipe_config->has_hdmi_sink = intel_hdmi->has_hdmi_sink;

1258 1259 1260
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

1261 1262
	if (intel_hdmi->color_range_auto) {
		/* See CEA-861-E - 5.1 Default Encoding Parameters */
1263 1264 1265 1266 1267 1268
		pipe_config->limited_color_range =
			pipe_config->has_hdmi_sink &&
			drm_match_cea_mode(adjusted_mode) > 1;
	} else {
		pipe_config->limited_color_range =
			intel_hdmi->limited_color_range;
1269 1270
	}

1271 1272
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
		pipe_config->pixel_multiplier = 2;
1273
		clock_8bpc *= 2;
1274
		clock_12bpc *= 2;
1275 1276
	}

1277 1278 1279
	if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
		pipe_config->has_pch_encoder = true;

1280 1281 1282
	if (pipe_config->has_hdmi_sink && intel_hdmi->has_audio)
		pipe_config->has_audio = true;

1283 1284 1285
	/*
	 * 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
1286 1287
	 * outputs. We also need to check that the higher clock still fits
	 * within limits.
1288
	 */
1289
	if (pipe_config->pipe_bpp > 8*3 && pipe_config->has_hdmi_sink &&
1290
	    hdmi_port_clock_valid(intel_hdmi, clock_12bpc, false) == MODE_OK &&
1291
	    hdmi_12bpc_possible(pipe_config)) {
1292 1293
		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
		desired_bpp = 12*3;
1294 1295

		/* Need to adjust the port link by 1.5x for 12bpc. */
1296
		pipe_config->port_clock = clock_12bpc;
1297
	} else {
1298 1299
		DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
		desired_bpp = 8*3;
1300 1301

		pipe_config->port_clock = clock_8bpc;
1302 1303 1304 1305 1306
	}

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

1309 1310 1311
	if (hdmi_port_clock_valid(intel_hdmi, pipe_config->port_clock,
				  false) != MODE_OK) {
		DRM_DEBUG_KMS("unsupported HDMI clock, rejecting mode\n");
1312 1313 1314
		return false;
	}

1315 1316 1317
	return true;
}

1318 1319
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1320
{
1321
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1322

1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340
	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;
1341

1342 1343 1344
	power_domain = intel_display_port_power_domain(intel_encoder);
	intel_display_power_get(dev_priv, power_domain);

1345
	edid = drm_get_edid(connector,
1346 1347
			    intel_gmbus_get_adapter(dev_priv,
						    intel_hdmi->ddc_bus));
1348

1349
	intel_display_power_put(dev_priv, power_domain);
1350

1351 1352 1353 1354 1355 1356
	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);
1357 1358
		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
			intel_hdmi->has_audio =
1359 1360 1361 1362 1363 1364 1365
				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;
1366 1367
	}

1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387
	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;
1388

1389
	return status;
1390 1391
}

1392 1393
static void
intel_hdmi_force(struct drm_connector *connector)
1394
{
1395
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1396

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

1400
	intel_hdmi_unset_edid(connector);
1401

1402 1403
	if (connector->status != connector_status_connected)
		return;
1404

1405 1406 1407
	intel_hdmi_set_edid(connector);
	hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
}
1408

1409 1410 1411 1412 1413 1414 1415
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;
1416

1417
	return intel_connector_update_modes(connector, edid);
1418 1419
}

1420 1421 1422 1423
static bool
intel_hdmi_detect_audio(struct drm_connector *connector)
{
	bool has_audio = false;
1424
	struct edid *edid;
1425

1426 1427 1428
	edid = to_intel_connector(connector)->detect_edid;
	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL)
		has_audio = drm_detect_monitor_audio(edid);
1429

1430 1431 1432
	return has_audio;
}

1433 1434
static int
intel_hdmi_set_property(struct drm_connector *connector,
1435 1436
			struct drm_property *property,
			uint64_t val)
1437 1438
{
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1439 1440
	struct intel_digital_port *intel_dig_port =
		hdmi_to_dig_port(intel_hdmi);
1441
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
1442 1443
	int ret;

1444
	ret = drm_object_property_set_value(&connector->base, property, val);
1445 1446 1447
	if (ret)
		return ret;

1448
	if (property == dev_priv->force_audio_property) {
1449
		enum hdmi_force_audio i = val;
1450 1451 1452
		bool has_audio;

		if (i == intel_hdmi->force_audio)
1453 1454
			return 0;

1455
		intel_hdmi->force_audio = i;
1456

1457
		if (i == HDMI_AUDIO_AUTO)
1458 1459
			has_audio = intel_hdmi_detect_audio(connector);
		else
1460
			has_audio = (i == HDMI_AUDIO_ON);
1461

1462 1463
		if (i == HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink = 0;
1464

1465
		intel_hdmi->has_audio = has_audio;
1466 1467 1468
		goto done;
	}

1469
	if (property == dev_priv->broadcast_rgb_property) {
1470
		bool old_auto = intel_hdmi->color_range_auto;
1471
		bool old_range = intel_hdmi->limited_color_range;
1472

1473 1474 1475 1476 1477 1478
		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;
1479
			intel_hdmi->limited_color_range = false;
1480 1481 1482
			break;
		case INTEL_BROADCAST_RGB_LIMITED:
			intel_hdmi->color_range_auto = false;
1483
			intel_hdmi->limited_color_range = true;
1484 1485 1486 1487
			break;
		default:
			return -EINVAL;
		}
1488 1489

		if (old_auto == intel_hdmi->color_range_auto &&
1490
		    old_range == intel_hdmi->limited_color_range)
1491 1492
			return 0;

1493 1494 1495
		goto done;
	}

1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512
	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;
	}

1513 1514 1515
	return -EINVAL;

done:
1516 1517
	if (intel_dig_port->base.base.crtc)
		intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
1518 1519 1520 1521

	return 0;
}

1522 1523 1524 1525 1526
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 =
1527
		&intel_crtc->config->base.adjusted_mode;
1528

1529 1530
	intel_hdmi_prepare(encoder);

1531
	intel_hdmi->set_infoframes(&encoder->base,
1532
				   intel_crtc->config->has_hdmi_sink,
1533
				   adjusted_mode);
1534 1535
}

1536
static void vlv_hdmi_pre_enable(struct intel_encoder *encoder)
1537 1538
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1539
	struct intel_hdmi *intel_hdmi = &dport->hdmi;
1540 1541 1542 1543
	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);
1544
	struct drm_display_mode *adjusted_mode =
1545
		&intel_crtc->config->base.adjusted_mode;
1546
	enum dpio_channel port = vlv_dport_to_channel(dport);
1547 1548 1549 1550
	int pipe = intel_crtc->pipe;
	u32 val;

	/* Enable clock channels for this port */
V
Ville Syrjälä 已提交
1551
	mutex_lock(&dev_priv->sb_lock);
1552
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port));
1553 1554 1555 1556 1557 1558
	val = 0;
	if (pipe)
		val |= (1<<21);
	else
		val &= ~(1<<21);
	val |= 0x001000c4;
1559
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW8(port), val);
1560 1561

	/* HDMI 1.0V-2dB */
1562 1563 1564 1565 1566 1567 1568 1569
	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);
1570 1571

	/* Program lane clock */
1572 1573
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018);
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888);
V
Ville Syrjälä 已提交
1574
	mutex_unlock(&dev_priv->sb_lock);
1575

1576
	intel_hdmi->set_infoframes(&encoder->base,
1577
				   intel_crtc->config->has_hdmi_sink,
1578
				   adjusted_mode);
1579

1580
	g4x_enable_hdmi(encoder);
1581

1582
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1583 1584
}

1585
static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder)
1586 1587 1588 1589
{
	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;
1590 1591
	struct intel_crtc *intel_crtc =
		to_intel_crtc(encoder->base.crtc);
1592
	enum dpio_channel port = vlv_dport_to_channel(dport);
1593
	int pipe = intel_crtc->pipe;
1594

1595 1596
	intel_hdmi_prepare(encoder);

1597
	/* Program Tx lane resets to default */
V
Ville Syrjälä 已提交
1598
	mutex_lock(&dev_priv->sb_lock);
1599
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port),
1600 1601
			 DPIO_PCS_TX_LANE2_RESET |
			 DPIO_PCS_TX_LANE1_RESET);
1602
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port),
1603 1604 1605 1606 1607 1608
			 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 */
1609 1610 1611 1612 1613 1614
	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);
V
Ville Syrjälä 已提交
1615
	mutex_unlock(&dev_priv->sb_lock);
1616 1617
}

1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628
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;

1629 1630
	intel_hdmi_prepare(encoder);

V
Ville Syrjälä 已提交
1631
	mutex_lock(&dev_priv->sb_lock);
1632

1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651
	/* 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);
	}

1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680
	/* 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);

V
Ville Syrjälä 已提交
1681
	mutex_unlock(&dev_priv->sb_lock);
1682 1683
}

1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705
static void chv_hdmi_post_pll_disable(struct intel_encoder *encoder)
{
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	enum pipe pipe = to_intel_crtc(encoder->base.crtc)->pipe;
	u32 val;

	mutex_lock(&dev_priv->sb_lock);

	/* disable 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);
		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);
		vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
	}

	mutex_unlock(&dev_priv->sb_lock);
}

1706
static void vlv_hdmi_post_disable(struct intel_encoder *encoder)
1707 1708 1709
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1710 1711
	struct intel_crtc *intel_crtc =
		to_intel_crtc(encoder->base.crtc);
1712
	enum dpio_channel port = vlv_dport_to_channel(dport);
1713
	int pipe = intel_crtc->pipe;
1714 1715

	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
V
Ville Syrjälä 已提交
1716
	mutex_lock(&dev_priv->sb_lock);
1717 1718
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 0x00000000);
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port), 0x00e00060);
V
Ville Syrjälä 已提交
1719
	mutex_unlock(&dev_priv->sb_lock);
1720 1721
}

1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732
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;

V
Ville Syrjälä 已提交
1733
	mutex_lock(&dev_priv->sb_lock);
1734 1735

	/* Propagate soft reset to data lane reset */
1736
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
1737
	val |= CHV_PCS_REQ_SOFTRESET_EN;
1738
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
1739

1740 1741 1742 1743 1744 1745 1746 1747 1748
	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));
1749
	val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
1750
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
1751

V
Ville Syrjälä 已提交
1752
	mutex_unlock(&dev_priv->sb_lock);
1753 1754
}

1755 1756 1757
static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1758
	struct intel_hdmi *intel_hdmi = &dport->hdmi;
1759 1760 1761 1762
	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);
1763
	struct drm_display_mode *adjusted_mode =
1764
		&intel_crtc->config->base.adjusted_mode;
1765 1766
	enum dpio_channel ch = vlv_dport_to_channel(dport);
	int pipe = intel_crtc->pipe;
1767
	int data, i, stagger;
1768 1769
	u32 val;

V
Ville Syrjälä 已提交
1770
	mutex_lock(&dev_priv->sb_lock);
1771

1772 1773 1774 1775 1776 1777 1778 1779 1780
	/* 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);

1781
	/* Deassert soft data lane reset*/
1782
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
1783
	val |= CHV_PCS_REQ_SOFTRESET_EN;
1784 1785 1786 1787 1788 1789 1790 1791 1792
	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);
1793

1794
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
1795
	val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
1796
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
1797 1798

	/* Program Tx latency optimal setting */
1799 1800 1801 1802 1803 1804 1805 1806
	for (i = 0; i < 4; i++) {
		/* 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 */
1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838
	if (intel_crtc->config->port_clock > 270000)
		stagger = 0x18;
	else if (intel_crtc->config->port_clock > 135000)
		stagger = 0xd;
	else if (intel_crtc->config->port_clock > 67500)
		stagger = 0x7;
	else if (intel_crtc->config->port_clock > 33750)
		stagger = 0x4;
	else
		stagger = 0x2;

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
	val |= DPIO_TX2_STAGGER_MASK(0x1f);
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);

	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
	val |= DPIO_TX2_STAGGER_MASK(0x1f);
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);

	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW12(ch),
		       DPIO_LANESTAGGER_STRAP(stagger) |
		       DPIO_LANESTAGGER_STRAP_OVRD |
		       DPIO_TX1_STAGGER_MASK(0x1f) |
		       DPIO_TX1_STAGGER_MULT(6) |
		       DPIO_TX2_STAGGER_MULT(0));

	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW12(ch),
		       DPIO_LANESTAGGER_STRAP(stagger) |
		       DPIO_LANESTAGGER_STRAP_OVRD |
		       DPIO_TX1_STAGGER_MASK(0x1f) |
		       DPIO_TX1_STAGGER_MULT(7) |
		       DPIO_TX2_STAGGER_MULT(5));
1839 1840

	/* Clear calc init */
1841 1842
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
	val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
1843 1844
	val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
	val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
1845 1846 1847 1848
	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);
1849 1850
	val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
	val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
1851
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
1852

1853 1854 1855 1856 1857 1858 1859 1860 1861 1862
	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);

1863 1864
	/* FIXME: Program the support xxx V-dB */
	/* Use 800mV-0dB */
1865 1866 1867 1868 1869 1870
	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);
	}
1871

1872 1873
	for (i = 0; i < 4; i++) {
		val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
1874

1875 1876
		val &= ~DPIO_SWING_MARGIN000_MASK;
		val |= 102 << DPIO_SWING_MARGIN000_SHIFT;
1877 1878 1879 1880 1881 1882 1883 1884 1885

		/*
		 * Supposedly this value shouldn't matter when unique transition
		 * scale is disabled, but in fact it does matter. Let's just
		 * always program the same value and hope it's OK.
		 */
		val &= ~(0xff << DPIO_UNIQ_TRANS_SCALE_SHIFT);
		val |= 0x9a << DPIO_UNIQ_TRANS_SCALE_SHIFT;

1886 1887
		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
	}
1888

1889 1890 1891 1892 1893 1894
	/*
	 * The document said it needs to set bit 27 for ch0 and bit 26
	 * for ch1. Might be a typo in the doc.
	 * For now, for this unique transition scale selection, set bit
	 * 27 for ch0 and ch1.
	 */
1895 1896 1897 1898 1899
	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);
	}
1900 1901

	/* Start swing calculation */
1902 1903 1904 1905 1906 1907 1908
	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);
1909 1910 1911 1912 1913 1914

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

V
Ville Syrjälä 已提交
1915
	mutex_unlock(&dev_priv->sb_lock);
1916

1917
	intel_hdmi->set_infoframes(&encoder->base,
1918
				   intel_crtc->config->has_hdmi_sink,
1919 1920
				   adjusted_mode);

1921
	g4x_enable_hdmi(encoder);
1922

1923
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1924 1925
}

1926 1927
static void intel_hdmi_destroy(struct drm_connector *connector)
{
1928
	kfree(to_intel_connector(connector)->detect_edid);
1929
	drm_connector_cleanup(connector);
1930
	kfree(connector);
1931 1932 1933
}

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1934
	.dpms = drm_atomic_helper_connector_dpms,
1935
	.detect = intel_hdmi_detect,
1936
	.force = intel_hdmi_force,
1937
	.fill_modes = drm_helper_probe_single_connector_modes,
1938
	.set_property = intel_hdmi_set_property,
1939
	.atomic_get_property = intel_connector_atomic_get_property,
1940
	.destroy = intel_hdmi_destroy,
1941
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1942
	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1943 1944 1945 1946 1947
};

static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
	.get_modes = intel_hdmi_get_modes,
	.mode_valid = intel_hdmi_mode_valid,
1948
	.best_encoder = intel_best_encoder,
1949 1950 1951
};

static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
C
Chris Wilson 已提交
1952
	.destroy = intel_encoder_destroy,
1953 1954
};

1955 1956 1957 1958 1959 1960 1961 1962 1963
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);
}

1964 1965 1966
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1967
	intel_attach_force_audio_property(connector);
1968
	intel_attach_broadcast_rgb_property(connector);
1969
	intel_hdmi->color_range_auto = true;
1970 1971
	intel_attach_aspect_ratio_property(connector);
	intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1972 1973
}

P
Paulo Zanoni 已提交
1974 1975
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
			       struct intel_connector *intel_connector)
1976
{
1977 1978 1979 1980
	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;
1981
	struct drm_i915_private *dev_priv = dev->dev_private;
1982
	enum port port = intel_dig_port->port;
1983

1984
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1985
			   DRM_MODE_CONNECTOR_HDMIA);
1986 1987
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

1988
	connector->interlace_allowed = 1;
1989
	connector->doublescan_allowed = 0;
1990
	connector->stereo_allowed = 1;
1991

1992 1993
	switch (port) {
	case PORT_B:
J
Jani Nikula 已提交
1994 1995 1996 1997
		if (IS_BROXTON(dev_priv))
			intel_hdmi->ddc_bus = GMBUS_PIN_1_BXT;
		else
			intel_hdmi->ddc_bus = GMBUS_PIN_DPB;
1998 1999 2000 2001 2002 2003 2004 2005
		/*
		 * On BXT A0/A1, sw needs to activate DDIA HPD logic and
		 * interrupts to check the external panel connection.
		 */
		if (IS_BROXTON(dev_priv) && (INTEL_REVID(dev) < BXT_REVID_B0))
			intel_encoder->hpd_pin = HPD_PORT_A;
		else
			intel_encoder->hpd_pin = HPD_PORT_B;
2006 2007
		break;
	case PORT_C:
J
Jani Nikula 已提交
2008 2009 2010 2011
		if (IS_BROXTON(dev_priv))
			intel_hdmi->ddc_bus = GMBUS_PIN_2_BXT;
		else
			intel_hdmi->ddc_bus = GMBUS_PIN_DPC;
2012
		intel_encoder->hpd_pin = HPD_PORT_C;
2013 2014
		break;
	case PORT_D:
J
Jani Nikula 已提交
2015 2016 2017
		if (WARN_ON(IS_BROXTON(dev_priv)))
			intel_hdmi->ddc_bus = GMBUS_PIN_DISABLED;
		else if (IS_CHERRYVIEW(dev_priv))
2018
			intel_hdmi->ddc_bus = GMBUS_PIN_DPD_CHV;
2019
		else
2020
			intel_hdmi->ddc_bus = GMBUS_PIN_DPD;
2021
		intel_encoder->hpd_pin = HPD_PORT_D;
2022 2023
		break;
	case PORT_A:
2024
		intel_encoder->hpd_pin = HPD_PORT_A;
2025 2026
		/* Internal port only for eDP. */
	default:
2027
		BUG();
2028
	}
2029

2030
	if (IS_VALLEYVIEW(dev)) {
2031
		intel_hdmi->write_infoframe = vlv_write_infoframe;
2032
		intel_hdmi->set_infoframes = vlv_set_infoframes;
2033
		intel_hdmi->infoframe_enabled = vlv_infoframe_enabled;
2034
	} else if (IS_G4X(dev)) {
2035 2036
		intel_hdmi->write_infoframe = g4x_write_infoframe;
		intel_hdmi->set_infoframes = g4x_set_infoframes;
2037
		intel_hdmi->infoframe_enabled = g4x_infoframe_enabled;
2038
	} else if (HAS_DDI(dev)) {
2039
		intel_hdmi->write_infoframe = hsw_write_infoframe;
2040
		intel_hdmi->set_infoframes = hsw_set_infoframes;
2041
		intel_hdmi->infoframe_enabled = hsw_infoframe_enabled;
2042 2043
	} else if (HAS_PCH_IBX(dev)) {
		intel_hdmi->write_infoframe = ibx_write_infoframe;
2044
		intel_hdmi->set_infoframes = ibx_set_infoframes;
2045
		intel_hdmi->infoframe_enabled = ibx_infoframe_enabled;
2046 2047
	} else {
		intel_hdmi->write_infoframe = cpt_write_infoframe;
2048
		intel_hdmi->set_infoframes = cpt_set_infoframes;
2049
		intel_hdmi->infoframe_enabled = cpt_infoframe_enabled;
2050
	}
2051

P
Paulo Zanoni 已提交
2052
	if (HAS_DDI(dev))
2053 2054 2055
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
2056
	intel_connector->unregister = intel_connector_unregister;
2057 2058 2059 2060

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
2061
	drm_connector_register(connector);
2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072

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

2073
void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
2074 2075 2076 2077 2078
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

2079
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
2080 2081 2082
	if (!intel_dig_port)
		return;

2083
	intel_connector = intel_connector_alloc();
2084 2085 2086 2087 2088 2089 2090 2091 2092
	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 已提交
2093

2094
	intel_encoder->compute_config = intel_hdmi_compute_config;
2095 2096 2097 2098 2099 2100
	if (HAS_PCH_SPLIT(dev)) {
		intel_encoder->disable = pch_disable_hdmi;
		intel_encoder->post_disable = pch_post_disable_hdmi;
	} else {
		intel_encoder->disable = g4x_disable_hdmi;
	}
P
Paulo Zanoni 已提交
2101
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
2102
	intel_encoder->get_config = intel_hdmi_get_config;
2103
	if (IS_CHERRYVIEW(dev)) {
2104
		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
2105 2106
		intel_encoder->pre_enable = chv_hdmi_pre_enable;
		intel_encoder->enable = vlv_enable_hdmi;
2107
		intel_encoder->post_disable = chv_hdmi_post_disable;
2108
		intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable;
2109
	} else if (IS_VALLEYVIEW(dev)) {
2110 2111
		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
2112
		intel_encoder->enable = vlv_enable_hdmi;
2113
		intel_encoder->post_disable = vlv_hdmi_post_disable;
2114
	} else {
2115
		intel_encoder->pre_enable = intel_hdmi_pre_enable;
2116 2117
		if (HAS_PCH_CPT(dev))
			intel_encoder->enable = cpt_enable_hdmi;
2118 2119
		else if (HAS_PCH_IBX(dev))
			intel_encoder->enable = ibx_enable_hdmi;
2120
		else
2121
			intel_encoder->enable = g4x_enable_hdmi;
2122
	}
2123

2124
	intel_encoder->type = INTEL_OUTPUT_HDMI;
2125 2126 2127 2128 2129 2130 2131 2132
	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);
	}
2133
	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
2134 2135 2136 2137 2138 2139 2140
	/*
	 * 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;
2141

2142
	intel_dig_port->port = port;
2143
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
2144
	intel_dig_port->dp.output_reg = 0;
2145

2146
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2147
}