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