intel_hdmi.c 58.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>
37
#include "intel_drv.h"
38
#include <drm/i915_drm.h>
39 40
#include "i915_drv.h"

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

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

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

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

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

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

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

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

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

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

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

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

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

151
	val &= ~g4x_infoframe_enable(type);
152

153
	I915_WRITE(VIDEO_DIP_CTL, val);
154

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

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

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

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

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

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

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

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

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

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

	I915_WRITE(reg, val);

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

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

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

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

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

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

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

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

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

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

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

273
	I915_WRITE(reg, val);
274

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

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

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

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

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

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

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

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

326
	val &= ~g4x_infoframe_enable(type);
327

328
	I915_WRITE(reg, val);
329

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

454
static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
455
					 const struct intel_crtc_state *crtc_state)
456
{
457
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
458 459
	union hdmi_infoframe frame;
	int ret;
460

461
	ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
462
						       &crtc_state->base.adjusted_mode);
463 464 465 466
	if (ret < 0) {
		DRM_ERROR("couldn't fill AVI infoframe\n");
		return;
	}
P
Paulo Zanoni 已提交
467

468
	if (intel_hdmi->rgb_quant_range_selectable) {
469
		if (crtc_state->limited_color_range)
470 471
			frame.avi.quantization_range =
				HDMI_QUANTIZATION_RANGE_LIMITED;
472
		else
473 474
			frame.avi.quantization_range =
				HDMI_QUANTIZATION_RANGE_FULL;
475 476
	}

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

480 481
static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder,
					 const struct intel_crtc_state *crtc_state)
482
{
483 484 485 486 487 488 489 490
	union hdmi_infoframe frame;
	int ret;

	ret = hdmi_spd_infoframe_init(&frame.spd, "Intel", "Integrated gfx");
	if (ret < 0) {
		DRM_ERROR("couldn't fill SPD infoframe\n");
		return;
	}
491

492
	frame.spd.sdi = HDMI_SPD_SDI_PC;
493

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

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

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

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

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

524 525
	assert_hdmi_port_disabled(intel_hdmi);

526 527 528 529 530 531 532 533 534 535 536
	/* If the registers were not initialized yet, they might be zeroes,
	 * which means we're selecting the AVI DIP and we're setting its
	 * frequency to once. This seems to really confuse the HW and make
	 * things stop working (the register spec says the AVI always needs to
	 * be sent every VSync). So here we avoid writing to the register more
	 * than we need and also explicitly select the AVI DIP and explicitly
	 * set its frequency to every VSync. Avoiding to write it twice seems to
	 * be enough to solve the problem, but being defensive shouldn't hurt us
	 * either. */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

537
	if (!enable) {
538 539
		if (!(val & VIDEO_DIP_ENABLE))
			return;
540 541 542 543 544 545 546
		if (port != (val & VIDEO_DIP_PORT_MASK)) {
			DRM_DEBUG_KMS("video DIP still enabled on port %c\n",
				      (val & VIDEO_DIP_PORT_MASK) >> 29);
			return;
		}
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
547
		I915_WRITE(reg, val);
548
		POSTING_READ(reg);
549 550 551
		return;
	}

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

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

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

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

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

	/*
	 * HDMI cloning is only supported on g4x which doesn't
	 * support deep color or GCP infoframes anyway so no
	 * need to worry about multiple HDMI sinks here.
	 */

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

587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629
/*
 * Determine if default_phase=1 can be indicated in the GCP infoframe.
 *
 * From HDMI specification 1.4a:
 * - The first pixel of each Video Data Period shall always have a pixel packing phase of 0
 * - The first pixel following each Video Data Period shall have a pixel packing phase of 0
 * - The PP bits shall be constant for all GCPs and will be equal to the last packing phase
 * - The first pixel following every transition of HSYNC or VSYNC shall have a pixel packing
 *   phase of 0
 */
static bool gcp_default_phase_possible(int pipe_bpp,
				       const struct drm_display_mode *mode)
{
	unsigned int pixels_per_group;

	switch (pipe_bpp) {
	case 30:
		/* 4 pixels in 5 clocks */
		pixels_per_group = 4;
		break;
	case 36:
		/* 2 pixels in 3 clocks */
		pixels_per_group = 2;
		break;
	case 48:
		/* 1 pixel in 2 clocks */
		pixels_per_group = 1;
		break;
	default:
		/* phase information not relevant for 8bpc */
		return false;
	}

	return mode->crtc_hdisplay % pixels_per_group == 0 &&
		mode->crtc_htotal % pixels_per_group == 0 &&
		mode->crtc_hblank_start % pixels_per_group == 0 &&
		mode->crtc_hblank_end % pixels_per_group == 0 &&
		mode->crtc_hsync_start % pixels_per_group == 0 &&
		mode->crtc_hsync_end % pixels_per_group == 0 &&
		((mode->flags & DRM_MODE_FLAG_INTERLACE) == 0 ||
		 mode->crtc_htotal/2 % pixels_per_group == 0);
}

630 631 632
static bool intel_hdmi_set_gcp_infoframe(struct drm_encoder *encoder,
					 const struct intel_crtc_state *crtc_state,
					 const struct drm_connector_state *conn_state)
633
{
634
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
635
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
636 637
	i915_reg_t reg;
	u32 val = 0;
638 639

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

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

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

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

	return val != 0;
}

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

675 676
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

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

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

726 727
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

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

771 772
	assert_hdmi_port_disabled(intel_hdmi);

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

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

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

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

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

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

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

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

821 822
	assert_hdmi_port_disabled(intel_hdmi);

823 824 825 826
	val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
		 VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
		 VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);

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

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

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

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

844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859
void intel_dp_dual_mode_set_tmds_output(struct intel_hdmi *hdmi, bool enable)
{
	struct drm_i915_private *dev_priv = to_i915(intel_hdmi_to_dev(hdmi));
	struct i2c_adapter *adapter =
		intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);

	if (hdmi->dp_dual_mode.type < DRM_DP_DUAL_MODE_TYPE2_DVI)
		return;

	DRM_DEBUG_KMS("%s DP dual mode adaptor TMDS output\n",
		      enable ? "Enabling" : "Disabling");

	drm_dp_dual_mode_set_tmds_output(hdmi->dp_dual_mode.type,
					 adapter, enable);
}

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

870 871
	intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);

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

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

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

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

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

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

909
	power_domain = intel_display_port_power_domain(encoder);
910
	if (!intel_display_power_get_if_enabled(dev_priv, 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 930 931 932
	ret = true;

out:
	intel_display_power_put(dev_priv, power_domain);

	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
	else if (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)
1213 1214 1215 1216 1217
		return 300000;
	else
		return 225000;
}

1218 1219 1220 1221 1222 1223 1224
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) {
1225 1226 1227
		struct intel_connector *connector = hdmi->attached_connector;
		const struct drm_display_info *info = &connector->base.display_info;

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

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

	return max_tmds_clock;
}

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

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

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

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

	return MODE_OK;
}

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

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

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

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

	if (clock > max_dotclk)
		return MODE_CLOCK_HIGH;

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

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

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

1296
	return status;
1297 1298
}

1299
static bool hdmi_12bpc_possible(struct intel_crtc_state *crtc_state)
1300
{
1301
	struct drm_device *dev = crtc_state->base.crtc->dev;
1302

1303
	if (HAS_GMCH_DISPLAY(to_i915(dev)))
1304 1305 1306 1307 1308 1309
		return false;

	/*
	 * HDMI 12bpc affects the clocks, so it's only possible
	 * when not cloning with other encoder types.
	 */
1310
	return crtc_state->output_types == 1 << INTEL_OUTPUT_HDMI;
1311 1312
}

1313
bool intel_hdmi_compute_config(struct intel_encoder *encoder,
1314 1315
			       struct intel_crtc_state *pipe_config,
			       struct drm_connector_state *conn_state)
1316
{
1317
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1318
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1319
	struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
1320 1321
	int clock_8bpc = pipe_config->base.adjusted_mode.crtc_clock;
	int clock_12bpc = clock_8bpc * 3 / 2;
1322
	int desired_bpp;
1323

1324 1325
	pipe_config->has_hdmi_sink = intel_hdmi->has_hdmi_sink;

1326 1327 1328
	if (pipe_config->has_hdmi_sink)
		pipe_config->has_infoframe = true;

1329 1330
	if (intel_hdmi->color_range_auto) {
		/* See CEA-861-E - 5.1 Default Encoding Parameters */
1331 1332 1333 1334 1335 1336
		pipe_config->limited_color_range =
			pipe_config->has_hdmi_sink &&
			drm_match_cea_mode(adjusted_mode) > 1;
	} else {
		pipe_config->limited_color_range =
			intel_hdmi->limited_color_range;
1337 1338
	}

1339 1340
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
		pipe_config->pixel_multiplier = 2;
1341
		clock_8bpc *= 2;
1342
		clock_12bpc *= 2;
1343 1344
	}

1345
	if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv))
1346 1347
		pipe_config->has_pch_encoder = true;

1348 1349 1350
	if (pipe_config->has_hdmi_sink && intel_hdmi->has_audio)
		pipe_config->has_audio = true;

1351 1352 1353
	/*
	 * 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
1354 1355
	 * outputs. We also need to check that the higher clock still fits
	 * within limits.
1356
	 */
1357
	if (pipe_config->pipe_bpp > 8*3 && pipe_config->has_hdmi_sink &&
1358
	    hdmi_port_clock_valid(intel_hdmi, clock_12bpc, true) == MODE_OK &&
1359
	    hdmi_12bpc_possible(pipe_config)) {
1360 1361
		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
		desired_bpp = 12*3;
1362 1363

		/* Need to adjust the port link by 1.5x for 12bpc. */
1364
		pipe_config->port_clock = clock_12bpc;
1365
	} else {
1366 1367
		DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
		desired_bpp = 8*3;
1368 1369

		pipe_config->port_clock = clock_8bpc;
1370 1371 1372 1373 1374
	}

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

1377 1378 1379
	if (hdmi_port_clock_valid(intel_hdmi, pipe_config->port_clock,
				  false) != MODE_OK) {
		DRM_DEBUG_KMS("unsupported HDMI clock, rejecting mode\n");
1380 1381 1382
		return false;
	}

1383 1384 1385
	/* Set user selected PAR to incoming mode's member */
	adjusted_mode->picture_aspect_ratio = intel_hdmi->aspect_ratio;

1386 1387
	pipe_config->lane_count = 4;

1388 1389 1390
	return true;
}

1391 1392
static void
intel_hdmi_unset_edid(struct drm_connector *connector)
1393
{
1394
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1395

1396 1397 1398 1399
	intel_hdmi->has_hdmi_sink = false;
	intel_hdmi->has_audio = false;
	intel_hdmi->rgb_quant_range_selectable = false;

1400 1401 1402
	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;

1403 1404 1405 1406
	kfree(to_intel_connector(connector)->detect_edid);
	to_intel_connector(connector)->detect_edid = NULL;
}

1407
static void
1408
intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
1409 1410 1411
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
1412
	enum port port = hdmi_to_dig_port(hdmi)->port;
1413 1414 1415 1416
	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);

1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439
	/*
	 * 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)
1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
		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);
}

1451
static bool
1452
intel_hdmi_set_edid(struct drm_connector *connector)
1453 1454 1455
{
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1456
	struct edid *edid;
1457
	bool connected = false;
1458

1459
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1460

1461 1462 1463
	edid = drm_get_edid(connector,
			    intel_gmbus_get_adapter(dev_priv,
			    intel_hdmi->ddc_bus));
1464

1465
	intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
1466

1467
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1468

1469 1470 1471 1472 1473 1474
	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);
1475 1476
		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
			intel_hdmi->has_audio =
1477 1478 1479 1480 1481 1482 1483
				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;
1484 1485
	}

1486 1487 1488
	return connected;
}

1489 1490
static enum drm_connector_status
intel_hdmi_detect(struct drm_connector *connector, bool force)
1491
{
1492 1493
	enum drm_connector_status status;
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1494

1495 1496 1497
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);

1498 1499
	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);

1500
	intel_hdmi_unset_edid(connector);
1501

1502
	if (intel_hdmi_set_edid(connector)) {
1503 1504 1505 1506
		struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);

		hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
		status = connector_status_connected;
1507
	} else
1508
		status = connector_status_disconnected;
1509

1510 1511
	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);

1512
	return status;
1513 1514
}

1515 1516
static void
intel_hdmi_force(struct drm_connector *connector)
1517
{
1518
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1519

1520 1521
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
		      connector->base.id, connector->name);
1522

1523
	intel_hdmi_unset_edid(connector);
1524

1525 1526
	if (connector->status != connector_status_connected)
		return;
1527

1528
	intel_hdmi_set_edid(connector);
1529 1530
	hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
}
1531

1532 1533 1534 1535 1536 1537 1538
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;
1539

1540
	return intel_connector_update_modes(connector, edid);
1541 1542
}

1543 1544 1545 1546
static bool
intel_hdmi_detect_audio(struct drm_connector *connector)
{
	bool has_audio = false;
1547
	struct edid *edid;
1548

1549 1550 1551
	edid = to_intel_connector(connector)->detect_edid;
	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL)
		has_audio = drm_detect_monitor_audio(edid);
1552

1553 1554 1555
	return has_audio;
}

1556 1557
static int
intel_hdmi_set_property(struct drm_connector *connector,
1558 1559
			struct drm_property *property,
			uint64_t val)
1560 1561
{
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1562 1563
	struct intel_digital_port *intel_dig_port =
		hdmi_to_dig_port(intel_hdmi);
1564
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1565 1566
	int ret;

1567
	ret = drm_object_property_set_value(&connector->base, property, val);
1568 1569 1570
	if (ret)
		return ret;

1571
	if (property == dev_priv->force_audio_property) {
1572
		enum hdmi_force_audio i = val;
1573 1574 1575
		bool has_audio;

		if (i == intel_hdmi->force_audio)
1576 1577
			return 0;

1578
		intel_hdmi->force_audio = i;
1579

1580
		if (i == HDMI_AUDIO_AUTO)
1581 1582
			has_audio = intel_hdmi_detect_audio(connector);
		else
1583
			has_audio = (i == HDMI_AUDIO_ON);
1584

1585 1586
		if (i == HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink = 0;
1587

1588
		intel_hdmi->has_audio = has_audio;
1589 1590 1591
		goto done;
	}

1592
	if (property == dev_priv->broadcast_rgb_property) {
1593
		bool old_auto = intel_hdmi->color_range_auto;
1594
		bool old_range = intel_hdmi->limited_color_range;
1595

1596 1597 1598 1599 1600 1601
		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;
1602
			intel_hdmi->limited_color_range = false;
1603 1604 1605
			break;
		case INTEL_BROADCAST_RGB_LIMITED:
			intel_hdmi->color_range_auto = false;
1606
			intel_hdmi->limited_color_range = true;
1607 1608 1609 1610
			break;
		default:
			return -EINVAL;
		}
1611 1612

		if (old_auto == intel_hdmi->color_range_auto &&
1613
		    old_range == intel_hdmi->limited_color_range)
1614 1615
			return 0;

1616 1617 1618
		goto done;
	}

1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635
	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;
	}

1636 1637 1638
	return -EINVAL;

done:
1639 1640
	if (intel_dig_port->base.base.crtc)
		intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
1641 1642 1643 1644

	return 0;
}

1645 1646 1647
static void intel_hdmi_pre_enable(struct intel_encoder *encoder,
				  struct intel_crtc_state *pipe_config,
				  struct drm_connector_state *conn_state)
1648 1649 1650
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);

1651
	intel_hdmi_prepare(encoder, pipe_config);
1652

1653
	intel_hdmi->set_infoframes(&encoder->base,
1654
				   pipe_config->has_hdmi_sink,
1655
				   pipe_config, conn_state);
1656 1657
}

1658 1659 1660
static void vlv_hdmi_pre_enable(struct intel_encoder *encoder,
				struct intel_crtc_state *pipe_config,
				struct drm_connector_state *conn_state)
1661 1662
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1663
	struct intel_hdmi *intel_hdmi = &dport->hdmi;
1664
	struct drm_device *dev = encoder->base.dev;
1665
	struct drm_i915_private *dev_priv = to_i915(dev);
1666 1667

	vlv_phy_pre_encoder_enable(encoder);
1668

1669 1670 1671 1672
	/* HDMI 1.0V-2dB */
	vlv_set_phy_signal_level(encoder, 0x2b245f5f, 0x00002000, 0x5578b83a,
				 0x2b247878);

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

1677
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1678

1679
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1680 1681
}

1682 1683 1684
static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
				    struct intel_crtc_state *pipe_config,
				    struct drm_connector_state *conn_state)
1685
{
1686
	intel_hdmi_prepare(encoder, pipe_config);
1687

1688
	vlv_phy_pre_pll_enable(encoder);
1689 1690
}

1691 1692 1693
static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
				    struct intel_crtc_state *pipe_config,
				    struct drm_connector_state *conn_state)
1694
{
1695
	intel_hdmi_prepare(encoder, pipe_config);
1696

1697
	chv_phy_pre_pll_enable(encoder);
1698 1699
}

1700 1701 1702
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)
1703
{
1704
	chv_phy_post_pll_disable(encoder);
1705 1706
}

1707 1708 1709
static void vlv_hdmi_post_disable(struct intel_encoder *encoder,
				  struct intel_crtc_state *old_crtc_state,
				  struct drm_connector_state *old_conn_state)
1710 1711
{
	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
1712
	vlv_phy_reset_lanes(encoder);
1713 1714
}

1715 1716 1717
static void chv_hdmi_post_disable(struct intel_encoder *encoder,
				  struct intel_crtc_state *old_crtc_state,
				  struct drm_connector_state *old_conn_state)
1718 1719
{
	struct drm_device *dev = encoder->base.dev;
1720
	struct drm_i915_private *dev_priv = to_i915(dev);
1721

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

1724 1725
	/* Assert data lane reset */
	chv_data_lane_soft_reset(encoder, true);
1726

V
Ville Syrjälä 已提交
1727
	mutex_unlock(&dev_priv->sb_lock);
1728 1729
}

1730 1731 1732
static void chv_hdmi_pre_enable(struct intel_encoder *encoder,
				struct intel_crtc_state *pipe_config,
				struct drm_connector_state *conn_state)
1733 1734
{
	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1735
	struct intel_hdmi *intel_hdmi = &dport->hdmi;
1736
	struct drm_device *dev = encoder->base.dev;
1737
	struct drm_i915_private *dev_priv = to_i915(dev);
1738

1739
	chv_phy_pre_encoder_enable(encoder);
1740

1741 1742
	/* FIXME: Program the support xxx V-dB */
	/* Use 800mV-0dB */
1743
	chv_set_phy_signal_level(encoder, 128, 102, false);
1744

1745
	intel_hdmi->set_infoframes(&encoder->base,
1746 1747
				   pipe_config->has_hdmi_sink,
				   pipe_config, conn_state);
1748

1749
	g4x_enable_hdmi(encoder, pipe_config, conn_state);
1750

1751
	vlv_wait_port_ready(dev_priv, dport, 0x0);
1752 1753

	/* Second common lane will stay alive on its own now */
1754
	chv_phy_release_cl2_override(encoder);
1755 1756
}

1757 1758
static void intel_hdmi_destroy(struct drm_connector *connector)
{
1759
	kfree(to_intel_connector(connector)->detect_edid);
1760
	drm_connector_cleanup(connector);
1761
	kfree(connector);
1762 1763 1764
}

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1765
	.dpms = drm_atomic_helper_connector_dpms,
1766
	.detect = intel_hdmi_detect,
1767
	.force = intel_hdmi_force,
1768
	.fill_modes = drm_helper_probe_single_connector_modes,
1769
	.set_property = intel_hdmi_set_property,
1770
	.atomic_get_property = intel_connector_atomic_get_property,
1771
	.late_register = intel_connector_register,
1772
	.early_unregister = intel_connector_unregister,
1773
	.destroy = intel_hdmi_destroy,
1774
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1775
	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1776 1777 1778 1779 1780 1781 1782 1783
};

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 已提交
1784
	.destroy = intel_encoder_destroy,
1785 1786
};

1787 1788 1789
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
1790
	intel_attach_force_audio_property(connector);
1791
	intel_attach_broadcast_rgb_property(connector);
1792
	intel_hdmi->color_range_auto = true;
1793 1794
	intel_attach_aspect_ratio_property(connector);
	intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1795 1796
}

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

1851 1852 1853
	DRM_DEBUG_KMS("Adding HDMI connector on port %c\n",
		      port_name(port));

1854 1855 1856 1857 1858
	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;

1859
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1860
			   DRM_MODE_CONNECTOR_HDMIA);
1861 1862
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

1863
	connector->interlace_allowed = 1;
1864
	connector->doublescan_allowed = 0;
1865
	connector->stereo_allowed = 1;
1866

1867 1868
	intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);

1869 1870
	switch (port) {
	case PORT_B:
1871 1872 1873 1874
		/*
		 * On BXT A0/A1, sw needs to activate DDIA HPD logic and
		 * interrupts to check the external panel connection.
		 */
1875
		if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1))
1876 1877 1878
			intel_encoder->hpd_pin = HPD_PORT_A;
		else
			intel_encoder->hpd_pin = HPD_PORT_B;
1879 1880
		break;
	case PORT_C:
1881
		intel_encoder->hpd_pin = HPD_PORT_C;
1882 1883
		break;
	case PORT_D:
1884
		intel_encoder->hpd_pin = HPD_PORT_D;
1885
		break;
X
Xiong Zhang 已提交
1886 1887 1888
	case PORT_E:
		intel_encoder->hpd_pin = HPD_PORT_E;
		break;
1889
	default:
1890 1891
		MISSING_CASE(port);
		return;
1892
	}
1893

1894
	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
1895
		intel_hdmi->write_infoframe = vlv_write_infoframe;
1896
		intel_hdmi->set_infoframes = vlv_set_infoframes;
1897
		intel_hdmi->infoframe_enabled = vlv_infoframe_enabled;
1898
	} else if (IS_G4X(dev_priv)) {
1899 1900
		intel_hdmi->write_infoframe = g4x_write_infoframe;
		intel_hdmi->set_infoframes = g4x_set_infoframes;
1901
		intel_hdmi->infoframe_enabled = g4x_infoframe_enabled;
1902
	} else if (HAS_DDI(dev_priv)) {
1903
		intel_hdmi->write_infoframe = hsw_write_infoframe;
1904
		intel_hdmi->set_infoframes = hsw_set_infoframes;
1905
		intel_hdmi->infoframe_enabled = hsw_infoframe_enabled;
1906
	} else if (HAS_PCH_IBX(dev_priv)) {
1907
		intel_hdmi->write_infoframe = ibx_write_infoframe;
1908
		intel_hdmi->set_infoframes = ibx_set_infoframes;
1909
		intel_hdmi->infoframe_enabled = ibx_infoframe_enabled;
1910 1911
	} else {
		intel_hdmi->write_infoframe = cpt_write_infoframe;
1912
		intel_hdmi->set_infoframes = cpt_set_infoframes;
1913
		intel_hdmi->infoframe_enabled = cpt_infoframe_enabled;
1914
	}
1915

1916
	if (HAS_DDI(dev_priv))
1917 1918 1919
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
	else
		intel_connector->get_hw_state = intel_connector_get_hw_state;
1920 1921 1922 1923

	intel_hdmi_add_properties(intel_hdmi, connector);

	intel_connector_attach_encoder(intel_connector, intel_encoder);
1924
	intel_hdmi->attached_connector = intel_connector;
1925 1926 1927 1928 1929

	/* 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.
	 */
1930
	if (IS_G4X(dev_priv) && !IS_GM45(dev_priv)) {
1931 1932 1933 1934 1935
		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
	}
}

1936
void intel_hdmi_init(struct drm_i915_private *dev_priv,
1937
		     i915_reg_t hdmi_reg, enum port port)
1938 1939 1940 1941 1942
{
	struct intel_digital_port *intel_dig_port;
	struct intel_encoder *intel_encoder;
	struct intel_connector *intel_connector;

1943
	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
1944 1945 1946
	if (!intel_dig_port)
		return;

1947
	intel_connector = intel_connector_alloc();
1948 1949 1950 1951 1952 1953 1954
	if (!intel_connector) {
		kfree(intel_dig_port);
		return;
	}

	intel_encoder = &intel_dig_port->base;

1955 1956 1957
	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 已提交
1958

1959
	intel_encoder->compute_config = intel_hdmi_compute_config;
1960
	if (HAS_PCH_SPLIT(dev_priv)) {
1961 1962 1963 1964 1965
		intel_encoder->disable = pch_disable_hdmi;
		intel_encoder->post_disable = pch_post_disable_hdmi;
	} else {
		intel_encoder->disable = g4x_disable_hdmi;
	}
P
Paulo Zanoni 已提交
1966
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
1967
	intel_encoder->get_config = intel_hdmi_get_config;
1968
	if (IS_CHERRYVIEW(dev_priv)) {
1969
		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
1970 1971
		intel_encoder->pre_enable = chv_hdmi_pre_enable;
		intel_encoder->enable = vlv_enable_hdmi;
1972
		intel_encoder->post_disable = chv_hdmi_post_disable;
1973
		intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable;
1974
	} else if (IS_VALLEYVIEW(dev_priv)) {
1975 1976
		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
1977
		intel_encoder->enable = vlv_enable_hdmi;
1978
		intel_encoder->post_disable = vlv_hdmi_post_disable;
1979
	} else {
1980
		intel_encoder->pre_enable = intel_hdmi_pre_enable;
1981
		if (HAS_PCH_CPT(dev_priv))
1982
			intel_encoder->enable = cpt_enable_hdmi;
1983
		else if (HAS_PCH_IBX(dev_priv))
1984
			intel_encoder->enable = ibx_enable_hdmi;
1985
		else
1986
			intel_encoder->enable = g4x_enable_hdmi;
1987
	}
1988

1989
	intel_encoder->type = INTEL_OUTPUT_HDMI;
1990
	intel_encoder->port = port;
1991
	if (IS_CHERRYVIEW(dev_priv)) {
1992 1993 1994 1995 1996 1997 1998
		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);
	}
1999
	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
2000 2001 2002 2003 2004
	/*
	 * 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.
	 */
2005
	if (IS_G4X(dev_priv))
2006
		intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
2007

2008
	intel_dig_port->port = port;
2009
	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
2010
	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
2011
	intel_dig_port->max_lanes = 4;
2012

2013
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
2014
}