xref: /dflybsd-src/sys/dev/drm/i915/intel_hdmi.c (revision 5aa42fef418118d7414e8b76fbb5ae50738ffea0)
1 /*
2  * Copyright 2006 Dave Airlie <airlied@linux.ie>
3  * Copyright © 2006-2009 Intel Corporation
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  *
24  * Authors:
25  *	Eric Anholt <eric@anholt.net>
26  *	Jesse Barnes <jesse.barnes@intel.com>
27  */
28 
29 #include <linux/i2c.h>
30 #include <linux/delay.h>
31 #include <drm/drmP.h>
32 #include <drm/drm_crtc.h>
33 #include <drm/drm_edid.h>
34 #include "intel_drv.h"
35 #include <drm/i915_drm.h>
36 #include "i915_drv.h"
37 
38 static struct drm_device *intel_hdmi_to_dev(struct intel_hdmi *intel_hdmi)
39 {
40 	return hdmi_to_dig_port(intel_hdmi)->base.base.dev;
41 }
42 
43 static void
44 assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
45 {
46 	struct drm_device *dev = intel_hdmi_to_dev(intel_hdmi);
47 	struct drm_i915_private *dev_priv = dev->dev_private;
48 	uint32_t enabled_bits;
49 
50 	enabled_bits = HAS_DDI(dev) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
51 
52 	WARN(I915_READ(intel_hdmi->hdmi_reg) & enabled_bits,
53 	     "HDMI port enabled, expecting disabled\n");
54 }
55 
56 struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
57 {
58 	struct intel_digital_port *intel_dig_port =
59 		container_of(encoder, struct intel_digital_port, base.base);
60 	return &intel_dig_port->hdmi;
61 }
62 
63 static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
64 {
65 	return enc_to_intel_hdmi(&intel_attached_encoder(connector)->base);
66 }
67 
68 void intel_dip_infoframe_csum(struct dip_infoframe *frame)
69 {
70 	uint8_t *data = (uint8_t *)frame;
71 	uint8_t sum = 0;
72 	unsigned i;
73 
74 	frame->checksum = 0;
75 	frame->ecc = 0;
76 
77 	for (i = 0; i < frame->len + DIP_HEADER_SIZE; i++)
78 		sum += data[i];
79 
80 	frame->checksum = 0x100 - sum;
81 }
82 
83 static u32 g4x_infoframe_index(struct dip_infoframe *frame)
84 {
85 	switch (frame->type) {
86 	case DIP_TYPE_AVI:
87 		return VIDEO_DIP_SELECT_AVI;
88 	case DIP_TYPE_SPD:
89 		return VIDEO_DIP_SELECT_SPD;
90 	default:
91 		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
92 		return 0;
93 	}
94 }
95 
96 static u32 g4x_infoframe_enable(struct dip_infoframe *frame)
97 {
98 	switch (frame->type) {
99 	case DIP_TYPE_AVI:
100 		return VIDEO_DIP_ENABLE_AVI;
101 	case DIP_TYPE_SPD:
102 		return VIDEO_DIP_ENABLE_SPD;
103 	default:
104 		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
105 		return 0;
106 	}
107 }
108 
109 static u32 hsw_infoframe_enable(struct dip_infoframe *frame)
110 {
111 	switch (frame->type) {
112 	case DIP_TYPE_AVI:
113 		return VIDEO_DIP_ENABLE_AVI_HSW;
114 	case DIP_TYPE_SPD:
115 		return VIDEO_DIP_ENABLE_SPD_HSW;
116 	default:
117 		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
118 		return 0;
119 	}
120 }
121 
122 static u32 hsw_infoframe_data_reg(struct dip_infoframe *frame,
123 				  enum transcoder cpu_transcoder)
124 {
125 	switch (frame->type) {
126 	case DIP_TYPE_AVI:
127 		return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
128 	case DIP_TYPE_SPD:
129 		return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
130 	default:
131 		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
132 		return 0;
133 	}
134 }
135 
136 #define mmiowb	cpu_sfence
137 
138 static void g4x_write_infoframe(struct drm_encoder *encoder,
139 				struct dip_infoframe *frame)
140 {
141 	uint32_t *data = (uint32_t *)frame;
142 	struct drm_device *dev = encoder->dev;
143 	struct drm_i915_private *dev_priv = dev->dev_private;
144 	u32 val = I915_READ(VIDEO_DIP_CTL);
145 	unsigned i, len = DIP_HEADER_SIZE + frame->len;
146 
147 	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
148 
149 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
150 	val |= g4x_infoframe_index(frame);
151 
152 	val &= ~g4x_infoframe_enable(frame);
153 
154 	I915_WRITE(VIDEO_DIP_CTL, val);
155 
156 	mmiowb();
157 	for (i = 0; i < len; i += 4) {
158 		I915_WRITE(VIDEO_DIP_DATA, *data);
159 		data++;
160 	}
161 	/* Write every possible data byte to force correct ECC calculation. */
162 	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
163 		I915_WRITE(VIDEO_DIP_DATA, 0);
164 	mmiowb();
165 
166 	val |= g4x_infoframe_enable(frame);
167 	val &= ~VIDEO_DIP_FREQ_MASK;
168 	val |= VIDEO_DIP_FREQ_VSYNC;
169 
170 	I915_WRITE(VIDEO_DIP_CTL, val);
171 	POSTING_READ(VIDEO_DIP_CTL);
172 }
173 
174 static void ibx_write_infoframe(struct drm_encoder *encoder,
175 				struct dip_infoframe *frame)
176 {
177 	uint32_t *data = (uint32_t *)frame;
178 	struct drm_device *dev = encoder->dev;
179 	struct drm_i915_private *dev_priv = dev->dev_private;
180 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
181 	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
182 	unsigned i, len = DIP_HEADER_SIZE + frame->len;
183 	u32 val = I915_READ(reg);
184 
185 	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
186 
187 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
188 	val |= g4x_infoframe_index(frame);
189 
190 	val &= ~g4x_infoframe_enable(frame);
191 
192 	I915_WRITE(reg, val);
193 
194 	mmiowb();
195 	for (i = 0; i < len; i += 4) {
196 		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
197 		data++;
198 	}
199 	/* Write every possible data byte to force correct ECC calculation. */
200 	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
201 		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
202 	mmiowb();
203 
204 	val |= g4x_infoframe_enable(frame);
205 	val &= ~VIDEO_DIP_FREQ_MASK;
206 	val |= VIDEO_DIP_FREQ_VSYNC;
207 
208 	I915_WRITE(reg, val);
209 	POSTING_READ(reg);
210 }
211 
212 static void cpt_write_infoframe(struct drm_encoder *encoder,
213 				struct dip_infoframe *frame)
214 {
215 	uint32_t *data = (uint32_t *)frame;
216 	struct drm_device *dev = encoder->dev;
217 	struct drm_i915_private *dev_priv = dev->dev_private;
218 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
219 	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
220 	unsigned i, len = DIP_HEADER_SIZE + frame->len;
221 	u32 val = I915_READ(reg);
222 
223 	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
224 
225 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
226 	val |= g4x_infoframe_index(frame);
227 
228 	/* The DIP control register spec says that we need to update the AVI
229 	 * infoframe without clearing its enable bit */
230 	if (frame->type != DIP_TYPE_AVI)
231 		val &= ~g4x_infoframe_enable(frame);
232 
233 	I915_WRITE(reg, val);
234 
235 	mmiowb();
236 	for (i = 0; i < len; i += 4) {
237 		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
238 		data++;
239 	}
240 	/* Write every possible data byte to force correct ECC calculation. */
241 	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
242 		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
243 	mmiowb();
244 
245 	val |= g4x_infoframe_enable(frame);
246 	val &= ~VIDEO_DIP_FREQ_MASK;
247 	val |= VIDEO_DIP_FREQ_VSYNC;
248 
249 	I915_WRITE(reg, val);
250 	POSTING_READ(reg);
251 }
252 
253 static void vlv_write_infoframe(struct drm_encoder *encoder,
254 				     struct dip_infoframe *frame)
255 {
256 	uint32_t *data = (uint32_t *)frame;
257 	struct drm_device *dev = encoder->dev;
258 	struct drm_i915_private *dev_priv = dev->dev_private;
259 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
260 	int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
261 	unsigned i, len = DIP_HEADER_SIZE + frame->len;
262 	u32 val = I915_READ(reg);
263 
264 	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
265 
266 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
267 	val |= g4x_infoframe_index(frame);
268 
269 	val &= ~g4x_infoframe_enable(frame);
270 
271 	I915_WRITE(reg, val);
272 
273 	mmiowb();
274 	for (i = 0; i < len; i += 4) {
275 		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
276 		data++;
277 	}
278 	/* Write every possible data byte to force correct ECC calculation. */
279 	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
280 		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
281 	mmiowb();
282 
283 	val |= g4x_infoframe_enable(frame);
284 	val &= ~VIDEO_DIP_FREQ_MASK;
285 	val |= VIDEO_DIP_FREQ_VSYNC;
286 
287 	I915_WRITE(reg, val);
288 	POSTING_READ(reg);
289 }
290 
291 static void hsw_write_infoframe(struct drm_encoder *encoder,
292 				struct dip_infoframe *frame)
293 {
294 	uint32_t *data = (uint32_t *)frame;
295 	struct drm_device *dev = encoder->dev;
296 	struct drm_i915_private *dev_priv = dev->dev_private;
297 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
298 	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
299 	u32 data_reg = hsw_infoframe_data_reg(frame, intel_crtc->config.cpu_transcoder);
300 	unsigned int i, len = DIP_HEADER_SIZE + frame->len;
301 	u32 val = I915_READ(ctl_reg);
302 
303 	if (data_reg == 0)
304 		return;
305 
306 	val &= ~hsw_infoframe_enable(frame);
307 	I915_WRITE(ctl_reg, val);
308 
309 	mmiowb();
310 	for (i = 0; i < len; i += 4) {
311 		I915_WRITE(data_reg + i, *data);
312 		data++;
313 	}
314 	/* Write every possible data byte to force correct ECC calculation. */
315 	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
316 		I915_WRITE(data_reg + i, 0);
317 	mmiowb();
318 
319 	val |= hsw_infoframe_enable(frame);
320 	I915_WRITE(ctl_reg, val);
321 	POSTING_READ(ctl_reg);
322 }
323 
324 static void intel_set_infoframe(struct drm_encoder *encoder,
325 				struct dip_infoframe *frame)
326 {
327 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
328 
329 	intel_dip_infoframe_csum(frame);
330 	intel_hdmi->write_infoframe(encoder, frame);
331 }
332 
333 static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
334 					 struct drm_display_mode *adjusted_mode)
335 {
336 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
337 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
338 	struct dip_infoframe avi_if = {
339 		.type = DIP_TYPE_AVI,
340 		.ver = DIP_VERSION_AVI,
341 		.len = DIP_LEN_AVI,
342 	};
343 
344 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
345 		avi_if.body.avi.YQ_CN_PR |= DIP_AVI_PR_2;
346 
347 	if (intel_hdmi->rgb_quant_range_selectable) {
348 		if (intel_crtc->config.limited_color_range)
349 			avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_LIMITED;
350 		else
351 			avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL;
352 	}
353 
354 	avi_if.body.avi.VIC = drm_match_cea_mode(adjusted_mode);
355 
356 	intel_set_infoframe(encoder, &avi_if);
357 }
358 
359 static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
360 {
361 	struct dip_infoframe spd_if;
362 
363 	memset(&spd_if, 0, sizeof(spd_if));
364 	spd_if.type = DIP_TYPE_SPD;
365 	spd_if.ver = DIP_VERSION_SPD;
366 	spd_if.len = DIP_LEN_SPD;
367 	strcpy(spd_if.body.spd.vn, "Intel");
368 	strcpy(spd_if.body.spd.pd, "Integrated gfx");
369 	spd_if.body.spd.sdi = DIP_SPD_PC;
370 
371 	intel_set_infoframe(encoder, &spd_if);
372 }
373 
374 static void g4x_set_infoframes(struct drm_encoder *encoder,
375 			       struct drm_display_mode *adjusted_mode)
376 {
377 	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
378 	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
379 	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
380 	u32 reg = VIDEO_DIP_CTL;
381 	u32 val = I915_READ(reg);
382 	u32 port;
383 
384 	assert_hdmi_port_disabled(intel_hdmi);
385 
386 	/* If the registers were not initialized yet, they might be zeroes,
387 	 * which means we're selecting the AVI DIP and we're setting its
388 	 * frequency to once. This seems to really confuse the HW and make
389 	 * things stop working (the register spec says the AVI always needs to
390 	 * be sent every VSync). So here we avoid writing to the register more
391 	 * than we need and also explicitly select the AVI DIP and explicitly
392 	 * set its frequency to every VSync. Avoiding to write it twice seems to
393 	 * be enough to solve the problem, but being defensive shouldn't hurt us
394 	 * either. */
395 	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
396 
397 	if (!intel_hdmi->has_hdmi_sink) {
398 		if (!(val & VIDEO_DIP_ENABLE))
399 			return;
400 		val &= ~VIDEO_DIP_ENABLE;
401 		I915_WRITE(reg, val);
402 		POSTING_READ(reg);
403 		return;
404 	}
405 
406 	switch (intel_dig_port->port) {
407 	case PORT_B:
408 		port = VIDEO_DIP_PORT_B;
409 		break;
410 	case PORT_C:
411 		port = VIDEO_DIP_PORT_C;
412 		break;
413 	default:
414 		BUG();
415 		return;
416 	}
417 
418 	if (port != (val & VIDEO_DIP_PORT_MASK)) {
419 		if (val & VIDEO_DIP_ENABLE) {
420 			val &= ~VIDEO_DIP_ENABLE;
421 			I915_WRITE(reg, val);
422 			POSTING_READ(reg);
423 		}
424 		val &= ~VIDEO_DIP_PORT_MASK;
425 		val |= port;
426 	}
427 
428 	val |= VIDEO_DIP_ENABLE;
429 	val &= ~VIDEO_DIP_ENABLE_VENDOR;
430 
431 	I915_WRITE(reg, val);
432 	POSTING_READ(reg);
433 
434 	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
435 	intel_hdmi_set_spd_infoframe(encoder);
436 }
437 
438 static void ibx_set_infoframes(struct drm_encoder *encoder,
439 			       struct drm_display_mode *adjusted_mode)
440 {
441 	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
442 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
443 	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
444 	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
445 	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
446 	u32 val = I915_READ(reg);
447 	u32 port;
448 
449 	assert_hdmi_port_disabled(intel_hdmi);
450 
451 	/* See the big comment in g4x_set_infoframes() */
452 	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
453 
454 	if (!intel_hdmi->has_hdmi_sink) {
455 		if (!(val & VIDEO_DIP_ENABLE))
456 			return;
457 		val &= ~VIDEO_DIP_ENABLE;
458 		I915_WRITE(reg, val);
459 		POSTING_READ(reg);
460 		return;
461 	}
462 
463 	switch (intel_dig_port->port) {
464 	case PORT_B:
465 		port = VIDEO_DIP_PORT_B;
466 		break;
467 	case PORT_C:
468 		port = VIDEO_DIP_PORT_C;
469 		break;
470 	case PORT_D:
471 		port = VIDEO_DIP_PORT_D;
472 		break;
473 	default:
474 		BUG();
475 		return;
476 	}
477 
478 	if (port != (val & VIDEO_DIP_PORT_MASK)) {
479 		if (val & VIDEO_DIP_ENABLE) {
480 			val &= ~VIDEO_DIP_ENABLE;
481 			I915_WRITE(reg, val);
482 			POSTING_READ(reg);
483 		}
484 		val &= ~VIDEO_DIP_PORT_MASK;
485 		val |= port;
486 	}
487 
488 	val |= VIDEO_DIP_ENABLE;
489 	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
490 		 VIDEO_DIP_ENABLE_GCP);
491 
492 	I915_WRITE(reg, val);
493 	POSTING_READ(reg);
494 
495 	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
496 	intel_hdmi_set_spd_infoframe(encoder);
497 }
498 
499 static void cpt_set_infoframes(struct drm_encoder *encoder,
500 			       struct drm_display_mode *adjusted_mode)
501 {
502 	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
503 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
504 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
505 	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
506 	u32 val = I915_READ(reg);
507 
508 	assert_hdmi_port_disabled(intel_hdmi);
509 
510 	/* See the big comment in g4x_set_infoframes() */
511 	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
512 
513 	if (!intel_hdmi->has_hdmi_sink) {
514 		if (!(val & VIDEO_DIP_ENABLE))
515 			return;
516 		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI);
517 		I915_WRITE(reg, val);
518 		POSTING_READ(reg);
519 		return;
520 	}
521 
522 	/* Set both together, unset both together: see the spec. */
523 	val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
524 	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
525 		 VIDEO_DIP_ENABLE_GCP);
526 
527 	I915_WRITE(reg, val);
528 	POSTING_READ(reg);
529 
530 	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
531 	intel_hdmi_set_spd_infoframe(encoder);
532 }
533 
534 static void vlv_set_infoframes(struct drm_encoder *encoder,
535 			       struct drm_display_mode *adjusted_mode)
536 {
537 	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
538 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
539 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
540 	u32 reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
541 	u32 val = I915_READ(reg);
542 
543 	assert_hdmi_port_disabled(intel_hdmi);
544 
545 	/* See the big comment in g4x_set_infoframes() */
546 	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
547 
548 	if (!intel_hdmi->has_hdmi_sink) {
549 		if (!(val & VIDEO_DIP_ENABLE))
550 			return;
551 		val &= ~VIDEO_DIP_ENABLE;
552 		I915_WRITE(reg, val);
553 		POSTING_READ(reg);
554 		return;
555 	}
556 
557 	val |= VIDEO_DIP_ENABLE;
558 	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
559 		 VIDEO_DIP_ENABLE_GCP);
560 
561 	I915_WRITE(reg, val);
562 	POSTING_READ(reg);
563 
564 	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
565 	intel_hdmi_set_spd_infoframe(encoder);
566 }
567 
568 static void hsw_set_infoframes(struct drm_encoder *encoder,
569 			       struct drm_display_mode *adjusted_mode)
570 {
571 	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
572 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
573 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
574 	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
575 	u32 val = I915_READ(reg);
576 
577 	assert_hdmi_port_disabled(intel_hdmi);
578 
579 	if (!intel_hdmi->has_hdmi_sink) {
580 		I915_WRITE(reg, 0);
581 		POSTING_READ(reg);
582 		return;
583 	}
584 
585 	val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
586 		 VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW);
587 
588 	I915_WRITE(reg, val);
589 	POSTING_READ(reg);
590 
591 	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
592 	intel_hdmi_set_spd_infoframe(encoder);
593 }
594 
595 static void intel_hdmi_mode_set(struct drm_encoder *encoder,
596 				struct drm_display_mode *mode,
597 				struct drm_display_mode *adjusted_mode)
598 {
599 	struct drm_device *dev = encoder->dev;
600 	struct drm_i915_private *dev_priv = dev->dev_private;
601 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
602 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
603 	u32 hdmi_val;
604 
605 	hdmi_val = SDVO_ENCODING_HDMI;
606 	if (!HAS_PCH_SPLIT(dev))
607 		hdmi_val |= intel_hdmi->color_range;
608 	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
609 		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
610 	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
611 		hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
612 
613 	if (intel_crtc->config.pipe_bpp > 24)
614 		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
615 	else
616 		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
617 
618 	/* Required on CPT */
619 	if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev))
620 		hdmi_val |= HDMI_MODE_SELECT_HDMI;
621 
622 	if (intel_hdmi->has_audio) {
623 		DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
624 				 pipe_name(intel_crtc->pipe));
625 		hdmi_val |= SDVO_AUDIO_ENABLE;
626 		hdmi_val |= HDMI_MODE_SELECT_HDMI;
627 		intel_write_eld(encoder, adjusted_mode);
628 	}
629 
630 	if (HAS_PCH_CPT(dev))
631 		hdmi_val |= SDVO_PIPE_SEL_CPT(intel_crtc->pipe);
632 	else
633 		hdmi_val |= SDVO_PIPE_SEL(intel_crtc->pipe);
634 
635 	I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
636 	POSTING_READ(intel_hdmi->hdmi_reg);
637 
638 	intel_hdmi->set_infoframes(encoder, adjusted_mode);
639 }
640 
641 static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
642 				    enum i915_pipe *pipe)
643 {
644 	struct drm_device *dev = encoder->base.dev;
645 	struct drm_i915_private *dev_priv = dev->dev_private;
646 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
647 	u32 tmp;
648 
649 	tmp = I915_READ(intel_hdmi->hdmi_reg);
650 
651 	if (!(tmp & SDVO_ENABLE))
652 		return false;
653 
654 	if (HAS_PCH_CPT(dev))
655 		*pipe = PORT_TO_PIPE_CPT(tmp);
656 	else
657 		*pipe = PORT_TO_PIPE(tmp);
658 
659 	return true;
660 }
661 
662 static void intel_hdmi_get_config(struct intel_encoder *encoder,
663 				  struct intel_crtc_config *pipe_config)
664 {
665 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
666 	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
667 	u32 tmp, flags = 0;
668 
669 	tmp = I915_READ(intel_hdmi->hdmi_reg);
670 
671 	if (tmp & SDVO_HSYNC_ACTIVE_HIGH)
672 		flags |= DRM_MODE_FLAG_PHSYNC;
673 	else
674 		flags |= DRM_MODE_FLAG_NHSYNC;
675 
676 	if (tmp & SDVO_VSYNC_ACTIVE_HIGH)
677 		flags |= DRM_MODE_FLAG_PVSYNC;
678 	else
679 		flags |= DRM_MODE_FLAG_NVSYNC;
680 
681 	pipe_config->adjusted_mode.flags |= flags;
682 }
683 
684 static void intel_enable_hdmi(struct intel_encoder *encoder)
685 {
686 	struct drm_device *dev = encoder->base.dev;
687 	struct drm_i915_private *dev_priv = dev->dev_private;
688 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
689 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
690 	u32 temp;
691 	u32 enable_bits = SDVO_ENABLE;
692 
693 	if (intel_hdmi->has_audio)
694 		enable_bits |= SDVO_AUDIO_ENABLE;
695 
696 	temp = I915_READ(intel_hdmi->hdmi_reg);
697 
698 	/* HW workaround for IBX, we need to move the port to transcoder A
699 	 * before disabling it, so restore the transcoder select bit here. */
700 	if (HAS_PCH_IBX(dev))
701 		enable_bits |= SDVO_PIPE_SEL(intel_crtc->pipe);
702 
703 	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
704 	 * we do this anyway which shows more stable in testing.
705 	 */
706 	if (HAS_PCH_SPLIT(dev)) {
707 		I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
708 		POSTING_READ(intel_hdmi->hdmi_reg);
709 	}
710 
711 	temp |= enable_bits;
712 
713 	I915_WRITE(intel_hdmi->hdmi_reg, temp);
714 	POSTING_READ(intel_hdmi->hdmi_reg);
715 
716 	/* HW workaround, need to write this twice for issue that may result
717 	 * in first write getting masked.
718 	 */
719 	if (HAS_PCH_SPLIT(dev)) {
720 		I915_WRITE(intel_hdmi->hdmi_reg, temp);
721 		POSTING_READ(intel_hdmi->hdmi_reg);
722 	}
723 
724 	if (IS_VALLEYVIEW(dev)) {
725 		struct intel_digital_port *dport =
726 			enc_to_dig_port(&encoder->base);
727 		int channel = vlv_dport_to_channel(dport);
728 
729 		vlv_wait_port_ready(dev_priv, channel);
730 	}
731 }
732 
733 static void intel_disable_hdmi(struct intel_encoder *encoder)
734 {
735 	struct drm_device *dev = encoder->base.dev;
736 	struct drm_i915_private *dev_priv = dev->dev_private;
737 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
738 	u32 temp;
739 	u32 enable_bits = SDVO_ENABLE | SDVO_AUDIO_ENABLE;
740 
741 	temp = I915_READ(intel_hdmi->hdmi_reg);
742 
743 	/* HW workaround for IBX, we need to move the port to transcoder A
744 	 * before disabling it. */
745 	if (HAS_PCH_IBX(dev)) {
746 		struct drm_crtc *crtc = encoder->base.crtc;
747 		int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
748 
749 		if (temp & SDVO_PIPE_B_SELECT) {
750 			temp &= ~SDVO_PIPE_B_SELECT;
751 			I915_WRITE(intel_hdmi->hdmi_reg, temp);
752 			POSTING_READ(intel_hdmi->hdmi_reg);
753 
754 			/* Again we need to write this twice. */
755 			I915_WRITE(intel_hdmi->hdmi_reg, temp);
756 			POSTING_READ(intel_hdmi->hdmi_reg);
757 
758 			/* Transcoder selection bits only update
759 			 * effectively on vblank. */
760 			if (crtc)
761 				intel_wait_for_vblank(dev, pipe);
762 			else
763 				msleep(50);
764 		}
765 	}
766 
767 	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
768 	 * we do this anyway which shows more stable in testing.
769 	 */
770 	if (HAS_PCH_SPLIT(dev)) {
771 		I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
772 		POSTING_READ(intel_hdmi->hdmi_reg);
773 	}
774 
775 	temp &= ~enable_bits;
776 
777 	I915_WRITE(intel_hdmi->hdmi_reg, temp);
778 	POSTING_READ(intel_hdmi->hdmi_reg);
779 
780 	/* HW workaround, need to write this twice for issue that may result
781 	 * in first write getting masked.
782 	 */
783 	if (HAS_PCH_SPLIT(dev)) {
784 		I915_WRITE(intel_hdmi->hdmi_reg, temp);
785 		POSTING_READ(intel_hdmi->hdmi_reg);
786 	}
787 }
788 
789 static int hdmi_portclock_limit(struct intel_hdmi *hdmi)
790 {
791 	struct drm_device *dev = intel_hdmi_to_dev(hdmi);
792 
793 	if (IS_G4X(dev))
794 		return 165000;
795 	else if (IS_HASWELL(dev))
796 		return 300000;
797 	else
798 		return 225000;
799 }
800 
801 static int intel_hdmi_mode_valid(struct drm_connector *connector,
802 				 struct drm_display_mode *mode)
803 {
804 	if (mode->clock > hdmi_portclock_limit(intel_attached_hdmi(connector)))
805 		return MODE_CLOCK_HIGH;
806 	if (mode->clock < 20000)
807 		return MODE_CLOCK_LOW;
808 
809 	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
810 		return MODE_NO_DBLESCAN;
811 
812 	return MODE_OK;
813 }
814 
815 bool intel_hdmi_compute_config(struct intel_encoder *encoder,
816 			       struct intel_crtc_config *pipe_config)
817 {
818 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
819 	struct drm_device *dev = encoder->base.dev;
820 	struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode;
821 	int clock_12bpc = pipe_config->requested_mode.clock * 3 / 2;
822 	int portclock_limit = hdmi_portclock_limit(intel_hdmi);
823 	int desired_bpp;
824 
825 	if (intel_hdmi->color_range_auto) {
826 		/* See CEA-861-E - 5.1 Default Encoding Parameters */
827 		if (intel_hdmi->has_hdmi_sink &&
828 		    drm_match_cea_mode(adjusted_mode) > 1)
829 			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
830 		else
831 			intel_hdmi->color_range = 0;
832 	}
833 
834 	if (intel_hdmi->color_range)
835 		pipe_config->limited_color_range = true;
836 
837 	if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
838 		pipe_config->has_pch_encoder = true;
839 
840 	/*
841 	 * HDMI is either 12 or 8, so if the display lets 10bpc sneak
842 	 * through, clamp it down. Note that g4x/vlv don't support 12bpc hdmi
843 	 * outputs. We also need to check that the higher clock still fits
844 	 * within limits.
845 	 */
846 	if (pipe_config->pipe_bpp > 8*3 && clock_12bpc <= portclock_limit
847 	    && HAS_PCH_SPLIT(dev)) {
848 		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
849 		desired_bpp = 12*3;
850 
851 		/* Need to adjust the port link by 1.5x for 12bpc. */
852 		pipe_config->port_clock = clock_12bpc;
853 	} else {
854 		DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
855 		desired_bpp = 8*3;
856 	}
857 
858 	if (!pipe_config->bw_constrained) {
859 		DRM_DEBUG_KMS("forcing pipe bpc to %i for HDMI\n", desired_bpp);
860 		pipe_config->pipe_bpp = desired_bpp;
861 	}
862 
863 	if (adjusted_mode->clock > portclock_limit) {
864 		DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n");
865 		return false;
866 	}
867 
868 	return true;
869 }
870 
871 static enum drm_connector_status
872 intel_hdmi_detect(struct drm_connector *connector, bool force)
873 {
874 	struct drm_device *dev = connector->dev;
875 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
876 	struct intel_digital_port *intel_dig_port =
877 		hdmi_to_dig_port(intel_hdmi);
878 	struct intel_encoder *intel_encoder = &intel_dig_port->base;
879 	struct drm_i915_private *dev_priv = dev->dev_private;
880 	struct edid *edid;
881 	enum drm_connector_status status = connector_status_disconnected;
882 
883 	intel_hdmi->has_hdmi_sink = false;
884 	intel_hdmi->has_audio = false;
885 	intel_hdmi->rgb_quant_range_selectable = false;
886 	edid = drm_get_edid(connector,
887 			    intel_gmbus_get_adapter(dev_priv,
888 						    intel_hdmi->ddc_bus));
889 
890 	if (edid) {
891 		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
892 			status = connector_status_connected;
893 			if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
894 				intel_hdmi->has_hdmi_sink =
895 						drm_detect_hdmi_monitor(edid);
896 			intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
897 			intel_hdmi->rgb_quant_range_selectable =
898 				drm_rgb_quant_range_selectable(edid);
899 		}
900 		kfree(edid);
901 	}
902 
903 	if (status == connector_status_connected) {
904 		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
905 			intel_hdmi->has_audio =
906 				(intel_hdmi->force_audio == HDMI_AUDIO_ON);
907 		intel_encoder->type = INTEL_OUTPUT_HDMI;
908 	}
909 
910 	return status;
911 }
912 
913 static int intel_hdmi_get_modes(struct drm_connector *connector)
914 {
915 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
916 	struct drm_i915_private *dev_priv = connector->dev->dev_private;
917 
918 	/* We should parse the EDID data and find out if it's an HDMI sink so
919 	 * we can send audio to it.
920 	 */
921 
922 	return intel_ddc_get_modes(connector,
923 				   intel_gmbus_get_adapter(dev_priv,
924 							   intel_hdmi->ddc_bus));
925 }
926 
927 static bool
928 intel_hdmi_detect_audio(struct drm_connector *connector)
929 {
930 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
931 	struct drm_i915_private *dev_priv = connector->dev->dev_private;
932 	struct edid *edid;
933 	bool has_audio = false;
934 
935 	edid = drm_get_edid(connector,
936 			    intel_gmbus_get_adapter(dev_priv,
937 						    intel_hdmi->ddc_bus));
938 	if (edid) {
939 		if (edid->input & DRM_EDID_INPUT_DIGITAL)
940 			has_audio = drm_detect_monitor_audio(edid);
941 		kfree(edid);
942 	}
943 
944 	return has_audio;
945 }
946 
947 static int
948 intel_hdmi_set_property(struct drm_connector *connector,
949 			struct drm_property *property,
950 			uint64_t val)
951 {
952 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
953 	struct intel_digital_port *intel_dig_port =
954 		hdmi_to_dig_port(intel_hdmi);
955 	struct drm_i915_private *dev_priv = connector->dev->dev_private;
956 	int ret;
957 
958 	ret = drm_object_property_set_value(&connector->base, property, val);
959 	if (ret)
960 		return ret;
961 
962 	if (property == dev_priv->force_audio_property) {
963 		enum hdmi_force_audio i = val;
964 		bool has_audio;
965 
966 		if (i == intel_hdmi->force_audio)
967 			return 0;
968 
969 		intel_hdmi->force_audio = i;
970 
971 		if (i == HDMI_AUDIO_AUTO)
972 			has_audio = intel_hdmi_detect_audio(connector);
973 		else
974 			has_audio = (i == HDMI_AUDIO_ON);
975 
976 		if (i == HDMI_AUDIO_OFF_DVI)
977 			intel_hdmi->has_hdmi_sink = 0;
978 
979 		intel_hdmi->has_audio = has_audio;
980 		goto done;
981 	}
982 
983 	if (property == dev_priv->broadcast_rgb_property) {
984 		bool old_auto = intel_hdmi->color_range_auto;
985 		uint32_t old_range = intel_hdmi->color_range;
986 
987 		switch (val) {
988 		case INTEL_BROADCAST_RGB_AUTO:
989 			intel_hdmi->color_range_auto = true;
990 			break;
991 		case INTEL_BROADCAST_RGB_FULL:
992 			intel_hdmi->color_range_auto = false;
993 			intel_hdmi->color_range = 0;
994 			break;
995 		case INTEL_BROADCAST_RGB_LIMITED:
996 			intel_hdmi->color_range_auto = false;
997 			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
998 			break;
999 		default:
1000 			return -EINVAL;
1001 		}
1002 
1003 		if (old_auto == intel_hdmi->color_range_auto &&
1004 		    old_range == intel_hdmi->color_range)
1005 			return 0;
1006 
1007 		goto done;
1008 	}
1009 
1010 	return -EINVAL;
1011 
1012 done:
1013 	if (intel_dig_port->base.base.crtc)
1014 		intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
1015 
1016 	return 0;
1017 }
1018 
1019 static void intel_hdmi_pre_enable(struct intel_encoder *encoder)
1020 {
1021 	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1022 	struct drm_device *dev = encoder->base.dev;
1023 	struct drm_i915_private *dev_priv = dev->dev_private;
1024 	struct intel_crtc *intel_crtc =
1025 		to_intel_crtc(encoder->base.crtc);
1026 	int port = vlv_dport_to_channel(dport);
1027 	int pipe = intel_crtc->pipe;
1028 	u32 val;
1029 
1030 	if (!IS_VALLEYVIEW(dev))
1031 		return;
1032 
1033 	/* Enable clock channels for this port */
1034 	val = vlv_dpio_read(dev_priv, DPIO_DATA_LANE_A(port));
1035 	val = 0;
1036 	if (pipe)
1037 		val |= (1<<21);
1038 	else
1039 		val &= ~(1<<21);
1040 	val |= 0x001000c4;
1041 	vlv_dpio_write(dev_priv, DPIO_DATA_CHANNEL(port), val);
1042 
1043 	/* HDMI 1.0V-2dB */
1044 	vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port), 0);
1045 	vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL4(port),
1046 			 0x2b245f5f);
1047 	vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL2(port),
1048 			 0x5578b83a);
1049 	vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL3(port),
1050 			 0x0c782040);
1051 	vlv_dpio_write(dev_priv, DPIO_TX3_SWING_CTL4(port),
1052 			 0x2b247878);
1053 	vlv_dpio_write(dev_priv, DPIO_PCS_STAGGER0(port), 0x00030000);
1054 	vlv_dpio_write(dev_priv, DPIO_PCS_CTL_OVER1(port),
1055 			 0x00002000);
1056 	vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port),
1057 			 DPIO_TX_OCALINIT_EN);
1058 
1059 	/* Program lane clock */
1060 	vlv_dpio_write(dev_priv, DPIO_PCS_CLOCKBUF0(port),
1061 			 0x00760018);
1062 	vlv_dpio_write(dev_priv, DPIO_PCS_CLOCKBUF8(port),
1063 			 0x00400888);
1064 }
1065 
1066 static void intel_hdmi_pre_pll_enable(struct intel_encoder *encoder)
1067 {
1068 	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1069 	struct drm_device *dev = encoder->base.dev;
1070 	struct drm_i915_private *dev_priv = dev->dev_private;
1071 	int port = vlv_dport_to_channel(dport);
1072 
1073 	if (!IS_VALLEYVIEW(dev))
1074 		return;
1075 
1076 	/* Program Tx lane resets to default */
1077 	vlv_dpio_write(dev_priv, DPIO_PCS_TX(port),
1078 			 DPIO_PCS_TX_LANE2_RESET |
1079 			 DPIO_PCS_TX_LANE1_RESET);
1080 	vlv_dpio_write(dev_priv, DPIO_PCS_CLK(port),
1081 			 DPIO_PCS_CLK_CRI_RXEB_EIOS_EN |
1082 			 DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN |
1083 			 (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) |
1084 			 DPIO_PCS_CLK_SOFT_RESET);
1085 
1086 	/* Fix up inter-pair skew failure */
1087 	vlv_dpio_write(dev_priv, DPIO_PCS_STAGGER1(port), 0x00750f00);
1088 	vlv_dpio_write(dev_priv, DPIO_TX_CTL(port), 0x00001500);
1089 	vlv_dpio_write(dev_priv, DPIO_TX_LANE(port), 0x40400000);
1090 
1091 	vlv_dpio_write(dev_priv, DPIO_PCS_CTL_OVER1(port),
1092 			 0x00002000);
1093 	vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port),
1094 			 DPIO_TX_OCALINIT_EN);
1095 }
1096 
1097 static void intel_hdmi_post_disable(struct intel_encoder *encoder)
1098 {
1099 	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1100 	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1101 	int port = vlv_dport_to_channel(dport);
1102 
1103 	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
1104 	mutex_lock(&dev_priv->dpio_lock);
1105 	vlv_dpio_write(dev_priv, DPIO_PCS_TX(port), 0x00000000);
1106 	vlv_dpio_write(dev_priv, DPIO_PCS_CLK(port), 0x00e00060);
1107 	mutex_unlock(&dev_priv->dpio_lock);
1108 }
1109 
1110 static void intel_hdmi_destroy(struct drm_connector *connector)
1111 {
1112 	drm_sysfs_connector_remove(connector);
1113 	drm_connector_cleanup(connector);
1114 	kfree(connector);
1115 }
1116 
1117 static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs = {
1118 	.mode_set = intel_hdmi_mode_set,
1119 };
1120 
1121 static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1122 	.dpms = intel_connector_dpms,
1123 	.detect = intel_hdmi_detect,
1124 	.fill_modes = drm_helper_probe_single_connector_modes,
1125 	.set_property = intel_hdmi_set_property,
1126 	.destroy = intel_hdmi_destroy,
1127 };
1128 
1129 static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
1130 	.get_modes = intel_hdmi_get_modes,
1131 	.mode_valid = intel_hdmi_mode_valid,
1132 	.best_encoder = intel_best_encoder,
1133 };
1134 
1135 static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
1136 	.destroy = intel_encoder_destroy,
1137 };
1138 
1139 static void
1140 intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
1141 {
1142 	intel_attach_force_audio_property(connector);
1143 	intel_attach_broadcast_rgb_property(connector);
1144 	intel_hdmi->color_range_auto = true;
1145 }
1146 
1147 void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1148 			       struct intel_connector *intel_connector)
1149 {
1150 	struct drm_connector *connector = &intel_connector->base;
1151 	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
1152 	struct intel_encoder *intel_encoder = &intel_dig_port->base;
1153 	struct drm_device *dev = intel_encoder->base.dev;
1154 	struct drm_i915_private *dev_priv = dev->dev_private;
1155 	enum port port = intel_dig_port->port;
1156 
1157 	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1158 			   DRM_MODE_CONNECTOR_HDMIA);
1159 	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
1160 
1161 	connector->interlace_allowed = 1;
1162 	connector->doublescan_allowed = 0;
1163 
1164 	switch (port) {
1165 	case PORT_B:
1166 		intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
1167 		intel_encoder->hpd_pin = HPD_PORT_B;
1168 		break;
1169 	case PORT_C:
1170 		intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
1171 		intel_encoder->hpd_pin = HPD_PORT_C;
1172 		break;
1173 	case PORT_D:
1174 		intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
1175 		intel_encoder->hpd_pin = HPD_PORT_D;
1176 		break;
1177 	case PORT_A:
1178 		intel_encoder->hpd_pin = HPD_PORT_A;
1179 		/* Internal port only for eDP. */
1180 	default:
1181 		BUG();
1182 	}
1183 
1184 	if (IS_VALLEYVIEW(dev)) {
1185 		intel_hdmi->write_infoframe = vlv_write_infoframe;
1186 		intel_hdmi->set_infoframes = vlv_set_infoframes;
1187 	} else if (!HAS_PCH_SPLIT(dev)) {
1188 		intel_hdmi->write_infoframe = g4x_write_infoframe;
1189 		intel_hdmi->set_infoframes = g4x_set_infoframes;
1190 	} else if (HAS_DDI(dev)) {
1191 		intel_hdmi->write_infoframe = hsw_write_infoframe;
1192 		intel_hdmi->set_infoframes = hsw_set_infoframes;
1193 	} else if (HAS_PCH_IBX(dev)) {
1194 		intel_hdmi->write_infoframe = ibx_write_infoframe;
1195 		intel_hdmi->set_infoframes = ibx_set_infoframes;
1196 	} else {
1197 		intel_hdmi->write_infoframe = cpt_write_infoframe;
1198 		intel_hdmi->set_infoframes = cpt_set_infoframes;
1199 	}
1200 
1201 	if (HAS_DDI(dev))
1202 		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
1203 	else
1204 		intel_connector->get_hw_state = intel_connector_get_hw_state;
1205 
1206 	intel_hdmi_add_properties(intel_hdmi, connector);
1207 
1208 	intel_connector_attach_encoder(intel_connector, intel_encoder);
1209 	drm_sysfs_connector_add(connector);
1210 
1211 	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
1212 	 * 0xd.  Failure to do so will result in spurious interrupts being
1213 	 * generated on the port when a cable is not attached.
1214 	 */
1215 	if (IS_G4X(dev) && !IS_GM45(dev)) {
1216 		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
1217 		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
1218 	}
1219 }
1220 
1221 void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
1222 {
1223 	struct intel_digital_port *intel_dig_port;
1224 	struct intel_encoder *intel_encoder;
1225 	struct drm_encoder *encoder;
1226 	struct intel_connector *intel_connector;
1227 
1228 	intel_dig_port = kzalloc(sizeof(struct intel_digital_port), GFP_KERNEL);
1229 	if (!intel_dig_port)
1230 		return;
1231 
1232 	intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
1233 	if (!intel_connector) {
1234 		kfree(intel_dig_port);
1235 		return;
1236 	}
1237 
1238 	intel_encoder = &intel_dig_port->base;
1239 	encoder = &intel_encoder->base;
1240 
1241 	drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
1242 			 DRM_MODE_ENCODER_TMDS);
1243 	drm_encoder_helper_add(&intel_encoder->base, &intel_hdmi_helper_funcs);
1244 
1245 	intel_encoder->compute_config = intel_hdmi_compute_config;
1246 	intel_encoder->enable = intel_enable_hdmi;
1247 	intel_encoder->disable = intel_disable_hdmi;
1248 	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
1249 	intel_encoder->get_config = intel_hdmi_get_config;
1250 	if (IS_VALLEYVIEW(dev)) {
1251 		intel_encoder->pre_enable = intel_hdmi_pre_enable;
1252 		intel_encoder->pre_pll_enable = intel_hdmi_pre_pll_enable;
1253 		intel_encoder->post_disable = intel_hdmi_post_disable;
1254 	}
1255 
1256 	intel_encoder->type = INTEL_OUTPUT_HDMI;
1257 	intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
1258 	intel_encoder->cloneable = false;
1259 
1260 	intel_dig_port->port = port;
1261 	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
1262 	intel_dig_port->dp.output_reg = 0;
1263 
1264 	intel_hdmi_init_connector(intel_dig_port, intel_connector);
1265 }
1266