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