intel_hdmi.c 61.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
 * Copyright 2006 Dave Airlie <airlied@linux.ie>
 * Copyright © 2006-2009 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Authors:
 *	Eric Anholt <eric@anholt.net>
 *	Jesse Barnes <jesse.barnes@intel.com>
 */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

148
	val &= ~g4x_infoframe_enable(type);
149

150
	I915_WRITE(VIDEO_DIP_CTL, val);
151

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

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

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

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

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

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

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

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

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

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

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

	I915_WRITE(reg, val);

207
	mmiowb();
208 209 210 211
	for (i = 0; i < len; i += 4) {
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
212 213 214
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
215
	mmiowb();
216

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

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

225 226 227 228 229
static bool ibx_infoframe_enabled(struct drm_encoder *encoder)
{
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
230
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
231 232 233
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

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

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

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

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

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

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

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

266
	I915_WRITE(reg, val);
267

268
	mmiowb();
269
	for (i = 0; i < len; i += 4) {
270 271 272
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
273 274 275
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
276
	mmiowb();
277

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

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

286 287 288 289 290 291 292 293
static bool cpt_infoframe_enabled(struct drm_encoder *encoder)
{
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

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

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

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

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

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

318
	val &= ~g4x_infoframe_enable(type);
319

320
	I915_WRITE(reg, val);
321

322
	mmiowb();
323 324 325 326
	for (i = 0; i < len; i += 4) {
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
327 328 329
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
330
	mmiowb();
331

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

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

340 341 342 343 344
static bool vlv_infoframe_enabled(struct drm_encoder *encoder)
{
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
345
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
346 347 348
	int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

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

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

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

360
static void hsw_write_infoframe(struct drm_encoder *encoder,
361
				enum hdmi_infoframe_type type,
362
				const void *frame, ssize_t len)
363
{
364
	const uint32_t *data = frame;
365 366 367
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
368
	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
369 370
	u32 data_reg;
	int i;
371
	u32 val = I915_READ(ctl_reg);
372

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

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

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

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

397 398 399 400 401
static bool hsw_infoframe_enabled(struct drm_encoder *encoder)
{
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
402
	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
403 404
	u32 val = I915_READ(ctl_reg);

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

410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
/*
 * The data we write to the DIP data buffer registers is 1 byte bigger than the
 * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting
 * at 0). It's also a byte used by DisplayPort so the same DIP registers can be
 * used for both technologies.
 *
 * DW0: Reserved/ECC/DP | HB2 | HB1 | HB0
 * DW1:       DB3       | DB2 | DB1 | DB0
 * DW2:       DB7       | DB6 | DB5 | DB4
 * DW3: ...
 *
 * (HB is Header Byte, DB is Data Byte)
 *
 * The hdmi pack() functions don't know about that hardware specific hole so we
 * trick them by giving an offset into the buffer and moving back the header
 * bytes by one.
 */
427 428
static void intel_write_infoframe(struct drm_encoder *encoder,
				  union hdmi_infoframe *frame)
429 430
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
431 432
	uint8_t buffer[VIDEO_DIP_DATA_SIZE];
	ssize_t len;
433

434 435 436 437 438 439 440 441 442 443 444
	/* see comment above for the reason for this offset */
	len = hdmi_infoframe_pack(frame, buffer + 1, sizeof(buffer) - 1);
	if (len < 0)
		return;

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

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

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

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

460 461 462 463 464 465
	ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
						       adjusted_mode);
	if (ret < 0) {
		DRM_ERROR("couldn't fill AVI infoframe\n");
		return;
	}
P
Paulo Zanoni 已提交
466

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

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

479
static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
480
{
481 482 483 484 485 486 487 488
	union hdmi_infoframe frame;
	int ret;

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

490
	frame.spd.sdi = HDMI_SPD_SDI_PC;
491

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

495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
static void
intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
			      struct drm_display_mode *adjusted_mode)
{
	union hdmi_infoframe frame;
	int ret;

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

	intel_write_infoframe(encoder, &frame);
}

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

521 522
	assert_hdmi_port_disabled(intel_hdmi);

523 524 525 526 527 528 529 530 531 532 533
	/* If the registers were not initialized yet, they might be zeroes,
	 * which means we're selecting the AVI DIP and we're setting its
	 * frequency to once. This seems to really confuse the HW and make
	 * things stop working (the register spec says the AVI always needs to
	 * be sent every VSync). So here we avoid writing to the register more
	 * than we need and also explicitly select the AVI DIP and explicitly
	 * set its frequency to every VSync. Avoiding to write it twice seems to
	 * be enough to solve the problem, but being defensive shouldn't hurt us
	 * either. */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

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

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

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

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

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

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

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

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

	return false;
}

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

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

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

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

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

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

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

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

	return val != 0;
}

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

674 675
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

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

static void cpt_set_infoframes(struct drm_encoder *encoder,
715
			       bool enable,
716 717
			       struct drm_display_mode *adjusted_mode)
{
718 719 720 721 722 723
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

724 725
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

static void vlv_set_infoframes(struct drm_encoder *encoder,
757
			       bool enable,
758 759
			       struct drm_display_mode *adjusted_mode)
{
760
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
761
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
762 763 764 765
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
	u32 reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);
766
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
767

768 769
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

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

static void hsw_set_infoframes(struct drm_encoder *encoder,
809
			       bool enable,
810 811
			       struct drm_display_mode *adjusted_mode)
{
812 813 814
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
815
	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
816
	u32 val = I915_READ(reg);
817

818 819
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

850
	hdmi_val = SDVO_ENCODING_HDMI;
851
	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_portclock_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
static enum drm_mode_status
intel_hdmi_mode_valid(struct drm_connector *connector,
		      struct drm_display_mode *mode)
1169
{
1170 1171 1172 1173 1174 1175 1176
	int clock = mode->clock;

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

	if (clock > hdmi_portclock_limit(intel_attached_hdmi(connector),
					 true))
1177
		return MODE_CLOCK_HIGH;
1178
	if (clock < 25000)
1179
		return MODE_CLOCK_LOW;
1180 1181 1182 1183 1184 1185 1186

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

	return MODE_OK;
}

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

1197
	if (HAS_GMCH_DISPLAY(dev))
1198 1199
		return false;

1200 1201
	state = crtc_state->base.state;

1202
	for_each_connector_in_state(state, connector, connector_state, i) {
1203 1204 1205 1206 1207
		if (connector_state->crtc != crtc_state->base.crtc)
			continue;

		encoder = to_intel_encoder(connector_state->best_encoder);

1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218
		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;
}

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

1229 1230
	pipe_config->has_hdmi_sink = intel_hdmi->has_hdmi_sink;

1231 1232 1233
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

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

1243 1244
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
		pipe_config->pixel_multiplier = 2;
1245
		clock_12bpc *= 2;
1246 1247
	}

1248
	if (intel_hdmi->color_range)
1249
		pipe_config->limited_color_range = true;
1250

1251 1252 1253
	if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
		pipe_config->has_pch_encoder = true;

1254 1255 1256
	if (pipe_config->has_hdmi_sink && intel_hdmi->has_audio)
		pipe_config->has_audio = true;

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

		/* Need to adjust the port link by 1.5x for 12bpc. */
1271
		pipe_config->port_clock = clock_12bpc;
1272
	} else {
1273 1274 1275 1276 1277 1278 1279
		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;
1280 1281
	}

1282
	if (adjusted_mode->crtc_clock > portclock_limit) {
1283 1284 1285 1286
		DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n");
		return false;
	}

1287 1288 1289
	return true;
}

1290 1291
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1292
{
1293
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1294

1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312
	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;
1313

1314 1315 1316
	power_domain = intel_display_port_power_domain(intel_encoder);
	intel_display_power_get(dev_priv, power_domain);

1317
	edid = drm_get_edid(connector,
1318 1319
			    intel_gmbus_get_adapter(dev_priv,
						    intel_hdmi->ddc_bus));
1320

1321
	intel_display_power_put(dev_priv, power_domain);
1322

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

1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359
	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;
1360

1361
	return status;
1362 1363
}

1364 1365
static void
intel_hdmi_force(struct drm_connector *connector)
1366
{
1367
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1368

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

1372
	intel_hdmi_unset_edid(connector);
1373

1374 1375
	if (connector->status != connector_status_connected)
		return;
1376

1377 1378 1379
	intel_hdmi_set_edid(connector);
	hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
}
1380

1381 1382 1383 1384 1385 1386 1387
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;
1388

1389
	return intel_connector_update_modes(connector, edid);
1390 1391
}

1392 1393 1394 1395
static bool
intel_hdmi_detect_audio(struct drm_connector *connector)
{
	bool has_audio = false;
1396
	struct edid *edid;
1397

1398 1399 1400
	edid = to_intel_connector(connector)->detect_edid;
	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL)
		has_audio = drm_detect_monitor_audio(edid);
1401

1402 1403 1404
	return has_audio;
}

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

1416
	ret = drm_object_property_set_value(&connector->base, property, val);
1417 1418 1419
	if (ret)
		return ret;

1420
	if (property == dev_priv->force_audio_property) {
1421
		enum hdmi_force_audio i = val;
1422 1423 1424
		bool has_audio;

		if (i == intel_hdmi->force_audio)
1425 1426
			return 0;

1427
		intel_hdmi->force_audio = i;
1428

1429
		if (i == HDMI_AUDIO_AUTO)
1430 1431
			has_audio = intel_hdmi_detect_audio(connector);
		else
1432
			has_audio = (i == HDMI_AUDIO_ON);
1433

1434 1435
		if (i == HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink = 0;
1436

1437
		intel_hdmi->has_audio = has_audio;
1438 1439 1440
		goto done;
	}

1441
	if (property == dev_priv->broadcast_rgb_property) {
1442 1443 1444
		bool old_auto = intel_hdmi->color_range_auto;
		uint32_t old_range = intel_hdmi->color_range;

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

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

1465 1466 1467
		goto done;
	}

1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484
	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;
	}

1485 1486 1487
	return -EINVAL;

done:
1488 1489
	if (intel_dig_port->base.base.crtc)
		intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
1490 1491 1492 1493

	return 0;
}

1494 1495 1496 1497 1498
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 =
1499
		&intel_crtc->config->base.adjusted_mode;
1500

1501 1502
	intel_hdmi_prepare(encoder);

1503
	intel_hdmi->set_infoframes(&encoder->base,
1504
				   intel_crtc->config->has_hdmi_sink,
1505
				   adjusted_mode);
1506 1507
}

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

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

	/* HDMI 1.0V-2dB */
1534 1535 1536 1537 1538 1539 1540 1541
	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);
1542 1543

	/* Program lane clock */
1544 1545
	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ä 已提交
1546
	mutex_unlock(&dev_priv->sb_lock);
1547

1548
	intel_hdmi->set_infoframes(&encoder->base,
1549
				   intel_crtc->config->has_hdmi_sink,
1550
				   adjusted_mode);
1551

1552
	g4x_enable_hdmi(encoder);
1553

1554
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1555 1556
}

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

1567 1568
	intel_hdmi_prepare(encoder);

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

1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600
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;

1601 1602
	intel_hdmi_prepare(encoder);

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

1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623
	/* 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);
	}

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 1649 1650 1651 1652
	/* 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ä 已提交
1653
	mutex_unlock(&dev_priv->sb_lock);
1654 1655
}

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

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

1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682
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ä 已提交
1683
	mutex_lock(&dev_priv->sb_lock);
1684 1685

	/* Propagate soft reset to data lane reset */
1686
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
1687
	val |= CHV_PCS_REQ_SOFTRESET_EN;
1688
	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
1689

1690 1691 1692 1693 1694 1695 1696 1697 1698
	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));
1699
	val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
1700
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
1701

V
Ville Syrjälä 已提交
1702
	mutex_unlock(&dev_priv->sb_lock);
1703 1704
}

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

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

1722 1723 1724 1725 1726 1727 1728 1729 1730
	/* 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);

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

1744
	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
1745
	val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
1746
	vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
1747 1748

	/* Program Tx latency optimal setting */
1749 1750 1751 1752 1753 1754 1755 1756
	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 */
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 1785 1786 1787 1788
	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));
1789 1790

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

1803 1804 1805 1806 1807 1808 1809 1810 1811 1812
	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);

1813 1814
	/* FIXME: Program the support xxx V-dB */
	/* Use 800mV-0dB */
1815 1816 1817 1818 1819 1820
	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);
	}
1821

1822 1823
	for (i = 0; i < 4; i++) {
		val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
1824 1825
		val &= ~DPIO_SWING_MARGIN000_MASK;
		val |= 102 << DPIO_SWING_MARGIN000_SHIFT;
1826 1827
		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
	}
1828 1829

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

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

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

1865
	intel_hdmi->set_infoframes(&encoder->base,
1866
				   intel_crtc->config->has_hdmi_sink,
1867 1868
				   adjusted_mode);

1869
	g4x_enable_hdmi(encoder);
1870

1871
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1872 1873
}

1874 1875
static void intel_hdmi_destroy(struct drm_connector *connector)
{
1876
	kfree(to_intel_connector(connector)->detect_edid);
1877
	drm_connector_cleanup(connector);
1878
	kfree(connector);
1879 1880 1881
}

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

static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
	.get_modes = intel_hdmi_get_modes,
	.mode_valid = intel_hdmi_mode_valid,
1896
	.best_encoder = intel_best_encoder,
1897 1898 1899
};

static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
C
Chris Wilson 已提交
1900
	.destroy = intel_encoder_destroy,
1901 1902
};

1903 1904 1905 1906 1907 1908 1909 1910 1911
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);
}

1912 1913 1914
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1915
	intel_attach_force_audio_property(connector);
1916
	intel_attach_broadcast_rgb_property(connector);
1917
	intel_hdmi->color_range_auto = true;
1918 1919
	intel_attach_aspect_ratio_property(connector);
	intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1920 1921
}

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

1932
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1933
			   DRM_MODE_CONNECTOR_HDMIA);
1934 1935
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

1936
	connector->interlace_allowed = 1;
1937
	connector->doublescan_allowed = 0;
1938
	connector->stereo_allowed = 1;
1939

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

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

P
Paulo Zanoni 已提交
1993
	if (HAS_DDI(dev))
1994 1995 1996
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
1997
	intel_connector->unregister = intel_connector_unregister;
1998 1999 2000 2001

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
2002
	drm_connector_register(connector);
2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013

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

2014
void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
2015 2016 2017 2018 2019
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

2020
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
2021 2022 2023
	if (!intel_dig_port)
		return;

2024
	intel_connector = intel_connector_alloc();
2025 2026 2027 2028 2029 2030 2031 2032 2033
	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 已提交
2034

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

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

2082
	intel_dig_port->port = port;
2083
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
2084
	intel_dig_port->dp.output_reg = 0;
2085

2086
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2087
}