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

#include <linux/i2c.h>
30
#include <linux/slab.h>
31
#include <linux/delay.h>
32
#include <linux/hdmi.h>
33
#include <drm/drmP.h>
34
#include <drm/drm_atomic_helper.h>
35 36
#include <drm/drm_crtc.h>
#include <drm/drm_edid.h>
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(enum hdmi_infoframe_type 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(enum hdmi_infoframe_type 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(enum hdmi_infoframe_type type)
104
{
105 106
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
107
		return VIDEO_DIP_ENABLE_AVI_HSW;
108
	case HDMI_INFOFRAME_TYPE_SPD:
109
		return VIDEO_DIP_ENABLE_SPD_HSW;
110 111
	case HDMI_INFOFRAME_TYPE_VENDOR:
		return VIDEO_DIP_ENABLE_VS_HSW;
112
	default:
113
		MISSING_CASE(type);
114 115 116 117
		return 0;
	}
}

118 119 120 121 122
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)
123
{
124 125
	switch (type) {
	case HDMI_INFOFRAME_TYPE_AVI:
126
		return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder, i);
127
	case HDMI_INFOFRAME_TYPE_SPD:
128
		return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder, i);
129
	case HDMI_INFOFRAME_TYPE_VENDOR:
130
		return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder, i);
131
	default:
132
		MISSING_CASE(type);
133
		return INVALID_MMIO_REG;
134 135 136
	}
}

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

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

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

153
	val &= ~g4x_infoframe_enable(type);
154

155
	I915_WRITE(VIDEO_DIP_CTL, val);
156

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

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

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

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

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

185 186 187 188 189
	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);
190 191
}

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

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

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

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

	I915_WRITE(reg, val);

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

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

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

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

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

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

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

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

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

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

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

275
	I915_WRITE(reg, val);
276

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

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

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

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

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

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

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

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

328
	val &= ~g4x_infoframe_enable(type);
329

330
	I915_WRITE(reg, val);
331

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

465 466 467 468 469 470
	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 已提交
471

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

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

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

493
	frame.spd.sdi = HDMI_SPD_SDI_PC;
494

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

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

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

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

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

525 526
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

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

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

585
	return connector->display_info.bpc > 8;
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 630
/*
 * 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);
}

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

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

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

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

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

	return val != 0;
}

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

676 677
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

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

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

727 728
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

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

772 773
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

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

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

822 823
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

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

871 872
	intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);

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

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

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

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

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

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

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

913 914
	ret = false;

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

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

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

927 928 929
	ret = true;

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

	return ret;
933 934
}

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

	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;

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

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

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

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

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

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

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

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

	pipe_config->lane_count = 4;
982 983
}

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

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

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

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

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

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

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

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

	temp = I915_READ(intel_hdmi->hdmi_reg);
1028

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);
1181 1182
}

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

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

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

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

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

1220
static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
1221 1222
				 bool respect_downstream_limits,
				 bool force_dvi)
1223 1224 1225 1226 1227
{
	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) {
1228 1229 1230
		struct intel_connector *connector = hdmi->attached_connector;
		const struct drm_display_info *info = &connector->base.display_info;

1231 1232 1233
		if (hdmi->dp_dual_mode.max_tmds_clock)
			max_tmds_clock = min(max_tmds_clock,
					     hdmi->dp_dual_mode.max_tmds_clock);
1234 1235 1236 1237

		if (info->max_tmds_clock)
			max_tmds_clock = min(max_tmds_clock,
					     info->max_tmds_clock);
1238
		else if (!hdmi->has_hdmi_sink || force_dvi)
1239 1240 1241 1242 1243 1244
			max_tmds_clock = min(max_tmds_clock, 165000);
	}

	return max_tmds_clock;
}

1245 1246
static enum drm_mode_status
hdmi_port_clock_valid(struct intel_hdmi *hdmi,
1247 1248
		      int clock, bool respect_downstream_limits,
		      bool force_dvi)
1249
{
1250
	struct drm_i915_private *dev_priv = to_i915(intel_hdmi_to_dev(hdmi));
1251 1252 1253

	if (clock < 25000)
		return MODE_CLOCK_LOW;
1254
	if (clock > hdmi_port_clock_limit(hdmi, respect_downstream_limits, force_dvi))
1255 1256
		return MODE_CLOCK_HIGH;

1257
	/* BXT DPLL can't generate 223-240 MHz */
1258
	if (IS_GEN9_LP(dev_priv) && clock > 223333 && clock < 240000)
1259 1260 1261
		return MODE_CLOCK_RANGE;

	/* CHV DPLL can't generate 216-240 MHz */
1262
	if (IS_CHERRYVIEW(dev_priv) && clock > 216000 && clock < 240000)
1263 1264 1265 1266 1267
		return MODE_CLOCK_RANGE;

	return MODE_OK;
}

1268 1269 1270
static enum drm_mode_status
intel_hdmi_mode_valid(struct drm_connector *connector,
		      struct drm_display_mode *mode)
1271
{
1272 1273
	struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
	struct drm_device *dev = intel_hdmi_to_dev(hdmi);
1274
	struct drm_i915_private *dev_priv = to_i915(dev);
1275 1276
	enum drm_mode_status status;
	int clock;
M
Mika Kahola 已提交
1277
	int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
1278 1279
	bool force_dvi =
		READ_ONCE(to_intel_digital_connector_state(connector->state)->force_audio) == HDMI_AUDIO_OFF_DVI;
1280 1281 1282

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

1284
	clock = mode->clock;
M
Mika Kahola 已提交
1285 1286 1287 1288 1289 1290 1291

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

	if (clock > max_dotclk)
		return MODE_CLOCK_HIGH;

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

1295
	/* check if we can do 8bpc */
1296
	status = hdmi_port_clock_valid(hdmi, clock, true, force_dvi);
1297

1298
	/* if we can't do 8bpc we may still be able to do 12bpc */
1299 1300
	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);
1301

1302
	return status;
1303 1304
}

1305
static bool hdmi_12bpc_possible(struct intel_crtc_state *crtc_state)
1306
{
1307 1308 1309 1310 1311 1312
	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;
1313

1314
	if (HAS_GMCH_DISPLAY(dev_priv))
1315 1316 1317 1318 1319 1320
		return false;

	/*
	 * HDMI 12bpc affects the clocks, so it's only possible
	 * when not cloning with other encoder types.
	 */
1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333
	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;
	}

1334 1335 1336 1337 1338
	/* Display Wa #1139 */
	if (IS_GLK_REVID(dev_priv, 0, GLK_REVID_A1) &&
	    crtc_state->base.adjusted_mode.htotal > 5460)
		return false;

1339
	return true;
1340 1341
}

1342
bool intel_hdmi_compute_config(struct intel_encoder *encoder,
1343 1344
			       struct intel_crtc_state *pipe_config,
			       struct drm_connector_state *conn_state)
1345
{
1346
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1347
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1348
	struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
S
Shashank Sharma 已提交
1349
	struct drm_scdc *scdc = &conn_state->connector->display_info.hdmi.scdc;
1350 1351
	struct intel_digital_connector_state *intel_conn_state =
		to_intel_digital_connector_state(conn_state);
1352 1353
	int clock_8bpc = pipe_config->base.adjusted_mode.crtc_clock;
	int clock_12bpc = clock_8bpc * 3 / 2;
1354
	int desired_bpp;
1355
	bool force_dvi = intel_conn_state->force_audio == HDMI_AUDIO_OFF_DVI;
1356

1357
	pipe_config->has_hdmi_sink = !force_dvi && intel_hdmi->has_hdmi_sink;
1358

1359 1360 1361
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

1362
	if (intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_AUTO) {
1363
		/* See CEA-861-E - 5.1 Default Encoding Parameters */
1364 1365
		pipe_config->limited_color_range =
			pipe_config->has_hdmi_sink &&
1366 1367
			drm_default_rgb_quant_range(adjusted_mode) ==
			HDMI_QUANTIZATION_RANGE_LIMITED;
1368 1369
	} else {
		pipe_config->limited_color_range =
1370
			intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_LIMITED;
1371 1372
	}

1373 1374
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
		pipe_config->pixel_multiplier = 2;
1375
		clock_8bpc *= 2;
1376
		clock_12bpc *= 2;
1377 1378
	}

1379
	if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv))
1380 1381
		pipe_config->has_pch_encoder = true;

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

1390 1391 1392
	/*
	 * 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
1393 1394
	 * outputs. We also need to check that the higher clock still fits
	 * within limits.
1395
	 */
1396 1397
	if (pipe_config->pipe_bpp > 8*3 && pipe_config->has_hdmi_sink && !force_dvi &&
	    hdmi_port_clock_valid(intel_hdmi, clock_12bpc, true, force_dvi) == MODE_OK &&
1398
	    hdmi_12bpc_possible(pipe_config)) {
1399 1400
		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
		desired_bpp = 12*3;
1401 1402

		/* Need to adjust the port link by 1.5x for 12bpc. */
1403
		pipe_config->port_clock = clock_12bpc;
1404
	} else {
1405 1406
		DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
		desired_bpp = 8*3;
1407 1408

		pipe_config->port_clock = clock_8bpc;
1409 1410 1411
	}

	if (!pipe_config->bw_constrained) {
1412
		DRM_DEBUG_KMS("forcing pipe bpp to %i for HDMI\n", desired_bpp);
1413
		pipe_config->pipe_bpp = desired_bpp;
1414 1415
	}

1416
	if (hdmi_port_clock_valid(intel_hdmi, pipe_config->port_clock,
1417
				  false, force_dvi) != MODE_OK) {
1418
		DRM_DEBUG_KMS("unsupported HDMI clock, rejecting mode\n");
1419 1420 1421
		return false;
	}

1422
	/* Set user selected PAR to incoming mode's member */
1423
	adjusted_mode->picture_aspect_ratio = conn_state->picture_aspect_ratio;
1424

1425 1426
	pipe_config->lane_count = 4;

S
Shashank Sharma 已提交
1427 1428 1429 1430 1431 1432 1433 1434 1435 1436
	if (scdc->scrambling.supported && IS_GEMINILAKE(dev_priv)) {
		if (scdc->scrambling.low_rates)
			pipe_config->hdmi_scrambling = true;

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

1437 1438 1439
	return true;
}

1440 1441
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1442
{
1443
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1444

1445 1446 1447 1448
	intel_hdmi->has_hdmi_sink = false;
	intel_hdmi->has_audio = false;
	intel_hdmi->rgb_quant_range_selectable = false;

1449 1450 1451
	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;

1452 1453 1454 1455
	kfree(to_intel_connector(connector)->detect_edid);
	to_intel_connector(connector)->detect_edid = NULL;
}

1456
static void
1457
intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
1458 1459 1460
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
1461
	enum port port = hdmi_to_dig_port(hdmi)->port;
1462 1463 1464 1465
	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);

1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488
	/*
	 * 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)
1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
		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);
}

1500
static bool
1501
intel_hdmi_set_edid(struct drm_connector *connector)
1502 1503 1504
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1505
	struct edid *edid;
1506
	bool connected = false;
1507

1508
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1509

1510 1511 1512
	edid = drm_get_edid(connector,
			    intel_gmbus_get_adapter(dev_priv,
			    intel_hdmi->ddc_bus));
1513

1514
	intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
1515

1516
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1517

1518 1519 1520 1521 1522 1523
	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);
1524
		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
1525 1526

		connected = true;
1527 1528
	}

1529 1530 1531
	return connected;
}

1532 1533
static enum drm_connector_status
intel_hdmi_detect(struct drm_connector *connector, bool force)
1534
{
1535 1536
	enum drm_connector_status status;
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1537

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

1541 1542
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);

1543
	intel_hdmi_unset_edid(connector);
1544

1545
	if (intel_hdmi_set_edid(connector)) {
1546 1547 1548 1549
		struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);

		hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
		status = connector_status_connected;
1550
	} else
1551
		status = connector_status_disconnected;
1552

1553 1554
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);

1555
	return status;
1556 1557
}

1558 1559
static void
intel_hdmi_force(struct drm_connector *connector)
1560
{
1561
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1562

1563 1564
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);
1565

1566
	intel_hdmi_unset_edid(connector);
1567

1568 1569
	if (connector->status != connector_status_connected)
		return;
1570

1571
	intel_hdmi_set_edid(connector);
1572 1573
	hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
}
1574

1575 1576 1577 1578 1579 1580 1581
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;
1582

1583
	return intel_connector_update_modes(connector, edid);
1584 1585
}

1586 1587 1588
static void intel_hdmi_pre_enable(struct intel_encoder *encoder,
				  struct intel_crtc_state *pipe_config,
				  struct drm_connector_state *conn_state)
1589 1590 1591
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);

1592
	intel_hdmi_prepare(encoder, pipe_config);
1593

1594
	intel_hdmi->set_infoframes(&encoder->base,
1595
				   pipe_config->has_hdmi_sink,
1596
				   pipe_config, conn_state);
1597 1598
}

1599 1600 1601
static void vlv_hdmi_pre_enable(struct intel_encoder *encoder,
				struct intel_crtc_state *pipe_config,
				struct drm_connector_state *conn_state)
1602 1603
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1604
	struct intel_hdmi *intel_hdmi = &dport->hdmi;
1605
	struct drm_device *dev = encoder->base.dev;
1606
	struct drm_i915_private *dev_priv = to_i915(dev);
1607 1608

	vlv_phy_pre_encoder_enable(encoder);
1609

1610 1611 1612 1613
	/* HDMI 1.0V-2dB */
	vlv_set_phy_signal_level(encoder, 0x2b245f5f, 0x00002000, 0x5578b83a,
				 0x2b247878);

1614
	intel_hdmi->set_infoframes(&encoder->base,
1615
				   pipe_config->has_hdmi_sink,
1616
				   pipe_config, conn_state);
1617

1618
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1619

1620
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1621 1622
}

1623 1624 1625
static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
				    struct intel_crtc_state *pipe_config,
				    struct drm_connector_state *conn_state)
1626
{
1627
	intel_hdmi_prepare(encoder, pipe_config);
1628

1629
	vlv_phy_pre_pll_enable(encoder);
1630 1631
}

1632 1633 1634
static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
				    struct intel_crtc_state *pipe_config,
				    struct drm_connector_state *conn_state)
1635
{
1636
	intel_hdmi_prepare(encoder, pipe_config);
1637

1638
	chv_phy_pre_pll_enable(encoder);
1639 1640
}

1641 1642 1643
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)
1644
{
1645
	chv_phy_post_pll_disable(encoder);
1646 1647
}

1648 1649 1650
static void vlv_hdmi_post_disable(struct intel_encoder *encoder,
				  struct intel_crtc_state *old_crtc_state,
				  struct drm_connector_state *old_conn_state)
1651 1652
{
	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
1653
	vlv_phy_reset_lanes(encoder);
1654 1655
}

1656 1657 1658
static void chv_hdmi_post_disable(struct intel_encoder *encoder,
				  struct intel_crtc_state *old_crtc_state,
				  struct drm_connector_state *old_conn_state)
1659 1660
{
	struct drm_device *dev = encoder->base.dev;
1661
	struct drm_i915_private *dev_priv = to_i915(dev);
1662

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

1665 1666
	/* Assert data lane reset */
	chv_data_lane_soft_reset(encoder, true);
1667

V
Ville Syrjälä 已提交
1668
	mutex_unlock(&dev_priv->sb_lock);
1669 1670
}

1671 1672 1673
static void chv_hdmi_pre_enable(struct intel_encoder *encoder,
				struct intel_crtc_state *pipe_config,
				struct drm_connector_state *conn_state)
1674 1675
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1676
	struct intel_hdmi *intel_hdmi = &dport->hdmi;
1677
	struct drm_device *dev = encoder->base.dev;
1678
	struct drm_i915_private *dev_priv = to_i915(dev);
1679

1680
	chv_phy_pre_encoder_enable(encoder);
1681

1682 1683
	/* FIXME: Program the support xxx V-dB */
	/* Use 800mV-0dB */
1684
	chv_set_phy_signal_level(encoder, 128, 102, false);
1685

1686
	intel_hdmi->set_infoframes(&encoder->base,
1687 1688
				   pipe_config->has_hdmi_sink,
				   pipe_config, conn_state);
1689

1690
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1691

1692
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1693 1694

	/* Second common lane will stay alive on its own now */
1695
	chv_phy_release_cl2_override(encoder);
1696 1697
}

1698 1699
static void intel_hdmi_destroy(struct drm_connector *connector)
{
1700
	kfree(to_intel_connector(connector)->detect_edid);
1701
	drm_connector_cleanup(connector);
1702
	kfree(connector);
1703 1704 1705
}

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1706
	.dpms = drm_atomic_helper_connector_dpms,
1707
	.detect = intel_hdmi_detect,
1708
	.force = intel_hdmi_force,
1709
	.fill_modes = drm_helper_probe_single_connector_modes,
1710 1711 1712
	.set_property = drm_atomic_helper_connector_set_property,
	.atomic_get_property = intel_digital_connector_atomic_get_property,
	.atomic_set_property = intel_digital_connector_atomic_set_property,
1713
	.late_register = intel_connector_register,
1714
	.early_unregister = intel_connector_unregister,
1715
	.destroy = intel_hdmi_destroy,
1716
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1717
	.atomic_duplicate_state = intel_digital_connector_duplicate_state,
1718 1719 1720 1721 1722
};

static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
	.get_modes = intel_hdmi_get_modes,
	.mode_valid = intel_hdmi_mode_valid,
1723
	.atomic_check = intel_digital_connector_atomic_check,
1724 1725 1726
};

static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
C
Chris Wilson 已提交
1727
	.destroy = intel_encoder_destroy,
1728 1729
};

1730 1731 1732
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1733
	intel_attach_force_audio_property(connector);
1734
	intel_attach_broadcast_rgb_property(connector);
1735
	intel_attach_aspect_ratio_property(connector);
1736
	connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1737 1738
}

S
Shashank Sharma 已提交
1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789
/*
 * 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");
}

1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804
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:
1805
		if (IS_GEN9_LP(dev_priv) || HAS_PCH_CNP(dev_priv))
1806 1807 1808 1809 1810
			ddc_pin = GMBUS_PIN_1_BXT;
		else
			ddc_pin = GMBUS_PIN_DPB;
		break;
	case PORT_C:
1811
		if (IS_GEN9_LP(dev_priv) || HAS_PCH_CNP(dev_priv))
1812 1813 1814 1815 1816
			ddc_pin = GMBUS_PIN_2_BXT;
		else
			ddc_pin = GMBUS_PIN_DPC;
		break;
	case PORT_D:
1817 1818 1819
		if (HAS_PCH_CNP(dev_priv))
			ddc_pin = GMBUS_PIN_4_CNP;
		else if (IS_CHERRYVIEW(dev_priv))
1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835
			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 已提交
1836 1837
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
			       struct intel_connector *intel_connector)
1838
{
1839 1840 1841 1842
	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;
1843
	struct drm_i915_private *dev_priv = to_i915(dev);
1844
	enum port port = intel_dig_port->port;
1845

1846 1847 1848
	DRM_DEBUG_KMS("Adding HDMI connector on port %c\n",
		      port_name(port));

1849 1850 1851 1852 1853
	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;

1854
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1855
			   DRM_MODE_CONNECTOR_HDMIA);
1856 1857
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

1858
	connector->interlace_allowed = 1;
1859
	connector->doublescan_allowed = 0;
1860
	connector->stereo_allowed = 1;
1861

1862 1863
	intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);

1864 1865
	switch (port) {
	case PORT_B:
1866
		intel_encoder->hpd_pin = HPD_PORT_B;
1867 1868
		break;
	case PORT_C:
1869
		intel_encoder->hpd_pin = HPD_PORT_C;
1870 1871
		break;
	case PORT_D:
1872
		intel_encoder->hpd_pin = HPD_PORT_D;
1873
		break;
X
Xiong Zhang 已提交
1874 1875 1876
	case PORT_E:
		intel_encoder->hpd_pin = HPD_PORT_E;
		break;
1877
	default:
1878 1879
		MISSING_CASE(port);
		return;
1880
	}
1881

1882
	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
1883
		intel_hdmi->write_infoframe = vlv_write_infoframe;
1884
		intel_hdmi->set_infoframes = vlv_set_infoframes;
1885
		intel_hdmi->infoframe_enabled = vlv_infoframe_enabled;
1886
	} else if (IS_G4X(dev_priv)) {
1887 1888
		intel_hdmi->write_infoframe = g4x_write_infoframe;
		intel_hdmi->set_infoframes = g4x_set_infoframes;
1889
		intel_hdmi->infoframe_enabled = g4x_infoframe_enabled;
1890
	} else if (HAS_DDI(dev_priv)) {
1891
		intel_hdmi->write_infoframe = hsw_write_infoframe;
1892
		intel_hdmi->set_infoframes = hsw_set_infoframes;
1893
		intel_hdmi->infoframe_enabled = hsw_infoframe_enabled;
1894
	} else if (HAS_PCH_IBX(dev_priv)) {
1895
		intel_hdmi->write_infoframe = ibx_write_infoframe;
1896
		intel_hdmi->set_infoframes = ibx_set_infoframes;
1897
		intel_hdmi->infoframe_enabled = ibx_infoframe_enabled;
1898 1899
	} else {
		intel_hdmi->write_infoframe = cpt_write_infoframe;
1900
		intel_hdmi->set_infoframes = cpt_set_infoframes;
1901
		intel_hdmi->infoframe_enabled = cpt_infoframe_enabled;
1902
	}
1903

1904
	if (HAS_DDI(dev_priv))
1905 1906 1907
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
1908 1909 1910 1911

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
1912
	intel_hdmi->attached_connector = intel_connector;
1913 1914 1915 1916 1917

	/* 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.
	 */
1918
	if (IS_G4X(dev_priv) && !IS_GM45(dev_priv)) {
1919 1920 1921 1922 1923
		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
	}
}

1924
void intel_hdmi_init(struct drm_i915_private *dev_priv,
1925
		     i915_reg_t hdmi_reg, enum port port)
1926 1927 1928 1929 1930
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

1931
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
1932 1933 1934
	if (!intel_dig_port)
		return;

1935
	intel_connector = intel_connector_alloc();
1936 1937 1938 1939 1940 1941 1942
	if (!intel_connector) {
		kfree(intel_dig_port);
		return;
	}

	intel_encoder = &intel_dig_port->base;

1943 1944 1945
	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 已提交
1946

1947
	intel_encoder->compute_config = intel_hdmi_compute_config;
1948
	if (HAS_PCH_SPLIT(dev_priv)) {
1949 1950 1951 1952 1953
		intel_encoder->disable = pch_disable_hdmi;
		intel_encoder->post_disable = pch_post_disable_hdmi;
	} else {
		intel_encoder->disable = g4x_disable_hdmi;
	}
P
Paulo Zanoni 已提交
1954
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
1955
	intel_encoder->get_config = intel_hdmi_get_config;
1956
	if (IS_CHERRYVIEW(dev_priv)) {
1957
		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
1958 1959
		intel_encoder->pre_enable = chv_hdmi_pre_enable;
		intel_encoder->enable = vlv_enable_hdmi;
1960
		intel_encoder->post_disable = chv_hdmi_post_disable;
1961
		intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable;
1962
	} else if (IS_VALLEYVIEW(dev_priv)) {
1963 1964
		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
1965
		intel_encoder->enable = vlv_enable_hdmi;
1966
		intel_encoder->post_disable = vlv_hdmi_post_disable;
1967
	} else {
1968
		intel_encoder->pre_enable = intel_hdmi_pre_enable;
1969
		if (HAS_PCH_CPT(dev_priv))
1970
			intel_encoder->enable = cpt_enable_hdmi;
1971
		else if (HAS_PCH_IBX(dev_priv))
1972
			intel_encoder->enable = ibx_enable_hdmi;
1973
		else
1974
			intel_encoder->enable = g4x_enable_hdmi;
1975
	}
1976

1977
	intel_encoder->type = INTEL_OUTPUT_HDMI;
1978
	intel_encoder->power_domain = intel_port_to_power_domain(port);
1979
	intel_encoder->port = port;
1980
	if (IS_CHERRYVIEW(dev_priv)) {
1981 1982 1983 1984 1985 1986 1987
		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);
	}
1988
	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
1989 1990 1991 1992 1993
	/*
	 * 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.
	 */
1994
	if (IS_G4X(dev_priv))
1995
		intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
1996

1997
	intel_dig_port->port = port;
1998
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
1999
	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
2000
	intel_dig_port->max_lanes = 4;
2001

2002
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2003
}