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

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

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

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

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

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

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

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

73
static u32 g4x_infoframe_index(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 1221 1222 1223 1224 1225 1226
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) {
1227 1228 1229
		struct intel_connector *connector = hdmi->attached_connector;
		const struct drm_display_info *info = &connector->base.display_info;

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

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

	return max_tmds_clock;
}

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

	if (clock < 25000)
		return MODE_CLOCK_LOW;
1252
	if (clock > hdmi_port_clock_limit(hdmi, respect_downstream_limits))
1253 1254
		return MODE_CLOCK_HIGH;

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

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

	return MODE_OK;
}

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

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

1280
	clock = mode->clock;
M
Mika Kahola 已提交
1281 1282 1283 1284 1285 1286 1287

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

	if (clock > max_dotclk)
		return MODE_CLOCK_HIGH;

1288 1289 1290
	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
		clock *= 2;

1291 1292
	/* check if we can do 8bpc */
	status = hdmi_port_clock_valid(hdmi, clock, true);
1293

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

1298
	return status;
1299 1300
}

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

1310
	if (HAS_GMCH_DISPLAY(dev_priv))
1311 1312 1313 1314 1315 1316
		return false;

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

1330 1331 1332 1333 1334
	/* Display Wa #1139 */
	if (IS_GLK_REVID(dev_priv, 0, GLK_REVID_A1) &&
	    crtc_state->base.adjusted_mode.htotal > 5460)
		return false;

1335
	return true;
1336 1337
}

1338
bool intel_hdmi_compute_config(struct intel_encoder *encoder,
1339 1340
			       struct intel_crtc_state *pipe_config,
			       struct drm_connector_state *conn_state)
1341
{
1342
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1343
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1344
	struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
S
Shashank Sharma 已提交
1345
	struct drm_scdc *scdc = &conn_state->connector->display_info.hdmi.scdc;
1346 1347
	int clock_8bpc = pipe_config->base.adjusted_mode.crtc_clock;
	int clock_12bpc = clock_8bpc * 3 / 2;
1348
	int desired_bpp;
1349

1350 1351
	pipe_config->has_hdmi_sink = intel_hdmi->has_hdmi_sink;

1352 1353 1354
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

1355 1356
	if (intel_hdmi->color_range_auto) {
		/* See CEA-861-E - 5.1 Default Encoding Parameters */
1357 1358
		pipe_config->limited_color_range =
			pipe_config->has_hdmi_sink &&
1359 1360
			drm_default_rgb_quant_range(adjusted_mode) ==
			HDMI_QUANTIZATION_RANGE_LIMITED;
1361 1362 1363
	} else {
		pipe_config->limited_color_range =
			intel_hdmi->limited_color_range;
1364 1365
	}

1366 1367
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
		pipe_config->pixel_multiplier = 2;
1368
		clock_8bpc *= 2;
1369
		clock_12bpc *= 2;
1370 1371
	}

1372
	if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv))
1373 1374
		pipe_config->has_pch_encoder = true;

1375 1376 1377
	if (pipe_config->has_hdmi_sink && intel_hdmi->has_audio)
		pipe_config->has_audio = true;

1378 1379 1380
	/*
	 * 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
1381 1382
	 * outputs. We also need to check that the higher clock still fits
	 * within limits.
1383
	 */
1384
	if (pipe_config->pipe_bpp > 8*3 && pipe_config->has_hdmi_sink &&
1385
	    hdmi_port_clock_valid(intel_hdmi, clock_12bpc, true) == MODE_OK &&
1386
	    hdmi_12bpc_possible(pipe_config)) {
1387 1388
		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
		desired_bpp = 12*3;
1389 1390

		/* Need to adjust the port link by 1.5x for 12bpc. */
1391
		pipe_config->port_clock = clock_12bpc;
1392
	} else {
1393 1394
		DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
		desired_bpp = 8*3;
1395 1396

		pipe_config->port_clock = clock_8bpc;
1397 1398 1399
	}

	if (!pipe_config->bw_constrained) {
1400
		DRM_DEBUG_KMS("forcing pipe bpp to %i for HDMI\n", desired_bpp);
1401
		pipe_config->pipe_bpp = desired_bpp;
1402 1403
	}

1404 1405 1406
	if (hdmi_port_clock_valid(intel_hdmi, pipe_config->port_clock,
				  false) != MODE_OK) {
		DRM_DEBUG_KMS("unsupported HDMI clock, rejecting mode\n");
1407 1408 1409
		return false;
	}

1410 1411 1412
	/* Set user selected PAR to incoming mode's member */
	adjusted_mode->picture_aspect_ratio = intel_hdmi->aspect_ratio;

1413 1414
	pipe_config->lane_count = 4;

S
Shashank Sharma 已提交
1415 1416 1417 1418 1419 1420 1421 1422 1423 1424
	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;
		}
	}

1425 1426 1427
	return true;
}

1428 1429
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1430
{
1431
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1432

1433 1434 1435 1436
	intel_hdmi->has_hdmi_sink = false;
	intel_hdmi->has_audio = false;
	intel_hdmi->rgb_quant_range_selectable = false;

1437 1438 1439
	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;

1440 1441 1442 1443
	kfree(to_intel_connector(connector)->detect_edid);
	to_intel_connector(connector)->detect_edid = NULL;
}

1444
static void
1445
intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
1446 1447 1448
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
1449
	enum port port = hdmi_to_dig_port(hdmi)->port;
1450 1451 1452 1453
	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);

1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476
	/*
	 * 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)
1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487
		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);
}

1488
static bool
1489
intel_hdmi_set_edid(struct drm_connector *connector)
1490 1491 1492
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1493
	struct edid *edid;
1494
	bool connected = false;
1495

1496
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1497

1498 1499 1500
	edid = drm_get_edid(connector,
			    intel_gmbus_get_adapter(dev_priv,
			    intel_hdmi->ddc_bus));
1501

1502
	intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
1503

1504
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1505

1506 1507 1508 1509 1510 1511
	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);
1512 1513
		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
			intel_hdmi->has_audio =
1514 1515 1516 1517 1518 1519 1520
				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;
1521 1522
	}

1523 1524 1525
	return connected;
}

1526 1527
static enum drm_connector_status
intel_hdmi_detect(struct drm_connector *connector, bool force)
1528
{
1529 1530
	enum drm_connector_status status;
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1531

1532 1533 1534
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);

1535 1536
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);

1537
	intel_hdmi_unset_edid(connector);
1538

1539
	if (intel_hdmi_set_edid(connector)) {
1540 1541 1542 1543
		struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);

		hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
		status = connector_status_connected;
1544
	} else
1545
		status = connector_status_disconnected;
1546

1547 1548
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);

1549
	return status;
1550 1551
}

1552 1553
static void
intel_hdmi_force(struct drm_connector *connector)
1554
{
1555
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1556

1557 1558
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);
1559

1560
	intel_hdmi_unset_edid(connector);
1561

1562 1563
	if (connector->status != connector_status_connected)
		return;
1564

1565
	intel_hdmi_set_edid(connector);
1566 1567
	hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
}
1568

1569 1570 1571 1572 1573 1574 1575
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;
1576

1577
	return intel_connector_update_modes(connector, edid);
1578 1579
}

1580 1581 1582 1583
static bool
intel_hdmi_detect_audio(struct drm_connector *connector)
{
	bool has_audio = false;
1584
	struct edid *edid;
1585

1586 1587 1588
	edid = to_intel_connector(connector)->detect_edid;
	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL)
		has_audio = drm_detect_monitor_audio(edid);
1589

1590 1591 1592
	return has_audio;
}

1593 1594
static int
intel_hdmi_set_property(struct drm_connector *connector,
1595 1596
			struct drm_property *property,
			uint64_t val)
1597 1598
{
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1599 1600
	struct intel_digital_port *intel_dig_port =
		hdmi_to_dig_port(intel_hdmi);
1601
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1602 1603
	int ret;

1604
	ret = drm_object_property_set_value(&connector->base, property, val);
1605 1606 1607
	if (ret)
		return ret;

1608
	if (property == dev_priv->force_audio_property) {
1609
		enum hdmi_force_audio i = val;
1610 1611 1612
		bool has_audio;

		if (i == intel_hdmi->force_audio)
1613 1614
			return 0;

1615
		intel_hdmi->force_audio = i;
1616

1617
		if (i == HDMI_AUDIO_AUTO)
1618 1619
			has_audio = intel_hdmi_detect_audio(connector);
		else
1620
			has_audio = (i == HDMI_AUDIO_ON);
1621

1622 1623
		if (i == HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink = 0;
1624

1625
		intel_hdmi->has_audio = has_audio;
1626 1627 1628
		goto done;
	}

1629
	if (property == dev_priv->broadcast_rgb_property) {
1630
		bool old_auto = intel_hdmi->color_range_auto;
1631
		bool old_range = intel_hdmi->limited_color_range;
1632

1633 1634 1635 1636 1637 1638
		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;
1639
			intel_hdmi->limited_color_range = false;
1640 1641 1642
			break;
		case INTEL_BROADCAST_RGB_LIMITED:
			intel_hdmi->color_range_auto = false;
1643
			intel_hdmi->limited_color_range = true;
1644 1645 1646 1647
			break;
		default:
			return -EINVAL;
		}
1648 1649

		if (old_auto == intel_hdmi->color_range_auto &&
1650
		    old_range == intel_hdmi->limited_color_range)
1651 1652
			return 0;

1653 1654 1655
		goto done;
	}

1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672
	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;
	}

1673 1674 1675
	return -EINVAL;

done:
1676 1677
	if (intel_dig_port->base.base.crtc)
		intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
1678 1679 1680 1681

	return 0;
}

1682 1683 1684
static void intel_hdmi_pre_enable(struct intel_encoder *encoder,
				  struct intel_crtc_state *pipe_config,
				  struct drm_connector_state *conn_state)
1685 1686 1687
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);

1688
	intel_hdmi_prepare(encoder, pipe_config);
1689

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

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

	vlv_phy_pre_encoder_enable(encoder);
1705

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

1710
	intel_hdmi->set_infoframes(&encoder->base,
1711
				   pipe_config->has_hdmi_sink,
1712
				   pipe_config, conn_state);
1713

1714
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1715

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

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

1725
	vlv_phy_pre_pll_enable(encoder);
1726 1727
}

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

1734
	chv_phy_pre_pll_enable(encoder);
1735 1736
}

1737 1738 1739
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)
1740
{
1741
	chv_phy_post_pll_disable(encoder);
1742 1743
}

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

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

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

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

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

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

1776
	chv_phy_pre_encoder_enable(encoder);
1777

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

1782
	intel_hdmi->set_infoframes(&encoder->base,
1783 1784
				   pipe_config->has_hdmi_sink,
				   pipe_config, conn_state);
1785

1786
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1787

1788
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1789 1790

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

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

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1802
	.dpms = drm_atomic_helper_connector_dpms,
1803
	.detect = intel_hdmi_detect,
1804
	.force = intel_hdmi_force,
1805
	.fill_modes = drm_helper_probe_single_connector_modes,
1806
	.set_property = intel_hdmi_set_property,
1807
	.atomic_get_property = intel_connector_atomic_get_property,
1808
	.late_register = intel_connector_register,
1809
	.early_unregister = intel_connector_unregister,
1810
	.destroy = intel_hdmi_destroy,
1811
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1812
	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1813 1814 1815 1816 1817 1818 1819 1820
};

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 已提交
1821
	.destroy = intel_encoder_destroy,
1822 1823
};

1824 1825 1826
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1827
	intel_attach_force_audio_property(connector);
1828
	intel_attach_broadcast_rgb_property(connector);
1829
	intel_hdmi->color_range_auto = true;
1830 1831
	intel_attach_aspect_ratio_property(connector);
	intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1832 1833
}

S
Shashank Sharma 已提交
1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884
/*
 * 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");
}

1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899
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:
1900
		if (IS_GEN9_LP(dev_priv))
1901 1902 1903 1904 1905
			ddc_pin = GMBUS_PIN_1_BXT;
		else
			ddc_pin = GMBUS_PIN_DPB;
		break;
	case PORT_C:
1906
		if (IS_GEN9_LP(dev_priv))
1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928
			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 已提交
1929 1930
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
			       struct intel_connector *intel_connector)
1931
{
1932 1933 1934 1935
	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;
1936
	struct drm_i915_private *dev_priv = to_i915(dev);
1937
	enum port port = intel_dig_port->port;
1938

1939 1940 1941
	DRM_DEBUG_KMS("Adding HDMI connector on port %c\n",
		      port_name(port));

1942 1943 1944 1945 1946
	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;

1947
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1948
			   DRM_MODE_CONNECTOR_HDMIA);
1949 1950
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

1951
	connector->interlace_allowed = 1;
1952
	connector->doublescan_allowed = 0;
1953
	connector->stereo_allowed = 1;
1954

1955 1956
	intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);

1957 1958
	switch (port) {
	case PORT_B:
1959
		intel_encoder->hpd_pin = HPD_PORT_B;
1960 1961
		break;
	case PORT_C:
1962
		intel_encoder->hpd_pin = HPD_PORT_C;
1963 1964
		break;
	case PORT_D:
1965
		intel_encoder->hpd_pin = HPD_PORT_D;
1966
		break;
X
Xiong Zhang 已提交
1967 1968 1969
	case PORT_E:
		intel_encoder->hpd_pin = HPD_PORT_E;
		break;
1970
	default:
1971 1972
		MISSING_CASE(port);
		return;
1973
	}
1974

1975
	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
1976
		intel_hdmi->write_infoframe = vlv_write_infoframe;
1977
		intel_hdmi->set_infoframes = vlv_set_infoframes;
1978
		intel_hdmi->infoframe_enabled = vlv_infoframe_enabled;
1979
	} else if (IS_G4X(dev_priv)) {
1980 1981
		intel_hdmi->write_infoframe = g4x_write_infoframe;
		intel_hdmi->set_infoframes = g4x_set_infoframes;
1982
		intel_hdmi->infoframe_enabled = g4x_infoframe_enabled;
1983
	} else if (HAS_DDI(dev_priv)) {
1984
		intel_hdmi->write_infoframe = hsw_write_infoframe;
1985
		intel_hdmi->set_infoframes = hsw_set_infoframes;
1986
		intel_hdmi->infoframe_enabled = hsw_infoframe_enabled;
1987
	} else if (HAS_PCH_IBX(dev_priv)) {
1988
		intel_hdmi->write_infoframe = ibx_write_infoframe;
1989
		intel_hdmi->set_infoframes = ibx_set_infoframes;
1990
		intel_hdmi->infoframe_enabled = ibx_infoframe_enabled;
1991 1992
	} else {
		intel_hdmi->write_infoframe = cpt_write_infoframe;
1993
		intel_hdmi->set_infoframes = cpt_set_infoframes;
1994
		intel_hdmi->infoframe_enabled = cpt_infoframe_enabled;
1995
	}
1996

1997
	if (HAS_DDI(dev_priv))
1998 1999 2000
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
2001 2002 2003 2004

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
2005
	intel_hdmi->attached_connector = intel_connector;
2006 2007 2008 2009 2010

	/* 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.
	 */
2011
	if (IS_G4X(dev_priv) && !IS_GM45(dev_priv)) {
2012 2013 2014 2015 2016
		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
	}
}

2017
void intel_hdmi_init(struct drm_i915_private *dev_priv,
2018
		     i915_reg_t hdmi_reg, enum port port)
2019 2020 2021 2022 2023
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

2024
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
2025 2026 2027
	if (!intel_dig_port)
		return;

2028
	intel_connector = intel_connector_alloc();
2029 2030 2031 2032 2033 2034 2035
	if (!intel_connector) {
		kfree(intel_dig_port);
		return;
	}

	intel_encoder = &intel_dig_port->base;

2036 2037 2038
	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 已提交
2039

2040
	intel_encoder->compute_config = intel_hdmi_compute_config;
2041
	if (HAS_PCH_SPLIT(dev_priv)) {
2042 2043 2044 2045 2046
		intel_encoder->disable = pch_disable_hdmi;
		intel_encoder->post_disable = pch_post_disable_hdmi;
	} else {
		intel_encoder->disable = g4x_disable_hdmi;
	}
P
Paulo Zanoni 已提交
2047
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
2048
	intel_encoder->get_config = intel_hdmi_get_config;
2049
	if (IS_CHERRYVIEW(dev_priv)) {
2050
		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
2051 2052
		intel_encoder->pre_enable = chv_hdmi_pre_enable;
		intel_encoder->enable = vlv_enable_hdmi;
2053
		intel_encoder->post_disable = chv_hdmi_post_disable;
2054
		intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable;
2055
	} else if (IS_VALLEYVIEW(dev_priv)) {
2056 2057
		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
2058
		intel_encoder->enable = vlv_enable_hdmi;
2059
		intel_encoder->post_disable = vlv_hdmi_post_disable;
2060
	} else {
2061
		intel_encoder->pre_enable = intel_hdmi_pre_enable;
2062
		if (HAS_PCH_CPT(dev_priv))
2063
			intel_encoder->enable = cpt_enable_hdmi;
2064
		else if (HAS_PCH_IBX(dev_priv))
2065
			intel_encoder->enable = ibx_enable_hdmi;
2066
		else
2067
			intel_encoder->enable = g4x_enable_hdmi;
2068
	}
2069

2070
	intel_encoder->type = INTEL_OUTPUT_HDMI;
2071
	intel_encoder->power_domain = intel_port_to_power_domain(port);
2072
	intel_encoder->port = port;
2073
	if (IS_CHERRYVIEW(dev_priv)) {
2074 2075 2076 2077 2078 2079 2080
		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);
	}
2081
	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
2082 2083 2084 2085 2086
	/*
	 * 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.
	 */
2087
	if (IS_G4X(dev_priv))
2088
		intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
2089

2090
	intel_dig_port->port = port;
2091
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
2092
	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
2093
	intel_dig_port->max_lanes = 4;
2094

2095
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2096
}