drm/i915/csr: move CSR version macros to intel_csr.h
[linux-2.6-block.git] / drivers / gpu / drm / i915 / intel_hdmi.c
CommitLineData
7d57382e
EA
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
7d57382e 29#include <linux/delay.h>
178f736a 30#include <linux/hdmi.h>
331c201a
JN
31#include <linux/i2c.h>
32#include <linux/slab.h>
33
c6f95f27 34#include <drm/drm_atomic_helper.h>
760285e7
DH
35#include <drm/drm_crtc.h>
36#include <drm/drm_edid.h>
2320175f 37#include <drm/drm_hdcp.h>
15953637 38#include <drm/drm_scdc_helper.h>
760285e7 39#include <drm/i915_drm.h>
46d196ec 40#include <drm/intel_lpe_audio.h>
331c201a 41
7d57382e 42#include "i915_drv.h"
12392a74 43#include "intel_atomic.h"
331c201a 44#include "intel_audio.h"
ec7f29ff 45#include "intel_connector.h"
fdc24cf3 46#include "intel_ddi.h"
27fec1f9 47#include "intel_dp.h"
331c201a 48#include "intel_drv.h"
8834e365 49#include "intel_fifo_underrun.h"
408bd917 50#include "intel_hdcp.h"
0550691d 51#include "intel_hdmi.h"
dbeb38d9 52#include "intel_hotplug.h"
f3e18947 53#include "intel_lspcon.h"
596fee14 54#include "intel_sdvo.h"
44c1220a 55#include "intel_panel.h"
56c5098f 56#include "intel_sideband.h"
7d57382e 57
30add22d
PZ
58static struct drm_device *intel_hdmi_to_dev(struct intel_hdmi *intel_hdmi)
59{
da63a9f2 60 return hdmi_to_dig_port(intel_hdmi)->base.base.dev;
30add22d
PZ
61}
62
afba0188
DV
63static void
64assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
65{
30add22d 66 struct drm_device *dev = intel_hdmi_to_dev(intel_hdmi);
fac5e23e 67 struct drm_i915_private *dev_priv = to_i915(dev);
faa087c4 68 u32 enabled_bits;
afba0188 69
4f8036a2 70 enabled_bits = HAS_DDI(dev_priv) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
afba0188 71
b242b7f7 72 WARN(I915_READ(intel_hdmi->hdmi_reg) & enabled_bits,
afba0188
DV
73 "HDMI port enabled, expecting disabled\n");
74}
75
8fc0aa6e
ID
76static void
77assert_hdmi_transcoder_func_disabled(struct drm_i915_private *dev_priv,
78 enum transcoder cpu_transcoder)
79{
80 WARN(I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)) &
81 TRANS_DDI_FUNC_ENABLE,
82 "HDMI transcoder function enabled, expecting disabled\n");
83}
84
f5bbfca3 85struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
ea5b213a 86{
da63a9f2
PZ
87 struct intel_digital_port *intel_dig_port =
88 container_of(encoder, struct intel_digital_port, base.base);
89 return &intel_dig_port->hdmi;
ea5b213a
CW
90}
91
df0e9248
CW
92static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
93{
da63a9f2 94 return enc_to_intel_hdmi(&intel_attached_encoder(connector)->base);
df0e9248
CW
95}
96
1d776538 97static u32 g4x_infoframe_index(unsigned int type)
3c17fe4b 98{
178f736a 99 switch (type) {
5cb3c1a1
VS
100 case HDMI_PACKET_TYPE_GAMUT_METADATA:
101 return VIDEO_DIP_SELECT_GAMUT;
178f736a 102 case HDMI_INFOFRAME_TYPE_AVI:
ed517fbb 103 return VIDEO_DIP_SELECT_AVI;
178f736a 104 case HDMI_INFOFRAME_TYPE_SPD:
ed517fbb 105 return VIDEO_DIP_SELECT_SPD;
c8bb75af
LD
106 case HDMI_INFOFRAME_TYPE_VENDOR:
107 return VIDEO_DIP_SELECT_VENDOR;
45187ace 108 default:
ffc85dab 109 MISSING_CASE(type);
ed517fbb 110 return 0;
45187ace 111 }
45187ace
JB
112}
113
1d776538 114static u32 g4x_infoframe_enable(unsigned int type)
45187ace 115{
178f736a 116 switch (type) {
5cb3c1a1
VS
117 case HDMI_PACKET_TYPE_GENERAL_CONTROL:
118 return VIDEO_DIP_ENABLE_GCP;
119 case HDMI_PACKET_TYPE_GAMUT_METADATA:
120 return VIDEO_DIP_ENABLE_GAMUT;
509efa2b
VS
121 case DP_SDP_VSC:
122 return 0;
178f736a 123 case HDMI_INFOFRAME_TYPE_AVI:
ed517fbb 124 return VIDEO_DIP_ENABLE_AVI;
178f736a 125 case HDMI_INFOFRAME_TYPE_SPD:
ed517fbb 126 return VIDEO_DIP_ENABLE_SPD;
c8bb75af
LD
127 case HDMI_INFOFRAME_TYPE_VENDOR:
128 return VIDEO_DIP_ENABLE_VENDOR;
fa193ff7 129 default:
ffc85dab 130 MISSING_CASE(type);
ed517fbb 131 return 0;
fa193ff7 132 }
fa193ff7
PZ
133}
134
1d776538 135static u32 hsw_infoframe_enable(unsigned int type)
2da8af54 136{
178f736a 137 switch (type) {
5cb3c1a1
VS
138 case HDMI_PACKET_TYPE_GENERAL_CONTROL:
139 return VIDEO_DIP_ENABLE_GCP_HSW;
140 case HDMI_PACKET_TYPE_GAMUT_METADATA:
141 return VIDEO_DIP_ENABLE_GMP_HSW;
1d776538
VS
142 case DP_SDP_VSC:
143 return VIDEO_DIP_ENABLE_VSC_HSW;
4c614831
MN
144 case DP_SDP_PPS:
145 return VDIP_ENABLE_PPS;
178f736a 146 case HDMI_INFOFRAME_TYPE_AVI:
2da8af54 147 return VIDEO_DIP_ENABLE_AVI_HSW;
178f736a 148 case HDMI_INFOFRAME_TYPE_SPD:
2da8af54 149 return VIDEO_DIP_ENABLE_SPD_HSW;
c8bb75af
LD
150 case HDMI_INFOFRAME_TYPE_VENDOR:
151 return VIDEO_DIP_ENABLE_VS_HSW;
2da8af54 152 default:
ffc85dab 153 MISSING_CASE(type);
2da8af54
PZ
154 return 0;
155 }
156}
157
f0f59a00
VS
158static i915_reg_t
159hsw_dip_data_reg(struct drm_i915_private *dev_priv,
160 enum transcoder cpu_transcoder,
1d776538 161 unsigned int type,
f0f59a00 162 int i)
2da8af54 163{
178f736a 164 switch (type) {
5cb3c1a1
VS
165 case HDMI_PACKET_TYPE_GAMUT_METADATA:
166 return HSW_TVIDEO_DIP_GMP_DATA(cpu_transcoder, i);
1d776538
VS
167 case DP_SDP_VSC:
168 return HSW_TVIDEO_DIP_VSC_DATA(cpu_transcoder, i);
4c614831
MN
169 case DP_SDP_PPS:
170 return ICL_VIDEO_DIP_PPS_DATA(cpu_transcoder, i);
178f736a 171 case HDMI_INFOFRAME_TYPE_AVI:
436c6d4a 172 return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder, i);
178f736a 173 case HDMI_INFOFRAME_TYPE_SPD:
436c6d4a 174 return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder, i);
c8bb75af 175 case HDMI_INFOFRAME_TYPE_VENDOR:
436c6d4a 176 return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder, i);
2da8af54 177 default:
ffc85dab 178 MISSING_CASE(type);
f0f59a00 179 return INVALID_MMIO_REG;
2da8af54
PZ
180 }
181}
182
4c614831
MN
183static int hsw_dip_data_size(unsigned int type)
184{
185 switch (type) {
186 case DP_SDP_VSC:
187 return VIDEO_DIP_VSC_DATA_SIZE;
188 case DP_SDP_PPS:
189 return VIDEO_DIP_PPS_DATA_SIZE;
190 default:
191 return VIDEO_DIP_DATA_SIZE;
192 }
193}
194
790ea70c 195static void g4x_write_infoframe(struct intel_encoder *encoder,
ac240288 196 const struct intel_crtc_state *crtc_state,
1d776538 197 unsigned int type,
fff63867 198 const void *frame, ssize_t len)
45187ace 199{
faa087c4 200 const u32 *data = frame;
790ea70c 201 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
22509ec8 202 u32 val = I915_READ(VIDEO_DIP_CTL);
178f736a 203 int i;
3c17fe4b 204
822974ae
PZ
205 WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
206
1d4f85ac 207 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
178f736a 208 val |= g4x_infoframe_index(type);
22509ec8 209
178f736a 210 val &= ~g4x_infoframe_enable(type);
45187ace 211
22509ec8 212 I915_WRITE(VIDEO_DIP_CTL, val);
3c17fe4b 213
9d9740f0 214 mmiowb();
45187ace 215 for (i = 0; i < len; i += 4) {
3c17fe4b
DH
216 I915_WRITE(VIDEO_DIP_DATA, *data);
217 data++;
218 }
adf00b26
PZ
219 /* Write every possible data byte to force correct ECC calculation. */
220 for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
221 I915_WRITE(VIDEO_DIP_DATA, 0);
9d9740f0 222 mmiowb();
3c17fe4b 223
178f736a 224 val |= g4x_infoframe_enable(type);
60c5ea2d 225 val &= ~VIDEO_DIP_FREQ_MASK;
4b24c933 226 val |= VIDEO_DIP_FREQ_VSYNC;
45187ace 227
22509ec8 228 I915_WRITE(VIDEO_DIP_CTL, val);
9d9740f0 229 POSTING_READ(VIDEO_DIP_CTL);
3c17fe4b
DH
230}
231
f2a10d61
VS
232static void g4x_read_infoframe(struct intel_encoder *encoder,
233 const struct intel_crtc_state *crtc_state,
234 unsigned int type,
235 void *frame, ssize_t len)
236{
237 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
238 u32 val, *data = frame;
239 int i;
240
241 val = I915_READ(VIDEO_DIP_CTL);
242
243 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
244 val |= g4x_infoframe_index(type);
245
246 I915_WRITE(VIDEO_DIP_CTL, val);
247
248 for (i = 0; i < len; i += 4)
249 *data++ = I915_READ(VIDEO_DIP_DATA);
250}
251
509efa2b 252static u32 g4x_infoframes_enabled(struct intel_encoder *encoder,
cda0aaaf 253 const struct intel_crtc_state *pipe_config)
e43823ec 254{
790ea70c 255 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
e43823ec
JB
256 u32 val = I915_READ(VIDEO_DIP_CTL);
257
ec1dc603 258 if ((val & VIDEO_DIP_ENABLE) == 0)
509efa2b 259 return 0;
89a35ecd 260
790ea70c 261 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
509efa2b 262 return 0;
ec1dc603
VS
263
264 return val & (VIDEO_DIP_ENABLE_AVI |
265 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
e43823ec
JB
266}
267
790ea70c 268static void ibx_write_infoframe(struct intel_encoder *encoder,
ac240288 269 const struct intel_crtc_state *crtc_state,
1d776538 270 unsigned int type,
fff63867 271 const void *frame, ssize_t len)
fdf1250a 272{
faa087c4 273 const u32 *data = frame;
790ea70c 274 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
ac240288 275 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
f0f59a00 276 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
fdf1250a 277 u32 val = I915_READ(reg);
f0f59a00 278 int i;
fdf1250a 279
822974ae
PZ
280 WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
281
fdf1250a 282 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
178f736a 283 val |= g4x_infoframe_index(type);
fdf1250a 284
178f736a 285 val &= ~g4x_infoframe_enable(type);
fdf1250a
PZ
286
287 I915_WRITE(reg, val);
288
9d9740f0 289 mmiowb();
fdf1250a
PZ
290 for (i = 0; i < len; i += 4) {
291 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
292 data++;
293 }
adf00b26
PZ
294 /* Write every possible data byte to force correct ECC calculation. */
295 for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
296 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
9d9740f0 297 mmiowb();
fdf1250a 298
178f736a 299 val |= g4x_infoframe_enable(type);
fdf1250a 300 val &= ~VIDEO_DIP_FREQ_MASK;
4b24c933 301 val |= VIDEO_DIP_FREQ_VSYNC;
fdf1250a
PZ
302
303 I915_WRITE(reg, val);
9d9740f0 304 POSTING_READ(reg);
fdf1250a
PZ
305}
306
f2a10d61
VS
307static void ibx_read_infoframe(struct intel_encoder *encoder,
308 const struct intel_crtc_state *crtc_state,
309 unsigned int type,
310 void *frame, ssize_t len)
311{
312 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
313 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
314 u32 val, *data = frame;
315 int i;
316
317 val = I915_READ(TVIDEO_DIP_CTL(crtc->pipe));
318
319 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
320 val |= g4x_infoframe_index(type);
321
322 I915_WRITE(TVIDEO_DIP_CTL(crtc->pipe), val);
323
324 for (i = 0; i < len; i += 4)
325 *data++ = I915_READ(TVIDEO_DIP_DATA(crtc->pipe));
326}
327
509efa2b 328static u32 ibx_infoframes_enabled(struct intel_encoder *encoder,
cda0aaaf 329 const struct intel_crtc_state *pipe_config)
e43823ec 330{
790ea70c 331 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
cda0aaaf
VS
332 enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe;
333 i915_reg_t reg = TVIDEO_DIP_CTL(pipe);
e43823ec
JB
334 u32 val = I915_READ(reg);
335
ec1dc603 336 if ((val & VIDEO_DIP_ENABLE) == 0)
509efa2b 337 return 0;
ec1dc603 338
790ea70c 339 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
509efa2b 340 return 0;
052f62f7 341
ec1dc603
VS
342 return val & (VIDEO_DIP_ENABLE_AVI |
343 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
344 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
e43823ec
JB
345}
346
790ea70c 347static void cpt_write_infoframe(struct intel_encoder *encoder,
ac240288 348 const struct intel_crtc_state *crtc_state,
1d776538 349 unsigned int type,
fff63867 350 const void *frame, ssize_t len)
b055c8f3 351{
faa087c4 352 const u32 *data = frame;
790ea70c 353 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
ac240288 354 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
f0f59a00 355 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
22509ec8 356 u32 val = I915_READ(reg);
f0f59a00 357 int i;
b055c8f3 358
822974ae
PZ
359 WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
360
64a8fc01 361 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
178f736a 362 val |= g4x_infoframe_index(type);
45187ace 363
ecb97851
PZ
364 /* The DIP control register spec says that we need to update the AVI
365 * infoframe without clearing its enable bit */
178f736a
DL
366 if (type != HDMI_INFOFRAME_TYPE_AVI)
367 val &= ~g4x_infoframe_enable(type);
ecb97851 368
22509ec8 369 I915_WRITE(reg, val);
45187ace 370
9d9740f0 371 mmiowb();
45187ace 372 for (i = 0; i < len; i += 4) {
b055c8f3
JB
373 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
374 data++;
375 }
adf00b26
PZ
376 /* Write every possible data byte to force correct ECC calculation. */
377 for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
378 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
9d9740f0 379 mmiowb();
b055c8f3 380
178f736a 381 val |= g4x_infoframe_enable(type);
60c5ea2d 382 val &= ~VIDEO_DIP_FREQ_MASK;
4b24c933 383 val |= VIDEO_DIP_FREQ_VSYNC;
45187ace 384
22509ec8 385 I915_WRITE(reg, val);
9d9740f0 386 POSTING_READ(reg);
45187ace 387}
90b107c8 388
f2a10d61
VS
389static void cpt_read_infoframe(struct intel_encoder *encoder,
390 const struct intel_crtc_state *crtc_state,
391 unsigned int type,
392 void *frame, ssize_t len)
393{
394 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
395 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
396 u32 val, *data = frame;
397 int i;
398
399 val = I915_READ(TVIDEO_DIP_CTL(crtc->pipe));
400
401 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
402 val |= g4x_infoframe_index(type);
403
404 I915_WRITE(TVIDEO_DIP_CTL(crtc->pipe), val);
405
406 for (i = 0; i < len; i += 4)
407 *data++ = I915_READ(TVIDEO_DIP_DATA(crtc->pipe));
408}
409
509efa2b 410static u32 cpt_infoframes_enabled(struct intel_encoder *encoder,
cda0aaaf 411 const struct intel_crtc_state *pipe_config)
e43823ec 412{
790ea70c 413 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
cda0aaaf
VS
414 enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe;
415 u32 val = I915_READ(TVIDEO_DIP_CTL(pipe));
e43823ec 416
ec1dc603 417 if ((val & VIDEO_DIP_ENABLE) == 0)
509efa2b 418 return 0;
ec1dc603
VS
419
420 return val & (VIDEO_DIP_ENABLE_AVI |
421 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
422 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
e43823ec
JB
423}
424
790ea70c 425static void vlv_write_infoframe(struct intel_encoder *encoder,
ac240288 426 const struct intel_crtc_state *crtc_state,
1d776538 427 unsigned int type,
fff63867 428 const void *frame, ssize_t len)
90b107c8 429{
faa087c4 430 const u32 *data = frame;
790ea70c 431 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
ac240288 432 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
f0f59a00 433 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
22509ec8 434 u32 val = I915_READ(reg);
f0f59a00 435 int i;
90b107c8 436
822974ae
PZ
437 WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
438
90b107c8 439 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
178f736a 440 val |= g4x_infoframe_index(type);
22509ec8 441
178f736a 442 val &= ~g4x_infoframe_enable(type);
90b107c8 443
22509ec8 444 I915_WRITE(reg, val);
90b107c8 445
9d9740f0 446 mmiowb();
90b107c8
SK
447 for (i = 0; i < len; i += 4) {
448 I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
449 data++;
450 }
adf00b26
PZ
451 /* Write every possible data byte to force correct ECC calculation. */
452 for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
453 I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
9d9740f0 454 mmiowb();
90b107c8 455
178f736a 456 val |= g4x_infoframe_enable(type);
60c5ea2d 457 val &= ~VIDEO_DIP_FREQ_MASK;
4b24c933 458 val |= VIDEO_DIP_FREQ_VSYNC;
90b107c8 459
22509ec8 460 I915_WRITE(reg, val);
9d9740f0 461 POSTING_READ(reg);
90b107c8
SK
462}
463
f2a10d61
VS
464static void vlv_read_infoframe(struct intel_encoder *encoder,
465 const struct intel_crtc_state *crtc_state,
466 unsigned int type,
467 void *frame, ssize_t len)
468{
469 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
470 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
471 u32 val, *data = frame;
472 int i;
473
474 val = I915_READ(VLV_TVIDEO_DIP_CTL(crtc->pipe));
475
476 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
477 val |= g4x_infoframe_index(type);
478
479 I915_WRITE(VLV_TVIDEO_DIP_CTL(crtc->pipe), val);
480
481 for (i = 0; i < len; i += 4)
482 *data++ = I915_READ(VLV_TVIDEO_DIP_DATA(crtc->pipe));
483}
484
509efa2b 485static u32 vlv_infoframes_enabled(struct intel_encoder *encoder,
cda0aaaf 486 const struct intel_crtc_state *pipe_config)
e43823ec 487{
790ea70c 488 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
cda0aaaf
VS
489 enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe;
490 u32 val = I915_READ(VLV_TVIDEO_DIP_CTL(pipe));
e43823ec 491
ec1dc603 492 if ((val & VIDEO_DIP_ENABLE) == 0)
509efa2b 493 return 0;
ec1dc603 494
790ea70c 495 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
509efa2b 496 return 0;
535afa2e 497
ec1dc603
VS
498 return val & (VIDEO_DIP_ENABLE_AVI |
499 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
500 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
e43823ec
JB
501}
502
790ea70c 503static void hsw_write_infoframe(struct intel_encoder *encoder,
ac240288 504 const struct intel_crtc_state *crtc_state,
1d776538 505 unsigned int type,
fff63867 506 const void *frame, ssize_t len)
8c5f5f7c 507{
faa087c4 508 const u32 *data = frame;
790ea70c 509 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
ac240288 510 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
f0f59a00 511 i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder);
4c614831 512 int data_size;
178f736a 513 int i;
2da8af54 514 u32 val = I915_READ(ctl_reg);
8c5f5f7c 515
4c614831
MN
516 data_size = hsw_dip_data_size(type);
517
178f736a 518 val &= ~hsw_infoframe_enable(type);
2da8af54
PZ
519 I915_WRITE(ctl_reg, val);
520
9d9740f0 521 mmiowb();
2da8af54 522 for (i = 0; i < len; i += 4) {
436c6d4a
VS
523 I915_WRITE(hsw_dip_data_reg(dev_priv, cpu_transcoder,
524 type, i >> 2), *data);
2da8af54
PZ
525 data++;
526 }
adf00b26 527 /* Write every possible data byte to force correct ECC calculation. */
1d776538 528 for (; i < data_size; i += 4)
436c6d4a
VS
529 I915_WRITE(hsw_dip_data_reg(dev_priv, cpu_transcoder,
530 type, i >> 2), 0);
9d9740f0 531 mmiowb();
8c5f5f7c 532
178f736a 533 val |= hsw_infoframe_enable(type);
2da8af54 534 I915_WRITE(ctl_reg, val);
9d9740f0 535 POSTING_READ(ctl_reg);
8c5f5f7c
ED
536}
537
f2a10d61
VS
538static void hsw_read_infoframe(struct intel_encoder *encoder,
539 const struct intel_crtc_state *crtc_state,
540 unsigned int type,
541 void *frame, ssize_t len)
542{
543 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
544 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
545 u32 val, *data = frame;
546 int i;
547
548 val = I915_READ(HSW_TVIDEO_DIP_CTL(cpu_transcoder));
549
550 for (i = 0; i < len; i += 4)
551 *data++ = I915_READ(hsw_dip_data_reg(dev_priv, cpu_transcoder,
552 type, i >> 2));
553}
554
509efa2b 555static u32 hsw_infoframes_enabled(struct intel_encoder *encoder,
cda0aaaf 556 const struct intel_crtc_state *pipe_config)
e43823ec 557{
790ea70c 558 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
cda0aaaf 559 u32 val = I915_READ(HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder));
e43823ec 560
ec1dc603
VS
561 return val & (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
562 VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
563 VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);
e43823ec
JB
564}
565
509efa2b
VS
566static const u8 infoframe_type_to_idx[] = {
567 HDMI_PACKET_TYPE_GENERAL_CONTROL,
568 HDMI_PACKET_TYPE_GAMUT_METADATA,
569 DP_SDP_VSC,
570 HDMI_INFOFRAME_TYPE_AVI,
571 HDMI_INFOFRAME_TYPE_SPD,
572 HDMI_INFOFRAME_TYPE_VENDOR,
573};
574
fbf08556
VS
575u32 intel_hdmi_infoframe_enable(unsigned int type)
576{
577 int i;
578
579 for (i = 0; i < ARRAY_SIZE(infoframe_type_to_idx); i++) {
580 if (infoframe_type_to_idx[i] == type)
581 return BIT(i);
582 }
583
584 return 0;
585}
586
509efa2b
VS
587u32 intel_hdmi_infoframes_enabled(struct intel_encoder *encoder,
588 const struct intel_crtc_state *crtc_state)
589{
590 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
591 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
592 u32 val, ret = 0;
593 int i;
594
595 val = dig_port->infoframes_enabled(encoder, crtc_state);
596
597 /* map from hardware bits to dip idx */
598 for (i = 0; i < ARRAY_SIZE(infoframe_type_to_idx); i++) {
599 unsigned int type = infoframe_type_to_idx[i];
600
601 if (HAS_DDI(dev_priv)) {
602 if (val & hsw_infoframe_enable(type))
603 ret |= BIT(i);
604 } else {
605 if (val & g4x_infoframe_enable(type))
606 ret |= BIT(i);
607 }
608 }
609
610 return ret;
611}
612
5adaea79
DL
613/*
614 * The data we write to the DIP data buffer registers is 1 byte bigger than the
615 * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting
616 * at 0). It's also a byte used by DisplayPort so the same DIP registers can be
617 * used for both technologies.
618 *
619 * DW0: Reserved/ECC/DP | HB2 | HB1 | HB0
620 * DW1: DB3 | DB2 | DB1 | DB0
621 * DW2: DB7 | DB6 | DB5 | DB4
622 * DW3: ...
623 *
624 * (HB is Header Byte, DB is Data Byte)
625 *
626 * The hdmi pack() functions don't know about that hardware specific hole so we
627 * trick them by giving an offset into the buffer and moving back the header
628 * bytes by one.
629 */
790ea70c 630static void intel_write_infoframe(struct intel_encoder *encoder,
ac240288 631 const struct intel_crtc_state *crtc_state,
fbf08556
VS
632 enum hdmi_infoframe_type type,
633 const union hdmi_infoframe *frame)
45187ace 634{
790ea70c 635 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
faa087c4 636 u8 buffer[VIDEO_DIP_DATA_SIZE];
5adaea79 637 ssize_t len;
45187ace 638
fbf08556
VS
639 if ((crtc_state->infoframes.enable &
640 intel_hdmi_infoframe_enable(type)) == 0)
641 return;
642
643 if (WARN_ON(frame->any.type != type))
644 return;
645
5adaea79 646 /* see comment above for the reason for this offset */
fbf08556
VS
647 len = hdmi_infoframe_pack_only(frame, buffer + 1, sizeof(buffer) - 1);
648 if (WARN_ON(len < 0))
5adaea79
DL
649 return;
650
651 /* Insert the 'hole' (see big comment above) at position 3 */
121f0ff5 652 memmove(&buffer[0], &buffer[1], 3);
5adaea79
DL
653 buffer[3] = 0;
654 len++;
45187ace 655
fbf08556 656 intel_dig_port->write_infoframe(encoder, crtc_state, type, buffer, len);
45187ace
JB
657}
658
f2a10d61
VS
659void intel_read_infoframe(struct intel_encoder *encoder,
660 const struct intel_crtc_state *crtc_state,
661 enum hdmi_infoframe_type type,
662 union hdmi_infoframe *frame)
663{
664 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
665 u8 buffer[VIDEO_DIP_DATA_SIZE];
666 int ret;
667
668 if ((crtc_state->infoframes.enable &
669 intel_hdmi_infoframe_enable(type)) == 0)
670 return;
671
672 intel_dig_port->read_infoframe(encoder, crtc_state,
673 type, buffer, sizeof(buffer));
674
675 /* Fill the 'hole' (see big comment above) at position 3 */
676 memmove(&buffer[1], &buffer[0], 3);
677
678 /* see comment above for the reason for this offset */
679 ret = hdmi_infoframe_unpack(frame, buffer + 1, sizeof(buffer) - 1);
680 if (ret) {
681 DRM_DEBUG_KMS("Failed to unpack infoframe type 0x%02x\n", type);
682 return;
683 }
684
685 if (frame->any.type != type)
686 DRM_DEBUG_KMS("Found the wrong infoframe type 0x%x (expected 0x%02x)\n",
687 frame->any.type, type);
688}
689
fbf08556
VS
690static bool
691intel_hdmi_compute_avi_infoframe(struct intel_encoder *encoder,
692 struct intel_crtc_state *crtc_state,
693 struct drm_connector_state *conn_state)
45187ace 694{
fbf08556 695 struct hdmi_avi_infoframe *frame = &crtc_state->infoframes.avi.avi;
779c4c28
VS
696 const struct drm_display_mode *adjusted_mode =
697 &crtc_state->base.adjusted_mode;
fbf08556 698 struct drm_connector *connector = conn_state->connector;
5adaea79 699 int ret;
45187ace 700
fbf08556
VS
701 if (!crtc_state->has_infoframe)
702 return true;
703
704 crtc_state->infoframes.enable |=
705 intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_AVI);
706
707 ret = drm_hdmi_avi_infoframe_from_display_mode(frame, connector,
13d0add3 708 adjusted_mode);
fbf08556
VS
709 if (ret)
710 return false;
c846b619 711
33b7f3ee 712 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
fbf08556 713 frame->colorspace = HDMI_COLORSPACE_YUV420;
8c79f844 714 else if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
fbf08556 715 frame->colorspace = HDMI_COLORSPACE_YUV444;
2d8bd2bf 716 else
fbf08556 717 frame->colorspace = HDMI_COLORSPACE_RGB;
2d8bd2bf 718
0e2f54f8 719 drm_hdmi_avi_infoframe_colorspace(frame, conn_state);
2f146b78 720
fbf08556 721 drm_hdmi_avi_infoframe_quant_range(frame, connector,
13d0add3 722 adjusted_mode,
a2ce26f8
VS
723 crtc_state->limited_color_range ?
724 HDMI_QUANTIZATION_RANGE_LIMITED :
1581b2df 725 HDMI_QUANTIZATION_RANGE_FULL);
abedc077 726
fbf08556 727 drm_hdmi_avi_infoframe_content_type(frame, conn_state);
6553b123 728
2d8bd2bf 729 /* TODO: handle pixel repetition for YCBCR420 outputs */
fbf08556
VS
730
731 ret = hdmi_avi_infoframe_check(frame);
732 if (WARN_ON(ret))
733 return false;
734
735 return true;
b055c8f3
JB
736}
737
fbf08556
VS
738static bool
739intel_hdmi_compute_spd_infoframe(struct intel_encoder *encoder,
740 struct intel_crtc_state *crtc_state,
741 struct drm_connector_state *conn_state)
c0864cb3 742{
fbf08556 743 struct hdmi_spd_infoframe *frame = &crtc_state->infoframes.spd.spd;
5adaea79
DL
744 int ret;
745
fbf08556
VS
746 if (!crtc_state->has_infoframe)
747 return true;
c0864cb3 748
fbf08556
VS
749 crtc_state->infoframes.enable |=
750 intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_SPD);
c0864cb3 751
fbf08556
VS
752 ret = hdmi_spd_infoframe_init(frame, "Intel", "Integrated gfx");
753 if (WARN_ON(ret))
754 return false;
755
756 frame->sdi = HDMI_SPD_SDI_PC;
757
758 ret = hdmi_spd_infoframe_check(frame);
759 if (WARN_ON(ret))
760 return false;
761
762 return true;
c0864cb3
JB
763}
764
fbf08556
VS
765static bool
766intel_hdmi_compute_hdmi_infoframe(struct intel_encoder *encoder,
767 struct intel_crtc_state *crtc_state,
768 struct drm_connector_state *conn_state)
769{
770 struct hdmi_vendor_infoframe *frame =
771 &crtc_state->infoframes.hdmi.vendor.hdmi;
772 const struct drm_display_info *info =
773 &conn_state->connector->display_info;
c8bb75af
LD
774 int ret;
775
fbf08556
VS
776 if (!crtc_state->has_infoframe || !info->has_hdmi_infoframe)
777 return true;
778
779 crtc_state->infoframes.enable |=
780 intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_VENDOR);
781
782 ret = drm_hdmi_vendor_infoframe_from_display_mode(frame,
f1781e9b 783 conn_state->connector,
ac240288 784 &crtc_state->base.adjusted_mode);
fbf08556
VS
785 if (WARN_ON(ret))
786 return false;
c8bb75af 787
fbf08556
VS
788 ret = hdmi_vendor_infoframe_check(frame);
789 if (WARN_ON(ret))
790 return false;
791
792 return true;
c8bb75af
LD
793}
794
790ea70c 795static void g4x_set_infoframes(struct intel_encoder *encoder,
6897b4b5 796 bool enable,
ac240288
ML
797 const struct intel_crtc_state *crtc_state,
798 const struct drm_connector_state *conn_state)
687f4d06 799{
790ea70c
VS
800 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
801 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
69fde0a6 802 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
f0f59a00 803 i915_reg_t reg = VIDEO_DIP_CTL;
0c14c7f9 804 u32 val = I915_READ(reg);
790ea70c 805 u32 port = VIDEO_DIP_PORT(encoder->port);
0c14c7f9 806
afba0188
DV
807 assert_hdmi_port_disabled(intel_hdmi);
808
0c14c7f9
PZ
809 /* If the registers were not initialized yet, they might be zeroes,
810 * which means we're selecting the AVI DIP and we're setting its
811 * frequency to once. This seems to really confuse the HW and make
812 * things stop working (the register spec says the AVI always needs to
813 * be sent every VSync). So here we avoid writing to the register more
814 * than we need and also explicitly select the AVI DIP and explicitly
815 * set its frequency to every VSync. Avoiding to write it twice seems to
816 * be enough to solve the problem, but being defensive shouldn't hurt us
817 * either. */
818 val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
819
6897b4b5 820 if (!enable) {
0c14c7f9
PZ
821 if (!(val & VIDEO_DIP_ENABLE))
822 return;
0be6f0c8
VS
823 if (port != (val & VIDEO_DIP_PORT_MASK)) {
824 DRM_DEBUG_KMS("video DIP still enabled on port %c\n",
825 (val & VIDEO_DIP_PORT_MASK) >> 29);
826 return;
827 }
828 val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
829 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
0c14c7f9 830 I915_WRITE(reg, val);
9d9740f0 831 POSTING_READ(reg);
0c14c7f9
PZ
832 return;
833 }
834
72b78c9d
PZ
835 if (port != (val & VIDEO_DIP_PORT_MASK)) {
836 if (val & VIDEO_DIP_ENABLE) {
0be6f0c8
VS
837 DRM_DEBUG_KMS("video DIP already enabled on port %c\n",
838 (val & VIDEO_DIP_PORT_MASK) >> 29);
839 return;
72b78c9d
PZ
840 }
841 val &= ~VIDEO_DIP_PORT_MASK;
842 val |= port;
843 }
844
822974ae 845 val |= VIDEO_DIP_ENABLE;
0be6f0c8
VS
846 val &= ~(VIDEO_DIP_ENABLE_AVI |
847 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
822974ae 848
f278d972 849 I915_WRITE(reg, val);
9d9740f0 850 POSTING_READ(reg);
f278d972 851
fbf08556
VS
852 intel_write_infoframe(encoder, crtc_state,
853 HDMI_INFOFRAME_TYPE_AVI,
854 &crtc_state->infoframes.avi);
855 intel_write_infoframe(encoder, crtc_state,
856 HDMI_INFOFRAME_TYPE_SPD,
857 &crtc_state->infoframes.spd);
858 intel_write_infoframe(encoder, crtc_state,
859 HDMI_INFOFRAME_TYPE_VENDOR,
860 &crtc_state->infoframes.hdmi);
687f4d06
PZ
861}
862
ac240288 863static bool hdmi_sink_is_deep_color(const struct drm_connector_state *conn_state)
6d67415f 864{
ac240288 865 struct drm_connector *connector = conn_state->connector;
6d67415f
VS
866
867 /*
868 * HDMI cloning is only supported on g4x which doesn't
869 * support deep color or GCP infoframes anyway so no
870 * need to worry about multiple HDMI sinks here.
871 */
6d67415f 872
ac240288 873 return connector->display_info.bpc > 8;
6d67415f
VS
874}
875
12aa3290
VS
876/*
877 * Determine if default_phase=1 can be indicated in the GCP infoframe.
878 *
879 * From HDMI specification 1.4a:
880 * - The first pixel of each Video Data Period shall always have a pixel packing phase of 0
881 * - The first pixel following each Video Data Period shall have a pixel packing phase of 0
882 * - The PP bits shall be constant for all GCPs and will be equal to the last packing phase
883 * - The first pixel following every transition of HSYNC or VSYNC shall have a pixel packing
884 * phase of 0
885 */
886static bool gcp_default_phase_possible(int pipe_bpp,
887 const struct drm_display_mode *mode)
888{
889 unsigned int pixels_per_group;
890
891 switch (pipe_bpp) {
892 case 30:
893 /* 4 pixels in 5 clocks */
894 pixels_per_group = 4;
895 break;
896 case 36:
897 /* 2 pixels in 3 clocks */
898 pixels_per_group = 2;
899 break;
900 case 48:
901 /* 1 pixel in 2 clocks */
902 pixels_per_group = 1;
903 break;
904 default:
905 /* phase information not relevant for 8bpc */
906 return false;
907 }
908
909 return mode->crtc_hdisplay % pixels_per_group == 0 &&
910 mode->crtc_htotal % pixels_per_group == 0 &&
911 mode->crtc_hblank_start % pixels_per_group == 0 &&
912 mode->crtc_hblank_end % pixels_per_group == 0 &&
913 mode->crtc_hsync_start % pixels_per_group == 0 &&
914 mode->crtc_hsync_end % pixels_per_group == 0 &&
915 ((mode->flags & DRM_MODE_FLAG_INTERLACE) == 0 ||
916 mode->crtc_htotal/2 % pixels_per_group == 0);
917}
918
790ea70c 919static bool intel_hdmi_set_gcp_infoframe(struct intel_encoder *encoder,
ac240288
ML
920 const struct intel_crtc_state *crtc_state,
921 const struct drm_connector_state *conn_state)
6d67415f 922{
790ea70c 923 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
ac240288 924 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
f0f59a00 925 i915_reg_t reg;
fbf08556
VS
926
927 if ((crtc_state->infoframes.enable &
928 intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL)) == 0)
929 return false;
6d67415f
VS
930
931 if (HAS_DDI(dev_priv))
ac240288 932 reg = HSW_TVIDEO_DIP_GCP(crtc_state->cpu_transcoder);
666a4537 933 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
6d67415f 934 reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
2d1fe073 935 else if (HAS_PCH_SPLIT(dev_priv))
6d67415f
VS
936 reg = TVIDEO_DIP_GCP(crtc->pipe);
937 else
938 return false;
939
fbf08556
VS
940 I915_WRITE(reg, crtc_state->infoframes.gcp);
941
942 return true;
943}
944
f2a10d61
VS
945void intel_hdmi_read_gcp_infoframe(struct intel_encoder *encoder,
946 struct intel_crtc_state *crtc_state)
947{
948 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
949 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
950 i915_reg_t reg;
951
952 if ((crtc_state->infoframes.enable &
953 intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL)) == 0)
954 return;
955
956 if (HAS_DDI(dev_priv))
957 reg = HSW_TVIDEO_DIP_GCP(crtc_state->cpu_transcoder);
958 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
959 reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
960 else if (HAS_PCH_SPLIT(dev_priv))
961 reg = TVIDEO_DIP_GCP(crtc->pipe);
962 else
963 return;
964
965 crtc_state->infoframes.gcp = I915_READ(reg);
966}
967
fbf08556
VS
968static void intel_hdmi_compute_gcp_infoframe(struct intel_encoder *encoder,
969 struct intel_crtc_state *crtc_state,
970 struct drm_connector_state *conn_state)
971{
972 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
973
974 if (IS_G4X(dev_priv) || !crtc_state->has_infoframe)
975 return;
976
977 crtc_state->infoframes.enable |=
978 intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL);
979
6d67415f 980 /* Indicate color depth whenever the sink supports deep color */
ac240288 981 if (hdmi_sink_is_deep_color(conn_state))
fbf08556 982 crtc_state->infoframes.gcp |= GCP_COLOR_INDICATION;
6d67415f 983
12aa3290 984 /* Enable default_phase whenever the display mode is suitably aligned */
ac240288
ML
985 if (gcp_default_phase_possible(crtc_state->pipe_bpp,
986 &crtc_state->base.adjusted_mode))
fbf08556 987 crtc_state->infoframes.gcp |= GCP_DEFAULT_PHASE_ENABLE;
6d67415f
VS
988}
989
790ea70c 990static void ibx_set_infoframes(struct intel_encoder *encoder,
6897b4b5 991 bool enable,
ac240288
ML
992 const struct intel_crtc_state *crtc_state,
993 const struct drm_connector_state *conn_state)
687f4d06 994{
790ea70c 995 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
ac240288 996 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
790ea70c 997 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
69fde0a6 998 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
f0f59a00 999 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
0c14c7f9 1000 u32 val = I915_READ(reg);
790ea70c 1001 u32 port = VIDEO_DIP_PORT(encoder->port);
0c14c7f9 1002
afba0188
DV
1003 assert_hdmi_port_disabled(intel_hdmi);
1004
0c14c7f9
PZ
1005 /* See the big comment in g4x_set_infoframes() */
1006 val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
1007
6897b4b5 1008 if (!enable) {
0c14c7f9
PZ
1009 if (!(val & VIDEO_DIP_ENABLE))
1010 return;
0be6f0c8
VS
1011 val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
1012 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1013 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
0c14c7f9 1014 I915_WRITE(reg, val);
9d9740f0 1015 POSTING_READ(reg);
0c14c7f9
PZ
1016 return;
1017 }
1018
72b78c9d 1019 if (port != (val & VIDEO_DIP_PORT_MASK)) {
0be6f0c8
VS
1020 WARN(val & VIDEO_DIP_ENABLE,
1021 "DIP already enabled on port %c\n",
1022 (val & VIDEO_DIP_PORT_MASK) >> 29);
72b78c9d
PZ
1023 val &= ~VIDEO_DIP_PORT_MASK;
1024 val |= port;
1025 }
1026
822974ae 1027 val |= VIDEO_DIP_ENABLE;
0be6f0c8
VS
1028 val &= ~(VIDEO_DIP_ENABLE_AVI |
1029 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1030 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
822974ae 1031
ac240288 1032 if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
6d67415f
VS
1033 val |= VIDEO_DIP_ENABLE_GCP;
1034
f278d972 1035 I915_WRITE(reg, val);
9d9740f0 1036 POSTING_READ(reg);
f278d972 1037
fbf08556
VS
1038 intel_write_infoframe(encoder, crtc_state,
1039 HDMI_INFOFRAME_TYPE_AVI,
1040 &crtc_state->infoframes.avi);
1041 intel_write_infoframe(encoder, crtc_state,
1042 HDMI_INFOFRAME_TYPE_SPD,
1043 &crtc_state->infoframes.spd);
1044 intel_write_infoframe(encoder, crtc_state,
1045 HDMI_INFOFRAME_TYPE_VENDOR,
1046 &crtc_state->infoframes.hdmi);
687f4d06
PZ
1047}
1048
790ea70c 1049static void cpt_set_infoframes(struct intel_encoder *encoder,
6897b4b5 1050 bool enable,
ac240288
ML
1051 const struct intel_crtc_state *crtc_state,
1052 const struct drm_connector_state *conn_state)
687f4d06 1053{
790ea70c 1054 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
ac240288 1055 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
790ea70c 1056 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
f0f59a00 1057 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
0c14c7f9
PZ
1058 u32 val = I915_READ(reg);
1059
afba0188
DV
1060 assert_hdmi_port_disabled(intel_hdmi);
1061
0c14c7f9
PZ
1062 /* See the big comment in g4x_set_infoframes() */
1063 val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
1064
6897b4b5 1065 if (!enable) {
0c14c7f9
PZ
1066 if (!(val & VIDEO_DIP_ENABLE))
1067 return;
0be6f0c8
VS
1068 val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
1069 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1070 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
0c14c7f9 1071 I915_WRITE(reg, val);
9d9740f0 1072 POSTING_READ(reg);
0c14c7f9
PZ
1073 return;
1074 }
1075
822974ae
PZ
1076 /* Set both together, unset both together: see the spec. */
1077 val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
0dd87d20 1078 val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
0be6f0c8 1079 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
822974ae 1080
ac240288 1081 if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
6d67415f
VS
1082 val |= VIDEO_DIP_ENABLE_GCP;
1083
822974ae 1084 I915_WRITE(reg, val);
9d9740f0 1085 POSTING_READ(reg);
822974ae 1086
fbf08556
VS
1087 intel_write_infoframe(encoder, crtc_state,
1088 HDMI_INFOFRAME_TYPE_AVI,
1089 &crtc_state->infoframes.avi);
1090 intel_write_infoframe(encoder, crtc_state,
1091 HDMI_INFOFRAME_TYPE_SPD,
1092 &crtc_state->infoframes.spd);
1093 intel_write_infoframe(encoder, crtc_state,
1094 HDMI_INFOFRAME_TYPE_VENDOR,
1095 &crtc_state->infoframes.hdmi);
687f4d06
PZ
1096}
1097
790ea70c 1098static void vlv_set_infoframes(struct intel_encoder *encoder,
6897b4b5 1099 bool enable,
ac240288
ML
1100 const struct intel_crtc_state *crtc_state,
1101 const struct drm_connector_state *conn_state)
687f4d06 1102{
790ea70c 1103 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
ac240288 1104 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
790ea70c 1105 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
f0f59a00 1106 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
0c14c7f9 1107 u32 val = I915_READ(reg);
790ea70c 1108 u32 port = VIDEO_DIP_PORT(encoder->port);
0c14c7f9 1109
afba0188
DV
1110 assert_hdmi_port_disabled(intel_hdmi);
1111
0c14c7f9
PZ
1112 /* See the big comment in g4x_set_infoframes() */
1113 val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
1114
6897b4b5 1115 if (!enable) {
0c14c7f9
PZ
1116 if (!(val & VIDEO_DIP_ENABLE))
1117 return;
0be6f0c8
VS
1118 val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
1119 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1120 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
0c14c7f9 1121 I915_WRITE(reg, val);
9d9740f0 1122 POSTING_READ(reg);
0c14c7f9
PZ
1123 return;
1124 }
1125
6a2b8021 1126 if (port != (val & VIDEO_DIP_PORT_MASK)) {
0be6f0c8
VS
1127 WARN(val & VIDEO_DIP_ENABLE,
1128 "DIP already enabled on port %c\n",
1129 (val & VIDEO_DIP_PORT_MASK) >> 29);
6a2b8021
JB
1130 val &= ~VIDEO_DIP_PORT_MASK;
1131 val |= port;
1132 }
1133
822974ae 1134 val |= VIDEO_DIP_ENABLE;
0be6f0c8
VS
1135 val &= ~(VIDEO_DIP_ENABLE_AVI |
1136 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1137 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
822974ae 1138
ac240288 1139 if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
6d67415f
VS
1140 val |= VIDEO_DIP_ENABLE_GCP;
1141
822974ae 1142 I915_WRITE(reg, val);
9d9740f0 1143 POSTING_READ(reg);
822974ae 1144
fbf08556
VS
1145 intel_write_infoframe(encoder, crtc_state,
1146 HDMI_INFOFRAME_TYPE_AVI,
1147 &crtc_state->infoframes.avi);
1148 intel_write_infoframe(encoder, crtc_state,
1149 HDMI_INFOFRAME_TYPE_SPD,
1150 &crtc_state->infoframes.spd);
1151 intel_write_infoframe(encoder, crtc_state,
1152 HDMI_INFOFRAME_TYPE_VENDOR,
1153 &crtc_state->infoframes.hdmi);
687f4d06
PZ
1154}
1155
790ea70c 1156static void hsw_set_infoframes(struct intel_encoder *encoder,
6897b4b5 1157 bool enable,
ac240288
ML
1158 const struct intel_crtc_state *crtc_state,
1159 const struct drm_connector_state *conn_state)
687f4d06 1160{
790ea70c 1161 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
ac240288 1162 i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
0dd87d20 1163 u32 val = I915_READ(reg);
0c14c7f9 1164
8fc0aa6e
ID
1165 assert_hdmi_transcoder_func_disabled(dev_priv,
1166 crtc_state->cpu_transcoder);
afba0188 1167
0be6f0c8
VS
1168 val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
1169 VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
1170 VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);
1171
6897b4b5 1172 if (!enable) {
0be6f0c8 1173 I915_WRITE(reg, val);
9d9740f0 1174 POSTING_READ(reg);
0c14c7f9
PZ
1175 return;
1176 }
1177
ac240288 1178 if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
6d67415f
VS
1179 val |= VIDEO_DIP_ENABLE_GCP_HSW;
1180
0dd87d20 1181 I915_WRITE(reg, val);
9d9740f0 1182 POSTING_READ(reg);
0dd87d20 1183
fbf08556
VS
1184 intel_write_infoframe(encoder, crtc_state,
1185 HDMI_INFOFRAME_TYPE_AVI,
1186 &crtc_state->infoframes.avi);
1187 intel_write_infoframe(encoder, crtc_state,
1188 HDMI_INFOFRAME_TYPE_SPD,
1189 &crtc_state->infoframes.spd);
1190 intel_write_infoframe(encoder, crtc_state,
1191 HDMI_INFOFRAME_TYPE_VENDOR,
1192 &crtc_state->infoframes.hdmi);
687f4d06
PZ
1193}
1194
b2ccb822
VS
1195void intel_dp_dual_mode_set_tmds_output(struct intel_hdmi *hdmi, bool enable)
1196{
1197 struct drm_i915_private *dev_priv = to_i915(intel_hdmi_to_dev(hdmi));
1198 struct i2c_adapter *adapter =
1199 intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);
1200
1201 if (hdmi->dp_dual_mode.type < DRM_DP_DUAL_MODE_TYPE2_DVI)
1202 return;
1203
1204 DRM_DEBUG_KMS("%s DP dual mode adaptor TMDS output\n",
1205 enable ? "Enabling" : "Disabling");
1206
1207 drm_dp_dual_mode_set_tmds_output(hdmi->dp_dual_mode.type,
1208 adapter, enable);
1209}
1210
2320175f
SP
1211static int intel_hdmi_hdcp_read(struct intel_digital_port *intel_dig_port,
1212 unsigned int offset, void *buffer, size_t size)
1213{
1214 struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
1215 struct drm_i915_private *dev_priv =
1216 intel_dig_port->base.base.dev->dev_private;
1217 struct i2c_adapter *adapter = intel_gmbus_get_adapter(dev_priv,
1218 hdmi->ddc_bus);
1219 int ret;
1220 u8 start = offset & 0xff;
1221 struct i2c_msg msgs[] = {
1222 {
1223 .addr = DRM_HDCP_DDC_ADDR,
1224 .flags = 0,
1225 .len = 1,
1226 .buf = &start,
1227 },
1228 {
1229 .addr = DRM_HDCP_DDC_ADDR,
1230 .flags = I2C_M_RD,
1231 .len = size,
1232 .buf = buffer
1233 }
1234 };
1235 ret = i2c_transfer(adapter, msgs, ARRAY_SIZE(msgs));
1236 if (ret == ARRAY_SIZE(msgs))
1237 return 0;
1238 return ret >= 0 ? -EIO : ret;
1239}
1240
1241static int intel_hdmi_hdcp_write(struct intel_digital_port *intel_dig_port,
1242 unsigned int offset, void *buffer, size_t size)
1243{
1244 struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
1245 struct drm_i915_private *dev_priv =
1246 intel_dig_port->base.base.dev->dev_private;
1247 struct i2c_adapter *adapter = intel_gmbus_get_adapter(dev_priv,
1248 hdmi->ddc_bus);
1249 int ret;
1250 u8 *write_buf;
1251 struct i2c_msg msg;
1252
1253 write_buf = kzalloc(size + 1, GFP_KERNEL);
1254 if (!write_buf)
1255 return -ENOMEM;
1256
1257 write_buf[0] = offset & 0xff;
1258 memcpy(&write_buf[1], buffer, size);
1259
1260 msg.addr = DRM_HDCP_DDC_ADDR;
1261 msg.flags = 0,
1262 msg.len = size + 1,
1263 msg.buf = write_buf;
1264
1265 ret = i2c_transfer(adapter, &msg, 1);
1266 if (ret == 1)
1b1b1162
RV
1267 ret = 0;
1268 else if (ret >= 0)
1269 ret = -EIO;
1270
1271 kfree(write_buf);
1272 return ret;
2320175f
SP
1273}
1274
1275static
1276int intel_hdmi_hdcp_write_an_aksv(struct intel_digital_port *intel_dig_port,
1277 u8 *an)
1278{
1279 struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
1280 struct drm_i915_private *dev_priv =
1281 intel_dig_port->base.base.dev->dev_private;
1282 struct i2c_adapter *adapter = intel_gmbus_get_adapter(dev_priv,
1283 hdmi->ddc_bus);
1284 int ret;
1285
1286 ret = intel_hdmi_hdcp_write(intel_dig_port, DRM_HDCP_DDC_AN, an,
1287 DRM_HDCP_AN_LEN);
1288 if (ret) {
3aae21fc 1289 DRM_DEBUG_KMS("Write An over DDC failed (%d)\n", ret);
2320175f
SP
1290 return ret;
1291 }
1292
1293 ret = intel_gmbus_output_aksv(adapter);
1294 if (ret < 0) {
3aae21fc 1295 DRM_DEBUG_KMS("Failed to output aksv (%d)\n", ret);
2320175f
SP
1296 return ret;
1297 }
1298 return 0;
1299}
1300
1301static int intel_hdmi_hdcp_read_bksv(struct intel_digital_port *intel_dig_port,
1302 u8 *bksv)
1303{
1304 int ret;
1305 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BKSV, bksv,
1306 DRM_HDCP_KSV_LEN);
1307 if (ret)
3aae21fc 1308 DRM_DEBUG_KMS("Read Bksv over DDC failed (%d)\n", ret);
2320175f
SP
1309 return ret;
1310}
1311
1312static
1313int intel_hdmi_hdcp_read_bstatus(struct intel_digital_port *intel_dig_port,
1314 u8 *bstatus)
1315{
1316 int ret;
1317 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BSTATUS,
1318 bstatus, DRM_HDCP_BSTATUS_LEN);
1319 if (ret)
3aae21fc 1320 DRM_DEBUG_KMS("Read bstatus over DDC failed (%d)\n", ret);
2320175f
SP
1321 return ret;
1322}
1323
1324static
1325int intel_hdmi_hdcp_repeater_present(struct intel_digital_port *intel_dig_port,
1326 bool *repeater_present)
1327{
1328 int ret;
1329 u8 val;
1330
1331 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BCAPS, &val, 1);
1332 if (ret) {
3aae21fc 1333 DRM_DEBUG_KMS("Read bcaps over DDC failed (%d)\n", ret);
2320175f
SP
1334 return ret;
1335 }
1336 *repeater_present = val & DRM_HDCP_DDC_BCAPS_REPEATER_PRESENT;
1337 return 0;
1338}
1339
1340static
1341int intel_hdmi_hdcp_read_ri_prime(struct intel_digital_port *intel_dig_port,
1342 u8 *ri_prime)
1343{
1344 int ret;
1345 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_RI_PRIME,
1346 ri_prime, DRM_HDCP_RI_LEN);
1347 if (ret)
3aae21fc 1348 DRM_DEBUG_KMS("Read Ri' over DDC failed (%d)\n", ret);
2320175f
SP
1349 return ret;
1350}
1351
1352static
1353int intel_hdmi_hdcp_read_ksv_ready(struct intel_digital_port *intel_dig_port,
1354 bool *ksv_ready)
1355{
1356 int ret;
1357 u8 val;
1358
1359 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BCAPS, &val, 1);
1360 if (ret) {
3aae21fc 1361 DRM_DEBUG_KMS("Read bcaps over DDC failed (%d)\n", ret);
2320175f
SP
1362 return ret;
1363 }
1364 *ksv_ready = val & DRM_HDCP_DDC_BCAPS_KSV_FIFO_READY;
1365 return 0;
1366}
1367
1368static
1369int intel_hdmi_hdcp_read_ksv_fifo(struct intel_digital_port *intel_dig_port,
1370 int num_downstream, u8 *ksv_fifo)
1371{
1372 int ret;
1373 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_KSV_FIFO,
1374 ksv_fifo, num_downstream * DRM_HDCP_KSV_LEN);
1375 if (ret) {
3aae21fc 1376 DRM_DEBUG_KMS("Read ksv fifo over DDC failed (%d)\n", ret);
2320175f
SP
1377 return ret;
1378 }
1379 return 0;
1380}
1381
1382static
1383int intel_hdmi_hdcp_read_v_prime_part(struct intel_digital_port *intel_dig_port,
1384 int i, u32 *part)
1385{
1386 int ret;
1387
1388 if (i >= DRM_HDCP_V_PRIME_NUM_PARTS)
1389 return -EINVAL;
1390
1391 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_V_PRIME(i),
1392 part, DRM_HDCP_V_PRIME_PART_LEN);
1393 if (ret)
3aae21fc 1394 DRM_DEBUG_KMS("Read V'[%d] over DDC failed (%d)\n", i, ret);
2320175f
SP
1395 return ret;
1396}
1397
7412826c
R
1398static int kbl_repositioning_enc_en_signal(struct intel_connector *connector)
1399{
1400 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1401 struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
1402 struct drm_crtc *crtc = connector->base.state->crtc;
1403 struct intel_crtc *intel_crtc = container_of(crtc,
1404 struct intel_crtc, base);
1405 u32 scanline;
1406 int ret;
1407
1408 for (;;) {
1409 scanline = I915_READ(PIPEDSL(intel_crtc->pipe));
1410 if (scanline > 100 && scanline < 200)
1411 break;
1412 usleep_range(25, 50);
1413 }
1414
1415 ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, false);
1416 if (ret) {
1417 DRM_ERROR("Disable HDCP signalling failed (%d)\n", ret);
1418 return ret;
1419 }
1420 ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, true);
1421 if (ret) {
1422 DRM_ERROR("Enable HDCP signalling failed (%d)\n", ret);
1423 return ret;
1424 }
1425
1426 return 0;
1427}
1428
2320175f
SP
1429static
1430int intel_hdmi_hdcp_toggle_signalling(struct intel_digital_port *intel_dig_port,
1431 bool enable)
1432{
7412826c
R
1433 struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
1434 struct intel_connector *connector = hdmi->attached_connector;
1435 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
2320175f
SP
1436 int ret;
1437
1438 if (!enable)
1439 usleep_range(6, 60); /* Bspec says >= 6us */
1440
1441 ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, enable);
1442 if (ret) {
1443 DRM_ERROR("%s HDCP signalling failed (%d)\n",
1444 enable ? "Enable" : "Disable", ret);
1445 return ret;
1446 }
7412826c
R
1447
1448 /*
1449 * WA: To fix incorrect positioning of the window of
1450 * opportunity and enc_en signalling in KABYLAKE.
1451 */
1452 if (IS_KABYLAKE(dev_priv) && enable)
1453 return kbl_repositioning_enc_en_signal(connector);
1454
2320175f
SP
1455 return 0;
1456}
1457
1458static
1459bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
1460{
1461 struct drm_i915_private *dev_priv =
1462 intel_dig_port->base.base.dev->dev_private;
1463 enum port port = intel_dig_port->base.port;
1464 int ret;
1465 union {
1466 u32 reg;
1467 u8 shim[DRM_HDCP_RI_LEN];
1468 } ri;
1469
1470 ret = intel_hdmi_hdcp_read_ri_prime(intel_dig_port, ri.shim);
1471 if (ret)
1472 return false;
1473
1474 I915_WRITE(PORT_HDCP_RPRIME(port), ri.reg);
1475
1476 /* Wait for Ri prime match */
1477 if (wait_for(I915_READ(PORT_HDCP_STATUS(port)) &
1478 (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1)) {
1479 DRM_ERROR("Ri' mismatch detected, link check failed (%x)\n",
1480 I915_READ(PORT_HDCP_STATUS(port)));
1481 return false;
1482 }
1483 return true;
1484}
1485
2d4254e5
R
1486static struct hdcp2_hdmi_msg_data {
1487 u8 msg_id;
1488 u32 timeout;
1489 u32 timeout2;
1490 } hdcp2_msg_data[] = {
1491 {HDCP_2_2_AKE_INIT, 0, 0},
1492 {HDCP_2_2_AKE_SEND_CERT, HDCP_2_2_CERT_TIMEOUT_MS, 0},
1493 {HDCP_2_2_AKE_NO_STORED_KM, 0, 0},
1494 {HDCP_2_2_AKE_STORED_KM, 0, 0},
1495 {HDCP_2_2_AKE_SEND_HPRIME, HDCP_2_2_HPRIME_PAIRED_TIMEOUT_MS,
1496 HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT_MS},
1497 {HDCP_2_2_AKE_SEND_PAIRING_INFO, HDCP_2_2_PAIRING_TIMEOUT_MS,
1498 0},
1499 {HDCP_2_2_LC_INIT, 0, 0},
1500 {HDCP_2_2_LC_SEND_LPRIME, HDCP_2_2_HDMI_LPRIME_TIMEOUT_MS, 0},
1501 {HDCP_2_2_SKE_SEND_EKS, 0, 0},
1502 {HDCP_2_2_REP_SEND_RECVID_LIST,
1503 HDCP_2_2_RECVID_LIST_TIMEOUT_MS, 0},
1504 {HDCP_2_2_REP_SEND_ACK, 0, 0},
1505 {HDCP_2_2_REP_STREAM_MANAGE, 0, 0},
1506 {HDCP_2_2_REP_STREAM_READY, HDCP_2_2_STREAM_READY_TIMEOUT_MS,
1507 0},
1508 };
1509
1510static
1511int intel_hdmi_hdcp2_read_rx_status(struct intel_digital_port *intel_dig_port,
126d0a94 1512 u8 *rx_status)
2d4254e5
R
1513{
1514 return intel_hdmi_hdcp_read(intel_dig_port,
1515 HDCP_2_2_HDMI_REG_RXSTATUS_OFFSET,
1516 rx_status,
1517 HDCP_2_2_HDMI_RXSTATUS_LEN);
1518}
1519
1520static int get_hdcp2_msg_timeout(u8 msg_id, bool is_paired)
1521{
1522 int i;
1523
1524 for (i = 0; i < ARRAY_SIZE(hdcp2_msg_data); i++)
1525 if (hdcp2_msg_data[i].msg_id == msg_id &&
1526 (msg_id != HDCP_2_2_AKE_SEND_HPRIME || is_paired))
1527 return hdcp2_msg_data[i].timeout;
1528 else if (hdcp2_msg_data[i].msg_id == msg_id)
1529 return hdcp2_msg_data[i].timeout2;
1530
1531 return -EINVAL;
1532}
1533
1534static inline
1535int hdcp2_detect_msg_availability(struct intel_digital_port *intel_digital_port,
1536 u8 msg_id, bool *msg_ready,
1537 ssize_t *msg_sz)
1538{
1539 u8 rx_status[HDCP_2_2_HDMI_RXSTATUS_LEN];
1540 int ret;
1541
1542 ret = intel_hdmi_hdcp2_read_rx_status(intel_digital_port, rx_status);
1543 if (ret < 0) {
1544 DRM_DEBUG_KMS("rx_status read failed. Err %d\n", ret);
1545 return ret;
1546 }
1547
1548 *msg_sz = ((HDCP_2_2_HDMI_RXSTATUS_MSG_SZ_HI(rx_status[1]) << 8) |
1549 rx_status[0]);
1550
1551 if (msg_id == HDCP_2_2_REP_SEND_RECVID_LIST)
1552 *msg_ready = (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]) &&
1553 *msg_sz);
1554 else
1555 *msg_ready = *msg_sz;
1556
1557 return 0;
1558}
1559
1560static ssize_t
1561intel_hdmi_hdcp2_wait_for_msg(struct intel_digital_port *intel_dig_port,
1562 u8 msg_id, bool paired)
1563{
1564 bool msg_ready = false;
1565 int timeout, ret;
1566 ssize_t msg_sz = 0;
1567
1568 timeout = get_hdcp2_msg_timeout(msg_id, paired);
1569 if (timeout < 0)
1570 return timeout;
1571
1572 ret = __wait_for(ret = hdcp2_detect_msg_availability(intel_dig_port,
1573 msg_id, &msg_ready,
1574 &msg_sz),
1575 !ret && msg_ready && msg_sz, timeout * 1000,
1576 1000, 5 * 1000);
1577 if (ret)
1578 DRM_DEBUG_KMS("msg_id: %d, ret: %d, timeout: %d\n",
1579 msg_id, ret, timeout);
1580
1581 return ret ? ret : msg_sz;
1582}
1583
1584static
1585int intel_hdmi_hdcp2_write_msg(struct intel_digital_port *intel_dig_port,
1586 void *buf, size_t size)
1587{
1588 unsigned int offset;
1589
1590 offset = HDCP_2_2_HDMI_REG_WR_MSG_OFFSET;
1591 return intel_hdmi_hdcp_write(intel_dig_port, offset, buf, size);
1592}
1593
1594static
1595int intel_hdmi_hdcp2_read_msg(struct intel_digital_port *intel_dig_port,
1596 u8 msg_id, void *buf, size_t size)
1597{
1598 struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
1599 struct intel_hdcp *hdcp = &hdmi->attached_connector->hdcp;
1600 unsigned int offset;
1601 ssize_t ret;
1602
1603 ret = intel_hdmi_hdcp2_wait_for_msg(intel_dig_port, msg_id,
1604 hdcp->is_paired);
1605 if (ret < 0)
1606 return ret;
1607
1608 /*
1609 * Available msg size should be equal to or lesser than the
1610 * available buffer.
1611 */
1612 if (ret > size) {
1613 DRM_DEBUG_KMS("msg_sz(%zd) is more than exp size(%zu)\n",
1614 ret, size);
1615 return -1;
1616 }
1617
1618 offset = HDCP_2_2_HDMI_REG_RD_MSG_OFFSET;
1619 ret = intel_hdmi_hdcp_read(intel_dig_port, offset, buf, ret);
1620 if (ret)
1621 DRM_DEBUG_KMS("Failed to read msg_id: %d(%zd)\n", msg_id, ret);
1622
1623 return ret;
1624}
1625
1626static
1627int intel_hdmi_hdcp2_check_link(struct intel_digital_port *intel_dig_port)
1628{
1629 u8 rx_status[HDCP_2_2_HDMI_RXSTATUS_LEN];
1630 int ret;
1631
1632 ret = intel_hdmi_hdcp2_read_rx_status(intel_dig_port, rx_status);
1633 if (ret)
1634 return ret;
1635
1636 /*
1637 * Re-auth request and Link Integrity Failures are represented by
1638 * same bit. i.e reauth_req.
1639 */
1640 if (HDCP_2_2_HDMI_RXSTATUS_REAUTH_REQ(rx_status[1]))
1641 ret = HDCP_REAUTH_REQUEST;
1642 else if (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]))
1643 ret = HDCP_TOPOLOGY_CHANGE;
1644
1645 return ret;
1646}
1647
1648static
1649int intel_hdmi_hdcp2_capable(struct intel_digital_port *intel_dig_port,
1650 bool *capable)
1651{
1652 u8 hdcp2_version;
1653 int ret;
1654
1655 *capable = false;
1656 ret = intel_hdmi_hdcp_read(intel_dig_port, HDCP_2_2_HDMI_REG_VER_OFFSET,
1657 &hdcp2_version, sizeof(hdcp2_version));
1658 if (!ret && hdcp2_version & HDCP_2_2_HDMI_SUPPORT_MASK)
1659 *capable = true;
1660
1661 return ret;
1662}
1663
1664static inline
1665enum hdcp_wired_protocol intel_hdmi_hdcp2_protocol(void)
1666{
1667 return HDCP_PROTOCOL_HDMI;
1668}
1669
2320175f
SP
1670static const struct intel_hdcp_shim intel_hdmi_hdcp_shim = {
1671 .write_an_aksv = intel_hdmi_hdcp_write_an_aksv,
1672 .read_bksv = intel_hdmi_hdcp_read_bksv,
1673 .read_bstatus = intel_hdmi_hdcp_read_bstatus,
1674 .repeater_present = intel_hdmi_hdcp_repeater_present,
1675 .read_ri_prime = intel_hdmi_hdcp_read_ri_prime,
1676 .read_ksv_ready = intel_hdmi_hdcp_read_ksv_ready,
1677 .read_ksv_fifo = intel_hdmi_hdcp_read_ksv_fifo,
1678 .read_v_prime_part = intel_hdmi_hdcp_read_v_prime_part,
1679 .toggle_signalling = intel_hdmi_hdcp_toggle_signalling,
1680 .check_link = intel_hdmi_hdcp_check_link,
2d4254e5
R
1681 .write_2_2_msg = intel_hdmi_hdcp2_write_msg,
1682 .read_2_2_msg = intel_hdmi_hdcp2_read_msg,
1683 .check_2_2_link = intel_hdmi_hdcp2_check_link,
1684 .hdcp_2_2_capable = intel_hdmi_hdcp2_capable,
1685 .protocol = HDCP_PROTOCOL_HDMI,
2320175f
SP
1686};
1687
ac240288
ML
1688static void intel_hdmi_prepare(struct intel_encoder *encoder,
1689 const struct intel_crtc_state *crtc_state)
7d57382e 1690{
c59423a3 1691 struct drm_device *dev = encoder->base.dev;
fac5e23e 1692 struct drm_i915_private *dev_priv = to_i915(dev);
ac240288 1693 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
c59423a3 1694 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
ac240288 1695 const struct drm_display_mode *adjusted_mode = &crtc_state->base.adjusted_mode;
b242b7f7 1696 u32 hdmi_val;
7d57382e 1697
b2ccb822
VS
1698 intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);
1699
b242b7f7 1700 hdmi_val = SDVO_ENCODING_HDMI;
ac240288 1701 if (!HAS_PCH_SPLIT(dev_priv) && crtc_state->limited_color_range)
0f2a2a75 1702 hdmi_val |= HDMI_COLOR_RANGE_16_235;
b599c0bc 1703 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
b242b7f7 1704 hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
b599c0bc 1705 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
b242b7f7 1706 hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
7d57382e 1707
ac240288 1708 if (crtc_state->pipe_bpp > 24)
4f3a8bc7 1709 hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
020f6704 1710 else
4f3a8bc7 1711 hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
020f6704 1712
ac240288 1713 if (crtc_state->has_hdmi_sink)
dc0fa718 1714 hdmi_val |= HDMI_MODE_SELECT_HDMI;
2e3d6006 1715
6e266956 1716 if (HAS_PCH_CPT(dev_priv))
c59423a3 1717 hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
920a14b2 1718 else if (IS_CHERRYVIEW(dev_priv))
44f37d1f 1719 hdmi_val |= SDVO_PIPE_SEL_CHV(crtc->pipe);
dc0fa718 1720 else
c59423a3 1721 hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
7d57382e 1722
b242b7f7
PZ
1723 I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
1724 POSTING_READ(intel_hdmi->hdmi_reg);
7d57382e
EA
1725}
1726
85234cdc
DV
1727static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
1728 enum pipe *pipe)
7d57382e 1729{
76203467 1730 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
85234cdc 1731 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
0e6e0be4 1732 intel_wakeref_t wakeref;
5b092174 1733 bool ret;
85234cdc 1734
0e6e0be4
CW
1735 wakeref = intel_display_power_get_if_enabled(dev_priv,
1736 encoder->power_domain);
1737 if (!wakeref)
6d129bea
ID
1738 return false;
1739
76203467 1740 ret = intel_sdvo_port_enabled(dev_priv, intel_hdmi->hdmi_reg, pipe);
5b092174 1741
0e6e0be4 1742 intel_display_power_put(dev_priv, encoder->power_domain, wakeref);
5b092174
ID
1743
1744 return ret;
85234cdc
DV
1745}
1746
045ac3b5 1747static void intel_hdmi_get_config(struct intel_encoder *encoder,
5cec258b 1748 struct intel_crtc_state *pipe_config)
045ac3b5
JB
1749{
1750 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
8c875fca 1751 struct drm_device *dev = encoder->base.dev;
fac5e23e 1752 struct drm_i915_private *dev_priv = to_i915(dev);
045ac3b5 1753 u32 tmp, flags = 0;
18442d08 1754 int dotclock;
045ac3b5 1755
e1214b95
VS
1756 pipe_config->output_types |= BIT(INTEL_OUTPUT_HDMI);
1757
045ac3b5
JB
1758 tmp = I915_READ(intel_hdmi->hdmi_reg);
1759
1760 if (tmp & SDVO_HSYNC_ACTIVE_HIGH)
1761 flags |= DRM_MODE_FLAG_PHSYNC;
1762 else
1763 flags |= DRM_MODE_FLAG_NHSYNC;
1764
1765 if (tmp & SDVO_VSYNC_ACTIVE_HIGH)
1766 flags |= DRM_MODE_FLAG_PVSYNC;
1767 else
1768 flags |= DRM_MODE_FLAG_NVSYNC;
1769
6897b4b5
DV
1770 if (tmp & HDMI_MODE_SELECT_HDMI)
1771 pipe_config->has_hdmi_sink = true;
1772
e5e70d4a
VS
1773 pipe_config->infoframes.enable |=
1774 intel_hdmi_infoframes_enabled(encoder, pipe_config);
1775
1776 if (pipe_config->infoframes.enable)
e43823ec
JB
1777 pipe_config->has_infoframe = true;
1778
c84db770 1779 if (tmp & SDVO_AUDIO_ENABLE)
9ed109a7
DV
1780 pipe_config->has_audio = true;
1781
6e266956 1782 if (!HAS_PCH_SPLIT(dev_priv) &&
8c875fca
VS
1783 tmp & HDMI_COLOR_RANGE_16_235)
1784 pipe_config->limited_color_range = true;
1785
2d112de7 1786 pipe_config->base.adjusted_mode.flags |= flags;
18442d08
VS
1787
1788 if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc)
1789 dotclock = pipe_config->port_clock * 2 / 3;
1790 else
1791 dotclock = pipe_config->port_clock;
1792
be69a133
VS
1793 if (pipe_config->pixel_multiplier)
1794 dotclock /= pipe_config->pixel_multiplier;
1795
2d112de7 1796 pipe_config->base.adjusted_mode.crtc_clock = dotclock;
d4d6279a
ACO
1797
1798 pipe_config->lane_count = 4;
f2a10d61
VS
1799
1800 intel_hdmi_read_gcp_infoframe(encoder, pipe_config);
1801
1802 intel_read_infoframe(encoder, pipe_config,
1803 HDMI_INFOFRAME_TYPE_AVI,
1804 &pipe_config->infoframes.avi);
1805 intel_read_infoframe(encoder, pipe_config,
1806 HDMI_INFOFRAME_TYPE_SPD,
1807 &pipe_config->infoframes.spd);
1808 intel_read_infoframe(encoder, pipe_config,
1809 HDMI_INFOFRAME_TYPE_VENDOR,
1810 &pipe_config->infoframes.hdmi);
045ac3b5
JB
1811}
1812
df18e721 1813static void intel_enable_hdmi_audio(struct intel_encoder *encoder,
5f88a9c6
VS
1814 const struct intel_crtc_state *pipe_config,
1815 const struct drm_connector_state *conn_state)
d1b1589c 1816{
ac240288 1817 struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
d1b1589c 1818
ac240288 1819 WARN_ON(!pipe_config->has_hdmi_sink);
d1b1589c
VS
1820 DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
1821 pipe_name(crtc->pipe));
bbf35e9d 1822 intel_audio_codec_enable(encoder, pipe_config, conn_state);
d1b1589c
VS
1823}
1824
fd6bbda9 1825static void g4x_enable_hdmi(struct intel_encoder *encoder,
5f88a9c6
VS
1826 const struct intel_crtc_state *pipe_config,
1827 const struct drm_connector_state *conn_state)
7d57382e 1828{
5ab432ef 1829 struct drm_device *dev = encoder->base.dev;
fac5e23e 1830 struct drm_i915_private *dev_priv = to_i915(dev);
5ab432ef 1831 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
7d57382e
EA
1832 u32 temp;
1833
b242b7f7 1834 temp = I915_READ(intel_hdmi->hdmi_reg);
d8a2d0e0 1835
bf868c7d 1836 temp |= SDVO_ENABLE;
df18e721 1837 if (pipe_config->has_audio)
bf868c7d 1838 temp |= SDVO_AUDIO_ENABLE;
7a87c289 1839
bf868c7d
VS
1840 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1841 POSTING_READ(intel_hdmi->hdmi_reg);
1842
df18e721
ML
1843 if (pipe_config->has_audio)
1844 intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
bf868c7d
VS
1845}
1846
fd6bbda9 1847static void ibx_enable_hdmi(struct intel_encoder *encoder,
5f88a9c6
VS
1848 const struct intel_crtc_state *pipe_config,
1849 const struct drm_connector_state *conn_state)
bf868c7d
VS
1850{
1851 struct drm_device *dev = encoder->base.dev;
fac5e23e 1852 struct drm_i915_private *dev_priv = to_i915(dev);
bf868c7d
VS
1853 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1854 u32 temp;
1855
1856 temp = I915_READ(intel_hdmi->hdmi_reg);
d8a2d0e0 1857
bf868c7d 1858 temp |= SDVO_ENABLE;
ac240288 1859 if (pipe_config->has_audio)
bf868c7d 1860 temp |= SDVO_AUDIO_ENABLE;
5ab432ef 1861
bf868c7d
VS
1862 /*
1863 * HW workaround, need to write this twice for issue
1864 * that may result in first write getting masked.
1865 */
1866 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1867 POSTING_READ(intel_hdmi->hdmi_reg);
b242b7f7
PZ
1868 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1869 POSTING_READ(intel_hdmi->hdmi_reg);
5ab432ef 1870
bf868c7d
VS
1871 /*
1872 * HW workaround, need to toggle enable bit off and on
1873 * for 12bpc with pixel repeat.
1874 *
1875 * FIXME: BSpec says this should be done at the end of
1876 * of the modeset sequence, so not sure if this isn't too soon.
5ab432ef 1877 */
df18e721
ML
1878 if (pipe_config->pipe_bpp > 24 &&
1879 pipe_config->pixel_multiplier > 1) {
bf868c7d
VS
1880 I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
1881 POSTING_READ(intel_hdmi->hdmi_reg);
1882
1883 /*
1884 * HW workaround, need to write this twice for issue
1885 * that may result in first write getting masked.
1886 */
1887 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1888 POSTING_READ(intel_hdmi->hdmi_reg);
b242b7f7
PZ
1889 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1890 POSTING_READ(intel_hdmi->hdmi_reg);
7d57382e 1891 }
c1dec79a 1892
df18e721
ML
1893 if (pipe_config->has_audio)
1894 intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
d1b1589c
VS
1895}
1896
fd6bbda9 1897static void cpt_enable_hdmi(struct intel_encoder *encoder,
5f88a9c6
VS
1898 const struct intel_crtc_state *pipe_config,
1899 const struct drm_connector_state *conn_state)
d1b1589c
VS
1900{
1901 struct drm_device *dev = encoder->base.dev;
fac5e23e 1902 struct drm_i915_private *dev_priv = to_i915(dev);
ac240288 1903 struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
d1b1589c
VS
1904 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
1905 enum pipe pipe = crtc->pipe;
1906 u32 temp;
1907
1908 temp = I915_READ(intel_hdmi->hdmi_reg);
1909
1910 temp |= SDVO_ENABLE;
df18e721 1911 if (pipe_config->has_audio)
d1b1589c
VS
1912 temp |= SDVO_AUDIO_ENABLE;
1913
1914 /*
1915 * WaEnableHDMI8bpcBefore12bpc:snb,ivb
1916 *
1917 * The procedure for 12bpc is as follows:
1918 * 1. disable HDMI clock gating
1919 * 2. enable HDMI with 8bpc
1920 * 3. enable HDMI with 12bpc
1921 * 4. enable HDMI clock gating
1922 */
1923
df18e721 1924 if (pipe_config->pipe_bpp > 24) {
d1b1589c
VS
1925 I915_WRITE(TRANS_CHICKEN1(pipe),
1926 I915_READ(TRANS_CHICKEN1(pipe)) |
1927 TRANS_CHICKEN1_HDMIUNIT_GC_DISABLE);
1928
1929 temp &= ~SDVO_COLOR_FORMAT_MASK;
1930 temp |= SDVO_COLOR_FORMAT_8bpc;
c1dec79a 1931 }
d1b1589c
VS
1932
1933 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1934 POSTING_READ(intel_hdmi->hdmi_reg);
1935
df18e721 1936 if (pipe_config->pipe_bpp > 24) {
d1b1589c
VS
1937 temp &= ~SDVO_COLOR_FORMAT_MASK;
1938 temp |= HDMI_COLOR_FORMAT_12bpc;
1939
1940 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1941 POSTING_READ(intel_hdmi->hdmi_reg);
1942
1943 I915_WRITE(TRANS_CHICKEN1(pipe),
1944 I915_READ(TRANS_CHICKEN1(pipe)) &
1945 ~TRANS_CHICKEN1_HDMIUNIT_GC_DISABLE);
1946 }
1947
df18e721
ML
1948 if (pipe_config->has_audio)
1949 intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
b76cf76b 1950}
89b667f8 1951
fd6bbda9 1952static void vlv_enable_hdmi(struct intel_encoder *encoder,
5f88a9c6
VS
1953 const struct intel_crtc_state *pipe_config,
1954 const struct drm_connector_state *conn_state)
b76cf76b 1955{
5ab432ef
DV
1956}
1957
fd6bbda9 1958static void intel_disable_hdmi(struct intel_encoder *encoder,
5f88a9c6
VS
1959 const struct intel_crtc_state *old_crtc_state,
1960 const struct drm_connector_state *old_conn_state)
5ab432ef
DV
1961{
1962 struct drm_device *dev = encoder->base.dev;
fac5e23e 1963 struct drm_i915_private *dev_priv = to_i915(dev);
5ab432ef 1964 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
f99be1b3
VS
1965 struct intel_digital_port *intel_dig_port =
1966 hdmi_to_dig_port(intel_hdmi);
ac240288 1967 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
5ab432ef 1968 u32 temp;
5ab432ef 1969
b242b7f7 1970 temp = I915_READ(intel_hdmi->hdmi_reg);
5ab432ef 1971
1612c8bd 1972 temp &= ~(SDVO_ENABLE | SDVO_AUDIO_ENABLE);
b242b7f7
PZ
1973 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1974 POSTING_READ(intel_hdmi->hdmi_reg);
1612c8bd
VS
1975
1976 /*
1977 * HW workaround for IBX, we need to move the port
1978 * to transcoder A after disabling it to allow the
1979 * matching DP port to be enabled on transcoder A.
1980 */
6e266956 1981 if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B) {
0c241d5b
VS
1982 /*
1983 * We get CPU/PCH FIFO underruns on the other pipe when
1984 * doing the workaround. Sweep them under the rug.
1985 */
1986 intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false);
1987 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
1988
76203467
VS
1989 temp &= ~SDVO_PIPE_SEL_MASK;
1990 temp |= SDVO_ENABLE | SDVO_PIPE_SEL(PIPE_A);
1612c8bd
VS
1991 /*
1992 * HW workaround, need to write this twice for issue
1993 * that may result in first write getting masked.
1994 */
1995 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1996 POSTING_READ(intel_hdmi->hdmi_reg);
1997 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1998 POSTING_READ(intel_hdmi->hdmi_reg);
1999
2000 temp &= ~SDVO_ENABLE;
2001 I915_WRITE(intel_hdmi->hdmi_reg, temp);
2002 POSTING_READ(intel_hdmi->hdmi_reg);
0c241d5b 2003
0f0f74bc 2004 intel_wait_for_vblank_if_active(dev_priv, PIPE_A);
0c241d5b
VS
2005 intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
2006 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
1612c8bd 2007 }
6d67415f 2008
790ea70c
VS
2009 intel_dig_port->set_infoframes(encoder,
2010 false,
f99be1b3 2011 old_crtc_state, old_conn_state);
b2ccb822
VS
2012
2013 intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);
7d57382e
EA
2014}
2015
fd6bbda9 2016static void g4x_disable_hdmi(struct intel_encoder *encoder,
5f88a9c6
VS
2017 const struct intel_crtc_state *old_crtc_state,
2018 const struct drm_connector_state *old_conn_state)
a4790cec 2019{
df18e721 2020 if (old_crtc_state->has_audio)
8ec47de2
VS
2021 intel_audio_codec_disable(encoder,
2022 old_crtc_state, old_conn_state);
a4790cec 2023
fd6bbda9 2024 intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
a4790cec
VS
2025}
2026
fd6bbda9 2027static void pch_disable_hdmi(struct intel_encoder *encoder,
5f88a9c6
VS
2028 const struct intel_crtc_state *old_crtc_state,
2029 const struct drm_connector_state *old_conn_state)
a4790cec 2030{
df18e721 2031 if (old_crtc_state->has_audio)
8ec47de2
VS
2032 intel_audio_codec_disable(encoder,
2033 old_crtc_state, old_conn_state);
a4790cec
VS
2034}
2035
fd6bbda9 2036static void pch_post_disable_hdmi(struct intel_encoder *encoder,
5f88a9c6
VS
2037 const struct intel_crtc_state *old_crtc_state,
2038 const struct drm_connector_state *old_conn_state)
a4790cec 2039{
fd6bbda9 2040 intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
a4790cec
VS
2041}
2042
d6038611 2043static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
7d148ef5 2044{
d6038611
VS
2045 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2046 const struct ddi_vbt_port_info *info =
2047 &dev_priv->vbt.ddi_port_info[encoder->port];
2048 int max_tmds_clock;
2049
9672a69c 2050 if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
d6038611
VS
2051 max_tmds_clock = 594000;
2052 else if (INTEL_GEN(dev_priv) >= 8 || IS_HASWELL(dev_priv))
2053 max_tmds_clock = 300000;
2054 else if (INTEL_GEN(dev_priv) >= 5)
2055 max_tmds_clock = 225000;
7d148ef5 2056 else
d6038611
VS
2057 max_tmds_clock = 165000;
2058
2059 if (info->max_tmds_clock)
2060 max_tmds_clock = min(max_tmds_clock, info->max_tmds_clock);
2061
2062 return max_tmds_clock;
7d148ef5
DV
2063}
2064
b1ba124d 2065static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
7a5ca19f
ML
2066 bool respect_downstream_limits,
2067 bool force_dvi)
b1ba124d 2068{
d6038611
VS
2069 struct intel_encoder *encoder = &hdmi_to_dig_port(hdmi)->base;
2070 int max_tmds_clock = intel_hdmi_source_max_tmds_clock(encoder);
b1ba124d
VS
2071
2072 if (respect_downstream_limits) {
8cadab0a
VS
2073 struct intel_connector *connector = hdmi->attached_connector;
2074 const struct drm_display_info *info = &connector->base.display_info;
2075
b1ba124d
VS
2076 if (hdmi->dp_dual_mode.max_tmds_clock)
2077 max_tmds_clock = min(max_tmds_clock,
2078 hdmi->dp_dual_mode.max_tmds_clock);
8cadab0a
VS
2079
2080 if (info->max_tmds_clock)
2081 max_tmds_clock = min(max_tmds_clock,
2082 info->max_tmds_clock);
7a5ca19f 2083 else if (!hdmi->has_hdmi_sink || force_dvi)
b1ba124d
VS
2084 max_tmds_clock = min(max_tmds_clock, 165000);
2085 }
2086
2087 return max_tmds_clock;
2088}
2089
e64e739e
VS
2090static enum drm_mode_status
2091hdmi_port_clock_valid(struct intel_hdmi *hdmi,
7a5ca19f
ML
2092 int clock, bool respect_downstream_limits,
2093 bool force_dvi)
e64e739e 2094{
e2d214ae 2095 struct drm_i915_private *dev_priv = to_i915(intel_hdmi_to_dev(hdmi));
e64e739e
VS
2096
2097 if (clock < 25000)
2098 return MODE_CLOCK_LOW;
7a5ca19f 2099 if (clock > hdmi_port_clock_limit(hdmi, respect_downstream_limits, force_dvi))
e64e739e
VS
2100 return MODE_CLOCK_HIGH;
2101
5e6ccc0b 2102 /* BXT DPLL can't generate 223-240 MHz */
cc3f90f0 2103 if (IS_GEN9_LP(dev_priv) && clock > 223333 && clock < 240000)
5e6ccc0b
VS
2104 return MODE_CLOCK_RANGE;
2105
2106 /* CHV DPLL can't generate 216-240 MHz */
e2d214ae 2107 if (IS_CHERRYVIEW(dev_priv) && clock > 216000 && clock < 240000)
e64e739e
VS
2108 return MODE_CLOCK_RANGE;
2109
2110 return MODE_OK;
2111}
2112
c19de8eb
DL
2113static enum drm_mode_status
2114intel_hdmi_mode_valid(struct drm_connector *connector,
2115 struct drm_display_mode *mode)
7d57382e 2116{
e64e739e
VS
2117 struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
2118 struct drm_device *dev = intel_hdmi_to_dev(hdmi);
49cff963 2119 struct drm_i915_private *dev_priv = to_i915(dev);
e64e739e
VS
2120 enum drm_mode_status status;
2121 int clock;
587bf496 2122 int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
7a5ca19f
ML
2123 bool force_dvi =
2124 READ_ONCE(to_intel_digital_connector_state(connector->state)->force_audio) == HDMI_AUDIO_OFF_DVI;
e64e739e 2125
e4dd27aa
VS
2126 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
2127 return MODE_NO_DBLESCAN;
2128
e64e739e 2129 clock = mode->clock;
587bf496
MK
2130
2131 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING)
2132 clock *= 2;
2133
2134 if (clock > max_dotclk)
2135 return MODE_CLOCK_HIGH;
2136
697c4078
CT
2137 if (mode->flags & DRM_MODE_FLAG_DBLCLK)
2138 clock *= 2;
2139
b22ca995
SS
2140 if (drm_mode_is_420_only(&connector->display_info, mode))
2141 clock /= 2;
2142
e64e739e 2143 /* check if we can do 8bpc */
7a5ca19f 2144 status = hdmi_port_clock_valid(hdmi, clock, true, force_dvi);
7d57382e 2145
cd9e11a8
RS
2146 if (hdmi->has_hdmi_sink && !force_dvi) {
2147 /* if we can't do 8bpc we may still be able to do 12bpc */
b2ae318a 2148 if (status != MODE_OK && !HAS_GMCH(dev_priv))
cd9e11a8
RS
2149 status = hdmi_port_clock_valid(hdmi, clock * 3 / 2,
2150 true, force_dvi);
2151
2152 /* if we can't do 8,12bpc we may still be able to do 10bpc */
2153 if (status != MODE_OK && INTEL_GEN(dev_priv) >= 11)
2154 status = hdmi_port_clock_valid(hdmi, clock * 5 / 4,
2155 true, force_dvi);
2156 }
7d57382e 2157
e64e739e 2158 return status;
7d57382e
EA
2159}
2160
cd9e11a8
RS
2161static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state,
2162 int bpc)
71800632 2163{
c750bdd3
VS
2164 struct drm_i915_private *dev_priv =
2165 to_i915(crtc_state->base.crtc->dev);
2166 struct drm_atomic_state *state = crtc_state->base.state;
2167 struct drm_connector_state *connector_state;
2168 struct drm_connector *connector;
22dae8a0
RS
2169 const struct drm_display_mode *adjusted_mode =
2170 &crtc_state->base.adjusted_mode;
c750bdd3 2171 int i;
71800632 2172
b2ae318a 2173 if (HAS_GMCH(dev_priv))
71800632
VS
2174 return false;
2175
cd9e11a8
RS
2176 if (bpc == 10 && INTEL_GEN(dev_priv) < 11)
2177 return false;
2178
be33be5d
VS
2179 if (crtc_state->pipe_bpp <= 8*3)
2180 return false;
2181
2182 if (!crtc_state->has_hdmi_sink)
2183 return false;
2184
71800632 2185 /*
cd9e11a8 2186 * HDMI deep color affects the clocks, so it's only possible
71800632
VS
2187 * when not cloning with other encoder types.
2188 */
c750bdd3
VS
2189 if (crtc_state->output_types != 1 << INTEL_OUTPUT_HDMI)
2190 return false;
2191
fe5f6b1f 2192 for_each_new_connector_in_state(state, connector, connector_state, i) {
c750bdd3
VS
2193 const struct drm_display_info *info = &connector->display_info;
2194
2195 if (connector_state->crtc != crtc_state->base.crtc)
2196 continue;
2197
33b7f3ee 2198 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) {
60436fd4
SS
2199 const struct drm_hdmi_info *hdmi = &info->hdmi;
2200
cd9e11a8
RS
2201 if (bpc == 12 && !(hdmi->y420_dc_modes &
2202 DRM_EDID_YCBCR420_DC_36))
2203 return false;
2204 else if (bpc == 10 && !(hdmi->y420_dc_modes &
2205 DRM_EDID_YCBCR420_DC_30))
60436fd4
SS
2206 return false;
2207 } else {
cd9e11a8
RS
2208 if (bpc == 12 && !(info->edid_hdmi_dc_modes &
2209 DRM_EDID_HDMI_DC_36))
2210 return false;
2211 else if (bpc == 10 && !(info->edid_hdmi_dc_modes &
2212 DRM_EDID_HDMI_DC_30))
60436fd4
SS
2213 return false;
2214 }
c750bdd3
VS
2215 }
2216
2abf3c0d 2217 /* Display WA #1139: glk */
cd9e11a8 2218 if (bpc == 12 && IS_GLK_REVID(dev_priv, 0, GLK_REVID_A1) &&
22dae8a0
RS
2219 adjusted_mode->htotal > 5460)
2220 return false;
2221
2222 /* Display Wa_1405510057:icl */
2223 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 &&
2dd24a9c 2224 bpc == 10 && INTEL_GEN(dev_priv) >= 11 &&
22dae8a0
RS
2225 (adjusted_mode->crtc_hblank_end -
2226 adjusted_mode->crtc_hblank_start) % 8 == 2)
46649d8b
ACO
2227 return false;
2228
c750bdd3 2229 return true;
71800632
VS
2230}
2231
60436fd4
SS
2232static bool
2233intel_hdmi_ycbcr420_config(struct drm_connector *connector,
2234 struct intel_crtc_state *config,
cd9e11a8
RS
2235 int *clock_12bpc, int *clock_10bpc,
2236 int *clock_8bpc)
60436fd4 2237{
e5c05931
SS
2238 struct intel_crtc *intel_crtc = to_intel_crtc(config->base.crtc);
2239
60436fd4
SS
2240 if (!connector->ycbcr_420_allowed) {
2241 DRM_ERROR("Platform doesn't support YCBCR420 output\n");
2242 return false;
2243 }
2244
2245 /* YCBCR420 TMDS rate requirement is half the pixel clock */
2246 config->port_clock /= 2;
2247 *clock_12bpc /= 2;
cd9e11a8 2248 *clock_10bpc /= 2;
60436fd4 2249 *clock_8bpc /= 2;
33b7f3ee 2250 config->output_format = INTEL_OUTPUT_FORMAT_YCBCR420;
e5c05931
SS
2251
2252 /* YCBCR 420 output conversion needs a scaler */
2253 if (skl_update_scaler_crtc(config)) {
2254 DRM_DEBUG_KMS("Scaler allocation for output failed\n");
2255 return false;
2256 }
2257
2258 intel_pch_panel_fitting(intel_crtc, config,
2259 DRM_MODE_SCALE_FULLSCREEN);
2260
60436fd4
SS
2261 return true;
2262}
2263
204474a6
LP
2264int intel_hdmi_compute_config(struct intel_encoder *encoder,
2265 struct intel_crtc_state *pipe_config,
2266 struct drm_connector_state *conn_state)
7d57382e 2267{
5bfe2ac0 2268 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
4f8036a2 2269 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2d112de7 2270 struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
60436fd4
SS
2271 struct drm_connector *connector = conn_state->connector;
2272 struct drm_scdc *scdc = &connector->display_info.hdmi.scdc;
7a5ca19f
ML
2273 struct intel_digital_connector_state *intel_conn_state =
2274 to_intel_digital_connector_state(conn_state);
e64e739e 2275 int clock_8bpc = pipe_config->base.adjusted_mode.crtc_clock;
cd9e11a8 2276 int clock_10bpc = clock_8bpc * 5 / 4;
e64e739e 2277 int clock_12bpc = clock_8bpc * 3 / 2;
e29c22c0 2278 int desired_bpp;
7a5ca19f 2279 bool force_dvi = intel_conn_state->force_audio == HDMI_AUDIO_OFF_DVI;
3685a8f3 2280
e4dd27aa 2281 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
204474a6 2282 return -EINVAL;
e4dd27aa 2283
d9facae6 2284 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
7a5ca19f 2285 pipe_config->has_hdmi_sink = !force_dvi && intel_hdmi->has_hdmi_sink;
6897b4b5 2286
e43823ec
JB
2287 if (pipe_config->has_hdmi_sink)
2288 pipe_config->has_infoframe = true;
2289
7a5ca19f 2290 if (intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_AUTO) {
55bc60db 2291 /* See CEA-861-E - 5.1 Default Encoding Parameters */
0f2a2a75
VS
2292 pipe_config->limited_color_range =
2293 pipe_config->has_hdmi_sink &&
c8127cf0
VS
2294 drm_default_rgb_quant_range(adjusted_mode) ==
2295 HDMI_QUANTIZATION_RANGE_LIMITED;
0f2a2a75
VS
2296 } else {
2297 pipe_config->limited_color_range =
7a5ca19f 2298 intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_LIMITED;
55bc60db
VS
2299 }
2300
697c4078
CT
2301 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
2302 pipe_config->pixel_multiplier = 2;
e64e739e 2303 clock_8bpc *= 2;
cd9e11a8 2304 clock_10bpc *= 2;
3320e37f 2305 clock_12bpc *= 2;
697c4078
CT
2306 }
2307
60436fd4
SS
2308 if (drm_mode_is_420_only(&connector->display_info, adjusted_mode)) {
2309 if (!intel_hdmi_ycbcr420_config(connector, pipe_config,
cd9e11a8
RS
2310 &clock_12bpc, &clock_10bpc,
2311 &clock_8bpc)) {
60436fd4 2312 DRM_ERROR("Can't support YCBCR420 output\n");
204474a6 2313 return -EINVAL;
60436fd4
SS
2314 }
2315 }
2316
4f8036a2 2317 if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv))
5bfe2ac0
DV
2318 pipe_config->has_pch_encoder = true;
2319
7a5ca19f
ML
2320 if (pipe_config->has_hdmi_sink) {
2321 if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
2322 pipe_config->has_audio = intel_hdmi->has_audio;
2323 else
2324 pipe_config->has_audio =
2325 intel_conn_state->force_audio == HDMI_AUDIO_ON;
2326 }
9ed109a7 2327
4e53c2e0 2328 /*
cd9e11a8
RS
2329 * Note that g4x/vlv don't support 12bpc hdmi outputs. We also need
2330 * to check that the higher clock still fits within limits.
4e53c2e0 2331 */
cd9e11a8
RS
2332 if (hdmi_deep_color_possible(pipe_config, 12) &&
2333 hdmi_port_clock_valid(intel_hdmi, clock_12bpc,
2334 true, force_dvi) == MODE_OK) {
e29c22c0
DV
2335 DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
2336 desired_bpp = 12*3;
325b9d04
DV
2337
2338 /* Need to adjust the port link by 1.5x for 12bpc. */
ff9a6750 2339 pipe_config->port_clock = clock_12bpc;
cd9e11a8
RS
2340 } else if (hdmi_deep_color_possible(pipe_config, 10) &&
2341 hdmi_port_clock_valid(intel_hdmi, clock_10bpc,
2342 true, force_dvi) == MODE_OK) {
2343 DRM_DEBUG_KMS("picking bpc to 10 for HDMI output\n");
2344 desired_bpp = 10 * 3;
2345
2346 /* Need to adjust the port link by 1.25x for 10bpc. */
2347 pipe_config->port_clock = clock_10bpc;
4e53c2e0 2348 } else {
e29c22c0
DV
2349 DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
2350 desired_bpp = 8*3;
e64e739e
VS
2351
2352 pipe_config->port_clock = clock_8bpc;
e29c22c0
DV
2353 }
2354
2355 if (!pipe_config->bw_constrained) {
b64b7a60 2356 DRM_DEBUG_KMS("forcing pipe bpp to %i for HDMI\n", desired_bpp);
e29c22c0 2357 pipe_config->pipe_bpp = desired_bpp;
4e53c2e0
DV
2358 }
2359
e64e739e 2360 if (hdmi_port_clock_valid(intel_hdmi, pipe_config->port_clock,
7a5ca19f 2361 false, force_dvi) != MODE_OK) {
e64e739e 2362 DRM_DEBUG_KMS("unsupported HDMI clock, rejecting mode\n");
204474a6 2363 return -EINVAL;
325b9d04
DV
2364 }
2365
28b468a0 2366 /* Set user selected PAR to incoming mode's member */
0e9f25d0 2367 adjusted_mode->picture_aspect_ratio = conn_state->picture_aspect_ratio;
28b468a0 2368
d4d6279a
ACO
2369 pipe_config->lane_count = 4;
2370
9672a69c
RV
2371 if (scdc->scrambling.supported && (INTEL_GEN(dev_priv) >= 10 ||
2372 IS_GEMINILAKE(dev_priv))) {
15953637
SS
2373 if (scdc->scrambling.low_rates)
2374 pipe_config->hdmi_scrambling = true;
2375
2376 if (pipe_config->port_clock > 340000) {
2377 pipe_config->hdmi_scrambling = true;
2378 pipe_config->hdmi_high_tmds_clock_ratio = true;
2379 }
2380 }
2381
fbf08556
VS
2382 intel_hdmi_compute_gcp_infoframe(encoder, pipe_config, conn_state);
2383
2384 if (!intel_hdmi_compute_avi_infoframe(encoder, pipe_config, conn_state)) {
2385 DRM_DEBUG_KMS("bad AVI infoframe\n");
2386 return -EINVAL;
2387 }
2388
2389 if (!intel_hdmi_compute_spd_infoframe(encoder, pipe_config, conn_state)) {
2390 DRM_DEBUG_KMS("bad SPD infoframe\n");
2391 return -EINVAL;
2392 }
2393
2394 if (!intel_hdmi_compute_hdmi_infoframe(encoder, pipe_config, conn_state)) {
2395 DRM_DEBUG_KMS("bad HDMI infoframe\n");
2396 return -EINVAL;
2397 }
2398
204474a6 2399 return 0;
7d57382e
EA
2400}
2401
953ece69
CW
2402static void
2403intel_hdmi_unset_edid(struct drm_connector *connector)
9dff6af8 2404{
df0e9248 2405 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
9dff6af8 2406
953ece69
CW
2407 intel_hdmi->has_hdmi_sink = false;
2408 intel_hdmi->has_audio = false;
953ece69 2409
b1ba124d
VS
2410 intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
2411 intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
2412
953ece69
CW
2413 kfree(to_intel_connector(connector)->detect_edid);
2414 to_intel_connector(connector)->detect_edid = NULL;
2415}
2416
b1ba124d 2417static void
d6199256 2418intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
b1ba124d
VS
2419{
2420 struct drm_i915_private *dev_priv = to_i915(connector->dev);
2421 struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
8f4f2797 2422 enum port port = hdmi_to_dig_port(hdmi)->base.port;
b1ba124d
VS
2423 struct i2c_adapter *adapter =
2424 intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);
2425 enum drm_dp_dual_mode_type type = drm_dp_dual_mode_detect(adapter);
2426
d6199256
VS
2427 /*
2428 * Type 1 DVI adaptors are not required to implement any
2429 * registers, so we can't always detect their presence.
2430 * Ideally we should be able to check the state of the
2431 * CONFIG1 pin, but no such luck on our hardware.
2432 *
2433 * The only method left to us is to check the VBT to see
2434 * if the port is a dual mode capable DP port. But let's
2435 * only do that when we sucesfully read the EDID, to avoid
2436 * confusing log messages about DP dual mode adaptors when
2437 * there's nothing connected to the port.
2438 */
2439 if (type == DRM_DP_DUAL_MODE_UNKNOWN) {
30190629
AJ
2440 /* An overridden EDID imply that we want this port for testing.
2441 * Make sure not to set limits for that port.
2442 */
2443 if (has_edid && !connector->override_edid &&
d6199256
VS
2444 intel_bios_is_port_dp_dual_mode(dev_priv, port)) {
2445 DRM_DEBUG_KMS("Assuming DP dual mode adaptor presence based on VBT\n");
2446 type = DRM_DP_DUAL_MODE_TYPE1_DVI;
2447 } else {
2448 type = DRM_DP_DUAL_MODE_NONE;
2449 }
2450 }
2451
2452 if (type == DRM_DP_DUAL_MODE_NONE)
b1ba124d
VS
2453 return;
2454
2455 hdmi->dp_dual_mode.type = type;
2456 hdmi->dp_dual_mode.max_tmds_clock =
2457 drm_dp_dual_mode_max_tmds_clock(type, adapter);
2458
2459 DRM_DEBUG_KMS("DP dual mode adaptor (%s) detected (max TMDS clock: %d kHz)\n",
2460 drm_dp_get_dual_mode_type_name(type),
2461 hdmi->dp_dual_mode.max_tmds_clock);
2462}
2463
953ece69 2464static bool
23f889bd 2465intel_hdmi_set_edid(struct drm_connector *connector)
953ece69
CW
2466{
2467 struct drm_i915_private *dev_priv = to_i915(connector->dev);
2468 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
0e6e0be4 2469 intel_wakeref_t wakeref;
23f889bd 2470 struct edid *edid;
953ece69 2471 bool connected = false;
cfb926e1 2472 struct i2c_adapter *i2c;
164c8598 2473
0e6e0be4 2474 wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
671dedd2 2475
cfb926e1
SB
2476 i2c = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
2477
2478 edid = drm_get_edid(connector, i2c);
2479
2480 if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
2481 DRM_DEBUG_KMS("HDMI GMBUS EDID read failed, retry using GPIO bit-banging\n");
2482 intel_gmbus_force_bit(i2c, true);
2483 edid = drm_get_edid(connector, i2c);
2484 intel_gmbus_force_bit(i2c, false);
2485 }
2ded9e27 2486
23f889bd 2487 intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
b1ba124d 2488
0e6e0be4 2489 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);
30ad48b7 2490
953ece69
CW
2491 to_intel_connector(connector)->detect_edid = edid;
2492 if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
953ece69 2493 intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
7a5ca19f 2494 intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
953ece69
CW
2495
2496 connected = true;
55b7d6e8
CW
2497 }
2498
9c229127
NA
2499 cec_notifier_set_phys_addr_from_edid(intel_hdmi->cec_notifier, edid);
2500
953ece69
CW
2501 return connected;
2502}
2503
8166fcea
DV
2504static enum drm_connector_status
2505intel_hdmi_detect(struct drm_connector *connector, bool force)
953ece69 2506{
39d1e234 2507 enum drm_connector_status status = connector_status_disconnected;
8166fcea 2508 struct drm_i915_private *dev_priv = to_i915(connector->dev);
9c229127 2509 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
39d1e234 2510 struct intel_encoder *encoder = &hdmi_to_dig_port(intel_hdmi)->base;
0e6e0be4 2511 intel_wakeref_t wakeref;
953ece69 2512
8166fcea
DV
2513 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
2514 connector->base.id, connector->name);
2515
0e6e0be4 2516 wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
29bb94bb 2517
2dd24a9c 2518 if (INTEL_GEN(dev_priv) >= 11 &&
39d1e234
PZ
2519 !intel_digital_port_connected(encoder))
2520 goto out;
2521
8166fcea 2522 intel_hdmi_unset_edid(connector);
0b5e88dc 2523
7e732cac 2524 if (intel_hdmi_set_edid(connector))
953ece69 2525 status = connector_status_connected;
671dedd2 2526
39d1e234 2527out:
0e6e0be4 2528 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);
29bb94bb 2529
9c229127
NA
2530 if (status != connector_status_connected)
2531 cec_notifier_phys_addr_invalidate(intel_hdmi->cec_notifier);
2532
2ded9e27 2533 return status;
7d57382e
EA
2534}
2535
953ece69
CW
2536static void
2537intel_hdmi_force(struct drm_connector *connector)
7d57382e 2538{
953ece69
CW
2539 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
2540 connector->base.id, connector->name);
7d57382e 2541
953ece69 2542 intel_hdmi_unset_edid(connector);
671dedd2 2543
953ece69
CW
2544 if (connector->status != connector_status_connected)
2545 return;
671dedd2 2546
23f889bd 2547 intel_hdmi_set_edid(connector);
953ece69 2548}
671dedd2 2549
953ece69
CW
2550static int intel_hdmi_get_modes(struct drm_connector *connector)
2551{
2552 struct edid *edid;
2553
2554 edid = to_intel_connector(connector)->detect_edid;
2555 if (edid == NULL)
2556 return 0;
671dedd2 2557
953ece69 2558 return intel_connector_update_modes(connector, edid);
7d57382e
EA
2559}
2560
fd6bbda9 2561static void intel_hdmi_pre_enable(struct intel_encoder *encoder,
5f88a9c6
VS
2562 const struct intel_crtc_state *pipe_config,
2563 const struct drm_connector_state *conn_state)
13732ba7 2564{
f99be1b3
VS
2565 struct intel_digital_port *intel_dig_port =
2566 enc_to_dig_port(&encoder->base);
13732ba7 2567
ac240288 2568 intel_hdmi_prepare(encoder, pipe_config);
4cde8a21 2569
790ea70c 2570 intel_dig_port->set_infoframes(encoder,
f99be1b3
VS
2571 pipe_config->has_infoframe,
2572 pipe_config, conn_state);
13732ba7
JB
2573}
2574
fd6bbda9 2575static void vlv_hdmi_pre_enable(struct intel_encoder *encoder,
5f88a9c6
VS
2576 const struct intel_crtc_state *pipe_config,
2577 const struct drm_connector_state *conn_state)
89b667f8
JB
2578{
2579 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
2e1029c6 2580 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
5f68c275 2581
2e1029c6 2582 vlv_phy_pre_encoder_enable(encoder, pipe_config);
b76cf76b 2583
53d98725
ACO
2584 /* HDMI 1.0V-2dB */
2585 vlv_set_phy_signal_level(encoder, 0x2b245f5f, 0x00002000, 0x5578b83a,
2586 0x2b247878);
2587
790ea70c 2588 dport->set_infoframes(encoder,
f99be1b3
VS
2589 pipe_config->has_infoframe,
2590 pipe_config, conn_state);
13732ba7 2591
fd6bbda9 2592 g4x_enable_hdmi(encoder, pipe_config, conn_state);
b76cf76b 2593
9b6de0a1 2594 vlv_wait_port_ready(dev_priv, dport, 0x0);
89b667f8
JB
2595}
2596
fd6bbda9 2597static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
5f88a9c6
VS
2598 const struct intel_crtc_state *pipe_config,
2599 const struct drm_connector_state *conn_state)
89b667f8 2600{
ac240288 2601 intel_hdmi_prepare(encoder, pipe_config);
4cde8a21 2602
2e1029c6 2603 vlv_phy_pre_pll_enable(encoder, pipe_config);
89b667f8
JB
2604}
2605
fd6bbda9 2606static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
5f88a9c6
VS
2607 const struct intel_crtc_state *pipe_config,
2608 const struct drm_connector_state *conn_state)
9197c88b 2609{
ac240288 2610 intel_hdmi_prepare(encoder, pipe_config);
625695f8 2611
2e1029c6 2612 chv_phy_pre_pll_enable(encoder, pipe_config);
9197c88b
VS
2613}
2614
fd6bbda9 2615static void chv_hdmi_post_pll_disable(struct intel_encoder *encoder,
5f88a9c6
VS
2616 const struct intel_crtc_state *old_crtc_state,
2617 const struct drm_connector_state *old_conn_state)
d6db995f 2618{
2e1029c6 2619 chv_phy_post_pll_disable(encoder, old_crtc_state);
d6db995f
VS
2620}
2621
fd6bbda9 2622static void vlv_hdmi_post_disable(struct intel_encoder *encoder,
5f88a9c6
VS
2623 const struct intel_crtc_state *old_crtc_state,
2624 const struct drm_connector_state *old_conn_state)
89b667f8 2625{
89b667f8 2626 /* Reset lanes to avoid HDMI flicker (VLV w/a) */
2e1029c6 2627 vlv_phy_reset_lanes(encoder, old_crtc_state);
89b667f8
JB
2628}
2629
fd6bbda9 2630static void chv_hdmi_post_disable(struct intel_encoder *encoder,
5f88a9c6
VS
2631 const struct intel_crtc_state *old_crtc_state,
2632 const struct drm_connector_state *old_conn_state)
580d3811 2633{
580d3811 2634 struct drm_device *dev = encoder->base.dev;
fac5e23e 2635 struct drm_i915_private *dev_priv = to_i915(dev);
580d3811 2636
221c7862 2637 vlv_dpio_get(dev_priv);
580d3811 2638
a8f327fb 2639 /* Assert data lane reset */
2e1029c6 2640 chv_data_lane_soft_reset(encoder, old_crtc_state, true);
580d3811 2641
221c7862 2642 vlv_dpio_put(dev_priv);
580d3811
VS
2643}
2644
fd6bbda9 2645static void chv_hdmi_pre_enable(struct intel_encoder *encoder,
5f88a9c6
VS
2646 const struct intel_crtc_state *pipe_config,
2647 const struct drm_connector_state *conn_state)
e4a1d846
CML
2648{
2649 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
2650 struct drm_device *dev = encoder->base.dev;
fac5e23e 2651 struct drm_i915_private *dev_priv = to_i915(dev);
2e523e98 2652
2e1029c6 2653 chv_phy_pre_encoder_enable(encoder, pipe_config);
a02ef3c7 2654
e4a1d846
CML
2655 /* FIXME: Program the support xxx V-dB */
2656 /* Use 800mV-0dB */
b7fa22d8 2657 chv_set_phy_signal_level(encoder, 128, 102, false);
e4a1d846 2658
790ea70c 2659 dport->set_infoframes(encoder,
f99be1b3
VS
2660 pipe_config->has_infoframe,
2661 pipe_config, conn_state);
b4eb1564 2662
fd6bbda9 2663 g4x_enable_hdmi(encoder, pipe_config, conn_state);
e4a1d846 2664
9b6de0a1 2665 vlv_wait_port_ready(dev_priv, dport, 0x0);
b0b33846
VS
2666
2667 /* Second common lane will stay alive on its own now */
e7d2a717 2668 chv_phy_release_cl2_override(encoder);
e4a1d846
CML
2669}
2670
bdc93fe0
R
2671static int
2672intel_hdmi_connector_register(struct drm_connector *connector)
2673{
2674 int ret;
2675
2676 ret = intel_connector_register(connector);
2677 if (ret)
2678 return ret;
2679
2680 i915_debugfs_connector_add(connector);
2681
2682 return ret;
2683}
2684
7d57382e
EA
2685static void intel_hdmi_destroy(struct drm_connector *connector)
2686{
9c229127
NA
2687 if (intel_attached_hdmi(connector)->cec_notifier)
2688 cec_notifier_put(intel_attached_hdmi(connector)->cec_notifier);
d4b26e4f
JN
2689
2690 intel_connector_destroy(connector);
7d57382e
EA
2691}
2692
7d57382e 2693static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
7d57382e 2694 .detect = intel_hdmi_detect,
953ece69 2695 .force = intel_hdmi_force,
7d57382e 2696 .fill_modes = drm_helper_probe_single_connector_modes,
7a5ca19f
ML
2697 .atomic_get_property = intel_digital_connector_atomic_get_property,
2698 .atomic_set_property = intel_digital_connector_atomic_set_property,
bdc93fe0 2699 .late_register = intel_hdmi_connector_register,
c191eca1 2700 .early_unregister = intel_connector_unregister,
7d57382e 2701 .destroy = intel_hdmi_destroy,
c6f95f27 2702 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
7a5ca19f 2703 .atomic_duplicate_state = intel_digital_connector_duplicate_state,
7d57382e
EA
2704};
2705
2706static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
2707 .get_modes = intel_hdmi_get_modes,
2708 .mode_valid = intel_hdmi_mode_valid,
7a5ca19f 2709 .atomic_check = intel_digital_connector_atomic_check,
7d57382e
EA
2710};
2711
7d57382e 2712static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
ea5b213a 2713 .destroy = intel_encoder_destroy,
7d57382e
EA
2714};
2715
55b7d6e8
CW
2716static void
2717intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
2718{
f1a12172 2719 struct drm_i915_private *dev_priv = to_i915(connector->dev);
2f146b78
US
2720 struct intel_digital_port *intel_dig_port =
2721 hdmi_to_dig_port(intel_hdmi);
f1a12172 2722
3f43c48d 2723 intel_attach_force_audio_property(connector);
e953fd7b 2724 intel_attach_broadcast_rgb_property(connector);
94a11ddc 2725 intel_attach_aspect_ratio_property(connector);
2f146b78
US
2726
2727 /*
2728 * Attach Colorspace property for Non LSPCON based device
2729 * ToDo: This needs to be extended for LSPCON implementation
2730 * as well. Will be implemented separately.
2731 */
2732 if (!intel_dig_port->lspcon.active)
2733 intel_attach_colorspace_property(connector);
2734
6553b123 2735 drm_connector_attach_content_type_property(connector);
0e9f25d0 2736 connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
f1a12172 2737
b2ae318a 2738 if (!HAS_GMCH(dev_priv))
f1a12172 2739 drm_connector_attach_max_bpc_property(connector, 8, 12);
55b7d6e8
CW
2740}
2741
15953637
SS
2742/*
2743 * intel_hdmi_handle_sink_scrambling: handle sink scrambling/clock ratio setup
2744 * @encoder: intel_encoder
2745 * @connector: drm_connector
2746 * @high_tmds_clock_ratio = bool to indicate if the function needs to set
2747 * or reset the high tmds clock ratio for scrambling
2748 * @scrambling: bool to Indicate if the function needs to set or reset
2749 * sink scrambling
2750 *
2751 * This function handles scrambling on HDMI 2.0 capable sinks.
2752 * If required clock rate is > 340 Mhz && scrambling is supported by sink
2753 * it enables scrambling. This should be called before enabling the HDMI
2754 * 2.0 port, as the sink can choose to disable the scrambling if it doesn't
2755 * detect a scrambled clock within 100 ms.
277ab5ab
VS
2756 *
2757 * Returns:
2758 * True on success, false on failure.
15953637 2759 */
277ab5ab 2760bool intel_hdmi_handle_sink_scrambling(struct intel_encoder *encoder,
15953637
SS
2761 struct drm_connector *connector,
2762 bool high_tmds_clock_ratio,
2763 bool scrambling)
2764{
277ab5ab 2765 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
15953637 2766 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
15953637 2767 struct drm_scrambling *sink_scrambling =
277ab5ab
VS
2768 &connector->display_info.hdmi.scdc.scrambling;
2769 struct i2c_adapter *adapter =
2770 intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
15953637
SS
2771
2772 if (!sink_scrambling->supported)
277ab5ab 2773 return true;
15953637 2774
277ab5ab
VS
2775 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] scrambling=%s, TMDS bit clock ratio=1/%d\n",
2776 connector->base.id, connector->name,
2777 yesno(scrambling), high_tmds_clock_ratio ? 40 : 10);
15953637 2778
277ab5ab
VS
2779 /* Set TMDS bit clock ratio to 1/40 or 1/10, and enable/disable scrambling */
2780 return drm_scdc_set_high_tmds_clock_ratio(adapter,
2781 high_tmds_clock_ratio) &&
2782 drm_scdc_set_scrambling(adapter, scrambling);
15953637
SS
2783}
2784
cec3bb01 2785static u8 chv_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
e4ab73a1 2786{
e4ab73a1
VS
2787 u8 ddc_pin;
2788
cec3bb01
AS
2789 switch (port) {
2790 case PORT_B:
2791 ddc_pin = GMBUS_PIN_DPB;
2792 break;
2793 case PORT_C:
2794 ddc_pin = GMBUS_PIN_DPC;
2795 break;
2796 case PORT_D:
2797 ddc_pin = GMBUS_PIN_DPD_CHV;
2798 break;
2799 default:
2800 MISSING_CASE(port);
2801 ddc_pin = GMBUS_PIN_DPB;
2802 break;
e4ab73a1 2803 }
cec3bb01
AS
2804 return ddc_pin;
2805}
2806
2807static u8 bxt_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2808{
2809 u8 ddc_pin;
e4ab73a1
VS
2810
2811 switch (port) {
2812 case PORT_B:
cec3bb01 2813 ddc_pin = GMBUS_PIN_1_BXT;
e4ab73a1
VS
2814 break;
2815 case PORT_C:
cec3bb01
AS
2816 ddc_pin = GMBUS_PIN_2_BXT;
2817 break;
2818 default:
2819 MISSING_CASE(port);
2820 ddc_pin = GMBUS_PIN_1_BXT;
2821 break;
2822 }
2823 return ddc_pin;
2824}
2825
2826static u8 cnp_port_to_ddc_pin(struct drm_i915_private *dev_priv,
2827 enum port port)
2828{
2829 u8 ddc_pin;
2830
2831 switch (port) {
2832 case PORT_B:
2833 ddc_pin = GMBUS_PIN_1_BXT;
2834 break;
2835 case PORT_C:
2836 ddc_pin = GMBUS_PIN_2_BXT;
e4ab73a1
VS
2837 break;
2838 case PORT_D:
cec3bb01
AS
2839 ddc_pin = GMBUS_PIN_4_CNP;
2840 break;
3a2a59cc
RV
2841 case PORT_F:
2842 ddc_pin = GMBUS_PIN_3_BXT;
2843 break;
cec3bb01
AS
2844 default:
2845 MISSING_CASE(port);
2846 ddc_pin = GMBUS_PIN_1_BXT;
2847 break;
2848 }
2849 return ddc_pin;
2850}
2851
5c749c52
AS
2852static u8 icl_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2853{
2854 u8 ddc_pin;
2855
2856 switch (port) {
2857 case PORT_A:
2858 ddc_pin = GMBUS_PIN_1_BXT;
2859 break;
2860 case PORT_B:
2861 ddc_pin = GMBUS_PIN_2_BXT;
2862 break;
2863 case PORT_C:
2864 ddc_pin = GMBUS_PIN_9_TC1_ICP;
2865 break;
2866 case PORT_D:
2867 ddc_pin = GMBUS_PIN_10_TC2_ICP;
2868 break;
2869 case PORT_E:
2870 ddc_pin = GMBUS_PIN_11_TC3_ICP;
2871 break;
2872 case PORT_F:
2873 ddc_pin = GMBUS_PIN_12_TC4_ICP;
2874 break;
2875 default:
2876 MISSING_CASE(port);
2877 ddc_pin = GMBUS_PIN_2_BXT;
2878 break;
2879 }
2880 return ddc_pin;
2881}
2882
cec3bb01
AS
2883static u8 g4x_port_to_ddc_pin(struct drm_i915_private *dev_priv,
2884 enum port port)
2885{
2886 u8 ddc_pin;
2887
2888 switch (port) {
2889 case PORT_B:
2890 ddc_pin = GMBUS_PIN_DPB;
2891 break;
2892 case PORT_C:
2893 ddc_pin = GMBUS_PIN_DPC;
2894 break;
2895 case PORT_D:
2896 ddc_pin = GMBUS_PIN_DPD;
e4ab73a1
VS
2897 break;
2898 default:
2899 MISSING_CASE(port);
2900 ddc_pin = GMBUS_PIN_DPB;
2901 break;
2902 }
cec3bb01
AS
2903 return ddc_pin;
2904}
2905
2906static u8 intel_hdmi_ddc_pin(struct drm_i915_private *dev_priv,
2907 enum port port)
2908{
2909 const struct ddi_vbt_port_info *info =
2910 &dev_priv->vbt.ddi_port_info[port];
2911 u8 ddc_pin;
2912
2913 if (info->alternate_ddc_pin) {
2914 DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (VBT)\n",
2915 info->alternate_ddc_pin, port_name(port));
2916 return info->alternate_ddc_pin;
2917 }
2918
e0f83eb5
RV
2919 if (HAS_PCH_ICP(dev_priv))
2920 ddc_pin = icl_port_to_ddc_pin(dev_priv, port);
cec3bb01
AS
2921 else if (HAS_PCH_CNP(dev_priv))
2922 ddc_pin = cnp_port_to_ddc_pin(dev_priv, port);
e0f83eb5
RV
2923 else if (IS_GEN9_LP(dev_priv))
2924 ddc_pin = bxt_port_to_ddc_pin(dev_priv, port);
2925 else if (IS_CHERRYVIEW(dev_priv))
2926 ddc_pin = chv_port_to_ddc_pin(dev_priv, port);
cec3bb01
AS
2927 else
2928 ddc_pin = g4x_port_to_ddc_pin(dev_priv, port);
e4ab73a1
VS
2929
2930 DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (platform default)\n",
2931 ddc_pin, port_name(port));
2932
2933 return ddc_pin;
2934}
2935
385e4de0
VS
2936void intel_infoframe_init(struct intel_digital_port *intel_dig_port)
2937{
2938 struct drm_i915_private *dev_priv =
2939 to_i915(intel_dig_port->base.base.dev);
2940
2941 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
2942 intel_dig_port->write_infoframe = vlv_write_infoframe;
f2a10d61 2943 intel_dig_port->read_infoframe = vlv_read_infoframe;
385e4de0 2944 intel_dig_port->set_infoframes = vlv_set_infoframes;
509efa2b 2945 intel_dig_port->infoframes_enabled = vlv_infoframes_enabled;
385e4de0
VS
2946 } else if (IS_G4X(dev_priv)) {
2947 intel_dig_port->write_infoframe = g4x_write_infoframe;
f2a10d61 2948 intel_dig_port->read_infoframe = g4x_read_infoframe;
385e4de0 2949 intel_dig_port->set_infoframes = g4x_set_infoframes;
509efa2b 2950 intel_dig_port->infoframes_enabled = g4x_infoframes_enabled;
385e4de0 2951 } else if (HAS_DDI(dev_priv)) {
06c812d7 2952 if (intel_dig_port->lspcon.active) {
509efa2b 2953 intel_dig_port->write_infoframe = lspcon_write_infoframe;
f2a10d61 2954 intel_dig_port->read_infoframe = lspcon_read_infoframe;
06c812d7 2955 intel_dig_port->set_infoframes = lspcon_set_infoframes;
509efa2b 2956 intel_dig_port->infoframes_enabled = lspcon_infoframes_enabled;
06c812d7 2957 } else {
06c812d7 2958 intel_dig_port->write_infoframe = hsw_write_infoframe;
f2a10d61 2959 intel_dig_port->read_infoframe = hsw_read_infoframe;
509efa2b
VS
2960 intel_dig_port->set_infoframes = hsw_set_infoframes;
2961 intel_dig_port->infoframes_enabled = hsw_infoframes_enabled;
06c812d7 2962 }
385e4de0
VS
2963 } else if (HAS_PCH_IBX(dev_priv)) {
2964 intel_dig_port->write_infoframe = ibx_write_infoframe;
f2a10d61 2965 intel_dig_port->read_infoframe = ibx_read_infoframe;
385e4de0 2966 intel_dig_port->set_infoframes = ibx_set_infoframes;
509efa2b 2967 intel_dig_port->infoframes_enabled = ibx_infoframes_enabled;
385e4de0
VS
2968 } else {
2969 intel_dig_port->write_infoframe = cpt_write_infoframe;
f2a10d61 2970 intel_dig_port->read_infoframe = cpt_read_infoframe;
385e4de0 2971 intel_dig_port->set_infoframes = cpt_set_infoframes;
509efa2b 2972 intel_dig_port->infoframes_enabled = cpt_infoframes_enabled;
385e4de0
VS
2973 }
2974}
2975
00c09d70
PZ
2976void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
2977 struct intel_connector *intel_connector)
7d57382e 2978{
b9cb234c
PZ
2979 struct drm_connector *connector = &intel_connector->base;
2980 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
2981 struct intel_encoder *intel_encoder = &intel_dig_port->base;
2982 struct drm_device *dev = intel_encoder->base.dev;
fac5e23e 2983 struct drm_i915_private *dev_priv = to_i915(dev);
8f4f2797 2984 enum port port = intel_encoder->port;
373a3cf7 2985
22f35042
VS
2986 DRM_DEBUG_KMS("Adding HDMI connector on port %c\n",
2987 port_name(port));
2988
ccb1a831
VS
2989 if (WARN(intel_dig_port->max_lanes < 4,
2990 "Not enough lanes (%d) for HDMI on port %c\n",
2991 intel_dig_port->max_lanes, port_name(port)))
2992 return;
2993
7d57382e 2994 drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
8d91104a 2995 DRM_MODE_CONNECTOR_HDMIA);
7d57382e
EA
2996 drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
2997
c3febcc4 2998 connector->interlace_allowed = 1;
7d57382e 2999 connector->doublescan_allowed = 0;
573e74ad 3000 connector->stereo_allowed = 1;
66a9278e 3001
9672a69c 3002 if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
eadc2e51
SS
3003 connector->ycbcr_420_allowed = true;
3004
e4ab73a1
VS
3005 intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);
3006
f761bef2 3007 if (WARN_ON(port == PORT_A))
e4ab73a1 3008 return;
cf53902f 3009 intel_encoder->hpd_pin = intel_hpd_pin_default(dev_priv, port);
7d57382e 3010
4f8036a2 3011 if (HAS_DDI(dev_priv))
bcbc889b
PZ
3012 intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
3013 else
3014 intel_connector->get_hw_state = intel_connector_get_hw_state;
b9cb234c
PZ
3015
3016 intel_hdmi_add_properties(intel_hdmi, connector);
3017
04707f97
R
3018 intel_connector_attach_encoder(intel_connector, intel_encoder);
3019 intel_hdmi->attached_connector = intel_connector;
3020
fdddd08c 3021 if (is_hdcp_supported(dev_priv, port)) {
2320175f
SP
3022 int ret = intel_hdcp_init(intel_connector,
3023 &intel_hdmi_hdcp_shim);
3024 if (ret)
3025 DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
3026 }
3027
b9cb234c
PZ
3028 /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
3029 * 0xd. Failure to do so will result in spurious interrupts being
3030 * generated on the port when a cable is not attached.
3031 */
1c0f1b3d 3032 if (IS_G45(dev_priv)) {
b9cb234c
PZ
3033 u32 temp = I915_READ(PEG_BAND_GAP_DATA);
3034 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
3035 }
9c229127
NA
3036
3037 intel_hdmi->cec_notifier = cec_notifier_get_conn(dev->dev,
3038 port_identifier(port));
3039 if (!intel_hdmi->cec_notifier)
3040 DRM_DEBUG_KMS("CEC notifier get failed\n");
b9cb234c
PZ
3041}
3042
c39055b0 3043void intel_hdmi_init(struct drm_i915_private *dev_priv,
f0f59a00 3044 i915_reg_t hdmi_reg, enum port port)
b9cb234c
PZ
3045{
3046 struct intel_digital_port *intel_dig_port;
3047 struct intel_encoder *intel_encoder;
b9cb234c
PZ
3048 struct intel_connector *intel_connector;
3049
b14c5679 3050 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
b9cb234c
PZ
3051 if (!intel_dig_port)
3052 return;
3053
08d9bc92 3054 intel_connector = intel_connector_alloc();
b9cb234c
PZ
3055 if (!intel_connector) {
3056 kfree(intel_dig_port);
3057 return;
3058 }
3059
3060 intel_encoder = &intel_dig_port->base;
b9cb234c 3061
c39055b0
ACO
3062 drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
3063 &intel_hdmi_enc_funcs, DRM_MODE_ENCODER_TMDS,
3064 "HDMI %c", port_name(port));
00c09d70 3065
dba14b27 3066 intel_encoder->hotplug = intel_encoder_hotplug;
5bfe2ac0 3067 intel_encoder->compute_config = intel_hdmi_compute_config;
6e266956 3068 if (HAS_PCH_SPLIT(dev_priv)) {
a4790cec
VS
3069 intel_encoder->disable = pch_disable_hdmi;
3070 intel_encoder->post_disable = pch_post_disable_hdmi;
3071 } else {
3072 intel_encoder->disable = g4x_disable_hdmi;
3073 }
00c09d70 3074 intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
045ac3b5 3075 intel_encoder->get_config = intel_hdmi_get_config;
920a14b2 3076 if (IS_CHERRYVIEW(dev_priv)) {
9197c88b 3077 intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
e4a1d846
CML
3078 intel_encoder->pre_enable = chv_hdmi_pre_enable;
3079 intel_encoder->enable = vlv_enable_hdmi;
580d3811 3080 intel_encoder->post_disable = chv_hdmi_post_disable;
d6db995f 3081 intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable;
11a914c2 3082 } else if (IS_VALLEYVIEW(dev_priv)) {
9514ac6e
CML
3083 intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
3084 intel_encoder->pre_enable = vlv_hdmi_pre_enable;
b76cf76b 3085 intel_encoder->enable = vlv_enable_hdmi;
9514ac6e 3086 intel_encoder->post_disable = vlv_hdmi_post_disable;
b76cf76b 3087 } else {
13732ba7 3088 intel_encoder->pre_enable = intel_hdmi_pre_enable;
6e266956 3089 if (HAS_PCH_CPT(dev_priv))
d1b1589c 3090 intel_encoder->enable = cpt_enable_hdmi;
6e266956 3091 else if (HAS_PCH_IBX(dev_priv))
bf868c7d 3092 intel_encoder->enable = ibx_enable_hdmi;
d1b1589c 3093 else
bf868c7d 3094 intel_encoder->enable = g4x_enable_hdmi;
89b667f8 3095 }
5ab432ef 3096
b9cb234c 3097 intel_encoder->type = INTEL_OUTPUT_HDMI;
79f255a0 3098 intel_encoder->power_domain = intel_port_to_power_domain(port);
03cdc1d4 3099 intel_encoder->port = port;
920a14b2 3100 if (IS_CHERRYVIEW(dev_priv)) {
882ec384
VS
3101 if (port == PORT_D)
3102 intel_encoder->crtc_mask = 1 << 2;
3103 else
3104 intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
3105 } else {
3106 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
3107 }
301ea74a 3108 intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
c6f1495d
VS
3109 /*
3110 * BSpec is unclear about HDMI+HDMI cloning on g4x, but it seems
3111 * to work on real hardware. And since g4x can send infoframes to
3112 * only one port anyway, nothing is lost by allowing it.
3113 */
9beb5fea 3114 if (IS_G4X(dev_priv))
c6f1495d 3115 intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
7d57382e 3116
b242b7f7 3117 intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
f0f59a00 3118 intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
ccb1a831 3119 intel_dig_port->max_lanes = 4;
55b7d6e8 3120
385e4de0
VS
3121 intel_infoframe_init(intel_dig_port);
3122
39053089 3123 intel_dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port);
b9cb234c 3124 intel_hdmi_init_connector(intel_dig_port, intel_connector);
7d57382e 3125}