intel_hdmi.c 61.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 946 947 948

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

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

949
	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
950 951
}

952 953 954 955 956 957 958 959 960 961
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);
}

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

970
	temp = I915_READ(intel_hdmi->hdmi_reg);
971

972 973 974
	temp |= SDVO_ENABLE;
	if (crtc->config->has_audio)
		temp |= SDVO_AUDIO_ENABLE;
975

976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991
	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);
992

993 994 995
	temp |= SDVO_ENABLE;
	if (crtc->config->has_audio)
		temp |= SDVO_AUDIO_ENABLE;
996

997 998 999 1000 1001 1002
	/*
	 * 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);
1003 1004
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
1005

1006 1007 1008 1009 1010 1011
	/*
	 * 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.
1012
	 */
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
	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);
1024 1025
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
1026
	}
1027

1028
	if (crtc->config->has_audio)
1029 1030 1031 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
		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;
1064
	}
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082

	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);
1083
}
1084

1085 1086
static void vlv_enable_hdmi(struct intel_encoder *encoder)
{
1087 1088 1089 1090 1091 1092 1093
}

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);
1094
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
1095 1096
	u32 temp;

1097
	temp = I915_READ(intel_hdmi->hdmi_reg);
1098

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

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

1125
	intel_hdmi->set_infoframes(&encoder->base, false, NULL);
1126 1127
}

1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150
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);
}

1151
static int hdmi_portclock_limit(struct intel_hdmi *hdmi, bool respect_dvi_limit)
1152 1153 1154
{
	struct drm_device *dev = intel_hdmi_to_dev(hdmi);

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

1163 1164 1165
static enum drm_mode_status
intel_hdmi_mode_valid(struct drm_connector *connector,
		      struct drm_display_mode *mode)
1166
{
1167 1168 1169 1170 1171 1172 1173
	int clock = mode->clock;

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

	if (clock > hdmi_portclock_limit(intel_attached_hdmi(connector),
					 true))
1174
		return MODE_CLOCK_HIGH;
1175
	if (clock < 20000)
1176
		return MODE_CLOCK_LOW;
1177 1178 1179 1180 1181 1182 1183

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

	return MODE_OK;
}

1184
static bool hdmi_12bpc_possible(struct intel_crtc_state *crtc_state)
1185
{
1186 1187
	struct drm_device *dev = crtc_state->base.crtc->dev;
	struct drm_atomic_state *state;
1188
	struct intel_encoder *encoder;
1189
	struct drm_connector *connector;
1190
	struct drm_connector_state *connector_state;
1191
	int count = 0, count_hdmi = 0;
1192
	int i;
1193

1194
	if (HAS_GMCH_DISPLAY(dev))
1195 1196
		return false;

1197 1198
	state = crtc_state->base.state;

1199
	for_each_connector_in_state(state, connector, connector_state, i) {
1200 1201 1202 1203 1204
		if (connector_state->crtc != crtc_state->base.crtc)
			continue;

		encoder = to_intel_encoder(connector_state->best_encoder);

1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215
		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;
}

1216
bool intel_hdmi_compute_config(struct intel_encoder *encoder,
1217
			       struct intel_crtc_state *pipe_config)
1218
{
1219 1220
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	struct drm_device *dev = encoder->base.dev;
1221 1222
	struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
	int clock_12bpc = pipe_config->base.adjusted_mode.crtc_clock * 3 / 2;
1223
	int portclock_limit = hdmi_portclock_limit(intel_hdmi, false);
1224
	int desired_bpp;
1225

1226 1227
	pipe_config->has_hdmi_sink = intel_hdmi->has_hdmi_sink;

1228 1229 1230
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

1231 1232
	if (intel_hdmi->color_range_auto) {
		/* See CEA-861-E - 5.1 Default Encoding Parameters */
1233
		if (pipe_config->has_hdmi_sink &&
1234
		    drm_match_cea_mode(adjusted_mode) > 1)
1235
			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
1236 1237 1238 1239
		else
			intel_hdmi->color_range = 0;
	}

1240 1241 1242 1243
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
		pipe_config->pixel_multiplier = 2;
	}

1244
	if (intel_hdmi->color_range)
1245
		pipe_config->limited_color_range = true;
1246

1247 1248 1249
	if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
		pipe_config->has_pch_encoder = true;

1250 1251 1252
	if (pipe_config->has_hdmi_sink && intel_hdmi->has_audio)
		pipe_config->has_audio = true;

1253 1254 1255
	/*
	 * 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
1256 1257
	 * outputs. We also need to check that the higher clock still fits
	 * within limits.
1258
	 */
1259
	if (pipe_config->pipe_bpp > 8*3 && pipe_config->has_hdmi_sink &&
1260
	    clock_12bpc <= portclock_limit &&
1261 1262
	    hdmi_12bpc_possible(pipe_config) &&
	    0 /* FIXME 12bpc support totally broken */) {
1263 1264
		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
		desired_bpp = 12*3;
1265 1266

		/* Need to adjust the port link by 1.5x for 12bpc. */
1267
		pipe_config->port_clock = clock_12bpc;
1268
	} else {
1269 1270 1271 1272 1273 1274 1275
		DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
		desired_bpp = 8*3;
	}

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

1278
	if (adjusted_mode->crtc_clock > portclock_limit) {
1279 1280 1281 1282
		DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n");
		return false;
	}

1283 1284 1285
	return true;
}

1286 1287
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1288
{
1289
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1290

1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308
	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;
1309

1310 1311 1312
	power_domain = intel_display_port_power_domain(intel_encoder);
	intel_display_power_get(dev_priv, power_domain);

1313
	edid = drm_get_edid(connector,
1314 1315
			    intel_gmbus_get_adapter(dev_priv,
						    intel_hdmi->ddc_bus));
1316

1317
	intel_display_power_put(dev_priv, power_domain);
1318

1319 1320 1321 1322 1323 1324
	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);
1325 1326
		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
			intel_hdmi->has_audio =
1327 1328 1329 1330 1331 1332 1333
				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;
1334 1335
	}

1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
	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;
1356

1357
	return status;
1358 1359
}

1360 1361
static void
intel_hdmi_force(struct drm_connector *connector)
1362
{
1363
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1364

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

1368
	intel_hdmi_unset_edid(connector);
1369

1370 1371
	if (connector->status != connector_status_connected)
		return;
1372

1373 1374 1375
	intel_hdmi_set_edid(connector);
	hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
}
1376

1377 1378 1379 1380 1381 1382 1383
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;
1384

1385
	return intel_connector_update_modes(connector, edid);
1386 1387
}

1388 1389 1390 1391
static bool
intel_hdmi_detect_audio(struct drm_connector *connector)
{
	bool has_audio = false;
1392
	struct edid *edid;
1393

1394 1395 1396
	edid = to_intel_connector(connector)->detect_edid;
	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL)
		has_audio = drm_detect_monitor_audio(edid);
1397

1398 1399 1400
	return has_audio;
}

1401 1402
static int
intel_hdmi_set_property(struct drm_connector *connector,
1403 1404
			struct drm_property *property,
			uint64_t val)
1405 1406
{
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1407 1408
	struct intel_digital_port *intel_dig_port =
		hdmi_to_dig_port(intel_hdmi);
1409
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
1410 1411
	int ret;

1412
	ret = drm_object_property_set_value(&connector->base, property, val);
1413 1414 1415
	if (ret)
		return ret;

1416
	if (property == dev_priv->force_audio_property) {
1417
		enum hdmi_force_audio i = val;
1418 1419 1420
		bool has_audio;

		if (i == intel_hdmi->force_audio)
1421 1422
			return 0;

1423
		intel_hdmi->force_audio = i;
1424

1425
		if (i == HDMI_AUDIO_AUTO)
1426 1427
			has_audio = intel_hdmi_detect_audio(connector);
		else
1428
			has_audio = (i == HDMI_AUDIO_ON);
1429

1430 1431
		if (i == HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink = 0;
1432

1433
		intel_hdmi->has_audio = has_audio;
1434 1435 1436
		goto done;
	}

1437
	if (property == dev_priv->broadcast_rgb_property) {
1438 1439 1440
		bool old_auto = intel_hdmi->color_range_auto;
		uint32_t old_range = intel_hdmi->color_range;

1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
		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;
1451
			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
1452 1453 1454 1455
			break;
		default:
			return -EINVAL;
		}
1456 1457 1458 1459 1460

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

1461 1462 1463
		goto done;
	}

1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480
	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;
	}

1481 1482 1483
	return -EINVAL;

done:
1484 1485
	if (intel_dig_port->base.base.crtc)
		intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
1486 1487 1488 1489

	return 0;
}

1490 1491 1492 1493 1494
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 =
1495
		&intel_crtc->config->base.adjusted_mode;
1496

1497 1498
	intel_hdmi_prepare(encoder);

1499
	intel_hdmi->set_infoframes(&encoder->base,
1500
				   intel_crtc->config->has_hdmi_sink,
1501
				   adjusted_mode);
1502 1503
}

1504
static void vlv_hdmi_pre_enable(struct intel_encoder *encoder)
1505 1506
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1507
	struct intel_hdmi *intel_hdmi = &dport->hdmi;
1508 1509 1510 1511
	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);
1512
	struct drm_display_mode *adjusted_mode =
1513
		&intel_crtc->config->base.adjusted_mode;
1514
	enum dpio_channel port = vlv_dport_to_channel(dport);
1515 1516 1517 1518
	int pipe = intel_crtc->pipe;
	u32 val;

	/* Enable clock channels for this port */
V
Ville Syrjälä 已提交
1519
	mutex_lock(&dev_priv->sb_lock);
1520
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port));
1521 1522 1523 1524 1525 1526
	val = 0;
	if (pipe)
		val |= (1<<21);
	else
		val &= ~(1<<21);
	val |= 0x001000c4;
1527
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW8(port), val);
1528 1529

	/* HDMI 1.0V-2dB */
1530 1531 1532 1533 1534 1535 1536 1537
	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);
1538 1539

	/* Program lane clock */
1540 1541
	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ä 已提交
1542
	mutex_unlock(&dev_priv->sb_lock);
1543

1544
	intel_hdmi->set_infoframes(&encoder->base,
1545
				   intel_crtc->config->has_hdmi_sink,
1546
				   adjusted_mode);
1547

1548
	g4x_enable_hdmi(encoder);
1549

1550
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1551 1552
}

1553
static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder)
1554 1555 1556 1557
{
	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;
1558 1559
	struct intel_crtc *intel_crtc =
		to_intel_crtc(encoder->base.crtc);
1560
	enum dpio_channel port = vlv_dport_to_channel(dport);
1561
	int pipe = intel_crtc->pipe;
1562

1563 1564
	intel_hdmi_prepare(encoder);

1565
	/* Program Tx lane resets to default */
V
Ville Syrjälä 已提交
1566
	mutex_lock(&dev_priv->sb_lock);
1567
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port),
1568 1569
			 DPIO_PCS_TX_LANE2_RESET |
			 DPIO_PCS_TX_LANE1_RESET);
1570
	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port),
1571 1572 1573 1574 1575 1576
			 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 */
1577 1578 1579 1580 1581 1582
	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ä 已提交
1583
	mutex_unlock(&dev_priv->sb_lock);
1584 1585
}

1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596
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;

1597 1598
	intel_hdmi_prepare(encoder);

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

1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619
	/* 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);
	}

1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648
	/* 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ä 已提交
1649
	mutex_unlock(&dev_priv->sb_lock);
1650 1651
}

1652
static void vlv_hdmi_post_disable(struct intel_encoder *encoder)
1653 1654 1655
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1656 1657
	struct intel_crtc *intel_crtc =
		to_intel_crtc(encoder->base.crtc);
1658
	enum dpio_channel port = vlv_dport_to_channel(dport);
1659
	int pipe = intel_crtc->pipe;
1660 1661

	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
V
Ville Syrjälä 已提交
1662
	mutex_lock(&dev_priv->sb_lock);
1663 1664
	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ä 已提交
1665
	mutex_unlock(&dev_priv->sb_lock);
1666 1667
}

1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678
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ä 已提交
1679
	mutex_lock(&dev_priv->sb_lock);
1680 1681

	/* Propagate soft reset to data lane reset */
1682
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
1683
	val |= CHV_PCS_REQ_SOFTRESET_EN;
1684
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
1685

1686 1687 1688 1689 1690 1691 1692 1693 1694
	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));
1695
	val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
1696
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
1697

V
Ville Syrjälä 已提交
1698
	mutex_unlock(&dev_priv->sb_lock);
1699 1700
}

1701 1702 1703
static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1704
	struct intel_hdmi *intel_hdmi = &dport->hdmi;
1705 1706 1707 1708
	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);
1709
	struct drm_display_mode *adjusted_mode =
1710
		&intel_crtc->config->base.adjusted_mode;
1711 1712
	enum dpio_channel ch = vlv_dport_to_channel(dport);
	int pipe = intel_crtc->pipe;
1713
	int data, i, stagger;
1714 1715
	u32 val;

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

1718 1719 1720 1721 1722 1723 1724 1725 1726
	/* 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);

1727
	/* Deassert soft data lane reset*/
1728
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
1729
	val |= CHV_PCS_REQ_SOFTRESET_EN;
1730 1731 1732 1733 1734 1735 1736 1737 1738
	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);
1739

1740
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
1741
	val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
1742
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
1743 1744

	/* Program Tx latency optimal setting */
1745 1746 1747 1748 1749 1750 1751 1752
	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 */
1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784
	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));
1785 1786

	/* Clear calc init */
1787 1788
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
	val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
1789 1790
	val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
	val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
1791 1792 1793 1794
	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);
1795 1796
	val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
	val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
1797
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
1798

1799 1800 1801 1802 1803 1804 1805 1806 1807 1808
	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);

1809 1810
	/* FIXME: Program the support xxx V-dB */
	/* Use 800mV-0dB */
1811 1812 1813 1814 1815 1816
	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);
	}
1817

1818 1819
	for (i = 0; i < 4; i++) {
		val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
1820 1821
		val &= ~DPIO_SWING_MARGIN000_MASK;
		val |= 102 << DPIO_SWING_MARGIN000_SHIFT;
1822 1823
		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
	}
1824 1825

	/* Disable unique transition scale */
1826 1827 1828 1829 1830
	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);
	}
1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845

	/* 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 */
1846 1847 1848 1849 1850 1851 1852
	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);
1853 1854 1855 1856 1857 1858

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

1861
	intel_hdmi->set_infoframes(&encoder->base,
1862
				   intel_crtc->config->has_hdmi_sink,
1863 1864
				   adjusted_mode);

1865
	g4x_enable_hdmi(encoder);
1866

1867
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1868 1869
}

1870 1871
static void intel_hdmi_destroy(struct drm_connector *connector)
{
1872
	kfree(to_intel_connector(connector)->detect_edid);
1873
	drm_connector_cleanup(connector);
1874
	kfree(connector);
1875 1876 1877
}

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1878
	.dpms = intel_connector_dpms,
1879
	.detect = intel_hdmi_detect,
1880
	.force = intel_hdmi_force,
1881
	.fill_modes = drm_helper_probe_single_connector_modes,
1882
	.set_property = intel_hdmi_set_property,
1883
	.atomic_get_property = intel_connector_atomic_get_property,
1884
	.destroy = intel_hdmi_destroy,
1885
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1886
	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1887 1888 1889 1890 1891
};

static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
	.get_modes = intel_hdmi_get_modes,
	.mode_valid = intel_hdmi_mode_valid,
1892
	.best_encoder = intel_best_encoder,
1893 1894 1895
};

static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
C
Chris Wilson 已提交
1896
	.destroy = intel_encoder_destroy,
1897 1898
};

1899 1900 1901 1902 1903 1904 1905 1906 1907
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);
}

1908 1909 1910
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1911
	intel_attach_force_audio_property(connector);
1912
	intel_attach_broadcast_rgb_property(connector);
1913
	intel_hdmi->color_range_auto = true;
1914 1915
	intel_attach_aspect_ratio_property(connector);
	intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1916 1917
}

P
Paulo Zanoni 已提交
1918 1919
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
			       struct intel_connector *intel_connector)
1920
{
1921 1922 1923 1924
	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;
1925
	struct drm_i915_private *dev_priv = dev->dev_private;
1926
	enum port port = intel_dig_port->port;
1927

1928
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1929
			   DRM_MODE_CONNECTOR_HDMIA);
1930 1931
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

1932
	connector->interlace_allowed = 1;
1933
	connector->doublescan_allowed = 0;
1934
	connector->stereo_allowed = 1;
1935

1936 1937
	switch (port) {
	case PORT_B:
J
Jani Nikula 已提交
1938 1939 1940 1941
		if (IS_BROXTON(dev_priv))
			intel_hdmi->ddc_bus = GMBUS_PIN_1_BXT;
		else
			intel_hdmi->ddc_bus = GMBUS_PIN_DPB;
1942
		intel_encoder->hpd_pin = HPD_PORT_B;
1943 1944
		break;
	case PORT_C:
J
Jani Nikula 已提交
1945 1946 1947 1948
		if (IS_BROXTON(dev_priv))
			intel_hdmi->ddc_bus = GMBUS_PIN_2_BXT;
		else
			intel_hdmi->ddc_bus = GMBUS_PIN_DPC;
1949
		intel_encoder->hpd_pin = HPD_PORT_C;
1950 1951
		break;
	case PORT_D:
J
Jani Nikula 已提交
1952 1953 1954
		if (WARN_ON(IS_BROXTON(dev_priv)))
			intel_hdmi->ddc_bus = GMBUS_PIN_DISABLED;
		else if (IS_CHERRYVIEW(dev_priv))
1955
			intel_hdmi->ddc_bus = GMBUS_PIN_DPD_CHV;
1956
		else
1957
			intel_hdmi->ddc_bus = GMBUS_PIN_DPD;
1958
		intel_encoder->hpd_pin = HPD_PORT_D;
1959 1960
		break;
	case PORT_A:
1961
		intel_encoder->hpd_pin = HPD_PORT_A;
1962 1963
		/* Internal port only for eDP. */
	default:
1964
		BUG();
1965
	}
1966

1967
	if (IS_VALLEYVIEW(dev)) {
1968
		intel_hdmi->write_infoframe = vlv_write_infoframe;
1969
		intel_hdmi->set_infoframes = vlv_set_infoframes;
1970
		intel_hdmi->infoframe_enabled = vlv_infoframe_enabled;
1971
	} else if (IS_G4X(dev)) {
1972 1973
		intel_hdmi->write_infoframe = g4x_write_infoframe;
		intel_hdmi->set_infoframes = g4x_set_infoframes;
1974
		intel_hdmi->infoframe_enabled = g4x_infoframe_enabled;
1975
	} else if (HAS_DDI(dev)) {
1976
		intel_hdmi->write_infoframe = hsw_write_infoframe;
1977
		intel_hdmi->set_infoframes = hsw_set_infoframes;
1978
		intel_hdmi->infoframe_enabled = hsw_infoframe_enabled;
1979 1980
	} else if (HAS_PCH_IBX(dev)) {
		intel_hdmi->write_infoframe = ibx_write_infoframe;
1981
		intel_hdmi->set_infoframes = ibx_set_infoframes;
1982
		intel_hdmi->infoframe_enabled = ibx_infoframe_enabled;
1983 1984
	} else {
		intel_hdmi->write_infoframe = cpt_write_infoframe;
1985
		intel_hdmi->set_infoframes = cpt_set_infoframes;
1986
		intel_hdmi->infoframe_enabled = cpt_infoframe_enabled;
1987
	}
1988

P
Paulo Zanoni 已提交
1989
	if (HAS_DDI(dev))
1990 1991 1992
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
1993
	intel_connector->unregister = intel_connector_unregister;
1994 1995 1996 1997

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
1998
	drm_connector_register(connector);
1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009

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

2010
void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
2011 2012 2013 2014 2015
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

2016
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
2017 2018 2019
	if (!intel_dig_port)
		return;

2020
	intel_connector = intel_connector_alloc();
2021 2022 2023 2024 2025 2026 2027 2028 2029
	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 已提交
2030

2031
	intel_encoder->compute_config = intel_hdmi_compute_config;
2032 2033 2034 2035 2036 2037
	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 已提交
2038
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
2039
	intel_encoder->get_config = intel_hdmi_get_config;
2040
	if (IS_CHERRYVIEW(dev)) {
2041
		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
2042 2043
		intel_encoder->pre_enable = chv_hdmi_pre_enable;
		intel_encoder->enable = vlv_enable_hdmi;
2044
		intel_encoder->post_disable = chv_hdmi_post_disable;
2045
	} else if (IS_VALLEYVIEW(dev)) {
2046 2047
		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
2048
		intel_encoder->enable = vlv_enable_hdmi;
2049
		intel_encoder->post_disable = vlv_hdmi_post_disable;
2050
	} else {
2051
		intel_encoder->pre_enable = intel_hdmi_pre_enable;
2052 2053
		if (HAS_PCH_CPT(dev))
			intel_encoder->enable = cpt_enable_hdmi;
2054 2055
		else if (HAS_PCH_IBX(dev))
			intel_encoder->enable = ibx_enable_hdmi;
2056
		else
2057
			intel_encoder->enable = g4x_enable_hdmi;
2058
	}
2059

2060
	intel_encoder->type = INTEL_OUTPUT_HDMI;
2061 2062 2063 2064 2065 2066 2067 2068
	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);
	}
2069
	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
2070 2071 2072 2073 2074 2075 2076
	/*
	 * 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;
2077

2078
	intel_dig_port->port = port;
2079
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
2080
	intel_dig_port->dp.output_reg = 0;
2081

2082
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2083
}