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