2 * Copyright 2006 Dave Airlie <airlied@linux.ie>
3 * Copyright © 2006-2009 Intel Corporation
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:
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
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.
25 * Eric Anholt <eric@anholt.net>
26 * Jesse Barnes <jesse.barnes@intel.com>
29 #include <linux/i2c.h>
30 #include <linux/slab.h>
31 #include <linux/delay.h>
32 #include <linux/hdmi.h>
34 #include <drm/drm_crtc.h>
35 #include <drm/drm_edid.h>
36 #include "intel_drv.h"
37 #include <drm/i915_drm.h>
40 static struct drm_device
*intel_hdmi_to_dev(struct intel_hdmi
*intel_hdmi
)
42 return hdmi_to_dig_port(intel_hdmi
)->base
.base
.dev
;
46 assert_hdmi_port_disabled(struct intel_hdmi
*intel_hdmi
)
48 struct drm_device
*dev
= intel_hdmi_to_dev(intel_hdmi
);
49 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
50 uint32_t enabled_bits
;
52 enabled_bits
= HAS_DDI(dev
) ? DDI_BUF_CTL_ENABLE
: SDVO_ENABLE
;
54 WARN(I915_READ(intel_hdmi
->hdmi_reg
) & enabled_bits
,
55 "HDMI port enabled, expecting disabled\n");
58 struct intel_hdmi
*enc_to_intel_hdmi(struct drm_encoder
*encoder
)
60 struct intel_digital_port
*intel_dig_port
=
61 container_of(encoder
, struct intel_digital_port
, base
.base
);
62 return &intel_dig_port
->hdmi
;
65 static struct intel_hdmi
*intel_attached_hdmi(struct drm_connector
*connector
)
67 return enc_to_intel_hdmi(&intel_attached_encoder(connector
)->base
);
70 static u32
g4x_infoframe_index(enum hdmi_infoframe_type type
)
73 case HDMI_INFOFRAME_TYPE_AVI
:
74 return VIDEO_DIP_SELECT_AVI
;
75 case HDMI_INFOFRAME_TYPE_SPD
:
76 return VIDEO_DIP_SELECT_SPD
;
78 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type
);
83 static u32
g4x_infoframe_enable(enum hdmi_infoframe_type type
)
86 case HDMI_INFOFRAME_TYPE_AVI
:
87 return VIDEO_DIP_ENABLE_AVI
;
88 case HDMI_INFOFRAME_TYPE_SPD
:
89 return VIDEO_DIP_ENABLE_SPD
;
91 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type
);
96 static u32
hsw_infoframe_enable(enum hdmi_infoframe_type type
)
99 case HDMI_INFOFRAME_TYPE_AVI
:
100 return VIDEO_DIP_ENABLE_AVI_HSW
;
101 case HDMI_INFOFRAME_TYPE_SPD
:
102 return VIDEO_DIP_ENABLE_SPD_HSW
;
104 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type
);
109 static u32
hsw_infoframe_data_reg(enum hdmi_infoframe_type type
,
110 enum transcoder cpu_transcoder
)
113 case HDMI_INFOFRAME_TYPE_AVI
:
114 return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder
);
115 case HDMI_INFOFRAME_TYPE_SPD
:
116 return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder
);
118 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type
);
123 static void g4x_write_infoframe(struct drm_encoder
*encoder
,
124 enum hdmi_infoframe_type type
,
125 const uint8_t *frame
, ssize_t len
)
127 uint32_t *data
= (uint32_t *)frame
;
128 struct drm_device
*dev
= encoder
->dev
;
129 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
130 u32 val
= I915_READ(VIDEO_DIP_CTL
);
133 WARN(!(val
& VIDEO_DIP_ENABLE
), "Writing DIP with CTL reg disabled\n");
135 val
&= ~(VIDEO_DIP_SELECT_MASK
| 0xf); /* clear DIP data offset */
136 val
|= g4x_infoframe_index(type
);
138 val
&= ~g4x_infoframe_enable(type
);
140 I915_WRITE(VIDEO_DIP_CTL
, val
);
143 for (i
= 0; i
< len
; i
+= 4) {
144 I915_WRITE(VIDEO_DIP_DATA
, *data
);
147 /* Write every possible data byte to force correct ECC calculation. */
148 for (; i
< VIDEO_DIP_DATA_SIZE
; i
+= 4)
149 I915_WRITE(VIDEO_DIP_DATA
, 0);
152 val
|= g4x_infoframe_enable(type
);
153 val
&= ~VIDEO_DIP_FREQ_MASK
;
154 val
|= VIDEO_DIP_FREQ_VSYNC
;
156 I915_WRITE(VIDEO_DIP_CTL
, val
);
157 POSTING_READ(VIDEO_DIP_CTL
);
160 static void ibx_write_infoframe(struct drm_encoder
*encoder
,
161 enum hdmi_infoframe_type type
,
162 const uint8_t *frame
, ssize_t len
)
164 uint32_t *data
= (uint32_t *)frame
;
165 struct drm_device
*dev
= encoder
->dev
;
166 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
167 struct intel_crtc
*intel_crtc
= to_intel_crtc(encoder
->crtc
);
168 int i
, reg
= TVIDEO_DIP_CTL(intel_crtc
->pipe
);
169 u32 val
= I915_READ(reg
);
171 WARN(!(val
& VIDEO_DIP_ENABLE
), "Writing DIP with CTL reg disabled\n");
173 val
&= ~(VIDEO_DIP_SELECT_MASK
| 0xf); /* clear DIP data offset */
174 val
|= g4x_infoframe_index(type
);
176 val
&= ~g4x_infoframe_enable(type
);
178 I915_WRITE(reg
, val
);
181 for (i
= 0; i
< len
; i
+= 4) {
182 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc
->pipe
), *data
);
185 /* Write every possible data byte to force correct ECC calculation. */
186 for (; i
< VIDEO_DIP_DATA_SIZE
; i
+= 4)
187 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc
->pipe
), 0);
190 val
|= g4x_infoframe_enable(type
);
191 val
&= ~VIDEO_DIP_FREQ_MASK
;
192 val
|= VIDEO_DIP_FREQ_VSYNC
;
194 I915_WRITE(reg
, val
);
198 static void cpt_write_infoframe(struct drm_encoder
*encoder
,
199 enum hdmi_infoframe_type type
,
200 const uint8_t *frame
, ssize_t len
)
202 uint32_t *data
= (uint32_t *)frame
;
203 struct drm_device
*dev
= encoder
->dev
;
204 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
205 struct intel_crtc
*intel_crtc
= to_intel_crtc(encoder
->crtc
);
206 int i
, reg
= TVIDEO_DIP_CTL(intel_crtc
->pipe
);
207 u32 val
= I915_READ(reg
);
209 WARN(!(val
& VIDEO_DIP_ENABLE
), "Writing DIP with CTL reg disabled\n");
211 val
&= ~(VIDEO_DIP_SELECT_MASK
| 0xf); /* clear DIP data offset */
212 val
|= g4x_infoframe_index(type
);
214 /* The DIP control register spec says that we need to update the AVI
215 * infoframe without clearing its enable bit */
216 if (type
!= HDMI_INFOFRAME_TYPE_AVI
)
217 val
&= ~g4x_infoframe_enable(type
);
219 I915_WRITE(reg
, val
);
222 for (i
= 0; i
< len
; i
+= 4) {
223 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc
->pipe
), *data
);
226 /* Write every possible data byte to force correct ECC calculation. */
227 for (; i
< VIDEO_DIP_DATA_SIZE
; i
+= 4)
228 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc
->pipe
), 0);
231 val
|= g4x_infoframe_enable(type
);
232 val
&= ~VIDEO_DIP_FREQ_MASK
;
233 val
|= VIDEO_DIP_FREQ_VSYNC
;
235 I915_WRITE(reg
, val
);
239 static void vlv_write_infoframe(struct drm_encoder
*encoder
,
240 enum hdmi_infoframe_type type
,
241 const uint8_t *frame
, ssize_t len
)
243 uint32_t *data
= (uint32_t *)frame
;
244 struct drm_device
*dev
= encoder
->dev
;
245 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
246 struct intel_crtc
*intel_crtc
= to_intel_crtc(encoder
->crtc
);
247 int i
, reg
= VLV_TVIDEO_DIP_CTL(intel_crtc
->pipe
);
248 u32 val
= I915_READ(reg
);
250 WARN(!(val
& VIDEO_DIP_ENABLE
), "Writing DIP with CTL reg disabled\n");
252 val
&= ~(VIDEO_DIP_SELECT_MASK
| 0xf); /* clear DIP data offset */
253 val
|= g4x_infoframe_index(type
);
255 val
&= ~g4x_infoframe_enable(type
);
257 I915_WRITE(reg
, val
);
260 for (i
= 0; i
< len
; i
+= 4) {
261 I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc
->pipe
), *data
);
264 /* Write every possible data byte to force correct ECC calculation. */
265 for (; i
< VIDEO_DIP_DATA_SIZE
; i
+= 4)
266 I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc
->pipe
), 0);
269 val
|= g4x_infoframe_enable(type
);
270 val
&= ~VIDEO_DIP_FREQ_MASK
;
271 val
|= VIDEO_DIP_FREQ_VSYNC
;
273 I915_WRITE(reg
, val
);
277 static void hsw_write_infoframe(struct drm_encoder
*encoder
,
278 enum hdmi_infoframe_type type
,
279 const uint8_t *frame
, ssize_t len
)
281 uint32_t *data
= (uint32_t *)frame
;
282 struct drm_device
*dev
= encoder
->dev
;
283 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
284 struct intel_crtc
*intel_crtc
= to_intel_crtc(encoder
->crtc
);
285 u32 ctl_reg
= HSW_TVIDEO_DIP_CTL(intel_crtc
->config
.cpu_transcoder
);
288 u32 val
= I915_READ(ctl_reg
);
290 data_reg
= hsw_infoframe_data_reg(type
,
291 intel_crtc
->config
.cpu_transcoder
);
295 val
&= ~hsw_infoframe_enable(type
);
296 I915_WRITE(ctl_reg
, val
);
299 for (i
= 0; i
< len
; i
+= 4) {
300 I915_WRITE(data_reg
+ i
, *data
);
303 /* Write every possible data byte to force correct ECC calculation. */
304 for (; i
< VIDEO_DIP_DATA_SIZE
; i
+= 4)
305 I915_WRITE(data_reg
+ i
, 0);
308 val
|= hsw_infoframe_enable(type
);
309 I915_WRITE(ctl_reg
, val
);
310 POSTING_READ(ctl_reg
);
314 * The data we write to the DIP data buffer registers is 1 byte bigger than the
315 * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting
316 * at 0). It's also a byte used by DisplayPort so the same DIP registers can be
317 * used for both technologies.
319 * DW0: Reserved/ECC/DP | HB2 | HB1 | HB0
320 * DW1: DB3 | DB2 | DB1 | DB0
321 * DW2: DB7 | DB6 | DB5 | DB4
324 * (HB is Header Byte, DB is Data Byte)
326 * The hdmi pack() functions don't know about that hardware specific hole so we
327 * trick them by giving an offset into the buffer and moving back the header
330 static void intel_set_infoframe(struct drm_encoder
*encoder
,
331 union hdmi_infoframe
*frame
)
333 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(encoder
);
334 uint8_t buffer
[VIDEO_DIP_DATA_SIZE
];
337 /* see comment above for the reason for this offset */
338 len
= hdmi_infoframe_pack(frame
, buffer
+ 1, sizeof(buffer
) - 1);
342 /* Insert the 'hole' (see big comment above) at position 3 */
343 buffer
[0] = buffer
[1];
344 buffer
[1] = buffer
[2];
345 buffer
[2] = buffer
[3];
349 intel_hdmi
->write_infoframe(encoder
, frame
->any
.type
, buffer
, len
);
352 static void intel_hdmi_set_avi_infoframe(struct drm_encoder
*encoder
,
353 struct drm_display_mode
*adjusted_mode
)
355 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(encoder
);
356 struct intel_crtc
*intel_crtc
= to_intel_crtc(encoder
->crtc
);
357 union hdmi_infoframe frame
;
360 ret
= drm_hdmi_avi_infoframe_from_display_mode(&frame
.avi
,
363 DRM_ERROR("couldn't fill AVI infoframe\n");
367 if (intel_hdmi
->rgb_quant_range_selectable
) {
368 if (intel_crtc
->config
.limited_color_range
)
369 frame
.avi
.quantization_range
=
370 HDMI_QUANTIZATION_RANGE_LIMITED
;
372 frame
.avi
.quantization_range
=
373 HDMI_QUANTIZATION_RANGE_FULL
;
376 intel_set_infoframe(encoder
, &frame
);
379 static void intel_hdmi_set_spd_infoframe(struct drm_encoder
*encoder
)
381 union hdmi_infoframe frame
;
384 ret
= hdmi_spd_infoframe_init(&frame
.spd
, "Intel", "Integrated gfx");
386 DRM_ERROR("couldn't fill SPD infoframe\n");
390 frame
.spd
.sdi
= HDMI_SPD_SDI_PC
;
392 intel_set_infoframe(encoder
, &frame
);
395 static void g4x_set_infoframes(struct drm_encoder
*encoder
,
396 struct drm_display_mode
*adjusted_mode
)
398 struct drm_i915_private
*dev_priv
= encoder
->dev
->dev_private
;
399 struct intel_digital_port
*intel_dig_port
= enc_to_dig_port(encoder
);
400 struct intel_hdmi
*intel_hdmi
= &intel_dig_port
->hdmi
;
401 u32 reg
= VIDEO_DIP_CTL
;
402 u32 val
= I915_READ(reg
);
405 assert_hdmi_port_disabled(intel_hdmi
);
407 /* If the registers were not initialized yet, they might be zeroes,
408 * which means we're selecting the AVI DIP and we're setting its
409 * frequency to once. This seems to really confuse the HW and make
410 * things stop working (the register spec says the AVI always needs to
411 * be sent every VSync). So here we avoid writing to the register more
412 * than we need and also explicitly select the AVI DIP and explicitly
413 * set its frequency to every VSync. Avoiding to write it twice seems to
414 * be enough to solve the problem, but being defensive shouldn't hurt us
416 val
|= VIDEO_DIP_SELECT_AVI
| VIDEO_DIP_FREQ_VSYNC
;
418 if (!intel_hdmi
->has_hdmi_sink
) {
419 if (!(val
& VIDEO_DIP_ENABLE
))
421 val
&= ~VIDEO_DIP_ENABLE
;
422 I915_WRITE(reg
, val
);
427 switch (intel_dig_port
->port
) {
429 port
= VIDEO_DIP_PORT_B
;
432 port
= VIDEO_DIP_PORT_C
;
439 if (port
!= (val
& VIDEO_DIP_PORT_MASK
)) {
440 if (val
& VIDEO_DIP_ENABLE
) {
441 val
&= ~VIDEO_DIP_ENABLE
;
442 I915_WRITE(reg
, val
);
445 val
&= ~VIDEO_DIP_PORT_MASK
;
449 val
|= VIDEO_DIP_ENABLE
;
450 val
&= ~VIDEO_DIP_ENABLE_VENDOR
;
452 I915_WRITE(reg
, val
);
455 intel_hdmi_set_avi_infoframe(encoder
, adjusted_mode
);
456 intel_hdmi_set_spd_infoframe(encoder
);
459 static void ibx_set_infoframes(struct drm_encoder
*encoder
,
460 struct drm_display_mode
*adjusted_mode
)
462 struct drm_i915_private
*dev_priv
= encoder
->dev
->dev_private
;
463 struct intel_crtc
*intel_crtc
= to_intel_crtc(encoder
->crtc
);
464 struct intel_digital_port
*intel_dig_port
= enc_to_dig_port(encoder
);
465 struct intel_hdmi
*intel_hdmi
= &intel_dig_port
->hdmi
;
466 u32 reg
= TVIDEO_DIP_CTL(intel_crtc
->pipe
);
467 u32 val
= I915_READ(reg
);
470 assert_hdmi_port_disabled(intel_hdmi
);
472 /* See the big comment in g4x_set_infoframes() */
473 val
|= VIDEO_DIP_SELECT_AVI
| VIDEO_DIP_FREQ_VSYNC
;
475 if (!intel_hdmi
->has_hdmi_sink
) {
476 if (!(val
& VIDEO_DIP_ENABLE
))
478 val
&= ~VIDEO_DIP_ENABLE
;
479 I915_WRITE(reg
, val
);
484 switch (intel_dig_port
->port
) {
486 port
= VIDEO_DIP_PORT_B
;
489 port
= VIDEO_DIP_PORT_C
;
492 port
= VIDEO_DIP_PORT_D
;
499 if (port
!= (val
& VIDEO_DIP_PORT_MASK
)) {
500 if (val
& VIDEO_DIP_ENABLE
) {
501 val
&= ~VIDEO_DIP_ENABLE
;
502 I915_WRITE(reg
, val
);
505 val
&= ~VIDEO_DIP_PORT_MASK
;
509 val
|= VIDEO_DIP_ENABLE
;
510 val
&= ~(VIDEO_DIP_ENABLE_VENDOR
| VIDEO_DIP_ENABLE_GAMUT
|
511 VIDEO_DIP_ENABLE_GCP
);
513 I915_WRITE(reg
, val
);
516 intel_hdmi_set_avi_infoframe(encoder
, adjusted_mode
);
517 intel_hdmi_set_spd_infoframe(encoder
);
520 static void cpt_set_infoframes(struct drm_encoder
*encoder
,
521 struct drm_display_mode
*adjusted_mode
)
523 struct drm_i915_private
*dev_priv
= encoder
->dev
->dev_private
;
524 struct intel_crtc
*intel_crtc
= to_intel_crtc(encoder
->crtc
);
525 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(encoder
);
526 u32 reg
= TVIDEO_DIP_CTL(intel_crtc
->pipe
);
527 u32 val
= I915_READ(reg
);
529 assert_hdmi_port_disabled(intel_hdmi
);
531 /* See the big comment in g4x_set_infoframes() */
532 val
|= VIDEO_DIP_SELECT_AVI
| VIDEO_DIP_FREQ_VSYNC
;
534 if (!intel_hdmi
->has_hdmi_sink
) {
535 if (!(val
& VIDEO_DIP_ENABLE
))
537 val
&= ~(VIDEO_DIP_ENABLE
| VIDEO_DIP_ENABLE_AVI
);
538 I915_WRITE(reg
, val
);
543 /* Set both together, unset both together: see the spec. */
544 val
|= VIDEO_DIP_ENABLE
| VIDEO_DIP_ENABLE_AVI
;
545 val
&= ~(VIDEO_DIP_ENABLE_VENDOR
| VIDEO_DIP_ENABLE_GAMUT
|
546 VIDEO_DIP_ENABLE_GCP
);
548 I915_WRITE(reg
, val
);
551 intel_hdmi_set_avi_infoframe(encoder
, adjusted_mode
);
552 intel_hdmi_set_spd_infoframe(encoder
);
555 static void vlv_set_infoframes(struct drm_encoder
*encoder
,
556 struct drm_display_mode
*adjusted_mode
)
558 struct drm_i915_private
*dev_priv
= encoder
->dev
->dev_private
;
559 struct intel_crtc
*intel_crtc
= to_intel_crtc(encoder
->crtc
);
560 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(encoder
);
561 u32 reg
= VLV_TVIDEO_DIP_CTL(intel_crtc
->pipe
);
562 u32 val
= I915_READ(reg
);
564 assert_hdmi_port_disabled(intel_hdmi
);
566 /* See the big comment in g4x_set_infoframes() */
567 val
|= VIDEO_DIP_SELECT_AVI
| VIDEO_DIP_FREQ_VSYNC
;
569 if (!intel_hdmi
->has_hdmi_sink
) {
570 if (!(val
& VIDEO_DIP_ENABLE
))
572 val
&= ~VIDEO_DIP_ENABLE
;
573 I915_WRITE(reg
, val
);
578 val
|= VIDEO_DIP_ENABLE
;
579 val
&= ~(VIDEO_DIP_ENABLE_VENDOR
| VIDEO_DIP_ENABLE_GAMUT
|
580 VIDEO_DIP_ENABLE_GCP
);
582 I915_WRITE(reg
, val
);
585 intel_hdmi_set_avi_infoframe(encoder
, adjusted_mode
);
586 intel_hdmi_set_spd_infoframe(encoder
);
589 static void hsw_set_infoframes(struct drm_encoder
*encoder
,
590 struct drm_display_mode
*adjusted_mode
)
592 struct drm_i915_private
*dev_priv
= encoder
->dev
->dev_private
;
593 struct intel_crtc
*intel_crtc
= to_intel_crtc(encoder
->crtc
);
594 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(encoder
);
595 u32 reg
= HSW_TVIDEO_DIP_CTL(intel_crtc
->config
.cpu_transcoder
);
596 u32 val
= I915_READ(reg
);
598 assert_hdmi_port_disabled(intel_hdmi
);
600 if (!intel_hdmi
->has_hdmi_sink
) {
606 val
&= ~(VIDEO_DIP_ENABLE_VSC_HSW
| VIDEO_DIP_ENABLE_GCP_HSW
|
607 VIDEO_DIP_ENABLE_VS_HSW
| VIDEO_DIP_ENABLE_GMP_HSW
);
609 I915_WRITE(reg
, val
);
612 intel_hdmi_set_avi_infoframe(encoder
, adjusted_mode
);
613 intel_hdmi_set_spd_infoframe(encoder
);
616 static void intel_hdmi_mode_set(struct intel_encoder
*encoder
)
618 struct drm_device
*dev
= encoder
->base
.dev
;
619 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
620 struct intel_crtc
*crtc
= to_intel_crtc(encoder
->base
.crtc
);
621 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(&encoder
->base
);
622 struct drm_display_mode
*adjusted_mode
= &crtc
->config
.adjusted_mode
;
625 hdmi_val
= SDVO_ENCODING_HDMI
;
626 if (!HAS_PCH_SPLIT(dev
))
627 hdmi_val
|= intel_hdmi
->color_range
;
628 if (adjusted_mode
->flags
& DRM_MODE_FLAG_PVSYNC
)
629 hdmi_val
|= SDVO_VSYNC_ACTIVE_HIGH
;
630 if (adjusted_mode
->flags
& DRM_MODE_FLAG_PHSYNC
)
631 hdmi_val
|= SDVO_HSYNC_ACTIVE_HIGH
;
633 if (crtc
->config
.pipe_bpp
> 24)
634 hdmi_val
|= HDMI_COLOR_FORMAT_12bpc
;
636 hdmi_val
|= SDVO_COLOR_FORMAT_8bpc
;
638 /* Required on CPT */
639 if (intel_hdmi
->has_hdmi_sink
&& HAS_PCH_CPT(dev
))
640 hdmi_val
|= HDMI_MODE_SELECT_HDMI
;
642 if (intel_hdmi
->has_audio
) {
643 DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
644 pipe_name(crtc
->pipe
));
645 hdmi_val
|= SDVO_AUDIO_ENABLE
;
646 hdmi_val
|= HDMI_MODE_SELECT_HDMI
;
647 intel_write_eld(&encoder
->base
, adjusted_mode
);
650 if (HAS_PCH_CPT(dev
))
651 hdmi_val
|= SDVO_PIPE_SEL_CPT(crtc
->pipe
);
653 hdmi_val
|= SDVO_PIPE_SEL(crtc
->pipe
);
655 I915_WRITE(intel_hdmi
->hdmi_reg
, hdmi_val
);
656 POSTING_READ(intel_hdmi
->hdmi_reg
);
658 intel_hdmi
->set_infoframes(&encoder
->base
, adjusted_mode
);
661 static bool intel_hdmi_get_hw_state(struct intel_encoder
*encoder
,
664 struct drm_device
*dev
= encoder
->base
.dev
;
665 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
666 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(&encoder
->base
);
669 tmp
= I915_READ(intel_hdmi
->hdmi_reg
);
671 if (!(tmp
& SDVO_ENABLE
))
674 if (HAS_PCH_CPT(dev
))
675 *pipe
= PORT_TO_PIPE_CPT(tmp
);
677 *pipe
= PORT_TO_PIPE(tmp
);
682 static void intel_hdmi_get_config(struct intel_encoder
*encoder
,
683 struct intel_crtc_config
*pipe_config
)
685 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(&encoder
->base
);
686 struct drm_i915_private
*dev_priv
= encoder
->base
.dev
->dev_private
;
689 tmp
= I915_READ(intel_hdmi
->hdmi_reg
);
691 if (tmp
& SDVO_HSYNC_ACTIVE_HIGH
)
692 flags
|= DRM_MODE_FLAG_PHSYNC
;
694 flags
|= DRM_MODE_FLAG_NHSYNC
;
696 if (tmp
& SDVO_VSYNC_ACTIVE_HIGH
)
697 flags
|= DRM_MODE_FLAG_PVSYNC
;
699 flags
|= DRM_MODE_FLAG_NVSYNC
;
701 pipe_config
->adjusted_mode
.flags
|= flags
;
704 static void intel_enable_hdmi(struct intel_encoder
*encoder
)
706 struct drm_device
*dev
= encoder
->base
.dev
;
707 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
708 struct intel_crtc
*intel_crtc
= to_intel_crtc(encoder
->base
.crtc
);
709 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(&encoder
->base
);
711 u32 enable_bits
= SDVO_ENABLE
;
713 if (intel_hdmi
->has_audio
)
714 enable_bits
|= SDVO_AUDIO_ENABLE
;
716 temp
= I915_READ(intel_hdmi
->hdmi_reg
);
718 /* HW workaround for IBX, we need to move the port to transcoder A
719 * before disabling it, so restore the transcoder select bit here. */
720 if (HAS_PCH_IBX(dev
))
721 enable_bits
|= SDVO_PIPE_SEL(intel_crtc
->pipe
);
723 /* HW workaround, need to toggle enable bit off and on for 12bpc, but
724 * we do this anyway which shows more stable in testing.
726 if (HAS_PCH_SPLIT(dev
)) {
727 I915_WRITE(intel_hdmi
->hdmi_reg
, temp
& ~SDVO_ENABLE
);
728 POSTING_READ(intel_hdmi
->hdmi_reg
);
733 I915_WRITE(intel_hdmi
->hdmi_reg
, temp
);
734 POSTING_READ(intel_hdmi
->hdmi_reg
);
736 /* HW workaround, need to write this twice for issue that may result
737 * in first write getting masked.
739 if (HAS_PCH_SPLIT(dev
)) {
740 I915_WRITE(intel_hdmi
->hdmi_reg
, temp
);
741 POSTING_READ(intel_hdmi
->hdmi_reg
);
745 static void vlv_enable_hdmi(struct intel_encoder
*encoder
)
749 static void intel_disable_hdmi(struct intel_encoder
*encoder
)
751 struct drm_device
*dev
= encoder
->base
.dev
;
752 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
753 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(&encoder
->base
);
755 u32 enable_bits
= SDVO_ENABLE
| SDVO_AUDIO_ENABLE
;
757 temp
= I915_READ(intel_hdmi
->hdmi_reg
);
759 /* HW workaround for IBX, we need to move the port to transcoder A
760 * before disabling it. */
761 if (HAS_PCH_IBX(dev
)) {
762 struct drm_crtc
*crtc
= encoder
->base
.crtc
;
763 int pipe
= crtc
? to_intel_crtc(crtc
)->pipe
: -1;
765 if (temp
& SDVO_PIPE_B_SELECT
) {
766 temp
&= ~SDVO_PIPE_B_SELECT
;
767 I915_WRITE(intel_hdmi
->hdmi_reg
, temp
);
768 POSTING_READ(intel_hdmi
->hdmi_reg
);
770 /* Again we need to write this twice. */
771 I915_WRITE(intel_hdmi
->hdmi_reg
, temp
);
772 POSTING_READ(intel_hdmi
->hdmi_reg
);
774 /* Transcoder selection bits only update
775 * effectively on vblank. */
777 intel_wait_for_vblank(dev
, pipe
);
783 /* HW workaround, need to toggle enable bit off and on for 12bpc, but
784 * we do this anyway which shows more stable in testing.
786 if (HAS_PCH_SPLIT(dev
)) {
787 I915_WRITE(intel_hdmi
->hdmi_reg
, temp
& ~SDVO_ENABLE
);
788 POSTING_READ(intel_hdmi
->hdmi_reg
);
791 temp
&= ~enable_bits
;
793 I915_WRITE(intel_hdmi
->hdmi_reg
, temp
);
794 POSTING_READ(intel_hdmi
->hdmi_reg
);
796 /* HW workaround, need to write this twice for issue that may result
797 * in first write getting masked.
799 if (HAS_PCH_SPLIT(dev
)) {
800 I915_WRITE(intel_hdmi
->hdmi_reg
, temp
);
801 POSTING_READ(intel_hdmi
->hdmi_reg
);
805 static int intel_hdmi_mode_valid(struct drm_connector
*connector
,
806 struct drm_display_mode
*mode
)
808 if (mode
->clock
> 165000)
809 return MODE_CLOCK_HIGH
;
810 if (mode
->clock
< 20000)
811 return MODE_CLOCK_LOW
;
813 if (mode
->flags
& DRM_MODE_FLAG_DBLSCAN
)
814 return MODE_NO_DBLESCAN
;
819 bool intel_hdmi_compute_config(struct intel_encoder
*encoder
,
820 struct intel_crtc_config
*pipe_config
)
822 struct intel_hdmi
*intel_hdmi
= enc_to_intel_hdmi(&encoder
->base
);
823 struct drm_device
*dev
= encoder
->base
.dev
;
824 struct drm_display_mode
*adjusted_mode
= &pipe_config
->adjusted_mode
;
825 int clock_12bpc
= pipe_config
->requested_mode
.clock
* 3 / 2;
828 if (intel_hdmi
->color_range_auto
) {
829 /* See CEA-861-E - 5.1 Default Encoding Parameters */
830 if (intel_hdmi
->has_hdmi_sink
&&
831 drm_match_cea_mode(adjusted_mode
) > 1)
832 intel_hdmi
->color_range
= HDMI_COLOR_RANGE_16_235
;
834 intel_hdmi
->color_range
= 0;
837 if (intel_hdmi
->color_range
)
838 pipe_config
->limited_color_range
= true;
840 if (HAS_PCH_SPLIT(dev
) && !HAS_DDI(dev
))
841 pipe_config
->has_pch_encoder
= true;
844 * HDMI is either 12 or 8, so if the display lets 10bpc sneak
845 * through, clamp it down. Note that g4x/vlv don't support 12bpc hdmi
846 * outputs. We also need to check that the higher clock still fits
849 if (pipe_config
->pipe_bpp
> 8*3 && clock_12bpc
<= 225000
850 && HAS_PCH_SPLIT(dev
)) {
851 DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
854 /* Need to adjust the port link by 1.5x for 12bpc. */
855 pipe_config
->port_clock
= clock_12bpc
;
857 DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
861 if (!pipe_config
->bw_constrained
) {
862 DRM_DEBUG_KMS("forcing pipe bpc to %i for HDMI\n", desired_bpp
);
863 pipe_config
->pipe_bpp
= desired_bpp
;
866 if (adjusted_mode
->clock
> 225000) {
867 DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n");
874 static enum drm_connector_status
875 intel_hdmi_detect(struct drm_connector
*connector
, bool force
)
877 struct drm_device
*dev
= connector
->dev
;
878 struct intel_hdmi
*intel_hdmi
= intel_attached_hdmi(connector
);
879 struct intel_digital_port
*intel_dig_port
=
880 hdmi_to_dig_port(intel_hdmi
);
881 struct intel_encoder
*intel_encoder
= &intel_dig_port
->base
;
882 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
884 enum drm_connector_status status
= connector_status_disconnected
;
886 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
887 connector
->base
.id
, drm_get_connector_name(connector
));
889 intel_hdmi
->has_hdmi_sink
= false;
890 intel_hdmi
->has_audio
= false;
891 intel_hdmi
->rgb_quant_range_selectable
= false;
892 edid
= drm_get_edid(connector
,
893 intel_gmbus_get_adapter(dev_priv
,
894 intel_hdmi
->ddc_bus
));
897 if (edid
->input
& DRM_EDID_INPUT_DIGITAL
) {
898 status
= connector_status_connected
;
899 if (intel_hdmi
->force_audio
!= HDMI_AUDIO_OFF_DVI
)
900 intel_hdmi
->has_hdmi_sink
=
901 drm_detect_hdmi_monitor(edid
);
902 intel_hdmi
->has_audio
= drm_detect_monitor_audio(edid
);
903 intel_hdmi
->rgb_quant_range_selectable
=
904 drm_rgb_quant_range_selectable(edid
);
909 if (status
== connector_status_connected
) {
910 if (intel_hdmi
->force_audio
!= HDMI_AUDIO_AUTO
)
911 intel_hdmi
->has_audio
=
912 (intel_hdmi
->force_audio
== HDMI_AUDIO_ON
);
913 intel_encoder
->type
= INTEL_OUTPUT_HDMI
;
919 static int intel_hdmi_get_modes(struct drm_connector
*connector
)
921 struct intel_hdmi
*intel_hdmi
= intel_attached_hdmi(connector
);
922 struct drm_i915_private
*dev_priv
= connector
->dev
->dev_private
;
924 /* We should parse the EDID data and find out if it's an HDMI sink so
925 * we can send audio to it.
928 return intel_ddc_get_modes(connector
,
929 intel_gmbus_get_adapter(dev_priv
,
930 intel_hdmi
->ddc_bus
));
934 intel_hdmi_detect_audio(struct drm_connector
*connector
)
936 struct intel_hdmi
*intel_hdmi
= intel_attached_hdmi(connector
);
937 struct drm_i915_private
*dev_priv
= connector
->dev
->dev_private
;
939 bool has_audio
= false;
941 edid
= drm_get_edid(connector
,
942 intel_gmbus_get_adapter(dev_priv
,
943 intel_hdmi
->ddc_bus
));
945 if (edid
->input
& DRM_EDID_INPUT_DIGITAL
)
946 has_audio
= drm_detect_monitor_audio(edid
);
954 intel_hdmi_set_property(struct drm_connector
*connector
,
955 struct drm_property
*property
,
958 struct intel_hdmi
*intel_hdmi
= intel_attached_hdmi(connector
);
959 struct intel_digital_port
*intel_dig_port
=
960 hdmi_to_dig_port(intel_hdmi
);
961 struct drm_i915_private
*dev_priv
= connector
->dev
->dev_private
;
964 ret
= drm_object_property_set_value(&connector
->base
, property
, val
);
968 if (property
== dev_priv
->force_audio_property
) {
969 enum hdmi_force_audio i
= val
;
972 if (i
== intel_hdmi
->force_audio
)
975 intel_hdmi
->force_audio
= i
;
977 if (i
== HDMI_AUDIO_AUTO
)
978 has_audio
= intel_hdmi_detect_audio(connector
);
980 has_audio
= (i
== HDMI_AUDIO_ON
);
982 if (i
== HDMI_AUDIO_OFF_DVI
)
983 intel_hdmi
->has_hdmi_sink
= 0;
985 intel_hdmi
->has_audio
= has_audio
;
989 if (property
== dev_priv
->broadcast_rgb_property
) {
990 bool old_auto
= intel_hdmi
->color_range_auto
;
991 uint32_t old_range
= intel_hdmi
->color_range
;
994 case INTEL_BROADCAST_RGB_AUTO
:
995 intel_hdmi
->color_range_auto
= true;
997 case INTEL_BROADCAST_RGB_FULL
:
998 intel_hdmi
->color_range_auto
= false;
999 intel_hdmi
->color_range
= 0;
1001 case INTEL_BROADCAST_RGB_LIMITED
:
1002 intel_hdmi
->color_range_auto
= false;
1003 intel_hdmi
->color_range
= HDMI_COLOR_RANGE_16_235
;
1009 if (old_auto
== intel_hdmi
->color_range_auto
&&
1010 old_range
== intel_hdmi
->color_range
)
1019 if (intel_dig_port
->base
.base
.crtc
)
1020 intel_crtc_restore_mode(intel_dig_port
->base
.base
.crtc
);
1025 static void intel_hdmi_pre_enable(struct intel_encoder
*encoder
)
1027 struct intel_digital_port
*dport
= enc_to_dig_port(&encoder
->base
);
1028 struct drm_device
*dev
= encoder
->base
.dev
;
1029 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
1030 struct intel_crtc
*intel_crtc
=
1031 to_intel_crtc(encoder
->base
.crtc
);
1032 int port
= vlv_dport_to_channel(dport
);
1033 int pipe
= intel_crtc
->pipe
;
1036 if (!IS_VALLEYVIEW(dev
))
1039 /* Enable clock channels for this port */
1040 mutex_lock(&dev_priv
->dpio_lock
);
1041 val
= vlv_dpio_read(dev_priv
, DPIO_DATA_LANE_A(port
));
1048 vlv_dpio_write(dev_priv
, DPIO_DATA_CHANNEL(port
), val
);
1051 vlv_dpio_write(dev_priv
, DPIO_TX_OCALINIT(port
), 0);
1052 vlv_dpio_write(dev_priv
, DPIO_TX_SWING_CTL4(port
),
1054 vlv_dpio_write(dev_priv
, DPIO_TX_SWING_CTL2(port
),
1056 vlv_dpio_write(dev_priv
, DPIO_TX_SWING_CTL3(port
),
1058 vlv_dpio_write(dev_priv
, DPIO_TX3_SWING_CTL4(port
),
1060 vlv_dpio_write(dev_priv
, DPIO_PCS_STAGGER0(port
), 0x00030000);
1061 vlv_dpio_write(dev_priv
, DPIO_PCS_CTL_OVER1(port
),
1063 vlv_dpio_write(dev_priv
, DPIO_TX_OCALINIT(port
),
1064 DPIO_TX_OCALINIT_EN
);
1066 /* Program lane clock */
1067 vlv_dpio_write(dev_priv
, DPIO_PCS_CLOCKBUF0(port
),
1069 vlv_dpio_write(dev_priv
, DPIO_PCS_CLOCKBUF8(port
),
1071 mutex_unlock(&dev_priv
->dpio_lock
);
1073 intel_enable_hdmi(encoder
);
1075 vlv_wait_port_ready(dev_priv
, port
);
1078 static void intel_hdmi_pre_pll_enable(struct intel_encoder
*encoder
)
1080 struct intel_digital_port
*dport
= enc_to_dig_port(&encoder
->base
);
1081 struct drm_device
*dev
= encoder
->base
.dev
;
1082 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
1083 int port
= vlv_dport_to_channel(dport
);
1085 if (!IS_VALLEYVIEW(dev
))
1088 /* Program Tx lane resets to default */
1089 mutex_lock(&dev_priv
->dpio_lock
);
1090 vlv_dpio_write(dev_priv
, DPIO_PCS_TX(port
),
1091 DPIO_PCS_TX_LANE2_RESET
|
1092 DPIO_PCS_TX_LANE1_RESET
);
1093 vlv_dpio_write(dev_priv
, DPIO_PCS_CLK(port
),
1094 DPIO_PCS_CLK_CRI_RXEB_EIOS_EN
|
1095 DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN
|
1096 (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT
) |
1097 DPIO_PCS_CLK_SOFT_RESET
);
1099 /* Fix up inter-pair skew failure */
1100 vlv_dpio_write(dev_priv
, DPIO_PCS_STAGGER1(port
), 0x00750f00);
1101 vlv_dpio_write(dev_priv
, DPIO_TX_CTL(port
), 0x00001500);
1102 vlv_dpio_write(dev_priv
, DPIO_TX_LANE(port
), 0x40400000);
1104 vlv_dpio_write(dev_priv
, DPIO_PCS_CTL_OVER1(port
),
1106 vlv_dpio_write(dev_priv
, DPIO_TX_OCALINIT(port
),
1107 DPIO_TX_OCALINIT_EN
);
1108 mutex_unlock(&dev_priv
->dpio_lock
);
1111 static void intel_hdmi_post_disable(struct intel_encoder
*encoder
)
1113 struct intel_digital_port
*dport
= enc_to_dig_port(&encoder
->base
);
1114 struct drm_i915_private
*dev_priv
= encoder
->base
.dev
->dev_private
;
1115 int port
= vlv_dport_to_channel(dport
);
1117 /* Reset lanes to avoid HDMI flicker (VLV w/a) */
1118 mutex_lock(&dev_priv
->dpio_lock
);
1119 vlv_dpio_write(dev_priv
, DPIO_PCS_TX(port
), 0x00000000);
1120 vlv_dpio_write(dev_priv
, DPIO_PCS_CLK(port
), 0x00e00060);
1121 mutex_unlock(&dev_priv
->dpio_lock
);
1124 static void intel_hdmi_destroy(struct drm_connector
*connector
)
1126 drm_sysfs_connector_remove(connector
);
1127 drm_connector_cleanup(connector
);
1131 static const struct drm_connector_funcs intel_hdmi_connector_funcs
= {
1132 .dpms
= intel_connector_dpms
,
1133 .detect
= intel_hdmi_detect
,
1134 .fill_modes
= drm_helper_probe_single_connector_modes
,
1135 .set_property
= intel_hdmi_set_property
,
1136 .destroy
= intel_hdmi_destroy
,
1139 static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs
= {
1140 .get_modes
= intel_hdmi_get_modes
,
1141 .mode_valid
= intel_hdmi_mode_valid
,
1142 .best_encoder
= intel_best_encoder
,
1145 static const struct drm_encoder_funcs intel_hdmi_enc_funcs
= {
1146 .destroy
= intel_encoder_destroy
,
1150 intel_hdmi_add_properties(struct intel_hdmi
*intel_hdmi
, struct drm_connector
*connector
)
1152 intel_attach_force_audio_property(connector
);
1153 intel_attach_broadcast_rgb_property(connector
);
1154 intel_hdmi
->color_range_auto
= true;
1157 void intel_hdmi_init_connector(struct intel_digital_port
*intel_dig_port
,
1158 struct intel_connector
*intel_connector
)
1160 struct drm_connector
*connector
= &intel_connector
->base
;
1161 struct intel_hdmi
*intel_hdmi
= &intel_dig_port
->hdmi
;
1162 struct intel_encoder
*intel_encoder
= &intel_dig_port
->base
;
1163 struct drm_device
*dev
= intel_encoder
->base
.dev
;
1164 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
1165 enum port port
= intel_dig_port
->port
;
1167 drm_connector_init(dev
, connector
, &intel_hdmi_connector_funcs
,
1168 DRM_MODE_CONNECTOR_HDMIA
);
1169 drm_connector_helper_add(connector
, &intel_hdmi_connector_helper_funcs
);
1171 connector
->interlace_allowed
= 1;
1172 connector
->doublescan_allowed
= 0;
1176 intel_hdmi
->ddc_bus
= GMBUS_PORT_DPB
;
1177 intel_encoder
->hpd_pin
= HPD_PORT_B
;
1180 intel_hdmi
->ddc_bus
= GMBUS_PORT_DPC
;
1181 intel_encoder
->hpd_pin
= HPD_PORT_C
;
1184 intel_hdmi
->ddc_bus
= GMBUS_PORT_DPD
;
1185 intel_encoder
->hpd_pin
= HPD_PORT_D
;
1188 intel_encoder
->hpd_pin
= HPD_PORT_A
;
1189 /* Internal port only for eDP. */
1194 if (IS_VALLEYVIEW(dev
)) {
1195 intel_hdmi
->write_infoframe
= vlv_write_infoframe
;
1196 intel_hdmi
->set_infoframes
= vlv_set_infoframes
;
1197 } else if (!HAS_PCH_SPLIT(dev
)) {
1198 intel_hdmi
->write_infoframe
= g4x_write_infoframe
;
1199 intel_hdmi
->set_infoframes
= g4x_set_infoframes
;
1200 } else if (HAS_DDI(dev
)) {
1201 intel_hdmi
->write_infoframe
= hsw_write_infoframe
;
1202 intel_hdmi
->set_infoframes
= hsw_set_infoframes
;
1203 } else if (HAS_PCH_IBX(dev
)) {
1204 intel_hdmi
->write_infoframe
= ibx_write_infoframe
;
1205 intel_hdmi
->set_infoframes
= ibx_set_infoframes
;
1207 intel_hdmi
->write_infoframe
= cpt_write_infoframe
;
1208 intel_hdmi
->set_infoframes
= cpt_set_infoframes
;
1212 intel_connector
->get_hw_state
= intel_ddi_connector_get_hw_state
;
1214 intel_connector
->get_hw_state
= intel_connector_get_hw_state
;
1216 intel_hdmi_add_properties(intel_hdmi
, connector
);
1218 intel_connector_attach_encoder(intel_connector
, intel_encoder
);
1219 drm_sysfs_connector_add(connector
);
1221 /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
1222 * 0xd. Failure to do so will result in spurious interrupts being
1223 * generated on the port when a cable is not attached.
1225 if (IS_G4X(dev
) && !IS_GM45(dev
)) {
1226 u32 temp
= I915_READ(PEG_BAND_GAP_DATA
);
1227 I915_WRITE(PEG_BAND_GAP_DATA
, (temp
& ~0xf) | 0xd);
1231 void intel_hdmi_init(struct drm_device
*dev
, int hdmi_reg
, enum port port
)
1233 struct intel_digital_port
*intel_dig_port
;
1234 struct intel_encoder
*intel_encoder
;
1235 struct drm_encoder
*encoder
;
1236 struct intel_connector
*intel_connector
;
1238 intel_dig_port
= kzalloc(sizeof(struct intel_digital_port
), GFP_KERNEL
);
1239 if (!intel_dig_port
)
1242 intel_connector
= kzalloc(sizeof(struct intel_connector
), GFP_KERNEL
);
1243 if (!intel_connector
) {
1244 kfree(intel_dig_port
);
1248 intel_encoder
= &intel_dig_port
->base
;
1249 encoder
= &intel_encoder
->base
;
1251 drm_encoder_init(dev
, &intel_encoder
->base
, &intel_hdmi_enc_funcs
,
1252 DRM_MODE_ENCODER_TMDS
);
1254 intel_encoder
->compute_config
= intel_hdmi_compute_config
;
1255 intel_encoder
->mode_set
= intel_hdmi_mode_set
;
1256 intel_encoder
->disable
= intel_disable_hdmi
;
1257 intel_encoder
->get_hw_state
= intel_hdmi_get_hw_state
;
1258 intel_encoder
->get_config
= intel_hdmi_get_config
;
1259 if (IS_VALLEYVIEW(dev
)) {
1260 intel_encoder
->pre_pll_enable
= intel_hdmi_pre_pll_enable
;
1261 intel_encoder
->pre_enable
= intel_hdmi_pre_enable
;
1262 intel_encoder
->enable
= vlv_enable_hdmi
;
1263 intel_encoder
->post_disable
= intel_hdmi_post_disable
;
1265 intel_encoder
->enable
= intel_enable_hdmi
;
1268 intel_encoder
->type
= INTEL_OUTPUT_HDMI
;
1269 intel_encoder
->crtc_mask
= (1 << 0) | (1 << 1) | (1 << 2);
1270 intel_encoder
->cloneable
= false;
1272 intel_dig_port
->port
= port
;
1273 intel_dig_port
->hdmi
.hdmi_reg
= hdmi_reg
;
1274 intel_dig_port
->dp
.output_reg
= 0;
1276 intel_hdmi_init_connector(intel_dig_port
, intel_connector
);