intel_hdmi.c 64.3 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
					   crtc_state->limited_color_range ?
					   HDMI_QUANTIZATION_RANGE_LIMITED :
					   HDMI_QUANTIZATION_RANGE_FULL,
490 491
					   intel_hdmi->rgb_quant_range_selectable,
					   is_hdmi2_sink);
492

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

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

509
	frame.spd.sdi = HDMI_SPD_SDI_PC;
510

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

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

	ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi,
523
							  conn_state->connector,
524
							  &crtc_state->base.adjusted_mode);
525 526 527
	if (ret < 0)
		return;

528
	intel_write_infoframe(encoder, crtc_state, &frame);
529 530
}

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

543 544
	assert_hdmi_port_disabled(intel_hdmi);

545 546 547 548 549 550 551 552 553 554 555
	/* 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;

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

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

581
	val |= VIDEO_DIP_ENABLE;
582 583
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
584

585
	I915_WRITE(reg, val);
586
	POSTING_READ(reg);
587

588 589
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
590
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
591 592
}

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

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

603
	return connector->display_info.bpc > 8;
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 646 647 648
/*
 * 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);
}

649 650 651
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)
652
{
653
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
654
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
655 656
	i915_reg_t reg;
	u32 val = 0;
657 658

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

	/* Indicate color depth whenever the sink supports deep color */
668
	if (hdmi_sink_is_deep_color(conn_state))
669 670
		val |= GCP_COLOR_INDICATION;

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

676 677 678 679 680
	I915_WRITE(reg, val);

	return val != 0;
}

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

694 695
	assert_hdmi_port_disabled(intel_hdmi);

696 697 698
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

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

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

718
	val |= VIDEO_DIP_ENABLE;
719 720 721
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
722

723
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
724 725
		val |= VIDEO_DIP_ENABLE_GCP;

726
	I915_WRITE(reg, val);
727
	POSTING_READ(reg);
728

729 730
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
731
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
732 733 734
}

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

745 746
	assert_hdmi_port_disabled(intel_hdmi);

747 748 749
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

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

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

766
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
767 768
		val |= VIDEO_DIP_ENABLE_GCP;

769
	I915_WRITE(reg, val);
770
	POSTING_READ(reg);
771

772 773
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
774
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
775 776 777
}

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

790 791
	assert_hdmi_port_disabled(intel_hdmi);

792 793 794
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

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

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

814
	val |= VIDEO_DIP_ENABLE;
815 816 817
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
818

819
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
820 821
		val |= VIDEO_DIP_ENABLE_GCP;

822
	I915_WRITE(reg, val);
823
	POSTING_READ(reg);
824

825 826
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
827
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
828 829 830
}

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

840 841
	assert_hdmi_port_disabled(intel_hdmi);

842 843 844 845
	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);

846
	if (!enable) {
847
		I915_WRITE(reg, val);
848
		POSTING_READ(reg);
849 850 851
		return;
	}

852
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
853 854
		val |= VIDEO_DIP_ENABLE_GCP_HSW;

855
	I915_WRITE(reg, val);
856
	POSTING_READ(reg);
857

858 859
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
860
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
861 862
}

863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878
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);
}

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

889 890
	intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);

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

899
	if (crtc_state->pipe_bpp > 24)
900
		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
901
	else
902
		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
903

904
	if (crtc_state->has_hdmi_sink)
905
		hdmi_val |= HDMI_MODE_SELECT_HDMI;
906

907
	if (HAS_PCH_CPT(dev_priv))
908
		hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
909
	else if (IS_CHERRYVIEW(dev_priv))
910
		hdmi_val |= SDVO_PIPE_SEL_CHV(crtc->pipe);
911
	else
912
		hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
913

914 915
	I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
	POSTING_READ(intel_hdmi->hdmi_reg);
916 917
}

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

927 928
	if (!intel_display_power_get_if_enabled(dev_priv,
						encoder->power_domain))
929 930
		return false;

931 932
	ret = false;

933
	tmp = I915_READ(intel_hdmi->hdmi_reg);
934 935

	if (!(tmp & SDVO_ENABLE))
936
		goto out;
937

938
	if (HAS_PCH_CPT(dev_priv))
939
		*pipe = PORT_TO_PIPE_CPT(tmp);
940
	else if (IS_CHERRYVIEW(dev_priv))
941
		*pipe = SDVO_PORT_TO_PIPE_CHV(tmp);
942 943 944
	else
		*pipe = PORT_TO_PIPE(tmp);

945 946 947
	ret = true;

out:
948
	intel_display_power_put(dev_priv, encoder->power_domain);
949 950

	return ret;
951 952
}

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

963 964
	pipe_config->output_types |= BIT(INTEL_OUTPUT_HDMI);

965 966 967 968 969 970 971 972 973 974 975 976
	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;

977 978 979
	if (tmp & HDMI_MODE_SELECT_HDMI)
		pipe_config->has_hdmi_sink = true;

980
	if (intel_dig_port->infoframe_enabled(&encoder->base, pipe_config))
981 982
		pipe_config->has_infoframe = true;

983
	if (tmp & SDVO_AUDIO_ENABLE)
984 985
		pipe_config->has_audio = true;

986
	if (!HAS_PCH_SPLIT(dev_priv) &&
987 988 989
	    tmp & HDMI_COLOR_RANGE_16_235)
		pipe_config->limited_color_range = true;

990
	pipe_config->base.adjusted_mode.flags |= flags;
991 992 993 994 995 996

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

997 998 999
	if (pipe_config->pixel_multiplier)
		dotclock /= pipe_config->pixel_multiplier;

1000
	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
1001 1002

	pipe_config->lane_count = 4;
1003 1004
}

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

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

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

1026
	temp = I915_READ(intel_hdmi->hdmi_reg);
1027

1028
	temp |= SDVO_ENABLE;
1029
	if (pipe_config->has_audio)
1030
		temp |= SDVO_AUDIO_ENABLE;
1031

1032 1033 1034
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);

1035 1036
	if (pipe_config->has_audio)
		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
1037 1038
}

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

	temp = I915_READ(intel_hdmi->hdmi_reg);
1049

1050
	temp |= SDVO_ENABLE;
1051
	if (pipe_config->has_audio)
1052
		temp |= SDVO_AUDIO_ENABLE;
1053

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

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

1085 1086
	if (pipe_config->has_audio)
		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
1087 1088
}

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

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

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

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

1140 1141
	if (pipe_config->has_audio)
		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
1142
}
1143

1144
static void vlv_enable_hdmi(struct intel_encoder *encoder,
1145 1146
			    const struct intel_crtc_state *pipe_config,
			    const struct drm_connector_state *conn_state)
1147
{
1148 1149
}

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

1162
	temp = I915_READ(intel_hdmi->hdmi_reg);
1163

1164
	temp &= ~(SDVO_ENABLE | SDVO_AUDIO_ENABLE);
1165 1166
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
1167 1168 1169 1170 1171 1172

	/*
	 * 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.
	 */
1173
	if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B) {
1174 1175 1176 1177 1178 1179 1180
		/*
		 * 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);

1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194
		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);
1195

1196
		intel_wait_for_vblank_if_active(dev_priv, PIPE_A);
1197 1198
		intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
		intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
1199
	}
1200

1201 1202
	intel_dig_port->set_infoframes(&encoder->base, false,
				       old_crtc_state, old_conn_state);
1203 1204

	intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);
1205 1206
}

1207
static void g4x_disable_hdmi(struct intel_encoder *encoder,
1208 1209
			     const struct intel_crtc_state *old_crtc_state,
			     const struct drm_connector_state *old_conn_state)
1210
{
1211
	if (old_crtc_state->has_audio)
1212 1213
		intel_audio_codec_disable(encoder,
					  old_crtc_state, old_conn_state);
1214

1215
	intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
1216 1217
}

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

1227
static void pch_post_disable_hdmi(struct intel_encoder *encoder,
1228 1229
				  const struct intel_crtc_state *old_crtc_state,
				  const struct drm_connector_state *old_conn_state)
1230
{
1231
	intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
1232 1233
}

1234
static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
1235
{
1236 1237 1238 1239 1240
	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;

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

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

	return max_tmds_clock;
1254 1255
}

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

	if (respect_downstream_limits) {
1264 1265 1266
		struct intel_connector *connector = hdmi->attached_connector;
		const struct drm_display_info *info = &connector->base.display_info;

1267 1268 1269
		if (hdmi->dp_dual_mode.max_tmds_clock)
			max_tmds_clock = min(max_tmds_clock,
					     hdmi->dp_dual_mode.max_tmds_clock);
1270 1271 1272 1273

		if (info->max_tmds_clock)
			max_tmds_clock = min(max_tmds_clock,
					     info->max_tmds_clock);
1274
		else if (!hdmi->has_hdmi_sink || force_dvi)
1275 1276 1277 1278 1279 1280
			max_tmds_clock = min(max_tmds_clock, 165000);
	}

	return max_tmds_clock;
}

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

	if (clock < 25000)
		return MODE_CLOCK_LOW;
1290
	if (clock > hdmi_port_clock_limit(hdmi, respect_downstream_limits, force_dvi))
1291 1292
		return MODE_CLOCK_HIGH;

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

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

	return MODE_OK;
}

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

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

1320
	clock = mode->clock;
M
Mika Kahola 已提交
1321 1322 1323 1324 1325 1326 1327

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

	if (clock > max_dotclk)
		return MODE_CLOCK_HIGH;

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

1331 1332 1333
	if (drm_mode_is_420_only(&connector->display_info, mode))
		clock /= 2;

1334
	/* check if we can do 8bpc */
1335
	status = hdmi_port_clock_valid(hdmi, clock, true, force_dvi);
1336

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

1341
	return status;
1342 1343
}

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

1353
	if (HAS_GMCH_DISPLAY(dev_priv))
1354 1355
		return false;

1356 1357 1358 1359 1360 1361
	if (crtc_state->pipe_bpp <= 8*3)
		return false;

	if (!crtc_state->has_hdmi_sink)
		return false;

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

1369
	for_each_new_connector_in_state(state, connector, connector_state, i) {
1370 1371 1372 1373 1374
		const struct drm_display_info *info = &connector->display_info;

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

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

L
Lucas De Marchi 已提交
1386
	/* Display WA #1139: glk */
1387 1388 1389 1390
	if (IS_GLK_REVID(dev_priv, 0, GLK_REVID_A1) &&
	    crtc_state->base.adjusted_mode.htotal > 5460)
		return false;

1391
	return true;
1392 1393
}

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

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

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

1421 1422 1423
	return true;
}

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

1440
	pipe_config->has_hdmi_sink = !force_dvi && intel_hdmi->has_hdmi_sink;
1441

1442 1443 1444
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

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

1456 1457
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
		pipe_config->pixel_multiplier = 2;
1458
		clock_8bpc *= 2;
1459
		clock_12bpc *= 2;
1460 1461
	}

1462 1463 1464 1465 1466 1467 1468 1469
	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;
		}
	}

1470
	if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv))
1471 1472
		pipe_config->has_pch_encoder = true;

1473 1474 1475 1476 1477 1478 1479
	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;
	}
1480

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

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

		pipe_config->port_clock = clock_8bpc;
1499 1500 1501
	}

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

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

1512
	/* Set user selected PAR to incoming mode's member */
1513
	adjusted_mode->picture_aspect_ratio = conn_state->picture_aspect_ratio;
1514

1515 1516
	pipe_config->lane_count = 4;

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

1528 1529 1530
	return true;
}

1531 1532
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1533
{
1534
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1535

1536 1537 1538 1539
	intel_hdmi->has_hdmi_sink = false;
	intel_hdmi->has_audio = false;
	intel_hdmi->rgb_quant_range_selectable = false;

1540 1541 1542
	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;

1543 1544 1545 1546
	kfree(to_intel_connector(connector)->detect_edid);
	to_intel_connector(connector)->detect_edid = NULL;
}

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

1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569
	/*
	 * 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) {
1570 1571 1572 1573
		/* An overridden EDID imply that we want this port for testing.
		 * Make sure not to set limits for that port.
		 */
		if (has_edid && !connector->override_edid &&
1574 1575 1576 1577 1578 1579 1580 1581 1582
		    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)
1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593
		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);
}

1594
static bool
1595
intel_hdmi_set_edid(struct drm_connector *connector)
1596 1597 1598
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1599
	struct edid *edid;
1600
	bool connected = false;
1601
	struct i2c_adapter *i2c;
1602

1603
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1604

1605 1606 1607 1608 1609 1610 1611 1612 1613 1614
	i2c = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);

	edid = drm_get_edid(connector, i2c);

	if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
		DRM_DEBUG_KMS("HDMI GMBUS EDID read failed, retry using GPIO bit-banging\n");
		intel_gmbus_force_bit(i2c, true);
		edid = drm_get_edid(connector, i2c);
		intel_gmbus_force_bit(i2c, false);
	}
1615

1616
	intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
1617

1618
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1619

1620 1621 1622 1623 1624 1625
	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);
1626
		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
1627 1628

		connected = true;
1629 1630
	}

1631 1632 1633
	return connected;
}

1634 1635
static enum drm_connector_status
intel_hdmi_detect(struct drm_connector *connector, bool force)
1636
{
1637 1638
	enum drm_connector_status status;
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1639

1640 1641 1642
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);

1643 1644
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);

1645
	intel_hdmi_unset_edid(connector);
1646

1647
	if (intel_hdmi_set_edid(connector))
1648
		status = connector_status_connected;
1649
	else
1650
		status = connector_status_disconnected;
1651

1652 1653
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);

1654
	return status;
1655 1656
}

1657 1658
static void
intel_hdmi_force(struct drm_connector *connector)
1659
{
1660 1661
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);
1662

1663
	intel_hdmi_unset_edid(connector);
1664

1665 1666
	if (connector->status != connector_status_connected)
		return;
1667

1668
	intel_hdmi_set_edid(connector);
1669
}
1670

1671 1672 1673 1674 1675 1676 1677
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;
1678

1679
	return intel_connector_update_modes(connector, edid);
1680 1681
}

1682
static void intel_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 1687
	struct intel_digital_port *intel_dig_port =
		enc_to_dig_port(&encoder->base);
1688

1689
	intel_hdmi_prepare(encoder, pipe_config);
1690

1691 1692 1693
	intel_dig_port->set_infoframes(&encoder->base,
				       pipe_config->has_infoframe,
				       pipe_config, conn_state);
1694 1695
}

1696
static void vlv_hdmi_pre_enable(struct intel_encoder *encoder,
1697 1698
				const struct intel_crtc_state *pipe_config,
				const struct drm_connector_state *conn_state)
1699 1700
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1701
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1702

1703
	vlv_phy_pre_encoder_enable(encoder, pipe_config);
1704

1705 1706 1707 1708
	/* HDMI 1.0V-2dB */
	vlv_set_phy_signal_level(encoder, 0x2b245f5f, 0x00002000, 0x5578b83a,
				 0x2b247878);

1709 1710 1711
	dport->set_infoframes(&encoder->base,
			      pipe_config->has_infoframe,
			      pipe_config, conn_state);
1712

1713
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1714

1715
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1716 1717
}

1718
static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
1719 1720
				    const struct intel_crtc_state *pipe_config,
				    const struct drm_connector_state *conn_state)
1721
{
1722
	intel_hdmi_prepare(encoder, pipe_config);
1723

1724
	vlv_phy_pre_pll_enable(encoder, pipe_config);
1725 1726
}

1727
static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
1728 1729
				    const struct intel_crtc_state *pipe_config,
				    const struct drm_connector_state *conn_state)
1730
{
1731
	intel_hdmi_prepare(encoder, pipe_config);
1732

1733
	chv_phy_pre_pll_enable(encoder, pipe_config);
1734 1735
}

1736
static void chv_hdmi_post_pll_disable(struct intel_encoder *encoder,
1737 1738
				      const struct intel_crtc_state *old_crtc_state,
				      const struct drm_connector_state *old_conn_state)
1739
{
1740
	chv_phy_post_pll_disable(encoder, old_crtc_state);
1741 1742
}

1743
static void vlv_hdmi_post_disable(struct intel_encoder *encoder,
1744 1745
				  const struct intel_crtc_state *old_crtc_state,
				  const struct drm_connector_state *old_conn_state)
1746 1747
{
	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
1748
	vlv_phy_reset_lanes(encoder, old_crtc_state);
1749 1750
}

1751
static void chv_hdmi_post_disable(struct intel_encoder *encoder,
1752 1753
				  const struct intel_crtc_state *old_crtc_state,
				  const struct drm_connector_state *old_conn_state)
1754 1755
{
	struct drm_device *dev = encoder->base.dev;
1756
	struct drm_i915_private *dev_priv = to_i915(dev);
1757

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

1760
	/* Assert data lane reset */
1761
	chv_data_lane_soft_reset(encoder, old_crtc_state, true);
1762

V
Ville Syrjälä 已提交
1763
	mutex_unlock(&dev_priv->sb_lock);
1764 1765
}

1766
static void chv_hdmi_pre_enable(struct intel_encoder *encoder,
1767 1768
				const struct intel_crtc_state *pipe_config,
				const struct drm_connector_state *conn_state)
1769 1770 1771
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
	struct drm_device *dev = encoder->base.dev;
1772
	struct drm_i915_private *dev_priv = to_i915(dev);
1773

1774
	chv_phy_pre_encoder_enable(encoder, pipe_config);
1775

1776 1777
	/* FIXME: Program the support xxx V-dB */
	/* Use 800mV-0dB */
1778
	chv_set_phy_signal_level(encoder, 128, 102, false);
1779

1780 1781 1782
	dport->set_infoframes(&encoder->base,
			      pipe_config->has_infoframe,
			      pipe_config, conn_state);
1783

1784
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1785

1786
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1787 1788

	/* Second common lane will stay alive on its own now */
1789
	chv_phy_release_cl2_override(encoder);
1790 1791
}

1792 1793
static void intel_hdmi_destroy(struct drm_connector *connector)
{
1794
	kfree(to_intel_connector(connector)->detect_edid);
1795
	drm_connector_cleanup(connector);
1796
	kfree(connector);
1797 1798 1799 1800
}

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
	.detect = intel_hdmi_detect,
1801
	.force = intel_hdmi_force,
1802
	.fill_modes = drm_helper_probe_single_connector_modes,
1803 1804
	.atomic_get_property = intel_digital_connector_atomic_get_property,
	.atomic_set_property = intel_digital_connector_atomic_set_property,
1805
	.late_register = intel_connector_register,
1806
	.early_unregister = intel_connector_unregister,
1807
	.destroy = intel_hdmi_destroy,
1808
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1809
	.atomic_duplicate_state = intel_digital_connector_duplicate_state,
1810 1811 1812 1813 1814
};

static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
	.get_modes = intel_hdmi_get_modes,
	.mode_valid = intel_hdmi_mode_valid,
1815
	.atomic_check = intel_digital_connector_atomic_check,
1816 1817 1818
};

static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
C
Chris Wilson 已提交
1819
	.destroy = intel_encoder_destroy,
1820 1821
};

1822 1823 1824
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1825
	intel_attach_force_audio_property(connector);
1826
	intel_attach_broadcast_rgb_property(connector);
1827
	intel_attach_aspect_ratio_property(connector);
1828
	connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1829 1830
}

S
Shashank Sharma 已提交
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 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881
/*
 * 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");
}

1882
static u8 chv_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
1883 1884 1885
{
	u8 ddc_pin;

1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899
	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;
1900
	}
1901 1902 1903 1904 1905 1906
	return ddc_pin;
}

static u8 bxt_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
{
	u8 ddc_pin;
1907 1908 1909

	switch (port) {
	case PORT_B:
1910
		ddc_pin = GMBUS_PIN_1_BXT;
1911 1912
		break;
	case PORT_C:
1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933
		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;
1934 1935
		break;
	case PORT_D:
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;
}

1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976
static u8 icl_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
{
	u8 ddc_pin;

	switch (port) {
	case PORT_A:
		ddc_pin = GMBUS_PIN_1_BXT;
		break;
	case PORT_B:
		ddc_pin = GMBUS_PIN_2_BXT;
		break;
	case PORT_C:
		ddc_pin = GMBUS_PIN_9_TC1_ICP;
		break;
	case PORT_D:
		ddc_pin = GMBUS_PIN_10_TC2_ICP;
		break;
	case PORT_E:
		ddc_pin = GMBUS_PIN_11_TC3_ICP;
		break;
	case PORT_F:
		ddc_pin = GMBUS_PIN_12_TC4_ICP;
		break;
	default:
		MISSING_CASE(port);
		ddc_pin = GMBUS_PIN_2_BXT;
		break;
	}
	return ddc_pin;
}

1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990
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;
1991 1992 1993 1994 1995 1996
		break;
	default:
		MISSING_CASE(port);
		ddc_pin = GMBUS_PIN_DPB;
		break;
	}
1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
	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);
2019 2020
	else if (IS_ICELAKE(dev_priv))
		ddc_pin = icl_port_to_ddc_pin(dev_priv, port);
2021 2022
	else
		ddc_pin = g4x_port_to_ddc_pin(dev_priv, port);
2023 2024 2025 2026 2027 2028 2029

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

	return ddc_pin;
}

2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057
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 已提交
2058 2059
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
			       struct intel_connector *intel_connector)
2060
{
2061 2062 2063 2064
	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;
2065
	struct drm_i915_private *dev_priv = to_i915(dev);
2066
	enum port port = intel_encoder->port;
2067

2068 2069 2070
	DRM_DEBUG_KMS("Adding HDMI connector on port %c\n",
		      port_name(port));

2071 2072 2073 2074 2075
	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;

2076
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
2077
			   DRM_MODE_CONNECTOR_HDMIA);
2078 2079
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

2080
	connector->interlace_allowed = 1;
2081
	connector->doublescan_allowed = 0;
2082
	connector->stereo_allowed = 1;
2083

2084
	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
2085 2086
		connector->ycbcr_420_allowed = true;

2087 2088
	intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);

2089
	if (WARN_ON(port == PORT_A))
2090
		return;
2091
	intel_encoder->hpd_pin = intel_hpd_pin(port);
2092

2093
	if (HAS_DDI(dev_priv))
2094 2095 2096
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
2097 2098 2099 2100

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
2101
	intel_hdmi->attached_connector = intel_connector;
2102 2103 2104 2105 2106

	/* 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.
	 */
2107
	if (IS_G4X(dev_priv) && !IS_GM45(dev_priv)) {
2108 2109 2110 2111 2112
		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
	}
}

2113
void intel_hdmi_init(struct drm_i915_private *dev_priv,
2114
		     i915_reg_t hdmi_reg, enum port port)
2115 2116 2117 2118 2119
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

2120
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
2121 2122 2123
	if (!intel_dig_port)
		return;

2124
	intel_connector = intel_connector_alloc();
2125 2126 2127 2128 2129 2130 2131
	if (!intel_connector) {
		kfree(intel_dig_port);
		return;
	}

	intel_encoder = &intel_dig_port->base;

2132 2133 2134
	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 已提交
2135

2136
	intel_encoder->compute_config = intel_hdmi_compute_config;
2137
	if (HAS_PCH_SPLIT(dev_priv)) {
2138 2139 2140 2141 2142
		intel_encoder->disable = pch_disable_hdmi;
		intel_encoder->post_disable = pch_post_disable_hdmi;
	} else {
		intel_encoder->disable = g4x_disable_hdmi;
	}
P
Paulo Zanoni 已提交
2143
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
2144
	intel_encoder->get_config = intel_hdmi_get_config;
2145
	if (IS_CHERRYVIEW(dev_priv)) {
2146
		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
2147 2148
		intel_encoder->pre_enable = chv_hdmi_pre_enable;
		intel_encoder->enable = vlv_enable_hdmi;
2149
		intel_encoder->post_disable = chv_hdmi_post_disable;
2150
		intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable;
2151
	} else if (IS_VALLEYVIEW(dev_priv)) {
2152 2153
		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
2154
		intel_encoder->enable = vlv_enable_hdmi;
2155
		intel_encoder->post_disable = vlv_hdmi_post_disable;
2156
	} else {
2157
		intel_encoder->pre_enable = intel_hdmi_pre_enable;
2158
		if (HAS_PCH_CPT(dev_priv))
2159
			intel_encoder->enable = cpt_enable_hdmi;
2160
		else if (HAS_PCH_IBX(dev_priv))
2161
			intel_encoder->enable = ibx_enable_hdmi;
2162
		else
2163
			intel_encoder->enable = g4x_enable_hdmi;
2164
	}
2165

2166
	intel_encoder->type = INTEL_OUTPUT_HDMI;
2167
	intel_encoder->power_domain = intel_port_to_power_domain(port);
2168
	intel_encoder->port = port;
2169
	if (IS_CHERRYVIEW(dev_priv)) {
2170 2171 2172 2173 2174 2175 2176
		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);
	}
2177
	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
2178 2179 2180 2181 2182
	/*
	 * 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.
	 */
2183
	if (IS_G4X(dev_priv))
2184
		intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
2185

2186
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
2187
	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
2188
	intel_dig_port->max_lanes = 4;
2189

2190 2191
	intel_infoframe_init(intel_dig_port);

2192
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2193
}