0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include <linux/delay.h>
0030 #include <linux/hdmi.h>
0031 #include <linux/i2c.h>
0032 #include <linux/slab.h>
0033 #include <linux/string_helpers.h>
0034
0035 #include <drm/display/drm_hdcp_helper.h>
0036 #include <drm/display/drm_hdmi_helper.h>
0037 #include <drm/display/drm_scdc_helper.h>
0038 #include <drm/drm_atomic_helper.h>
0039 #include <drm/drm_crtc.h>
0040 #include <drm/drm_edid.h>
0041 #include <drm/intel_lpe_audio.h>
0042
0043 #include "i915_debugfs.h"
0044 #include "i915_drv.h"
0045 #include "intel_atomic.h"
0046 #include "intel_connector.h"
0047 #include "intel_ddi.h"
0048 #include "intel_de.h"
0049 #include "intel_display_types.h"
0050 #include "intel_dp.h"
0051 #include "intel_gmbus.h"
0052 #include "intel_hdcp.h"
0053 #include "intel_hdmi.h"
0054 #include "intel_lspcon.h"
0055 #include "intel_panel.h"
0056 #include "intel_snps_phy.h"
0057
0058 static struct drm_i915_private *intel_hdmi_to_i915(struct intel_hdmi *intel_hdmi)
0059 {
0060 return to_i915(hdmi_to_dig_port(intel_hdmi)->base.base.dev);
0061 }
0062
0063 static void
0064 assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
0065 {
0066 struct drm_i915_private *dev_priv = intel_hdmi_to_i915(intel_hdmi);
0067 u32 enabled_bits;
0068
0069 enabled_bits = HAS_DDI(dev_priv) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
0070
0071 drm_WARN(&dev_priv->drm,
0072 intel_de_read(dev_priv, intel_hdmi->hdmi_reg) & enabled_bits,
0073 "HDMI port enabled, expecting disabled\n");
0074 }
0075
0076 static void
0077 assert_hdmi_transcoder_func_disabled(struct drm_i915_private *dev_priv,
0078 enum transcoder cpu_transcoder)
0079 {
0080 drm_WARN(&dev_priv->drm,
0081 intel_de_read(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder)) &
0082 TRANS_DDI_FUNC_ENABLE,
0083 "HDMI transcoder function enabled, expecting disabled\n");
0084 }
0085
0086 static u32 g4x_infoframe_index(unsigned int type)
0087 {
0088 switch (type) {
0089 case HDMI_PACKET_TYPE_GAMUT_METADATA:
0090 return VIDEO_DIP_SELECT_GAMUT;
0091 case HDMI_INFOFRAME_TYPE_AVI:
0092 return VIDEO_DIP_SELECT_AVI;
0093 case HDMI_INFOFRAME_TYPE_SPD:
0094 return VIDEO_DIP_SELECT_SPD;
0095 case HDMI_INFOFRAME_TYPE_VENDOR:
0096 return VIDEO_DIP_SELECT_VENDOR;
0097 default:
0098 MISSING_CASE(type);
0099 return 0;
0100 }
0101 }
0102
0103 static u32 g4x_infoframe_enable(unsigned int type)
0104 {
0105 switch (type) {
0106 case HDMI_PACKET_TYPE_GENERAL_CONTROL:
0107 return VIDEO_DIP_ENABLE_GCP;
0108 case HDMI_PACKET_TYPE_GAMUT_METADATA:
0109 return VIDEO_DIP_ENABLE_GAMUT;
0110 case DP_SDP_VSC:
0111 return 0;
0112 case HDMI_INFOFRAME_TYPE_AVI:
0113 return VIDEO_DIP_ENABLE_AVI;
0114 case HDMI_INFOFRAME_TYPE_SPD:
0115 return VIDEO_DIP_ENABLE_SPD;
0116 case HDMI_INFOFRAME_TYPE_VENDOR:
0117 return VIDEO_DIP_ENABLE_VENDOR;
0118 case HDMI_INFOFRAME_TYPE_DRM:
0119 return 0;
0120 default:
0121 MISSING_CASE(type);
0122 return 0;
0123 }
0124 }
0125
0126 static u32 hsw_infoframe_enable(unsigned int type)
0127 {
0128 switch (type) {
0129 case HDMI_PACKET_TYPE_GENERAL_CONTROL:
0130 return VIDEO_DIP_ENABLE_GCP_HSW;
0131 case HDMI_PACKET_TYPE_GAMUT_METADATA:
0132 return VIDEO_DIP_ENABLE_GMP_HSW;
0133 case DP_SDP_VSC:
0134 return VIDEO_DIP_ENABLE_VSC_HSW;
0135 case DP_SDP_PPS:
0136 return VDIP_ENABLE_PPS;
0137 case HDMI_INFOFRAME_TYPE_AVI:
0138 return VIDEO_DIP_ENABLE_AVI_HSW;
0139 case HDMI_INFOFRAME_TYPE_SPD:
0140 return VIDEO_DIP_ENABLE_SPD_HSW;
0141 case HDMI_INFOFRAME_TYPE_VENDOR:
0142 return VIDEO_DIP_ENABLE_VS_HSW;
0143 case HDMI_INFOFRAME_TYPE_DRM:
0144 return VIDEO_DIP_ENABLE_DRM_GLK;
0145 default:
0146 MISSING_CASE(type);
0147 return 0;
0148 }
0149 }
0150
0151 static i915_reg_t
0152 hsw_dip_data_reg(struct drm_i915_private *dev_priv,
0153 enum transcoder cpu_transcoder,
0154 unsigned int type,
0155 int i)
0156 {
0157 switch (type) {
0158 case HDMI_PACKET_TYPE_GAMUT_METADATA:
0159 return HSW_TVIDEO_DIP_GMP_DATA(cpu_transcoder, i);
0160 case DP_SDP_VSC:
0161 return HSW_TVIDEO_DIP_VSC_DATA(cpu_transcoder, i);
0162 case DP_SDP_PPS:
0163 return ICL_VIDEO_DIP_PPS_DATA(cpu_transcoder, i);
0164 case HDMI_INFOFRAME_TYPE_AVI:
0165 return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder, i);
0166 case HDMI_INFOFRAME_TYPE_SPD:
0167 return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder, i);
0168 case HDMI_INFOFRAME_TYPE_VENDOR:
0169 return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder, i);
0170 case HDMI_INFOFRAME_TYPE_DRM:
0171 return GLK_TVIDEO_DIP_DRM_DATA(cpu_transcoder, i);
0172 default:
0173 MISSING_CASE(type);
0174 return INVALID_MMIO_REG;
0175 }
0176 }
0177
0178 static int hsw_dip_data_size(struct drm_i915_private *dev_priv,
0179 unsigned int type)
0180 {
0181 switch (type) {
0182 case DP_SDP_VSC:
0183 return VIDEO_DIP_VSC_DATA_SIZE;
0184 case DP_SDP_PPS:
0185 return VIDEO_DIP_PPS_DATA_SIZE;
0186 case HDMI_PACKET_TYPE_GAMUT_METADATA:
0187 if (DISPLAY_VER(dev_priv) >= 11)
0188 return VIDEO_DIP_GMP_DATA_SIZE;
0189 else
0190 return VIDEO_DIP_DATA_SIZE;
0191 default:
0192 return VIDEO_DIP_DATA_SIZE;
0193 }
0194 }
0195
0196 static void g4x_write_infoframe(struct intel_encoder *encoder,
0197 const struct intel_crtc_state *crtc_state,
0198 unsigned int type,
0199 const void *frame, ssize_t len)
0200 {
0201 const u32 *data = frame;
0202 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0203 u32 val = intel_de_read(dev_priv, VIDEO_DIP_CTL);
0204 int i;
0205
0206 drm_WARN(&dev_priv->drm, !(val & VIDEO_DIP_ENABLE),
0207 "Writing DIP with CTL reg disabled\n");
0208
0209 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf);
0210 val |= g4x_infoframe_index(type);
0211
0212 val &= ~g4x_infoframe_enable(type);
0213
0214 intel_de_write(dev_priv, VIDEO_DIP_CTL, val);
0215
0216 for (i = 0; i < len; i += 4) {
0217 intel_de_write(dev_priv, VIDEO_DIP_DATA, *data);
0218 data++;
0219 }
0220
0221 for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
0222 intel_de_write(dev_priv, VIDEO_DIP_DATA, 0);
0223
0224 val |= g4x_infoframe_enable(type);
0225 val &= ~VIDEO_DIP_FREQ_MASK;
0226 val |= VIDEO_DIP_FREQ_VSYNC;
0227
0228 intel_de_write(dev_priv, VIDEO_DIP_CTL, val);
0229 intel_de_posting_read(dev_priv, VIDEO_DIP_CTL);
0230 }
0231
0232 static void g4x_read_infoframe(struct intel_encoder *encoder,
0233 const struct intel_crtc_state *crtc_state,
0234 unsigned int type,
0235 void *frame, ssize_t len)
0236 {
0237 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0238 u32 val, *data = frame;
0239 int i;
0240
0241 val = intel_de_read(dev_priv, VIDEO_DIP_CTL);
0242
0243 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf);
0244 val |= g4x_infoframe_index(type);
0245
0246 intel_de_write(dev_priv, VIDEO_DIP_CTL, val);
0247
0248 for (i = 0; i < len; i += 4)
0249 *data++ = intel_de_read(dev_priv, VIDEO_DIP_DATA);
0250 }
0251
0252 static u32 g4x_infoframes_enabled(struct intel_encoder *encoder,
0253 const struct intel_crtc_state *pipe_config)
0254 {
0255 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0256 u32 val = intel_de_read(dev_priv, VIDEO_DIP_CTL);
0257
0258 if ((val & VIDEO_DIP_ENABLE) == 0)
0259 return 0;
0260
0261 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
0262 return 0;
0263
0264 return val & (VIDEO_DIP_ENABLE_AVI |
0265 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
0266 }
0267
0268 static void ibx_write_infoframe(struct intel_encoder *encoder,
0269 const struct intel_crtc_state *crtc_state,
0270 unsigned int type,
0271 const void *frame, ssize_t len)
0272 {
0273 const u32 *data = frame;
0274 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0275 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0276 i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe);
0277 u32 val = intel_de_read(dev_priv, reg);
0278 int i;
0279
0280 drm_WARN(&dev_priv->drm, !(val & VIDEO_DIP_ENABLE),
0281 "Writing DIP with CTL reg disabled\n");
0282
0283 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf);
0284 val |= g4x_infoframe_index(type);
0285
0286 val &= ~g4x_infoframe_enable(type);
0287
0288 intel_de_write(dev_priv, reg, val);
0289
0290 for (i = 0; i < len; i += 4) {
0291 intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe),
0292 *data);
0293 data++;
0294 }
0295
0296 for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
0297 intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe), 0);
0298
0299 val |= g4x_infoframe_enable(type);
0300 val &= ~VIDEO_DIP_FREQ_MASK;
0301 val |= VIDEO_DIP_FREQ_VSYNC;
0302
0303 intel_de_write(dev_priv, reg, val);
0304 intel_de_posting_read(dev_priv, reg);
0305 }
0306
0307 static void ibx_read_infoframe(struct intel_encoder *encoder,
0308 const struct intel_crtc_state *crtc_state,
0309 unsigned int type,
0310 void *frame, ssize_t len)
0311 {
0312 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0313 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0314 u32 val, *data = frame;
0315 int i;
0316
0317 val = intel_de_read(dev_priv, TVIDEO_DIP_CTL(crtc->pipe));
0318
0319 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf);
0320 val |= g4x_infoframe_index(type);
0321
0322 intel_de_write(dev_priv, TVIDEO_DIP_CTL(crtc->pipe), val);
0323
0324 for (i = 0; i < len; i += 4)
0325 *data++ = intel_de_read(dev_priv, TVIDEO_DIP_DATA(crtc->pipe));
0326 }
0327
0328 static u32 ibx_infoframes_enabled(struct intel_encoder *encoder,
0329 const struct intel_crtc_state *pipe_config)
0330 {
0331 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0332 enum pipe pipe = to_intel_crtc(pipe_config->uapi.crtc)->pipe;
0333 i915_reg_t reg = TVIDEO_DIP_CTL(pipe);
0334 u32 val = intel_de_read(dev_priv, reg);
0335
0336 if ((val & VIDEO_DIP_ENABLE) == 0)
0337 return 0;
0338
0339 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
0340 return 0;
0341
0342 return val & (VIDEO_DIP_ENABLE_AVI |
0343 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
0344 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
0345 }
0346
0347 static void cpt_write_infoframe(struct intel_encoder *encoder,
0348 const struct intel_crtc_state *crtc_state,
0349 unsigned int type,
0350 const void *frame, ssize_t len)
0351 {
0352 const u32 *data = frame;
0353 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0354 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0355 i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe);
0356 u32 val = intel_de_read(dev_priv, reg);
0357 int i;
0358
0359 drm_WARN(&dev_priv->drm, !(val & VIDEO_DIP_ENABLE),
0360 "Writing DIP with CTL reg disabled\n");
0361
0362 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf);
0363 val |= g4x_infoframe_index(type);
0364
0365
0366
0367 if (type != HDMI_INFOFRAME_TYPE_AVI)
0368 val &= ~g4x_infoframe_enable(type);
0369
0370 intel_de_write(dev_priv, reg, val);
0371
0372 for (i = 0; i < len; i += 4) {
0373 intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe),
0374 *data);
0375 data++;
0376 }
0377
0378 for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
0379 intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe), 0);
0380
0381 val |= g4x_infoframe_enable(type);
0382 val &= ~VIDEO_DIP_FREQ_MASK;
0383 val |= VIDEO_DIP_FREQ_VSYNC;
0384
0385 intel_de_write(dev_priv, reg, val);
0386 intel_de_posting_read(dev_priv, reg);
0387 }
0388
0389 static void cpt_read_infoframe(struct intel_encoder *encoder,
0390 const struct intel_crtc_state *crtc_state,
0391 unsigned int type,
0392 void *frame, ssize_t len)
0393 {
0394 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0395 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0396 u32 val, *data = frame;
0397 int i;
0398
0399 val = intel_de_read(dev_priv, TVIDEO_DIP_CTL(crtc->pipe));
0400
0401 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf);
0402 val |= g4x_infoframe_index(type);
0403
0404 intel_de_write(dev_priv, TVIDEO_DIP_CTL(crtc->pipe), val);
0405
0406 for (i = 0; i < len; i += 4)
0407 *data++ = intel_de_read(dev_priv, TVIDEO_DIP_DATA(crtc->pipe));
0408 }
0409
0410 static u32 cpt_infoframes_enabled(struct intel_encoder *encoder,
0411 const struct intel_crtc_state *pipe_config)
0412 {
0413 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0414 enum pipe pipe = to_intel_crtc(pipe_config->uapi.crtc)->pipe;
0415 u32 val = intel_de_read(dev_priv, TVIDEO_DIP_CTL(pipe));
0416
0417 if ((val & VIDEO_DIP_ENABLE) == 0)
0418 return 0;
0419
0420 return val & (VIDEO_DIP_ENABLE_AVI |
0421 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
0422 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
0423 }
0424
0425 static void vlv_write_infoframe(struct intel_encoder *encoder,
0426 const struct intel_crtc_state *crtc_state,
0427 unsigned int type,
0428 const void *frame, ssize_t len)
0429 {
0430 const u32 *data = frame;
0431 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0432 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0433 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(crtc->pipe);
0434 u32 val = intel_de_read(dev_priv, reg);
0435 int i;
0436
0437 drm_WARN(&dev_priv->drm, !(val & VIDEO_DIP_ENABLE),
0438 "Writing DIP with CTL reg disabled\n");
0439
0440 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf);
0441 val |= g4x_infoframe_index(type);
0442
0443 val &= ~g4x_infoframe_enable(type);
0444
0445 intel_de_write(dev_priv, reg, val);
0446
0447 for (i = 0; i < len; i += 4) {
0448 intel_de_write(dev_priv,
0449 VLV_TVIDEO_DIP_DATA(crtc->pipe), *data);
0450 data++;
0451 }
0452
0453 for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
0454 intel_de_write(dev_priv,
0455 VLV_TVIDEO_DIP_DATA(crtc->pipe), 0);
0456
0457 val |= g4x_infoframe_enable(type);
0458 val &= ~VIDEO_DIP_FREQ_MASK;
0459 val |= VIDEO_DIP_FREQ_VSYNC;
0460
0461 intel_de_write(dev_priv, reg, val);
0462 intel_de_posting_read(dev_priv, reg);
0463 }
0464
0465 static void vlv_read_infoframe(struct intel_encoder *encoder,
0466 const struct intel_crtc_state *crtc_state,
0467 unsigned int type,
0468 void *frame, ssize_t len)
0469 {
0470 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0471 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0472 u32 val, *data = frame;
0473 int i;
0474
0475 val = intel_de_read(dev_priv, VLV_TVIDEO_DIP_CTL(crtc->pipe));
0476
0477 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf);
0478 val |= g4x_infoframe_index(type);
0479
0480 intel_de_write(dev_priv, VLV_TVIDEO_DIP_CTL(crtc->pipe), val);
0481
0482 for (i = 0; i < len; i += 4)
0483 *data++ = intel_de_read(dev_priv,
0484 VLV_TVIDEO_DIP_DATA(crtc->pipe));
0485 }
0486
0487 static u32 vlv_infoframes_enabled(struct intel_encoder *encoder,
0488 const struct intel_crtc_state *pipe_config)
0489 {
0490 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0491 enum pipe pipe = to_intel_crtc(pipe_config->uapi.crtc)->pipe;
0492 u32 val = intel_de_read(dev_priv, VLV_TVIDEO_DIP_CTL(pipe));
0493
0494 if ((val & VIDEO_DIP_ENABLE) == 0)
0495 return 0;
0496
0497 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
0498 return 0;
0499
0500 return val & (VIDEO_DIP_ENABLE_AVI |
0501 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
0502 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
0503 }
0504
0505 void hsw_write_infoframe(struct intel_encoder *encoder,
0506 const struct intel_crtc_state *crtc_state,
0507 unsigned int type,
0508 const void *frame, ssize_t len)
0509 {
0510 const u32 *data = frame;
0511 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0512 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
0513 i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder);
0514 int data_size;
0515 int i;
0516 u32 val = intel_de_read(dev_priv, ctl_reg);
0517
0518 data_size = hsw_dip_data_size(dev_priv, type);
0519
0520 drm_WARN_ON(&dev_priv->drm, len > data_size);
0521
0522 val &= ~hsw_infoframe_enable(type);
0523 intel_de_write(dev_priv, ctl_reg, val);
0524
0525 for (i = 0; i < len; i += 4) {
0526 intel_de_write(dev_priv,
0527 hsw_dip_data_reg(dev_priv, cpu_transcoder, type, i >> 2),
0528 *data);
0529 data++;
0530 }
0531
0532 for (; i < data_size; i += 4)
0533 intel_de_write(dev_priv,
0534 hsw_dip_data_reg(dev_priv, cpu_transcoder, type, i >> 2),
0535 0);
0536
0537
0538 if (DISPLAY_VER(dev_priv) == 13 && crtc_state->has_psr &&
0539 type == DP_SDP_VSC)
0540 return;
0541
0542 val |= hsw_infoframe_enable(type);
0543 intel_de_write(dev_priv, ctl_reg, val);
0544 intel_de_posting_read(dev_priv, ctl_reg);
0545 }
0546
0547 void hsw_read_infoframe(struct intel_encoder *encoder,
0548 const struct intel_crtc_state *crtc_state,
0549 unsigned int type, void *frame, ssize_t len)
0550 {
0551 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0552 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
0553 u32 *data = frame;
0554 int i;
0555
0556 for (i = 0; i < len; i += 4)
0557 *data++ = intel_de_read(dev_priv,
0558 hsw_dip_data_reg(dev_priv, cpu_transcoder, type, i >> 2));
0559 }
0560
0561 static u32 hsw_infoframes_enabled(struct intel_encoder *encoder,
0562 const struct intel_crtc_state *pipe_config)
0563 {
0564 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0565 u32 val = intel_de_read(dev_priv,
0566 HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder));
0567 u32 mask;
0568
0569 mask = (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
0570 VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
0571 VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);
0572
0573 if (DISPLAY_VER(dev_priv) >= 10)
0574 mask |= VIDEO_DIP_ENABLE_DRM_GLK;
0575
0576 return val & mask;
0577 }
0578
0579 static const u8 infoframe_type_to_idx[] = {
0580 HDMI_PACKET_TYPE_GENERAL_CONTROL,
0581 HDMI_PACKET_TYPE_GAMUT_METADATA,
0582 DP_SDP_VSC,
0583 HDMI_INFOFRAME_TYPE_AVI,
0584 HDMI_INFOFRAME_TYPE_SPD,
0585 HDMI_INFOFRAME_TYPE_VENDOR,
0586 HDMI_INFOFRAME_TYPE_DRM,
0587 };
0588
0589 u32 intel_hdmi_infoframe_enable(unsigned int type)
0590 {
0591 int i;
0592
0593 for (i = 0; i < ARRAY_SIZE(infoframe_type_to_idx); i++) {
0594 if (infoframe_type_to_idx[i] == type)
0595 return BIT(i);
0596 }
0597
0598 return 0;
0599 }
0600
0601 u32 intel_hdmi_infoframes_enabled(struct intel_encoder *encoder,
0602 const struct intel_crtc_state *crtc_state)
0603 {
0604 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0605 struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
0606 u32 val, ret = 0;
0607 int i;
0608
0609 val = dig_port->infoframes_enabled(encoder, crtc_state);
0610
0611
0612 for (i = 0; i < ARRAY_SIZE(infoframe_type_to_idx); i++) {
0613 unsigned int type = infoframe_type_to_idx[i];
0614
0615 if (HAS_DDI(dev_priv)) {
0616 if (val & hsw_infoframe_enable(type))
0617 ret |= BIT(i);
0618 } else {
0619 if (val & g4x_infoframe_enable(type))
0620 ret |= BIT(i);
0621 }
0622 }
0623
0624 return ret;
0625 }
0626
0627
0628
0629
0630
0631
0632
0633
0634
0635
0636
0637
0638
0639
0640
0641
0642
0643
0644 static void intel_write_infoframe(struct intel_encoder *encoder,
0645 const struct intel_crtc_state *crtc_state,
0646 enum hdmi_infoframe_type type,
0647 const union hdmi_infoframe *frame)
0648 {
0649 struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
0650 u8 buffer[VIDEO_DIP_DATA_SIZE];
0651 ssize_t len;
0652
0653 if ((crtc_state->infoframes.enable &
0654 intel_hdmi_infoframe_enable(type)) == 0)
0655 return;
0656
0657 if (drm_WARN_ON(encoder->base.dev, frame->any.type != type))
0658 return;
0659
0660
0661 len = hdmi_infoframe_pack_only(frame, buffer + 1, sizeof(buffer) - 1);
0662 if (drm_WARN_ON(encoder->base.dev, len < 0))
0663 return;
0664
0665
0666 memmove(&buffer[0], &buffer[1], 3);
0667 buffer[3] = 0;
0668 len++;
0669
0670 dig_port->write_infoframe(encoder, crtc_state, type, buffer, len);
0671 }
0672
0673 void intel_read_infoframe(struct intel_encoder *encoder,
0674 const struct intel_crtc_state *crtc_state,
0675 enum hdmi_infoframe_type type,
0676 union hdmi_infoframe *frame)
0677 {
0678 struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
0679 u8 buffer[VIDEO_DIP_DATA_SIZE];
0680 int ret;
0681
0682 if ((crtc_state->infoframes.enable &
0683 intel_hdmi_infoframe_enable(type)) == 0)
0684 return;
0685
0686 dig_port->read_infoframe(encoder, crtc_state,
0687 type, buffer, sizeof(buffer));
0688
0689
0690 memmove(&buffer[1], &buffer[0], 3);
0691
0692
0693 ret = hdmi_infoframe_unpack(frame, buffer + 1, sizeof(buffer) - 1);
0694 if (ret) {
0695 drm_dbg_kms(encoder->base.dev,
0696 "Failed to unpack infoframe type 0x%02x\n", type);
0697 return;
0698 }
0699
0700 if (frame->any.type != type)
0701 drm_dbg_kms(encoder->base.dev,
0702 "Found the wrong infoframe type 0x%x (expected 0x%02x)\n",
0703 frame->any.type, type);
0704 }
0705
0706 static bool
0707 intel_hdmi_compute_avi_infoframe(struct intel_encoder *encoder,
0708 struct intel_crtc_state *crtc_state,
0709 struct drm_connector_state *conn_state)
0710 {
0711 struct hdmi_avi_infoframe *frame = &crtc_state->infoframes.avi.avi;
0712 const struct drm_display_mode *adjusted_mode =
0713 &crtc_state->hw.adjusted_mode;
0714 struct drm_connector *connector = conn_state->connector;
0715 int ret;
0716
0717 if (!crtc_state->has_infoframe)
0718 return true;
0719
0720 crtc_state->infoframes.enable |=
0721 intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_AVI);
0722
0723 ret = drm_hdmi_avi_infoframe_from_display_mode(frame, connector,
0724 adjusted_mode);
0725 if (ret)
0726 return false;
0727
0728 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
0729 frame->colorspace = HDMI_COLORSPACE_YUV420;
0730 else if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
0731 frame->colorspace = HDMI_COLORSPACE_YUV444;
0732 else
0733 frame->colorspace = HDMI_COLORSPACE_RGB;
0734
0735 drm_hdmi_avi_infoframe_colorimetry(frame, conn_state);
0736
0737
0738 drm_WARN_ON(encoder->base.dev, crtc_state->limited_color_range &&
0739 crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB);
0740
0741 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_RGB) {
0742 drm_hdmi_avi_infoframe_quant_range(frame, connector,
0743 adjusted_mode,
0744 crtc_state->limited_color_range ?
0745 HDMI_QUANTIZATION_RANGE_LIMITED :
0746 HDMI_QUANTIZATION_RANGE_FULL);
0747 } else {
0748 frame->quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
0749 frame->ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
0750 }
0751
0752 drm_hdmi_avi_infoframe_content_type(frame, conn_state);
0753
0754
0755
0756 ret = hdmi_avi_infoframe_check(frame);
0757 if (drm_WARN_ON(encoder->base.dev, ret))
0758 return false;
0759
0760 return true;
0761 }
0762
0763 static bool
0764 intel_hdmi_compute_spd_infoframe(struct intel_encoder *encoder,
0765 struct intel_crtc_state *crtc_state,
0766 struct drm_connector_state *conn_state)
0767 {
0768 struct hdmi_spd_infoframe *frame = &crtc_state->infoframes.spd.spd;
0769 int ret;
0770
0771 if (!crtc_state->has_infoframe)
0772 return true;
0773
0774 crtc_state->infoframes.enable |=
0775 intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_SPD);
0776
0777 ret = hdmi_spd_infoframe_init(frame, "Intel", "Integrated gfx");
0778 if (drm_WARN_ON(encoder->base.dev, ret))
0779 return false;
0780
0781 frame->sdi = HDMI_SPD_SDI_PC;
0782
0783 ret = hdmi_spd_infoframe_check(frame);
0784 if (drm_WARN_ON(encoder->base.dev, ret))
0785 return false;
0786
0787 return true;
0788 }
0789
0790 static bool
0791 intel_hdmi_compute_hdmi_infoframe(struct intel_encoder *encoder,
0792 struct intel_crtc_state *crtc_state,
0793 struct drm_connector_state *conn_state)
0794 {
0795 struct hdmi_vendor_infoframe *frame =
0796 &crtc_state->infoframes.hdmi.vendor.hdmi;
0797 const struct drm_display_info *info =
0798 &conn_state->connector->display_info;
0799 int ret;
0800
0801 if (!crtc_state->has_infoframe || !info->has_hdmi_infoframe)
0802 return true;
0803
0804 crtc_state->infoframes.enable |=
0805 intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_VENDOR);
0806
0807 ret = drm_hdmi_vendor_infoframe_from_display_mode(frame,
0808 conn_state->connector,
0809 &crtc_state->hw.adjusted_mode);
0810 if (drm_WARN_ON(encoder->base.dev, ret))
0811 return false;
0812
0813 ret = hdmi_vendor_infoframe_check(frame);
0814 if (drm_WARN_ON(encoder->base.dev, ret))
0815 return false;
0816
0817 return true;
0818 }
0819
0820 static bool
0821 intel_hdmi_compute_drm_infoframe(struct intel_encoder *encoder,
0822 struct intel_crtc_state *crtc_state,
0823 struct drm_connector_state *conn_state)
0824 {
0825 struct hdmi_drm_infoframe *frame = &crtc_state->infoframes.drm.drm;
0826 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0827 int ret;
0828
0829 if (DISPLAY_VER(dev_priv) < 10)
0830 return true;
0831
0832 if (!crtc_state->has_infoframe)
0833 return true;
0834
0835 if (!conn_state->hdr_output_metadata)
0836 return true;
0837
0838 crtc_state->infoframes.enable |=
0839 intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_DRM);
0840
0841 ret = drm_hdmi_infoframe_set_hdr_metadata(frame, conn_state);
0842 if (ret < 0) {
0843 drm_dbg_kms(&dev_priv->drm,
0844 "couldn't set HDR metadata in infoframe\n");
0845 return false;
0846 }
0847
0848 ret = hdmi_drm_infoframe_check(frame);
0849 if (drm_WARN_ON(&dev_priv->drm, ret))
0850 return false;
0851
0852 return true;
0853 }
0854
0855 static void g4x_set_infoframes(struct intel_encoder *encoder,
0856 bool enable,
0857 const struct intel_crtc_state *crtc_state,
0858 const struct drm_connector_state *conn_state)
0859 {
0860 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0861 struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
0862 struct intel_hdmi *intel_hdmi = &dig_port->hdmi;
0863 i915_reg_t reg = VIDEO_DIP_CTL;
0864 u32 val = intel_de_read(dev_priv, reg);
0865 u32 port = VIDEO_DIP_PORT(encoder->port);
0866
0867 assert_hdmi_port_disabled(intel_hdmi);
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878 val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
0879
0880 if (!enable) {
0881 if (!(val & VIDEO_DIP_ENABLE))
0882 return;
0883 if (port != (val & VIDEO_DIP_PORT_MASK)) {
0884 drm_dbg_kms(&dev_priv->drm,
0885 "video DIP still enabled on port %c\n",
0886 (val & VIDEO_DIP_PORT_MASK) >> 29);
0887 return;
0888 }
0889 val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
0890 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
0891 intel_de_write(dev_priv, reg, val);
0892 intel_de_posting_read(dev_priv, reg);
0893 return;
0894 }
0895
0896 if (port != (val & VIDEO_DIP_PORT_MASK)) {
0897 if (val & VIDEO_DIP_ENABLE) {
0898 drm_dbg_kms(&dev_priv->drm,
0899 "video DIP already enabled on port %c\n",
0900 (val & VIDEO_DIP_PORT_MASK) >> 29);
0901 return;
0902 }
0903 val &= ~VIDEO_DIP_PORT_MASK;
0904 val |= port;
0905 }
0906
0907 val |= VIDEO_DIP_ENABLE;
0908 val &= ~(VIDEO_DIP_ENABLE_AVI |
0909 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
0910
0911 intel_de_write(dev_priv, reg, val);
0912 intel_de_posting_read(dev_priv, reg);
0913
0914 intel_write_infoframe(encoder, crtc_state,
0915 HDMI_INFOFRAME_TYPE_AVI,
0916 &crtc_state->infoframes.avi);
0917 intel_write_infoframe(encoder, crtc_state,
0918 HDMI_INFOFRAME_TYPE_SPD,
0919 &crtc_state->infoframes.spd);
0920 intel_write_infoframe(encoder, crtc_state,
0921 HDMI_INFOFRAME_TYPE_VENDOR,
0922 &crtc_state->infoframes.hdmi);
0923 }
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935 static bool gcp_default_phase_possible(int pipe_bpp,
0936 const struct drm_display_mode *mode)
0937 {
0938 unsigned int pixels_per_group;
0939
0940 switch (pipe_bpp) {
0941 case 30:
0942
0943 pixels_per_group = 4;
0944 break;
0945 case 36:
0946
0947 pixels_per_group = 2;
0948 break;
0949 case 48:
0950
0951 pixels_per_group = 1;
0952 break;
0953 default:
0954
0955 return false;
0956 }
0957
0958 return mode->crtc_hdisplay % pixels_per_group == 0 &&
0959 mode->crtc_htotal % pixels_per_group == 0 &&
0960 mode->crtc_hblank_start % pixels_per_group == 0 &&
0961 mode->crtc_hblank_end % pixels_per_group == 0 &&
0962 mode->crtc_hsync_start % pixels_per_group == 0 &&
0963 mode->crtc_hsync_end % pixels_per_group == 0 &&
0964 ((mode->flags & DRM_MODE_FLAG_INTERLACE) == 0 ||
0965 mode->crtc_htotal/2 % pixels_per_group == 0);
0966 }
0967
0968 static bool intel_hdmi_set_gcp_infoframe(struct intel_encoder *encoder,
0969 const struct intel_crtc_state *crtc_state,
0970 const struct drm_connector_state *conn_state)
0971 {
0972 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0973 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0974 i915_reg_t reg;
0975
0976 if ((crtc_state->infoframes.enable &
0977 intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL)) == 0)
0978 return false;
0979
0980 if (HAS_DDI(dev_priv))
0981 reg = HSW_TVIDEO_DIP_GCP(crtc_state->cpu_transcoder);
0982 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
0983 reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
0984 else if (HAS_PCH_SPLIT(dev_priv))
0985 reg = TVIDEO_DIP_GCP(crtc->pipe);
0986 else
0987 return false;
0988
0989 intel_de_write(dev_priv, reg, crtc_state->infoframes.gcp);
0990
0991 return true;
0992 }
0993
0994 void intel_hdmi_read_gcp_infoframe(struct intel_encoder *encoder,
0995 struct intel_crtc_state *crtc_state)
0996 {
0997 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0998 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0999 i915_reg_t reg;
1000
1001 if ((crtc_state->infoframes.enable &
1002 intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL)) == 0)
1003 return;
1004
1005 if (HAS_DDI(dev_priv))
1006 reg = HSW_TVIDEO_DIP_GCP(crtc_state->cpu_transcoder);
1007 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
1008 reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
1009 else if (HAS_PCH_SPLIT(dev_priv))
1010 reg = TVIDEO_DIP_GCP(crtc->pipe);
1011 else
1012 return;
1013
1014 crtc_state->infoframes.gcp = intel_de_read(dev_priv, reg);
1015 }
1016
1017 static void intel_hdmi_compute_gcp_infoframe(struct intel_encoder *encoder,
1018 struct intel_crtc_state *crtc_state,
1019 struct drm_connector_state *conn_state)
1020 {
1021 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1022
1023 if (IS_G4X(dev_priv) || !crtc_state->has_infoframe)
1024 return;
1025
1026 crtc_state->infoframes.enable |=
1027 intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL);
1028
1029
1030 if (crtc_state->pipe_bpp > 24)
1031 crtc_state->infoframes.gcp |= GCP_COLOR_INDICATION;
1032
1033
1034 if (gcp_default_phase_possible(crtc_state->pipe_bpp,
1035 &crtc_state->hw.adjusted_mode))
1036 crtc_state->infoframes.gcp |= GCP_DEFAULT_PHASE_ENABLE;
1037 }
1038
1039 static void ibx_set_infoframes(struct intel_encoder *encoder,
1040 bool enable,
1041 const struct intel_crtc_state *crtc_state,
1042 const struct drm_connector_state *conn_state)
1043 {
1044 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1045 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1046 struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
1047 struct intel_hdmi *intel_hdmi = &dig_port->hdmi;
1048 i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe);
1049 u32 val = intel_de_read(dev_priv, reg);
1050 u32 port = VIDEO_DIP_PORT(encoder->port);
1051
1052 assert_hdmi_port_disabled(intel_hdmi);
1053
1054
1055 val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
1056
1057 if (!enable) {
1058 if (!(val & VIDEO_DIP_ENABLE))
1059 return;
1060 val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
1061 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1062 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1063 intel_de_write(dev_priv, reg, val);
1064 intel_de_posting_read(dev_priv, reg);
1065 return;
1066 }
1067
1068 if (port != (val & VIDEO_DIP_PORT_MASK)) {
1069 drm_WARN(&dev_priv->drm, val & VIDEO_DIP_ENABLE,
1070 "DIP already enabled on port %c\n",
1071 (val & VIDEO_DIP_PORT_MASK) >> 29);
1072 val &= ~VIDEO_DIP_PORT_MASK;
1073 val |= port;
1074 }
1075
1076 val |= VIDEO_DIP_ENABLE;
1077 val &= ~(VIDEO_DIP_ENABLE_AVI |
1078 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1079 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1080
1081 if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
1082 val |= VIDEO_DIP_ENABLE_GCP;
1083
1084 intel_de_write(dev_priv, reg, val);
1085 intel_de_posting_read(dev_priv, reg);
1086
1087 intel_write_infoframe(encoder, crtc_state,
1088 HDMI_INFOFRAME_TYPE_AVI,
1089 &crtc_state->infoframes.avi);
1090 intel_write_infoframe(encoder, crtc_state,
1091 HDMI_INFOFRAME_TYPE_SPD,
1092 &crtc_state->infoframes.spd);
1093 intel_write_infoframe(encoder, crtc_state,
1094 HDMI_INFOFRAME_TYPE_VENDOR,
1095 &crtc_state->infoframes.hdmi);
1096 }
1097
1098 static void cpt_set_infoframes(struct intel_encoder *encoder,
1099 bool enable,
1100 const struct intel_crtc_state *crtc_state,
1101 const struct drm_connector_state *conn_state)
1102 {
1103 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1104 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1105 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
1106 i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe);
1107 u32 val = intel_de_read(dev_priv, reg);
1108
1109 assert_hdmi_port_disabled(intel_hdmi);
1110
1111
1112 val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
1113
1114 if (!enable) {
1115 if (!(val & VIDEO_DIP_ENABLE))
1116 return;
1117 val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
1118 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1119 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1120 intel_de_write(dev_priv, reg, val);
1121 intel_de_posting_read(dev_priv, reg);
1122 return;
1123 }
1124
1125
1126 val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
1127 val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1128 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1129
1130 if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
1131 val |= VIDEO_DIP_ENABLE_GCP;
1132
1133 intel_de_write(dev_priv, reg, val);
1134 intel_de_posting_read(dev_priv, reg);
1135
1136 intel_write_infoframe(encoder, crtc_state,
1137 HDMI_INFOFRAME_TYPE_AVI,
1138 &crtc_state->infoframes.avi);
1139 intel_write_infoframe(encoder, crtc_state,
1140 HDMI_INFOFRAME_TYPE_SPD,
1141 &crtc_state->infoframes.spd);
1142 intel_write_infoframe(encoder, crtc_state,
1143 HDMI_INFOFRAME_TYPE_VENDOR,
1144 &crtc_state->infoframes.hdmi);
1145 }
1146
1147 static void vlv_set_infoframes(struct intel_encoder *encoder,
1148 bool enable,
1149 const struct intel_crtc_state *crtc_state,
1150 const struct drm_connector_state *conn_state)
1151 {
1152 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1153 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1154 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
1155 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(crtc->pipe);
1156 u32 val = intel_de_read(dev_priv, reg);
1157 u32 port = VIDEO_DIP_PORT(encoder->port);
1158
1159 assert_hdmi_port_disabled(intel_hdmi);
1160
1161
1162 val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
1163
1164 if (!enable) {
1165 if (!(val & VIDEO_DIP_ENABLE))
1166 return;
1167 val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
1168 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1169 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1170 intel_de_write(dev_priv, reg, val);
1171 intel_de_posting_read(dev_priv, reg);
1172 return;
1173 }
1174
1175 if (port != (val & VIDEO_DIP_PORT_MASK)) {
1176 drm_WARN(&dev_priv->drm, val & VIDEO_DIP_ENABLE,
1177 "DIP already enabled on port %c\n",
1178 (val & VIDEO_DIP_PORT_MASK) >> 29);
1179 val &= ~VIDEO_DIP_PORT_MASK;
1180 val |= port;
1181 }
1182
1183 val |= VIDEO_DIP_ENABLE;
1184 val &= ~(VIDEO_DIP_ENABLE_AVI |
1185 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1186 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1187
1188 if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
1189 val |= VIDEO_DIP_ENABLE_GCP;
1190
1191 intel_de_write(dev_priv, reg, val);
1192 intel_de_posting_read(dev_priv, reg);
1193
1194 intel_write_infoframe(encoder, crtc_state,
1195 HDMI_INFOFRAME_TYPE_AVI,
1196 &crtc_state->infoframes.avi);
1197 intel_write_infoframe(encoder, crtc_state,
1198 HDMI_INFOFRAME_TYPE_SPD,
1199 &crtc_state->infoframes.spd);
1200 intel_write_infoframe(encoder, crtc_state,
1201 HDMI_INFOFRAME_TYPE_VENDOR,
1202 &crtc_state->infoframes.hdmi);
1203 }
1204
1205 static void hsw_set_infoframes(struct intel_encoder *encoder,
1206 bool enable,
1207 const struct intel_crtc_state *crtc_state,
1208 const struct drm_connector_state *conn_state)
1209 {
1210 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1211 i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
1212 u32 val = intel_de_read(dev_priv, reg);
1213
1214 assert_hdmi_transcoder_func_disabled(dev_priv,
1215 crtc_state->cpu_transcoder);
1216
1217 val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
1218 VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
1219 VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW |
1220 VIDEO_DIP_ENABLE_DRM_GLK);
1221
1222 if (!enable) {
1223 intel_de_write(dev_priv, reg, val);
1224 intel_de_posting_read(dev_priv, reg);
1225 return;
1226 }
1227
1228 if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
1229 val |= VIDEO_DIP_ENABLE_GCP_HSW;
1230
1231 intel_de_write(dev_priv, reg, val);
1232 intel_de_posting_read(dev_priv, reg);
1233
1234 intel_write_infoframe(encoder, crtc_state,
1235 HDMI_INFOFRAME_TYPE_AVI,
1236 &crtc_state->infoframes.avi);
1237 intel_write_infoframe(encoder, crtc_state,
1238 HDMI_INFOFRAME_TYPE_SPD,
1239 &crtc_state->infoframes.spd);
1240 intel_write_infoframe(encoder, crtc_state,
1241 HDMI_INFOFRAME_TYPE_VENDOR,
1242 &crtc_state->infoframes.hdmi);
1243 intel_write_infoframe(encoder, crtc_state,
1244 HDMI_INFOFRAME_TYPE_DRM,
1245 &crtc_state->infoframes.drm);
1246 }
1247
1248 void intel_dp_dual_mode_set_tmds_output(struct intel_hdmi *hdmi, bool enable)
1249 {
1250 struct drm_i915_private *dev_priv = intel_hdmi_to_i915(hdmi);
1251 struct i2c_adapter *adapter;
1252
1253 if (hdmi->dp_dual_mode.type < DRM_DP_DUAL_MODE_TYPE2_DVI)
1254 return;
1255
1256 adapter = intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);
1257
1258 drm_dbg_kms(&dev_priv->drm, "%s DP dual mode adaptor TMDS output\n",
1259 enable ? "Enabling" : "Disabling");
1260
1261 drm_dp_dual_mode_set_tmds_output(&dev_priv->drm, hdmi->dp_dual_mode.type, adapter, enable);
1262 }
1263
1264 static int intel_hdmi_hdcp_read(struct intel_digital_port *dig_port,
1265 unsigned int offset, void *buffer, size_t size)
1266 {
1267 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1268 struct intel_hdmi *hdmi = &dig_port->hdmi;
1269 struct i2c_adapter *adapter = intel_gmbus_get_adapter(i915,
1270 hdmi->ddc_bus);
1271 int ret;
1272 u8 start = offset & 0xff;
1273 struct i2c_msg msgs[] = {
1274 {
1275 .addr = DRM_HDCP_DDC_ADDR,
1276 .flags = 0,
1277 .len = 1,
1278 .buf = &start,
1279 },
1280 {
1281 .addr = DRM_HDCP_DDC_ADDR,
1282 .flags = I2C_M_RD,
1283 .len = size,
1284 .buf = buffer
1285 }
1286 };
1287 ret = i2c_transfer(adapter, msgs, ARRAY_SIZE(msgs));
1288 if (ret == ARRAY_SIZE(msgs))
1289 return 0;
1290 return ret >= 0 ? -EIO : ret;
1291 }
1292
1293 static int intel_hdmi_hdcp_write(struct intel_digital_port *dig_port,
1294 unsigned int offset, void *buffer, size_t size)
1295 {
1296 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1297 struct intel_hdmi *hdmi = &dig_port->hdmi;
1298 struct i2c_adapter *adapter = intel_gmbus_get_adapter(i915,
1299 hdmi->ddc_bus);
1300 int ret;
1301 u8 *write_buf;
1302 struct i2c_msg msg;
1303
1304 write_buf = kzalloc(size + 1, GFP_KERNEL);
1305 if (!write_buf)
1306 return -ENOMEM;
1307
1308 write_buf[0] = offset & 0xff;
1309 memcpy(&write_buf[1], buffer, size);
1310
1311 msg.addr = DRM_HDCP_DDC_ADDR;
1312 msg.flags = 0,
1313 msg.len = size + 1,
1314 msg.buf = write_buf;
1315
1316 ret = i2c_transfer(adapter, &msg, 1);
1317 if (ret == 1)
1318 ret = 0;
1319 else if (ret >= 0)
1320 ret = -EIO;
1321
1322 kfree(write_buf);
1323 return ret;
1324 }
1325
1326 static
1327 int intel_hdmi_hdcp_write_an_aksv(struct intel_digital_port *dig_port,
1328 u8 *an)
1329 {
1330 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1331 struct intel_hdmi *hdmi = &dig_port->hdmi;
1332 struct i2c_adapter *adapter = intel_gmbus_get_adapter(i915,
1333 hdmi->ddc_bus);
1334 int ret;
1335
1336 ret = intel_hdmi_hdcp_write(dig_port, DRM_HDCP_DDC_AN, an,
1337 DRM_HDCP_AN_LEN);
1338 if (ret) {
1339 drm_dbg_kms(&i915->drm, "Write An over DDC failed (%d)\n",
1340 ret);
1341 return ret;
1342 }
1343
1344 ret = intel_gmbus_output_aksv(adapter);
1345 if (ret < 0) {
1346 drm_dbg_kms(&i915->drm, "Failed to output aksv (%d)\n", ret);
1347 return ret;
1348 }
1349 return 0;
1350 }
1351
1352 static int intel_hdmi_hdcp_read_bksv(struct intel_digital_port *dig_port,
1353 u8 *bksv)
1354 {
1355 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1356
1357 int ret;
1358 ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_BKSV, bksv,
1359 DRM_HDCP_KSV_LEN);
1360 if (ret)
1361 drm_dbg_kms(&i915->drm, "Read Bksv over DDC failed (%d)\n",
1362 ret);
1363 return ret;
1364 }
1365
1366 static
1367 int intel_hdmi_hdcp_read_bstatus(struct intel_digital_port *dig_port,
1368 u8 *bstatus)
1369 {
1370 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1371
1372 int ret;
1373 ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_BSTATUS,
1374 bstatus, DRM_HDCP_BSTATUS_LEN);
1375 if (ret)
1376 drm_dbg_kms(&i915->drm, "Read bstatus over DDC failed (%d)\n",
1377 ret);
1378 return ret;
1379 }
1380
1381 static
1382 int intel_hdmi_hdcp_repeater_present(struct intel_digital_port *dig_port,
1383 bool *repeater_present)
1384 {
1385 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1386 int ret;
1387 u8 val;
1388
1389 ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_BCAPS, &val, 1);
1390 if (ret) {
1391 drm_dbg_kms(&i915->drm, "Read bcaps over DDC failed (%d)\n",
1392 ret);
1393 return ret;
1394 }
1395 *repeater_present = val & DRM_HDCP_DDC_BCAPS_REPEATER_PRESENT;
1396 return 0;
1397 }
1398
1399 static
1400 int intel_hdmi_hdcp_read_ri_prime(struct intel_digital_port *dig_port,
1401 u8 *ri_prime)
1402 {
1403 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1404
1405 int ret;
1406 ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_RI_PRIME,
1407 ri_prime, DRM_HDCP_RI_LEN);
1408 if (ret)
1409 drm_dbg_kms(&i915->drm, "Read Ri' over DDC failed (%d)\n",
1410 ret);
1411 return ret;
1412 }
1413
1414 static
1415 int intel_hdmi_hdcp_read_ksv_ready(struct intel_digital_port *dig_port,
1416 bool *ksv_ready)
1417 {
1418 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1419 int ret;
1420 u8 val;
1421
1422 ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_BCAPS, &val, 1);
1423 if (ret) {
1424 drm_dbg_kms(&i915->drm, "Read bcaps over DDC failed (%d)\n",
1425 ret);
1426 return ret;
1427 }
1428 *ksv_ready = val & DRM_HDCP_DDC_BCAPS_KSV_FIFO_READY;
1429 return 0;
1430 }
1431
1432 static
1433 int intel_hdmi_hdcp_read_ksv_fifo(struct intel_digital_port *dig_port,
1434 int num_downstream, u8 *ksv_fifo)
1435 {
1436 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1437 int ret;
1438 ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_KSV_FIFO,
1439 ksv_fifo, num_downstream * DRM_HDCP_KSV_LEN);
1440 if (ret) {
1441 drm_dbg_kms(&i915->drm,
1442 "Read ksv fifo over DDC failed (%d)\n", ret);
1443 return ret;
1444 }
1445 return 0;
1446 }
1447
1448 static
1449 int intel_hdmi_hdcp_read_v_prime_part(struct intel_digital_port *dig_port,
1450 int i, u32 *part)
1451 {
1452 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1453 int ret;
1454
1455 if (i >= DRM_HDCP_V_PRIME_NUM_PARTS)
1456 return -EINVAL;
1457
1458 ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_V_PRIME(i),
1459 part, DRM_HDCP_V_PRIME_PART_LEN);
1460 if (ret)
1461 drm_dbg_kms(&i915->drm, "Read V'[%d] over DDC failed (%d)\n",
1462 i, ret);
1463 return ret;
1464 }
1465
1466 static int kbl_repositioning_enc_en_signal(struct intel_connector *connector,
1467 enum transcoder cpu_transcoder)
1468 {
1469 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1470 struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1471 struct intel_crtc *crtc = to_intel_crtc(connector->base.state->crtc);
1472 u32 scanline;
1473 int ret;
1474
1475 for (;;) {
1476 scanline = intel_de_read(dev_priv, PIPEDSL(crtc->pipe));
1477 if (scanline > 100 && scanline < 200)
1478 break;
1479 usleep_range(25, 50);
1480 }
1481
1482 ret = intel_ddi_toggle_hdcp_bits(&dig_port->base, cpu_transcoder,
1483 false, TRANS_DDI_HDCP_SIGNALLING);
1484 if (ret) {
1485 drm_err(&dev_priv->drm,
1486 "Disable HDCP signalling failed (%d)\n", ret);
1487 return ret;
1488 }
1489
1490 ret = intel_ddi_toggle_hdcp_bits(&dig_port->base, cpu_transcoder,
1491 true, TRANS_DDI_HDCP_SIGNALLING);
1492 if (ret) {
1493 drm_err(&dev_priv->drm,
1494 "Enable HDCP signalling failed (%d)\n", ret);
1495 return ret;
1496 }
1497
1498 return 0;
1499 }
1500
1501 static
1502 int intel_hdmi_hdcp_toggle_signalling(struct intel_digital_port *dig_port,
1503 enum transcoder cpu_transcoder,
1504 bool enable)
1505 {
1506 struct intel_hdmi *hdmi = &dig_port->hdmi;
1507 struct intel_connector *connector = hdmi->attached_connector;
1508 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1509 int ret;
1510
1511 if (!enable)
1512 usleep_range(6, 60);
1513
1514 ret = intel_ddi_toggle_hdcp_bits(&dig_port->base,
1515 cpu_transcoder, enable,
1516 TRANS_DDI_HDCP_SIGNALLING);
1517 if (ret) {
1518 drm_err(&dev_priv->drm, "%s HDCP signalling failed (%d)\n",
1519 enable ? "Enable" : "Disable", ret);
1520 return ret;
1521 }
1522
1523
1524
1525
1526
1527 if (IS_KABYLAKE(dev_priv) && enable)
1528 return kbl_repositioning_enc_en_signal(connector,
1529 cpu_transcoder);
1530
1531 return 0;
1532 }
1533
1534 static
1535 bool intel_hdmi_hdcp_check_link_once(struct intel_digital_port *dig_port,
1536 struct intel_connector *connector)
1537 {
1538 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1539 enum port port = dig_port->base.port;
1540 enum transcoder cpu_transcoder = connector->hdcp.cpu_transcoder;
1541 int ret;
1542 union {
1543 u32 reg;
1544 u8 shim[DRM_HDCP_RI_LEN];
1545 } ri;
1546
1547 ret = intel_hdmi_hdcp_read_ri_prime(dig_port, ri.shim);
1548 if (ret)
1549 return false;
1550
1551 intel_de_write(i915, HDCP_RPRIME(i915, cpu_transcoder, port), ri.reg);
1552
1553
1554 if (wait_for((intel_de_read(i915, HDCP_STATUS(i915, cpu_transcoder, port)) &
1555 (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC)) ==
1556 (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1)) {
1557 drm_dbg_kms(&i915->drm, "Ri' mismatch detected (%x)\n",
1558 intel_de_read(i915, HDCP_STATUS(i915, cpu_transcoder,
1559 port)));
1560 return false;
1561 }
1562 return true;
1563 }
1564
1565 static
1566 bool intel_hdmi_hdcp_check_link(struct intel_digital_port *dig_port,
1567 struct intel_connector *connector)
1568 {
1569 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1570 int retry;
1571
1572 for (retry = 0; retry < 3; retry++)
1573 if (intel_hdmi_hdcp_check_link_once(dig_port, connector))
1574 return true;
1575
1576 drm_err(&i915->drm, "Link check failed\n");
1577 return false;
1578 }
1579
1580 struct hdcp2_hdmi_msg_timeout {
1581 u8 msg_id;
1582 u16 timeout;
1583 };
1584
1585 static const struct hdcp2_hdmi_msg_timeout hdcp2_msg_timeout[] = {
1586 { HDCP_2_2_AKE_SEND_CERT, HDCP_2_2_CERT_TIMEOUT_MS, },
1587 { HDCP_2_2_AKE_SEND_PAIRING_INFO, HDCP_2_2_PAIRING_TIMEOUT_MS, },
1588 { HDCP_2_2_LC_SEND_LPRIME, HDCP_2_2_HDMI_LPRIME_TIMEOUT_MS, },
1589 { HDCP_2_2_REP_SEND_RECVID_LIST, HDCP_2_2_RECVID_LIST_TIMEOUT_MS, },
1590 { HDCP_2_2_REP_STREAM_READY, HDCP_2_2_STREAM_READY_TIMEOUT_MS, },
1591 };
1592
1593 static
1594 int intel_hdmi_hdcp2_read_rx_status(struct intel_digital_port *dig_port,
1595 u8 *rx_status)
1596 {
1597 return intel_hdmi_hdcp_read(dig_port,
1598 HDCP_2_2_HDMI_REG_RXSTATUS_OFFSET,
1599 rx_status,
1600 HDCP_2_2_HDMI_RXSTATUS_LEN);
1601 }
1602
1603 static int get_hdcp2_msg_timeout(u8 msg_id, bool is_paired)
1604 {
1605 int i;
1606
1607 if (msg_id == HDCP_2_2_AKE_SEND_HPRIME) {
1608 if (is_paired)
1609 return HDCP_2_2_HPRIME_PAIRED_TIMEOUT_MS;
1610 else
1611 return HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT_MS;
1612 }
1613
1614 for (i = 0; i < ARRAY_SIZE(hdcp2_msg_timeout); i++) {
1615 if (hdcp2_msg_timeout[i].msg_id == msg_id)
1616 return hdcp2_msg_timeout[i].timeout;
1617 }
1618
1619 return -EINVAL;
1620 }
1621
1622 static int
1623 hdcp2_detect_msg_availability(struct intel_digital_port *dig_port,
1624 u8 msg_id, bool *msg_ready,
1625 ssize_t *msg_sz)
1626 {
1627 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1628 u8 rx_status[HDCP_2_2_HDMI_RXSTATUS_LEN];
1629 int ret;
1630
1631 ret = intel_hdmi_hdcp2_read_rx_status(dig_port, rx_status);
1632 if (ret < 0) {
1633 drm_dbg_kms(&i915->drm, "rx_status read failed. Err %d\n",
1634 ret);
1635 return ret;
1636 }
1637
1638 *msg_sz = ((HDCP_2_2_HDMI_RXSTATUS_MSG_SZ_HI(rx_status[1]) << 8) |
1639 rx_status[0]);
1640
1641 if (msg_id == HDCP_2_2_REP_SEND_RECVID_LIST)
1642 *msg_ready = (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]) &&
1643 *msg_sz);
1644 else
1645 *msg_ready = *msg_sz;
1646
1647 return 0;
1648 }
1649
1650 static ssize_t
1651 intel_hdmi_hdcp2_wait_for_msg(struct intel_digital_port *dig_port,
1652 u8 msg_id, bool paired)
1653 {
1654 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1655 bool msg_ready = false;
1656 int timeout, ret;
1657 ssize_t msg_sz = 0;
1658
1659 timeout = get_hdcp2_msg_timeout(msg_id, paired);
1660 if (timeout < 0)
1661 return timeout;
1662
1663 ret = __wait_for(ret = hdcp2_detect_msg_availability(dig_port,
1664 msg_id, &msg_ready,
1665 &msg_sz),
1666 !ret && msg_ready && msg_sz, timeout * 1000,
1667 1000, 5 * 1000);
1668 if (ret)
1669 drm_dbg_kms(&i915->drm, "msg_id: %d, ret: %d, timeout: %d\n",
1670 msg_id, ret, timeout);
1671
1672 return ret ? ret : msg_sz;
1673 }
1674
1675 static
1676 int intel_hdmi_hdcp2_write_msg(struct intel_digital_port *dig_port,
1677 void *buf, size_t size)
1678 {
1679 unsigned int offset;
1680
1681 offset = HDCP_2_2_HDMI_REG_WR_MSG_OFFSET;
1682 return intel_hdmi_hdcp_write(dig_port, offset, buf, size);
1683 }
1684
1685 static
1686 int intel_hdmi_hdcp2_read_msg(struct intel_digital_port *dig_port,
1687 u8 msg_id, void *buf, size_t size)
1688 {
1689 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1690 struct intel_hdmi *hdmi = &dig_port->hdmi;
1691 struct intel_hdcp *hdcp = &hdmi->attached_connector->hdcp;
1692 unsigned int offset;
1693 ssize_t ret;
1694
1695 ret = intel_hdmi_hdcp2_wait_for_msg(dig_port, msg_id,
1696 hdcp->is_paired);
1697 if (ret < 0)
1698 return ret;
1699
1700
1701
1702
1703
1704 if (ret > size) {
1705 drm_dbg_kms(&i915->drm,
1706 "msg_sz(%zd) is more than exp size(%zu)\n",
1707 ret, size);
1708 return -EINVAL;
1709 }
1710
1711 offset = HDCP_2_2_HDMI_REG_RD_MSG_OFFSET;
1712 ret = intel_hdmi_hdcp_read(dig_port, offset, buf, ret);
1713 if (ret)
1714 drm_dbg_kms(&i915->drm, "Failed to read msg_id: %d(%zd)\n",
1715 msg_id, ret);
1716
1717 return ret;
1718 }
1719
1720 static
1721 int intel_hdmi_hdcp2_check_link(struct intel_digital_port *dig_port,
1722 struct intel_connector *connector)
1723 {
1724 u8 rx_status[HDCP_2_2_HDMI_RXSTATUS_LEN];
1725 int ret;
1726
1727 ret = intel_hdmi_hdcp2_read_rx_status(dig_port, rx_status);
1728 if (ret)
1729 return ret;
1730
1731
1732
1733
1734
1735 if (HDCP_2_2_HDMI_RXSTATUS_REAUTH_REQ(rx_status[1]))
1736 ret = HDCP_REAUTH_REQUEST;
1737 else if (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]))
1738 ret = HDCP_TOPOLOGY_CHANGE;
1739
1740 return ret;
1741 }
1742
1743 static
1744 int intel_hdmi_hdcp2_capable(struct intel_digital_port *dig_port,
1745 bool *capable)
1746 {
1747 u8 hdcp2_version;
1748 int ret;
1749
1750 *capable = false;
1751 ret = intel_hdmi_hdcp_read(dig_port, HDCP_2_2_HDMI_REG_VER_OFFSET,
1752 &hdcp2_version, sizeof(hdcp2_version));
1753 if (!ret && hdcp2_version & HDCP_2_2_HDMI_SUPPORT_MASK)
1754 *capable = true;
1755
1756 return ret;
1757 }
1758
1759 static const struct intel_hdcp_shim intel_hdmi_hdcp_shim = {
1760 .write_an_aksv = intel_hdmi_hdcp_write_an_aksv,
1761 .read_bksv = intel_hdmi_hdcp_read_bksv,
1762 .read_bstatus = intel_hdmi_hdcp_read_bstatus,
1763 .repeater_present = intel_hdmi_hdcp_repeater_present,
1764 .read_ri_prime = intel_hdmi_hdcp_read_ri_prime,
1765 .read_ksv_ready = intel_hdmi_hdcp_read_ksv_ready,
1766 .read_ksv_fifo = intel_hdmi_hdcp_read_ksv_fifo,
1767 .read_v_prime_part = intel_hdmi_hdcp_read_v_prime_part,
1768 .toggle_signalling = intel_hdmi_hdcp_toggle_signalling,
1769 .check_link = intel_hdmi_hdcp_check_link,
1770 .write_2_2_msg = intel_hdmi_hdcp2_write_msg,
1771 .read_2_2_msg = intel_hdmi_hdcp2_read_msg,
1772 .check_2_2_link = intel_hdmi_hdcp2_check_link,
1773 .hdcp_2_2_capable = intel_hdmi_hdcp2_capable,
1774 .protocol = HDCP_PROTOCOL_HDMI,
1775 };
1776
1777 static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
1778 {
1779 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1780 int max_tmds_clock, vbt_max_tmds_clock;
1781
1782 if (DISPLAY_VER(dev_priv) >= 10)
1783 max_tmds_clock = 594000;
1784 else if (DISPLAY_VER(dev_priv) >= 8 || IS_HASWELL(dev_priv))
1785 max_tmds_clock = 300000;
1786 else if (DISPLAY_VER(dev_priv) >= 5)
1787 max_tmds_clock = 225000;
1788 else
1789 max_tmds_clock = 165000;
1790
1791 vbt_max_tmds_clock = intel_bios_max_tmds_clock(encoder);
1792 if (vbt_max_tmds_clock)
1793 max_tmds_clock = min(max_tmds_clock, vbt_max_tmds_clock);
1794
1795 return max_tmds_clock;
1796 }
1797
1798 static bool intel_has_hdmi_sink(struct intel_hdmi *hdmi,
1799 const struct drm_connector_state *conn_state)
1800 {
1801 return hdmi->has_hdmi_sink &&
1802 READ_ONCE(to_intel_digital_connector_state(conn_state)->force_audio) != HDMI_AUDIO_OFF_DVI;
1803 }
1804
1805 static bool intel_hdmi_is_ycbcr420(const struct intel_crtc_state *crtc_state)
1806 {
1807 return crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420;
1808 }
1809
1810 static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
1811 bool respect_downstream_limits,
1812 bool has_hdmi_sink)
1813 {
1814 struct intel_encoder *encoder = &hdmi_to_dig_port(hdmi)->base;
1815 int max_tmds_clock = intel_hdmi_source_max_tmds_clock(encoder);
1816
1817 if (respect_downstream_limits) {
1818 struct intel_connector *connector = hdmi->attached_connector;
1819 const struct drm_display_info *info = &connector->base.display_info;
1820
1821 if (hdmi->dp_dual_mode.max_tmds_clock)
1822 max_tmds_clock = min(max_tmds_clock,
1823 hdmi->dp_dual_mode.max_tmds_clock);
1824
1825 if (info->max_tmds_clock)
1826 max_tmds_clock = min(max_tmds_clock,
1827 info->max_tmds_clock);
1828 else if (!has_hdmi_sink)
1829 max_tmds_clock = min(max_tmds_clock, 165000);
1830 }
1831
1832 return max_tmds_clock;
1833 }
1834
1835 static enum drm_mode_status
1836 hdmi_port_clock_valid(struct intel_hdmi *hdmi,
1837 int clock, bool respect_downstream_limits,
1838 bool has_hdmi_sink)
1839 {
1840 struct drm_i915_private *dev_priv = intel_hdmi_to_i915(hdmi);
1841 enum phy phy = intel_port_to_phy(dev_priv, hdmi_to_dig_port(hdmi)->base.port);
1842
1843 if (clock < 25000)
1844 return MODE_CLOCK_LOW;
1845 if (clock > hdmi_port_clock_limit(hdmi, respect_downstream_limits,
1846 has_hdmi_sink))
1847 return MODE_CLOCK_HIGH;
1848
1849
1850 if (IS_GEMINILAKE(dev_priv) && clock > 446666 && clock < 480000)
1851 return MODE_CLOCK_RANGE;
1852
1853
1854 if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
1855 clock > 223333 && clock < 240000)
1856 return MODE_CLOCK_RANGE;
1857
1858
1859 if (IS_CHERRYVIEW(dev_priv) && clock > 216000 && clock < 240000)
1860 return MODE_CLOCK_RANGE;
1861
1862
1863 if (intel_phy_is_combo(dev_priv, phy) && clock > 500000 && clock < 533200)
1864 return MODE_CLOCK_RANGE;
1865
1866
1867 if (intel_phy_is_tc(dev_priv, phy) && clock > 500000 && clock < 532800)
1868 return MODE_CLOCK_RANGE;
1869
1870
1871
1872
1873
1874
1875
1876
1877 if (IS_DG2(dev_priv))
1878 return intel_snps_phy_check_hdmi_link_rate(clock);
1879
1880 return MODE_OK;
1881 }
1882
1883 int intel_hdmi_tmds_clock(int clock, int bpc, bool ycbcr420_output)
1884 {
1885
1886 if (ycbcr420_output)
1887 clock /= 2;
1888
1889
1890
1891
1892
1893
1894 return clock * bpc / 8;
1895 }
1896
1897 static bool intel_hdmi_source_bpc_possible(struct drm_i915_private *i915, int bpc)
1898 {
1899 switch (bpc) {
1900 case 12:
1901 return !HAS_GMCH(i915);
1902 case 10:
1903 return DISPLAY_VER(i915) >= 11;
1904 case 8:
1905 return true;
1906 default:
1907 MISSING_CASE(bpc);
1908 return false;
1909 }
1910 }
1911
1912 static bool intel_hdmi_sink_bpc_possible(struct drm_connector *connector,
1913 int bpc, bool has_hdmi_sink, bool ycbcr420_output)
1914 {
1915 const struct drm_display_info *info = &connector->display_info;
1916 const struct drm_hdmi_info *hdmi = &info->hdmi;
1917
1918 switch (bpc) {
1919 case 12:
1920 if (!has_hdmi_sink)
1921 return false;
1922
1923 if (ycbcr420_output)
1924 return hdmi->y420_dc_modes & DRM_EDID_YCBCR420_DC_36;
1925 else
1926 return info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_36;
1927 case 10:
1928 if (!has_hdmi_sink)
1929 return false;
1930
1931 if (ycbcr420_output)
1932 return hdmi->y420_dc_modes & DRM_EDID_YCBCR420_DC_30;
1933 else
1934 return info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_30;
1935 case 8:
1936 return true;
1937 default:
1938 MISSING_CASE(bpc);
1939 return false;
1940 }
1941 }
1942
1943 static enum drm_mode_status
1944 intel_hdmi_mode_clock_valid(struct drm_connector *connector, int clock,
1945 bool has_hdmi_sink, bool ycbcr420_output)
1946 {
1947 struct drm_i915_private *i915 = to_i915(connector->dev);
1948 struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector));
1949 enum drm_mode_status status = MODE_OK;
1950 int bpc;
1951
1952
1953
1954
1955
1956
1957 for (bpc = 12; bpc >= 8; bpc -= 2) {
1958 int tmds_clock = intel_hdmi_tmds_clock(clock, bpc, ycbcr420_output);
1959
1960 if (!intel_hdmi_source_bpc_possible(i915, bpc))
1961 continue;
1962
1963 if (!intel_hdmi_sink_bpc_possible(connector, bpc, has_hdmi_sink, ycbcr420_output))
1964 continue;
1965
1966 status = hdmi_port_clock_valid(hdmi, tmds_clock, true, has_hdmi_sink);
1967 if (status == MODE_OK)
1968 return MODE_OK;
1969 }
1970
1971
1972 drm_WARN_ON(&i915->drm, status == MODE_OK);
1973
1974 return status;
1975 }
1976
1977 static enum drm_mode_status
1978 intel_hdmi_mode_valid(struct drm_connector *connector,
1979 struct drm_display_mode *mode)
1980 {
1981 struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector));
1982 struct drm_i915_private *dev_priv = intel_hdmi_to_i915(hdmi);
1983 enum drm_mode_status status;
1984 int clock = mode->clock;
1985 int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
1986 bool has_hdmi_sink = intel_has_hdmi_sink(hdmi, connector->state);
1987 bool ycbcr_420_only;
1988
1989 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
1990 return MODE_NO_DBLESCAN;
1991
1992 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING)
1993 clock *= 2;
1994
1995 if (clock > max_dotclk)
1996 return MODE_CLOCK_HIGH;
1997
1998 if (mode->flags & DRM_MODE_FLAG_DBLCLK) {
1999 if (!has_hdmi_sink)
2000 return MODE_CLOCK_LOW;
2001 clock *= 2;
2002 }
2003
2004 ycbcr_420_only = drm_mode_is_420_only(&connector->display_info, mode);
2005
2006 status = intel_hdmi_mode_clock_valid(connector, clock, has_hdmi_sink, ycbcr_420_only);
2007 if (status != MODE_OK) {
2008 if (ycbcr_420_only ||
2009 !connector->ycbcr_420_allowed ||
2010 !drm_mode_is_420_also(&connector->display_info, mode))
2011 return status;
2012
2013 status = intel_hdmi_mode_clock_valid(connector, clock, has_hdmi_sink, true);
2014 if (status != MODE_OK)
2015 return status;
2016 }
2017
2018 return intel_mode_valid_max_plane_size(dev_priv, mode, false);
2019 }
2020
2021 bool intel_hdmi_bpc_possible(const struct intel_crtc_state *crtc_state,
2022 int bpc, bool has_hdmi_sink, bool ycbcr420_output)
2023 {
2024 struct drm_atomic_state *state = crtc_state->uapi.state;
2025 struct drm_connector_state *connector_state;
2026 struct drm_connector *connector;
2027 int i;
2028
2029 for_each_new_connector_in_state(state, connector, connector_state, i) {
2030 if (connector_state->crtc != crtc_state->uapi.crtc)
2031 continue;
2032
2033 if (!intel_hdmi_sink_bpc_possible(connector, bpc, has_hdmi_sink, ycbcr420_output))
2034 return false;
2035 }
2036
2037 return true;
2038 }
2039
2040 static bool hdmi_bpc_possible(const struct intel_crtc_state *crtc_state, int bpc)
2041 {
2042 struct drm_i915_private *dev_priv =
2043 to_i915(crtc_state->uapi.crtc->dev);
2044 const struct drm_display_mode *adjusted_mode =
2045 &crtc_state->hw.adjusted_mode;
2046
2047 if (!intel_hdmi_source_bpc_possible(dev_priv, bpc))
2048 return false;
2049
2050
2051
2052
2053
2054 if (bpc > 8 && crtc_state->output_types != BIT(INTEL_OUTPUT_HDMI))
2055 return false;
2056
2057
2058 if (intel_hdmi_is_ycbcr420(crtc_state) &&
2059 bpc == 10 && DISPLAY_VER(dev_priv) == 11 &&
2060 (adjusted_mode->crtc_hblank_end -
2061 adjusted_mode->crtc_hblank_start) % 8 == 2)
2062 return false;
2063
2064 return intel_hdmi_bpc_possible(crtc_state, bpc, crtc_state->has_hdmi_sink,
2065 intel_hdmi_is_ycbcr420(crtc_state));
2066 }
2067
2068 static int intel_hdmi_compute_bpc(struct intel_encoder *encoder,
2069 struct intel_crtc_state *crtc_state,
2070 int clock, bool respect_downstream_limits)
2071 {
2072 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2073 bool ycbcr420_output = intel_hdmi_is_ycbcr420(crtc_state);
2074 int bpc;
2075
2076
2077
2078
2079
2080 bpc = max(crtc_state->pipe_bpp / 3, 8);
2081
2082
2083
2084
2085
2086
2087 if (!respect_downstream_limits)
2088 bpc = 8;
2089
2090 for (; bpc >= 8; bpc -= 2) {
2091 int tmds_clock = intel_hdmi_tmds_clock(clock, bpc, ycbcr420_output);
2092
2093 if (hdmi_bpc_possible(crtc_state, bpc) &&
2094 hdmi_port_clock_valid(intel_hdmi, tmds_clock,
2095 respect_downstream_limits,
2096 crtc_state->has_hdmi_sink) == MODE_OK)
2097 return bpc;
2098 }
2099
2100 return -EINVAL;
2101 }
2102
2103 static int intel_hdmi_compute_clock(struct intel_encoder *encoder,
2104 struct intel_crtc_state *crtc_state,
2105 bool respect_downstream_limits)
2106 {
2107 struct drm_i915_private *i915 = to_i915(encoder->base.dev);
2108 const struct drm_display_mode *adjusted_mode =
2109 &crtc_state->hw.adjusted_mode;
2110 int bpc, clock = adjusted_mode->crtc_clock;
2111
2112 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
2113 clock *= 2;
2114
2115 bpc = intel_hdmi_compute_bpc(encoder, crtc_state, clock,
2116 respect_downstream_limits);
2117 if (bpc < 0)
2118 return bpc;
2119
2120 crtc_state->port_clock =
2121 intel_hdmi_tmds_clock(clock, bpc, intel_hdmi_is_ycbcr420(crtc_state));
2122
2123
2124
2125
2126
2127
2128 crtc_state->pipe_bpp = min(crtc_state->pipe_bpp, bpc * 3);
2129
2130 drm_dbg_kms(&i915->drm,
2131 "picking %d bpc for HDMI output (pipe bpp: %d)\n",
2132 bpc, crtc_state->pipe_bpp);
2133
2134 return 0;
2135 }
2136
2137 bool intel_hdmi_limited_color_range(const struct intel_crtc_state *crtc_state,
2138 const struct drm_connector_state *conn_state)
2139 {
2140 const struct intel_digital_connector_state *intel_conn_state =
2141 to_intel_digital_connector_state(conn_state);
2142 const struct drm_display_mode *adjusted_mode =
2143 &crtc_state->hw.adjusted_mode;
2144
2145
2146
2147
2148
2149
2150
2151
2152 if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB)
2153 return false;
2154
2155 if (intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_AUTO) {
2156
2157 return crtc_state->has_hdmi_sink &&
2158 drm_default_rgb_quant_range(adjusted_mode) ==
2159 HDMI_QUANTIZATION_RANGE_LIMITED;
2160 } else {
2161 return intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_LIMITED;
2162 }
2163 }
2164
2165 static bool intel_hdmi_has_audio(struct intel_encoder *encoder,
2166 const struct intel_crtc_state *crtc_state,
2167 const struct drm_connector_state *conn_state)
2168 {
2169 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2170 const struct intel_digital_connector_state *intel_conn_state =
2171 to_intel_digital_connector_state(conn_state);
2172
2173 if (!crtc_state->has_hdmi_sink)
2174 return false;
2175
2176 if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
2177 return intel_hdmi->has_audio;
2178 else
2179 return intel_conn_state->force_audio == HDMI_AUDIO_ON;
2180 }
2181
2182 static enum intel_output_format
2183 intel_hdmi_output_format(struct intel_connector *connector,
2184 bool ycbcr_420_output)
2185 {
2186 if (connector->base.ycbcr_420_allowed && ycbcr_420_output)
2187 return INTEL_OUTPUT_FORMAT_YCBCR420;
2188 else
2189 return INTEL_OUTPUT_FORMAT_RGB;
2190 }
2191
2192 static int intel_hdmi_compute_output_format(struct intel_encoder *encoder,
2193 struct intel_crtc_state *crtc_state,
2194 const struct drm_connector_state *conn_state,
2195 bool respect_downstream_limits)
2196 {
2197 struct intel_connector *connector = to_intel_connector(conn_state->connector);
2198 const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
2199 const struct drm_display_info *info = &connector->base.display_info;
2200 struct drm_i915_private *i915 = to_i915(connector->base.dev);
2201 bool ycbcr_420_only = drm_mode_is_420_only(info, adjusted_mode);
2202 int ret;
2203
2204 crtc_state->output_format = intel_hdmi_output_format(connector, ycbcr_420_only);
2205
2206 if (ycbcr_420_only && !intel_hdmi_is_ycbcr420(crtc_state)) {
2207 drm_dbg_kms(&i915->drm,
2208 "YCbCr 4:2:0 mode but YCbCr 4:2:0 output not possible. Falling back to RGB.\n");
2209 crtc_state->output_format = INTEL_OUTPUT_FORMAT_RGB;
2210 }
2211
2212 ret = intel_hdmi_compute_clock(encoder, crtc_state, respect_downstream_limits);
2213 if (ret) {
2214 if (intel_hdmi_is_ycbcr420(crtc_state) ||
2215 !connector->base.ycbcr_420_allowed ||
2216 !drm_mode_is_420_also(info, adjusted_mode))
2217 return ret;
2218
2219 crtc_state->output_format = intel_hdmi_output_format(connector, true);
2220 ret = intel_hdmi_compute_clock(encoder, crtc_state, respect_downstream_limits);
2221 }
2222
2223 return ret;
2224 }
2225
2226 int intel_hdmi_compute_config(struct intel_encoder *encoder,
2227 struct intel_crtc_state *pipe_config,
2228 struct drm_connector_state *conn_state)
2229 {
2230 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2231 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2232 struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
2233 struct drm_connector *connector = conn_state->connector;
2234 struct drm_scdc *scdc = &connector->display_info.hdmi.scdc;
2235 int ret;
2236
2237 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
2238 return -EINVAL;
2239
2240 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
2241 pipe_config->has_hdmi_sink = intel_has_hdmi_sink(intel_hdmi,
2242 conn_state);
2243
2244 if (pipe_config->has_hdmi_sink)
2245 pipe_config->has_infoframe = true;
2246
2247 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
2248 pipe_config->pixel_multiplier = 2;
2249
2250 if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv))
2251 pipe_config->has_pch_encoder = true;
2252
2253 pipe_config->has_audio =
2254 intel_hdmi_has_audio(encoder, pipe_config, conn_state);
2255
2256
2257
2258
2259
2260 ret = intel_hdmi_compute_output_format(encoder, pipe_config, conn_state, true);
2261 if (ret)
2262 ret = intel_hdmi_compute_output_format(encoder, pipe_config, conn_state, false);
2263 if (ret) {
2264 drm_dbg_kms(&dev_priv->drm,
2265 "unsupported HDMI clock (%d kHz), rejecting mode\n",
2266 pipe_config->hw.adjusted_mode.crtc_clock);
2267 return ret;
2268 }
2269
2270 if (intel_hdmi_is_ycbcr420(pipe_config)) {
2271 ret = intel_panel_fitting(pipe_config, conn_state);
2272 if (ret)
2273 return ret;
2274 }
2275
2276 pipe_config->limited_color_range =
2277 intel_hdmi_limited_color_range(pipe_config, conn_state);
2278
2279 if (conn_state->picture_aspect_ratio)
2280 adjusted_mode->picture_aspect_ratio =
2281 conn_state->picture_aspect_ratio;
2282
2283 pipe_config->lane_count = 4;
2284
2285 if (scdc->scrambling.supported && DISPLAY_VER(dev_priv) >= 10) {
2286 if (scdc->scrambling.low_rates)
2287 pipe_config->hdmi_scrambling = true;
2288
2289 if (pipe_config->port_clock > 340000) {
2290 pipe_config->hdmi_scrambling = true;
2291 pipe_config->hdmi_high_tmds_clock_ratio = true;
2292 }
2293 }
2294
2295 intel_hdmi_compute_gcp_infoframe(encoder, pipe_config,
2296 conn_state);
2297
2298 if (!intel_hdmi_compute_avi_infoframe(encoder, pipe_config, conn_state)) {
2299 drm_dbg_kms(&dev_priv->drm, "bad AVI infoframe\n");
2300 return -EINVAL;
2301 }
2302
2303 if (!intel_hdmi_compute_spd_infoframe(encoder, pipe_config, conn_state)) {
2304 drm_dbg_kms(&dev_priv->drm, "bad SPD infoframe\n");
2305 return -EINVAL;
2306 }
2307
2308 if (!intel_hdmi_compute_hdmi_infoframe(encoder, pipe_config, conn_state)) {
2309 drm_dbg_kms(&dev_priv->drm, "bad HDMI infoframe\n");
2310 return -EINVAL;
2311 }
2312
2313 if (!intel_hdmi_compute_drm_infoframe(encoder, pipe_config, conn_state)) {
2314 drm_dbg_kms(&dev_priv->drm, "bad DRM infoframe\n");
2315 return -EINVAL;
2316 }
2317
2318 return 0;
2319 }
2320
2321 void intel_hdmi_encoder_shutdown(struct intel_encoder *encoder)
2322 {
2323 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2324
2325
2326
2327
2328
2329 intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);
2330 }
2331
2332 static void
2333 intel_hdmi_unset_edid(struct drm_connector *connector)
2334 {
2335 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
2336
2337 intel_hdmi->has_hdmi_sink = false;
2338 intel_hdmi->has_audio = false;
2339
2340 intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
2341 intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
2342
2343 kfree(to_intel_connector(connector)->detect_edid);
2344 to_intel_connector(connector)->detect_edid = NULL;
2345 }
2346
2347 static void
2348 intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
2349 {
2350 struct drm_i915_private *dev_priv = to_i915(connector->dev);
2351 struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector));
2352 enum port port = hdmi_to_dig_port(hdmi)->base.port;
2353 struct i2c_adapter *adapter =
2354 intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);
2355 enum drm_dp_dual_mode_type type = drm_dp_dual_mode_detect(&dev_priv->drm, adapter);
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369 if (type == DRM_DP_DUAL_MODE_UNKNOWN) {
2370
2371
2372
2373 if (has_edid && !connector->override_edid &&
2374 intel_bios_is_port_dp_dual_mode(dev_priv, port)) {
2375 drm_dbg_kms(&dev_priv->drm,
2376 "Assuming DP dual mode adaptor presence based on VBT\n");
2377 type = DRM_DP_DUAL_MODE_TYPE1_DVI;
2378 } else {
2379 type = DRM_DP_DUAL_MODE_NONE;
2380 }
2381 }
2382
2383 if (type == DRM_DP_DUAL_MODE_NONE)
2384 return;
2385
2386 hdmi->dp_dual_mode.type = type;
2387 hdmi->dp_dual_mode.max_tmds_clock =
2388 drm_dp_dual_mode_max_tmds_clock(&dev_priv->drm, type, adapter);
2389
2390 drm_dbg_kms(&dev_priv->drm,
2391 "DP dual mode adaptor (%s) detected (max TMDS clock: %d kHz)\n",
2392 drm_dp_get_dual_mode_type_name(type),
2393 hdmi->dp_dual_mode.max_tmds_clock);
2394
2395
2396 if ((DISPLAY_VER(dev_priv) >= 8 || IS_HASWELL(dev_priv)) &&
2397 !intel_bios_is_port_dp_dual_mode(dev_priv, port)) {
2398 drm_dbg_kms(&dev_priv->drm,
2399 "Ignoring DP dual mode adaptor max TMDS clock for native HDMI port\n");
2400 hdmi->dp_dual_mode.max_tmds_clock = 0;
2401 }
2402 }
2403
2404 static bool
2405 intel_hdmi_set_edid(struct drm_connector *connector)
2406 {
2407 struct drm_i915_private *dev_priv = to_i915(connector->dev);
2408 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
2409 intel_wakeref_t wakeref;
2410 struct edid *edid;
2411 bool connected = false;
2412 struct i2c_adapter *i2c;
2413
2414 wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
2415
2416 i2c = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
2417
2418 edid = drm_get_edid(connector, i2c);
2419
2420 if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
2421 drm_dbg_kms(&dev_priv->drm,
2422 "HDMI GMBUS EDID read failed, retry using GPIO bit-banging\n");
2423 intel_gmbus_force_bit(i2c, true);
2424 edid = drm_get_edid(connector, i2c);
2425 intel_gmbus_force_bit(i2c, false);
2426 }
2427
2428 intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
2429
2430 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);
2431
2432 to_intel_connector(connector)->detect_edid = edid;
2433 if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
2434 intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
2435 intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
2436
2437 connected = true;
2438 }
2439
2440 cec_notifier_set_phys_addr_from_edid(intel_hdmi->cec_notifier, edid);
2441
2442 return connected;
2443 }
2444
2445 static enum drm_connector_status
2446 intel_hdmi_detect(struct drm_connector *connector, bool force)
2447 {
2448 enum drm_connector_status status = connector_status_disconnected;
2449 struct drm_i915_private *dev_priv = to_i915(connector->dev);
2450 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
2451 struct intel_encoder *encoder = &hdmi_to_dig_port(intel_hdmi)->base;
2452 intel_wakeref_t wakeref;
2453
2454 drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n",
2455 connector->base.id, connector->name);
2456
2457 if (!INTEL_DISPLAY_ENABLED(dev_priv))
2458 return connector_status_disconnected;
2459
2460 wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
2461
2462 if (DISPLAY_VER(dev_priv) >= 11 &&
2463 !intel_digital_port_connected(encoder))
2464 goto out;
2465
2466 intel_hdmi_unset_edid(connector);
2467
2468 if (intel_hdmi_set_edid(connector))
2469 status = connector_status_connected;
2470
2471 out:
2472 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);
2473
2474 if (status != connector_status_connected)
2475 cec_notifier_phys_addr_invalidate(intel_hdmi->cec_notifier);
2476
2477
2478
2479
2480
2481 intel_display_power_flush_work(dev_priv);
2482
2483 return status;
2484 }
2485
2486 static void
2487 intel_hdmi_force(struct drm_connector *connector)
2488 {
2489 struct drm_i915_private *i915 = to_i915(connector->dev);
2490
2491 drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s]\n",
2492 connector->base.id, connector->name);
2493
2494 intel_hdmi_unset_edid(connector);
2495
2496 if (connector->status != connector_status_connected)
2497 return;
2498
2499 intel_hdmi_set_edid(connector);
2500 }
2501
2502 static int intel_hdmi_get_modes(struct drm_connector *connector)
2503 {
2504 struct edid *edid;
2505
2506 edid = to_intel_connector(connector)->detect_edid;
2507 if (edid == NULL)
2508 return 0;
2509
2510 return intel_connector_update_modes(connector, edid);
2511 }
2512
2513 static struct i2c_adapter *
2514 intel_hdmi_get_i2c_adapter(struct drm_connector *connector)
2515 {
2516 struct drm_i915_private *dev_priv = to_i915(connector->dev);
2517 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
2518
2519 return intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
2520 }
2521
2522 static void intel_hdmi_create_i2c_symlink(struct drm_connector *connector)
2523 {
2524 struct drm_i915_private *i915 = to_i915(connector->dev);
2525 struct i2c_adapter *adapter = intel_hdmi_get_i2c_adapter(connector);
2526 struct kobject *i2c_kobj = &adapter->dev.kobj;
2527 struct kobject *connector_kobj = &connector->kdev->kobj;
2528 int ret;
2529
2530 ret = sysfs_create_link(connector_kobj, i2c_kobj, i2c_kobj->name);
2531 if (ret)
2532 drm_err(&i915->drm, "Failed to create i2c symlink (%d)\n", ret);
2533 }
2534
2535 static void intel_hdmi_remove_i2c_symlink(struct drm_connector *connector)
2536 {
2537 struct i2c_adapter *adapter = intel_hdmi_get_i2c_adapter(connector);
2538 struct kobject *i2c_kobj = &adapter->dev.kobj;
2539 struct kobject *connector_kobj = &connector->kdev->kobj;
2540
2541 sysfs_remove_link(connector_kobj, i2c_kobj->name);
2542 }
2543
2544 static int
2545 intel_hdmi_connector_register(struct drm_connector *connector)
2546 {
2547 int ret;
2548
2549 ret = intel_connector_register(connector);
2550 if (ret)
2551 return ret;
2552
2553 intel_hdmi_create_i2c_symlink(connector);
2554
2555 return ret;
2556 }
2557
2558 static void intel_hdmi_connector_unregister(struct drm_connector *connector)
2559 {
2560 struct cec_notifier *n = intel_attached_hdmi(to_intel_connector(connector))->cec_notifier;
2561
2562 cec_notifier_conn_unregister(n);
2563
2564 intel_hdmi_remove_i2c_symlink(connector);
2565 intel_connector_unregister(connector);
2566 }
2567
2568 static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
2569 .detect = intel_hdmi_detect,
2570 .force = intel_hdmi_force,
2571 .fill_modes = drm_helper_probe_single_connector_modes,
2572 .atomic_get_property = intel_digital_connector_atomic_get_property,
2573 .atomic_set_property = intel_digital_connector_atomic_set_property,
2574 .late_register = intel_hdmi_connector_register,
2575 .early_unregister = intel_hdmi_connector_unregister,
2576 .destroy = intel_connector_destroy,
2577 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
2578 .atomic_duplicate_state = intel_digital_connector_duplicate_state,
2579 };
2580
2581 static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
2582 .get_modes = intel_hdmi_get_modes,
2583 .mode_valid = intel_hdmi_mode_valid,
2584 .atomic_check = intel_digital_connector_atomic_check,
2585 };
2586
2587 static void
2588 intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
2589 {
2590 struct drm_i915_private *dev_priv = to_i915(connector->dev);
2591
2592 intel_attach_force_audio_property(connector);
2593 intel_attach_broadcast_rgb_property(connector);
2594 intel_attach_aspect_ratio_property(connector);
2595
2596 intel_attach_hdmi_colorspace_property(connector);
2597 drm_connector_attach_content_type_property(connector);
2598
2599 if (DISPLAY_VER(dev_priv) >= 10)
2600 drm_connector_attach_hdr_output_metadata_property(connector);
2601
2602 if (!HAS_GMCH(dev_priv))
2603 drm_connector_attach_max_bpc_property(connector, 8, 12);
2604 }
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624 bool intel_hdmi_handle_sink_scrambling(struct intel_encoder *encoder,
2625 struct drm_connector *connector,
2626 bool high_tmds_clock_ratio,
2627 bool scrambling)
2628 {
2629 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2630 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2631 struct drm_scrambling *sink_scrambling =
2632 &connector->display_info.hdmi.scdc.scrambling;
2633 struct i2c_adapter *adapter =
2634 intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
2635
2636 if (!sink_scrambling->supported)
2637 return true;
2638
2639 drm_dbg_kms(&dev_priv->drm,
2640 "[CONNECTOR:%d:%s] scrambling=%s, TMDS bit clock ratio=1/%d\n",
2641 connector->base.id, connector->name,
2642 str_yes_no(scrambling), high_tmds_clock_ratio ? 40 : 10);
2643
2644
2645 return drm_scdc_set_high_tmds_clock_ratio(adapter,
2646 high_tmds_clock_ratio) &&
2647 drm_scdc_set_scrambling(adapter, scrambling);
2648 }
2649
2650 static u8 chv_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2651 {
2652 u8 ddc_pin;
2653
2654 switch (port) {
2655 case PORT_B:
2656 ddc_pin = GMBUS_PIN_DPB;
2657 break;
2658 case PORT_C:
2659 ddc_pin = GMBUS_PIN_DPC;
2660 break;
2661 case PORT_D:
2662 ddc_pin = GMBUS_PIN_DPD_CHV;
2663 break;
2664 default:
2665 MISSING_CASE(port);
2666 ddc_pin = GMBUS_PIN_DPB;
2667 break;
2668 }
2669 return ddc_pin;
2670 }
2671
2672 static u8 bxt_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2673 {
2674 u8 ddc_pin;
2675
2676 switch (port) {
2677 case PORT_B:
2678 ddc_pin = GMBUS_PIN_1_BXT;
2679 break;
2680 case PORT_C:
2681 ddc_pin = GMBUS_PIN_2_BXT;
2682 break;
2683 default:
2684 MISSING_CASE(port);
2685 ddc_pin = GMBUS_PIN_1_BXT;
2686 break;
2687 }
2688 return ddc_pin;
2689 }
2690
2691 static u8 cnp_port_to_ddc_pin(struct drm_i915_private *dev_priv,
2692 enum port port)
2693 {
2694 u8 ddc_pin;
2695
2696 switch (port) {
2697 case PORT_B:
2698 ddc_pin = GMBUS_PIN_1_BXT;
2699 break;
2700 case PORT_C:
2701 ddc_pin = GMBUS_PIN_2_BXT;
2702 break;
2703 case PORT_D:
2704 ddc_pin = GMBUS_PIN_4_CNP;
2705 break;
2706 case PORT_F:
2707 ddc_pin = GMBUS_PIN_3_BXT;
2708 break;
2709 default:
2710 MISSING_CASE(port);
2711 ddc_pin = GMBUS_PIN_1_BXT;
2712 break;
2713 }
2714 return ddc_pin;
2715 }
2716
2717 static u8 icl_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2718 {
2719 enum phy phy = intel_port_to_phy(dev_priv, port);
2720
2721 if (intel_phy_is_combo(dev_priv, phy))
2722 return GMBUS_PIN_1_BXT + port;
2723 else if (intel_phy_is_tc(dev_priv, phy))
2724 return GMBUS_PIN_9_TC1_ICP + intel_port_to_tc(dev_priv, port);
2725
2726 drm_WARN(&dev_priv->drm, 1, "Unknown port:%c\n", port_name(port));
2727 return GMBUS_PIN_2_BXT;
2728 }
2729
2730 static u8 mcc_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2731 {
2732 enum phy phy = intel_port_to_phy(dev_priv, port);
2733 u8 ddc_pin;
2734
2735 switch (phy) {
2736 case PHY_A:
2737 ddc_pin = GMBUS_PIN_1_BXT;
2738 break;
2739 case PHY_B:
2740 ddc_pin = GMBUS_PIN_2_BXT;
2741 break;
2742 case PHY_C:
2743 ddc_pin = GMBUS_PIN_9_TC1_ICP;
2744 break;
2745 default:
2746 MISSING_CASE(phy);
2747 ddc_pin = GMBUS_PIN_1_BXT;
2748 break;
2749 }
2750 return ddc_pin;
2751 }
2752
2753 static u8 rkl_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2754 {
2755 enum phy phy = intel_port_to_phy(dev_priv, port);
2756
2757 WARN_ON(port == PORT_C);
2758
2759
2760
2761
2762
2763
2764
2765 if (INTEL_PCH_TYPE(dev_priv) >= PCH_TGP && phy >= PHY_C)
2766 return GMBUS_PIN_9_TC1_ICP + phy - PHY_C;
2767
2768 return GMBUS_PIN_1_BXT + phy;
2769 }
2770
2771 static u8 gen9bc_tgp_port_to_ddc_pin(struct drm_i915_private *i915, enum port port)
2772 {
2773 enum phy phy = intel_port_to_phy(i915, port);
2774
2775 drm_WARN_ON(&i915->drm, port == PORT_A);
2776
2777
2778
2779
2780
2781
2782
2783 if (INTEL_PCH_TYPE(i915) >= PCH_TGP && phy >= PHY_C)
2784 return GMBUS_PIN_9_TC1_ICP + phy - PHY_C;
2785
2786 return GMBUS_PIN_1_BXT + phy;
2787 }
2788
2789 static u8 dg1_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2790 {
2791 return intel_port_to_phy(dev_priv, port) + 1;
2792 }
2793
2794 static u8 adls_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2795 {
2796 enum phy phy = intel_port_to_phy(dev_priv, port);
2797
2798 WARN_ON(port == PORT_B || port == PORT_C);
2799
2800
2801
2802
2803
2804 if (phy == PHY_A)
2805 return GMBUS_PIN_1_BXT;
2806
2807 return GMBUS_PIN_9_TC1_ICP + phy - PHY_B;
2808 }
2809
2810 static u8 g4x_port_to_ddc_pin(struct drm_i915_private *dev_priv,
2811 enum port port)
2812 {
2813 u8 ddc_pin;
2814
2815 switch (port) {
2816 case PORT_B:
2817 ddc_pin = GMBUS_PIN_DPB;
2818 break;
2819 case PORT_C:
2820 ddc_pin = GMBUS_PIN_DPC;
2821 break;
2822 case PORT_D:
2823 ddc_pin = GMBUS_PIN_DPD;
2824 break;
2825 default:
2826 MISSING_CASE(port);
2827 ddc_pin = GMBUS_PIN_DPB;
2828 break;
2829 }
2830 return ddc_pin;
2831 }
2832
2833 static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
2834 {
2835 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2836 enum port port = encoder->port;
2837 u8 ddc_pin;
2838
2839 ddc_pin = intel_bios_alternate_ddc_pin(encoder);
2840 if (ddc_pin) {
2841 drm_dbg_kms(&dev_priv->drm,
2842 "Using DDC pin 0x%x for port %c (VBT)\n",
2843 ddc_pin, port_name(port));
2844 return ddc_pin;
2845 }
2846
2847 if (IS_ALDERLAKE_S(dev_priv))
2848 ddc_pin = adls_port_to_ddc_pin(dev_priv, port);
2849 else if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1)
2850 ddc_pin = dg1_port_to_ddc_pin(dev_priv, port);
2851 else if (IS_ROCKETLAKE(dev_priv))
2852 ddc_pin = rkl_port_to_ddc_pin(dev_priv, port);
2853 else if (DISPLAY_VER(dev_priv) == 9 && HAS_PCH_TGP(dev_priv))
2854 ddc_pin = gen9bc_tgp_port_to_ddc_pin(dev_priv, port);
2855 else if (IS_JSL_EHL(dev_priv) && HAS_PCH_TGP(dev_priv))
2856 ddc_pin = mcc_port_to_ddc_pin(dev_priv, port);
2857 else if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
2858 ddc_pin = icl_port_to_ddc_pin(dev_priv, port);
2859 else if (HAS_PCH_CNP(dev_priv))
2860 ddc_pin = cnp_port_to_ddc_pin(dev_priv, port);
2861 else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
2862 ddc_pin = bxt_port_to_ddc_pin(dev_priv, port);
2863 else if (IS_CHERRYVIEW(dev_priv))
2864 ddc_pin = chv_port_to_ddc_pin(dev_priv, port);
2865 else
2866 ddc_pin = g4x_port_to_ddc_pin(dev_priv, port);
2867
2868 drm_dbg_kms(&dev_priv->drm,
2869 "Using DDC pin 0x%x for port %c (platform default)\n",
2870 ddc_pin, port_name(port));
2871
2872 return ddc_pin;
2873 }
2874
2875 void intel_infoframe_init(struct intel_digital_port *dig_port)
2876 {
2877 struct drm_i915_private *dev_priv =
2878 to_i915(dig_port->base.base.dev);
2879
2880 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
2881 dig_port->write_infoframe = vlv_write_infoframe;
2882 dig_port->read_infoframe = vlv_read_infoframe;
2883 dig_port->set_infoframes = vlv_set_infoframes;
2884 dig_port->infoframes_enabled = vlv_infoframes_enabled;
2885 } else if (IS_G4X(dev_priv)) {
2886 dig_port->write_infoframe = g4x_write_infoframe;
2887 dig_port->read_infoframe = g4x_read_infoframe;
2888 dig_port->set_infoframes = g4x_set_infoframes;
2889 dig_port->infoframes_enabled = g4x_infoframes_enabled;
2890 } else if (HAS_DDI(dev_priv)) {
2891 if (intel_bios_is_lspcon_present(dev_priv, dig_port->base.port)) {
2892 dig_port->write_infoframe = lspcon_write_infoframe;
2893 dig_port->read_infoframe = lspcon_read_infoframe;
2894 dig_port->set_infoframes = lspcon_set_infoframes;
2895 dig_port->infoframes_enabled = lspcon_infoframes_enabled;
2896 } else {
2897 dig_port->write_infoframe = hsw_write_infoframe;
2898 dig_port->read_infoframe = hsw_read_infoframe;
2899 dig_port->set_infoframes = hsw_set_infoframes;
2900 dig_port->infoframes_enabled = hsw_infoframes_enabled;
2901 }
2902 } else if (HAS_PCH_IBX(dev_priv)) {
2903 dig_port->write_infoframe = ibx_write_infoframe;
2904 dig_port->read_infoframe = ibx_read_infoframe;
2905 dig_port->set_infoframes = ibx_set_infoframes;
2906 dig_port->infoframes_enabled = ibx_infoframes_enabled;
2907 } else {
2908 dig_port->write_infoframe = cpt_write_infoframe;
2909 dig_port->read_infoframe = cpt_read_infoframe;
2910 dig_port->set_infoframes = cpt_set_infoframes;
2911 dig_port->infoframes_enabled = cpt_infoframes_enabled;
2912 }
2913 }
2914
2915 void intel_hdmi_init_connector(struct intel_digital_port *dig_port,
2916 struct intel_connector *intel_connector)
2917 {
2918 struct drm_connector *connector = &intel_connector->base;
2919 struct intel_hdmi *intel_hdmi = &dig_port->hdmi;
2920 struct intel_encoder *intel_encoder = &dig_port->base;
2921 struct drm_device *dev = intel_encoder->base.dev;
2922 struct drm_i915_private *dev_priv = to_i915(dev);
2923 struct i2c_adapter *ddc;
2924 enum port port = intel_encoder->port;
2925 struct cec_connector_info conn_info;
2926
2927 drm_dbg_kms(&dev_priv->drm,
2928 "Adding HDMI connector on [ENCODER:%d:%s]\n",
2929 intel_encoder->base.base.id, intel_encoder->base.name);
2930
2931 if (DISPLAY_VER(dev_priv) < 12 && drm_WARN_ON(dev, port == PORT_A))
2932 return;
2933
2934 if (drm_WARN(dev, dig_port->max_lanes < 4,
2935 "Not enough lanes (%d) for HDMI on [ENCODER:%d:%s]\n",
2936 dig_port->max_lanes, intel_encoder->base.base.id,
2937 intel_encoder->base.name))
2938 return;
2939
2940 intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(intel_encoder);
2941 ddc = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
2942
2943 drm_connector_init_with_ddc(dev, connector,
2944 &intel_hdmi_connector_funcs,
2945 DRM_MODE_CONNECTOR_HDMIA,
2946 ddc);
2947 drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
2948
2949 connector->interlace_allowed = 1;
2950 connector->doublescan_allowed = 0;
2951 connector->stereo_allowed = 1;
2952
2953 if (DISPLAY_VER(dev_priv) >= 10)
2954 connector->ycbcr_420_allowed = true;
2955
2956 intel_connector->polled = DRM_CONNECTOR_POLL_HPD;
2957
2958 if (HAS_DDI(dev_priv))
2959 intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
2960 else
2961 intel_connector->get_hw_state = intel_connector_get_hw_state;
2962
2963 intel_hdmi_add_properties(intel_hdmi, connector);
2964
2965 intel_connector_attach_encoder(intel_connector, intel_encoder);
2966 intel_hdmi->attached_connector = intel_connector;
2967
2968 if (is_hdcp_supported(dev_priv, port)) {
2969 int ret = intel_hdcp_init(intel_connector, dig_port,
2970 &intel_hdmi_hdcp_shim);
2971 if (ret)
2972 drm_dbg_kms(&dev_priv->drm,
2973 "HDCP init failed, skipping.\n");
2974 }
2975
2976
2977
2978
2979
2980 if (IS_G45(dev_priv)) {
2981 u32 temp = intel_de_read(dev_priv, PEG_BAND_GAP_DATA);
2982 intel_de_write(dev_priv, PEG_BAND_GAP_DATA,
2983 (temp & ~0xf) | 0xd);
2984 }
2985
2986 cec_fill_conn_info_from_drm(&conn_info, connector);
2987
2988 intel_hdmi->cec_notifier =
2989 cec_notifier_conn_register(dev->dev, port_identifier(port),
2990 &conn_info);
2991 if (!intel_hdmi->cec_notifier)
2992 drm_dbg_kms(&dev_priv->drm, "CEC notifier get failed\n");
2993 }
2994
2995
2996
2997
2998
2999
3000
3001 int intel_hdmi_dsc_get_slice_height(int vactive)
3002 {
3003 int slice_height;
3004
3005
3006
3007
3008
3009
3010
3011
3012 for (slice_height = 96; slice_height <= vactive; slice_height += 2)
3013 if (vactive % slice_height == 0)
3014 return slice_height;
3015
3016 return 0;
3017 }
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032 int
3033 intel_hdmi_dsc_get_num_slices(const struct intel_crtc_state *crtc_state,
3034 int src_max_slices, int src_max_slice_width,
3035 int hdmi_max_slices, int hdmi_throughput)
3036 {
3037
3038 #define HDMI_DSC_PEAK_PIXEL_RATE 2720000
3039
3040
3041
3042
3043 #define HDMI_DSC_MAX_ENC_THROUGHPUT_0 340000
3044 #define HDMI_DSC_MAX_ENC_THROUGHPUT_1 400000
3045
3046
3047 #define MAX_HDMI_SLICE_WIDTH 2720
3048 int kslice_adjust;
3049 int adjusted_clk_khz;
3050 int min_slices;
3051 int target_slices;
3052 int max_throughput;
3053 int max_slice_width;
3054 int slice_width;
3055 int pixel_clock = crtc_state->hw.adjusted_mode.crtc_clock;
3056
3057 if (!hdmi_throughput)
3058 return 0;
3059
3060
3061
3062
3063
3064
3065
3066 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444 ||
3067 crtc_state->output_format == INTEL_OUTPUT_FORMAT_RGB)
3068 kslice_adjust = 10;
3069 else
3070 kslice_adjust = 5;
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081 adjusted_clk_khz = DIV_ROUND_UP(kslice_adjust * pixel_clock, 10);
3082
3083 if (adjusted_clk_khz <= HDMI_DSC_PEAK_PIXEL_RATE)
3084 max_throughput = HDMI_DSC_MAX_ENC_THROUGHPUT_0;
3085 else
3086 max_throughput = HDMI_DSC_MAX_ENC_THROUGHPUT_1;
3087
3088
3089
3090
3091
3092 max_throughput = min(max_throughput, hdmi_throughput * 1000);
3093
3094 min_slices = DIV_ROUND_UP(adjusted_clk_khz, max_throughput);
3095 max_slice_width = min(MAX_HDMI_SLICE_WIDTH, src_max_slice_width);
3096
3097
3098
3099
3100
3101
3102
3103
3104 slice_width = max_slice_width;
3105
3106 do {
3107 if (min_slices <= 1 && src_max_slices >= 1 && hdmi_max_slices >= 1)
3108 target_slices = 1;
3109 else if (min_slices <= 2 && src_max_slices >= 2 && hdmi_max_slices >= 2)
3110 target_slices = 2;
3111 else if (min_slices <= 4 && src_max_slices >= 4 && hdmi_max_slices >= 4)
3112 target_slices = 4;
3113 else if (min_slices <= 8 && src_max_slices >= 8 && hdmi_max_slices >= 8)
3114 target_slices = 8;
3115 else if (min_slices <= 12 && src_max_slices >= 12 && hdmi_max_slices >= 12)
3116 target_slices = 12;
3117 else if (min_slices <= 16 && src_max_slices >= 16 && hdmi_max_slices >= 16)
3118 target_slices = 16;
3119 else
3120 return 0;
3121
3122 slice_width = DIV_ROUND_UP(crtc_state->hw.adjusted_mode.hdisplay, target_slices);
3123 if (slice_width >= max_slice_width)
3124 min_slices = target_slices + 1;
3125 } while (slice_width >= max_slice_width);
3126
3127 return target_slices;
3128 }
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143 int
3144 intel_hdmi_dsc_get_bpp(int src_fractional_bpp, int slice_width, int num_slices,
3145 int output_format, bool hdmi_all_bpp,
3146 int hdmi_max_chunk_bytes)
3147 {
3148 int max_dsc_bpp, min_dsc_bpp;
3149 int target_bytes;
3150 bool bpp_found = false;
3151 int bpp_decrement_x16;
3152 int bpp_target;
3153 int bpp_target_x16;
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164 if (output_format == INTEL_OUTPUT_FORMAT_YCBCR420) {
3165 min_dsc_bpp = 6;
3166 max_dsc_bpp = 3 * 4;
3167 } else if (output_format == INTEL_OUTPUT_FORMAT_YCBCR444 ||
3168 output_format == INTEL_OUTPUT_FORMAT_RGB) {
3169 min_dsc_bpp = 8;
3170 max_dsc_bpp = 3 * 8;
3171 } else {
3172
3173 min_dsc_bpp = 7;
3174 max_dsc_bpp = 2 * 8;
3175 }
3176
3177
3178
3179
3180
3181
3182
3183 if (!hdmi_all_bpp)
3184 max_dsc_bpp = min(max_dsc_bpp, 12);
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203 bpp_target = max_dsc_bpp;
3204
3205
3206 if (!src_fractional_bpp)
3207 src_fractional_bpp = 1;
3208 bpp_decrement_x16 = DIV_ROUND_UP(16, src_fractional_bpp);
3209 bpp_target_x16 = (bpp_target * 16) - bpp_decrement_x16;
3210
3211 while (bpp_target_x16 > (min_dsc_bpp * 16)) {
3212 int bpp;
3213
3214 bpp = DIV_ROUND_UP(bpp_target_x16, 16);
3215 target_bytes = DIV_ROUND_UP((num_slices * slice_width * bpp), 8);
3216 if (target_bytes <= hdmi_max_chunk_bytes) {
3217 bpp_found = true;
3218 break;
3219 }
3220 bpp_target_x16 -= bpp_decrement_x16;
3221 }
3222 if (bpp_found)
3223 return bpp_target_x16;
3224
3225 return 0;
3226 }