intel_hdmi.c 27.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 32 33 34
#include <linux/delay.h>
#include "drmP.h"
#include "drm.h"
#include "drm_crtc.h"
35
#include "drm_edid.h"
36 37 38 39
#include "intel_drv.h"
#include "i915_drm.h"
#include "i915_drv.h"

40 41 42 43 44 45 46 47 48 49 50 51 52
static void
assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
{
	struct drm_device *dev = intel_hdmi->base.base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	uint32_t enabled_bits;

	enabled_bits = IS_HASWELL(dev) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;

	WARN(I915_READ(intel_hdmi->sdvox_reg) & enabled_bits,
	     "HDMI port enabled, expecting disabled\n");
}

53
struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
C
Chris Wilson 已提交
54
{
55
	return container_of(encoder, struct intel_hdmi, base.base);
C
Chris Wilson 已提交
56 57
}

58 59 60 61 62 63
static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
{
	return container_of(intel_attached_encoder(connector),
			    struct intel_hdmi, base);
}

64
void intel_dip_infoframe_csum(struct dip_infoframe *frame)
65
{
66
	uint8_t *data = (uint8_t *)frame;
67 68 69
	uint8_t sum = 0;
	unsigned i;

70 71
	frame->checksum = 0;
	frame->ecc = 0;
72

73
	for (i = 0; i < frame->len + DIP_HEADER_SIZE; i++)
74 75
		sum += data[i];

76
	frame->checksum = 0x100 - sum;
77 78
}

79
static u32 g4x_infoframe_index(struct dip_infoframe *frame)
80
{
81 82
	switch (frame->type) {
	case DIP_TYPE_AVI:
83
		return VIDEO_DIP_SELECT_AVI;
84
	case DIP_TYPE_SPD:
85
		return VIDEO_DIP_SELECT_SPD;
86 87
	default:
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
88
		return 0;
89 90 91
	}
}

92
static u32 g4x_infoframe_enable(struct dip_infoframe *frame)
93 94 95
{
	switch (frame->type) {
	case DIP_TYPE_AVI:
96
		return VIDEO_DIP_ENABLE_AVI;
97
	case DIP_TYPE_SPD:
98
		return VIDEO_DIP_ENABLE_SPD;
99 100
	default:
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
101
		return 0;
102 103 104
	}
}

105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
static u32 hsw_infoframe_enable(struct dip_infoframe *frame)
{
	switch (frame->type) {
	case DIP_TYPE_AVI:
		return VIDEO_DIP_ENABLE_AVI_HSW;
	case DIP_TYPE_SPD:
		return VIDEO_DIP_ENABLE_SPD_HSW;
	default:
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
		return 0;
	}
}

static u32 hsw_infoframe_data_reg(struct dip_infoframe *frame, enum pipe pipe)
{
	switch (frame->type) {
	case DIP_TYPE_AVI:
		return HSW_TVIDEO_DIP_AVI_DATA(pipe);
	case DIP_TYPE_SPD:
		return HSW_TVIDEO_DIP_SPD_DATA(pipe);
	default:
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
		return 0;
	}
}

131 132
static void g4x_write_infoframe(struct drm_encoder *encoder,
				struct dip_infoframe *frame)
133 134
{
	uint32_t *data = (uint32_t *)frame;
135 136
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
137
	u32 val = I915_READ(VIDEO_DIP_CTL);
138
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
139

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

142
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
143
	val |= g4x_infoframe_index(frame);
144

145
	val &= ~g4x_infoframe_enable(frame);
146

147
	I915_WRITE(VIDEO_DIP_CTL, val);
148

149
	mmiowb();
150
	for (i = 0; i < len; i += 4) {
151 152 153
		I915_WRITE(VIDEO_DIP_DATA, *data);
		data++;
	}
154
	mmiowb();
155

156
	val |= g4x_infoframe_enable(frame);
157
	val &= ~VIDEO_DIP_FREQ_MASK;
158
	val |= VIDEO_DIP_FREQ_VSYNC;
159

160
	I915_WRITE(VIDEO_DIP_CTL, val);
161
	POSTING_READ(VIDEO_DIP_CTL);
162 163
}

164 165 166 167 168 169
static void ibx_write_infoframe(struct drm_encoder *encoder,
				struct dip_infoframe *frame)
{
	uint32_t *data = (uint32_t *)frame;
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
170
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
171 172 173 174
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
	u32 val = I915_READ(reg);

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

177
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
178
	val |= g4x_infoframe_index(frame);
179

180
	val &= ~g4x_infoframe_enable(frame);
181 182 183

	I915_WRITE(reg, val);

184
	mmiowb();
185 186 187 188
	for (i = 0; i < len; i += 4) {
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
189
	mmiowb();
190

191
	val |= g4x_infoframe_enable(frame);
192
	val &= ~VIDEO_DIP_FREQ_MASK;
193
	val |= VIDEO_DIP_FREQ_VSYNC;
194 195

	I915_WRITE(reg, val);
196
	POSTING_READ(reg);
197 198 199 200
}

static void cpt_write_infoframe(struct drm_encoder *encoder,
				struct dip_infoframe *frame)
201
{
202
	uint32_t *data = (uint32_t *)frame;
203 204
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
205
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
206
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
207
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
208
	u32 val = I915_READ(reg);
209

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

212
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
213
	val |= g4x_infoframe_index(frame);
214

215 216
	/* The DIP control register spec says that we need to update the AVI
	 * infoframe without clearing its enable bit */
217
	if (frame->type != DIP_TYPE_AVI)
218
		val &= ~g4x_infoframe_enable(frame);
219

220
	I915_WRITE(reg, val);
221

222
	mmiowb();
223
	for (i = 0; i < len; i += 4) {
224 225 226
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
227
	mmiowb();
228

229
	val |= g4x_infoframe_enable(frame);
230
	val &= ~VIDEO_DIP_FREQ_MASK;
231
	val |= VIDEO_DIP_FREQ_VSYNC;
232

233
	I915_WRITE(reg, val);
234
	POSTING_READ(reg);
235
}
236 237 238 239 240 241 242

static void vlv_write_infoframe(struct drm_encoder *encoder,
				     struct dip_infoframe *frame)
{
	uint32_t *data = (uint32_t *)frame;
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
243
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
244 245
	int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
246
	u32 val = I915_READ(reg);
247

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

250
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
251
	val |= g4x_infoframe_index(frame);
252

253
	val &= ~g4x_infoframe_enable(frame);
254

255
	I915_WRITE(reg, val);
256

257
	mmiowb();
258 259 260 261
	for (i = 0; i < len; i += 4) {
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
		data++;
	}
262
	mmiowb();
263

264
	val |= g4x_infoframe_enable(frame);
265
	val &= ~VIDEO_DIP_FREQ_MASK;
266
	val |= VIDEO_DIP_FREQ_VSYNC;
267

268
	I915_WRITE(reg, val);
269
	POSTING_READ(reg);
270 271
}

272
static void hsw_write_infoframe(struct drm_encoder *encoder,
273
				struct dip_infoframe *frame)
274
{
275 276 277 278 279 280 281 282
	uint32_t *data = (uint32_t *)frame;
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 data_reg = hsw_infoframe_data_reg(frame, intel_crtc->pipe);
	unsigned int i, len = DIP_HEADER_SIZE + frame->len;
	u32 val = I915_READ(ctl_reg);
283

284 285 286 287 288 289
	if (data_reg == 0)
		return;

	val &= ~hsw_infoframe_enable(frame);
	I915_WRITE(ctl_reg, val);

290
	mmiowb();
291 292 293 294
	for (i = 0; i < len; i += 4) {
		I915_WRITE(data_reg + i, *data);
		data++;
	}
295
	mmiowb();
296

297 298
	val |= hsw_infoframe_enable(frame);
	I915_WRITE(ctl_reg, val);
299
	POSTING_READ(ctl_reg);
300 301
}

302 303 304 305 306 307 308 309 310
static void intel_set_infoframe(struct drm_encoder *encoder,
				struct dip_infoframe *frame)
{
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);

	intel_dip_infoframe_csum(frame);
	intel_hdmi->write_infoframe(encoder, frame);
}

311
static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
P
Paulo Zanoni 已提交
312
					 struct drm_display_mode *adjusted_mode)
313 314 315 316 317 318 319
{
	struct dip_infoframe avi_if = {
		.type = DIP_TYPE_AVI,
		.ver = DIP_VERSION_AVI,
		.len = DIP_LEN_AVI,
	};

P
Paulo Zanoni 已提交
320 321 322
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
		avi_if.body.avi.YQ_CN_PR |= DIP_AVI_PR_2;

323
	intel_set_infoframe(encoder, &avi_if);
324 325
}

326
static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
327 328 329 330 331 332 333 334 335 336 337 338 339 340
{
	struct dip_infoframe spd_if;

	memset(&spd_if, 0, sizeof(spd_if));
	spd_if.type = DIP_TYPE_SPD;
	spd_if.ver = DIP_VERSION_SPD;
	spd_if.len = DIP_LEN_SPD;
	strcpy(spd_if.body.spd.vn, "Intel");
	strcpy(spd_if.body.spd.pd, "Integrated gfx");
	spd_if.body.spd.sdi = DIP_SPD_PC;

	intel_set_infoframe(encoder, &spd_if);
}

341 342 343
static void g4x_set_infoframes(struct drm_encoder *encoder,
			       struct drm_display_mode *adjusted_mode)
{
344 345 346 347
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
	u32 reg = VIDEO_DIP_CTL;
	u32 val = I915_READ(reg);
348
	u32 port;
349

350 351
	assert_hdmi_port_disabled(intel_hdmi);

352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
	/* 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;

	if (!intel_hdmi->has_hdmi_sink) {
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~VIDEO_DIP_ENABLE;
		I915_WRITE(reg, val);
368
		POSTING_READ(reg);
369 370 371
		return;
	}

372 373
	switch (intel_hdmi->sdvox_reg) {
	case SDVOB:
374
		port = VIDEO_DIP_PORT_B;
375 376
		break;
	case SDVOC:
377
		port = VIDEO_DIP_PORT_C;
378 379 380 381 382
		break;
	default:
		return;
	}

383 384 385 386
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
		if (val & VIDEO_DIP_ENABLE) {
			val &= ~VIDEO_DIP_ENABLE;
			I915_WRITE(reg, val);
387
			POSTING_READ(reg);
388 389 390 391 392
		}
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

393
	val |= VIDEO_DIP_ENABLE;
394
	val &= ~VIDEO_DIP_ENABLE_VENDOR;
395

396
	I915_WRITE(reg, val);
397
	POSTING_READ(reg);
398

399 400 401 402 403 404 405
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
}

static void ibx_set_infoframes(struct drm_encoder *encoder,
			       struct drm_display_mode *adjusted_mode)
{
406 407 408 409 410
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);
411
	u32 port;
412

413 414
	assert_hdmi_port_disabled(intel_hdmi);

415 416 417 418 419 420 421 422
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

	if (!intel_hdmi->has_hdmi_sink) {
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~VIDEO_DIP_ENABLE;
		I915_WRITE(reg, val);
423
		POSTING_READ(reg);
424 425 426
		return;
	}

427 428
	switch (intel_hdmi->sdvox_reg) {
	case HDMIB:
429
		port = VIDEO_DIP_PORT_B;
430 431
		break;
	case HDMIC:
432
		port = VIDEO_DIP_PORT_C;
433 434
		break;
	case HDMID:
435
		port = VIDEO_DIP_PORT_D;
436 437 438 439 440
		break;
	default:
		return;
	}

441 442 443 444
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
		if (val & VIDEO_DIP_ENABLE) {
			val &= ~VIDEO_DIP_ENABLE;
			I915_WRITE(reg, val);
445
			POSTING_READ(reg);
446 447 448 449 450
		}
		val &= ~VIDEO_DIP_PORT_MASK;
		val |= port;
	}

451
	val |= VIDEO_DIP_ENABLE;
452 453
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_GCP);
454

455
	I915_WRITE(reg, val);
456
	POSTING_READ(reg);
457

458 459 460 461 462 463 464
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
}

static void cpt_set_infoframes(struct drm_encoder *encoder,
			       struct drm_display_mode *adjusted_mode)
{
465 466 467 468 469 470
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

471 472
	assert_hdmi_port_disabled(intel_hdmi);

473 474 475 476 477 478 479 480
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

	if (!intel_hdmi->has_hdmi_sink) {
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI);
		I915_WRITE(reg, val);
481
		POSTING_READ(reg);
482 483 484
		return;
	}

485 486
	/* Set both together, unset both together: see the spec. */
	val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
487 488
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_GCP);
489 490

	I915_WRITE(reg, val);
491
	POSTING_READ(reg);
492

493 494 495 496 497 498 499
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
}

static void vlv_set_infoframes(struct drm_encoder *encoder,
			       struct drm_display_mode *adjusted_mode)
{
500 501 502 503 504 505
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
	u32 reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
	u32 val = I915_READ(reg);

506 507
	assert_hdmi_port_disabled(intel_hdmi);

508 509 510 511 512 513 514 515
	/* See the big comment in g4x_set_infoframes() */
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;

	if (!intel_hdmi->has_hdmi_sink) {
		if (!(val & VIDEO_DIP_ENABLE))
			return;
		val &= ~VIDEO_DIP_ENABLE;
		I915_WRITE(reg, val);
516
		POSTING_READ(reg);
517 518 519
		return;
	}

520
	val |= VIDEO_DIP_ENABLE;
521 522
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
		 VIDEO_DIP_ENABLE_GCP);
523 524

	I915_WRITE(reg, val);
525
	POSTING_READ(reg);
526

527 528 529 530 531 532 533
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
}

static void hsw_set_infoframes(struct drm_encoder *encoder,
			       struct drm_display_mode *adjusted_mode)
{
534 535 536 537
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
538
	u32 val = I915_READ(reg);
539

540 541
	assert_hdmi_port_disabled(intel_hdmi);

542 543
	if (!intel_hdmi->has_hdmi_sink) {
		I915_WRITE(reg, 0);
544
		POSTING_READ(reg);
545 546 547
		return;
	}

548 549 550 551
	val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
		 VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW);

	I915_WRITE(reg, val);
552
	POSTING_READ(reg);
553

554 555 556 557
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
	intel_hdmi_set_spd_infoframe(encoder);
}

558 559 560 561 562 563
static void intel_hdmi_mode_set(struct drm_encoder *encoder,
				struct drm_display_mode *mode,
				struct drm_display_mode *adjusted_mode)
{
	struct drm_device *dev = encoder->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
564
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
C
Chris Wilson 已提交
565
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
566 567
	u32 sdvox;

568
	sdvox = SDVO_ENCODING_HDMI;
569 570
	if (!HAS_PCH_SPLIT(dev))
		sdvox |= intel_hdmi->color_range;
571 572 573 574
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
		sdvox |= SDVO_VSYNC_ACTIVE_HIGH;
	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
		sdvox |= SDVO_HSYNC_ACTIVE_HIGH;
575

576 577 578 579 580
	if (intel_crtc->bpp > 24)
		sdvox |= COLOR_FORMAT_12bpc;
	else
		sdvox |= COLOR_FORMAT_8bpc;

581 582 583 584
	/* Required on CPT */
	if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev))
		sdvox |= HDMI_MODE_SELECT;

585
	if (intel_hdmi->has_audio) {
586 587
		DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
				 pipe_name(intel_crtc->pipe));
588
		sdvox |= SDVO_AUDIO_ENABLE;
589
		sdvox |= SDVO_NULL_PACKETS_DURING_VSYNC;
590
		intel_write_eld(encoder, adjusted_mode);
591
	}
592

593 594
	if (HAS_PCH_CPT(dev))
		sdvox |= PORT_TRANS_SEL_CPT(intel_crtc->pipe);
595
	else if (intel_crtc->pipe == PIPE_B)
596
		sdvox |= SDVO_PIPE_B_SELECT;
597

C
Chris Wilson 已提交
598 599
	I915_WRITE(intel_hdmi->sdvox_reg, sdvox);
	POSTING_READ(intel_hdmi->sdvox_reg);
600

601
	intel_hdmi->set_infoframes(encoder, adjusted_mode);
602 603
}

604
static void intel_enable_hdmi(struct intel_encoder *encoder)
605
{
606
	struct drm_device *dev = encoder->base.dev;
607
	struct drm_i915_private *dev_priv = dev->dev_private;
608
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
609
	u32 temp;
610 611 612 613
	u32 enable_bits = SDVO_ENABLE;

	if (intel_hdmi->has_audio)
		enable_bits |= SDVO_AUDIO_ENABLE;
614

C
Chris Wilson 已提交
615
	temp = I915_READ(intel_hdmi->sdvox_reg);
616

617 618 619
	/* HW workaround for IBX, we need to move the port to transcoder A
	 * before disabling it. */
	if (HAS_PCH_IBX(dev)) {
620
		struct drm_crtc *crtc = encoder->base.crtc;
621 622
		int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;

623 624 625
		/* Restore the transcoder select bit. */
		if (pipe == PIPE_B)
			enable_bits |= SDVO_PIPE_B_SELECT;
626 627
	}

628 629 630
	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
	 * we do this anyway which shows more stable in testing.
	 */
631
	if (HAS_PCH_SPLIT(dev)) {
C
Chris Wilson 已提交
632 633
		I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
		POSTING_READ(intel_hdmi->sdvox_reg);
634 635
	}

636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684
	temp |= enable_bits;

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

	/* HW workaround, need to write this twice for issue that may result
	 * in first write getting masked.
	 */
	if (HAS_PCH_SPLIT(dev)) {
		I915_WRITE(intel_hdmi->sdvox_reg, temp);
		POSTING_READ(intel_hdmi->sdvox_reg);
	}
}

static void intel_disable_hdmi(struct intel_encoder *encoder)
{
	struct drm_device *dev = encoder->base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
	u32 temp;
	u32 enable_bits = SDVO_ENABLE;

	if (intel_hdmi->has_audio)
		enable_bits |= SDVO_AUDIO_ENABLE;

	temp = I915_READ(intel_hdmi->sdvox_reg);

	/* HW workaround for IBX, we need to move the port to transcoder A
	 * before disabling it. */
	if (HAS_PCH_IBX(dev)) {
		struct drm_crtc *crtc = encoder->base.crtc;
		int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;

		if (temp & SDVO_PIPE_B_SELECT) {
			temp &= ~SDVO_PIPE_B_SELECT;
			I915_WRITE(intel_hdmi->sdvox_reg, temp);
			POSTING_READ(intel_hdmi->sdvox_reg);

			/* Again we need to write this twice. */
			I915_WRITE(intel_hdmi->sdvox_reg, temp);
			POSTING_READ(intel_hdmi->sdvox_reg);

			/* Transcoder selection bits only update
			 * effectively on vblank. */
			if (crtc)
				intel_wait_for_vblank(dev, pipe);
			else
				msleep(50);
		}
685
	}
686

687 688 689 690 691 692 693 694 695 696
	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
	 * we do this anyway which shows more stable in testing.
	 */
	if (HAS_PCH_SPLIT(dev)) {
		I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
		POSTING_READ(intel_hdmi->sdvox_reg);
	}

	temp &= ~enable_bits;

C
Chris Wilson 已提交
697 698
	I915_WRITE(intel_hdmi->sdvox_reg, temp);
	POSTING_READ(intel_hdmi->sdvox_reg);
699 700 701 702

	/* HW workaround, need to write this twice for issue that may result
	 * in first write getting masked.
	 */
703
	if (HAS_PCH_SPLIT(dev)) {
C
Chris Wilson 已提交
704 705
		I915_WRITE(intel_hdmi->sdvox_reg, temp);
		POSTING_READ(intel_hdmi->sdvox_reg);
706
	}
707 708 709 710 711 712 713 714
}

static int intel_hdmi_mode_valid(struct drm_connector *connector,
				 struct drm_display_mode *mode)
{
	if (mode->clock > 165000)
		return MODE_CLOCK_HIGH;
	if (mode->clock < 20000)
715
		return MODE_CLOCK_LOW;
716 717 718 719 720 721 722 723

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

	return MODE_OK;
}

static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
724
				  const struct drm_display_mode *mode,
725 726 727 728 729
				  struct drm_display_mode *adjusted_mode)
{
	return true;
}

730 731 732 733 734 735 736
static bool g4x_hdmi_connected(struct intel_hdmi *intel_hdmi)
{
	struct drm_device *dev = intel_hdmi->base.base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	uint32_t bit;

	switch (intel_hdmi->sdvox_reg) {
737
	case SDVOB:
738 739
		bit = HDMIB_HOTPLUG_LIVE_STATUS;
		break;
740
	case SDVOC:
741 742 743 744 745 746 747 748 749 750
		bit = HDMIC_HOTPLUG_LIVE_STATUS;
		break;
	default:
		bit = 0;
		break;
	}

	return I915_READ(PORT_HOTPLUG_STAT) & bit;
}

751
static enum drm_connector_status
752
intel_hdmi_detect(struct drm_connector *connector, bool force)
753
{
754
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
755 756
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
	struct edid *edid;
757
	enum drm_connector_status status = connector_status_disconnected;
758

759 760 761
	if (IS_G4X(connector->dev) && !g4x_hdmi_connected(intel_hdmi))
		return status;

C
Chris Wilson 已提交
762
	intel_hdmi->has_hdmi_sink = false;
763
	intel_hdmi->has_audio = false;
764
	edid = drm_get_edid(connector,
765 766
			    intel_gmbus_get_adapter(dev_priv,
						    intel_hdmi->ddc_bus));
767

768
	if (edid) {
769
		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
770
			status = connector_status_connected;
771 772 773
			if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
				intel_hdmi->has_hdmi_sink =
						drm_detect_hdmi_monitor(edid);
774
			intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
775
		}
776
		connector->display_info.raw_edid = NULL;
777
		kfree(edid);
778
	}
779

780
	if (status == connector_status_connected) {
781 782 783
		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
			intel_hdmi->has_audio =
				(intel_hdmi->force_audio == HDMI_AUDIO_ON);
784 785
	}

786
	return status;
787 788 789 790
}

static int intel_hdmi_get_modes(struct drm_connector *connector)
{
791
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
792
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
793 794 795 796 797

	/* We should parse the EDID data and find out if it's an HDMI sink so
	 * we can send audio to it.
	 */

798
	return intel_ddc_get_modes(connector,
799 800
				   intel_gmbus_get_adapter(dev_priv,
							   intel_hdmi->ddc_bus));
801 802
}

803 804 805 806 807 808 809 810 811
static bool
intel_hdmi_detect_audio(struct drm_connector *connector)
{
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
	struct edid *edid;
	bool has_audio = false;

	edid = drm_get_edid(connector,
812 813
			    intel_gmbus_get_adapter(dev_priv,
						    intel_hdmi->ddc_bus));
814 815 816 817 818 819 820 821 822 823 824
	if (edid) {
		if (edid->input & DRM_EDID_INPUT_DIGITAL)
			has_audio = drm_detect_monitor_audio(edid);

		connector->display_info.raw_edid = NULL;
		kfree(edid);
	}

	return has_audio;
}

825 826
static int
intel_hdmi_set_property(struct drm_connector *connector,
827 828
			struct drm_property *property,
			uint64_t val)
829 830
{
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
831
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
832 833 834 835 836 837
	int ret;

	ret = drm_connector_property_set_value(connector, property, val);
	if (ret)
		return ret;

838
	if (property == dev_priv->force_audio_property) {
839
		enum hdmi_force_audio i = val;
840 841 842
		bool has_audio;

		if (i == intel_hdmi->force_audio)
843 844
			return 0;

845
		intel_hdmi->force_audio = i;
846

847
		if (i == HDMI_AUDIO_AUTO)
848 849
			has_audio = intel_hdmi_detect_audio(connector);
		else
850
			has_audio = (i == HDMI_AUDIO_ON);
851

852 853
		if (i == HDMI_AUDIO_OFF_DVI)
			intel_hdmi->has_hdmi_sink = 0;
854

855
		intel_hdmi->has_audio = has_audio;
856 857 858
		goto done;
	}

859 860 861 862 863 864 865 866
	if (property == dev_priv->broadcast_rgb_property) {
		if (val == !!intel_hdmi->color_range)
			return 0;

		intel_hdmi->color_range = val ? SDVO_COLOR_RANGE_16_235 : 0;
		goto done;
	}

867 868 869 870 871
	return -EINVAL;

done:
	if (intel_hdmi->base.base.crtc) {
		struct drm_crtc *crtc = intel_hdmi->base.base.crtc;
872 873
		intel_set_mode(crtc, &crtc->mode,
			       crtc->x, crtc->y, crtc->fb);
874 875 876 877 878
	}

	return 0;
}

879 880 881 882
static void intel_hdmi_destroy(struct drm_connector *connector)
{
	drm_sysfs_connector_remove(connector);
	drm_connector_cleanup(connector);
883
	kfree(connector);
884 885
}

886 887 888
static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs_hsw = {
	.mode_fixup = intel_hdmi_mode_fixup,
	.mode_set = intel_ddi_mode_set,
889
	.disable = intel_encoder_disable,
890 891
};

892 893 894
static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs = {
	.mode_fixup = intel_hdmi_mode_fixup,
	.mode_set = intel_hdmi_mode_set,
895
	.disable = intel_encoder_disable,
896 897 898
};

static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
899
	.dpms = intel_connector_dpms,
900 901
	.detect = intel_hdmi_detect,
	.fill_modes = drm_helper_probe_single_connector_modes,
902
	.set_property = intel_hdmi_set_property,
903 904 905 906 907 908
	.destroy = intel_hdmi_destroy,
};

static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
	.get_modes = intel_hdmi_get_modes,
	.mode_valid = intel_hdmi_mode_valid,
909
	.best_encoder = intel_best_encoder,
910 911 912
};

static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
C
Chris Wilson 已提交
913
	.destroy = intel_encoder_destroy,
914 915
};

916 917 918
static void
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
{
919
	intel_attach_force_audio_property(connector);
920
	intel_attach_broadcast_rgb_property(connector);
921 922
}

923
void intel_hdmi_init(struct drm_device *dev, int sdvox_reg, enum port port)
924 925 926
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct drm_connector *connector;
927
	struct intel_encoder *intel_encoder;
928
	struct intel_connector *intel_connector;
C
Chris Wilson 已提交
929
	struct intel_hdmi *intel_hdmi;
930

C
Chris Wilson 已提交
931 932
	intel_hdmi = kzalloc(sizeof(struct intel_hdmi), GFP_KERNEL);
	if (!intel_hdmi)
933
		return;
934 935 936

	intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
	if (!intel_connector) {
C
Chris Wilson 已提交
937
		kfree(intel_hdmi);
938 939 940
		return;
	}

C
Chris Wilson 已提交
941
	intel_encoder = &intel_hdmi->base;
942 943 944
	drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
			 DRM_MODE_ENCODER_TMDS);

945
	connector = &intel_connector->base;
946
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
947
			   DRM_MODE_CONNECTOR_HDMIA);
948 949
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);

950
	intel_encoder->type = INTEL_OUTPUT_HDMI;
951

952
	connector->polled = DRM_CONNECTOR_POLL_HPD;
953
	connector->interlace_allowed = 1;
954
	connector->doublescan_allowed = 0;
J
Jesse Barnes 已提交
955
	intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
956

957 958
	intel_encoder->cloneable = false;

959 960 961
	intel_hdmi->ddi_port = port;
	switch (port) {
	case PORT_B:
962
		intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
963
		dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
964 965
		break;
	case PORT_C:
966 967
		intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
		dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
968 969
		break;
	case PORT_D:
970 971
		intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
		dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
972 973 974 975
		break;
	case PORT_A:
		/* Internal port only for eDP. */
	default:
976
		BUG();
977
	}
978

C
Chris Wilson 已提交
979
	intel_hdmi->sdvox_reg = sdvox_reg;
980

981
	if (!HAS_PCH_SPLIT(dev)) {
982
		intel_hdmi->write_infoframe = g4x_write_infoframe;
983
		intel_hdmi->set_infoframes = g4x_set_infoframes;
984 985
	} else if (IS_VALLEYVIEW(dev)) {
		intel_hdmi->write_infoframe = vlv_write_infoframe;
986
		intel_hdmi->set_infoframes = vlv_set_infoframes;
987 988
	} else if (IS_HASWELL(dev)) {
		intel_hdmi->write_infoframe = hsw_write_infoframe;
989
		intel_hdmi->set_infoframes = hsw_set_infoframes;
990 991
	} else if (HAS_PCH_IBX(dev)) {
		intel_hdmi->write_infoframe = ibx_write_infoframe;
992
		intel_hdmi->set_infoframes = ibx_set_infoframes;
993 994
	} else {
		intel_hdmi->write_infoframe = cpt_write_infoframe;
995
		intel_hdmi->set_infoframes = cpt_set_infoframes;
996
	}
997

998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
	if (IS_HASWELL(dev)) {
		intel_encoder->enable = intel_enable_ddi;
		intel_encoder->disable = intel_disable_ddi;
		drm_encoder_helper_add(&intel_encoder->base,
				       &intel_hdmi_helper_funcs_hsw);
	} else {
		intel_encoder->enable = intel_enable_hdmi;
		intel_encoder->disable = intel_disable_hdmi;
		drm_encoder_helper_add(&intel_encoder->base,
				       &intel_hdmi_helper_funcs);
	}

1010

1011 1012
	intel_hdmi_add_properties(intel_hdmi, connector);

1013
	intel_connector_attach_encoder(intel_connector, intel_encoder);
1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
	drm_sysfs_connector_add(connector);

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