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

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

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

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

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

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

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

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

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

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

102
static u32 hsw_infoframe_enable(enum hdmi_infoframe_type type)
103
{
104 105
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
106
		return VIDEO_DIP_ENABLE_AVI_HSW;
107
	case HDMI_INFOFRAME_TYPE_SPD:
108
		return VIDEO_DIP_ENABLE_SPD_HSW;
109 110
	case HDMI_INFOFRAME_TYPE_VENDOR:
		return VIDEO_DIP_ENABLE_VS_HSW;
111
	default:
112
		MISSING_CASE(type);
113 114 115 116
		return 0;
	}
}

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

136
static void g4x_write_infoframe(struct drm_encoder *encoder,
137
				const struct intel_crtc_state *crtc_state,
138
				enum hdmi_infoframe_type type,
139
				const void *frame, ssize_t len)
140
{
141
	const uint32_t *data = frame;
142
	struct drm_device *dev = encoder->dev;
143
	struct drm_i915_private *dev_priv = to_i915(dev);
144
	u32 val = I915_READ(VIDEO_DIP_CTL);
145
	int i;
146

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

149
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
150
	val |= g4x_infoframe_index(type);
151

152
	val &= ~g4x_infoframe_enable(type);
153

154
	I915_WRITE(VIDEO_DIP_CTL, val);
155

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

166
	val |= g4x_infoframe_enable(type);
167
	val &= ~VIDEO_DIP_FREQ_MASK;
168
	val |= VIDEO_DIP_FREQ_VSYNC;
169

170
	I915_WRITE(VIDEO_DIP_CTL, val);
171
	POSTING_READ(VIDEO_DIP_CTL);
172 173
}

174 175
static bool g4x_infoframe_enabled(struct drm_encoder *encoder,
				  const struct intel_crtc_state *pipe_config)
176
{
177
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
178
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
179 180
	u32 val = I915_READ(VIDEO_DIP_CTL);

181 182
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;
183

184 185 186 187 188
	if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->port))
		return false;

	return val & (VIDEO_DIP_ENABLE_AVI |
		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
189 190
}

191
static void ibx_write_infoframe(struct drm_encoder *encoder,
192
				const struct intel_crtc_state *crtc_state,
193
				enum hdmi_infoframe_type type,
194
				const void *frame, ssize_t len)
195
{
196
	const uint32_t *data = frame;
197
	struct drm_device *dev = encoder->dev;
198
	struct drm_i915_private *dev_priv = to_i915(dev);
199
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
200
	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
201
	u32 val = I915_READ(reg);
202
	int i;
203

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

206
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
207
	val |= g4x_infoframe_index(type);
208

209
	val &= ~g4x_infoframe_enable(type);
210 211 212

	I915_WRITE(reg, val);

213
	mmiowb();
214 215 216 217
	for (i = 0; i < len; i += 4) {
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
218 219 220
	/* 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);
221
	mmiowb();
222

223
	val |= g4x_infoframe_enable(type);
224
	val &= ~VIDEO_DIP_FREQ_MASK;
225
	val |= VIDEO_DIP_FREQ_VSYNC;
226 227

	I915_WRITE(reg, val);
228
	POSTING_READ(reg);
229 230
}

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

240 241 242 243 244
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;

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

246 247 248
	return val & (VIDEO_DIP_ENABLE_AVI |
		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
249 250
}

251
static void cpt_write_infoframe(struct drm_encoder *encoder,
252
				const struct intel_crtc_state *crtc_state,
253
				enum hdmi_infoframe_type type,
254
				const void *frame, ssize_t len)
255
{
256
	const uint32_t *data = frame;
257
	struct drm_device *dev = encoder->dev;
258
	struct drm_i915_private *dev_priv = to_i915(dev);
259
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
260
	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
261
	u32 val = I915_READ(reg);
262
	int i;
263

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

266
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
267
	val |= g4x_infoframe_index(type);
268

269 270
	/* The DIP control register spec says that we need to update the AVI
	 * infoframe without clearing its enable bit */
271 272
	if (type != HDMI_INFOFRAME_TYPE_AVI)
		val &= ~g4x_infoframe_enable(type);
273

274
	I915_WRITE(reg, val);
275

276
	mmiowb();
277
	for (i = 0; i < len; i += 4) {
278 279 280
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
281 282 283
	/* 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);
284
	mmiowb();
285

286
	val |= g4x_infoframe_enable(type);
287
	val &= ~VIDEO_DIP_FREQ_MASK;
288
	val |= VIDEO_DIP_FREQ_VSYNC;
289

290
	I915_WRITE(reg, val);
291
	POSTING_READ(reg);
292
}
293

294 295
static bool cpt_infoframe_enabled(struct drm_encoder *encoder,
				  const struct intel_crtc_state *pipe_config)
296
{
297 298 299
	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));
300

301 302 303 304 305 306
	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);
307 308
}

309
static void vlv_write_infoframe(struct drm_encoder *encoder,
310
				const struct intel_crtc_state *crtc_state,
311
				enum hdmi_infoframe_type type,
312
				const void *frame, ssize_t len)
313
{
314
	const uint32_t *data = frame;
315
	struct drm_device *dev = encoder->dev;
316
	struct drm_i915_private *dev_priv = to_i915(dev);
317
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
318
	i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
319
	u32 val = I915_READ(reg);
320
	int i;
321

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

324
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
325
	val |= g4x_infoframe_index(type);
326

327
	val &= ~g4x_infoframe_enable(type);
328

329
	I915_WRITE(reg, val);
330

331
	mmiowb();
332 333 334 335
	for (i = 0; i < len; i += 4) {
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
336 337 338
	/* 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);
339
	mmiowb();
340

341
	val |= g4x_infoframe_enable(type);
342
	val &= ~VIDEO_DIP_FREQ_MASK;
343
	val |= VIDEO_DIP_FREQ_VSYNC;
344

345
	I915_WRITE(reg, val);
346
	POSTING_READ(reg);
347 348
}

349 350
static bool vlv_infoframe_enabled(struct drm_encoder *encoder,
				  const struct intel_crtc_state *pipe_config)
351
{
352
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
353
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
354 355
	enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe;
	u32 val = I915_READ(VLV_TVIDEO_DIP_CTL(pipe));
356

357 358 359 360 361
	if ((val & VIDEO_DIP_ENABLE) == 0)
		return false;

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

363 364 365
	return val & (VIDEO_DIP_ENABLE_AVI |
		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
366 367
}

368
static void hsw_write_infoframe(struct drm_encoder *encoder,
369
				const struct intel_crtc_state *crtc_state,
370
				enum hdmi_infoframe_type type,
371
				const void *frame, ssize_t len)
372
{
373
	const uint32_t *data = frame;
374
	struct drm_device *dev = encoder->dev;
375
	struct drm_i915_private *dev_priv = to_i915(dev);
376
	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
377 378
	i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder);
	i915_reg_t data_reg;
379
	int i;
380
	u32 val = I915_READ(ctl_reg);
381

382
	data_reg = hsw_dip_data_reg(dev_priv, cpu_transcoder, type, 0);
383

384
	val &= ~hsw_infoframe_enable(type);
385 386
	I915_WRITE(ctl_reg, val);

387
	mmiowb();
388
	for (i = 0; i < len; i += 4) {
389 390
		I915_WRITE(hsw_dip_data_reg(dev_priv, cpu_transcoder,
					    type, i >> 2), *data);
391 392
		data++;
	}
393 394
	/* Write every possible data byte to force correct ECC calculation. */
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
395 396
		I915_WRITE(hsw_dip_data_reg(dev_priv, cpu_transcoder,
					    type, i >> 2), 0);
397
	mmiowb();
398

399
	val |= hsw_infoframe_enable(type);
400
	I915_WRITE(ctl_reg, val);
401
	POSTING_READ(ctl_reg);
402 403
}

404 405
static bool hsw_infoframe_enabled(struct drm_encoder *encoder,
				  const struct intel_crtc_state *pipe_config)
406
{
407 408
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
	u32 val = I915_READ(HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder));
409

410 411 412
	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);
413 414
}

415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431
/*
 * 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.
 */
432
static void intel_write_infoframe(struct drm_encoder *encoder,
433
				  const struct intel_crtc_state *crtc_state,
434
				  union hdmi_infoframe *frame)
435 436
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
437 438
	uint8_t buffer[VIDEO_DIP_DATA_SIZE];
	ssize_t len;
439

440 441 442 443 444 445 446 447 448 449 450
	/* 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++;
451

452
	intel_hdmi->write_infoframe(encoder, crtc_state, frame->any.type, buffer, len);
453 454
}

455
static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
456
					 const struct intel_crtc_state *crtc_state)
457
{
458
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
459 460
	const struct drm_display_mode *adjusted_mode =
		&crtc_state->base.adjusted_mode;
461 462
	union hdmi_infoframe frame;
	int ret;
463

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

471
	drm_hdmi_avi_infoframe_quant_range(&frame.avi, adjusted_mode,
472 473 474 475
					   crtc_state->limited_color_range ?
					   HDMI_QUANTIZATION_RANGE_LIMITED :
					   HDMI_QUANTIZATION_RANGE_FULL,
					   intel_hdmi->rgb_quant_range_selectable);
476

477
	intel_write_infoframe(encoder, crtc_state, &frame);
478 479
}

480 481
static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder,
					 const struct intel_crtc_state *crtc_state)
482
{
483 484 485 486 487 488 489 490
	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;
	}
491

492
	frame.spd.sdi = HDMI_SPD_SDI_PC;
493

494
	intel_write_infoframe(encoder, crtc_state, &frame);
495 496
}

497 498
static void
intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
499
			      const struct intel_crtc_state *crtc_state)
500 501 502 503 504
{
	union hdmi_infoframe frame;
	int ret;

	ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi,
505
							  &crtc_state->base.adjusted_mode);
506 507 508
	if (ret < 0)
		return;

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

512
static void g4x_set_infoframes(struct drm_encoder *encoder,
513
			       bool enable,
514 515
			       const struct intel_crtc_state *crtc_state,
			       const struct drm_connector_state *conn_state)
516
{
517
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
518 519
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
520
	i915_reg_t reg = VIDEO_DIP_CTL;
521
	u32 val = I915_READ(reg);
522
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
523

524 525
	assert_hdmi_port_disabled(intel_hdmi);

526 527 528 529 530 531 532 533 534 535 536
	/* 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;

537
	if (!enable) {
538 539
		if (!(val & VIDEO_DIP_ENABLE))
			return;
540 541 542 543 544 545 546
		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);
547
		I915_WRITE(reg, val);
548
		POSTING_READ(reg);
549 550 551
		return;
	}

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

562
	val |= VIDEO_DIP_ENABLE;
563 564
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
565

566
	I915_WRITE(reg, val);
567
	POSTING_READ(reg);
568

569 570 571
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state);
572 573
}

574
static bool hdmi_sink_is_deep_color(const struct drm_connector_state *conn_state)
575
{
576
	struct drm_connector *connector = conn_state->connector;
577 578 579 580 581 582 583

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

584
	return connector->display_info.bpc > 8;
585 586
}

587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629
/*
 * 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);
}

630 631 632
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)
633
{
634
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
635
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
636 637
	i915_reg_t reg;
	u32 val = 0;
638 639

	if (HAS_DDI(dev_priv))
640
		reg = HSW_TVIDEO_DIP_GCP(crtc_state->cpu_transcoder);
641
	else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
642
		reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
643
	else if (HAS_PCH_SPLIT(dev_priv))
644 645 646 647 648
		reg = TVIDEO_DIP_GCP(crtc->pipe);
	else
		return false;

	/* Indicate color depth whenever the sink supports deep color */
649
	if (hdmi_sink_is_deep_color(conn_state))
650 651
		val |= GCP_COLOR_INDICATION;

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

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

	return val != 0;
}

662
static void ibx_set_infoframes(struct drm_encoder *encoder,
663
			       bool enable,
664 665
			       const struct intel_crtc_state *crtc_state,
			       const struct drm_connector_state *conn_state)
666
{
667
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
668
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
669 670
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
671
	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
672
	u32 val = I915_READ(reg);
673
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
674

675 676
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

704
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
705 706
		val |= VIDEO_DIP_ENABLE_GCP;

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

710 711 712
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state);
713 714 715
}

static void cpt_set_infoframes(struct drm_encoder *encoder,
716
			       bool enable,
717 718
			       const struct intel_crtc_state *crtc_state,
			       const struct drm_connector_state *conn_state)
719
{
720
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
721
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
722
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
723
	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
724 725
	u32 val = I915_READ(reg);

726 727
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

747
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
748 749
		val |= VIDEO_DIP_ENABLE_GCP;

750
	I915_WRITE(reg, val);
751
	POSTING_READ(reg);
752

753 754 755
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state);
756 757 758
}

static void vlv_set_infoframes(struct drm_encoder *encoder,
759
			       bool enable,
760 761
			       const struct intel_crtc_state *crtc_state,
			       const struct drm_connector_state *conn_state)
762
{
763
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
764
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
765
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
766
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
767
	i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
768
	u32 val = I915_READ(reg);
769
	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
770

771 772
	assert_hdmi_port_disabled(intel_hdmi);

773 774 775
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

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

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

795
	val |= VIDEO_DIP_ENABLE;
796 797 798
	val &= ~(VIDEO_DIP_ENABLE_AVI |
		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
799

800
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
801 802
		val |= VIDEO_DIP_ENABLE_GCP;

803
	I915_WRITE(reg, val);
804
	POSTING_READ(reg);
805

806 807 808
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state);
809 810 811
}

static void hsw_set_infoframes(struct drm_encoder *encoder,
812
			       bool enable,
813 814
			       const struct intel_crtc_state *crtc_state,
			       const struct drm_connector_state *conn_state)
815
{
816
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
817
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
818
	i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
819
	u32 val = I915_READ(reg);
820

821 822
	assert_hdmi_port_disabled(intel_hdmi);

823 824 825 826
	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);

827
	if (!enable) {
828
		I915_WRITE(reg, val);
829
		POSTING_READ(reg);
830 831 832
		return;
	}

833
	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
834 835
		val |= VIDEO_DIP_ENABLE_GCP_HSW;

836
	I915_WRITE(reg, val);
837
	POSTING_READ(reg);
838

839 840 841
	intel_hdmi_set_avi_infoframe(encoder, crtc_state);
	intel_hdmi_set_spd_infoframe(encoder, crtc_state);
	intel_hdmi_set_hdmi_infoframe(encoder, crtc_state);
842 843
}

844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859
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);
}

860 861
static void intel_hdmi_prepare(struct intel_encoder *encoder,
			       const struct intel_crtc_state *crtc_state)
862
{
863
	struct drm_device *dev = encoder->base.dev;
864
	struct drm_i915_private *dev_priv = to_i915(dev);
865
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
866
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
867
	const struct drm_display_mode *adjusted_mode = &crtc_state->base.adjusted_mode;
868
	u32 hdmi_val;
869

870 871
	intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);

872
	hdmi_val = SDVO_ENCODING_HDMI;
873
	if (!HAS_PCH_SPLIT(dev_priv) && crtc_state->limited_color_range)
874
		hdmi_val |= HDMI_COLOR_RANGE_16_235;
875
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
876
		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
877
	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
878
		hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
879

880
	if (crtc_state->pipe_bpp > 24)
881
		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
882
	else
883
		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
884

885
	if (crtc_state->has_hdmi_sink)
886
		hdmi_val |= HDMI_MODE_SELECT_HDMI;
887

888
	if (HAS_PCH_CPT(dev_priv))
889
		hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
890
	else if (IS_CHERRYVIEW(dev_priv))
891
		hdmi_val |= SDVO_PIPE_SEL_CHV(crtc->pipe);
892
	else
893
		hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
894

895 896
	I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
	POSTING_READ(intel_hdmi->hdmi_reg);
897 898
}

899 900
static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
				    enum pipe *pipe)
901
{
902
	struct drm_device *dev = encoder->base.dev;
903
	struct drm_i915_private *dev_priv = to_i915(dev);
904 905
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	u32 tmp;
906
	bool ret;
907

908 909
	if (!intel_display_power_get_if_enabled(dev_priv,
						encoder->power_domain))
910 911
		return false;

912 913
	ret = false;

914
	tmp = I915_READ(intel_hdmi->hdmi_reg);
915 916

	if (!(tmp & SDVO_ENABLE))
917
		goto out;
918

919
	if (HAS_PCH_CPT(dev_priv))
920
		*pipe = PORT_TO_PIPE_CPT(tmp);
921
	else if (IS_CHERRYVIEW(dev_priv))
922
		*pipe = SDVO_PORT_TO_PIPE_CHV(tmp);
923 924 925
	else
		*pipe = PORT_TO_PIPE(tmp);

926 927 928
	ret = true;

out:
929
	intel_display_power_put(dev_priv, encoder->power_domain);
930 931

	return ret;
932 933
}

934
static void intel_hdmi_get_config(struct intel_encoder *encoder,
935
				  struct intel_crtc_state *pipe_config)
936 937
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
938
	struct drm_device *dev = encoder->base.dev;
939
	struct drm_i915_private *dev_priv = to_i915(dev);
940
	u32 tmp, flags = 0;
941
	int dotclock;
942 943 944 945 946 947 948 949 950 951 952 953 954

	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;

955 956 957
	if (tmp & HDMI_MODE_SELECT_HDMI)
		pipe_config->has_hdmi_sink = true;

958
	if (intel_hdmi->infoframe_enabled(&encoder->base, pipe_config))
959 960
		pipe_config->has_infoframe = true;

961
	if (tmp & SDVO_AUDIO_ENABLE)
962 963
		pipe_config->has_audio = true;

964
	if (!HAS_PCH_SPLIT(dev_priv) &&
965 966 967
	    tmp & HDMI_COLOR_RANGE_16_235)
		pipe_config->limited_color_range = true;

968
	pipe_config->base.adjusted_mode.flags |= flags;
969 970 971 972 973 974

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

975 976 977
	if (pipe_config->pixel_multiplier)
		dotclock /= pipe_config->pixel_multiplier;

978
	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
979 980

	pipe_config->lane_count = 4;
981 982
}

983 984 985
static void intel_enable_hdmi_audio(struct intel_encoder *encoder,
				    struct intel_crtc_state *pipe_config,
				    struct drm_connector_state *conn_state)
986
{
987
	struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
988

989
	WARN_ON(!pipe_config->has_hdmi_sink);
990 991
	DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
			 pipe_name(crtc->pipe));
992
	intel_audio_codec_enable(encoder, pipe_config, conn_state);
993 994
}

995 996 997
static void g4x_enable_hdmi(struct intel_encoder *encoder,
			    struct intel_crtc_state *pipe_config,
			    struct drm_connector_state *conn_state)
998
{
999
	struct drm_device *dev = encoder->base.dev;
1000
	struct drm_i915_private *dev_priv = to_i915(dev);
1001
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1002 1003
	u32 temp;

1004
	temp = I915_READ(intel_hdmi->hdmi_reg);
1005

1006
	temp |= SDVO_ENABLE;
1007
	if (pipe_config->has_audio)
1008
		temp |= SDVO_AUDIO_ENABLE;
1009

1010 1011 1012
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);

1013 1014
	if (pipe_config->has_audio)
		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
1015 1016
}

1017 1018 1019
static void ibx_enable_hdmi(struct intel_encoder *encoder,
			    struct intel_crtc_state *pipe_config,
			    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 1024 1025 1026
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	u32 temp;

	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 1035 1036 1037
	/*
	 * 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);
1038 1039
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
1040

1041 1042 1043 1044 1045 1046
	/*
	 * 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.
1047
	 */
1048 1049
	if (pipe_config->pipe_bpp > 24 &&
	    pipe_config->pixel_multiplier > 1) {
1050 1051 1052 1053 1054 1055 1056 1057 1058
		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);
1059 1060
		I915_WRITE(intel_hdmi->hdmi_reg, temp);
		POSTING_READ(intel_hdmi->hdmi_reg);
1061
	}
1062

1063 1064
	if (pipe_config->has_audio)
		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
1065 1066
}

1067 1068 1069
static void cpt_enable_hdmi(struct intel_encoder *encoder,
			    struct intel_crtc_state *pipe_config,
			    struct drm_connector_state *conn_state)
1070 1071
{
	struct drm_device *dev = encoder->base.dev;
1072
	struct drm_i915_private *dev_priv = to_i915(dev);
1073
	struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
1074 1075 1076 1077 1078 1079 1080
	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;
1081
	if (pipe_config->has_audio)
1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093
		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
	 */

1094
	if (pipe_config->pipe_bpp > 24) {
1095 1096 1097 1098 1099 1100
		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;
1101
	}
1102 1103 1104 1105

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

1106
	if (pipe_config->pipe_bpp > 24) {
1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117
		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);
	}

1118 1119
	if (pipe_config->has_audio)
		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
1120
}
1121

1122 1123 1124
static void vlv_enable_hdmi(struct intel_encoder *encoder,
			    struct intel_crtc_state *pipe_config,
			    struct drm_connector_state *conn_state)
1125
{
1126 1127
}

1128 1129 1130
static void intel_disable_hdmi(struct intel_encoder *encoder,
			       struct intel_crtc_state *old_crtc_state,
			       struct drm_connector_state *old_conn_state)
1131 1132
{
	struct drm_device *dev = encoder->base.dev;
1133
	struct drm_i915_private *dev_priv = to_i915(dev);
1134
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1135
	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
1136 1137
	u32 temp;

1138
	temp = I915_READ(intel_hdmi->hdmi_reg);
1139

1140
	temp &= ~(SDVO_ENABLE | SDVO_AUDIO_ENABLE);
1141 1142
	I915_WRITE(intel_hdmi->hdmi_reg, temp);
	POSTING_READ(intel_hdmi->hdmi_reg);
1143 1144 1145 1146 1147 1148

	/*
	 * 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.
	 */
1149
	if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B) {
1150 1151 1152 1153 1154 1155 1156
		/*
		 * 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);

1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
		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);
1171

1172
		intel_wait_for_vblank_if_active(dev_priv, PIPE_A);
1173 1174
		intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
		intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
1175
	}
1176

1177
	intel_hdmi->set_infoframes(&encoder->base, false, old_crtc_state, old_conn_state);
1178 1179

	intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);
1180 1181
}

1182 1183 1184
static void g4x_disable_hdmi(struct intel_encoder *encoder,
			     struct intel_crtc_state *old_crtc_state,
			     struct drm_connector_state *old_conn_state)
1185
{
1186
	if (old_crtc_state->has_audio)
1187 1188
		intel_audio_codec_disable(encoder);

1189
	intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
1190 1191
}

1192 1193 1194
static void pch_disable_hdmi(struct intel_encoder *encoder,
			     struct intel_crtc_state *old_crtc_state,
			     struct drm_connector_state *old_conn_state)
1195
{
1196
	if (old_crtc_state->has_audio)
1197 1198 1199
		intel_audio_codec_disable(encoder);
}

1200 1201 1202
static void pch_post_disable_hdmi(struct intel_encoder *encoder,
				  struct intel_crtc_state *old_crtc_state,
				  struct drm_connector_state *old_conn_state)
1203
{
1204
	intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
1205 1206
}

1207
static int intel_hdmi_source_max_tmds_clock(struct drm_i915_private *dev_priv)
1208
{
1209
	if (IS_G4X(dev_priv))
1210
		return 165000;
1211
	else if (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)
1212 1213 1214 1215 1216
		return 300000;
	else
		return 225000;
}

1217 1218 1219 1220 1221 1222 1223
static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
				 bool respect_downstream_limits)
{
	struct drm_device *dev = intel_hdmi_to_dev(hdmi);
	int max_tmds_clock = intel_hdmi_source_max_tmds_clock(to_i915(dev));

	if (respect_downstream_limits) {
1224 1225 1226
		struct intel_connector *connector = hdmi->attached_connector;
		const struct drm_display_info *info = &connector->base.display_info;

1227 1228 1229
		if (hdmi->dp_dual_mode.max_tmds_clock)
			max_tmds_clock = min(max_tmds_clock,
					     hdmi->dp_dual_mode.max_tmds_clock);
1230 1231 1232 1233 1234

		if (info->max_tmds_clock)
			max_tmds_clock = min(max_tmds_clock,
					     info->max_tmds_clock);
		else if (!hdmi->has_hdmi_sink)
1235 1236 1237 1238 1239 1240
			max_tmds_clock = min(max_tmds_clock, 165000);
	}

	return max_tmds_clock;
}

1241 1242
static enum drm_mode_status
hdmi_port_clock_valid(struct intel_hdmi *hdmi,
1243
		      int clock, bool respect_downstream_limits)
1244
{
1245
	struct drm_i915_private *dev_priv = to_i915(intel_hdmi_to_dev(hdmi));
1246 1247 1248

	if (clock < 25000)
		return MODE_CLOCK_LOW;
1249
	if (clock > hdmi_port_clock_limit(hdmi, respect_downstream_limits))
1250 1251
		return MODE_CLOCK_HIGH;

1252
	/* BXT DPLL can't generate 223-240 MHz */
1253
	if (IS_GEN9_LP(dev_priv) && clock > 223333 && clock < 240000)
1254 1255 1256
		return MODE_CLOCK_RANGE;

	/* CHV DPLL can't generate 216-240 MHz */
1257
	if (IS_CHERRYVIEW(dev_priv) && clock > 216000 && clock < 240000)
1258 1259 1260 1261 1262
		return MODE_CLOCK_RANGE;

	return MODE_OK;
}

1263 1264 1265
static enum drm_mode_status
intel_hdmi_mode_valid(struct drm_connector *connector,
		      struct drm_display_mode *mode)
1266
{
1267 1268
	struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
	struct drm_device *dev = intel_hdmi_to_dev(hdmi);
1269
	struct drm_i915_private *dev_priv = to_i915(dev);
1270 1271
	enum drm_mode_status status;
	int clock;
M
Mika Kahola 已提交
1272
	int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
1273 1274 1275

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

1277
	clock = mode->clock;
M
Mika Kahola 已提交
1278 1279 1280 1281 1282 1283 1284

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

	if (clock > max_dotclk)
		return MODE_CLOCK_HIGH;

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

1288 1289
	/* check if we can do 8bpc */
	status = hdmi_port_clock_valid(hdmi, clock, true);
1290

1291
	/* if we can't do 8bpc we may still be able to do 12bpc */
1292
	if (!HAS_GMCH_DISPLAY(dev_priv) && status != MODE_OK)
1293
		status = hdmi_port_clock_valid(hdmi, clock * 3 / 2, true);
1294

1295
	return status;
1296 1297
}

1298
static bool hdmi_12bpc_possible(struct intel_crtc_state *crtc_state)
1299
{
1300 1301 1302 1303 1304 1305
	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;
1306

1307
	if (HAS_GMCH_DISPLAY(dev_priv))
1308 1309 1310 1311 1312 1313
		return false;

	/*
	 * HDMI 12bpc affects the clocks, so it's only possible
	 * when not cloning with other encoder types.
	 */
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327
	if (crtc_state->output_types != 1 << INTEL_OUTPUT_HDMI)
		return false;

	for_each_connector_in_state(state, connector, connector_state, i) {
		const struct drm_display_info *info = &connector->display_info;

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

		if ((info->edid_hdmi_dc_modes & DRM_EDID_HDMI_DC_36) == 0)
			return false;
	}

	return true;
1328 1329
}

1330
bool intel_hdmi_compute_config(struct intel_encoder *encoder,
1331 1332
			       struct intel_crtc_state *pipe_config,
			       struct drm_connector_state *conn_state)
1333
{
1334
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1335
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1336
	struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
1337 1338
	int clock_8bpc = pipe_config->base.adjusted_mode.crtc_clock;
	int clock_12bpc = clock_8bpc * 3 / 2;
1339
	int desired_bpp;
1340

1341 1342
	pipe_config->has_hdmi_sink = intel_hdmi->has_hdmi_sink;

1343 1344 1345
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

1346 1347
	if (intel_hdmi->color_range_auto) {
		/* See CEA-861-E - 5.1 Default Encoding Parameters */
1348 1349
		pipe_config->limited_color_range =
			pipe_config->has_hdmi_sink &&
1350 1351
			drm_default_rgb_quant_range(adjusted_mode) ==
			HDMI_QUANTIZATION_RANGE_LIMITED;
1352 1353 1354
	} else {
		pipe_config->limited_color_range =
			intel_hdmi->limited_color_range;
1355 1356
	}

1357 1358
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
		pipe_config->pixel_multiplier = 2;
1359
		clock_8bpc *= 2;
1360
		clock_12bpc *= 2;
1361 1362
	}

1363
	if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv))
1364 1365
		pipe_config->has_pch_encoder = true;

1366 1367 1368
	if (pipe_config->has_hdmi_sink && intel_hdmi->has_audio)
		pipe_config->has_audio = true;

1369 1370 1371
	/*
	 * 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
1372 1373
	 * outputs. We also need to check that the higher clock still fits
	 * within limits.
1374
	 */
1375
	if (pipe_config->pipe_bpp > 8*3 && pipe_config->has_hdmi_sink &&
1376
	    hdmi_port_clock_valid(intel_hdmi, clock_12bpc, true) == MODE_OK &&
1377
	    hdmi_12bpc_possible(pipe_config)) {
1378 1379
		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
		desired_bpp = 12*3;
1380 1381

		/* Need to adjust the port link by 1.5x for 12bpc. */
1382
		pipe_config->port_clock = clock_12bpc;
1383
	} else {
1384 1385
		DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
		desired_bpp = 8*3;
1386 1387

		pipe_config->port_clock = clock_8bpc;
1388 1389 1390 1391 1392
	}

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

1395 1396 1397
	if (hdmi_port_clock_valid(intel_hdmi, pipe_config->port_clock,
				  false) != MODE_OK) {
		DRM_DEBUG_KMS("unsupported HDMI clock, rejecting mode\n");
1398 1399 1400
		return false;
	}

1401 1402 1403
	/* Set user selected PAR to incoming mode's member */
	adjusted_mode->picture_aspect_ratio = intel_hdmi->aspect_ratio;

1404 1405
	pipe_config->lane_count = 4;

1406 1407 1408
	return true;
}

1409 1410
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1411
{
1412
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1413

1414 1415 1416 1417
	intel_hdmi->has_hdmi_sink = false;
	intel_hdmi->has_audio = false;
	intel_hdmi->rgb_quant_range_selectable = false;

1418 1419 1420
	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;

1421 1422 1423 1424
	kfree(to_intel_connector(connector)->detect_edid);
	to_intel_connector(connector)->detect_edid = NULL;
}

1425
static void
1426
intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
1427 1428 1429
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
1430
	enum port port = hdmi_to_dig_port(hdmi)->port;
1431 1432 1433 1434
	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);

1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457
	/*
	 * 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)
1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468
		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);
}

1469
static bool
1470
intel_hdmi_set_edid(struct drm_connector *connector)
1471 1472 1473
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1474
	struct edid *edid;
1475
	bool connected = false;
1476

1477
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1478

1479 1480 1481
	edid = drm_get_edid(connector,
			    intel_gmbus_get_adapter(dev_priv,
			    intel_hdmi->ddc_bus));
1482

1483
	intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
1484

1485
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1486

1487 1488 1489 1490 1491 1492
	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);
1493 1494
		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
			intel_hdmi->has_audio =
1495 1496 1497 1498 1499 1500 1501
				intel_hdmi->force_audio == HDMI_AUDIO_ON;

		if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink =
				drm_detect_hdmi_monitor(edid);

		connected = true;
1502 1503
	}

1504 1505 1506
	return connected;
}

1507 1508
static enum drm_connector_status
intel_hdmi_detect(struct drm_connector *connector, bool force)
1509
{
1510 1511
	enum drm_connector_status status;
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1512

1513 1514 1515
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);

1516 1517
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);

1518
	intel_hdmi_unset_edid(connector);
1519

1520
	if (intel_hdmi_set_edid(connector)) {
1521 1522 1523 1524
		struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);

		hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
		status = connector_status_connected;
1525
	} else
1526
		status = connector_status_disconnected;
1527

1528 1529
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);

1530
	return status;
1531 1532
}

1533 1534
static void
intel_hdmi_force(struct drm_connector *connector)
1535
{
1536
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1537

1538 1539
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);
1540

1541
	intel_hdmi_unset_edid(connector);
1542

1543 1544
	if (connector->status != connector_status_connected)
		return;
1545

1546
	intel_hdmi_set_edid(connector);
1547 1548
	hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
}
1549

1550 1551 1552 1553 1554 1555 1556
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;
1557

1558
	return intel_connector_update_modes(connector, edid);
1559 1560
}

1561 1562 1563 1564
static bool
intel_hdmi_detect_audio(struct drm_connector *connector)
{
	bool has_audio = false;
1565
	struct edid *edid;
1566

1567 1568 1569
	edid = to_intel_connector(connector)->detect_edid;
	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL)
		has_audio = drm_detect_monitor_audio(edid);
1570

1571 1572 1573
	return has_audio;
}

1574 1575
static int
intel_hdmi_set_property(struct drm_connector *connector,
1576 1577
			struct drm_property *property,
			uint64_t val)
1578 1579
{
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1580 1581
	struct intel_digital_port *intel_dig_port =
		hdmi_to_dig_port(intel_hdmi);
1582
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1583 1584
	int ret;

1585
	ret = drm_object_property_set_value(&connector->base, property, val);
1586 1587 1588
	if (ret)
		return ret;

1589
	if (property == dev_priv->force_audio_property) {
1590
		enum hdmi_force_audio i = val;
1591 1592 1593
		bool has_audio;

		if (i == intel_hdmi->force_audio)
1594 1595
			return 0;

1596
		intel_hdmi->force_audio = i;
1597

1598
		if (i == HDMI_AUDIO_AUTO)
1599 1600
			has_audio = intel_hdmi_detect_audio(connector);
		else
1601
			has_audio = (i == HDMI_AUDIO_ON);
1602

1603 1604
		if (i == HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink = 0;
1605

1606
		intel_hdmi->has_audio = has_audio;
1607 1608 1609
		goto done;
	}

1610
	if (property == dev_priv->broadcast_rgb_property) {
1611
		bool old_auto = intel_hdmi->color_range_auto;
1612
		bool old_range = intel_hdmi->limited_color_range;
1613

1614 1615 1616 1617 1618 1619
		switch (val) {
		case INTEL_BROADCAST_RGB_AUTO:
			intel_hdmi->color_range_auto = true;
			break;
		case INTEL_BROADCAST_RGB_FULL:
			intel_hdmi->color_range_auto = false;
1620
			intel_hdmi->limited_color_range = false;
1621 1622 1623
			break;
		case INTEL_BROADCAST_RGB_LIMITED:
			intel_hdmi->color_range_auto = false;
1624
			intel_hdmi->limited_color_range = true;
1625 1626 1627 1628
			break;
		default:
			return -EINVAL;
		}
1629 1630

		if (old_auto == intel_hdmi->color_range_auto &&
1631
		    old_range == intel_hdmi->limited_color_range)
1632 1633
			return 0;

1634 1635 1636
		goto done;
	}

1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653
	if (property == connector->dev->mode_config.aspect_ratio_property) {
		switch (val) {
		case DRM_MODE_PICTURE_ASPECT_NONE:
			intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
			break;
		case DRM_MODE_PICTURE_ASPECT_4_3:
			intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_4_3;
			break;
		case DRM_MODE_PICTURE_ASPECT_16_9:
			intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_16_9;
			break;
		default:
			return -EINVAL;
		}
		goto done;
	}

1654 1655 1656
	return -EINVAL;

done:
1657 1658
	if (intel_dig_port->base.base.crtc)
		intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
1659 1660 1661 1662

	return 0;
}

1663 1664 1665
static void intel_hdmi_pre_enable(struct intel_encoder *encoder,
				  struct intel_crtc_state *pipe_config,
				  struct drm_connector_state *conn_state)
1666 1667 1668
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);

1669
	intel_hdmi_prepare(encoder, pipe_config);
1670

1671
	intel_hdmi->set_infoframes(&encoder->base,
1672
				   pipe_config->has_hdmi_sink,
1673
				   pipe_config, conn_state);
1674 1675
}

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

	vlv_phy_pre_encoder_enable(encoder);
1686

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

1691
	intel_hdmi->set_infoframes(&encoder->base,
1692
				   pipe_config->has_hdmi_sink,
1693
				   pipe_config, conn_state);
1694

1695
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1696

1697
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1698 1699
}

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

1706
	vlv_phy_pre_pll_enable(encoder);
1707 1708
}

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

1715
	chv_phy_pre_pll_enable(encoder);
1716 1717
}

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

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

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

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

1742 1743
	/* Assert data lane reset */
	chv_data_lane_soft_reset(encoder, true);
1744

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

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

1757
	chv_phy_pre_encoder_enable(encoder);
1758

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

1763
	intel_hdmi->set_infoframes(&encoder->base,
1764 1765
				   pipe_config->has_hdmi_sink,
				   pipe_config, conn_state);
1766

1767
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1768

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

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

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

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1783
	.dpms = drm_atomic_helper_connector_dpms,
1784
	.detect = intel_hdmi_detect,
1785
	.force = intel_hdmi_force,
1786
	.fill_modes = drm_helper_probe_single_connector_modes,
1787
	.set_property = intel_hdmi_set_property,
1788
	.atomic_get_property = intel_connector_atomic_get_property,
1789
	.late_register = intel_connector_register,
1790
	.early_unregister = intel_connector_unregister,
1791
	.destroy = intel_hdmi_destroy,
1792
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1793
	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1794 1795 1796 1797 1798 1799 1800 1801
};

static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
	.get_modes = intel_hdmi_get_modes,
	.mode_valid = intel_hdmi_mode_valid,
};

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

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

1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829
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;
	}

	switch (port) {
	case PORT_B:
1830
		if (IS_GEN9_LP(dev_priv))
1831 1832 1833 1834 1835
			ddc_pin = GMBUS_PIN_1_BXT;
		else
			ddc_pin = GMBUS_PIN_DPB;
		break;
	case PORT_C:
1836
		if (IS_GEN9_LP(dev_priv))
1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858
			ddc_pin = GMBUS_PIN_2_BXT;
		else
			ddc_pin = GMBUS_PIN_DPC;
		break;
	case PORT_D:
		if (IS_CHERRYVIEW(dev_priv))
			ddc_pin = GMBUS_PIN_DPD_CHV;
		else
			ddc_pin = GMBUS_PIN_DPD;
		break;
	default:
		MISSING_CASE(port);
		ddc_pin = GMBUS_PIN_DPB;
		break;
	}

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

	return ddc_pin;
}

P
Paulo Zanoni 已提交
1859 1860
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
			       struct intel_connector *intel_connector)
1861
{
1862 1863 1864 1865
	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;
1866
	struct drm_i915_private *dev_priv = to_i915(dev);
1867
	enum port port = intel_dig_port->port;
1868

1869 1870 1871
	DRM_DEBUG_KMS("Adding HDMI connector on port %c\n",
		      port_name(port));

1872 1873 1874 1875 1876
	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;

1877
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1878
			   DRM_MODE_CONNECTOR_HDMIA);
1879 1880
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

1881
	connector->interlace_allowed = 1;
1882
	connector->doublescan_allowed = 0;
1883
	connector->stereo_allowed = 1;
1884

1885 1886
	intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);

1887 1888
	switch (port) {
	case PORT_B:
1889
		intel_encoder->hpd_pin = HPD_PORT_B;
1890 1891
		break;
	case PORT_C:
1892
		intel_encoder->hpd_pin = HPD_PORT_C;
1893 1894
		break;
	case PORT_D:
1895
		intel_encoder->hpd_pin = HPD_PORT_D;
1896
		break;
X
Xiong Zhang 已提交
1897 1898 1899
	case PORT_E:
		intel_encoder->hpd_pin = HPD_PORT_E;
		break;
1900
	default:
1901 1902
		MISSING_CASE(port);
		return;
1903
	}
1904

1905
	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
1906
		intel_hdmi->write_infoframe = vlv_write_infoframe;
1907
		intel_hdmi->set_infoframes = vlv_set_infoframes;
1908
		intel_hdmi->infoframe_enabled = vlv_infoframe_enabled;
1909
	} else if (IS_G4X(dev_priv)) {
1910 1911
		intel_hdmi->write_infoframe = g4x_write_infoframe;
		intel_hdmi->set_infoframes = g4x_set_infoframes;
1912
		intel_hdmi->infoframe_enabled = g4x_infoframe_enabled;
1913
	} else if (HAS_DDI(dev_priv)) {
1914
		intel_hdmi->write_infoframe = hsw_write_infoframe;
1915
		intel_hdmi->set_infoframes = hsw_set_infoframes;
1916
		intel_hdmi->infoframe_enabled = hsw_infoframe_enabled;
1917
	} else if (HAS_PCH_IBX(dev_priv)) {
1918
		intel_hdmi->write_infoframe = ibx_write_infoframe;
1919
		intel_hdmi->set_infoframes = ibx_set_infoframes;
1920
		intel_hdmi->infoframe_enabled = ibx_infoframe_enabled;
1921 1922
	} else {
		intel_hdmi->write_infoframe = cpt_write_infoframe;
1923
		intel_hdmi->set_infoframes = cpt_set_infoframes;
1924
		intel_hdmi->infoframe_enabled = cpt_infoframe_enabled;
1925
	}
1926

1927
	if (HAS_DDI(dev_priv))
1928 1929 1930
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
1931 1932 1933 1934

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
1935
	intel_hdmi->attached_connector = intel_connector;
1936 1937 1938 1939 1940

	/* 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.
	 */
1941
	if (IS_G4X(dev_priv) && !IS_GM45(dev_priv)) {
1942 1943 1944 1945 1946
		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
	}
}

1947
void intel_hdmi_init(struct drm_i915_private *dev_priv,
1948
		     i915_reg_t hdmi_reg, enum port port)
1949 1950 1951 1952 1953
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

1954
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
1955 1956 1957
	if (!intel_dig_port)
		return;

1958
	intel_connector = intel_connector_alloc();
1959 1960 1961 1962 1963 1964 1965
	if (!intel_connector) {
		kfree(intel_dig_port);
		return;
	}

	intel_encoder = &intel_dig_port->base;

1966 1967 1968
	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 已提交
1969

1970
	intel_encoder->compute_config = intel_hdmi_compute_config;
1971
	if (HAS_PCH_SPLIT(dev_priv)) {
1972 1973 1974 1975 1976
		intel_encoder->disable = pch_disable_hdmi;
		intel_encoder->post_disable = pch_post_disable_hdmi;
	} else {
		intel_encoder->disable = g4x_disable_hdmi;
	}
P
Paulo Zanoni 已提交
1977
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
1978
	intel_encoder->get_config = intel_hdmi_get_config;
1979
	if (IS_CHERRYVIEW(dev_priv)) {
1980
		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
1981 1982
		intel_encoder->pre_enable = chv_hdmi_pre_enable;
		intel_encoder->enable = vlv_enable_hdmi;
1983
		intel_encoder->post_disable = chv_hdmi_post_disable;
1984
		intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable;
1985
	} else if (IS_VALLEYVIEW(dev_priv)) {
1986 1987
		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
1988
		intel_encoder->enable = vlv_enable_hdmi;
1989
		intel_encoder->post_disable = vlv_hdmi_post_disable;
1990
	} else {
1991
		intel_encoder->pre_enable = intel_hdmi_pre_enable;
1992
		if (HAS_PCH_CPT(dev_priv))
1993
			intel_encoder->enable = cpt_enable_hdmi;
1994
		else if (HAS_PCH_IBX(dev_priv))
1995
			intel_encoder->enable = ibx_enable_hdmi;
1996
		else
1997
			intel_encoder->enable = g4x_enable_hdmi;
1998
	}
1999

2000
	intel_encoder->type = INTEL_OUTPUT_HDMI;
2001
	intel_encoder->power_domain = intel_port_to_power_domain(port);
2002
	intel_encoder->port = port;
2003
	if (IS_CHERRYVIEW(dev_priv)) {
2004 2005 2006 2007 2008 2009 2010
		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);
	}
2011
	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
2012 2013 2014 2015 2016
	/*
	 * 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.
	 */
2017
	if (IS_G4X(dev_priv))
2018
		intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
2019

2020
	intel_dig_port->port = port;
2021
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
2022
	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
2023
	intel_dig_port->max_lanes = 4;
2024

2025
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2026
}