1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright © 2023 Intel Corporation 4 */ 5 6 #include "i915_drv.h" 7 #include "i915_reg.h" 8 #include "intel_de.h" 9 #include "intel_display_irq.h" 10 #include "intel_display_types.h" 11 #include "intel_dp_aux.h" 12 #include "intel_gmbus.h" 13 #include "intel_hotplug.h" 14 #include "intel_hotplug_irq.h" 15 16 typedef bool (*long_pulse_detect_func)(enum hpd_pin pin, u32 val); 17 typedef u32 (*hotplug_enables_func)(struct intel_encoder *encoder); 18 typedef u32 (*hotplug_mask_func)(enum hpd_pin pin); 19 20 static const u32 hpd_ilk[HPD_NUM_PINS] = { 21 [HPD_PORT_A] = DE_DP_A_HOTPLUG, 22 }; 23 24 static const u32 hpd_ivb[HPD_NUM_PINS] = { 25 [HPD_PORT_A] = DE_DP_A_HOTPLUG_IVB, 26 }; 27 28 static const u32 hpd_bdw[HPD_NUM_PINS] = { 29 [HPD_PORT_A] = GEN8_DE_PORT_HOTPLUG(HPD_PORT_A), 30 }; 31 32 static const u32 hpd_ibx[HPD_NUM_PINS] = { 33 [HPD_CRT] = SDE_CRT_HOTPLUG, 34 [HPD_SDVO_B] = SDE_SDVOB_HOTPLUG, 35 [HPD_PORT_B] = SDE_PORTB_HOTPLUG, 36 [HPD_PORT_C] = SDE_PORTC_HOTPLUG, 37 [HPD_PORT_D] = SDE_PORTD_HOTPLUG, 38 }; 39 40 static const u32 hpd_cpt[HPD_NUM_PINS] = { 41 [HPD_CRT] = SDE_CRT_HOTPLUG_CPT, 42 [HPD_SDVO_B] = SDE_SDVOB_HOTPLUG_CPT, 43 [HPD_PORT_B] = SDE_PORTB_HOTPLUG_CPT, 44 [HPD_PORT_C] = SDE_PORTC_HOTPLUG_CPT, 45 [HPD_PORT_D] = SDE_PORTD_HOTPLUG_CPT, 46 }; 47 48 static const u32 hpd_spt[HPD_NUM_PINS] = { 49 [HPD_PORT_A] = SDE_PORTA_HOTPLUG_SPT, 50 [HPD_PORT_B] = SDE_PORTB_HOTPLUG_CPT, 51 [HPD_PORT_C] = SDE_PORTC_HOTPLUG_CPT, 52 [HPD_PORT_D] = SDE_PORTD_HOTPLUG_CPT, 53 [HPD_PORT_E] = SDE_PORTE_HOTPLUG_SPT, 54 }; 55 56 static const u32 hpd_mask_i915[HPD_NUM_PINS] = { 57 [HPD_CRT] = CRT_HOTPLUG_INT_EN, 58 [HPD_SDVO_B] = SDVOB_HOTPLUG_INT_EN, 59 [HPD_SDVO_C] = SDVOC_HOTPLUG_INT_EN, 60 [HPD_PORT_B] = PORTB_HOTPLUG_INT_EN, 61 [HPD_PORT_C] = PORTC_HOTPLUG_INT_EN, 62 [HPD_PORT_D] = PORTD_HOTPLUG_INT_EN, 63 }; 64 65 static const u32 hpd_status_g4x[HPD_NUM_PINS] = { 66 [HPD_CRT] = CRT_HOTPLUG_INT_STATUS, 67 [HPD_SDVO_B] = SDVOB_HOTPLUG_INT_STATUS_G4X, 68 [HPD_SDVO_C] = SDVOC_HOTPLUG_INT_STATUS_G4X, 69 [HPD_PORT_B] = PORTB_HOTPLUG_INT_STATUS, 70 [HPD_PORT_C] = PORTC_HOTPLUG_INT_STATUS, 71 [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS, 72 }; 73 74 static const u32 hpd_status_i915[HPD_NUM_PINS] = { 75 [HPD_CRT] = CRT_HOTPLUG_INT_STATUS, 76 [HPD_SDVO_B] = SDVOB_HOTPLUG_INT_STATUS_I915, 77 [HPD_SDVO_C] = SDVOC_HOTPLUG_INT_STATUS_I915, 78 [HPD_PORT_B] = PORTB_HOTPLUG_INT_STATUS, 79 [HPD_PORT_C] = PORTC_HOTPLUG_INT_STATUS, 80 [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS, 81 }; 82 83 static const u32 hpd_bxt[HPD_NUM_PINS] = { 84 [HPD_PORT_A] = GEN8_DE_PORT_HOTPLUG(HPD_PORT_A), 85 [HPD_PORT_B] = GEN8_DE_PORT_HOTPLUG(HPD_PORT_B), 86 [HPD_PORT_C] = GEN8_DE_PORT_HOTPLUG(HPD_PORT_C), 87 }; 88 89 static const u32 hpd_gen11[HPD_NUM_PINS] = { 90 [HPD_PORT_TC1] = GEN11_TC_HOTPLUG(HPD_PORT_TC1) | GEN11_TBT_HOTPLUG(HPD_PORT_TC1), 91 [HPD_PORT_TC2] = GEN11_TC_HOTPLUG(HPD_PORT_TC2) | GEN11_TBT_HOTPLUG(HPD_PORT_TC2), 92 [HPD_PORT_TC3] = GEN11_TC_HOTPLUG(HPD_PORT_TC3) | GEN11_TBT_HOTPLUG(HPD_PORT_TC3), 93 [HPD_PORT_TC4] = GEN11_TC_HOTPLUG(HPD_PORT_TC4) | GEN11_TBT_HOTPLUG(HPD_PORT_TC4), 94 [HPD_PORT_TC5] = GEN11_TC_HOTPLUG(HPD_PORT_TC5) | GEN11_TBT_HOTPLUG(HPD_PORT_TC5), 95 [HPD_PORT_TC6] = GEN11_TC_HOTPLUG(HPD_PORT_TC6) | GEN11_TBT_HOTPLUG(HPD_PORT_TC6), 96 }; 97 98 static const u32 hpd_xelpdp[HPD_NUM_PINS] = { 99 [HPD_PORT_TC1] = XELPDP_TBT_HOTPLUG(HPD_PORT_TC1) | XELPDP_DP_ALT_HOTPLUG(HPD_PORT_TC1), 100 [HPD_PORT_TC2] = XELPDP_TBT_HOTPLUG(HPD_PORT_TC2) | XELPDP_DP_ALT_HOTPLUG(HPD_PORT_TC2), 101 [HPD_PORT_TC3] = XELPDP_TBT_HOTPLUG(HPD_PORT_TC3) | XELPDP_DP_ALT_HOTPLUG(HPD_PORT_TC3), 102 [HPD_PORT_TC4] = XELPDP_TBT_HOTPLUG(HPD_PORT_TC4) | XELPDP_DP_ALT_HOTPLUG(HPD_PORT_TC4), 103 }; 104 105 static const u32 hpd_icp[HPD_NUM_PINS] = { 106 [HPD_PORT_A] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_A), 107 [HPD_PORT_B] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_B), 108 [HPD_PORT_C] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_C), 109 [HPD_PORT_TC1] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC1), 110 [HPD_PORT_TC2] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC2), 111 [HPD_PORT_TC3] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC3), 112 [HPD_PORT_TC4] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC4), 113 [HPD_PORT_TC5] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC5), 114 [HPD_PORT_TC6] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC6), 115 }; 116 117 static const u32 hpd_sde_dg1[HPD_NUM_PINS] = { 118 [HPD_PORT_A] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_A), 119 [HPD_PORT_B] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_B), 120 [HPD_PORT_C] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_C), 121 [HPD_PORT_D] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_D), 122 [HPD_PORT_TC1] = SDE_TC_HOTPLUG_DG2(HPD_PORT_TC1), 123 }; 124 125 static const u32 hpd_mtp[HPD_NUM_PINS] = { 126 [HPD_PORT_A] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_A), 127 [HPD_PORT_B] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_B), 128 [HPD_PORT_TC1] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC1), 129 [HPD_PORT_TC2] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC2), 130 [HPD_PORT_TC3] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC3), 131 [HPD_PORT_TC4] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC4), 132 }; 133 134 static void intel_hpd_init_pins(struct drm_i915_private *dev_priv) 135 { 136 struct intel_hotplug *hpd = &dev_priv->display.hotplug; 137 138 if (HAS_GMCH(dev_priv)) { 139 if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) || 140 IS_CHERRYVIEW(dev_priv)) 141 hpd->hpd = hpd_status_g4x; 142 else 143 hpd->hpd = hpd_status_i915; 144 return; 145 } 146 147 if (DISPLAY_VER(dev_priv) >= 14) 148 hpd->hpd = hpd_xelpdp; 149 else if (DISPLAY_VER(dev_priv) >= 11) 150 hpd->hpd = hpd_gen11; 151 else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) 152 hpd->hpd = hpd_bxt; 153 else if (DISPLAY_VER(dev_priv) == 9) 154 hpd->hpd = NULL; /* no north HPD on SKL */ 155 else if (DISPLAY_VER(dev_priv) >= 8) 156 hpd->hpd = hpd_bdw; 157 else if (DISPLAY_VER(dev_priv) >= 7) 158 hpd->hpd = hpd_ivb; 159 else 160 hpd->hpd = hpd_ilk; 161 162 if ((INTEL_PCH_TYPE(dev_priv) < PCH_DG1) && 163 (!HAS_PCH_SPLIT(dev_priv) || HAS_PCH_NOP(dev_priv))) 164 return; 165 166 if (INTEL_PCH_TYPE(dev_priv) >= PCH_MTL) 167 hpd->pch_hpd = hpd_mtp; 168 else if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1) 169 hpd->pch_hpd = hpd_sde_dg1; 170 else if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP) 171 hpd->pch_hpd = hpd_icp; 172 else if (HAS_PCH_CNP(dev_priv) || HAS_PCH_SPT(dev_priv)) 173 hpd->pch_hpd = hpd_spt; 174 else if (HAS_PCH_LPT(dev_priv) || HAS_PCH_CPT(dev_priv)) 175 hpd->pch_hpd = hpd_cpt; 176 else if (HAS_PCH_IBX(dev_priv)) 177 hpd->pch_hpd = hpd_ibx; 178 else 179 MISSING_CASE(INTEL_PCH_TYPE(dev_priv)); 180 } 181 182 /* For display hotplug interrupt */ 183 void i915_hotplug_interrupt_update_locked(struct drm_i915_private *dev_priv, 184 u32 mask, u32 bits) 185 { 186 lockdep_assert_held(&dev_priv->irq_lock); 187 drm_WARN_ON(&dev_priv->drm, bits & ~mask); 188 189 intel_uncore_rmw(&dev_priv->uncore, PORT_HOTPLUG_EN(dev_priv), mask, 190 bits); 191 } 192 193 /** 194 * i915_hotplug_interrupt_update - update hotplug interrupt enable 195 * @dev_priv: driver private 196 * @mask: bits to update 197 * @bits: bits to enable 198 * NOTE: the HPD enable bits are modified both inside and outside 199 * of an interrupt context. To avoid that read-modify-write cycles 200 * interfer, these bits are protected by a spinlock. Since this 201 * function is usually not called from a context where the lock is 202 * held already, this function acquires the lock itself. A non-locking 203 * version is also available. 204 */ 205 void i915_hotplug_interrupt_update(struct drm_i915_private *dev_priv, 206 u32 mask, 207 u32 bits) 208 { 209 spin_lock_irq(&dev_priv->irq_lock); 210 i915_hotplug_interrupt_update_locked(dev_priv, mask, bits); 211 spin_unlock_irq(&dev_priv->irq_lock); 212 } 213 214 static bool gen11_port_hotplug_long_detect(enum hpd_pin pin, u32 val) 215 { 216 switch (pin) { 217 case HPD_PORT_TC1: 218 case HPD_PORT_TC2: 219 case HPD_PORT_TC3: 220 case HPD_PORT_TC4: 221 case HPD_PORT_TC5: 222 case HPD_PORT_TC6: 223 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(pin); 224 default: 225 return false; 226 } 227 } 228 229 static bool bxt_port_hotplug_long_detect(enum hpd_pin pin, u32 val) 230 { 231 switch (pin) { 232 case HPD_PORT_A: 233 return val & PORTA_HOTPLUG_LONG_DETECT; 234 case HPD_PORT_B: 235 return val & PORTB_HOTPLUG_LONG_DETECT; 236 case HPD_PORT_C: 237 return val & PORTC_HOTPLUG_LONG_DETECT; 238 default: 239 return false; 240 } 241 } 242 243 static bool icp_ddi_port_hotplug_long_detect(enum hpd_pin pin, u32 val) 244 { 245 switch (pin) { 246 case HPD_PORT_A: 247 case HPD_PORT_B: 248 case HPD_PORT_C: 249 case HPD_PORT_D: 250 return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(pin); 251 default: 252 return false; 253 } 254 } 255 256 static bool icp_tc_port_hotplug_long_detect(enum hpd_pin pin, u32 val) 257 { 258 switch (pin) { 259 case HPD_PORT_TC1: 260 case HPD_PORT_TC2: 261 case HPD_PORT_TC3: 262 case HPD_PORT_TC4: 263 case HPD_PORT_TC5: 264 case HPD_PORT_TC6: 265 return val & ICP_TC_HPD_LONG_DETECT(pin); 266 default: 267 return false; 268 } 269 } 270 271 static bool spt_port_hotplug2_long_detect(enum hpd_pin pin, u32 val) 272 { 273 switch (pin) { 274 case HPD_PORT_E: 275 return val & PORTE_HOTPLUG_LONG_DETECT; 276 default: 277 return false; 278 } 279 } 280 281 static bool spt_port_hotplug_long_detect(enum hpd_pin pin, u32 val) 282 { 283 switch (pin) { 284 case HPD_PORT_A: 285 return val & PORTA_HOTPLUG_LONG_DETECT; 286 case HPD_PORT_B: 287 return val & PORTB_HOTPLUG_LONG_DETECT; 288 case HPD_PORT_C: 289 return val & PORTC_HOTPLUG_LONG_DETECT; 290 case HPD_PORT_D: 291 return val & PORTD_HOTPLUG_LONG_DETECT; 292 default: 293 return false; 294 } 295 } 296 297 static bool ilk_port_hotplug_long_detect(enum hpd_pin pin, u32 val) 298 { 299 switch (pin) { 300 case HPD_PORT_A: 301 return val & DIGITAL_PORTA_HOTPLUG_LONG_DETECT; 302 default: 303 return false; 304 } 305 } 306 307 static bool pch_port_hotplug_long_detect(enum hpd_pin pin, u32 val) 308 { 309 switch (pin) { 310 case HPD_PORT_B: 311 return val & PORTB_HOTPLUG_LONG_DETECT; 312 case HPD_PORT_C: 313 return val & PORTC_HOTPLUG_LONG_DETECT; 314 case HPD_PORT_D: 315 return val & PORTD_HOTPLUG_LONG_DETECT; 316 default: 317 return false; 318 } 319 } 320 321 static bool i9xx_port_hotplug_long_detect(enum hpd_pin pin, u32 val) 322 { 323 switch (pin) { 324 case HPD_PORT_B: 325 return val & PORTB_HOTPLUG_INT_LONG_PULSE; 326 case HPD_PORT_C: 327 return val & PORTC_HOTPLUG_INT_LONG_PULSE; 328 case HPD_PORT_D: 329 return val & PORTD_HOTPLUG_INT_LONG_PULSE; 330 default: 331 return false; 332 } 333 } 334 335 /* 336 * Get a bit mask of pins that have triggered, and which ones may be long. 337 * This can be called multiple times with the same masks to accumulate 338 * hotplug detection results from several registers. 339 * 340 * Note that the caller is expected to zero out the masks initially. 341 */ 342 static void intel_get_hpd_pins(struct drm_i915_private *dev_priv, 343 u32 *pin_mask, u32 *long_mask, 344 u32 hotplug_trigger, u32 dig_hotplug_reg, 345 const u32 hpd[HPD_NUM_PINS], 346 bool long_pulse_detect(enum hpd_pin pin, u32 val)) 347 { 348 enum hpd_pin pin; 349 350 BUILD_BUG_ON(BITS_PER_TYPE(*pin_mask) < HPD_NUM_PINS); 351 352 for_each_hpd_pin(pin) { 353 if ((hpd[pin] & hotplug_trigger) == 0) 354 continue; 355 356 *pin_mask |= BIT(pin); 357 358 if (long_pulse_detect(pin, dig_hotplug_reg)) 359 *long_mask |= BIT(pin); 360 } 361 362 drm_dbg(&dev_priv->drm, 363 "hotplug event received, stat 0x%08x, dig 0x%08x, pins 0x%08x, long 0x%08x\n", 364 hotplug_trigger, dig_hotplug_reg, *pin_mask, *long_mask); 365 } 366 367 static u32 intel_hpd_enabled_irqs(struct drm_i915_private *dev_priv, 368 const u32 hpd[HPD_NUM_PINS]) 369 { 370 struct intel_encoder *encoder; 371 u32 enabled_irqs = 0; 372 373 for_each_intel_encoder(&dev_priv->drm, encoder) 374 if (dev_priv->display.hotplug.stats[encoder->hpd_pin].state == HPD_ENABLED) 375 enabled_irqs |= hpd[encoder->hpd_pin]; 376 377 return enabled_irqs; 378 } 379 380 static u32 intel_hpd_hotplug_irqs(struct drm_i915_private *dev_priv, 381 const u32 hpd[HPD_NUM_PINS]) 382 { 383 struct intel_encoder *encoder; 384 u32 hotplug_irqs = 0; 385 386 for_each_intel_encoder(&dev_priv->drm, encoder) 387 hotplug_irqs |= hpd[encoder->hpd_pin]; 388 389 return hotplug_irqs; 390 } 391 392 static u32 intel_hpd_hotplug_mask(struct drm_i915_private *i915, 393 hotplug_mask_func hotplug_mask) 394 { 395 enum hpd_pin pin; 396 u32 hotplug = 0; 397 398 for_each_hpd_pin(pin) 399 hotplug |= hotplug_mask(pin); 400 401 return hotplug; 402 } 403 404 static u32 intel_hpd_hotplug_enables(struct drm_i915_private *i915, 405 hotplug_enables_func hotplug_enables) 406 { 407 struct intel_encoder *encoder; 408 u32 hotplug = 0; 409 410 for_each_intel_encoder(&i915->drm, encoder) 411 hotplug |= hotplug_enables(encoder); 412 413 return hotplug; 414 } 415 416 u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv) 417 { 418 u32 hotplug_status = 0, hotplug_status_mask; 419 int i; 420 421 if (IS_G4X(dev_priv) || 422 IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) 423 hotplug_status_mask = HOTPLUG_INT_STATUS_G4X | 424 DP_AUX_CHANNEL_MASK_INT_STATUS_G4X; 425 else 426 hotplug_status_mask = HOTPLUG_INT_STATUS_I915; 427 428 /* 429 * We absolutely have to clear all the pending interrupt 430 * bits in PORT_HOTPLUG_STAT. Otherwise the ISR port 431 * interrupt bit won't have an edge, and the i965/g4x 432 * edge triggered IIR will not notice that an interrupt 433 * is still pending. We can't use PORT_HOTPLUG_EN to 434 * guarantee the edge as the act of toggling the enable 435 * bits can itself generate a new hotplug interrupt :( 436 */ 437 for (i = 0; i < 10; i++) { 438 u32 tmp = intel_uncore_read(&dev_priv->uncore, 439 PORT_HOTPLUG_STAT(dev_priv)) & hotplug_status_mask; 440 441 if (tmp == 0) 442 return hotplug_status; 443 444 hotplug_status |= tmp; 445 intel_uncore_write(&dev_priv->uncore, 446 PORT_HOTPLUG_STAT(dev_priv), 447 hotplug_status); 448 } 449 450 drm_WARN_ONCE(&dev_priv->drm, 1, 451 "PORT_HOTPLUG_STAT did not clear (0x%08x)\n", 452 intel_uncore_read(&dev_priv->uncore, PORT_HOTPLUG_STAT(dev_priv))); 453 454 return hotplug_status; 455 } 456 457 void i9xx_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 hotplug_status) 458 { 459 u32 pin_mask = 0, long_mask = 0; 460 u32 hotplug_trigger; 461 462 if (IS_G4X(dev_priv) || 463 IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) 464 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X; 465 else 466 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915; 467 468 if (hotplug_trigger) { 469 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, 470 hotplug_trigger, hotplug_trigger, 471 dev_priv->display.hotplug.hpd, 472 i9xx_port_hotplug_long_detect); 473 474 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); 475 } 476 477 if ((IS_G4X(dev_priv) || 478 IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) && 479 hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X) 480 intel_dp_aux_irq_handler(dev_priv); 481 } 482 483 void ibx_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 hotplug_trigger) 484 { 485 u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; 486 487 /* 488 * Somehow the PCH doesn't seem to really ack the interrupt to the CPU 489 * unless we touch the hotplug register, even if hotplug_trigger is 490 * zero. Not acking leads to "The master control interrupt lied (SDE)!" 491 * errors. 492 */ 493 dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG); 494 if (!hotplug_trigger) { 495 u32 mask = PORTA_HOTPLUG_STATUS_MASK | 496 PORTD_HOTPLUG_STATUS_MASK | 497 PORTC_HOTPLUG_STATUS_MASK | 498 PORTB_HOTPLUG_STATUS_MASK; 499 dig_hotplug_reg &= ~mask; 500 } 501 502 intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, dig_hotplug_reg); 503 if (!hotplug_trigger) 504 return; 505 506 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, 507 hotplug_trigger, dig_hotplug_reg, 508 dev_priv->display.hotplug.pch_hpd, 509 pch_port_hotplug_long_detect); 510 511 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); 512 } 513 514 void xelpdp_pica_irq_handler(struct drm_i915_private *i915, u32 iir) 515 { 516 enum hpd_pin pin; 517 u32 hotplug_trigger = iir & (XELPDP_DP_ALT_HOTPLUG_MASK | XELPDP_TBT_HOTPLUG_MASK); 518 u32 trigger_aux = iir & XELPDP_AUX_TC_MASK; 519 u32 pin_mask = 0, long_mask = 0; 520 521 if (DISPLAY_VER(i915) >= 20) 522 trigger_aux |= iir & XE2LPD_AUX_DDI_MASK; 523 524 for (pin = HPD_PORT_TC1; pin <= HPD_PORT_TC4; pin++) { 525 u32 val; 526 527 if (!(i915->display.hotplug.hpd[pin] & hotplug_trigger)) 528 continue; 529 530 pin_mask |= BIT(pin); 531 532 val = intel_de_read(i915, XELPDP_PORT_HOTPLUG_CTL(pin)); 533 intel_de_write(i915, XELPDP_PORT_HOTPLUG_CTL(pin), val); 534 535 if (val & (XELPDP_DP_ALT_HPD_LONG_DETECT | XELPDP_TBT_HPD_LONG_DETECT)) 536 long_mask |= BIT(pin); 537 } 538 539 if (pin_mask) { 540 drm_dbg(&i915->drm, 541 "pica hotplug event received, stat 0x%08x, pins 0x%08x, long 0x%08x\n", 542 hotplug_trigger, pin_mask, long_mask); 543 544 intel_hpd_irq_handler(i915, pin_mask, long_mask); 545 } 546 547 if (trigger_aux) 548 intel_dp_aux_irq_handler(i915); 549 550 if (!pin_mask && !trigger_aux) 551 drm_err(&i915->drm, 552 "Unexpected DE HPD/AUX interrupt 0x%08x\n", iir); 553 } 554 555 void icp_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) 556 { 557 u32 ddi_hotplug_trigger = pch_iir & SDE_DDI_HOTPLUG_MASK_ICP; 558 u32 tc_hotplug_trigger = pch_iir & SDE_TC_HOTPLUG_MASK_ICP; 559 u32 pin_mask = 0, long_mask = 0; 560 561 if (ddi_hotplug_trigger) { 562 u32 dig_hotplug_reg; 563 564 /* Locking due to DSI native GPIO sequences */ 565 spin_lock(&dev_priv->irq_lock); 566 dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_DDI, 0, 0); 567 spin_unlock(&dev_priv->irq_lock); 568 569 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, 570 ddi_hotplug_trigger, dig_hotplug_reg, 571 dev_priv->display.hotplug.pch_hpd, 572 icp_ddi_port_hotplug_long_detect); 573 } 574 575 if (tc_hotplug_trigger) { 576 u32 dig_hotplug_reg; 577 578 dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_TC, 0, 0); 579 580 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, 581 tc_hotplug_trigger, dig_hotplug_reg, 582 dev_priv->display.hotplug.pch_hpd, 583 icp_tc_port_hotplug_long_detect); 584 } 585 586 if (pin_mask) 587 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); 588 589 if (pch_iir & SDE_GMBUS_ICP) 590 intel_gmbus_irq_handler(dev_priv); 591 } 592 593 void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) 594 { 595 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_SPT & 596 ~SDE_PORTE_HOTPLUG_SPT; 597 u32 hotplug2_trigger = pch_iir & SDE_PORTE_HOTPLUG_SPT; 598 u32 pin_mask = 0, long_mask = 0; 599 600 if (hotplug_trigger) { 601 u32 dig_hotplug_reg; 602 603 dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG, 0, 0); 604 605 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, 606 hotplug_trigger, dig_hotplug_reg, 607 dev_priv->display.hotplug.pch_hpd, 608 spt_port_hotplug_long_detect); 609 } 610 611 if (hotplug2_trigger) { 612 u32 dig_hotplug_reg; 613 614 dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG2, 0, 0); 615 616 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, 617 hotplug2_trigger, dig_hotplug_reg, 618 dev_priv->display.hotplug.pch_hpd, 619 spt_port_hotplug2_long_detect); 620 } 621 622 if (pin_mask) 623 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); 624 625 if (pch_iir & SDE_GMBUS_CPT) 626 intel_gmbus_irq_handler(dev_priv); 627 } 628 629 void ilk_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 hotplug_trigger) 630 { 631 u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; 632 633 dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL, 0, 0); 634 635 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, 636 hotplug_trigger, dig_hotplug_reg, 637 dev_priv->display.hotplug.hpd, 638 ilk_port_hotplug_long_detect); 639 640 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); 641 } 642 643 void bxt_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 hotplug_trigger) 644 { 645 u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; 646 647 dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG, 0, 0); 648 649 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, 650 hotplug_trigger, dig_hotplug_reg, 651 dev_priv->display.hotplug.hpd, 652 bxt_port_hotplug_long_detect); 653 654 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); 655 } 656 657 void gen11_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 iir) 658 { 659 u32 pin_mask = 0, long_mask = 0; 660 u32 trigger_tc = iir & GEN11_DE_TC_HOTPLUG_MASK; 661 u32 trigger_tbt = iir & GEN11_DE_TBT_HOTPLUG_MASK; 662 663 if (trigger_tc) { 664 u32 dig_hotplug_reg; 665 666 dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL, 0, 0); 667 668 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, 669 trigger_tc, dig_hotplug_reg, 670 dev_priv->display.hotplug.hpd, 671 gen11_port_hotplug_long_detect); 672 } 673 674 if (trigger_tbt) { 675 u32 dig_hotplug_reg; 676 677 dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL, 0, 0); 678 679 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, 680 trigger_tbt, dig_hotplug_reg, 681 dev_priv->display.hotplug.hpd, 682 gen11_port_hotplug_long_detect); 683 } 684 685 if (pin_mask) 686 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); 687 else 688 drm_err(&dev_priv->drm, 689 "Unexpected DE HPD interrupt 0x%08x\n", iir); 690 } 691 692 static u32 ibx_hotplug_mask(enum hpd_pin hpd_pin) 693 { 694 switch (hpd_pin) { 695 case HPD_PORT_A: 696 return PORTA_HOTPLUG_ENABLE; 697 case HPD_PORT_B: 698 return PORTB_HOTPLUG_ENABLE | PORTB_PULSE_DURATION_MASK; 699 case HPD_PORT_C: 700 return PORTC_HOTPLUG_ENABLE | PORTC_PULSE_DURATION_MASK; 701 case HPD_PORT_D: 702 return PORTD_HOTPLUG_ENABLE | PORTD_PULSE_DURATION_MASK; 703 default: 704 return 0; 705 } 706 } 707 708 static u32 ibx_hotplug_enables(struct intel_encoder *encoder) 709 { 710 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 711 712 switch (encoder->hpd_pin) { 713 case HPD_PORT_A: 714 /* 715 * When CPU and PCH are on the same package, port A 716 * HPD must be enabled in both north and south. 717 */ 718 return HAS_PCH_LPT_LP(i915) ? 719 PORTA_HOTPLUG_ENABLE : 0; 720 case HPD_PORT_B: 721 return PORTB_HOTPLUG_ENABLE | 722 PORTB_PULSE_DURATION_2ms; 723 case HPD_PORT_C: 724 return PORTC_HOTPLUG_ENABLE | 725 PORTC_PULSE_DURATION_2ms; 726 case HPD_PORT_D: 727 return PORTD_HOTPLUG_ENABLE | 728 PORTD_PULSE_DURATION_2ms; 729 default: 730 return 0; 731 } 732 } 733 734 static void ibx_hpd_detection_setup(struct drm_i915_private *dev_priv) 735 { 736 /* 737 * Enable digital hotplug on the PCH, and configure the DP short pulse 738 * duration to 2ms (which is the minimum in the Display Port spec). 739 * The pulse duration bits are reserved on LPT+. 740 */ 741 intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG, 742 intel_hpd_hotplug_mask(dev_priv, ibx_hotplug_mask), 743 intel_hpd_hotplug_enables(dev_priv, ibx_hotplug_enables)); 744 } 745 746 static void ibx_hpd_enable_detection(struct intel_encoder *encoder) 747 { 748 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 749 750 intel_uncore_rmw(&i915->uncore, PCH_PORT_HOTPLUG, 751 ibx_hotplug_mask(encoder->hpd_pin), 752 ibx_hotplug_enables(encoder)); 753 } 754 755 static void ibx_hpd_irq_setup(struct drm_i915_private *dev_priv) 756 { 757 u32 hotplug_irqs, enabled_irqs; 758 759 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->display.hotplug.pch_hpd); 760 hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->display.hotplug.pch_hpd); 761 762 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs); 763 764 ibx_hpd_detection_setup(dev_priv); 765 } 766 767 static u32 icp_ddi_hotplug_mask(enum hpd_pin hpd_pin) 768 { 769 switch (hpd_pin) { 770 case HPD_PORT_A: 771 case HPD_PORT_B: 772 case HPD_PORT_C: 773 case HPD_PORT_D: 774 return SHOTPLUG_CTL_DDI_HPD_ENABLE(hpd_pin); 775 default: 776 return 0; 777 } 778 } 779 780 static u32 icp_ddi_hotplug_enables(struct intel_encoder *encoder) 781 { 782 return icp_ddi_hotplug_mask(encoder->hpd_pin); 783 } 784 785 static u32 icp_tc_hotplug_mask(enum hpd_pin hpd_pin) 786 { 787 switch (hpd_pin) { 788 case HPD_PORT_TC1: 789 case HPD_PORT_TC2: 790 case HPD_PORT_TC3: 791 case HPD_PORT_TC4: 792 case HPD_PORT_TC5: 793 case HPD_PORT_TC6: 794 return ICP_TC_HPD_ENABLE(hpd_pin); 795 default: 796 return 0; 797 } 798 } 799 800 static u32 icp_tc_hotplug_enables(struct intel_encoder *encoder) 801 { 802 return icp_tc_hotplug_mask(encoder->hpd_pin); 803 } 804 805 static void icp_ddi_hpd_detection_setup(struct drm_i915_private *dev_priv) 806 { 807 intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_DDI, 808 intel_hpd_hotplug_mask(dev_priv, icp_ddi_hotplug_mask), 809 intel_hpd_hotplug_enables(dev_priv, icp_ddi_hotplug_enables)); 810 } 811 812 static void icp_ddi_hpd_enable_detection(struct intel_encoder *encoder) 813 { 814 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 815 816 intel_uncore_rmw(&i915->uncore, SHOTPLUG_CTL_DDI, 817 icp_ddi_hotplug_mask(encoder->hpd_pin), 818 icp_ddi_hotplug_enables(encoder)); 819 } 820 821 static void icp_tc_hpd_detection_setup(struct drm_i915_private *dev_priv) 822 { 823 intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_TC, 824 intel_hpd_hotplug_mask(dev_priv, icp_tc_hotplug_mask), 825 intel_hpd_hotplug_enables(dev_priv, icp_tc_hotplug_enables)); 826 } 827 828 static void icp_tc_hpd_enable_detection(struct intel_encoder *encoder) 829 { 830 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 831 832 intel_uncore_rmw(&i915->uncore, SHOTPLUG_CTL_TC, 833 icp_tc_hotplug_mask(encoder->hpd_pin), 834 icp_tc_hotplug_enables(encoder)); 835 } 836 837 static void icp_hpd_enable_detection(struct intel_encoder *encoder) 838 { 839 icp_ddi_hpd_enable_detection(encoder); 840 icp_tc_hpd_enable_detection(encoder); 841 } 842 843 static void icp_hpd_irq_setup(struct drm_i915_private *dev_priv) 844 { 845 u32 hotplug_irqs, enabled_irqs; 846 847 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->display.hotplug.pch_hpd); 848 hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->display.hotplug.pch_hpd); 849 850 if (INTEL_PCH_TYPE(dev_priv) <= PCH_TGP) 851 intel_uncore_write(&dev_priv->uncore, SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ); 852 else 853 intel_uncore_write(&dev_priv->uncore, SHPD_FILTER_CNT, SHPD_FILTER_CNT_250); 854 855 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs); 856 857 icp_ddi_hpd_detection_setup(dev_priv); 858 icp_tc_hpd_detection_setup(dev_priv); 859 } 860 861 static u32 gen11_hotplug_mask(enum hpd_pin hpd_pin) 862 { 863 switch (hpd_pin) { 864 case HPD_PORT_TC1: 865 case HPD_PORT_TC2: 866 case HPD_PORT_TC3: 867 case HPD_PORT_TC4: 868 case HPD_PORT_TC5: 869 case HPD_PORT_TC6: 870 return GEN11_HOTPLUG_CTL_ENABLE(hpd_pin); 871 default: 872 return 0; 873 } 874 } 875 876 static u32 gen11_hotplug_enables(struct intel_encoder *encoder) 877 { 878 return gen11_hotplug_mask(encoder->hpd_pin); 879 } 880 881 static void dg1_hpd_invert(struct drm_i915_private *i915) 882 { 883 u32 val = (INVERT_DDIA_HPD | 884 INVERT_DDIB_HPD | 885 INVERT_DDIC_HPD | 886 INVERT_DDID_HPD); 887 intel_uncore_rmw(&i915->uncore, SOUTH_CHICKEN1, 0, val); 888 } 889 890 static void dg1_hpd_enable_detection(struct intel_encoder *encoder) 891 { 892 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 893 894 dg1_hpd_invert(i915); 895 icp_hpd_enable_detection(encoder); 896 } 897 898 static void dg1_hpd_irq_setup(struct drm_i915_private *dev_priv) 899 { 900 dg1_hpd_invert(dev_priv); 901 icp_hpd_irq_setup(dev_priv); 902 } 903 904 static void gen11_tc_hpd_detection_setup(struct drm_i915_private *dev_priv) 905 { 906 intel_uncore_rmw(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL, 907 intel_hpd_hotplug_mask(dev_priv, gen11_hotplug_mask), 908 intel_hpd_hotplug_enables(dev_priv, gen11_hotplug_enables)); 909 } 910 911 static void gen11_tc_hpd_enable_detection(struct intel_encoder *encoder) 912 { 913 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 914 915 intel_uncore_rmw(&i915->uncore, GEN11_TC_HOTPLUG_CTL, 916 gen11_hotplug_mask(encoder->hpd_pin), 917 gen11_hotplug_enables(encoder)); 918 } 919 920 static void gen11_tbt_hpd_detection_setup(struct drm_i915_private *dev_priv) 921 { 922 intel_uncore_rmw(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL, 923 intel_hpd_hotplug_mask(dev_priv, gen11_hotplug_mask), 924 intel_hpd_hotplug_enables(dev_priv, gen11_hotplug_enables)); 925 } 926 927 static void gen11_tbt_hpd_enable_detection(struct intel_encoder *encoder) 928 { 929 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 930 931 intel_uncore_rmw(&i915->uncore, GEN11_TBT_HOTPLUG_CTL, 932 gen11_hotplug_mask(encoder->hpd_pin), 933 gen11_hotplug_enables(encoder)); 934 } 935 936 static void gen11_hpd_enable_detection(struct intel_encoder *encoder) 937 { 938 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 939 940 gen11_tc_hpd_enable_detection(encoder); 941 gen11_tbt_hpd_enable_detection(encoder); 942 943 if (INTEL_PCH_TYPE(i915) >= PCH_ICP) 944 icp_hpd_enable_detection(encoder); 945 } 946 947 static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv) 948 { 949 u32 hotplug_irqs, enabled_irqs; 950 951 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->display.hotplug.hpd); 952 hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->display.hotplug.hpd); 953 954 intel_uncore_rmw(&dev_priv->uncore, GEN11_DE_HPD_IMR, hotplug_irqs, 955 ~enabled_irqs & hotplug_irqs); 956 intel_uncore_posting_read(&dev_priv->uncore, GEN11_DE_HPD_IMR); 957 958 gen11_tc_hpd_detection_setup(dev_priv); 959 gen11_tbt_hpd_detection_setup(dev_priv); 960 961 if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP) 962 icp_hpd_irq_setup(dev_priv); 963 } 964 965 static u32 mtp_ddi_hotplug_mask(enum hpd_pin hpd_pin) 966 { 967 switch (hpd_pin) { 968 case HPD_PORT_A: 969 case HPD_PORT_B: 970 return SHOTPLUG_CTL_DDI_HPD_ENABLE(hpd_pin); 971 default: 972 return 0; 973 } 974 } 975 976 static u32 mtp_ddi_hotplug_enables(struct intel_encoder *encoder) 977 { 978 return mtp_ddi_hotplug_mask(encoder->hpd_pin); 979 } 980 981 static u32 mtp_tc_hotplug_mask(enum hpd_pin hpd_pin) 982 { 983 switch (hpd_pin) { 984 case HPD_PORT_TC1: 985 case HPD_PORT_TC2: 986 case HPD_PORT_TC3: 987 case HPD_PORT_TC4: 988 return ICP_TC_HPD_ENABLE(hpd_pin); 989 default: 990 return 0; 991 } 992 } 993 994 static u32 mtp_tc_hotplug_enables(struct intel_encoder *encoder) 995 { 996 return mtp_tc_hotplug_mask(encoder->hpd_pin); 997 } 998 999 static void mtp_ddi_hpd_detection_setup(struct drm_i915_private *i915) 1000 { 1001 intel_de_rmw(i915, SHOTPLUG_CTL_DDI, 1002 intel_hpd_hotplug_mask(i915, mtp_ddi_hotplug_mask), 1003 intel_hpd_hotplug_enables(i915, mtp_ddi_hotplug_enables)); 1004 } 1005 1006 static void mtp_ddi_hpd_enable_detection(struct intel_encoder *encoder) 1007 { 1008 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1009 1010 intel_de_rmw(i915, SHOTPLUG_CTL_DDI, 1011 mtp_ddi_hotplug_mask(encoder->hpd_pin), 1012 mtp_ddi_hotplug_enables(encoder)); 1013 } 1014 1015 static void mtp_tc_hpd_detection_setup(struct drm_i915_private *i915) 1016 { 1017 intel_de_rmw(i915, SHOTPLUG_CTL_TC, 1018 intel_hpd_hotplug_mask(i915, mtp_tc_hotplug_mask), 1019 intel_hpd_hotplug_enables(i915, mtp_tc_hotplug_enables)); 1020 } 1021 1022 static void mtp_tc_hpd_enable_detection(struct intel_encoder *encoder) 1023 { 1024 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1025 1026 intel_de_rmw(i915, SHOTPLUG_CTL_DDI, 1027 mtp_tc_hotplug_mask(encoder->hpd_pin), 1028 mtp_tc_hotplug_enables(encoder)); 1029 } 1030 1031 static void mtp_hpd_invert(struct drm_i915_private *i915) 1032 { 1033 u32 val = (INVERT_DDIA_HPD | 1034 INVERT_DDIB_HPD | 1035 INVERT_DDIC_HPD | 1036 INVERT_TC1_HPD | 1037 INVERT_TC2_HPD | 1038 INVERT_TC3_HPD | 1039 INVERT_TC4_HPD | 1040 INVERT_DDID_HPD_MTP | 1041 INVERT_DDIE_HPD); 1042 intel_de_rmw(i915, SOUTH_CHICKEN1, 0, val); 1043 } 1044 1045 static void mtp_hpd_enable_detection(struct intel_encoder *encoder) 1046 { 1047 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1048 1049 mtp_hpd_invert(i915); 1050 mtp_ddi_hpd_enable_detection(encoder); 1051 mtp_tc_hpd_enable_detection(encoder); 1052 } 1053 1054 static void mtp_hpd_irq_setup(struct drm_i915_private *i915) 1055 { 1056 u32 hotplug_irqs, enabled_irqs; 1057 1058 enabled_irqs = intel_hpd_enabled_irqs(i915, i915->display.hotplug.pch_hpd); 1059 hotplug_irqs = intel_hpd_hotplug_irqs(i915, i915->display.hotplug.pch_hpd); 1060 1061 intel_de_write(i915, SHPD_FILTER_CNT, SHPD_FILTER_CNT_250); 1062 1063 mtp_hpd_invert(i915); 1064 ibx_display_interrupt_update(i915, hotplug_irqs, enabled_irqs); 1065 1066 mtp_ddi_hpd_detection_setup(i915); 1067 mtp_tc_hpd_detection_setup(i915); 1068 } 1069 1070 static void xe2lpd_sde_hpd_irq_setup(struct drm_i915_private *i915) 1071 { 1072 u32 hotplug_irqs, enabled_irqs; 1073 1074 enabled_irqs = intel_hpd_enabled_irqs(i915, i915->display.hotplug.pch_hpd); 1075 hotplug_irqs = intel_hpd_hotplug_irqs(i915, i915->display.hotplug.pch_hpd); 1076 1077 ibx_display_interrupt_update(i915, hotplug_irqs, enabled_irqs); 1078 1079 mtp_ddi_hpd_detection_setup(i915); 1080 mtp_tc_hpd_detection_setup(i915); 1081 } 1082 1083 static bool is_xelpdp_pica_hpd_pin(enum hpd_pin hpd_pin) 1084 { 1085 return hpd_pin >= HPD_PORT_TC1 && hpd_pin <= HPD_PORT_TC4; 1086 } 1087 1088 static void _xelpdp_pica_hpd_detection_setup(struct drm_i915_private *i915, 1089 enum hpd_pin hpd_pin, bool enable) 1090 { 1091 u32 mask = XELPDP_TBT_HOTPLUG_ENABLE | 1092 XELPDP_DP_ALT_HOTPLUG_ENABLE; 1093 1094 if (!is_xelpdp_pica_hpd_pin(hpd_pin)) 1095 return; 1096 1097 intel_de_rmw(i915, XELPDP_PORT_HOTPLUG_CTL(hpd_pin), 1098 mask, enable ? mask : 0); 1099 } 1100 1101 static void xelpdp_pica_hpd_enable_detection(struct intel_encoder *encoder) 1102 { 1103 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1104 1105 _xelpdp_pica_hpd_detection_setup(i915, encoder->hpd_pin, true); 1106 } 1107 1108 static void xelpdp_pica_hpd_detection_setup(struct drm_i915_private *i915) 1109 { 1110 struct intel_encoder *encoder; 1111 u32 available_pins = 0; 1112 enum hpd_pin pin; 1113 1114 BUILD_BUG_ON(BITS_PER_TYPE(available_pins) < HPD_NUM_PINS); 1115 1116 for_each_intel_encoder(&i915->drm, encoder) 1117 available_pins |= BIT(encoder->hpd_pin); 1118 1119 for_each_hpd_pin(pin) 1120 _xelpdp_pica_hpd_detection_setup(i915, pin, available_pins & BIT(pin)); 1121 } 1122 1123 static void xelpdp_hpd_enable_detection(struct intel_encoder *encoder) 1124 { 1125 xelpdp_pica_hpd_enable_detection(encoder); 1126 mtp_hpd_enable_detection(encoder); 1127 } 1128 1129 static void xelpdp_hpd_irq_setup(struct drm_i915_private *i915) 1130 { 1131 u32 hotplug_irqs, enabled_irqs; 1132 1133 enabled_irqs = intel_hpd_enabled_irqs(i915, i915->display.hotplug.hpd); 1134 hotplug_irqs = intel_hpd_hotplug_irqs(i915, i915->display.hotplug.hpd); 1135 1136 intel_de_rmw(i915, PICAINTERRUPT_IMR, hotplug_irqs, 1137 ~enabled_irqs & hotplug_irqs); 1138 intel_uncore_posting_read(&i915->uncore, PICAINTERRUPT_IMR); 1139 1140 xelpdp_pica_hpd_detection_setup(i915); 1141 1142 if (INTEL_PCH_TYPE(i915) >= PCH_LNL) 1143 xe2lpd_sde_hpd_irq_setup(i915); 1144 else if (INTEL_PCH_TYPE(i915) >= PCH_MTL) 1145 mtp_hpd_irq_setup(i915); 1146 } 1147 1148 static u32 spt_hotplug_mask(enum hpd_pin hpd_pin) 1149 { 1150 switch (hpd_pin) { 1151 case HPD_PORT_A: 1152 return PORTA_HOTPLUG_ENABLE; 1153 case HPD_PORT_B: 1154 return PORTB_HOTPLUG_ENABLE; 1155 case HPD_PORT_C: 1156 return PORTC_HOTPLUG_ENABLE; 1157 case HPD_PORT_D: 1158 return PORTD_HOTPLUG_ENABLE; 1159 default: 1160 return 0; 1161 } 1162 } 1163 1164 static u32 spt_hotplug_enables(struct intel_encoder *encoder) 1165 { 1166 return spt_hotplug_mask(encoder->hpd_pin); 1167 } 1168 1169 static u32 spt_hotplug2_mask(enum hpd_pin hpd_pin) 1170 { 1171 switch (hpd_pin) { 1172 case HPD_PORT_E: 1173 return PORTE_HOTPLUG_ENABLE; 1174 default: 1175 return 0; 1176 } 1177 } 1178 1179 static u32 spt_hotplug2_enables(struct intel_encoder *encoder) 1180 { 1181 return spt_hotplug2_mask(encoder->hpd_pin); 1182 } 1183 1184 static void spt_hpd_detection_setup(struct drm_i915_private *dev_priv) 1185 { 1186 /* Display WA #1179 WaHardHangonHotPlug: cnp */ 1187 if (HAS_PCH_CNP(dev_priv)) { 1188 intel_uncore_rmw(&dev_priv->uncore, SOUTH_CHICKEN1, CHASSIS_CLK_REQ_DURATION_MASK, 1189 CHASSIS_CLK_REQ_DURATION(0xf)); 1190 } 1191 1192 /* Enable digital hotplug on the PCH */ 1193 intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG, 1194 intel_hpd_hotplug_mask(dev_priv, spt_hotplug_mask), 1195 intel_hpd_hotplug_enables(dev_priv, spt_hotplug_enables)); 1196 1197 intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG2, 1198 intel_hpd_hotplug_mask(dev_priv, spt_hotplug2_mask), 1199 intel_hpd_hotplug_enables(dev_priv, spt_hotplug2_enables)); 1200 } 1201 1202 static void spt_hpd_enable_detection(struct intel_encoder *encoder) 1203 { 1204 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1205 1206 /* Display WA #1179 WaHardHangonHotPlug: cnp */ 1207 if (HAS_PCH_CNP(i915)) { 1208 intel_uncore_rmw(&i915->uncore, SOUTH_CHICKEN1, 1209 CHASSIS_CLK_REQ_DURATION_MASK, 1210 CHASSIS_CLK_REQ_DURATION(0xf)); 1211 } 1212 1213 intel_uncore_rmw(&i915->uncore, PCH_PORT_HOTPLUG, 1214 spt_hotplug_mask(encoder->hpd_pin), 1215 spt_hotplug_enables(encoder)); 1216 1217 intel_uncore_rmw(&i915->uncore, PCH_PORT_HOTPLUG2, 1218 spt_hotplug2_mask(encoder->hpd_pin), 1219 spt_hotplug2_enables(encoder)); 1220 } 1221 1222 static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv) 1223 { 1224 u32 hotplug_irqs, enabled_irqs; 1225 1226 if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP) 1227 intel_uncore_write(&dev_priv->uncore, SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ); 1228 1229 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->display.hotplug.pch_hpd); 1230 hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->display.hotplug.pch_hpd); 1231 1232 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs); 1233 1234 spt_hpd_detection_setup(dev_priv); 1235 } 1236 1237 static u32 ilk_hotplug_mask(enum hpd_pin hpd_pin) 1238 { 1239 switch (hpd_pin) { 1240 case HPD_PORT_A: 1241 return DIGITAL_PORTA_HOTPLUG_ENABLE | 1242 DIGITAL_PORTA_PULSE_DURATION_MASK; 1243 default: 1244 return 0; 1245 } 1246 } 1247 1248 static u32 ilk_hotplug_enables(struct intel_encoder *encoder) 1249 { 1250 switch (encoder->hpd_pin) { 1251 case HPD_PORT_A: 1252 return DIGITAL_PORTA_HOTPLUG_ENABLE | 1253 DIGITAL_PORTA_PULSE_DURATION_2ms; 1254 default: 1255 return 0; 1256 } 1257 } 1258 1259 static void ilk_hpd_detection_setup(struct drm_i915_private *dev_priv) 1260 { 1261 /* 1262 * Enable digital hotplug on the CPU, and configure the DP short pulse 1263 * duration to 2ms (which is the minimum in the Display Port spec) 1264 * The pulse duration bits are reserved on HSW+. 1265 */ 1266 intel_uncore_rmw(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL, 1267 intel_hpd_hotplug_mask(dev_priv, ilk_hotplug_mask), 1268 intel_hpd_hotplug_enables(dev_priv, ilk_hotplug_enables)); 1269 } 1270 1271 static void ilk_hpd_enable_detection(struct intel_encoder *encoder) 1272 { 1273 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1274 1275 intel_uncore_rmw(&i915->uncore, DIGITAL_PORT_HOTPLUG_CNTRL, 1276 ilk_hotplug_mask(encoder->hpd_pin), 1277 ilk_hotplug_enables(encoder)); 1278 1279 ibx_hpd_enable_detection(encoder); 1280 } 1281 1282 static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv) 1283 { 1284 u32 hotplug_irqs, enabled_irqs; 1285 1286 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->display.hotplug.hpd); 1287 hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->display.hotplug.hpd); 1288 1289 if (DISPLAY_VER(dev_priv) >= 8) 1290 bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs); 1291 else 1292 ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs); 1293 1294 ilk_hpd_detection_setup(dev_priv); 1295 1296 ibx_hpd_irq_setup(dev_priv); 1297 } 1298 1299 static u32 bxt_hotplug_mask(enum hpd_pin hpd_pin) 1300 { 1301 switch (hpd_pin) { 1302 case HPD_PORT_A: 1303 return PORTA_HOTPLUG_ENABLE | BXT_DDIA_HPD_INVERT; 1304 case HPD_PORT_B: 1305 return PORTB_HOTPLUG_ENABLE | BXT_DDIB_HPD_INVERT; 1306 case HPD_PORT_C: 1307 return PORTC_HOTPLUG_ENABLE | BXT_DDIC_HPD_INVERT; 1308 default: 1309 return 0; 1310 } 1311 } 1312 1313 static u32 bxt_hotplug_enables(struct intel_encoder *encoder) 1314 { 1315 u32 hotplug; 1316 1317 switch (encoder->hpd_pin) { 1318 case HPD_PORT_A: 1319 hotplug = PORTA_HOTPLUG_ENABLE; 1320 if (intel_bios_encoder_hpd_invert(encoder->devdata)) 1321 hotplug |= BXT_DDIA_HPD_INVERT; 1322 return hotplug; 1323 case HPD_PORT_B: 1324 hotplug = PORTB_HOTPLUG_ENABLE; 1325 if (intel_bios_encoder_hpd_invert(encoder->devdata)) 1326 hotplug |= BXT_DDIB_HPD_INVERT; 1327 return hotplug; 1328 case HPD_PORT_C: 1329 hotplug = PORTC_HOTPLUG_ENABLE; 1330 if (intel_bios_encoder_hpd_invert(encoder->devdata)) 1331 hotplug |= BXT_DDIC_HPD_INVERT; 1332 return hotplug; 1333 default: 1334 return 0; 1335 } 1336 } 1337 1338 static void bxt_hpd_detection_setup(struct drm_i915_private *dev_priv) 1339 { 1340 intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG, 1341 intel_hpd_hotplug_mask(dev_priv, bxt_hotplug_mask), 1342 intel_hpd_hotplug_enables(dev_priv, bxt_hotplug_enables)); 1343 } 1344 1345 static void bxt_hpd_enable_detection(struct intel_encoder *encoder) 1346 { 1347 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1348 1349 intel_uncore_rmw(&i915->uncore, PCH_PORT_HOTPLUG, 1350 bxt_hotplug_mask(encoder->hpd_pin), 1351 bxt_hotplug_enables(encoder)); 1352 } 1353 1354 static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv) 1355 { 1356 u32 hotplug_irqs, enabled_irqs; 1357 1358 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->display.hotplug.hpd); 1359 hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->display.hotplug.hpd); 1360 1361 bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs); 1362 1363 bxt_hpd_detection_setup(dev_priv); 1364 } 1365 1366 static void g45_hpd_peg_band_gap_wa(struct drm_i915_private *i915) 1367 { 1368 /* 1369 * For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written 1370 * 0xd. Failure to do so will result in spurious interrupts being 1371 * generated on the port when a cable is not attached. 1372 */ 1373 intel_de_rmw(i915, PEG_BAND_GAP_DATA, 0xf, 0xd); 1374 } 1375 1376 static void i915_hpd_enable_detection(struct intel_encoder *encoder) 1377 { 1378 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1379 u32 hotplug_en = hpd_mask_i915[encoder->hpd_pin]; 1380 1381 if (IS_G45(i915)) 1382 g45_hpd_peg_band_gap_wa(i915); 1383 1384 /* HPD sense and interrupt enable are one and the same */ 1385 i915_hotplug_interrupt_update(i915, hotplug_en, hotplug_en); 1386 } 1387 1388 static void i915_hpd_irq_setup(struct drm_i915_private *dev_priv) 1389 { 1390 u32 hotplug_en; 1391 1392 lockdep_assert_held(&dev_priv->irq_lock); 1393 1394 /* 1395 * Note HDMI and DP share hotplug bits. Enable bits are the same for all 1396 * generations. 1397 */ 1398 hotplug_en = intel_hpd_enabled_irqs(dev_priv, hpd_mask_i915); 1399 /* 1400 * Programming the CRT detection parameters tends to generate a spurious 1401 * hotplug event about three seconds later. So just do it once. 1402 */ 1403 if (IS_G4X(dev_priv)) 1404 hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64; 1405 hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; 1406 1407 if (IS_G45(dev_priv)) 1408 g45_hpd_peg_band_gap_wa(dev_priv); 1409 1410 /* Ignore TV since it's buggy */ 1411 i915_hotplug_interrupt_update_locked(dev_priv, 1412 HOTPLUG_INT_EN_MASK | 1413 CRT_HOTPLUG_VOLTAGE_COMPARE_MASK | 1414 CRT_HOTPLUG_ACTIVATION_PERIOD_64, 1415 hotplug_en); 1416 } 1417 1418 struct intel_hotplug_funcs { 1419 /* Enable HPD sense and interrupts for all present encoders */ 1420 void (*hpd_irq_setup)(struct drm_i915_private *i915); 1421 /* Enable HPD sense for a single encoder */ 1422 void (*hpd_enable_detection)(struct intel_encoder *encoder); 1423 }; 1424 1425 #define HPD_FUNCS(platform) \ 1426 static const struct intel_hotplug_funcs platform##_hpd_funcs = { \ 1427 .hpd_irq_setup = platform##_hpd_irq_setup, \ 1428 .hpd_enable_detection = platform##_hpd_enable_detection, \ 1429 } 1430 1431 HPD_FUNCS(i915); 1432 HPD_FUNCS(xelpdp); 1433 HPD_FUNCS(dg1); 1434 HPD_FUNCS(gen11); 1435 HPD_FUNCS(bxt); 1436 HPD_FUNCS(icp); 1437 HPD_FUNCS(spt); 1438 HPD_FUNCS(ilk); 1439 #undef HPD_FUNCS 1440 1441 void intel_hpd_enable_detection(struct intel_encoder *encoder) 1442 { 1443 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1444 1445 if (i915->display.funcs.hotplug) 1446 i915->display.funcs.hotplug->hpd_enable_detection(encoder); 1447 } 1448 1449 void intel_hpd_irq_setup(struct drm_i915_private *i915) 1450 { 1451 if (i915->display.irq.display_irqs_enabled && i915->display.funcs.hotplug) 1452 i915->display.funcs.hotplug->hpd_irq_setup(i915); 1453 } 1454 1455 void intel_hotplug_irq_init(struct drm_i915_private *i915) 1456 { 1457 intel_hpd_init_pins(i915); 1458 1459 intel_hpd_init_early(i915); 1460 1461 if (HAS_GMCH(i915)) { 1462 if (I915_HAS_HOTPLUG(i915)) 1463 i915->display.funcs.hotplug = &i915_hpd_funcs; 1464 } else { 1465 if (HAS_PCH_DG2(i915)) 1466 i915->display.funcs.hotplug = &icp_hpd_funcs; 1467 else if (HAS_PCH_DG1(i915)) 1468 i915->display.funcs.hotplug = &dg1_hpd_funcs; 1469 else if (DISPLAY_VER(i915) >= 14) 1470 i915->display.funcs.hotplug = &xelpdp_hpd_funcs; 1471 else if (DISPLAY_VER(i915) >= 11) 1472 i915->display.funcs.hotplug = &gen11_hpd_funcs; 1473 else if (IS_GEMINILAKE(i915) || IS_BROXTON(i915)) 1474 i915->display.funcs.hotplug = &bxt_hpd_funcs; 1475 else if (INTEL_PCH_TYPE(i915) >= PCH_ICP) 1476 i915->display.funcs.hotplug = &icp_hpd_funcs; 1477 else if (INTEL_PCH_TYPE(i915) >= PCH_SPT) 1478 i915->display.funcs.hotplug = &spt_hpd_funcs; 1479 else 1480 i915->display.funcs.hotplug = &ilk_hpd_funcs; 1481 } 1482 } 1483