intel_hdmi.c 62.5 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
	if (!HAS_PCH_SPLIT(dev))
852
		hdmi_val |= intel_hdmi->color_range;
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
		if (pipe_config->has_hdmi_sink &&
1264
		    drm_match_cea_mode(adjusted_mode) > 1)
1265
			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
1266 1267 1268 1269
		else
			intel_hdmi->color_range = 0;
	}

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

1276
	if (intel_hdmi->color_range)
1277
		pipe_config->limited_color_range = true;
1278

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

1282 1283 1284
	if (pipe_config->has_hdmi_sink && intel_hdmi->has_audio)
		pipe_config->has_audio = true;

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

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

		pipe_config->port_clock = clock_8bpc;
1304 1305 1306 1307 1308
	}

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

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

1317 1318 1319
	return true;
}

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

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

1344 1345 1346
	power_domain = intel_display_port_power_domain(intel_encoder);
	intel_display_power_get(dev_priv, power_domain);

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

1351
	intel_display_power_put(dev_priv, power_domain);
1352

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

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

1391
	return status;
1392 1393
}

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

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

1402
	intel_hdmi_unset_edid(connector);
1403

1404 1405
	if (connector->status != connector_status_connected)
		return;
1406

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

1411 1412 1413 1414 1415 1416 1417
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;
1418

1419
	return intel_connector_update_modes(connector, edid);
1420 1421
}

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

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

1432 1433 1434
	return has_audio;
}

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

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

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

		if (i == intel_hdmi->force_audio)
1455 1456
			return 0;

1457
		intel_hdmi->force_audio = i;
1458

1459
		if (i == HDMI_AUDIO_AUTO)
1460 1461
			has_audio = intel_hdmi_detect_audio(connector);
		else
1462
			has_audio = (i == HDMI_AUDIO_ON);
1463

1464 1465
		if (i == HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink = 0;
1466

1467
		intel_hdmi->has_audio = has_audio;
1468 1469 1470
		goto done;
	}

1471
	if (property == dev_priv->broadcast_rgb_property) {
1472 1473 1474
		bool old_auto = intel_hdmi->color_range_auto;
		uint32_t old_range = intel_hdmi->color_range;

1475 1476 1477 1478 1479 1480 1481 1482 1483 1484
		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;
1485
			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
1486 1487 1488 1489
			break;
		default:
			return -EINVAL;
		}
1490 1491 1492 1493 1494

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

1495 1496 1497
		goto done;
	}

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

1515 1516 1517
	return -EINVAL;

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

	return 0;
}

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

1531 1532
	intel_hdmi_prepare(encoder);

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

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

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

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

	/* Program lane clock */
1574 1575
	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ä 已提交
1576
	mutex_unlock(&dev_priv->sb_lock);
1577

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

1582
	g4x_enable_hdmi(encoder);
1583

1584
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1585 1586
}

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

1597 1598
	intel_hdmi_prepare(encoder);

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

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

1631 1632
	intel_hdmi_prepare(encoder);

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

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

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 1681 1682
	/* 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ä 已提交
1683
	mutex_unlock(&dev_priv->sb_lock);
1684 1685
}

1686
static void vlv_hdmi_post_disable(struct intel_encoder *encoder)
1687 1688 1689
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1690 1691
	struct intel_crtc *intel_crtc =
		to_intel_crtc(encoder->base.crtc);
1692
	enum dpio_channel port = vlv_dport_to_channel(dport);
1693
	int pipe = intel_crtc->pipe;
1694 1695

	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
V
Ville Syrjälä 已提交
1696
	mutex_lock(&dev_priv->sb_lock);
1697 1698
	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ä 已提交
1699
	mutex_unlock(&dev_priv->sb_lock);
1700 1701
}

1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712
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ä 已提交
1713
	mutex_lock(&dev_priv->sb_lock);
1714 1715

	/* Propagate soft reset to data lane reset */
1716
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
1717
	val |= CHV_PCS_REQ_SOFTRESET_EN;
1718
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
1719

1720 1721 1722 1723 1724 1725 1726 1727 1728
	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));
1729
	val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
1730
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
1731

V
Ville Syrjälä 已提交
1732
	mutex_unlock(&dev_priv->sb_lock);
1733 1734
}

1735 1736 1737
static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1738
	struct intel_hdmi *intel_hdmi = &dport->hdmi;
1739 1740 1741 1742
	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);
1743
	struct drm_display_mode *adjusted_mode =
1744
		&intel_crtc->config->base.adjusted_mode;
1745 1746
	enum dpio_channel ch = vlv_dport_to_channel(dport);
	int pipe = intel_crtc->pipe;
1747
	int data, i, stagger;
1748 1749
	u32 val;

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

1752 1753 1754 1755 1756 1757 1758 1759 1760
	/* 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);

1761
	/* Deassert soft data lane reset*/
1762
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
1763
	val |= CHV_PCS_REQ_SOFTRESET_EN;
1764 1765 1766 1767 1768 1769 1770 1771 1772
	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);
1773

1774
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
1775
	val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
1776
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
1777 1778

	/* Program Tx latency optimal setting */
1779 1780 1781 1782 1783 1784 1785 1786
	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 */
1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818
	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));
1819 1820

	/* Clear calc init */
1821 1822
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
	val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
1823 1824
	val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
	val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
1825 1826 1827 1828
	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);
1829 1830
	val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
	val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
1831
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
1832

1833 1834 1835 1836 1837 1838 1839 1840 1841 1842
	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);

1843 1844
	/* FIXME: Program the support xxx V-dB */
	/* Use 800mV-0dB */
1845 1846 1847 1848 1849 1850
	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);
	}
1851

1852 1853
	for (i = 0; i < 4; i++) {
		val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
1854 1855
		val &= ~DPIO_SWING_MARGIN000_MASK;
		val |= 102 << DPIO_SWING_MARGIN000_SHIFT;
1856 1857
		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
	}
1858 1859

	/* Disable unique transition scale */
1860 1861 1862 1863 1864
	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);
	}
1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879

	/* 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 */
1880 1881 1882 1883 1884 1885 1886
	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);
1887 1888 1889 1890 1891 1892

	/* 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ä 已提交
1893
	mutex_unlock(&dev_priv->sb_lock);
1894

1895
	intel_hdmi->set_infoframes(&encoder->base,
1896
				   intel_crtc->config->has_hdmi_sink,
1897 1898
				   adjusted_mode);

1899
	g4x_enable_hdmi(encoder);
1900

1901
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1902 1903
}

1904 1905
static void intel_hdmi_destroy(struct drm_connector *connector)
{
1906
	kfree(to_intel_connector(connector)->detect_edid);
1907
	drm_connector_cleanup(connector);
1908
	kfree(connector);
1909 1910 1911
}

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1912
	.dpms = intel_connector_dpms,
1913
	.detect = intel_hdmi_detect,
1914
	.force = intel_hdmi_force,
1915
	.fill_modes = drm_helper_probe_single_connector_modes,
1916
	.set_property = intel_hdmi_set_property,
1917
	.atomic_get_property = intel_connector_atomic_get_property,
1918
	.destroy = intel_hdmi_destroy,
1919
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1920
	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1921 1922 1923 1924 1925
};

static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
	.get_modes = intel_hdmi_get_modes,
	.mode_valid = intel_hdmi_mode_valid,
1926
	.best_encoder = intel_best_encoder,
1927 1928 1929
};

static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
C
Chris Wilson 已提交
1930
	.destroy = intel_encoder_destroy,
1931 1932
};

1933 1934 1935 1936 1937 1938 1939 1940 1941
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);
}

1942 1943 1944
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1945
	intel_attach_force_audio_property(connector);
1946
	intel_attach_broadcast_rgb_property(connector);
1947
	intel_hdmi->color_range_auto = true;
1948 1949
	intel_attach_aspect_ratio_property(connector);
	intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1950 1951
}

P
Paulo Zanoni 已提交
1952 1953
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
			       struct intel_connector *intel_connector)
1954
{
1955 1956 1957 1958
	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;
1959
	struct drm_i915_private *dev_priv = dev->dev_private;
1960
	enum port port = intel_dig_port->port;
1961

1962
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1963
			   DRM_MODE_CONNECTOR_HDMIA);
1964 1965
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

1966
	connector->interlace_allowed = 1;
1967
	connector->doublescan_allowed = 0;
1968
	connector->stereo_allowed = 1;
1969

1970 1971
	switch (port) {
	case PORT_B:
J
Jani Nikula 已提交
1972 1973 1974 1975
		if (IS_BROXTON(dev_priv))
			intel_hdmi->ddc_bus = GMBUS_PIN_1_BXT;
		else
			intel_hdmi->ddc_bus = GMBUS_PIN_DPB;
1976
		intel_encoder->hpd_pin = HPD_PORT_B;
1977 1978
		break;
	case PORT_C:
J
Jani Nikula 已提交
1979 1980 1981 1982
		if (IS_BROXTON(dev_priv))
			intel_hdmi->ddc_bus = GMBUS_PIN_2_BXT;
		else
			intel_hdmi->ddc_bus = GMBUS_PIN_DPC;
1983
		intel_encoder->hpd_pin = HPD_PORT_C;
1984 1985
		break;
	case PORT_D:
J
Jani Nikula 已提交
1986 1987 1988
		if (WARN_ON(IS_BROXTON(dev_priv)))
			intel_hdmi->ddc_bus = GMBUS_PIN_DISABLED;
		else if (IS_CHERRYVIEW(dev_priv))
1989
			intel_hdmi->ddc_bus = GMBUS_PIN_DPD_CHV;
1990
		else
1991
			intel_hdmi->ddc_bus = GMBUS_PIN_DPD;
1992
		intel_encoder->hpd_pin = HPD_PORT_D;
1993 1994
		break;
	case PORT_A:
1995
		intel_encoder->hpd_pin = HPD_PORT_A;
1996 1997
		/* Internal port only for eDP. */
	default:
1998
		BUG();
1999
	}
2000

2001
	if (IS_VALLEYVIEW(dev)) {
2002
		intel_hdmi->write_infoframe = vlv_write_infoframe;
2003
		intel_hdmi->set_infoframes = vlv_set_infoframes;
2004
		intel_hdmi->infoframe_enabled = vlv_infoframe_enabled;
2005
	} else if (IS_G4X(dev)) {
2006 2007
		intel_hdmi->write_infoframe = g4x_write_infoframe;
		intel_hdmi->set_infoframes = g4x_set_infoframes;
2008
		intel_hdmi->infoframe_enabled = g4x_infoframe_enabled;
2009
	} else if (HAS_DDI(dev)) {
2010
		intel_hdmi->write_infoframe = hsw_write_infoframe;
2011
		intel_hdmi->set_infoframes = hsw_set_infoframes;
2012
		intel_hdmi->infoframe_enabled = hsw_infoframe_enabled;
2013 2014
	} else if (HAS_PCH_IBX(dev)) {
		intel_hdmi->write_infoframe = ibx_write_infoframe;
2015
		intel_hdmi->set_infoframes = ibx_set_infoframes;
2016
		intel_hdmi->infoframe_enabled = ibx_infoframe_enabled;
2017 2018
	} else {
		intel_hdmi->write_infoframe = cpt_write_infoframe;
2019
		intel_hdmi->set_infoframes = cpt_set_infoframes;
2020
		intel_hdmi->infoframe_enabled = cpt_infoframe_enabled;
2021
	}
2022

P
Paulo Zanoni 已提交
2023
	if (HAS_DDI(dev))
2024 2025 2026
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
2027
	intel_connector->unregister = intel_connector_unregister;
2028 2029 2030 2031

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
2032
	drm_connector_register(connector);
2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043

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

2044
void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
2045 2046 2047 2048 2049
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

2050
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
2051 2052 2053
	if (!intel_dig_port)
		return;

2054
	intel_connector = intel_connector_alloc();
2055 2056 2057 2058 2059 2060 2061 2062 2063
	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 已提交
2064

2065
	intel_encoder->compute_config = intel_hdmi_compute_config;
2066 2067 2068 2069 2070 2071
	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 已提交
2072
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
2073
	intel_encoder->get_config = intel_hdmi_get_config;
2074
	if (IS_CHERRYVIEW(dev)) {
2075
		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
2076 2077
		intel_encoder->pre_enable = chv_hdmi_pre_enable;
		intel_encoder->enable = vlv_enable_hdmi;
2078
		intel_encoder->post_disable = chv_hdmi_post_disable;
2079
	} else if (IS_VALLEYVIEW(dev)) {
2080 2081
		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
2082
		intel_encoder->enable = vlv_enable_hdmi;
2083
		intel_encoder->post_disable = vlv_hdmi_post_disable;
2084
	} else {
2085
		intel_encoder->pre_enable = intel_hdmi_pre_enable;
2086 2087
		if (HAS_PCH_CPT(dev))
			intel_encoder->enable = cpt_enable_hdmi;
2088 2089
		else if (HAS_PCH_IBX(dev))
			intel_encoder->enable = ibx_enable_hdmi;
2090
		else
2091
			intel_encoder->enable = g4x_enable_hdmi;
2092
	}
2093

2094
	intel_encoder->type = INTEL_OUTPUT_HDMI;
2095 2096 2097 2098 2099 2100 2101 2102
	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);
	}
2103
	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
2104 2105 2106 2107 2108 2109 2110
	/*
	 * 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;
2111

2112
	intel_dig_port->port = port;
2113
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
2114
	intel_dig_port->dp.output_reg = 0;
2115

2116
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2117
}