intel_hdmi.c 62.9 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>
S
Shashank Sharma 已提交
37
#include <drm/drm_scdc_helper.h>
38
#include "intel_drv.h"
39
#include <drm/i915_drm.h>
40
#include <drm/intel_lpe_audio.h>
41 42
#include "i915_drv.h"

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

48 49 50
static void
assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
{
51
	struct drm_device *dev = intel_hdmi_to_dev(intel_hdmi);
52
	struct drm_i915_private *dev_priv = to_i915(dev);
53 54
	uint32_t enabled_bits;

55
	enabled_bits = HAS_DDI(dev_priv) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
56

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

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

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

73
static u32 g4x_infoframe_index(unsigned int type)
74
{
75 76
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
77
		return VIDEO_DIP_SELECT_AVI;
78
	case HDMI_INFOFRAME_TYPE_SPD:
79
		return VIDEO_DIP_SELECT_SPD;
80 81
	case HDMI_INFOFRAME_TYPE_VENDOR:
		return VIDEO_DIP_SELECT_VENDOR;
82
	default:
83
		MISSING_CASE(type);
84
		return 0;
85 86 87
	}
}

88
static u32 g4x_infoframe_enable(unsigned int type)
89
{
90 91
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
92
		return VIDEO_DIP_ENABLE_AVI;
93
	case HDMI_INFOFRAME_TYPE_SPD:
94
		return VIDEO_DIP_ENABLE_SPD;
95 96
	case HDMI_INFOFRAME_TYPE_VENDOR:
		return VIDEO_DIP_ENABLE_VENDOR;
97
	default:
98
		MISSING_CASE(type);
99
		return 0;
100 101 102
	}
}

103
static u32 hsw_infoframe_enable(unsigned int type)
104
{
105
	switch (type) {
106 107
	case DP_SDP_VSC:
		return VIDEO_DIP_ENABLE_VSC_HSW;
108
	case HDMI_INFOFRAME_TYPE_AVI:
109
		return VIDEO_DIP_ENABLE_AVI_HSW;
110
	case HDMI_INFOFRAME_TYPE_SPD:
111
		return VIDEO_DIP_ENABLE_SPD_HSW;
112 113
	case HDMI_INFOFRAME_TYPE_VENDOR:
		return VIDEO_DIP_ENABLE_VS_HSW;
114
	default:
115
		MISSING_CASE(type);
116 117 118 119
		return 0;
	}
}

120 121 122
static i915_reg_t
hsw_dip_data_reg(struct drm_i915_private *dev_priv,
		 enum transcoder cpu_transcoder,
123
		 unsigned int type,
124
		 int i)
125
{
126
	switch (type) {
127 128
	case DP_SDP_VSC:
		return HSW_TVIDEO_DIP_VSC_DATA(cpu_transcoder, i);
129
	case HDMI_INFOFRAME_TYPE_AVI:
130
		return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder, i);
131
	case HDMI_INFOFRAME_TYPE_SPD:
132
		return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder, i);
133
	case HDMI_INFOFRAME_TYPE_VENDOR:
134
		return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder, i);
135
	default:
136
		MISSING_CASE(type);
137
		return INVALID_MMIO_REG;
138 139 140
	}
}

141
static void g4x_write_infoframe(struct drm_encoder *encoder,
142
				const struct intel_crtc_state *crtc_state,
143
				unsigned int type,
144
				const void *frame, ssize_t len)
145
{
146
	const uint32_t *data = frame;
147
	struct drm_device *dev = encoder->dev;
148
	struct drm_i915_private *dev_priv = to_i915(dev);
149
	u32 val = I915_READ(VIDEO_DIP_CTL);
150
	int i;
151

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

154
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
155
	val |= g4x_infoframe_index(type);
156

157
	val &= ~g4x_infoframe_enable(type);
158

159
	I915_WRITE(VIDEO_DIP_CTL, val);
160

161
	mmiowb();
162
	for (i = 0; i < len; i += 4) {
163 164 165
		I915_WRITE(VIDEO_DIP_DATA, *data);
		data++;
	}
166 167 168
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
		I915_WRITE(VIDEO_DIP_DATA, 0);
169
	mmiowb();
170

171
	val |= g4x_infoframe_enable(type);
172
	val &= ~VIDEO_DIP_FREQ_MASK;
173
	val |= VIDEO_DIP_FREQ_VSYNC;
174

175
	I915_WRITE(VIDEO_DIP_CTL, val);
176
	POSTING_READ(VIDEO_DIP_CTL);
177 178
}

179 180
static bool g4x_infoframe_enabled(struct drm_encoder *encoder,
				  const struct intel_crtc_state *pipe_config)
181
{
182
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
183
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
184 185
	u32 val = I915_READ(VIDEO_DIP_CTL);

186 187
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;
188

189 190 191 192 193
	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);
194 195
}

196
static void ibx_write_infoframe(struct drm_encoder *encoder,
197
				const struct intel_crtc_state *crtc_state,
198
				unsigned int type,
199
				const void *frame, ssize_t len)
200
{
201
	const uint32_t *data = frame;
202
	struct drm_device *dev = encoder->dev;
203
	struct drm_i915_private *dev_priv = to_i915(dev);
204
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
205
	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
206
	u32 val = I915_READ(reg);
207
	int i;
208

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

211
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
212
	val |= g4x_infoframe_index(type);
213

214
	val &= ~g4x_infoframe_enable(type);
215 216 217

	I915_WRITE(reg, val);

218
	mmiowb();
219 220 221 222
	for (i = 0; i < len; i += 4) {
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
223 224 225
	/* 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);
226
	mmiowb();
227

228
	val |= g4x_infoframe_enable(type);
229
	val &= ~VIDEO_DIP_FREQ_MASK;
230
	val |= VIDEO_DIP_FREQ_VSYNC;
231 232

	I915_WRITE(reg, val);
233
	POSTING_READ(reg);
234 235
}

236 237
static bool ibx_infoframe_enabled(struct drm_encoder *encoder,
				  const struct intel_crtc_state *pipe_config)
238
{
239
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
240
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
241 242
	enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe;
	i915_reg_t reg = TVIDEO_DIP_CTL(pipe);
243 244
	u32 val = I915_READ(reg);

245 246 247 248 249
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;

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

251 252 253
	return val & (VIDEO_DIP_ENABLE_AVI |
		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
254 255
}

256
static void cpt_write_infoframe(struct drm_encoder *encoder,
257
				const struct intel_crtc_state *crtc_state,
258
				unsigned int type,
259
				const void *frame, ssize_t len)
260
{
261
	const uint32_t *data = frame;
262
	struct drm_device *dev = encoder->dev;
263
	struct drm_i915_private *dev_priv = to_i915(dev);
264
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
265
	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
266
	u32 val = I915_READ(reg);
267
	int i;
268

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

271
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
272
	val |= g4x_infoframe_index(type);
273

274 275
	/* The DIP control register spec says that we need to update the AVI
	 * infoframe without clearing its enable bit */
276 277
	if (type != HDMI_INFOFRAME_TYPE_AVI)
		val &= ~g4x_infoframe_enable(type);
278

279
	I915_WRITE(reg, val);
280

281
	mmiowb();
282
	for (i = 0; i < len; i += 4) {
283 284 285
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
286 287 288
	/* 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);
289
	mmiowb();
290

291
	val |= g4x_infoframe_enable(type);
292
	val &= ~VIDEO_DIP_FREQ_MASK;
293
	val |= VIDEO_DIP_FREQ_VSYNC;
294

295
	I915_WRITE(reg, val);
296
	POSTING_READ(reg);
297
}
298

299 300
static bool cpt_infoframe_enabled(struct drm_encoder *encoder,
				  const struct intel_crtc_state *pipe_config)
301
{
302 303 304
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
	enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe;
	u32 val = I915_READ(TVIDEO_DIP_CTL(pipe));
305

306 307 308 309 310 311
	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);
312 313
}

314
static void vlv_write_infoframe(struct drm_encoder *encoder,
315
				const struct intel_crtc_state *crtc_state,
316
				unsigned int type,
317
				const void *frame, ssize_t len)
318
{
319
	const uint32_t *data = frame;
320
	struct drm_device *dev = encoder->dev;
321
	struct drm_i915_private *dev_priv = to_i915(dev);
322
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
323
	i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
324
	u32 val = I915_READ(reg);
325
	int i;
326

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

329
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
330
	val |= g4x_infoframe_index(type);
331

332
	val &= ~g4x_infoframe_enable(type);
333

334
	I915_WRITE(reg, val);
335

336
	mmiowb();
337 338 339 340
	for (i = 0; i < len; i += 4) {
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
341 342 343
	/* 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);
344
	mmiowb();
345

346
	val |= g4x_infoframe_enable(type);
347
	val &= ~VIDEO_DIP_FREQ_MASK;
348
	val |= VIDEO_DIP_FREQ_VSYNC;
349

350
	I915_WRITE(reg, val);
351
	POSTING_READ(reg);
352 353
}

354 355
static bool vlv_infoframe_enabled(struct drm_encoder *encoder,
				  const struct intel_crtc_state *pipe_config)
356
{
357
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
358
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
359 360
	enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe;
	u32 val = I915_READ(VLV_TVIDEO_DIP_CTL(pipe));
361

362 363 364 365 366
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;

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

368 369 370
	return val & (VIDEO_DIP_ENABLE_AVI |
		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
371 372
}

373
static void hsw_write_infoframe(struct drm_encoder *encoder,
374
				const struct intel_crtc_state *crtc_state,
375
				unsigned int type,
376
				const void *frame, ssize_t len)
377
{
378
	const uint32_t *data = frame;
379
	struct drm_device *dev = encoder->dev;
380
	struct drm_i915_private *dev_priv = to_i915(dev);
381
	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
382 383
	i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder);
	i915_reg_t data_reg;
384 385
	int data_size = type == DP_SDP_VSC ?
		VIDEO_DIP_VSC_DATA_SIZE : VIDEO_DIP_DATA_SIZE;
386
	int i;
387
	u32 val = I915_READ(ctl_reg);
388

389
	data_reg = hsw_dip_data_reg(dev_priv, cpu_transcoder, type, 0);
390

391
	val &= ~hsw_infoframe_enable(type);
392 393
	I915_WRITE(ctl_reg, val);

394
	mmiowb();
395
	for (i = 0; i < len; i += 4) {
396 397
		I915_WRITE(hsw_dip_data_reg(dev_priv, cpu_transcoder,
					    type, i >> 2), *data);
398 399
		data++;
	}
400
	/* Write every possible data byte to force correct ECC calculation. */
401
	for (; i < data_size; i += 4)
402 403
		I915_WRITE(hsw_dip_data_reg(dev_priv, cpu_transcoder,
					    type, i >> 2), 0);
404
	mmiowb();
405

406
	val |= hsw_infoframe_enable(type);
407
	I915_WRITE(ctl_reg, val);
408
	POSTING_READ(ctl_reg);
409 410
}

411 412
static bool hsw_infoframe_enabled(struct drm_encoder *encoder,
				  const struct intel_crtc_state *pipe_config)
413
{
414 415
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
	u32 val = I915_READ(HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder));
416

417 418 419
	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);
420 421
}

422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
/*
 * 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.
 */
439
static void intel_write_infoframe(struct drm_encoder *encoder,
440
				  const struct intel_crtc_state *crtc_state,
441
				  union hdmi_infoframe *frame)
442
{
443
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
444 445
	uint8_t buffer[VIDEO_DIP_DATA_SIZE];
	ssize_t len;
446

447 448 449 450 451 452 453 454 455 456 457
	/* 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++;
458

459
	intel_dig_port->write_infoframe(encoder, crtc_state, frame->any.type, buffer, len);
460 461
}

462
static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
463
					 const struct intel_crtc_state *crtc_state)
464
{
465
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
466 467
	const struct drm_display_mode *adjusted_mode =
		&crtc_state->base.adjusted_mode;
468 469
	struct drm_connector *connector = &intel_hdmi->attached_connector->base;
	bool is_hdmi2_sink = connector->display_info.hdmi.scdc.supported;
470 471
	union hdmi_infoframe frame;
	int ret;
472

473
	ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
474 475
						       adjusted_mode,
						       is_hdmi2_sink);
476 477 478 479
	if (ret < 0) {
		DRM_ERROR("couldn't fill AVI infoframe\n");
		return;
	}
P
Paulo Zanoni 已提交
480

481 482 483 484 485
	if (crtc_state->ycbcr420)
		frame.avi.colorspace = HDMI_COLORSPACE_YUV420;
	else
		frame.avi.colorspace = HDMI_COLORSPACE_RGB;

486
	drm_hdmi_avi_infoframe_quant_range(&frame.avi, adjusted_mode,
487 488 489 490
					   crtc_state->limited_color_range ?
					   HDMI_QUANTIZATION_RANGE_LIMITED :
					   HDMI_QUANTIZATION_RANGE_FULL,
					   intel_hdmi->rgb_quant_range_selectable);
491

492
	/* TODO: handle pixel repetition for YCBCR420 outputs */
493
	intel_write_infoframe(encoder, crtc_state, &frame);
494 495
}

496 497
static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder,
					 const struct intel_crtc_state *crtc_state)
498
{
499 500 501 502 503 504 505 506
	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;
	}
507

508
	frame.spd.sdi = HDMI_SPD_SDI_PC;
509

510
	intel_write_infoframe(encoder, crtc_state, &frame);
511 512
}

513 514
static void
intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
515
			      const struct intel_crtc_state *crtc_state)
516 517 518 519 520
{
	union hdmi_infoframe frame;
	int ret;

	ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi,
521
							  &crtc_state->base.adjusted_mode);
522 523 524
	if (ret < 0)
		return;

525
	intel_write_infoframe(encoder, crtc_state, &frame);
526 527
}

528
static void g4x_set_infoframes(struct drm_encoder *encoder,
529
			       bool enable,
530 531
			       const struct intel_crtc_state *crtc_state,
			       const struct drm_connector_state *conn_state)
532
{
533
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
534 535
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
536
	i915_reg_t reg = VIDEO_DIP_CTL;
537
	u32 val = I915_READ(reg);
538
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
539

540 541
	assert_hdmi_port_disabled(intel_hdmi);

542 543 544 545 546 547 548 549 550 551 552
	/* 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;

553
	if (!enable) {
554 555
		if (!(val & VIDEO_DIP_ENABLE))
			return;
556 557 558 559 560 561 562
		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);
563
		I915_WRITE(reg, val);
564
		POSTING_READ(reg);
565 566 567
		return;
	}

568 569
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
		if (val & VIDEO_DIP_ENABLE) {
570 571 572
			DRM_DEBUG_KMS("video DIP already enabled on port %c\n",
				      (val & VIDEO_DIP_PORT_MASK) >> 29);
			return;
573 574 575 576 577
		}
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

578
	val |= VIDEO_DIP_ENABLE;
579 580
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
581

582
	I915_WRITE(reg, val);
583
	POSTING_READ(reg);
584

585 586 587
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state);
588 589
}

590
static bool hdmi_sink_is_deep_color(const struct drm_connector_state *conn_state)
591
{
592
	struct drm_connector *connector = conn_state->connector;
593 594 595 596 597 598 599

	/*
	 * 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.
	 */

600
	return connector->display_info.bpc > 8;
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 633 634 635 636 637 638 639 640 641 642 643 644 645
/*
 * 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);
}

646 647 648
static bool intel_hdmi_set_gcp_infoframe(struct drm_encoder *encoder,
					 const struct intel_crtc_state *crtc_state,
					 const struct drm_connector_state *conn_state)
649
{
650
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
651
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
652 653
	i915_reg_t reg;
	u32 val = 0;
654 655

	if (HAS_DDI(dev_priv))
656
		reg = HSW_TVIDEO_DIP_GCP(crtc_state->cpu_transcoder);
657
	else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
658
		reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
659
	else if (HAS_PCH_SPLIT(dev_priv))
660 661 662 663 664
		reg = TVIDEO_DIP_GCP(crtc->pipe);
	else
		return false;

	/* Indicate color depth whenever the sink supports deep color */
665
	if (hdmi_sink_is_deep_color(conn_state))
666 667
		val |= GCP_COLOR_INDICATION;

668
	/* Enable default_phase whenever the display mode is suitably aligned */
669 670
	if (gcp_default_phase_possible(crtc_state->pipe_bpp,
				       &crtc_state->base.adjusted_mode))
671 672
		val |= GCP_DEFAULT_PHASE_ENABLE;

673 674 675 676 677
	I915_WRITE(reg, val);

	return val != 0;
}

678
static void ibx_set_infoframes(struct drm_encoder *encoder,
679
			       bool enable,
680 681
			       const struct intel_crtc_state *crtc_state,
			       const struct drm_connector_state *conn_state)
682
{
683
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
684
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
685 686
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
687
	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
688
	u32 val = I915_READ(reg);
689
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
690

691 692
	assert_hdmi_port_disabled(intel_hdmi);

693 694 695
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

696
	if (!enable) {
697 698
		if (!(val & VIDEO_DIP_ENABLE))
			return;
699 700 701
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
			 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
702
		I915_WRITE(reg, val);
703
		POSTING_READ(reg);
704 705 706
		return;
	}

707
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
708 709 710
		WARN(val & VIDEO_DIP_ENABLE,
		     "DIP already enabled on port %c\n",
		     (val & VIDEO_DIP_PORT_MASK) >> 29);
711 712 713 714
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

715
	val |= VIDEO_DIP_ENABLE;
716 717 718
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
719

720
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
721 722
		val |= VIDEO_DIP_ENABLE_GCP;

723
	I915_WRITE(reg, val);
724
	POSTING_READ(reg);
725

726 727 728
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state);
729 730 731
}

static void cpt_set_infoframes(struct drm_encoder *encoder,
732
			       bool enable,
733 734
			       const struct intel_crtc_state *crtc_state,
			       const struct drm_connector_state *conn_state)
735
{
736
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
737
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
738
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
739
	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
740 741
	u32 val = I915_READ(reg);

742 743
	assert_hdmi_port_disabled(intel_hdmi);

744 745 746
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

747
	if (!enable) {
748 749
		if (!(val & VIDEO_DIP_ENABLE))
			return;
750 751 752
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
			 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
753
		I915_WRITE(reg, val);
754
		POSTING_READ(reg);
755 756 757
		return;
	}

758 759
	/* Set both together, unset both together: see the spec. */
	val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
760
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
761
		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
762

763
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
764 765
		val |= VIDEO_DIP_ENABLE_GCP;

766
	I915_WRITE(reg, val);
767
	POSTING_READ(reg);
768

769 770 771
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state);
772 773 774
}

static void vlv_set_infoframes(struct drm_encoder *encoder,
775
			       bool enable,
776 777
			       const struct intel_crtc_state *crtc_state,
			       const struct drm_connector_state *conn_state)
778
{
779
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
780
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
781
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
782
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
783
	i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
784
	u32 val = I915_READ(reg);
785
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
786

787 788
	assert_hdmi_port_disabled(intel_hdmi);

789 790 791
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

792
	if (!enable) {
793 794
		if (!(val & VIDEO_DIP_ENABLE))
			return;
795 796 797
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
			 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
798
		I915_WRITE(reg, val);
799
		POSTING_READ(reg);
800 801 802
		return;
	}

803
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
804 805 806
		WARN(val & VIDEO_DIP_ENABLE,
		     "DIP already enabled on port %c\n",
		     (val & VIDEO_DIP_PORT_MASK) >> 29);
807 808 809 810
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

811
	val |= VIDEO_DIP_ENABLE;
812 813 814
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
815

816
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
817 818
		val |= VIDEO_DIP_ENABLE_GCP;

819
	I915_WRITE(reg, val);
820
	POSTING_READ(reg);
821

822 823 824
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state);
825 826 827
}

static void hsw_set_infoframes(struct drm_encoder *encoder,
828
			       bool enable,
829 830
			       const struct intel_crtc_state *crtc_state,
			       const struct drm_connector_state *conn_state)
831
{
832
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
833
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
834
	i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
835
	u32 val = I915_READ(reg);
836

837 838
	assert_hdmi_port_disabled(intel_hdmi);

839 840 841 842
	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);

843
	if (!enable) {
844
		I915_WRITE(reg, val);
845
		POSTING_READ(reg);
846 847 848
		return;
	}

849
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
850 851
		val |= VIDEO_DIP_ENABLE_GCP_HSW;

852
	I915_WRITE(reg, val);
853
	POSTING_READ(reg);
854

855 856 857
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state);
858 859
}

860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
void intel_dp_dual_mode_set_tmds_output(struct intel_hdmi *hdmi, bool enable)
{
	struct drm_i915_private *dev_priv = to_i915(intel_hdmi_to_dev(hdmi));
	struct i2c_adapter *adapter =
		intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);

	if (hdmi->dp_dual_mode.type < DRM_DP_DUAL_MODE_TYPE2_DVI)
		return;

	DRM_DEBUG_KMS("%s DP dual mode adaptor TMDS output\n",
		      enable ? "Enabling" : "Disabling");

	drm_dp_dual_mode_set_tmds_output(hdmi->dp_dual_mode.type,
					 adapter, enable);
}

876 877
static void intel_hdmi_prepare(struct intel_encoder *encoder,
			       const struct intel_crtc_state *crtc_state)
878
{
879
	struct drm_device *dev = encoder->base.dev;
880
	struct drm_i915_private *dev_priv = to_i915(dev);
881
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
882
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
883
	const struct drm_display_mode *adjusted_mode = &crtc_state->base.adjusted_mode;
884
	u32 hdmi_val;
885

886 887
	intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);

888
	hdmi_val = SDVO_ENCODING_HDMI;
889
	if (!HAS_PCH_SPLIT(dev_priv) && crtc_state->limited_color_range)
890
		hdmi_val |= HDMI_COLOR_RANGE_16_235;
891
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
892
		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
893
	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
894
		hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
895

896
	if (crtc_state->pipe_bpp > 24)
897
		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
898
	else
899
		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
900

901
	if (crtc_state->has_hdmi_sink)
902
		hdmi_val |= HDMI_MODE_SELECT_HDMI;
903

904
	if (HAS_PCH_CPT(dev_priv))
905
		hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
906
	else if (IS_CHERRYVIEW(dev_priv))
907
		hdmi_val |= SDVO_PIPE_SEL_CHV(crtc->pipe);
908
	else
909
		hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
910

911 912
	I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
	POSTING_READ(intel_hdmi->hdmi_reg);
913 914
}

915 916
static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
				    enum pipe *pipe)
917
{
918
	struct drm_device *dev = encoder->base.dev;
919
	struct drm_i915_private *dev_priv = to_i915(dev);
920 921
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	u32 tmp;
922
	bool ret;
923

924 925
	if (!intel_display_power_get_if_enabled(dev_priv,
						encoder->power_domain))
926 927
		return false;

928 929
	ret = false;

930
	tmp = I915_READ(intel_hdmi->hdmi_reg);
931 932

	if (!(tmp & SDVO_ENABLE))
933
		goto out;
934

935
	if (HAS_PCH_CPT(dev_priv))
936
		*pipe = PORT_TO_PIPE_CPT(tmp);
937
	else if (IS_CHERRYVIEW(dev_priv))
938
		*pipe = SDVO_PORT_TO_PIPE_CHV(tmp);
939 940 941
	else
		*pipe = PORT_TO_PIPE(tmp);

942 943 944
	ret = true;

out:
945
	intel_display_power_put(dev_priv, encoder->power_domain);
946 947

	return ret;
948 949
}

950
static void intel_hdmi_get_config(struct intel_encoder *encoder,
951
				  struct intel_crtc_state *pipe_config)
952 953
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
954
	struct intel_digital_port *intel_dig_port = hdmi_to_dig_port(intel_hdmi);
955
	struct drm_device *dev = encoder->base.dev;
956
	struct drm_i915_private *dev_priv = to_i915(dev);
957
	u32 tmp, flags = 0;
958
	int dotclock;
959

960 961
	pipe_config->output_types |= BIT(INTEL_OUTPUT_HDMI);

962 963 964 965 966 967 968 969 970 971 972 973
	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;

974 975 976
	if (tmp & HDMI_MODE_SELECT_HDMI)
		pipe_config->has_hdmi_sink = true;

977
	if (intel_dig_port->infoframe_enabled(&encoder->base, pipe_config))
978 979
		pipe_config->has_infoframe = true;

980
	if (tmp & SDVO_AUDIO_ENABLE)
981 982
		pipe_config->has_audio = true;

983
	if (!HAS_PCH_SPLIT(dev_priv) &&
984 985 986
	    tmp & HDMI_COLOR_RANGE_16_235)
		pipe_config->limited_color_range = true;

987
	pipe_config->base.adjusted_mode.flags |= flags;
988 989 990 991 992 993

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

994 995 996
	if (pipe_config->pixel_multiplier)
		dotclock /= pipe_config->pixel_multiplier;

997
	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
998 999

	pipe_config->lane_count = 4;
1000 1001
}

1002
static void intel_enable_hdmi_audio(struct intel_encoder *encoder,
1003 1004
				    const struct intel_crtc_state *pipe_config,
				    const struct drm_connector_state *conn_state)
1005
{
1006
	struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
1007

1008
	WARN_ON(!pipe_config->has_hdmi_sink);
1009 1010
	DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
			 pipe_name(crtc->pipe));
1011
	intel_audio_codec_enable(encoder, pipe_config, conn_state);
1012 1013
}

1014
static void g4x_enable_hdmi(struct intel_encoder *encoder,
1015 1016
			    const struct intel_crtc_state *pipe_config,
			    const struct drm_connector_state *conn_state)
1017
{
1018
	struct drm_device *dev = encoder->base.dev;
1019
	struct drm_i915_private *dev_priv = to_i915(dev);
1020
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1021 1022
	u32 temp;

1023
	temp = I915_READ(intel_hdmi->hdmi_reg);
1024

1025
	temp |= SDVO_ENABLE;
1026
	if (pipe_config->has_audio)
1027
		temp |= SDVO_AUDIO_ENABLE;
1028

1029 1030 1031
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);

1032 1033
	if (pipe_config->has_audio)
		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
1034 1035
}

1036
static void ibx_enable_hdmi(struct intel_encoder *encoder,
1037 1038
			    const struct intel_crtc_state *pipe_config,
			    const struct drm_connector_state *conn_state)
1039 1040
{
	struct drm_device *dev = encoder->base.dev;
1041
	struct drm_i915_private *dev_priv = to_i915(dev);
1042 1043 1044 1045
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	u32 temp;

	temp = I915_READ(intel_hdmi->hdmi_reg);
1046

1047
	temp |= SDVO_ENABLE;
1048
	if (pipe_config->has_audio)
1049
		temp |= SDVO_AUDIO_ENABLE;
1050

1051 1052 1053 1054 1055 1056
	/*
	 * 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);
1057 1058
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
1059

1060 1061 1062 1063 1064 1065
	/*
	 * 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.
1066
	 */
1067 1068
	if (pipe_config->pipe_bpp > 24 &&
	    pipe_config->pixel_multiplier > 1) {
1069 1070 1071 1072 1073 1074 1075 1076 1077
		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);
1078 1079
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
1080
	}
1081

1082 1083
	if (pipe_config->has_audio)
		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
1084 1085
}

1086
static void cpt_enable_hdmi(struct intel_encoder *encoder,
1087 1088
			    const struct intel_crtc_state *pipe_config,
			    const struct drm_connector_state *conn_state)
1089 1090
{
	struct drm_device *dev = encoder->base.dev;
1091
	struct drm_i915_private *dev_priv = to_i915(dev);
1092
	struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
1093 1094 1095 1096 1097 1098 1099
	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;
1100
	if (pipe_config->has_audio)
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112
		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
	 */

1113
	if (pipe_config->pipe_bpp > 24) {
1114 1115 1116 1117 1118 1119
		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;
1120
	}
1121 1122 1123 1124

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

1125
	if (pipe_config->pipe_bpp > 24) {
1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136
		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);
	}

1137 1138
	if (pipe_config->has_audio)
		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
1139
}
1140

1141
static void vlv_enable_hdmi(struct intel_encoder *encoder,
1142 1143
			    const struct intel_crtc_state *pipe_config,
			    const struct drm_connector_state *conn_state)
1144
{
1145 1146
}

1147
static void intel_disable_hdmi(struct intel_encoder *encoder,
1148 1149
			       const struct intel_crtc_state *old_crtc_state,
			       const struct drm_connector_state *old_conn_state)
1150 1151
{
	struct drm_device *dev = encoder->base.dev;
1152
	struct drm_i915_private *dev_priv = to_i915(dev);
1153
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1154 1155
	struct intel_digital_port *intel_dig_port =
		hdmi_to_dig_port(intel_hdmi);
1156
	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
1157 1158
	u32 temp;

1159
	temp = I915_READ(intel_hdmi->hdmi_reg);
1160

1161
	temp &= ~(SDVO_ENABLE | SDVO_AUDIO_ENABLE);
1162 1163
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
1164 1165 1166 1167 1168 1169

	/*
	 * 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.
	 */
1170
	if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B) {
1171 1172 1173 1174 1175 1176 1177
		/*
		 * We get CPU/PCH FIFO underruns on the other pipe when
		 * doing the workaround. Sweep them under the rug.
		 */
		intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false);
		intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);

1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
		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);
1192

1193
		intel_wait_for_vblank_if_active(dev_priv, PIPE_A);
1194 1195
		intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
		intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
1196
	}
1197

1198 1199
	intel_dig_port->set_infoframes(&encoder->base, false,
				       old_crtc_state, old_conn_state);
1200 1201

	intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);
1202 1203
}

1204
static void g4x_disable_hdmi(struct intel_encoder *encoder,
1205 1206
			     const struct intel_crtc_state *old_crtc_state,
			     const struct drm_connector_state *old_conn_state)
1207
{
1208
	if (old_crtc_state->has_audio)
1209 1210
		intel_audio_codec_disable(encoder);

1211
	intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
1212 1213
}

1214
static void pch_disable_hdmi(struct intel_encoder *encoder,
1215 1216
			     const struct intel_crtc_state *old_crtc_state,
			     const struct drm_connector_state *old_conn_state)
1217
{
1218
	if (old_crtc_state->has_audio)
1219 1220 1221
		intel_audio_codec_disable(encoder);
}

1222
static void pch_post_disable_hdmi(struct intel_encoder *encoder,
1223 1224
				  const struct intel_crtc_state *old_crtc_state,
				  const struct drm_connector_state *old_conn_state)
1225
{
1226
	intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
1227 1228
}

1229
static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
1230
{
1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	const struct ddi_vbt_port_info *info =
		&dev_priv->vbt.ddi_port_info[encoder->port];
	int max_tmds_clock;

	if (IS_GEMINILAKE(dev_priv))
		max_tmds_clock = 594000;
	else if (INTEL_GEN(dev_priv) >= 8 || IS_HASWELL(dev_priv))
		max_tmds_clock = 300000;
	else if (INTEL_GEN(dev_priv) >= 5)
		max_tmds_clock = 225000;
1242
	else
1243 1244 1245 1246 1247 1248
		max_tmds_clock = 165000;

	if (info->max_tmds_clock)
		max_tmds_clock = min(max_tmds_clock, info->max_tmds_clock);

	return max_tmds_clock;
1249 1250
}

1251
static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
1252 1253
				 bool respect_downstream_limits,
				 bool force_dvi)
1254
{
1255 1256
	struct intel_encoder *encoder = &hdmi_to_dig_port(hdmi)->base;
	int max_tmds_clock = intel_hdmi_source_max_tmds_clock(encoder);
1257 1258

	if (respect_downstream_limits) {
1259 1260 1261
		struct intel_connector *connector = hdmi->attached_connector;
		const struct drm_display_info *info = &connector->base.display_info;

1262 1263 1264
		if (hdmi->dp_dual_mode.max_tmds_clock)
			max_tmds_clock = min(max_tmds_clock,
					     hdmi->dp_dual_mode.max_tmds_clock);
1265 1266 1267 1268

		if (info->max_tmds_clock)
			max_tmds_clock = min(max_tmds_clock,
					     info->max_tmds_clock);
1269
		else if (!hdmi->has_hdmi_sink || force_dvi)
1270 1271 1272 1273 1274 1275
			max_tmds_clock = min(max_tmds_clock, 165000);
	}

	return max_tmds_clock;
}

1276 1277
static enum drm_mode_status
hdmi_port_clock_valid(struct intel_hdmi *hdmi,
1278 1279
		      int clock, bool respect_downstream_limits,
		      bool force_dvi)
1280
{
1281
	struct drm_i915_private *dev_priv = to_i915(intel_hdmi_to_dev(hdmi));
1282 1283 1284

	if (clock < 25000)
		return MODE_CLOCK_LOW;
1285
	if (clock > hdmi_port_clock_limit(hdmi, respect_downstream_limits, force_dvi))
1286 1287
		return MODE_CLOCK_HIGH;

1288
	/* BXT DPLL can't generate 223-240 MHz */
1289
	if (IS_GEN9_LP(dev_priv) && clock > 223333 && clock < 240000)
1290 1291 1292
		return MODE_CLOCK_RANGE;

	/* CHV DPLL can't generate 216-240 MHz */
1293
	if (IS_CHERRYVIEW(dev_priv) && clock > 216000 && clock < 240000)
1294 1295 1296 1297 1298
		return MODE_CLOCK_RANGE;

	return MODE_OK;
}

1299 1300 1301
static enum drm_mode_status
intel_hdmi_mode_valid(struct drm_connector *connector,
		      struct drm_display_mode *mode)
1302
{
1303 1304
	struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
	struct drm_device *dev = intel_hdmi_to_dev(hdmi);
1305
	struct drm_i915_private *dev_priv = to_i915(dev);
1306 1307
	enum drm_mode_status status;
	int clock;
M
Mika Kahola 已提交
1308
	int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
1309 1310
	bool force_dvi =
		READ_ONCE(to_intel_digital_connector_state(connector->state)->force_audio) == HDMI_AUDIO_OFF_DVI;
1311 1312 1313

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

1315
	clock = mode->clock;
M
Mika Kahola 已提交
1316 1317 1318 1319 1320 1321 1322

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

	if (clock > max_dotclk)
		return MODE_CLOCK_HIGH;

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

1326 1327 1328
	if (drm_mode_is_420_only(&connector->display_info, mode))
		clock /= 2;

1329
	/* check if we can do 8bpc */
1330
	status = hdmi_port_clock_valid(hdmi, clock, true, force_dvi);
1331

1332
	/* if we can't do 8bpc we may still be able to do 12bpc */
1333 1334
	if (!HAS_GMCH_DISPLAY(dev_priv) && status != MODE_OK && hdmi->has_hdmi_sink && !force_dvi)
		status = hdmi_port_clock_valid(hdmi, clock * 3 / 2, true, force_dvi);
1335

1336
	return status;
1337 1338
}

1339
static bool hdmi_12bpc_possible(const struct intel_crtc_state *crtc_state)
1340
{
1341 1342 1343 1344 1345 1346
	struct drm_i915_private *dev_priv =
		to_i915(crtc_state->base.crtc->dev);
	struct drm_atomic_state *state = crtc_state->base.state;
	struct drm_connector_state *connector_state;
	struct drm_connector *connector;
	int i;
1347

1348
	if (HAS_GMCH_DISPLAY(dev_priv))
1349 1350
		return false;

1351 1352 1353 1354 1355 1356
	if (crtc_state->pipe_bpp <= 8*3)
		return false;

	if (!crtc_state->has_hdmi_sink)
		return false;

1357 1358 1359 1360
	/*
	 * HDMI 12bpc affects the clocks, so it's only possible
	 * when not cloning with other encoder types.
	 */
1361 1362 1363
	if (crtc_state->output_types != 1 << INTEL_OUTPUT_HDMI)
		return false;

1364
	for_each_new_connector_in_state(state, connector, connector_state, i) {
1365 1366 1367 1368 1369
		const struct drm_display_info *info = &connector->display_info;

		if (connector_state->crtc != crtc_state->base.crtc)
			continue;

1370 1371 1372 1373 1374 1375 1376 1377 1378
		if (crtc_state->ycbcr420) {
			const struct drm_hdmi_info *hdmi = &info->hdmi;

			if (!(hdmi->y420_dc_modes & DRM_EDID_YCBCR420_DC_36))
				return false;
		} else {
			if (!(info->edid_hdmi_dc_modes & DRM_EDID_HDMI_DC_36))
				return false;
		}
1379 1380
	}

1381 1382 1383 1384 1385
	/* Display Wa #1139 */
	if (IS_GLK_REVID(dev_priv, 0, GLK_REVID_A1) &&
	    crtc_state->base.adjusted_mode.htotal > 5460)
		return false;

1386
	return true;
1387 1388
}

1389 1390 1391 1392 1393
static bool
intel_hdmi_ycbcr420_config(struct drm_connector *connector,
			   struct intel_crtc_state *config,
			   int *clock_12bpc, int *clock_8bpc)
{
1394 1395
	struct intel_crtc *intel_crtc = to_intel_crtc(config->base.crtc);

1396 1397 1398 1399 1400 1401 1402 1403 1404 1405
	if (!connector->ycbcr_420_allowed) {
		DRM_ERROR("Platform doesn't support YCBCR420 output\n");
		return false;
	}

	/* YCBCR420 TMDS rate requirement is half the pixel clock */
	config->port_clock /= 2;
	*clock_12bpc /= 2;
	*clock_8bpc /= 2;
	config->ycbcr420 = true;
1406 1407 1408 1409 1410 1411 1412 1413 1414 1415

	/* YCBCR 420 output conversion needs a scaler */
	if (skl_update_scaler_crtc(config)) {
		DRM_DEBUG_KMS("Scaler allocation for output failed\n");
		return false;
	}

	intel_pch_panel_fitting(intel_crtc, config,
				DRM_MODE_SCALE_FULLSCREEN);

1416 1417 1418
	return true;
}

1419
bool intel_hdmi_compute_config(struct intel_encoder *encoder,
1420 1421
			       struct intel_crtc_state *pipe_config,
			       struct drm_connector_state *conn_state)
1422
{
1423
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1424
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1425
	struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
1426 1427
	struct drm_connector *connector = conn_state->connector;
	struct drm_scdc *scdc = &connector->display_info.hdmi.scdc;
1428 1429
	struct intel_digital_connector_state *intel_conn_state =
		to_intel_digital_connector_state(conn_state);
1430 1431
	int clock_8bpc = pipe_config->base.adjusted_mode.crtc_clock;
	int clock_12bpc = clock_8bpc * 3 / 2;
1432
	int desired_bpp;
1433
	bool force_dvi = intel_conn_state->force_audio == HDMI_AUDIO_OFF_DVI;
1434

1435
	pipe_config->has_hdmi_sink = !force_dvi && intel_hdmi->has_hdmi_sink;
1436

1437 1438 1439
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

1440
	if (intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_AUTO) {
1441
		/* See CEA-861-E - 5.1 Default Encoding Parameters */
1442 1443
		pipe_config->limited_color_range =
			pipe_config->has_hdmi_sink &&
1444 1445
			drm_default_rgb_quant_range(adjusted_mode) ==
			HDMI_QUANTIZATION_RANGE_LIMITED;
1446 1447
	} else {
		pipe_config->limited_color_range =
1448
			intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_LIMITED;
1449 1450
	}

1451 1452
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
		pipe_config->pixel_multiplier = 2;
1453
		clock_8bpc *= 2;
1454
		clock_12bpc *= 2;
1455 1456
	}

1457 1458 1459 1460 1461 1462 1463 1464
	if (drm_mode_is_420_only(&connector->display_info, adjusted_mode)) {
		if (!intel_hdmi_ycbcr420_config(connector, pipe_config,
						&clock_12bpc, &clock_8bpc)) {
			DRM_ERROR("Can't support YCBCR420 output\n");
			return false;
		}
	}

1465
	if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv))
1466 1467
		pipe_config->has_pch_encoder = true;

1468 1469 1470 1471 1472 1473 1474
	if (pipe_config->has_hdmi_sink) {
		if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
			pipe_config->has_audio = intel_hdmi->has_audio;
		else
			pipe_config->has_audio =
				intel_conn_state->force_audio == HDMI_AUDIO_ON;
	}
1475

1476 1477 1478
	/*
	 * 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
1479 1480
	 * outputs. We also need to check that the higher clock still fits
	 * within limits.
1481
	 */
1482 1483
	if (hdmi_12bpc_possible(pipe_config) &&
	    hdmi_port_clock_valid(intel_hdmi, clock_12bpc, true, force_dvi) == MODE_OK) {
1484 1485
		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
		desired_bpp = 12*3;
1486 1487

		/* Need to adjust the port link by 1.5x for 12bpc. */
1488
		pipe_config->port_clock = clock_12bpc;
1489
	} else {
1490 1491
		DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
		desired_bpp = 8*3;
1492 1493

		pipe_config->port_clock = clock_8bpc;
1494 1495 1496
	}

	if (!pipe_config->bw_constrained) {
1497
		DRM_DEBUG_KMS("forcing pipe bpp to %i for HDMI\n", desired_bpp);
1498
		pipe_config->pipe_bpp = desired_bpp;
1499 1500
	}

1501
	if (hdmi_port_clock_valid(intel_hdmi, pipe_config->port_clock,
1502
				  false, force_dvi) != MODE_OK) {
1503
		DRM_DEBUG_KMS("unsupported HDMI clock, rejecting mode\n");
1504 1505 1506
		return false;
	}

1507
	/* Set user selected PAR to incoming mode's member */
1508
	adjusted_mode->picture_aspect_ratio = conn_state->picture_aspect_ratio;
1509

1510 1511
	pipe_config->lane_count = 4;

S
Shashank Sharma 已提交
1512 1513 1514 1515 1516 1517 1518 1519 1520 1521
	if (scdc->scrambling.supported && IS_GEMINILAKE(dev_priv)) {
		if (scdc->scrambling.low_rates)
			pipe_config->hdmi_scrambling = true;

		if (pipe_config->port_clock > 340000) {
			pipe_config->hdmi_scrambling = true;
			pipe_config->hdmi_high_tmds_clock_ratio = true;
		}
	}

1522 1523 1524
	return true;
}

1525 1526
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1527
{
1528
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1529

1530 1531 1532 1533
	intel_hdmi->has_hdmi_sink = false;
	intel_hdmi->has_audio = false;
	intel_hdmi->rgb_quant_range_selectable = false;

1534 1535 1536
	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;

1537 1538 1539 1540
	kfree(to_intel_connector(connector)->detect_edid);
	to_intel_connector(connector)->detect_edid = NULL;
}

1541
static void
1542
intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
1543 1544 1545
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
1546
	enum port port = hdmi_to_dig_port(hdmi)->port;
1547 1548 1549 1550
	struct i2c_adapter *adapter =
		intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);
	enum drm_dp_dual_mode_type type = drm_dp_dual_mode_detect(adapter);

1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573
	/*
	 * Type 1 DVI adaptors are not required to implement any
	 * registers, so we can't always detect their presence.
	 * Ideally we should be able to check the state of the
	 * CONFIG1 pin, but no such luck on our hardware.
	 *
	 * The only method left to us is to check the VBT to see
	 * if the port is a dual mode capable DP port. But let's
	 * only do that when we sucesfully read the EDID, to avoid
	 * confusing log messages about DP dual mode adaptors when
	 * there's nothing connected to the port.
	 */
	if (type == DRM_DP_DUAL_MODE_UNKNOWN) {
		if (has_edid &&
		    intel_bios_is_port_dp_dual_mode(dev_priv, port)) {
			DRM_DEBUG_KMS("Assuming DP dual mode adaptor presence based on VBT\n");
			type = DRM_DP_DUAL_MODE_TYPE1_DVI;
		} else {
			type = DRM_DP_DUAL_MODE_NONE;
		}
	}

	if (type == DRM_DP_DUAL_MODE_NONE)
1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584
		return;

	hdmi->dp_dual_mode.type = type;
	hdmi->dp_dual_mode.max_tmds_clock =
		drm_dp_dual_mode_max_tmds_clock(type, adapter);

	DRM_DEBUG_KMS("DP dual mode adaptor (%s) detected (max TMDS clock: %d kHz)\n",
		      drm_dp_get_dual_mode_type_name(type),
		      hdmi->dp_dual_mode.max_tmds_clock);
}

1585
static bool
1586
intel_hdmi_set_edid(struct drm_connector *connector)
1587 1588 1589
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1590
	struct edid *edid;
1591
	bool connected = false;
1592

1593
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1594

1595 1596 1597
	edid = drm_get_edid(connector,
			    intel_gmbus_get_adapter(dev_priv,
			    intel_hdmi->ddc_bus));
1598

1599
	intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
1600

1601
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1602

1603 1604 1605 1606 1607 1608
	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);
1609
		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
1610 1611

		connected = true;
1612 1613
	}

1614 1615 1616
	return connected;
}

1617 1618
static enum drm_connector_status
intel_hdmi_detect(struct drm_connector *connector, bool force)
1619
{
1620 1621
	enum drm_connector_status status;
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1622

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

1626 1627
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);

1628
	intel_hdmi_unset_edid(connector);
1629

1630
	if (intel_hdmi_set_edid(connector))
1631
		status = connector_status_connected;
1632
	else
1633
		status = connector_status_disconnected;
1634

1635 1636
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);

1637
	return status;
1638 1639
}

1640 1641
static void
intel_hdmi_force(struct drm_connector *connector)
1642
{
1643 1644
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);
1645

1646
	intel_hdmi_unset_edid(connector);
1647

1648 1649
	if (connector->status != connector_status_connected)
		return;
1650

1651
	intel_hdmi_set_edid(connector);
1652
}
1653

1654 1655 1656 1657 1658 1659 1660
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;
1661

1662
	return intel_connector_update_modes(connector, edid);
1663 1664
}

1665
static void intel_hdmi_pre_enable(struct intel_encoder *encoder,
1666 1667
				  const struct intel_crtc_state *pipe_config,
				  const struct drm_connector_state *conn_state)
1668
{
1669 1670
	struct intel_digital_port *intel_dig_port =
		enc_to_dig_port(&encoder->base);
1671

1672
	intel_hdmi_prepare(encoder, pipe_config);
1673

1674 1675 1676
	intel_dig_port->set_infoframes(&encoder->base,
				       pipe_config->has_infoframe,
				       pipe_config, conn_state);
1677 1678
}

1679
static void vlv_hdmi_pre_enable(struct intel_encoder *encoder,
1680 1681
				const struct intel_crtc_state *pipe_config,
				const struct drm_connector_state *conn_state)
1682 1683 1684
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_device *dev = encoder->base.dev;
1685
	struct drm_i915_private *dev_priv = to_i915(dev);
1686 1687

	vlv_phy_pre_encoder_enable(encoder);
1688

1689 1690 1691 1692
	/* HDMI 1.0V-2dB */
	vlv_set_phy_signal_level(encoder, 0x2b245f5f, 0x00002000, 0x5578b83a,
				 0x2b247878);

1693 1694 1695
	dport->set_infoframes(&encoder->base,
			      pipe_config->has_infoframe,
			      pipe_config, conn_state);
1696

1697
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1698

1699
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1700 1701
}

1702
static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
1703 1704
				    const struct intel_crtc_state *pipe_config,
				    const struct drm_connector_state *conn_state)
1705
{
1706
	intel_hdmi_prepare(encoder, pipe_config);
1707

1708
	vlv_phy_pre_pll_enable(encoder);
1709 1710
}

1711
static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
1712 1713
				    const struct intel_crtc_state *pipe_config,
				    const struct drm_connector_state *conn_state)
1714
{
1715
	intel_hdmi_prepare(encoder, pipe_config);
1716

1717
	chv_phy_pre_pll_enable(encoder);
1718 1719
}

1720
static void chv_hdmi_post_pll_disable(struct intel_encoder *encoder,
1721 1722
				      const struct intel_crtc_state *old_crtc_state,
				      const struct drm_connector_state *old_conn_state)
1723
{
1724
	chv_phy_post_pll_disable(encoder);
1725 1726
}

1727
static void vlv_hdmi_post_disable(struct intel_encoder *encoder,
1728 1729
				  const struct intel_crtc_state *old_crtc_state,
				  const struct drm_connector_state *old_conn_state)
1730 1731
{
	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
1732
	vlv_phy_reset_lanes(encoder);
1733 1734
}

1735
static void chv_hdmi_post_disable(struct intel_encoder *encoder,
1736 1737
				  const struct intel_crtc_state *old_crtc_state,
				  const struct drm_connector_state *old_conn_state)
1738 1739
{
	struct drm_device *dev = encoder->base.dev;
1740
	struct drm_i915_private *dev_priv = to_i915(dev);
1741

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

1744 1745
	/* Assert data lane reset */
	chv_data_lane_soft_reset(encoder, true);
1746

V
Ville Syrjälä 已提交
1747
	mutex_unlock(&dev_priv->sb_lock);
1748 1749
}

1750
static void chv_hdmi_pre_enable(struct intel_encoder *encoder,
1751 1752
				const struct intel_crtc_state *pipe_config,
				const struct drm_connector_state *conn_state)
1753 1754 1755
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_device *dev = encoder->base.dev;
1756
	struct drm_i915_private *dev_priv = to_i915(dev);
1757

1758
	chv_phy_pre_encoder_enable(encoder);
1759

1760 1761
	/* FIXME: Program the support xxx V-dB */
	/* Use 800mV-0dB */
1762
	chv_set_phy_signal_level(encoder, 128, 102, false);
1763

1764 1765 1766
	dport->set_infoframes(&encoder->base,
			      pipe_config->has_infoframe,
			      pipe_config, conn_state);
1767

1768
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1769

1770
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1771 1772

	/* Second common lane will stay alive on its own now */
1773
	chv_phy_release_cl2_override(encoder);
1774 1775
}

1776 1777
static void intel_hdmi_destroy(struct drm_connector *connector)
{
1778
	kfree(to_intel_connector(connector)->detect_edid);
1779
	drm_connector_cleanup(connector);
1780
	kfree(connector);
1781 1782 1783 1784
}

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
	.detect = intel_hdmi_detect,
1785
	.force = intel_hdmi_force,
1786
	.fill_modes = drm_helper_probe_single_connector_modes,
1787 1788
	.atomic_get_property = intel_digital_connector_atomic_get_property,
	.atomic_set_property = intel_digital_connector_atomic_set_property,
1789
	.late_register = intel_connector_register,
1790
	.early_unregister = intel_connector_unregister,
1791
	.destroy = intel_hdmi_destroy,
1792
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1793
	.atomic_duplicate_state = intel_digital_connector_duplicate_state,
1794 1795 1796 1797 1798
};

static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
	.get_modes = intel_hdmi_get_modes,
	.mode_valid = intel_hdmi_mode_valid,
1799
	.atomic_check = intel_digital_connector_atomic_check,
1800 1801 1802
};

static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
C
Chris Wilson 已提交
1803
	.destroy = intel_encoder_destroy,
1804 1805
};

1806 1807 1808
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1809
	intel_attach_force_audio_property(connector);
1810
	intel_attach_broadcast_rgb_property(connector);
1811
	intel_attach_aspect_ratio_property(connector);
1812
	connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1813 1814
}

S
Shashank Sharma 已提交
1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865
/*
 * intel_hdmi_handle_sink_scrambling: handle sink scrambling/clock ratio setup
 * @encoder: intel_encoder
 * @connector: drm_connector
 * @high_tmds_clock_ratio = bool to indicate if the function needs to set
 *  or reset the high tmds clock ratio for scrambling
 * @scrambling: bool to Indicate if the function needs to set or reset
 *  sink scrambling
 *
 * This function handles scrambling on HDMI 2.0 capable sinks.
 * If required clock rate is > 340 Mhz && scrambling is supported by sink
 * it enables scrambling. This should be called before enabling the HDMI
 * 2.0 port, as the sink can choose to disable the scrambling if it doesn't
 * detect a scrambled clock within 100 ms.
 */
void intel_hdmi_handle_sink_scrambling(struct intel_encoder *encoder,
				       struct drm_connector *connector,
				       bool high_tmds_clock_ratio,
				       bool scrambling)
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
	struct drm_scrambling *sink_scrambling =
				&connector->display_info.hdmi.scdc.scrambling;
	struct i2c_adapter *adptr = intel_gmbus_get_adapter(dev_priv,
							   intel_hdmi->ddc_bus);
	bool ret;

	if (!sink_scrambling->supported)
		return;

	DRM_DEBUG_KMS("Setting sink scrambling for enc:%s connector:%s\n",
		      encoder->base.name, connector->name);

	/* Set TMDS bit clock ratio to 1/40 or 1/10 */
	ret = drm_scdc_set_high_tmds_clock_ratio(adptr, high_tmds_clock_ratio);
	if (!ret) {
		DRM_ERROR("Set TMDS ratio failed\n");
		return;
	}

	/* Enable/disable sink scrambling */
	ret = drm_scdc_set_scrambling(adptr, scrambling);
	if (!ret) {
		DRM_ERROR("Set sink scrambling failed\n");
		return;
	}

	DRM_DEBUG_KMS("sink scrambling handled\n");
}

1866
static u8 chv_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
1867 1868 1869
{
	u8 ddc_pin;

1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883
	switch (port) {
	case PORT_B:
		ddc_pin = GMBUS_PIN_DPB;
		break;
	case PORT_C:
		ddc_pin = GMBUS_PIN_DPC;
		break;
	case PORT_D:
		ddc_pin = GMBUS_PIN_DPD_CHV;
		break;
	default:
		MISSING_CASE(port);
		ddc_pin = GMBUS_PIN_DPB;
		break;
1884
	}
1885 1886 1887 1888 1889 1890
	return ddc_pin;
}

static u8 bxt_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
{
	u8 ddc_pin;
1891 1892 1893

	switch (port) {
	case PORT_B:
1894
		ddc_pin = GMBUS_PIN_1_BXT;
1895 1896
		break;
	case PORT_C:
1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917
		ddc_pin = GMBUS_PIN_2_BXT;
		break;
	default:
		MISSING_CASE(port);
		ddc_pin = GMBUS_PIN_1_BXT;
		break;
	}
	return ddc_pin;
}

static u8 cnp_port_to_ddc_pin(struct drm_i915_private *dev_priv,
			      enum port port)
{
	u8 ddc_pin;

	switch (port) {
	case PORT_B:
		ddc_pin = GMBUS_PIN_1_BXT;
		break;
	case PORT_C:
		ddc_pin = GMBUS_PIN_2_BXT;
1918 1919
		break;
	case PORT_D:
1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943
		ddc_pin = GMBUS_PIN_4_CNP;
		break;
	default:
		MISSING_CASE(port);
		ddc_pin = GMBUS_PIN_1_BXT;
		break;
	}
	return ddc_pin;
}

static u8 g4x_port_to_ddc_pin(struct drm_i915_private *dev_priv,
			      enum port port)
{
	u8 ddc_pin;

	switch (port) {
	case PORT_B:
		ddc_pin = GMBUS_PIN_DPB;
		break;
	case PORT_C:
		ddc_pin = GMBUS_PIN_DPC;
		break;
	case PORT_D:
		ddc_pin = GMBUS_PIN_DPD;
1944 1945 1946 1947 1948 1949
		break;
	default:
		MISSING_CASE(port);
		ddc_pin = GMBUS_PIN_DPB;
		break;
	}
1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973
	return ddc_pin;
}

static u8 intel_hdmi_ddc_pin(struct drm_i915_private *dev_priv,
			     enum port port)
{
	const struct ddi_vbt_port_info *info =
		&dev_priv->vbt.ddi_port_info[port];
	u8 ddc_pin;

	if (info->alternate_ddc_pin) {
		DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (VBT)\n",
			      info->alternate_ddc_pin, port_name(port));
		return info->alternate_ddc_pin;
	}

	if (IS_CHERRYVIEW(dev_priv))
		ddc_pin = chv_port_to_ddc_pin(dev_priv, port);
	else if (IS_GEN9_LP(dev_priv))
		ddc_pin = bxt_port_to_ddc_pin(dev_priv, port);
	else if (HAS_PCH_CNP(dev_priv))
		ddc_pin = cnp_port_to_ddc_pin(dev_priv, port);
	else
		ddc_pin = g4x_port_to_ddc_pin(dev_priv, port);
1974 1975 1976 1977 1978 1979 1980

	DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (platform default)\n",
		      ddc_pin, port_name(port));

	return ddc_pin;
}

1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008
void intel_infoframe_init(struct intel_digital_port *intel_dig_port)
{
	struct drm_i915_private *dev_priv =
		to_i915(intel_dig_port->base.base.dev);

	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
		intel_dig_port->write_infoframe = vlv_write_infoframe;
		intel_dig_port->set_infoframes = vlv_set_infoframes;
		intel_dig_port->infoframe_enabled = vlv_infoframe_enabled;
	} else if (IS_G4X(dev_priv)) {
		intel_dig_port->write_infoframe = g4x_write_infoframe;
		intel_dig_port->set_infoframes = g4x_set_infoframes;
		intel_dig_port->infoframe_enabled = g4x_infoframe_enabled;
	} else if (HAS_DDI(dev_priv)) {
		intel_dig_port->write_infoframe = hsw_write_infoframe;
		intel_dig_port->set_infoframes = hsw_set_infoframes;
		intel_dig_port->infoframe_enabled = hsw_infoframe_enabled;
	} else if (HAS_PCH_IBX(dev_priv)) {
		intel_dig_port->write_infoframe = ibx_write_infoframe;
		intel_dig_port->set_infoframes = ibx_set_infoframes;
		intel_dig_port->infoframe_enabled = ibx_infoframe_enabled;
	} else {
		intel_dig_port->write_infoframe = cpt_write_infoframe;
		intel_dig_port->set_infoframes = cpt_set_infoframes;
		intel_dig_port->infoframe_enabled = cpt_infoframe_enabled;
	}
}

P
Paulo Zanoni 已提交
2009 2010
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
			       struct intel_connector *intel_connector)
2011
{
2012 2013 2014 2015
	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;
2016
	struct drm_i915_private *dev_priv = to_i915(dev);
2017
	enum port port = intel_dig_port->port;
2018

2019 2020 2021
	DRM_DEBUG_KMS("Adding HDMI connector on port %c\n",
		      port_name(port));

2022 2023 2024 2025 2026
	if (WARN(intel_dig_port->max_lanes < 4,
		 "Not enough lanes (%d) for HDMI on port %c\n",
		 intel_dig_port->max_lanes, port_name(port)))
		return;

2027
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
2028
			   DRM_MODE_CONNECTOR_HDMIA);
2029 2030
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

2031
	connector->interlace_allowed = 1;
2032
	connector->doublescan_allowed = 0;
2033
	connector->stereo_allowed = 1;
2034

2035 2036 2037
	if (IS_GEMINILAKE(dev_priv))
		connector->ycbcr_420_allowed = true;

2038 2039
	intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);

2040
	if (WARN_ON(port == PORT_A))
2041
		return;
2042
	intel_encoder->hpd_pin = intel_hpd_pin(port);
2043

2044
	if (HAS_DDI(dev_priv))
2045 2046 2047
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
2048 2049 2050 2051

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
2052
	intel_hdmi->attached_connector = intel_connector;
2053 2054 2055 2056 2057

	/* 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.
	 */
2058
	if (IS_G4X(dev_priv) && !IS_GM45(dev_priv)) {
2059 2060 2061 2062 2063
		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
	}
}

2064
void intel_hdmi_init(struct drm_i915_private *dev_priv,
2065
		     i915_reg_t hdmi_reg, enum port port)
2066 2067 2068 2069 2070
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

2071
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
2072 2073 2074
	if (!intel_dig_port)
		return;

2075
	intel_connector = intel_connector_alloc();
2076 2077 2078 2079 2080 2081 2082
	if (!intel_connector) {
		kfree(intel_dig_port);
		return;
	}

	intel_encoder = &intel_dig_port->base;

2083 2084 2085
	drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
			 &intel_hdmi_enc_funcs, DRM_MODE_ENCODER_TMDS,
			 "HDMI %c", port_name(port));
P
Paulo Zanoni 已提交
2086

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

2117
	intel_encoder->type = INTEL_OUTPUT_HDMI;
2118
	intel_encoder->power_domain = intel_port_to_power_domain(port);
2119
	intel_encoder->port = port;
2120
	if (IS_CHERRYVIEW(dev_priv)) {
2121 2122 2123 2124 2125 2126 2127
		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);
	}
2128
	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
2129 2130 2131 2132 2133
	/*
	 * 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.
	 */
2134
	if (IS_G4X(dev_priv))
2135
		intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
2136

2137
	intel_dig_port->port = port;
2138
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
2139
	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
2140
	intel_dig_port->max_lanes = 4;
2141

2142 2143
	intel_infoframe_init(intel_dig_port);

2144
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2145
}