intel_hdmi.c 63.2 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
	if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->base.port))
190 191 192 193
		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
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;

248
	if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->base.port))
249
		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
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;

365
	if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->base.port))
366
		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->base.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->base.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->base.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,
					  old_crtc_state, old_conn_state);
1211

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

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

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

1231
static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
1232
{
1233 1234 1235 1236 1237
	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;

1238
	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
1239 1240 1241 1242 1243
		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;
1244
	else
1245 1246 1247 1248 1249 1250
		max_tmds_clock = 165000;

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

	return max_tmds_clock;
1251 1252
}

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

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

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

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

	return max_tmds_clock;
}

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

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

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

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

	return MODE_OK;
}

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

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

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

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

	if (clock > max_dotclk)
		return MODE_CLOCK_HIGH;

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

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

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

1334
	/* if we can't do 8bpc we may still be able to do 12bpc */
1335 1336
	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);
1337

1338
	return status;
1339 1340
}

1341
static bool hdmi_12bpc_possible(const struct intel_crtc_state *crtc_state)
1342
{
1343 1344 1345 1346 1347 1348
	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;
1349

1350
	if (HAS_GMCH_DISPLAY(dev_priv))
1351 1352
		return false;

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

	if (!crtc_state->has_hdmi_sink)
		return false;

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

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

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

1372 1373 1374 1375 1376 1377 1378 1379 1380
		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;
		}
1381 1382
	}

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

1388
	return true;
1389 1390
}

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

1398 1399 1400 1401 1402 1403 1404 1405 1406 1407
	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;
1408 1409 1410 1411 1412 1413 1414 1415 1416 1417

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

1418 1419 1420
	return true;
}

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

1437
	pipe_config->has_hdmi_sink = !force_dvi && intel_hdmi->has_hdmi_sink;
1438

1439 1440 1441
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

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

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

1459 1460 1461 1462 1463 1464 1465 1466
	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;
		}
	}

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

1470 1471 1472 1473 1474 1475 1476
	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;
	}
1477

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

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

		pipe_config->port_clock = clock_8bpc;
1496 1497 1498
	}

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

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

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

1512 1513
	pipe_config->lane_count = 4;

1514 1515
	if (scdc->scrambling.supported && (INTEL_GEN(dev_priv) >= 10 ||
					   IS_GEMINILAKE(dev_priv))) {
S
Shashank Sharma 已提交
1516 1517 1518 1519 1520 1521 1522 1523 1524
		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;
		}
	}

1525 1526 1527
	return true;
}

1528 1529
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1530
{
1531
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1532

1533 1534 1535 1536
	intel_hdmi->has_hdmi_sink = false;
	intel_hdmi->has_audio = false;
	intel_hdmi->rgb_quant_range_selectable = false;

1537 1538 1539
	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;

1540 1541 1542 1543
	kfree(to_intel_connector(connector)->detect_edid);
	to_intel_connector(connector)->detect_edid = NULL;
}

1544
static void
1545
intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
1546 1547 1548
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
1549
	enum port port = hdmi_to_dig_port(hdmi)->base.port;
1550 1551 1552 1553
	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);

1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576
	/*
	 * 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)
1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587
		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);
}

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

1596
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1597

1598 1599 1600
	edid = drm_get_edid(connector,
			    intel_gmbus_get_adapter(dev_priv,
			    intel_hdmi->ddc_bus));
1601

1602
	intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
1603

1604
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1605

1606 1607 1608 1609 1610 1611
	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);
1612
		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
1613 1614

		connected = true;
1615 1616
	}

1617 1618 1619
	return connected;
}

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

1626 1627 1628
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);

1629 1630
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);

1631
	intel_hdmi_unset_edid(connector);
1632

1633
	if (intel_hdmi_set_edid(connector))
1634
		status = connector_status_connected;
1635
	else
1636
		status = connector_status_disconnected;
1637

1638 1639
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);

1640
	return status;
1641 1642
}

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

1649
	intel_hdmi_unset_edid(connector);
1650

1651 1652
	if (connector->status != connector_status_connected)
		return;
1653

1654
	intel_hdmi_set_edid(connector);
1655
}
1656

1657 1658 1659 1660 1661 1662 1663
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;
1664

1665
	return intel_connector_update_modes(connector, edid);
1666 1667
}

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

1675
	intel_hdmi_prepare(encoder, pipe_config);
1676

1677 1678 1679
	intel_dig_port->set_infoframes(&encoder->base,
				       pipe_config->has_infoframe,
				       pipe_config, conn_state);
1680 1681
}

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

1689
	vlv_phy_pre_encoder_enable(encoder, pipe_config);
1690

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

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

1699
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1700

1701
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1702 1703
}

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

1710
	vlv_phy_pre_pll_enable(encoder, pipe_config);
1711 1712
}

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

1719
	chv_phy_pre_pll_enable(encoder, pipe_config);
1720 1721
}

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

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

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

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

1746
	/* Assert data lane reset */
1747
	chv_data_lane_soft_reset(encoder, old_crtc_state, true);
1748

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

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

1760
	chv_phy_pre_encoder_enable(encoder, pipe_config);
1761

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

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

1770
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1771

1772
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1773 1774

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

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

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

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

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

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

S
Shashank Sharma 已提交
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 1866 1867
/*
 * 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");
}

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

1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885
	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;
1886
	}
1887 1888 1889 1890 1891 1892
	return ddc_pin;
}

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

	switch (port) {
	case PORT_B:
1896
		ddc_pin = GMBUS_PIN_1_BXT;
1897 1898
		break;
	case PORT_C:
1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919
		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;
1920 1921
		break;
	case PORT_D:
1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945
		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;
1946 1947 1948 1949 1950 1951
		break;
	default:
		MISSING_CASE(port);
		ddc_pin = GMBUS_PIN_DPB;
		break;
	}
1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975
	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);
1976 1977 1978 1979 1980 1981 1982

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

	return ddc_pin;
}

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

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

2024 2025 2026 2027 2028
	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;

2029
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
2030
			   DRM_MODE_CONNECTOR_HDMIA);
2031 2032
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

2033
	connector->interlace_allowed = 1;
2034
	connector->doublescan_allowed = 0;
2035
	connector->stereo_allowed = 1;
2036

2037
	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
2038 2039
		connector->ycbcr_420_allowed = true;

2040 2041
	intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);

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

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

	intel_hdmi_add_properties(intel_hdmi, connector);

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

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

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

2073
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
2074 2075 2076
	if (!intel_dig_port)
		return;

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

	intel_encoder = &intel_dig_port->base;

2085 2086 2087
	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 已提交
2088

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

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

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

2143 2144
	intel_infoframe_init(intel_dig_port);

2145
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2146
}