1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
30
31#include <linux/circ_buf.h>
32#include <linux/slab.h>
33#include <linux/sysrq.h>
34
35#include <drm/drm_drv.h>
36#include <drm/drm_irq.h>
37
38#include "display/intel_display_types.h"
39#include "display/intel_fifo_underrun.h"
40#include "display/intel_hotplug.h"
41#include "display/intel_lpe_audio.h"
42#include "display/intel_psr.h"
43
44#include "gt/intel_gt.h"
45#include "gt/intel_gt_irq.h"
46#include "gt/intel_gt_pm_irq.h"
47#include "gt/intel_rps.h"
48
49#include "i915_drv.h"
50#include "i915_irq.h"
51#include "i915_trace.h"
52#include "intel_pm.h"
53
54
55
56
57
58
59
60
61
62typedef bool (*long_pulse_detect_func)(enum hpd_pin pin, u32 val);
63
64static const u32 hpd_ilk[HPD_NUM_PINS] = {
65 [HPD_PORT_A] = DE_DP_A_HOTPLUG,
66};
67
68static const u32 hpd_ivb[HPD_NUM_PINS] = {
69 [HPD_PORT_A] = DE_DP_A_HOTPLUG_IVB,
70};
71
72static const u32 hpd_bdw[HPD_NUM_PINS] = {
73 [HPD_PORT_A] = GEN8_PORT_DP_A_HOTPLUG,
74};
75
76static const u32 hpd_ibx[HPD_NUM_PINS] = {
77 [HPD_CRT] = SDE_CRT_HOTPLUG,
78 [HPD_SDVO_B] = SDE_SDVOB_HOTPLUG,
79 [HPD_PORT_B] = SDE_PORTB_HOTPLUG,
80 [HPD_PORT_C] = SDE_PORTC_HOTPLUG,
81 [HPD_PORT_D] = SDE_PORTD_HOTPLUG,
82};
83
84static const u32 hpd_cpt[HPD_NUM_PINS] = {
85 [HPD_CRT] = SDE_CRT_HOTPLUG_CPT,
86 [HPD_SDVO_B] = SDE_SDVOB_HOTPLUG_CPT,
87 [HPD_PORT_B] = SDE_PORTB_HOTPLUG_CPT,
88 [HPD_PORT_C] = SDE_PORTC_HOTPLUG_CPT,
89 [HPD_PORT_D] = SDE_PORTD_HOTPLUG_CPT,
90};
91
92static const u32 hpd_spt[HPD_NUM_PINS] = {
93 [HPD_PORT_A] = SDE_PORTA_HOTPLUG_SPT,
94 [HPD_PORT_B] = SDE_PORTB_HOTPLUG_CPT,
95 [HPD_PORT_C] = SDE_PORTC_HOTPLUG_CPT,
96 [HPD_PORT_D] = SDE_PORTD_HOTPLUG_CPT,
97 [HPD_PORT_E] = SDE_PORTE_HOTPLUG_SPT,
98};
99
100static const u32 hpd_mask_i915[HPD_NUM_PINS] = {
101 [HPD_CRT] = CRT_HOTPLUG_INT_EN,
102 [HPD_SDVO_B] = SDVOB_HOTPLUG_INT_EN,
103 [HPD_SDVO_C] = SDVOC_HOTPLUG_INT_EN,
104 [HPD_PORT_B] = PORTB_HOTPLUG_INT_EN,
105 [HPD_PORT_C] = PORTC_HOTPLUG_INT_EN,
106 [HPD_PORT_D] = PORTD_HOTPLUG_INT_EN,
107};
108
109static const u32 hpd_status_g4x[HPD_NUM_PINS] = {
110 [HPD_CRT] = CRT_HOTPLUG_INT_STATUS,
111 [HPD_SDVO_B] = SDVOB_HOTPLUG_INT_STATUS_G4X,
112 [HPD_SDVO_C] = SDVOC_HOTPLUG_INT_STATUS_G4X,
113 [HPD_PORT_B] = PORTB_HOTPLUG_INT_STATUS,
114 [HPD_PORT_C] = PORTC_HOTPLUG_INT_STATUS,
115 [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS,
116};
117
118static const u32 hpd_status_i915[HPD_NUM_PINS] = {
119 [HPD_CRT] = CRT_HOTPLUG_INT_STATUS,
120 [HPD_SDVO_B] = SDVOB_HOTPLUG_INT_STATUS_I915,
121 [HPD_SDVO_C] = SDVOC_HOTPLUG_INT_STATUS_I915,
122 [HPD_PORT_B] = PORTB_HOTPLUG_INT_STATUS,
123 [HPD_PORT_C] = PORTC_HOTPLUG_INT_STATUS,
124 [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS,
125};
126
127
128static const u32 hpd_bxt[HPD_NUM_PINS] = {
129 [HPD_PORT_A] = BXT_DE_PORT_HP_DDIA,
130 [HPD_PORT_B] = BXT_DE_PORT_HP_DDIB,
131 [HPD_PORT_C] = BXT_DE_PORT_HP_DDIC,
132};
133
134static const u32 hpd_gen11[HPD_NUM_PINS] = {
135 [HPD_PORT_C] = GEN11_TC1_HOTPLUG | GEN11_TBT1_HOTPLUG,
136 [HPD_PORT_D] = GEN11_TC2_HOTPLUG | GEN11_TBT2_HOTPLUG,
137 [HPD_PORT_E] = GEN11_TC3_HOTPLUG | GEN11_TBT3_HOTPLUG,
138 [HPD_PORT_F] = GEN11_TC4_HOTPLUG | GEN11_TBT4_HOTPLUG,
139};
140
141static const u32 hpd_gen12[HPD_NUM_PINS] = {
142 [HPD_PORT_D] = GEN11_TC1_HOTPLUG | GEN11_TBT1_HOTPLUG,
143 [HPD_PORT_E] = GEN11_TC2_HOTPLUG | GEN11_TBT2_HOTPLUG,
144 [HPD_PORT_F] = GEN11_TC3_HOTPLUG | GEN11_TBT3_HOTPLUG,
145 [HPD_PORT_G] = GEN11_TC4_HOTPLUG | GEN11_TBT4_HOTPLUG,
146 [HPD_PORT_H] = GEN12_TC5_HOTPLUG | GEN12_TBT5_HOTPLUG,
147 [HPD_PORT_I] = GEN12_TC6_HOTPLUG | GEN12_TBT6_HOTPLUG,
148};
149
150static const u32 hpd_icp[HPD_NUM_PINS] = {
151 [HPD_PORT_A] = SDE_DDI_HOTPLUG_ICP(PORT_A),
152 [HPD_PORT_B] = SDE_DDI_HOTPLUG_ICP(PORT_B),
153 [HPD_PORT_C] = SDE_TC_HOTPLUG_ICP(PORT_TC1),
154 [HPD_PORT_D] = SDE_TC_HOTPLUG_ICP(PORT_TC2),
155 [HPD_PORT_E] = SDE_TC_HOTPLUG_ICP(PORT_TC3),
156 [HPD_PORT_F] = SDE_TC_HOTPLUG_ICP(PORT_TC4),
157};
158
159static const u32 hpd_tgp[HPD_NUM_PINS] = {
160 [HPD_PORT_A] = SDE_DDI_HOTPLUG_ICP(PORT_A),
161 [HPD_PORT_B] = SDE_DDI_HOTPLUG_ICP(PORT_B),
162 [HPD_PORT_C] = SDE_DDI_HOTPLUG_ICP(PORT_C),
163 [HPD_PORT_D] = SDE_TC_HOTPLUG_ICP(PORT_TC1),
164 [HPD_PORT_E] = SDE_TC_HOTPLUG_ICP(PORT_TC2),
165 [HPD_PORT_F] = SDE_TC_HOTPLUG_ICP(PORT_TC3),
166 [HPD_PORT_G] = SDE_TC_HOTPLUG_ICP(PORT_TC4),
167 [HPD_PORT_H] = SDE_TC_HOTPLUG_ICP(PORT_TC5),
168 [HPD_PORT_I] = SDE_TC_HOTPLUG_ICP(PORT_TC6),
169};
170
171static void
172intel_handle_vblank(struct drm_i915_private *dev_priv, enum pipe pipe)
173{
174 struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
175
176 drm_crtc_handle_vblank(&crtc->base);
177}
178
179void gen3_irq_reset(struct intel_uncore *uncore, i915_reg_t imr,
180 i915_reg_t iir, i915_reg_t ier)
181{
182 intel_uncore_write(uncore, imr, 0xffffffff);
183 intel_uncore_posting_read(uncore, imr);
184
185 intel_uncore_write(uncore, ier, 0);
186
187
188 intel_uncore_write(uncore, iir, 0xffffffff);
189 intel_uncore_posting_read(uncore, iir);
190 intel_uncore_write(uncore, iir, 0xffffffff);
191 intel_uncore_posting_read(uncore, iir);
192}
193
194void gen2_irq_reset(struct intel_uncore *uncore)
195{
196 intel_uncore_write16(uncore, GEN2_IMR, 0xffff);
197 intel_uncore_posting_read16(uncore, GEN2_IMR);
198
199 intel_uncore_write16(uncore, GEN2_IER, 0);
200
201
202 intel_uncore_write16(uncore, GEN2_IIR, 0xffff);
203 intel_uncore_posting_read16(uncore, GEN2_IIR);
204 intel_uncore_write16(uncore, GEN2_IIR, 0xffff);
205 intel_uncore_posting_read16(uncore, GEN2_IIR);
206}
207
208
209
210
211static void gen3_assert_iir_is_zero(struct intel_uncore *uncore, i915_reg_t reg)
212{
213 u32 val = intel_uncore_read(uncore, reg);
214
215 if (val == 0)
216 return;
217
218 drm_WARN(&uncore->i915->drm, 1,
219 "Interrupt register 0x%x is not zero: 0x%08x\n",
220 i915_mmio_reg_offset(reg), val);
221 intel_uncore_write(uncore, reg, 0xffffffff);
222 intel_uncore_posting_read(uncore, reg);
223 intel_uncore_write(uncore, reg, 0xffffffff);
224 intel_uncore_posting_read(uncore, reg);
225}
226
227static void gen2_assert_iir_is_zero(struct intel_uncore *uncore)
228{
229 u16 val = intel_uncore_read16(uncore, GEN2_IIR);
230
231 if (val == 0)
232 return;
233
234 drm_WARN(&uncore->i915->drm, 1,
235 "Interrupt register 0x%x is not zero: 0x%08x\n",
236 i915_mmio_reg_offset(GEN2_IIR), val);
237 intel_uncore_write16(uncore, GEN2_IIR, 0xffff);
238 intel_uncore_posting_read16(uncore, GEN2_IIR);
239 intel_uncore_write16(uncore, GEN2_IIR, 0xffff);
240 intel_uncore_posting_read16(uncore, GEN2_IIR);
241}
242
243void gen3_irq_init(struct intel_uncore *uncore,
244 i915_reg_t imr, u32 imr_val,
245 i915_reg_t ier, u32 ier_val,
246 i915_reg_t iir)
247{
248 gen3_assert_iir_is_zero(uncore, iir);
249
250 intel_uncore_write(uncore, ier, ier_val);
251 intel_uncore_write(uncore, imr, imr_val);
252 intel_uncore_posting_read(uncore, imr);
253}
254
255void gen2_irq_init(struct intel_uncore *uncore,
256 u32 imr_val, u32 ier_val)
257{
258 gen2_assert_iir_is_zero(uncore);
259
260 intel_uncore_write16(uncore, GEN2_IER, ier_val);
261 intel_uncore_write16(uncore, GEN2_IMR, imr_val);
262 intel_uncore_posting_read16(uncore, GEN2_IMR);
263}
264
265
266static inline void
267i915_hotplug_interrupt_update_locked(struct drm_i915_private *dev_priv,
268 u32 mask,
269 u32 bits)
270{
271 u32 val;
272
273 lockdep_assert_held(&dev_priv->irq_lock);
274 drm_WARN_ON(&dev_priv->drm, bits & ~mask);
275
276 val = I915_READ(PORT_HOTPLUG_EN);
277 val &= ~mask;
278 val |= bits;
279 I915_WRITE(PORT_HOTPLUG_EN, val);
280}
281
282
283
284
285
286
287
288
289
290
291
292
293
294void i915_hotplug_interrupt_update(struct drm_i915_private *dev_priv,
295 u32 mask,
296 u32 bits)
297{
298 spin_lock_irq(&dev_priv->irq_lock);
299 i915_hotplug_interrupt_update_locked(dev_priv, mask, bits);
300 spin_unlock_irq(&dev_priv->irq_lock);
301}
302
303
304
305
306
307
308
309void ilk_update_display_irq(struct drm_i915_private *dev_priv,
310 u32 interrupt_mask,
311 u32 enabled_irq_mask)
312{
313 u32 new_val;
314
315 lockdep_assert_held(&dev_priv->irq_lock);
316
317 drm_WARN_ON(&dev_priv->drm, enabled_irq_mask & ~interrupt_mask);
318
319 if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
320 return;
321
322 new_val = dev_priv->irq_mask;
323 new_val &= ~interrupt_mask;
324 new_val |= (~enabled_irq_mask & interrupt_mask);
325
326 if (new_val != dev_priv->irq_mask) {
327 dev_priv->irq_mask = new_val;
328 I915_WRITE(DEIMR, dev_priv->irq_mask);
329 POSTING_READ(DEIMR);
330 }
331}
332
333
334
335
336
337
338
339static void bdw_update_port_irq(struct drm_i915_private *dev_priv,
340 u32 interrupt_mask,
341 u32 enabled_irq_mask)
342{
343 u32 new_val;
344 u32 old_val;
345
346 lockdep_assert_held(&dev_priv->irq_lock);
347
348 drm_WARN_ON(&dev_priv->drm, enabled_irq_mask & ~interrupt_mask);
349
350 if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
351 return;
352
353 old_val = I915_READ(GEN8_DE_PORT_IMR);
354
355 new_val = old_val;
356 new_val &= ~interrupt_mask;
357 new_val |= (~enabled_irq_mask & interrupt_mask);
358
359 if (new_val != old_val) {
360 I915_WRITE(GEN8_DE_PORT_IMR, new_val);
361 POSTING_READ(GEN8_DE_PORT_IMR);
362 }
363}
364
365
366
367
368
369
370
371
372void bdw_update_pipe_irq(struct drm_i915_private *dev_priv,
373 enum pipe pipe,
374 u32 interrupt_mask,
375 u32 enabled_irq_mask)
376{
377 u32 new_val;
378
379 lockdep_assert_held(&dev_priv->irq_lock);
380
381 drm_WARN_ON(&dev_priv->drm, enabled_irq_mask & ~interrupt_mask);
382
383 if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
384 return;
385
386 new_val = dev_priv->de_irq_mask[pipe];
387 new_val &= ~interrupt_mask;
388 new_val |= (~enabled_irq_mask & interrupt_mask);
389
390 if (new_val != dev_priv->de_irq_mask[pipe]) {
391 dev_priv->de_irq_mask[pipe] = new_val;
392 I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
393 POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
394 }
395}
396
397
398
399
400
401
402
403void ibx_display_interrupt_update(struct drm_i915_private *dev_priv,
404 u32 interrupt_mask,
405 u32 enabled_irq_mask)
406{
407 u32 sdeimr = I915_READ(SDEIMR);
408 sdeimr &= ~interrupt_mask;
409 sdeimr |= (~enabled_irq_mask & interrupt_mask);
410
411 drm_WARN_ON(&dev_priv->drm, enabled_irq_mask & ~interrupt_mask);
412
413 lockdep_assert_held(&dev_priv->irq_lock);
414
415 if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
416 return;
417
418 I915_WRITE(SDEIMR, sdeimr);
419 POSTING_READ(SDEIMR);
420}
421
422u32 i915_pipestat_enable_mask(struct drm_i915_private *dev_priv,
423 enum pipe pipe)
424{
425 u32 status_mask = dev_priv->pipestat_irq_mask[pipe];
426 u32 enable_mask = status_mask << 16;
427
428 lockdep_assert_held(&dev_priv->irq_lock);
429
430 if (INTEL_GEN(dev_priv) < 5)
431 goto out;
432
433
434
435
436
437 if (drm_WARN_ON_ONCE(&dev_priv->drm,
438 status_mask & PIPE_A_PSR_STATUS_VLV))
439 return 0;
440
441
442
443
444 if (drm_WARN_ON_ONCE(&dev_priv->drm,
445 status_mask & PIPE_B_PSR_STATUS_VLV))
446 return 0;
447
448 enable_mask &= ~(PIPE_FIFO_UNDERRUN_STATUS |
449 SPRITE0_FLIP_DONE_INT_EN_VLV |
450 SPRITE1_FLIP_DONE_INT_EN_VLV);
451 if (status_mask & SPRITE0_FLIP_DONE_INT_STATUS_VLV)
452 enable_mask |= SPRITE0_FLIP_DONE_INT_EN_VLV;
453 if (status_mask & SPRITE1_FLIP_DONE_INT_STATUS_VLV)
454 enable_mask |= SPRITE1_FLIP_DONE_INT_EN_VLV;
455
456out:
457 drm_WARN_ONCE(&dev_priv->drm,
458 enable_mask & ~PIPESTAT_INT_ENABLE_MASK ||
459 status_mask & ~PIPESTAT_INT_STATUS_MASK,
460 "pipe %c: enable_mask=0x%x, status_mask=0x%x\n",
461 pipe_name(pipe), enable_mask, status_mask);
462
463 return enable_mask;
464}
465
466void i915_enable_pipestat(struct drm_i915_private *dev_priv,
467 enum pipe pipe, u32 status_mask)
468{
469 i915_reg_t reg = PIPESTAT(pipe);
470 u32 enable_mask;
471
472 drm_WARN_ONCE(&dev_priv->drm, status_mask & ~PIPESTAT_INT_STATUS_MASK,
473 "pipe %c: status_mask=0x%x\n",
474 pipe_name(pipe), status_mask);
475
476 lockdep_assert_held(&dev_priv->irq_lock);
477 drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv));
478
479 if ((dev_priv->pipestat_irq_mask[pipe] & status_mask) == status_mask)
480 return;
481
482 dev_priv->pipestat_irq_mask[pipe] |= status_mask;
483 enable_mask = i915_pipestat_enable_mask(dev_priv, pipe);
484
485 I915_WRITE(reg, enable_mask | status_mask);
486 POSTING_READ(reg);
487}
488
489void i915_disable_pipestat(struct drm_i915_private *dev_priv,
490 enum pipe pipe, u32 status_mask)
491{
492 i915_reg_t reg = PIPESTAT(pipe);
493 u32 enable_mask;
494
495 drm_WARN_ONCE(&dev_priv->drm, status_mask & ~PIPESTAT_INT_STATUS_MASK,
496 "pipe %c: status_mask=0x%x\n",
497 pipe_name(pipe), status_mask);
498
499 lockdep_assert_held(&dev_priv->irq_lock);
500 drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv));
501
502 if ((dev_priv->pipestat_irq_mask[pipe] & status_mask) == 0)
503 return;
504
505 dev_priv->pipestat_irq_mask[pipe] &= ~status_mask;
506 enable_mask = i915_pipestat_enable_mask(dev_priv, pipe);
507
508 I915_WRITE(reg, enable_mask | status_mask);
509 POSTING_READ(reg);
510}
511
512static bool i915_has_asle(struct drm_i915_private *dev_priv)
513{
514 if (!dev_priv->opregion.asle)
515 return false;
516
517 return IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv);
518}
519
520
521
522
523
524static void i915_enable_asle_pipestat(struct drm_i915_private *dev_priv)
525{
526 if (!i915_has_asle(dev_priv))
527 return;
528
529 spin_lock_irq(&dev_priv->irq_lock);
530
531 i915_enable_pipestat(dev_priv, PIPE_B, PIPE_LEGACY_BLC_EVENT_STATUS);
532 if (INTEL_GEN(dev_priv) >= 4)
533 i915_enable_pipestat(dev_priv, PIPE_A,
534 PIPE_LEGACY_BLC_EVENT_STATUS);
535
536 spin_unlock_irq(&dev_priv->irq_lock);
537}
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592u32 i915_get_vblank_counter(struct drm_crtc *crtc)
593{
594 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
595 struct drm_vblank_crtc *vblank = &dev_priv->drm.vblank[drm_crtc_index(crtc)];
596 const struct drm_display_mode *mode = &vblank->hwmode;
597 enum pipe pipe = to_intel_crtc(crtc)->pipe;
598 i915_reg_t high_frame, low_frame;
599 u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal;
600 unsigned long irqflags;
601
602
603
604
605
606
607
608
609
610
611
612
613 if (!vblank->max_vblank_count)
614 return 0;
615
616 htotal = mode->crtc_htotal;
617 hsync_start = mode->crtc_hsync_start;
618 vbl_start = mode->crtc_vblank_start;
619 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
620 vbl_start = DIV_ROUND_UP(vbl_start, 2);
621
622
623 vbl_start *= htotal;
624
625
626 vbl_start -= htotal - hsync_start;
627
628 high_frame = PIPEFRAME(pipe);
629 low_frame = PIPEFRAMEPIXEL(pipe);
630
631 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
632
633
634
635
636
637
638 do {
639 high1 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
640 low = intel_de_read_fw(dev_priv, low_frame);
641 high2 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
642 } while (high1 != high2);
643
644 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
645
646 high1 >>= PIPE_FRAME_HIGH_SHIFT;
647 pixel = low & PIPE_PIXEL_MASK;
648 low >>= PIPE_FRAME_LOW_SHIFT;
649
650
651
652
653
654
655 return (((high1 << 8) | low) + (pixel >= vbl_start)) & 0xffffff;
656}
657
658u32 g4x_get_vblank_counter(struct drm_crtc *crtc)
659{
660 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
661 enum pipe pipe = to_intel_crtc(crtc)->pipe;
662
663 return I915_READ(PIPE_FRMCOUNT_G4X(pipe));
664}
665
666
667
668
669
670
671
672
673
674static u32 __intel_get_crtc_scanline_from_timestamp(struct intel_crtc *crtc)
675{
676 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
677 struct drm_vblank_crtc *vblank =
678 &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
679 const struct drm_display_mode *mode = &vblank->hwmode;
680 u32 vblank_start = mode->crtc_vblank_start;
681 u32 vtotal = mode->crtc_vtotal;
682 u32 htotal = mode->crtc_htotal;
683 u32 clock = mode->crtc_clock;
684 u32 scanline, scan_prev_time, scan_curr_time, scan_post_time;
685
686
687
688
689
690
691
692 do {
693
694
695
696
697
698 scan_prev_time = intel_de_read_fw(dev_priv,
699 PIPE_FRMTMSTMP(crtc->pipe));
700
701
702
703
704
705 scan_curr_time = intel_de_read_fw(dev_priv, IVB_TIMESTAMP_CTR);
706
707 scan_post_time = intel_de_read_fw(dev_priv,
708 PIPE_FRMTMSTMP(crtc->pipe));
709 } while (scan_post_time != scan_prev_time);
710
711 scanline = div_u64(mul_u32_u32(scan_curr_time - scan_prev_time,
712 clock), 1000 * htotal);
713 scanline = min(scanline, vtotal - 1);
714 scanline = (scanline + vblank_start) % vtotal;
715
716 return scanline;
717}
718
719
720
721
722
723static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
724{
725 struct drm_device *dev = crtc->base.dev;
726 struct drm_i915_private *dev_priv = to_i915(dev);
727 const struct drm_display_mode *mode;
728 struct drm_vblank_crtc *vblank;
729 enum pipe pipe = crtc->pipe;
730 int position, vtotal;
731
732 if (!crtc->active)
733 return -1;
734
735 vblank = &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
736 mode = &vblank->hwmode;
737
738 if (mode->private_flags & I915_MODE_FLAG_GET_SCANLINE_FROM_TIMESTAMP)
739 return __intel_get_crtc_scanline_from_timestamp(crtc);
740
741 vtotal = mode->crtc_vtotal;
742 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
743 vtotal /= 2;
744
745 if (IS_GEN(dev_priv, 2))
746 position = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN2;
747 else
748 position = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3;
749
750
751
752
753
754
755
756
757
758
759
760
761
762 if (HAS_DDI(dev_priv) && !position) {
763 int i, temp;
764
765 for (i = 0; i < 100; i++) {
766 udelay(1);
767 temp = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3;
768 if (temp != position) {
769 position = temp;
770 break;
771 }
772 }
773 }
774
775
776
777
778
779 return (position + crtc->scanline_offset) % vtotal;
780}
781
782static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
783 bool in_vblank_irq,
784 int *vpos, int *hpos,
785 ktime_t *stime, ktime_t *etime,
786 const struct drm_display_mode *mode)
787{
788 struct drm_device *dev = _crtc->dev;
789 struct drm_i915_private *dev_priv = to_i915(dev);
790 struct intel_crtc *crtc = to_intel_crtc(_crtc);
791 enum pipe pipe = crtc->pipe;
792 int position;
793 int vbl_start, vbl_end, hsync_start, htotal, vtotal;
794 unsigned long irqflags;
795 bool use_scanline_counter = INTEL_GEN(dev_priv) >= 5 ||
796 IS_G4X(dev_priv) || IS_GEN(dev_priv, 2) ||
797 mode->private_flags & I915_MODE_FLAG_USE_SCANLINE_COUNTER;
798
799 if (drm_WARN_ON(&dev_priv->drm, !mode->crtc_clock)) {
800 drm_dbg(&dev_priv->drm,
801 "trying to get scanoutpos for disabled "
802 "pipe %c\n", pipe_name(pipe));
803 return false;
804 }
805
806 htotal = mode->crtc_htotal;
807 hsync_start = mode->crtc_hsync_start;
808 vtotal = mode->crtc_vtotal;
809 vbl_start = mode->crtc_vblank_start;
810 vbl_end = mode->crtc_vblank_end;
811
812 if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
813 vbl_start = DIV_ROUND_UP(vbl_start, 2);
814 vbl_end /= 2;
815 vtotal /= 2;
816 }
817
818
819
820
821
822
823 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
824
825
826
827
828 if (stime)
829 *stime = ktime_get();
830
831 if (use_scanline_counter) {
832
833
834
835 position = __intel_get_crtc_scanline(crtc);
836 } else {
837
838
839
840
841 position = (intel_de_read_fw(dev_priv, PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT;
842
843
844 vbl_start *= htotal;
845 vbl_end *= htotal;
846 vtotal *= htotal;
847
848
849
850
851
852
853
854
855
856
857 if (position >= vtotal)
858 position = vtotal - 1;
859
860
861
862
863
864
865
866
867
868
869 position = (position + htotal - hsync_start) % vtotal;
870 }
871
872
873 if (etime)
874 *etime = ktime_get();
875
876
877
878 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
879
880
881
882
883
884
885
886 if (position >= vbl_start)
887 position -= vbl_end;
888 else
889 position += vtotal - vbl_end;
890
891 if (use_scanline_counter) {
892 *vpos = position;
893 *hpos = 0;
894 } else {
895 *vpos = position / htotal;
896 *hpos = position - (*vpos * htotal);
897 }
898
899 return true;
900}
901
902bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
903 ktime_t *vblank_time, bool in_vblank_irq)
904{
905 return drm_crtc_vblank_helper_get_vblank_timestamp_internal(
906 crtc, max_error, vblank_time, in_vblank_irq,
907 i915_get_crtc_scanoutpos);
908}
909
910int intel_get_crtc_scanline(struct intel_crtc *crtc)
911{
912 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
913 unsigned long irqflags;
914 int position;
915
916 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
917 position = __intel_get_crtc_scanline(crtc);
918 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
919
920 return position;
921}
922
923
924
925
926
927
928
929
930
931
932static void ivb_parity_work(struct work_struct *work)
933{
934 struct drm_i915_private *dev_priv =
935 container_of(work, typeof(*dev_priv), l3_parity.error_work);
936 struct intel_gt *gt = &dev_priv->gt;
937 u32 error_status, row, bank, subbank;
938 char *parity_event[6];
939 u32 misccpctl;
940 u8 slice = 0;
941
942
943
944
945
946 mutex_lock(&dev_priv->drm.struct_mutex);
947
948
949 if (drm_WARN_ON(&dev_priv->drm, !dev_priv->l3_parity.which_slice))
950 goto out;
951
952 misccpctl = I915_READ(GEN7_MISCCPCTL);
953 I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE);
954 POSTING_READ(GEN7_MISCCPCTL);
955
956 while ((slice = ffs(dev_priv->l3_parity.which_slice)) != 0) {
957 i915_reg_t reg;
958
959 slice--;
960 if (drm_WARN_ON_ONCE(&dev_priv->drm,
961 slice >= NUM_L3_SLICES(dev_priv)))
962 break;
963
964 dev_priv->l3_parity.which_slice &= ~(1<<slice);
965
966 reg = GEN7_L3CDERRST1(slice);
967
968 error_status = I915_READ(reg);
969 row = GEN7_PARITY_ERROR_ROW(error_status);
970 bank = GEN7_PARITY_ERROR_BANK(error_status);
971 subbank = GEN7_PARITY_ERROR_SUBBANK(error_status);
972
973 I915_WRITE(reg, GEN7_PARITY_ERROR_VALID | GEN7_L3CDERRST1_ENABLE);
974 POSTING_READ(reg);
975
976 parity_event[0] = I915_L3_PARITY_UEVENT "=1";
977 parity_event[1] = kasprintf(GFP_KERNEL, "ROW=%d", row);
978 parity_event[2] = kasprintf(GFP_KERNEL, "BANK=%d", bank);
979 parity_event[3] = kasprintf(GFP_KERNEL, "SUBBANK=%d", subbank);
980 parity_event[4] = kasprintf(GFP_KERNEL, "SLICE=%d", slice);
981 parity_event[5] = NULL;
982
983 kobject_uevent_env(&dev_priv->drm.primary->kdev->kobj,
984 KOBJ_CHANGE, parity_event);
985
986 DRM_DEBUG("Parity error: Slice = %d, Row = %d, Bank = %d, Sub bank = %d.\n",
987 slice, row, bank, subbank);
988
989 kfree(parity_event[4]);
990 kfree(parity_event[3]);
991 kfree(parity_event[2]);
992 kfree(parity_event[1]);
993 }
994
995 I915_WRITE(GEN7_MISCCPCTL, misccpctl);
996
997out:
998 drm_WARN_ON(&dev_priv->drm, dev_priv->l3_parity.which_slice);
999 spin_lock_irq(>->irq_lock);
1000 gen5_gt_enable_irq(gt, GT_PARITY_ERROR(dev_priv));
1001 spin_unlock_irq(>->irq_lock);
1002
1003 mutex_unlock(&dev_priv->drm.struct_mutex);
1004}
1005
1006static bool gen11_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
1007{
1008 switch (pin) {
1009 case HPD_PORT_C:
1010 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC1);
1011 case HPD_PORT_D:
1012 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC2);
1013 case HPD_PORT_E:
1014 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC3);
1015 case HPD_PORT_F:
1016 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC4);
1017 default:
1018 return false;
1019 }
1020}
1021
1022static bool gen12_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
1023{
1024 switch (pin) {
1025 case HPD_PORT_D:
1026 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC1);
1027 case HPD_PORT_E:
1028 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC2);
1029 case HPD_PORT_F:
1030 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC3);
1031 case HPD_PORT_G:
1032 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC4);
1033 case HPD_PORT_H:
1034 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC5);
1035 case HPD_PORT_I:
1036 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC6);
1037 default:
1038 return false;
1039 }
1040}
1041
1042static bool bxt_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
1043{
1044 switch (pin) {
1045 case HPD_PORT_A:
1046 return val & PORTA_HOTPLUG_LONG_DETECT;
1047 case HPD_PORT_B:
1048 return val & PORTB_HOTPLUG_LONG_DETECT;
1049 case HPD_PORT_C:
1050 return val & PORTC_HOTPLUG_LONG_DETECT;
1051 default:
1052 return false;
1053 }
1054}
1055
1056static bool icp_ddi_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
1057{
1058 switch (pin) {
1059 case HPD_PORT_A:
1060 return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(PORT_A);
1061 case HPD_PORT_B:
1062 return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(PORT_B);
1063 case HPD_PORT_C:
1064 return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(PORT_C);
1065 default:
1066 return false;
1067 }
1068}
1069
1070static bool icp_tc_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
1071{
1072 switch (pin) {
1073 case HPD_PORT_C:
1074 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC1);
1075 case HPD_PORT_D:
1076 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC2);
1077 case HPD_PORT_E:
1078 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC3);
1079 case HPD_PORT_F:
1080 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC4);
1081 default:
1082 return false;
1083 }
1084}
1085
1086static bool tgp_tc_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
1087{
1088 switch (pin) {
1089 case HPD_PORT_D:
1090 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC1);
1091 case HPD_PORT_E:
1092 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC2);
1093 case HPD_PORT_F:
1094 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC3);
1095 case HPD_PORT_G:
1096 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC4);
1097 case HPD_PORT_H:
1098 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC5);
1099 case HPD_PORT_I:
1100 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC6);
1101 default:
1102 return false;
1103 }
1104}
1105
1106static bool spt_port_hotplug2_long_detect(enum hpd_pin pin, u32 val)
1107{
1108 switch (pin) {
1109 case HPD_PORT_E:
1110 return val & PORTE_HOTPLUG_LONG_DETECT;
1111 default:
1112 return false;
1113 }
1114}
1115
1116static bool spt_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
1117{
1118 switch (pin) {
1119 case HPD_PORT_A:
1120 return val & PORTA_HOTPLUG_LONG_DETECT;
1121 case HPD_PORT_B:
1122 return val & PORTB_HOTPLUG_LONG_DETECT;
1123 case HPD_PORT_C:
1124 return val & PORTC_HOTPLUG_LONG_DETECT;
1125 case HPD_PORT_D:
1126 return val & PORTD_HOTPLUG_LONG_DETECT;
1127 default:
1128 return false;
1129 }
1130}
1131
1132static bool ilk_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
1133{
1134 switch (pin) {
1135 case HPD_PORT_A:
1136 return val & DIGITAL_PORTA_HOTPLUG_LONG_DETECT;
1137 default:
1138 return false;
1139 }
1140}
1141
1142static bool pch_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
1143{
1144 switch (pin) {
1145 case HPD_PORT_B:
1146 return val & PORTB_HOTPLUG_LONG_DETECT;
1147 case HPD_PORT_C:
1148 return val & PORTC_HOTPLUG_LONG_DETECT;
1149 case HPD_PORT_D:
1150 return val & PORTD_HOTPLUG_LONG_DETECT;
1151 default:
1152 return false;
1153 }
1154}
1155
1156static bool i9xx_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
1157{
1158 switch (pin) {
1159 case HPD_PORT_B:
1160 return val & PORTB_HOTPLUG_INT_LONG_PULSE;
1161 case HPD_PORT_C:
1162 return val & PORTC_HOTPLUG_INT_LONG_PULSE;
1163 case HPD_PORT_D:
1164 return val & PORTD_HOTPLUG_INT_LONG_PULSE;
1165 default:
1166 return false;
1167 }
1168}
1169
1170
1171
1172
1173
1174
1175
1176
1177static void intel_get_hpd_pins(struct drm_i915_private *dev_priv,
1178 u32 *pin_mask, u32 *long_mask,
1179 u32 hotplug_trigger, u32 dig_hotplug_reg,
1180 const u32 hpd[HPD_NUM_PINS],
1181 bool long_pulse_detect(enum hpd_pin pin, u32 val))
1182{
1183 enum hpd_pin pin;
1184
1185 BUILD_BUG_ON(BITS_PER_TYPE(*pin_mask) < HPD_NUM_PINS);
1186
1187 for_each_hpd_pin(pin) {
1188 if ((hpd[pin] & hotplug_trigger) == 0)
1189 continue;
1190
1191 *pin_mask |= BIT(pin);
1192
1193 if (long_pulse_detect(pin, dig_hotplug_reg))
1194 *long_mask |= BIT(pin);
1195 }
1196
1197 drm_dbg(&dev_priv->drm,
1198 "hotplug event received, stat 0x%08x, dig 0x%08x, pins 0x%08x, long 0x%08x\n",
1199 hotplug_trigger, dig_hotplug_reg, *pin_mask, *long_mask);
1200
1201}
1202
1203static void gmbus_irq_handler(struct drm_i915_private *dev_priv)
1204{
1205 wake_up_all(&dev_priv->gmbus_wait_queue);
1206}
1207
1208static void dp_aux_irq_handler(struct drm_i915_private *dev_priv)
1209{
1210 wake_up_all(&dev_priv->gmbus_wait_queue);
1211}
1212
1213#if defined(CONFIG_DEBUG_FS)
1214static void display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
1215 enum pipe pipe,
1216 u32 crc0, u32 crc1,
1217 u32 crc2, u32 crc3,
1218 u32 crc4)
1219{
1220 struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
1221 struct intel_pipe_crc *pipe_crc = &crtc->pipe_crc;
1222 u32 crcs[5] = { crc0, crc1, crc2, crc3, crc4 };
1223
1224 trace_intel_pipe_crc(crtc, crcs);
1225
1226 spin_lock(&pipe_crc->lock);
1227
1228
1229
1230
1231
1232
1233
1234
1235 if (pipe_crc->skipped <= 0 ||
1236 (INTEL_GEN(dev_priv) >= 8 && pipe_crc->skipped == 1)) {
1237 pipe_crc->skipped++;
1238 spin_unlock(&pipe_crc->lock);
1239 return;
1240 }
1241 spin_unlock(&pipe_crc->lock);
1242
1243 drm_crtc_add_crc_entry(&crtc->base, true,
1244 drm_crtc_accurate_vblank_count(&crtc->base),
1245 crcs);
1246}
1247#else
1248static inline void
1249display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
1250 enum pipe pipe,
1251 u32 crc0, u32 crc1,
1252 u32 crc2, u32 crc3,
1253 u32 crc4) {}
1254#endif
1255
1256
1257static void hsw_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
1258 enum pipe pipe)
1259{
1260 display_pipe_crc_irq_handler(dev_priv, pipe,
1261 I915_READ(PIPE_CRC_RES_1_IVB(pipe)),
1262 0, 0, 0, 0);
1263}
1264
1265static void ivb_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
1266 enum pipe pipe)
1267{
1268 display_pipe_crc_irq_handler(dev_priv, pipe,
1269 I915_READ(PIPE_CRC_RES_1_IVB(pipe)),
1270 I915_READ(PIPE_CRC_RES_2_IVB(pipe)),
1271 I915_READ(PIPE_CRC_RES_3_IVB(pipe)),
1272 I915_READ(PIPE_CRC_RES_4_IVB(pipe)),
1273 I915_READ(PIPE_CRC_RES_5_IVB(pipe)));
1274}
1275
1276static void i9xx_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
1277 enum pipe pipe)
1278{
1279 u32 res1, res2;
1280
1281 if (INTEL_GEN(dev_priv) >= 3)
1282 res1 = I915_READ(PIPE_CRC_RES_RES1_I915(pipe));
1283 else
1284 res1 = 0;
1285
1286 if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
1287 res2 = I915_READ(PIPE_CRC_RES_RES2_G4X(pipe));
1288 else
1289 res2 = 0;
1290
1291 display_pipe_crc_irq_handler(dev_priv, pipe,
1292 I915_READ(PIPE_CRC_RES_RED(pipe)),
1293 I915_READ(PIPE_CRC_RES_GREEN(pipe)),
1294 I915_READ(PIPE_CRC_RES_BLUE(pipe)),
1295 res1, res2);
1296}
1297
1298static void i9xx_pipestat_irq_reset(struct drm_i915_private *dev_priv)
1299{
1300 enum pipe pipe;
1301
1302 for_each_pipe(dev_priv, pipe) {
1303 I915_WRITE(PIPESTAT(pipe),
1304 PIPESTAT_INT_STATUS_MASK |
1305 PIPE_FIFO_UNDERRUN_STATUS);
1306
1307 dev_priv->pipestat_irq_mask[pipe] = 0;
1308 }
1309}
1310
1311static void i9xx_pipestat_irq_ack(struct drm_i915_private *dev_priv,
1312 u32 iir, u32 pipe_stats[I915_MAX_PIPES])
1313{
1314 enum pipe pipe;
1315
1316 spin_lock(&dev_priv->irq_lock);
1317
1318 if (!dev_priv->display_irqs_enabled) {
1319 spin_unlock(&dev_priv->irq_lock);
1320 return;
1321 }
1322
1323 for_each_pipe(dev_priv, pipe) {
1324 i915_reg_t reg;
1325 u32 status_mask, enable_mask, iir_bit = 0;
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336 status_mask = PIPE_FIFO_UNDERRUN_STATUS;
1337
1338 switch (pipe) {
1339 default:
1340 case PIPE_A:
1341 iir_bit = I915_DISPLAY_PIPE_A_EVENT_INTERRUPT;
1342 break;
1343 case PIPE_B:
1344 iir_bit = I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
1345 break;
1346 case PIPE_C:
1347 iir_bit = I915_DISPLAY_PIPE_C_EVENT_INTERRUPT;
1348 break;
1349 }
1350 if (iir & iir_bit)
1351 status_mask |= dev_priv->pipestat_irq_mask[pipe];
1352
1353 if (!status_mask)
1354 continue;
1355
1356 reg = PIPESTAT(pipe);
1357 pipe_stats[pipe] = I915_READ(reg) & status_mask;
1358 enable_mask = i915_pipestat_enable_mask(dev_priv, pipe);
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369 if (pipe_stats[pipe]) {
1370 I915_WRITE(reg, pipe_stats[pipe]);
1371 I915_WRITE(reg, enable_mask);
1372 }
1373 }
1374 spin_unlock(&dev_priv->irq_lock);
1375}
1376
1377static void i8xx_pipestat_irq_handler(struct drm_i915_private *dev_priv,
1378 u16 iir, u32 pipe_stats[I915_MAX_PIPES])
1379{
1380 enum pipe pipe;
1381
1382 for_each_pipe(dev_priv, pipe) {
1383 if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS)
1384 intel_handle_vblank(dev_priv, pipe);
1385
1386 if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS)
1387 i9xx_pipe_crc_irq_handler(dev_priv, pipe);
1388
1389 if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS)
1390 intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
1391 }
1392}
1393
1394static void i915_pipestat_irq_handler(struct drm_i915_private *dev_priv,
1395 u32 iir, u32 pipe_stats[I915_MAX_PIPES])
1396{
1397 bool blc_event = false;
1398 enum pipe pipe;
1399
1400 for_each_pipe(dev_priv, pipe) {
1401 if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS)
1402 intel_handle_vblank(dev_priv, pipe);
1403
1404 if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
1405 blc_event = true;
1406
1407 if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS)
1408 i9xx_pipe_crc_irq_handler(dev_priv, pipe);
1409
1410 if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS)
1411 intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
1412 }
1413
1414 if (blc_event || (iir & I915_ASLE_INTERRUPT))
1415 intel_opregion_asle_intr(dev_priv);
1416}
1417
1418static void i965_pipestat_irq_handler(struct drm_i915_private *dev_priv,
1419 u32 iir, u32 pipe_stats[I915_MAX_PIPES])
1420{
1421 bool blc_event = false;
1422 enum pipe pipe;
1423
1424 for_each_pipe(dev_priv, pipe) {
1425 if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS)
1426 intel_handle_vblank(dev_priv, pipe);
1427
1428 if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
1429 blc_event = true;
1430
1431 if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS)
1432 i9xx_pipe_crc_irq_handler(dev_priv, pipe);
1433
1434 if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS)
1435 intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
1436 }
1437
1438 if (blc_event || (iir & I915_ASLE_INTERRUPT))
1439 intel_opregion_asle_intr(dev_priv);
1440
1441 if (pipe_stats[0] & PIPE_GMBUS_INTERRUPT_STATUS)
1442 gmbus_irq_handler(dev_priv);
1443}
1444
1445static void valleyview_pipestat_irq_handler(struct drm_i915_private *dev_priv,
1446 u32 pipe_stats[I915_MAX_PIPES])
1447{
1448 enum pipe pipe;
1449
1450 for_each_pipe(dev_priv, pipe) {
1451 if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS)
1452 intel_handle_vblank(dev_priv, pipe);
1453
1454 if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS)
1455 i9xx_pipe_crc_irq_handler(dev_priv, pipe);
1456
1457 if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS)
1458 intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
1459 }
1460
1461 if (pipe_stats[0] & PIPE_GMBUS_INTERRUPT_STATUS)
1462 gmbus_irq_handler(dev_priv);
1463}
1464
1465static u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv)
1466{
1467 u32 hotplug_status = 0, hotplug_status_mask;
1468 int i;
1469
1470 if (IS_G4X(dev_priv) ||
1471 IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
1472 hotplug_status_mask = HOTPLUG_INT_STATUS_G4X |
1473 DP_AUX_CHANNEL_MASK_INT_STATUS_G4X;
1474 else
1475 hotplug_status_mask = HOTPLUG_INT_STATUS_I915;
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486 for (i = 0; i < 10; i++) {
1487 u32 tmp = I915_READ(PORT_HOTPLUG_STAT) & hotplug_status_mask;
1488
1489 if (tmp == 0)
1490 return hotplug_status;
1491
1492 hotplug_status |= tmp;
1493 I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status);
1494 }
1495
1496 drm_WARN_ONCE(&dev_priv->drm, 1,
1497 "PORT_HOTPLUG_STAT did not clear (0x%08x)\n",
1498 I915_READ(PORT_HOTPLUG_STAT));
1499
1500 return hotplug_status;
1501}
1502
1503static void i9xx_hpd_irq_handler(struct drm_i915_private *dev_priv,
1504 u32 hotplug_status)
1505{
1506 u32 pin_mask = 0, long_mask = 0;
1507
1508 if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
1509 IS_CHERRYVIEW(dev_priv)) {
1510 u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
1511
1512 if (hotplug_trigger) {
1513 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
1514 hotplug_trigger, hotplug_trigger,
1515 hpd_status_g4x,
1516 i9xx_port_hotplug_long_detect);
1517
1518 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
1519 }
1520
1521 if (hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X)
1522 dp_aux_irq_handler(dev_priv);
1523 } else {
1524 u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
1525
1526 if (hotplug_trigger) {
1527 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
1528 hotplug_trigger, hotplug_trigger,
1529 hpd_status_i915,
1530 i9xx_port_hotplug_long_detect);
1531 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
1532 }
1533 }
1534}
1535
1536static irqreturn_t valleyview_irq_handler(int irq, void *arg)
1537{
1538 struct drm_i915_private *dev_priv = arg;
1539 irqreturn_t ret = IRQ_NONE;
1540
1541 if (!intel_irqs_enabled(dev_priv))
1542 return IRQ_NONE;
1543
1544
1545 disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
1546
1547 do {
1548 u32 iir, gt_iir, pm_iir;
1549 u32 pipe_stats[I915_MAX_PIPES] = {};
1550 u32 hotplug_status = 0;
1551 u32 ier = 0;
1552
1553 gt_iir = I915_READ(GTIIR);
1554 pm_iir = I915_READ(GEN6_PMIIR);
1555 iir = I915_READ(VLV_IIR);
1556
1557 if (gt_iir == 0 && pm_iir == 0 && iir == 0)
1558 break;
1559
1560 ret = IRQ_HANDLED;
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575 I915_WRITE(VLV_MASTER_IER, 0);
1576 ier = I915_READ(VLV_IER);
1577 I915_WRITE(VLV_IER, 0);
1578
1579 if (gt_iir)
1580 I915_WRITE(GTIIR, gt_iir);
1581 if (pm_iir)
1582 I915_WRITE(GEN6_PMIIR, pm_iir);
1583
1584 if (iir & I915_DISPLAY_PORT_INTERRUPT)
1585 hotplug_status = i9xx_hpd_irq_ack(dev_priv);
1586
1587
1588
1589 i9xx_pipestat_irq_ack(dev_priv, iir, pipe_stats);
1590
1591 if (iir & (I915_LPE_PIPE_A_INTERRUPT |
1592 I915_LPE_PIPE_B_INTERRUPT))
1593 intel_lpe_audio_irq_handler(dev_priv);
1594
1595
1596
1597
1598
1599 if (iir)
1600 I915_WRITE(VLV_IIR, iir);
1601
1602 I915_WRITE(VLV_IER, ier);
1603 I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
1604
1605 if (gt_iir)
1606 gen6_gt_irq_handler(&dev_priv->gt, gt_iir);
1607 if (pm_iir)
1608 gen6_rps_irq_handler(&dev_priv->gt.rps, pm_iir);
1609
1610 if (hotplug_status)
1611 i9xx_hpd_irq_handler(dev_priv, hotplug_status);
1612
1613 valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
1614 } while (0);
1615
1616 enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
1617
1618 return ret;
1619}
1620
1621static irqreturn_t cherryview_irq_handler(int irq, void *arg)
1622{
1623 struct drm_i915_private *dev_priv = arg;
1624 irqreturn_t ret = IRQ_NONE;
1625
1626 if (!intel_irqs_enabled(dev_priv))
1627 return IRQ_NONE;
1628
1629
1630 disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
1631
1632 do {
1633 u32 master_ctl, iir;
1634 u32 pipe_stats[I915_MAX_PIPES] = {};
1635 u32 hotplug_status = 0;
1636 u32 ier = 0;
1637
1638 master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL;
1639 iir = I915_READ(VLV_IIR);
1640
1641 if (master_ctl == 0 && iir == 0)
1642 break;
1643
1644 ret = IRQ_HANDLED;
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659 I915_WRITE(GEN8_MASTER_IRQ, 0);
1660 ier = I915_READ(VLV_IER);
1661 I915_WRITE(VLV_IER, 0);
1662
1663 gen8_gt_irq_handler(&dev_priv->gt, master_ctl);
1664
1665 if (iir & I915_DISPLAY_PORT_INTERRUPT)
1666 hotplug_status = i9xx_hpd_irq_ack(dev_priv);
1667
1668
1669
1670 i9xx_pipestat_irq_ack(dev_priv, iir, pipe_stats);
1671
1672 if (iir & (I915_LPE_PIPE_A_INTERRUPT |
1673 I915_LPE_PIPE_B_INTERRUPT |
1674 I915_LPE_PIPE_C_INTERRUPT))
1675 intel_lpe_audio_irq_handler(dev_priv);
1676
1677
1678
1679
1680
1681 if (iir)
1682 I915_WRITE(VLV_IIR, iir);
1683
1684 I915_WRITE(VLV_IER, ier);
1685 I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
1686
1687 if (hotplug_status)
1688 i9xx_hpd_irq_handler(dev_priv, hotplug_status);
1689
1690 valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
1691 } while (0);
1692
1693 enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
1694
1695 return ret;
1696}
1697
1698static void ibx_hpd_irq_handler(struct drm_i915_private *dev_priv,
1699 u32 hotplug_trigger,
1700 const u32 hpd[HPD_NUM_PINS])
1701{
1702 u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0;
1703
1704
1705
1706
1707
1708
1709
1710 dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
1711 if (!hotplug_trigger) {
1712 u32 mask = PORTA_HOTPLUG_STATUS_MASK |
1713 PORTD_HOTPLUG_STATUS_MASK |
1714 PORTC_HOTPLUG_STATUS_MASK |
1715 PORTB_HOTPLUG_STATUS_MASK;
1716 dig_hotplug_reg &= ~mask;
1717 }
1718
1719 I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
1720 if (!hotplug_trigger)
1721 return;
1722
1723 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
1724 dig_hotplug_reg, hpd,
1725 pch_port_hotplug_long_detect);
1726
1727 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
1728}
1729
1730static void ibx_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
1731{
1732 enum pipe pipe;
1733 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK;
1734
1735 ibx_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_ibx);
1736
1737 if (pch_iir & SDE_AUDIO_POWER_MASK) {
1738 int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK) >>
1739 SDE_AUDIO_POWER_SHIFT);
1740 drm_dbg(&dev_priv->drm, "PCH audio power change on port %d\n",
1741 port_name(port));
1742 }
1743
1744 if (pch_iir & SDE_AUX_MASK)
1745 dp_aux_irq_handler(dev_priv);
1746
1747 if (pch_iir & SDE_GMBUS)
1748 gmbus_irq_handler(dev_priv);
1749
1750 if (pch_iir & SDE_AUDIO_HDCP_MASK)
1751 drm_dbg(&dev_priv->drm, "PCH HDCP audio interrupt\n");
1752
1753 if (pch_iir & SDE_AUDIO_TRANS_MASK)
1754 drm_dbg(&dev_priv->drm, "PCH transcoder audio interrupt\n");
1755
1756 if (pch_iir & SDE_POISON)
1757 drm_err(&dev_priv->drm, "PCH poison interrupt\n");
1758
1759 if (pch_iir & SDE_FDI_MASK) {
1760 for_each_pipe(dev_priv, pipe)
1761 drm_dbg(&dev_priv->drm, " pipe %c FDI IIR: 0x%08x\n",
1762 pipe_name(pipe),
1763 I915_READ(FDI_RX_IIR(pipe)));
1764 }
1765
1766 if (pch_iir & (SDE_TRANSB_CRC_DONE | SDE_TRANSA_CRC_DONE))
1767 drm_dbg(&dev_priv->drm, "PCH transcoder CRC done interrupt\n");
1768
1769 if (pch_iir & (SDE_TRANSB_CRC_ERR | SDE_TRANSA_CRC_ERR))
1770 drm_dbg(&dev_priv->drm,
1771 "PCH transcoder CRC error interrupt\n");
1772
1773 if (pch_iir & SDE_TRANSA_FIFO_UNDER)
1774 intel_pch_fifo_underrun_irq_handler(dev_priv, PIPE_A);
1775
1776 if (pch_iir & SDE_TRANSB_FIFO_UNDER)
1777 intel_pch_fifo_underrun_irq_handler(dev_priv, PIPE_B);
1778}
1779
1780static void ivb_err_int_handler(struct drm_i915_private *dev_priv)
1781{
1782 u32 err_int = I915_READ(GEN7_ERR_INT);
1783 enum pipe pipe;
1784
1785 if (err_int & ERR_INT_POISON)
1786 drm_err(&dev_priv->drm, "Poison interrupt\n");
1787
1788 for_each_pipe(dev_priv, pipe) {
1789 if (err_int & ERR_INT_FIFO_UNDERRUN(pipe))
1790 intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
1791
1792 if (err_int & ERR_INT_PIPE_CRC_DONE(pipe)) {
1793 if (IS_IVYBRIDGE(dev_priv))
1794 ivb_pipe_crc_irq_handler(dev_priv, pipe);
1795 else
1796 hsw_pipe_crc_irq_handler(dev_priv, pipe);
1797 }
1798 }
1799
1800 I915_WRITE(GEN7_ERR_INT, err_int);
1801}
1802
1803static void cpt_serr_int_handler(struct drm_i915_private *dev_priv)
1804{
1805 u32 serr_int = I915_READ(SERR_INT);
1806 enum pipe pipe;
1807
1808 if (serr_int & SERR_INT_POISON)
1809 drm_err(&dev_priv->drm, "PCH poison interrupt\n");
1810
1811 for_each_pipe(dev_priv, pipe)
1812 if (serr_int & SERR_INT_TRANS_FIFO_UNDERRUN(pipe))
1813 intel_pch_fifo_underrun_irq_handler(dev_priv, pipe);
1814
1815 I915_WRITE(SERR_INT, serr_int);
1816}
1817
1818static void cpt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
1819{
1820 enum pipe pipe;
1821 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT;
1822
1823 ibx_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_cpt);
1824
1825 if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) {
1826 int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK_CPT) >>
1827 SDE_AUDIO_POWER_SHIFT_CPT);
1828 drm_dbg(&dev_priv->drm, "PCH audio power change on port %c\n",
1829 port_name(port));
1830 }
1831
1832 if (pch_iir & SDE_AUX_MASK_CPT)
1833 dp_aux_irq_handler(dev_priv);
1834
1835 if (pch_iir & SDE_GMBUS_CPT)
1836 gmbus_irq_handler(dev_priv);
1837
1838 if (pch_iir & SDE_AUDIO_CP_REQ_CPT)
1839 drm_dbg(&dev_priv->drm, "Audio CP request interrupt\n");
1840
1841 if (pch_iir & SDE_AUDIO_CP_CHG_CPT)
1842 drm_dbg(&dev_priv->drm, "Audio CP change interrupt\n");
1843
1844 if (pch_iir & SDE_FDI_MASK_CPT) {
1845 for_each_pipe(dev_priv, pipe)
1846 drm_dbg(&dev_priv->drm, " pipe %c FDI IIR: 0x%08x\n",
1847 pipe_name(pipe),
1848 I915_READ(FDI_RX_IIR(pipe)));
1849 }
1850
1851 if (pch_iir & SDE_ERROR_CPT)
1852 cpt_serr_int_handler(dev_priv);
1853}
1854
1855static void icp_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
1856{
1857 u32 ddi_hotplug_trigger, tc_hotplug_trigger;
1858 u32 pin_mask = 0, long_mask = 0;
1859 bool (*tc_port_hotplug_long_detect)(enum hpd_pin pin, u32 val);
1860 const u32 *pins;
1861
1862 if (HAS_PCH_TGP(dev_priv)) {
1863 ddi_hotplug_trigger = pch_iir & SDE_DDI_MASK_TGP;
1864 tc_hotplug_trigger = pch_iir & SDE_TC_MASK_TGP;
1865 tc_port_hotplug_long_detect = tgp_tc_port_hotplug_long_detect;
1866 pins = hpd_tgp;
1867 } else if (HAS_PCH_JSP(dev_priv)) {
1868 ddi_hotplug_trigger = pch_iir & SDE_DDI_MASK_TGP;
1869 tc_hotplug_trigger = 0;
1870 pins = hpd_tgp;
1871 } else if (HAS_PCH_MCC(dev_priv)) {
1872 ddi_hotplug_trigger = pch_iir & SDE_DDI_MASK_ICP;
1873 tc_hotplug_trigger = pch_iir & SDE_TC_HOTPLUG_ICP(PORT_TC1);
1874 tc_port_hotplug_long_detect = icp_tc_port_hotplug_long_detect;
1875 pins = hpd_icp;
1876 } else {
1877 drm_WARN(&dev_priv->drm, !HAS_PCH_ICP(dev_priv),
1878 "Unrecognized PCH type 0x%x\n",
1879 INTEL_PCH_TYPE(dev_priv));
1880
1881 ddi_hotplug_trigger = pch_iir & SDE_DDI_MASK_ICP;
1882 tc_hotplug_trigger = pch_iir & SDE_TC_MASK_ICP;
1883 tc_port_hotplug_long_detect = icp_tc_port_hotplug_long_detect;
1884 pins = hpd_icp;
1885 }
1886
1887 if (ddi_hotplug_trigger) {
1888 u32 dig_hotplug_reg;
1889
1890 dig_hotplug_reg = I915_READ(SHOTPLUG_CTL_DDI);
1891 I915_WRITE(SHOTPLUG_CTL_DDI, dig_hotplug_reg);
1892
1893 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
1894 ddi_hotplug_trigger,
1895 dig_hotplug_reg, pins,
1896 icp_ddi_port_hotplug_long_detect);
1897 }
1898
1899 if (tc_hotplug_trigger) {
1900 u32 dig_hotplug_reg;
1901
1902 dig_hotplug_reg = I915_READ(SHOTPLUG_CTL_TC);
1903 I915_WRITE(SHOTPLUG_CTL_TC, dig_hotplug_reg);
1904
1905 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
1906 tc_hotplug_trigger,
1907 dig_hotplug_reg, pins,
1908 tc_port_hotplug_long_detect);
1909 }
1910
1911 if (pin_mask)
1912 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
1913
1914 if (pch_iir & SDE_GMBUS_ICP)
1915 gmbus_irq_handler(dev_priv);
1916}
1917
1918static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
1919{
1920 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_SPT &
1921 ~SDE_PORTE_HOTPLUG_SPT;
1922 u32 hotplug2_trigger = pch_iir & SDE_PORTE_HOTPLUG_SPT;
1923 u32 pin_mask = 0, long_mask = 0;
1924
1925 if (hotplug_trigger) {
1926 u32 dig_hotplug_reg;
1927
1928 dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
1929 I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
1930
1931 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
1932 hotplug_trigger, dig_hotplug_reg, hpd_spt,
1933 spt_port_hotplug_long_detect);
1934 }
1935
1936 if (hotplug2_trigger) {
1937 u32 dig_hotplug_reg;
1938
1939 dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG2);
1940 I915_WRITE(PCH_PORT_HOTPLUG2, dig_hotplug_reg);
1941
1942 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
1943 hotplug2_trigger, dig_hotplug_reg, hpd_spt,
1944 spt_port_hotplug2_long_detect);
1945 }
1946
1947 if (pin_mask)
1948 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
1949
1950 if (pch_iir & SDE_GMBUS_CPT)
1951 gmbus_irq_handler(dev_priv);
1952}
1953
1954static void ilk_hpd_irq_handler(struct drm_i915_private *dev_priv,
1955 u32 hotplug_trigger,
1956 const u32 hpd[HPD_NUM_PINS])
1957{
1958 u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0;
1959
1960 dig_hotplug_reg = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL);
1961 I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, dig_hotplug_reg);
1962
1963 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
1964 dig_hotplug_reg, hpd,
1965 ilk_port_hotplug_long_detect);
1966
1967 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
1968}
1969
1970static void ilk_display_irq_handler(struct drm_i915_private *dev_priv,
1971 u32 de_iir)
1972{
1973 enum pipe pipe;
1974 u32 hotplug_trigger = de_iir & DE_DP_A_HOTPLUG;
1975
1976 if (hotplug_trigger)
1977 ilk_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_ilk);
1978
1979 if (de_iir & DE_AUX_CHANNEL_A)
1980 dp_aux_irq_handler(dev_priv);
1981
1982 if (de_iir & DE_GSE)
1983 intel_opregion_asle_intr(dev_priv);
1984
1985 if (de_iir & DE_POISON)
1986 drm_err(&dev_priv->drm, "Poison interrupt\n");
1987
1988 for_each_pipe(dev_priv, pipe) {
1989 if (de_iir & DE_PIPE_VBLANK(pipe))
1990 intel_handle_vblank(dev_priv, pipe);
1991
1992 if (de_iir & DE_PIPE_FIFO_UNDERRUN(pipe))
1993 intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
1994
1995 if (de_iir & DE_PIPE_CRC_DONE(pipe))
1996 i9xx_pipe_crc_irq_handler(dev_priv, pipe);
1997 }
1998
1999
2000 if (de_iir & DE_PCH_EVENT) {
2001 u32 pch_iir = I915_READ(SDEIIR);
2002
2003 if (HAS_PCH_CPT(dev_priv))
2004 cpt_irq_handler(dev_priv, pch_iir);
2005 else
2006 ibx_irq_handler(dev_priv, pch_iir);
2007
2008
2009 I915_WRITE(SDEIIR, pch_iir);
2010 }
2011
2012 if (IS_GEN(dev_priv, 5) && de_iir & DE_PCU_EVENT)
2013 gen5_rps_irq_handler(&dev_priv->gt.rps);
2014}
2015
2016static void ivb_display_irq_handler(struct drm_i915_private *dev_priv,
2017 u32 de_iir)
2018{
2019 enum pipe pipe;
2020 u32 hotplug_trigger = de_iir & DE_DP_A_HOTPLUG_IVB;
2021
2022 if (hotplug_trigger)
2023 ilk_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_ivb);
2024
2025 if (de_iir & DE_ERR_INT_IVB)
2026 ivb_err_int_handler(dev_priv);
2027
2028 if (de_iir & DE_EDP_PSR_INT_HSW) {
2029 u32 psr_iir = I915_READ(EDP_PSR_IIR);
2030
2031 intel_psr_irq_handler(dev_priv, psr_iir);
2032 I915_WRITE(EDP_PSR_IIR, psr_iir);
2033 }
2034
2035 if (de_iir & DE_AUX_CHANNEL_A_IVB)
2036 dp_aux_irq_handler(dev_priv);
2037
2038 if (de_iir & DE_GSE_IVB)
2039 intel_opregion_asle_intr(dev_priv);
2040
2041 for_each_pipe(dev_priv, pipe) {
2042 if (de_iir & (DE_PIPE_VBLANK_IVB(pipe)))
2043 intel_handle_vblank(dev_priv, pipe);
2044 }
2045
2046
2047 if (!HAS_PCH_NOP(dev_priv) && (de_iir & DE_PCH_EVENT_IVB)) {
2048 u32 pch_iir = I915_READ(SDEIIR);
2049
2050 cpt_irq_handler(dev_priv, pch_iir);
2051
2052
2053 I915_WRITE(SDEIIR, pch_iir);
2054 }
2055}
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065static irqreturn_t ilk_irq_handler(int irq, void *arg)
2066{
2067 struct drm_i915_private *dev_priv = arg;
2068 u32 de_iir, gt_iir, de_ier, sde_ier = 0;
2069 irqreturn_t ret = IRQ_NONE;
2070
2071 if (!intel_irqs_enabled(dev_priv))
2072 return IRQ_NONE;
2073
2074
2075 disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
2076
2077
2078 de_ier = I915_READ(DEIER);
2079 I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
2080
2081
2082
2083
2084
2085
2086 if (!HAS_PCH_NOP(dev_priv)) {
2087 sde_ier = I915_READ(SDEIER);
2088 I915_WRITE(SDEIER, 0);
2089 }
2090
2091
2092
2093 gt_iir = I915_READ(GTIIR);
2094 if (gt_iir) {
2095 I915_WRITE(GTIIR, gt_iir);
2096 ret = IRQ_HANDLED;
2097 if (INTEL_GEN(dev_priv) >= 6)
2098 gen6_gt_irq_handler(&dev_priv->gt, gt_iir);
2099 else
2100 gen5_gt_irq_handler(&dev_priv->gt, gt_iir);
2101 }
2102
2103 de_iir = I915_READ(DEIIR);
2104 if (de_iir) {
2105 I915_WRITE(DEIIR, de_iir);
2106 ret = IRQ_HANDLED;
2107 if (INTEL_GEN(dev_priv) >= 7)
2108 ivb_display_irq_handler(dev_priv, de_iir);
2109 else
2110 ilk_display_irq_handler(dev_priv, de_iir);
2111 }
2112
2113 if (INTEL_GEN(dev_priv) >= 6) {
2114 u32 pm_iir = I915_READ(GEN6_PMIIR);
2115 if (pm_iir) {
2116 I915_WRITE(GEN6_PMIIR, pm_iir);
2117 ret = IRQ_HANDLED;
2118 gen6_rps_irq_handler(&dev_priv->gt.rps, pm_iir);
2119 }
2120 }
2121
2122 I915_WRITE(DEIER, de_ier);
2123 if (!HAS_PCH_NOP(dev_priv))
2124 I915_WRITE(SDEIER, sde_ier);
2125
2126
2127 enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
2128
2129 return ret;
2130}
2131
2132static void bxt_hpd_irq_handler(struct drm_i915_private *dev_priv,
2133 u32 hotplug_trigger,
2134 const u32 hpd[HPD_NUM_PINS])
2135{
2136 u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0;
2137
2138 dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
2139 I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
2140
2141 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
2142 dig_hotplug_reg, hpd,
2143 bxt_port_hotplug_long_detect);
2144
2145 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
2146}
2147
2148static void gen11_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 iir)
2149{
2150 u32 pin_mask = 0, long_mask = 0;
2151 u32 trigger_tc = iir & GEN11_DE_TC_HOTPLUG_MASK;
2152 u32 trigger_tbt = iir & GEN11_DE_TBT_HOTPLUG_MASK;
2153 long_pulse_detect_func long_pulse_detect;
2154 const u32 *hpd;
2155
2156 if (INTEL_GEN(dev_priv) >= 12) {
2157 long_pulse_detect = gen12_port_hotplug_long_detect;
2158 hpd = hpd_gen12;
2159 } else {
2160 long_pulse_detect = gen11_port_hotplug_long_detect;
2161 hpd = hpd_gen11;
2162 }
2163
2164 if (trigger_tc) {
2165 u32 dig_hotplug_reg;
2166
2167 dig_hotplug_reg = I915_READ(GEN11_TC_HOTPLUG_CTL);
2168 I915_WRITE(GEN11_TC_HOTPLUG_CTL, dig_hotplug_reg);
2169
2170 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, trigger_tc,
2171 dig_hotplug_reg, hpd, long_pulse_detect);
2172 }
2173
2174 if (trigger_tbt) {
2175 u32 dig_hotplug_reg;
2176
2177 dig_hotplug_reg = I915_READ(GEN11_TBT_HOTPLUG_CTL);
2178 I915_WRITE(GEN11_TBT_HOTPLUG_CTL, dig_hotplug_reg);
2179
2180 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, trigger_tbt,
2181 dig_hotplug_reg, hpd, long_pulse_detect);
2182 }
2183
2184 if (pin_mask)
2185 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
2186 else
2187 drm_err(&dev_priv->drm,
2188 "Unexpected DE HPD interrupt 0x%08x\n", iir);
2189}
2190
2191static u32 gen8_de_port_aux_mask(struct drm_i915_private *dev_priv)
2192{
2193 u32 mask;
2194
2195 if (INTEL_GEN(dev_priv) >= 12)
2196 return TGL_DE_PORT_AUX_DDIA |
2197 TGL_DE_PORT_AUX_DDIB |
2198 TGL_DE_PORT_AUX_DDIC |
2199 TGL_DE_PORT_AUX_USBC1 |
2200 TGL_DE_PORT_AUX_USBC2 |
2201 TGL_DE_PORT_AUX_USBC3 |
2202 TGL_DE_PORT_AUX_USBC4 |
2203 TGL_DE_PORT_AUX_USBC5 |
2204 TGL_DE_PORT_AUX_USBC6;
2205
2206
2207 mask = GEN8_AUX_CHANNEL_A;
2208 if (INTEL_GEN(dev_priv) >= 9)
2209 mask |= GEN9_AUX_CHANNEL_B |
2210 GEN9_AUX_CHANNEL_C |
2211 GEN9_AUX_CHANNEL_D;
2212
2213 if (IS_CNL_WITH_PORT_F(dev_priv) || IS_GEN(dev_priv, 11))
2214 mask |= CNL_AUX_CHANNEL_F;
2215
2216 if (IS_GEN(dev_priv, 11))
2217 mask |= ICL_AUX_CHANNEL_E;
2218
2219 return mask;
2220}
2221
2222static u32 gen8_de_pipe_fault_mask(struct drm_i915_private *dev_priv)
2223{
2224 if (INTEL_GEN(dev_priv) >= 11)
2225 return GEN11_DE_PIPE_IRQ_FAULT_ERRORS;
2226 else if (INTEL_GEN(dev_priv) >= 9)
2227 return GEN9_DE_PIPE_IRQ_FAULT_ERRORS;
2228 else
2229 return GEN8_DE_PIPE_IRQ_FAULT_ERRORS;
2230}
2231
2232static void
2233gen8_de_misc_irq_handler(struct drm_i915_private *dev_priv, u32 iir)
2234{
2235 bool found = false;
2236
2237 if (iir & GEN8_DE_MISC_GSE) {
2238 intel_opregion_asle_intr(dev_priv);
2239 found = true;
2240 }
2241
2242 if (iir & GEN8_DE_EDP_PSR) {
2243 u32 psr_iir;
2244 i915_reg_t iir_reg;
2245
2246 if (INTEL_GEN(dev_priv) >= 12)
2247 iir_reg = TRANS_PSR_IIR(dev_priv->psr.transcoder);
2248 else
2249 iir_reg = EDP_PSR_IIR;
2250
2251 psr_iir = I915_READ(iir_reg);
2252 I915_WRITE(iir_reg, psr_iir);
2253
2254 if (psr_iir)
2255 found = true;
2256
2257 intel_psr_irq_handler(dev_priv, psr_iir);
2258 }
2259
2260 if (!found)
2261 drm_err(&dev_priv->drm, "Unexpected DE Misc interrupt\n");
2262}
2263
2264static irqreturn_t
2265gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
2266{
2267 irqreturn_t ret = IRQ_NONE;
2268 u32 iir;
2269 enum pipe pipe;
2270
2271 if (master_ctl & GEN8_DE_MISC_IRQ) {
2272 iir = I915_READ(GEN8_DE_MISC_IIR);
2273 if (iir) {
2274 I915_WRITE(GEN8_DE_MISC_IIR, iir);
2275 ret = IRQ_HANDLED;
2276 gen8_de_misc_irq_handler(dev_priv, iir);
2277 } else {
2278 drm_err(&dev_priv->drm,
2279 "The master control interrupt lied (DE MISC)!\n");
2280 }
2281 }
2282
2283 if (INTEL_GEN(dev_priv) >= 11 && (master_ctl & GEN11_DE_HPD_IRQ)) {
2284 iir = I915_READ(GEN11_DE_HPD_IIR);
2285 if (iir) {
2286 I915_WRITE(GEN11_DE_HPD_IIR, iir);
2287 ret = IRQ_HANDLED;
2288 gen11_hpd_irq_handler(dev_priv, iir);
2289 } else {
2290 drm_err(&dev_priv->drm,
2291 "The master control interrupt lied, (DE HPD)!\n");
2292 }
2293 }
2294
2295 if (master_ctl & GEN8_DE_PORT_IRQ) {
2296 iir = I915_READ(GEN8_DE_PORT_IIR);
2297 if (iir) {
2298 u32 tmp_mask;
2299 bool found = false;
2300
2301 I915_WRITE(GEN8_DE_PORT_IIR, iir);
2302 ret = IRQ_HANDLED;
2303
2304 if (iir & gen8_de_port_aux_mask(dev_priv)) {
2305 dp_aux_irq_handler(dev_priv);
2306 found = true;
2307 }
2308
2309 if (IS_GEN9_LP(dev_priv)) {
2310 tmp_mask = iir & BXT_DE_PORT_HOTPLUG_MASK;
2311 if (tmp_mask) {
2312 bxt_hpd_irq_handler(dev_priv, tmp_mask,
2313 hpd_bxt);
2314 found = true;
2315 }
2316 } else if (IS_BROADWELL(dev_priv)) {
2317 tmp_mask = iir & GEN8_PORT_DP_A_HOTPLUG;
2318 if (tmp_mask) {
2319 ilk_hpd_irq_handler(dev_priv,
2320 tmp_mask, hpd_bdw);
2321 found = true;
2322 }
2323 }
2324
2325 if (IS_GEN9_LP(dev_priv) && (iir & BXT_DE_PORT_GMBUS)) {
2326 gmbus_irq_handler(dev_priv);
2327 found = true;
2328 }
2329
2330 if (!found)
2331 drm_err(&dev_priv->drm,
2332 "Unexpected DE Port interrupt\n");
2333 }
2334 else
2335 drm_err(&dev_priv->drm,
2336 "The master control interrupt lied (DE PORT)!\n");
2337 }
2338
2339 for_each_pipe(dev_priv, pipe) {
2340 u32 fault_errors;
2341
2342 if (!(master_ctl & GEN8_DE_PIPE_IRQ(pipe)))
2343 continue;
2344
2345 iir = I915_READ(GEN8_DE_PIPE_IIR(pipe));
2346 if (!iir) {
2347 drm_err(&dev_priv->drm,
2348 "The master control interrupt lied (DE PIPE)!\n");
2349 continue;
2350 }
2351
2352 ret = IRQ_HANDLED;
2353 I915_WRITE(GEN8_DE_PIPE_IIR(pipe), iir);
2354
2355 if (iir & GEN8_PIPE_VBLANK)
2356 intel_handle_vblank(dev_priv, pipe);
2357
2358 if (iir & GEN8_PIPE_CDCLK_CRC_DONE)
2359 hsw_pipe_crc_irq_handler(dev_priv, pipe);
2360
2361 if (iir & GEN8_PIPE_FIFO_UNDERRUN)
2362 intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
2363
2364 fault_errors = iir & gen8_de_pipe_fault_mask(dev_priv);
2365 if (fault_errors)
2366 drm_err(&dev_priv->drm,
2367 "Fault errors on pipe %c: 0x%08x\n",
2368 pipe_name(pipe),
2369 fault_errors);
2370 }
2371
2372 if (HAS_PCH_SPLIT(dev_priv) && !HAS_PCH_NOP(dev_priv) &&
2373 master_ctl & GEN8_DE_PCH_IRQ) {
2374
2375
2376
2377
2378
2379 iir = I915_READ(SDEIIR);
2380 if (iir) {
2381 I915_WRITE(SDEIIR, iir);
2382 ret = IRQ_HANDLED;
2383
2384 if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
2385 icp_irq_handler(dev_priv, iir);
2386 else if (INTEL_PCH_TYPE(dev_priv) >= PCH_SPT)
2387 spt_irq_handler(dev_priv, iir);
2388 else
2389 cpt_irq_handler(dev_priv, iir);
2390 } else {
2391
2392
2393
2394
2395 drm_dbg(&dev_priv->drm,
2396 "The master control interrupt lied (SDE)!\n");
2397 }
2398 }
2399
2400 return ret;
2401}
2402
2403static inline u32 gen8_master_intr_disable(void __iomem * const regs)
2404{
2405 raw_reg_write(regs, GEN8_MASTER_IRQ, 0);
2406
2407
2408
2409
2410
2411
2412
2413 return raw_reg_read(regs, GEN8_MASTER_IRQ);
2414}
2415
2416static inline void gen8_master_intr_enable(void __iomem * const regs)
2417{
2418 raw_reg_write(regs, GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
2419}
2420
2421static irqreturn_t gen8_irq_handler(int irq, void *arg)
2422{
2423 struct drm_i915_private *dev_priv = arg;
2424 void __iomem * const regs = dev_priv->uncore.regs;
2425 u32 master_ctl;
2426
2427 if (!intel_irqs_enabled(dev_priv))
2428 return IRQ_NONE;
2429
2430 master_ctl = gen8_master_intr_disable(regs);
2431 if (!master_ctl) {
2432 gen8_master_intr_enable(regs);
2433 return IRQ_NONE;
2434 }
2435
2436
2437 gen8_gt_irq_handler(&dev_priv->gt, master_ctl);
2438
2439
2440 if (master_ctl & ~GEN8_GT_IRQS) {
2441 disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
2442 gen8_de_irq_handler(dev_priv, master_ctl);
2443 enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
2444 }
2445
2446 gen8_master_intr_enable(regs);
2447
2448 return IRQ_HANDLED;
2449}
2450
2451static u32
2452gen11_gu_misc_irq_ack(struct intel_gt *gt, const u32 master_ctl)
2453{
2454 void __iomem * const regs = gt->uncore->regs;
2455 u32 iir;
2456
2457 if (!(master_ctl & GEN11_GU_MISC_IRQ))
2458 return 0;
2459
2460 iir = raw_reg_read(regs, GEN11_GU_MISC_IIR);
2461 if (likely(iir))
2462 raw_reg_write(regs, GEN11_GU_MISC_IIR, iir);
2463
2464 return iir;
2465}
2466
2467static void
2468gen11_gu_misc_irq_handler(struct intel_gt *gt, const u32 iir)
2469{
2470 if (iir & GEN11_GU_MISC_GSE)
2471 intel_opregion_asle_intr(gt->i915);
2472}
2473
2474static inline u32 gen11_master_intr_disable(void __iomem * const regs)
2475{
2476 raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, 0);
2477
2478
2479
2480
2481
2482
2483
2484 return raw_reg_read(regs, GEN11_GFX_MSTR_IRQ);
2485}
2486
2487static inline void gen11_master_intr_enable(void __iomem * const regs)
2488{
2489 raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ);
2490}
2491
2492static void
2493gen11_display_irq_handler(struct drm_i915_private *i915)
2494{
2495 void __iomem * const regs = i915->uncore.regs;
2496 const u32 disp_ctl = raw_reg_read(regs, GEN11_DISPLAY_INT_CTL);
2497
2498 disable_rpm_wakeref_asserts(&i915->runtime_pm);
2499
2500
2501
2502
2503 raw_reg_write(regs, GEN11_DISPLAY_INT_CTL, 0x0);
2504 gen8_de_irq_handler(i915, disp_ctl);
2505 raw_reg_write(regs, GEN11_DISPLAY_INT_CTL,
2506 GEN11_DISPLAY_IRQ_ENABLE);
2507
2508 enable_rpm_wakeref_asserts(&i915->runtime_pm);
2509}
2510
2511static __always_inline irqreturn_t
2512__gen11_irq_handler(struct drm_i915_private * const i915,
2513 u32 (*intr_disable)(void __iomem * const regs),
2514 void (*intr_enable)(void __iomem * const regs))
2515{
2516 void __iomem * const regs = i915->uncore.regs;
2517 struct intel_gt *gt = &i915->gt;
2518 u32 master_ctl;
2519 u32 gu_misc_iir;
2520
2521 if (!intel_irqs_enabled(i915))
2522 return IRQ_NONE;
2523
2524 master_ctl = intr_disable(regs);
2525 if (!master_ctl) {
2526 intr_enable(regs);
2527 return IRQ_NONE;
2528 }
2529
2530
2531 gen11_gt_irq_handler(gt, master_ctl);
2532
2533
2534 if (master_ctl & GEN11_DISPLAY_IRQ)
2535 gen11_display_irq_handler(i915);
2536
2537 gu_misc_iir = gen11_gu_misc_irq_ack(gt, master_ctl);
2538
2539 intr_enable(regs);
2540
2541 gen11_gu_misc_irq_handler(gt, gu_misc_iir);
2542
2543 return IRQ_HANDLED;
2544}
2545
2546static irqreturn_t gen11_irq_handler(int irq, void *arg)
2547{
2548 return __gen11_irq_handler(arg,
2549 gen11_master_intr_disable,
2550 gen11_master_intr_enable);
2551}
2552
2553
2554
2555
2556int i8xx_enable_vblank(struct drm_crtc *crtc)
2557{
2558 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2559 enum pipe pipe = to_intel_crtc(crtc)->pipe;
2560 unsigned long irqflags;
2561
2562 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2563 i915_enable_pipestat(dev_priv, pipe, PIPE_VBLANK_INTERRUPT_STATUS);
2564 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2565
2566 return 0;
2567}
2568
2569int i915gm_enable_vblank(struct drm_crtc *crtc)
2570{
2571 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2572
2573
2574
2575
2576
2577
2578
2579 if (dev_priv->vblank_enabled++ == 0)
2580 I915_WRITE(SCPD0, _MASKED_BIT_ENABLE(CSTATE_RENDER_CLOCK_GATE_DISABLE));
2581
2582 return i8xx_enable_vblank(crtc);
2583}
2584
2585int i965_enable_vblank(struct drm_crtc *crtc)
2586{
2587 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2588 enum pipe pipe = to_intel_crtc(crtc)->pipe;
2589 unsigned long irqflags;
2590
2591 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2592 i915_enable_pipestat(dev_priv, pipe,
2593 PIPE_START_VBLANK_INTERRUPT_STATUS);
2594 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2595
2596 return 0;
2597}
2598
2599int ilk_enable_vblank(struct drm_crtc *crtc)
2600{
2601 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2602 enum pipe pipe = to_intel_crtc(crtc)->pipe;
2603 unsigned long irqflags;
2604 u32 bit = INTEL_GEN(dev_priv) >= 7 ?
2605 DE_PIPE_VBLANK_IVB(pipe) : DE_PIPE_VBLANK(pipe);
2606
2607 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2608 ilk_enable_display_irq(dev_priv, bit);
2609 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2610
2611
2612
2613
2614 if (HAS_PSR(dev_priv))
2615 drm_crtc_vblank_restore(crtc);
2616
2617 return 0;
2618}
2619
2620int bdw_enable_vblank(struct drm_crtc *crtc)
2621{
2622 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2623 enum pipe pipe = to_intel_crtc(crtc)->pipe;
2624 unsigned long irqflags;
2625
2626 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2627 bdw_enable_pipe_irq(dev_priv, pipe, GEN8_PIPE_VBLANK);
2628 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2629
2630
2631
2632
2633 if (HAS_PSR(dev_priv))
2634 drm_crtc_vblank_restore(crtc);
2635
2636 return 0;
2637}
2638
2639
2640
2641
2642void i8xx_disable_vblank(struct drm_crtc *crtc)
2643{
2644 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2645 enum pipe pipe = to_intel_crtc(crtc)->pipe;
2646 unsigned long irqflags;
2647
2648 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2649 i915_disable_pipestat(dev_priv, pipe, PIPE_VBLANK_INTERRUPT_STATUS);
2650 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2651}
2652
2653void i915gm_disable_vblank(struct drm_crtc *crtc)
2654{
2655 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2656
2657 i8xx_disable_vblank(crtc);
2658
2659 if (--dev_priv->vblank_enabled == 0)
2660 I915_WRITE(SCPD0, _MASKED_BIT_DISABLE(CSTATE_RENDER_CLOCK_GATE_DISABLE));
2661}
2662
2663void i965_disable_vblank(struct drm_crtc *crtc)
2664{
2665 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2666 enum pipe pipe = to_intel_crtc(crtc)->pipe;
2667 unsigned long irqflags;
2668
2669 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2670 i915_disable_pipestat(dev_priv, pipe,
2671 PIPE_START_VBLANK_INTERRUPT_STATUS);
2672 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2673}
2674
2675void ilk_disable_vblank(struct drm_crtc *crtc)
2676{
2677 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2678 enum pipe pipe = to_intel_crtc(crtc)->pipe;
2679 unsigned long irqflags;
2680 u32 bit = INTEL_GEN(dev_priv) >= 7 ?
2681 DE_PIPE_VBLANK_IVB(pipe) : DE_PIPE_VBLANK(pipe);
2682
2683 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2684 ilk_disable_display_irq(dev_priv, bit);
2685 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2686}
2687
2688void bdw_disable_vblank(struct drm_crtc *crtc)
2689{
2690 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2691 enum pipe pipe = to_intel_crtc(crtc)->pipe;
2692 unsigned long irqflags;
2693
2694 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2695 bdw_disable_pipe_irq(dev_priv, pipe, GEN8_PIPE_VBLANK);
2696 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2697}
2698
2699static void ibx_irq_reset(struct drm_i915_private *dev_priv)
2700{
2701 struct intel_uncore *uncore = &dev_priv->uncore;
2702
2703 if (HAS_PCH_NOP(dev_priv))
2704 return;
2705
2706 GEN3_IRQ_RESET(uncore, SDE);
2707
2708 if (HAS_PCH_CPT(dev_priv) || HAS_PCH_LPT(dev_priv))
2709 I915_WRITE(SERR_INT, 0xffffffff);
2710}
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720static void ibx_irq_pre_postinstall(struct drm_i915_private *dev_priv)
2721{
2722 if (HAS_PCH_NOP(dev_priv))
2723 return;
2724
2725 drm_WARN_ON(&dev_priv->drm, I915_READ(SDEIER) != 0);
2726 I915_WRITE(SDEIER, 0xffffffff);
2727 POSTING_READ(SDEIER);
2728}
2729
2730static void vlv_display_irq_reset(struct drm_i915_private *dev_priv)
2731{
2732 struct intel_uncore *uncore = &dev_priv->uncore;
2733
2734 if (IS_CHERRYVIEW(dev_priv))
2735 intel_uncore_write(uncore, DPINVGTT, DPINVGTT_STATUS_MASK_CHV);
2736 else
2737 intel_uncore_write(uncore, DPINVGTT, DPINVGTT_STATUS_MASK);
2738
2739 i915_hotplug_interrupt_update_locked(dev_priv, 0xffffffff, 0);
2740 intel_uncore_write(uncore, PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
2741
2742 i9xx_pipestat_irq_reset(dev_priv);
2743
2744 GEN3_IRQ_RESET(uncore, VLV_);
2745 dev_priv->irq_mask = ~0u;
2746}
2747
2748static void vlv_display_irq_postinstall(struct drm_i915_private *dev_priv)
2749{
2750 struct intel_uncore *uncore = &dev_priv->uncore;
2751
2752 u32 pipestat_mask;
2753 u32 enable_mask;
2754 enum pipe pipe;
2755
2756 pipestat_mask = PIPE_CRC_DONE_INTERRUPT_STATUS;
2757
2758 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_GMBUS_INTERRUPT_STATUS);
2759 for_each_pipe(dev_priv, pipe)
2760 i915_enable_pipestat(dev_priv, pipe, pipestat_mask);
2761
2762 enable_mask = I915_DISPLAY_PORT_INTERRUPT |
2763 I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
2764 I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
2765 I915_LPE_PIPE_A_INTERRUPT |
2766 I915_LPE_PIPE_B_INTERRUPT;
2767
2768 if (IS_CHERRYVIEW(dev_priv))
2769 enable_mask |= I915_DISPLAY_PIPE_C_EVENT_INTERRUPT |
2770 I915_LPE_PIPE_C_INTERRUPT;
2771
2772 drm_WARN_ON(&dev_priv->drm, dev_priv->irq_mask != ~0u);
2773
2774 dev_priv->irq_mask = ~enable_mask;
2775
2776 GEN3_IRQ_INIT(uncore, VLV_, dev_priv->irq_mask, enable_mask);
2777}
2778
2779
2780
2781static void ilk_irq_reset(struct drm_i915_private *dev_priv)
2782{
2783 struct intel_uncore *uncore = &dev_priv->uncore;
2784
2785 GEN3_IRQ_RESET(uncore, DE);
2786 if (IS_GEN(dev_priv, 7))
2787 intel_uncore_write(uncore, GEN7_ERR_INT, 0xffffffff);
2788
2789 if (IS_HASWELL(dev_priv)) {
2790 intel_uncore_write(uncore, EDP_PSR_IMR, 0xffffffff);
2791 intel_uncore_write(uncore, EDP_PSR_IIR, 0xffffffff);
2792 }
2793
2794 gen5_gt_irq_reset(&dev_priv->gt);
2795
2796 ibx_irq_reset(dev_priv);
2797}
2798
2799static void valleyview_irq_reset(struct drm_i915_private *dev_priv)
2800{
2801 I915_WRITE(VLV_MASTER_IER, 0);
2802 POSTING_READ(VLV_MASTER_IER);
2803
2804 gen5_gt_irq_reset(&dev_priv->gt);
2805
2806 spin_lock_irq(&dev_priv->irq_lock);
2807 if (dev_priv->display_irqs_enabled)
2808 vlv_display_irq_reset(dev_priv);
2809 spin_unlock_irq(&dev_priv->irq_lock);
2810}
2811
2812static void gen8_irq_reset(struct drm_i915_private *dev_priv)
2813{
2814 struct intel_uncore *uncore = &dev_priv->uncore;
2815 enum pipe pipe;
2816
2817 gen8_master_intr_disable(dev_priv->uncore.regs);
2818
2819 gen8_gt_irq_reset(&dev_priv->gt);
2820
2821 intel_uncore_write(uncore, EDP_PSR_IMR, 0xffffffff);
2822 intel_uncore_write(uncore, EDP_PSR_IIR, 0xffffffff);
2823
2824 for_each_pipe(dev_priv, pipe)
2825 if (intel_display_power_is_enabled(dev_priv,
2826 POWER_DOMAIN_PIPE(pipe)))
2827 GEN8_IRQ_RESET_NDX(uncore, DE_PIPE, pipe);
2828
2829 GEN3_IRQ_RESET(uncore, GEN8_DE_PORT_);
2830 GEN3_IRQ_RESET(uncore, GEN8_DE_MISC_);
2831 GEN3_IRQ_RESET(uncore, GEN8_PCU_);
2832
2833 if (HAS_PCH_SPLIT(dev_priv))
2834 ibx_irq_reset(dev_priv);
2835}
2836
2837static void gen11_display_irq_reset(struct drm_i915_private *dev_priv)
2838{
2839 struct intel_uncore *uncore = &dev_priv->uncore;
2840 enum pipe pipe;
2841
2842 intel_uncore_write(uncore, GEN11_DISPLAY_INT_CTL, 0);
2843
2844 if (INTEL_GEN(dev_priv) >= 12) {
2845 enum transcoder trans;
2846
2847 for (trans = TRANSCODER_A; trans <= TRANSCODER_D; trans++) {
2848 enum intel_display_power_domain domain;
2849
2850 domain = POWER_DOMAIN_TRANSCODER(trans);
2851 if (!intel_display_power_is_enabled(dev_priv, domain))
2852 continue;
2853
2854 intel_uncore_write(uncore, TRANS_PSR_IMR(trans), 0xffffffff);
2855 intel_uncore_write(uncore, TRANS_PSR_IIR(trans), 0xffffffff);
2856 }
2857 } else {
2858 intel_uncore_write(uncore, EDP_PSR_IMR, 0xffffffff);
2859 intel_uncore_write(uncore, EDP_PSR_IIR, 0xffffffff);
2860 }
2861
2862 for_each_pipe(dev_priv, pipe)
2863 if (intel_display_power_is_enabled(dev_priv,
2864 POWER_DOMAIN_PIPE(pipe)))
2865 GEN8_IRQ_RESET_NDX(uncore, DE_PIPE, pipe);
2866
2867 GEN3_IRQ_RESET(uncore, GEN8_DE_PORT_);
2868 GEN3_IRQ_RESET(uncore, GEN8_DE_MISC_);
2869 GEN3_IRQ_RESET(uncore, GEN11_DE_HPD_);
2870
2871 if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
2872 GEN3_IRQ_RESET(uncore, SDE);
2873}
2874
2875static void gen11_irq_reset(struct drm_i915_private *dev_priv)
2876{
2877 struct intel_uncore *uncore = &dev_priv->uncore;
2878
2879 gen11_master_intr_disable(dev_priv->uncore.regs);
2880
2881 gen11_gt_irq_reset(&dev_priv->gt);
2882 gen11_display_irq_reset(dev_priv);
2883
2884 GEN3_IRQ_RESET(uncore, GEN11_GU_MISC_);
2885 GEN3_IRQ_RESET(uncore, GEN8_PCU_);
2886}
2887
2888void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
2889 u8 pipe_mask)
2890{
2891 struct intel_uncore *uncore = &dev_priv->uncore;
2892
2893 u32 extra_ier = GEN8_PIPE_VBLANK | GEN8_PIPE_FIFO_UNDERRUN;
2894 enum pipe pipe;
2895
2896 spin_lock_irq(&dev_priv->irq_lock);
2897
2898 if (!intel_irqs_enabled(dev_priv)) {
2899 spin_unlock_irq(&dev_priv->irq_lock);
2900 return;
2901 }
2902
2903 for_each_pipe_masked(dev_priv, pipe, pipe_mask)
2904 GEN8_IRQ_INIT_NDX(uncore, DE_PIPE, pipe,
2905 dev_priv->de_irq_mask[pipe],
2906 ~dev_priv->de_irq_mask[pipe] | extra_ier);
2907
2908 spin_unlock_irq(&dev_priv->irq_lock);
2909}
2910
2911void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
2912 u8 pipe_mask)
2913{
2914 struct intel_uncore *uncore = &dev_priv->uncore;
2915 enum pipe pipe;
2916
2917 spin_lock_irq(&dev_priv->irq_lock);
2918
2919 if (!intel_irqs_enabled(dev_priv)) {
2920 spin_unlock_irq(&dev_priv->irq_lock);
2921 return;
2922 }
2923
2924 for_each_pipe_masked(dev_priv, pipe, pipe_mask)
2925 GEN8_IRQ_RESET_NDX(uncore, DE_PIPE, pipe);
2926
2927 spin_unlock_irq(&dev_priv->irq_lock);
2928
2929
2930 intel_synchronize_irq(dev_priv);
2931}
2932
2933static void cherryview_irq_reset(struct drm_i915_private *dev_priv)
2934{
2935 struct intel_uncore *uncore = &dev_priv->uncore;
2936
2937 I915_WRITE(GEN8_MASTER_IRQ, 0);
2938 POSTING_READ(GEN8_MASTER_IRQ);
2939
2940 gen8_gt_irq_reset(&dev_priv->gt);
2941
2942 GEN3_IRQ_RESET(uncore, GEN8_PCU_);
2943
2944 spin_lock_irq(&dev_priv->irq_lock);
2945 if (dev_priv->display_irqs_enabled)
2946 vlv_display_irq_reset(dev_priv);
2947 spin_unlock_irq(&dev_priv->irq_lock);
2948}
2949
2950static u32 intel_hpd_enabled_irqs(struct drm_i915_private *dev_priv,
2951 const u32 hpd[HPD_NUM_PINS])
2952{
2953 struct intel_encoder *encoder;
2954 u32 enabled_irqs = 0;
2955
2956 for_each_intel_encoder(&dev_priv->drm, encoder)
2957 if (dev_priv->hotplug.stats[encoder->hpd_pin].state == HPD_ENABLED)
2958 enabled_irqs |= hpd[encoder->hpd_pin];
2959
2960 return enabled_irqs;
2961}
2962
2963static void ibx_hpd_detection_setup(struct drm_i915_private *dev_priv)
2964{
2965 u32 hotplug;
2966
2967
2968
2969
2970
2971
2972 hotplug = I915_READ(PCH_PORT_HOTPLUG);
2973 hotplug &= ~(PORTB_PULSE_DURATION_MASK |
2974 PORTC_PULSE_DURATION_MASK |
2975 PORTD_PULSE_DURATION_MASK);
2976 hotplug |= PORTB_HOTPLUG_ENABLE | PORTB_PULSE_DURATION_2ms;
2977 hotplug |= PORTC_HOTPLUG_ENABLE | PORTC_PULSE_DURATION_2ms;
2978 hotplug |= PORTD_HOTPLUG_ENABLE | PORTD_PULSE_DURATION_2ms;
2979
2980
2981
2982
2983 if (HAS_PCH_LPT_LP(dev_priv))
2984 hotplug |= PORTA_HOTPLUG_ENABLE;
2985 I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
2986}
2987
2988static void ibx_hpd_irq_setup(struct drm_i915_private *dev_priv)
2989{
2990 u32 hotplug_irqs, enabled_irqs;
2991
2992 if (HAS_PCH_IBX(dev_priv)) {
2993 hotplug_irqs = SDE_HOTPLUG_MASK;
2994 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_ibx);
2995 } else {
2996 hotplug_irqs = SDE_HOTPLUG_MASK_CPT;
2997 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_cpt);
2998 }
2999
3000 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
3001
3002 ibx_hpd_detection_setup(dev_priv);
3003}
3004
3005static void icp_hpd_detection_setup(struct drm_i915_private *dev_priv,
3006 u32 ddi_hotplug_enable_mask,
3007 u32 tc_hotplug_enable_mask)
3008{
3009 u32 hotplug;
3010
3011 hotplug = I915_READ(SHOTPLUG_CTL_DDI);
3012 hotplug |= ddi_hotplug_enable_mask;
3013 I915_WRITE(SHOTPLUG_CTL_DDI, hotplug);
3014
3015 if (tc_hotplug_enable_mask) {
3016 hotplug = I915_READ(SHOTPLUG_CTL_TC);
3017 hotplug |= tc_hotplug_enable_mask;
3018 I915_WRITE(SHOTPLUG_CTL_TC, hotplug);
3019 }
3020}
3021
3022static void icp_hpd_irq_setup(struct drm_i915_private *dev_priv,
3023 u32 sde_ddi_mask, u32 sde_tc_mask,
3024 u32 ddi_enable_mask, u32 tc_enable_mask,
3025 const u32 *pins)
3026{
3027 u32 hotplug_irqs, enabled_irqs;
3028
3029 hotplug_irqs = sde_ddi_mask | sde_tc_mask;
3030 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, pins);
3031
3032 I915_WRITE(SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
3033
3034 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
3035
3036 icp_hpd_detection_setup(dev_priv, ddi_enable_mask, tc_enable_mask);
3037}
3038
3039
3040
3041
3042
3043static void mcc_hpd_irq_setup(struct drm_i915_private *dev_priv)
3044{
3045 icp_hpd_irq_setup(dev_priv,
3046 SDE_DDI_MASK_ICP, SDE_TC_HOTPLUG_ICP(PORT_TC1),
3047 ICP_DDI_HPD_ENABLE_MASK, ICP_TC_HPD_ENABLE(PORT_TC1),
3048 hpd_icp);
3049}
3050
3051
3052
3053
3054
3055
3056static void jsp_hpd_irq_setup(struct drm_i915_private *dev_priv)
3057{
3058 icp_hpd_irq_setup(dev_priv,
3059 SDE_DDI_MASK_TGP, 0,
3060 TGP_DDI_HPD_ENABLE_MASK, 0,
3061 hpd_tgp);
3062}
3063
3064static void gen11_hpd_detection_setup(struct drm_i915_private *dev_priv)
3065{
3066 u32 hotplug;
3067
3068 hotplug = I915_READ(GEN11_TC_HOTPLUG_CTL);
3069 hotplug |= GEN11_HOTPLUG_CTL_ENABLE(PORT_TC1) |
3070 GEN11_HOTPLUG_CTL_ENABLE(PORT_TC2) |
3071 GEN11_HOTPLUG_CTL_ENABLE(PORT_TC3) |
3072 GEN11_HOTPLUG_CTL_ENABLE(PORT_TC4);
3073 I915_WRITE(GEN11_TC_HOTPLUG_CTL, hotplug);
3074
3075 hotplug = I915_READ(GEN11_TBT_HOTPLUG_CTL);
3076 hotplug |= GEN11_HOTPLUG_CTL_ENABLE(PORT_TC1) |
3077 GEN11_HOTPLUG_CTL_ENABLE(PORT_TC2) |
3078 GEN11_HOTPLUG_CTL_ENABLE(PORT_TC3) |
3079 GEN11_HOTPLUG_CTL_ENABLE(PORT_TC4);
3080 I915_WRITE(GEN11_TBT_HOTPLUG_CTL, hotplug);
3081}
3082
3083static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv)
3084{
3085 u32 hotplug_irqs, enabled_irqs;
3086 const u32 *hpd;
3087 u32 val;
3088
3089 hpd = INTEL_GEN(dev_priv) >= 12 ? hpd_gen12 : hpd_gen11;
3090 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd);
3091 hotplug_irqs = GEN11_DE_TC_HOTPLUG_MASK | GEN11_DE_TBT_HOTPLUG_MASK;
3092
3093 val = I915_READ(GEN11_DE_HPD_IMR);
3094 val &= ~hotplug_irqs;
3095 I915_WRITE(GEN11_DE_HPD_IMR, val);
3096 POSTING_READ(GEN11_DE_HPD_IMR);
3097
3098 gen11_hpd_detection_setup(dev_priv);
3099
3100 if (INTEL_PCH_TYPE(dev_priv) >= PCH_TGP)
3101 icp_hpd_irq_setup(dev_priv, SDE_DDI_MASK_TGP, SDE_TC_MASK_TGP,
3102 TGP_DDI_HPD_ENABLE_MASK,
3103 TGP_TC_HPD_ENABLE_MASK, hpd_tgp);
3104 else if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
3105 icp_hpd_irq_setup(dev_priv, SDE_DDI_MASK_ICP, SDE_TC_MASK_ICP,
3106 ICP_DDI_HPD_ENABLE_MASK,
3107 ICP_TC_HPD_ENABLE_MASK, hpd_icp);
3108}
3109
3110static void spt_hpd_detection_setup(struct drm_i915_private *dev_priv)
3111{
3112 u32 val, hotplug;
3113
3114
3115 if (HAS_PCH_CNP(dev_priv)) {
3116 val = I915_READ(SOUTH_CHICKEN1);
3117 val &= ~CHASSIS_CLK_REQ_DURATION_MASK;
3118 val |= CHASSIS_CLK_REQ_DURATION(0xf);
3119 I915_WRITE(SOUTH_CHICKEN1, val);
3120 }
3121
3122
3123 hotplug = I915_READ(PCH_PORT_HOTPLUG);
3124 hotplug |= PORTA_HOTPLUG_ENABLE |
3125 PORTB_HOTPLUG_ENABLE |
3126 PORTC_HOTPLUG_ENABLE |
3127 PORTD_HOTPLUG_ENABLE;
3128 I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
3129
3130 hotplug = I915_READ(PCH_PORT_HOTPLUG2);
3131 hotplug |= PORTE_HOTPLUG_ENABLE;
3132 I915_WRITE(PCH_PORT_HOTPLUG2, hotplug);
3133}
3134
3135static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv)
3136{
3137 u32 hotplug_irqs, enabled_irqs;
3138
3139 if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP)
3140 I915_WRITE(SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
3141
3142 hotplug_irqs = SDE_HOTPLUG_MASK_SPT;
3143 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_spt);
3144
3145 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
3146
3147 spt_hpd_detection_setup(dev_priv);
3148}
3149
3150static void ilk_hpd_detection_setup(struct drm_i915_private *dev_priv)
3151{
3152 u32 hotplug;
3153
3154
3155
3156
3157
3158
3159 hotplug = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL);
3160 hotplug &= ~DIGITAL_PORTA_PULSE_DURATION_MASK;
3161 hotplug |= DIGITAL_PORTA_HOTPLUG_ENABLE |
3162 DIGITAL_PORTA_PULSE_DURATION_2ms;
3163 I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, hotplug);
3164}
3165
3166static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv)
3167{
3168 u32 hotplug_irqs, enabled_irqs;
3169
3170 if (INTEL_GEN(dev_priv) >= 8) {
3171 hotplug_irqs = GEN8_PORT_DP_A_HOTPLUG;
3172 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bdw);
3173
3174 bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs);
3175 } else if (INTEL_GEN(dev_priv) >= 7) {
3176 hotplug_irqs = DE_DP_A_HOTPLUG_IVB;
3177 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_ivb);
3178
3179 ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs);
3180 } else {
3181 hotplug_irqs = DE_DP_A_HOTPLUG;
3182 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_ilk);
3183
3184 ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs);
3185 }
3186
3187 ilk_hpd_detection_setup(dev_priv);
3188
3189 ibx_hpd_irq_setup(dev_priv);
3190}
3191
3192static void __bxt_hpd_detection_setup(struct drm_i915_private *dev_priv,
3193 u32 enabled_irqs)
3194{
3195 u32 hotplug;
3196
3197 hotplug = I915_READ(PCH_PORT_HOTPLUG);
3198 hotplug |= PORTA_HOTPLUG_ENABLE |
3199 PORTB_HOTPLUG_ENABLE |
3200 PORTC_HOTPLUG_ENABLE;
3201
3202 drm_dbg_kms(&dev_priv->drm,
3203 "Invert bit setting: hp_ctl:%x hp_port:%x\n",
3204 hotplug, enabled_irqs);
3205 hotplug &= ~BXT_DDI_HPD_INVERT_MASK;
3206
3207
3208
3209
3210
3211 if ((enabled_irqs & BXT_DE_PORT_HP_DDIA) &&
3212 intel_bios_is_port_hpd_inverted(dev_priv, PORT_A))
3213 hotplug |= BXT_DDIA_HPD_INVERT;
3214 if ((enabled_irqs & BXT_DE_PORT_HP_DDIB) &&
3215 intel_bios_is_port_hpd_inverted(dev_priv, PORT_B))
3216 hotplug |= BXT_DDIB_HPD_INVERT;
3217 if ((enabled_irqs & BXT_DE_PORT_HP_DDIC) &&
3218 intel_bios_is_port_hpd_inverted(dev_priv, PORT_C))
3219 hotplug |= BXT_DDIC_HPD_INVERT;
3220
3221 I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
3222}
3223
3224static void bxt_hpd_detection_setup(struct drm_i915_private *dev_priv)
3225{
3226 __bxt_hpd_detection_setup(dev_priv, BXT_DE_PORT_HOTPLUG_MASK);
3227}
3228
3229static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv)
3230{
3231 u32 hotplug_irqs, enabled_irqs;
3232
3233 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bxt);
3234 hotplug_irqs = BXT_DE_PORT_HOTPLUG_MASK;
3235
3236 bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs);
3237
3238 __bxt_hpd_detection_setup(dev_priv, enabled_irqs);
3239}
3240
3241static void ibx_irq_postinstall(struct drm_i915_private *dev_priv)
3242{
3243 u32 mask;
3244
3245 if (HAS_PCH_NOP(dev_priv))
3246 return;
3247
3248 if (HAS_PCH_IBX(dev_priv))
3249 mask = SDE_GMBUS | SDE_AUX_MASK | SDE_POISON;
3250 else if (HAS_PCH_CPT(dev_priv) || HAS_PCH_LPT(dev_priv))
3251 mask = SDE_GMBUS_CPT | SDE_AUX_MASK_CPT;
3252 else
3253 mask = SDE_GMBUS_CPT;
3254
3255 gen3_assert_iir_is_zero(&dev_priv->uncore, SDEIIR);
3256 I915_WRITE(SDEIMR, ~mask);
3257
3258 if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) ||
3259 HAS_PCH_LPT(dev_priv))
3260 ibx_hpd_detection_setup(dev_priv);
3261 else
3262 spt_hpd_detection_setup(dev_priv);
3263}
3264
3265static void ilk_irq_postinstall(struct drm_i915_private *dev_priv)
3266{
3267 struct intel_uncore *uncore = &dev_priv->uncore;
3268 u32 display_mask, extra_mask;
3269
3270 if (INTEL_GEN(dev_priv) >= 7) {
3271 display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE_IVB |
3272 DE_PCH_EVENT_IVB | DE_AUX_CHANNEL_A_IVB);
3273 extra_mask = (DE_PIPEC_VBLANK_IVB | DE_PIPEB_VBLANK_IVB |
3274 DE_PIPEA_VBLANK_IVB | DE_ERR_INT_IVB |
3275 DE_DP_A_HOTPLUG_IVB);
3276 } else {
3277 display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT |
3278 DE_AUX_CHANNEL_A | DE_PIPEB_CRC_DONE |
3279 DE_PIPEA_CRC_DONE | DE_POISON);
3280 extra_mask = (DE_PIPEA_VBLANK | DE_PIPEB_VBLANK | DE_PCU_EVENT |
3281 DE_PIPEB_FIFO_UNDERRUN | DE_PIPEA_FIFO_UNDERRUN |
3282 DE_DP_A_HOTPLUG);
3283 }
3284
3285 if (IS_HASWELL(dev_priv)) {
3286 gen3_assert_iir_is_zero(uncore, EDP_PSR_IIR);
3287 display_mask |= DE_EDP_PSR_INT_HSW;
3288 }
3289
3290 dev_priv->irq_mask = ~display_mask;
3291
3292 ibx_irq_pre_postinstall(dev_priv);
3293
3294 GEN3_IRQ_INIT(uncore, DE, dev_priv->irq_mask,
3295 display_mask | extra_mask);
3296
3297 gen5_gt_irq_postinstall(&dev_priv->gt);
3298
3299 ilk_hpd_detection_setup(dev_priv);
3300
3301 ibx_irq_postinstall(dev_priv);
3302
3303 if (IS_IRONLAKE_M(dev_priv)) {
3304
3305
3306
3307
3308
3309 spin_lock_irq(&dev_priv->irq_lock);
3310 ilk_enable_display_irq(dev_priv, DE_PCU_EVENT);
3311 spin_unlock_irq(&dev_priv->irq_lock);
3312 }
3313}
3314
3315void valleyview_enable_display_irqs(struct drm_i915_private *dev_priv)
3316{
3317 lockdep_assert_held(&dev_priv->irq_lock);
3318
3319 if (dev_priv->display_irqs_enabled)
3320 return;
3321
3322 dev_priv->display_irqs_enabled = true;
3323
3324 if (intel_irqs_enabled(dev_priv)) {
3325 vlv_display_irq_reset(dev_priv);
3326 vlv_display_irq_postinstall(dev_priv);
3327 }
3328}
3329
3330void valleyview_disable_display_irqs(struct drm_i915_private *dev_priv)
3331{
3332 lockdep_assert_held(&dev_priv->irq_lock);
3333
3334 if (!dev_priv->display_irqs_enabled)
3335 return;
3336
3337 dev_priv->display_irqs_enabled = false;
3338
3339 if (intel_irqs_enabled(dev_priv))
3340 vlv_display_irq_reset(dev_priv);
3341}
3342
3343
3344static void valleyview_irq_postinstall(struct drm_i915_private *dev_priv)
3345{
3346 gen5_gt_irq_postinstall(&dev_priv->gt);
3347
3348 spin_lock_irq(&dev_priv->irq_lock);
3349 if (dev_priv->display_irqs_enabled)
3350 vlv_display_irq_postinstall(dev_priv);
3351 spin_unlock_irq(&dev_priv->irq_lock);
3352
3353 I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
3354 POSTING_READ(VLV_MASTER_IER);
3355}
3356
3357static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
3358{
3359 struct intel_uncore *uncore = &dev_priv->uncore;
3360
3361 u32 de_pipe_masked = gen8_de_pipe_fault_mask(dev_priv) |
3362 GEN8_PIPE_CDCLK_CRC_DONE;
3363 u32 de_pipe_enables;
3364 u32 de_port_masked = gen8_de_port_aux_mask(dev_priv);
3365 u32 de_port_enables;
3366 u32 de_misc_masked = GEN8_DE_EDP_PSR;
3367 enum pipe pipe;
3368
3369 if (INTEL_GEN(dev_priv) <= 10)
3370 de_misc_masked |= GEN8_DE_MISC_GSE;
3371
3372 if (IS_GEN9_LP(dev_priv))
3373 de_port_masked |= BXT_DE_PORT_GMBUS;
3374
3375 de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK |
3376 GEN8_PIPE_FIFO_UNDERRUN;
3377
3378 de_port_enables = de_port_masked;
3379 if (IS_GEN9_LP(dev_priv))
3380 de_port_enables |= BXT_DE_PORT_HOTPLUG_MASK;
3381 else if (IS_BROADWELL(dev_priv))
3382 de_port_enables |= GEN8_PORT_DP_A_HOTPLUG;
3383
3384 if (INTEL_GEN(dev_priv) >= 12) {
3385 enum transcoder trans;
3386
3387 for (trans = TRANSCODER_A; trans <= TRANSCODER_D; trans++) {
3388 enum intel_display_power_domain domain;
3389
3390 domain = POWER_DOMAIN_TRANSCODER(trans);
3391 if (!intel_display_power_is_enabled(dev_priv, domain))
3392 continue;
3393
3394 gen3_assert_iir_is_zero(uncore, TRANS_PSR_IIR(trans));
3395 }
3396 } else {
3397 gen3_assert_iir_is_zero(uncore, EDP_PSR_IIR);
3398 }
3399
3400 for_each_pipe(dev_priv, pipe) {
3401 dev_priv->de_irq_mask[pipe] = ~de_pipe_masked;
3402
3403 if (intel_display_power_is_enabled(dev_priv,
3404 POWER_DOMAIN_PIPE(pipe)))
3405 GEN8_IRQ_INIT_NDX(uncore, DE_PIPE, pipe,
3406 dev_priv->de_irq_mask[pipe],
3407 de_pipe_enables);
3408 }
3409
3410 GEN3_IRQ_INIT(uncore, GEN8_DE_PORT_, ~de_port_masked, de_port_enables);
3411 GEN3_IRQ_INIT(uncore, GEN8_DE_MISC_, ~de_misc_masked, de_misc_masked);
3412
3413 if (INTEL_GEN(dev_priv) >= 11) {
3414 u32 de_hpd_masked = 0;
3415 u32 de_hpd_enables = GEN11_DE_TC_HOTPLUG_MASK |
3416 GEN11_DE_TBT_HOTPLUG_MASK;
3417
3418 GEN3_IRQ_INIT(uncore, GEN11_DE_HPD_, ~de_hpd_masked,
3419 de_hpd_enables);
3420 gen11_hpd_detection_setup(dev_priv);
3421 } else if (IS_GEN9_LP(dev_priv)) {
3422 bxt_hpd_detection_setup(dev_priv);
3423 } else if (IS_BROADWELL(dev_priv)) {
3424 ilk_hpd_detection_setup(dev_priv);
3425 }
3426}
3427
3428static void gen8_irq_postinstall(struct drm_i915_private *dev_priv)
3429{
3430 if (HAS_PCH_SPLIT(dev_priv))
3431 ibx_irq_pre_postinstall(dev_priv);
3432
3433 gen8_gt_irq_postinstall(&dev_priv->gt);
3434 gen8_de_irq_postinstall(dev_priv);
3435
3436 if (HAS_PCH_SPLIT(dev_priv))
3437 ibx_irq_postinstall(dev_priv);
3438
3439 gen8_master_intr_enable(dev_priv->uncore.regs);
3440}
3441
3442static void icp_irq_postinstall(struct drm_i915_private *dev_priv)
3443{
3444 u32 mask = SDE_GMBUS_ICP;
3445
3446 drm_WARN_ON(&dev_priv->drm, I915_READ(SDEIER) != 0);
3447 I915_WRITE(SDEIER, 0xffffffff);
3448 POSTING_READ(SDEIER);
3449
3450 gen3_assert_iir_is_zero(&dev_priv->uncore, SDEIIR);
3451 I915_WRITE(SDEIMR, ~mask);
3452
3453 if (HAS_PCH_TGP(dev_priv))
3454 icp_hpd_detection_setup(dev_priv, TGP_DDI_HPD_ENABLE_MASK,
3455 TGP_TC_HPD_ENABLE_MASK);
3456 else if (HAS_PCH_JSP(dev_priv))
3457 icp_hpd_detection_setup(dev_priv, TGP_DDI_HPD_ENABLE_MASK, 0);
3458 else if (HAS_PCH_MCC(dev_priv))
3459 icp_hpd_detection_setup(dev_priv, ICP_DDI_HPD_ENABLE_MASK,
3460 ICP_TC_HPD_ENABLE(PORT_TC1));
3461 else
3462 icp_hpd_detection_setup(dev_priv, ICP_DDI_HPD_ENABLE_MASK,
3463 ICP_TC_HPD_ENABLE_MASK);
3464}
3465
3466static void gen11_irq_postinstall(struct drm_i915_private *dev_priv)
3467{
3468 struct intel_uncore *uncore = &dev_priv->uncore;
3469 u32 gu_misc_masked = GEN11_GU_MISC_GSE;
3470
3471 if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
3472 icp_irq_postinstall(dev_priv);
3473
3474 gen11_gt_irq_postinstall(&dev_priv->gt);
3475 gen8_de_irq_postinstall(dev_priv);
3476
3477 GEN3_IRQ_INIT(uncore, GEN11_GU_MISC_, ~gu_misc_masked, gu_misc_masked);
3478
3479 I915_WRITE(GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
3480
3481 gen11_master_intr_enable(uncore->regs);
3482 POSTING_READ(GEN11_GFX_MSTR_IRQ);
3483}
3484
3485static void cherryview_irq_postinstall(struct drm_i915_private *dev_priv)
3486{
3487 gen8_gt_irq_postinstall(&dev_priv->gt);
3488
3489 spin_lock_irq(&dev_priv->irq_lock);
3490 if (dev_priv->display_irqs_enabled)
3491 vlv_display_irq_postinstall(dev_priv);
3492 spin_unlock_irq(&dev_priv->irq_lock);
3493
3494 I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
3495 POSTING_READ(GEN8_MASTER_IRQ);
3496}
3497
3498static void i8xx_irq_reset(struct drm_i915_private *dev_priv)
3499{
3500 struct intel_uncore *uncore = &dev_priv->uncore;
3501
3502 i9xx_pipestat_irq_reset(dev_priv);
3503
3504 GEN2_IRQ_RESET(uncore);
3505}
3506
3507static void i8xx_irq_postinstall(struct drm_i915_private *dev_priv)
3508{
3509 struct intel_uncore *uncore = &dev_priv->uncore;
3510 u16 enable_mask;
3511
3512 intel_uncore_write16(uncore,
3513 EMR,
3514 ~(I915_ERROR_PAGE_TABLE |
3515 I915_ERROR_MEMORY_REFRESH));
3516
3517
3518 dev_priv->irq_mask =
3519 ~(I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
3520 I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
3521 I915_MASTER_ERROR_INTERRUPT);
3522
3523 enable_mask =
3524 I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
3525 I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
3526 I915_MASTER_ERROR_INTERRUPT |
3527 I915_USER_INTERRUPT;
3528
3529 GEN2_IRQ_INIT(uncore, dev_priv->irq_mask, enable_mask);
3530
3531
3532
3533 spin_lock_irq(&dev_priv->irq_lock);
3534 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_CRC_DONE_INTERRUPT_STATUS);
3535 i915_enable_pipestat(dev_priv, PIPE_B, PIPE_CRC_DONE_INTERRUPT_STATUS);
3536 spin_unlock_irq(&dev_priv->irq_lock);
3537}
3538
3539static void i8xx_error_irq_ack(struct drm_i915_private *i915,
3540 u16 *eir, u16 *eir_stuck)
3541{
3542 struct intel_uncore *uncore = &i915->uncore;
3543 u16 emr;
3544
3545 *eir = intel_uncore_read16(uncore, EIR);
3546
3547 if (*eir)
3548 intel_uncore_write16(uncore, EIR, *eir);
3549
3550 *eir_stuck = intel_uncore_read16(uncore, EIR);
3551 if (*eir_stuck == 0)
3552 return;
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564 emr = intel_uncore_read16(uncore, EMR);
3565 intel_uncore_write16(uncore, EMR, 0xffff);
3566 intel_uncore_write16(uncore, EMR, emr | *eir_stuck);
3567}
3568
3569static void i8xx_error_irq_handler(struct drm_i915_private *dev_priv,
3570 u16 eir, u16 eir_stuck)
3571{
3572 DRM_DEBUG("Master Error: EIR 0x%04x\n", eir);
3573
3574 if (eir_stuck)
3575 drm_dbg(&dev_priv->drm, "EIR stuck: 0x%04x, masked\n",
3576 eir_stuck);
3577}
3578
3579static void i9xx_error_irq_ack(struct drm_i915_private *dev_priv,
3580 u32 *eir, u32 *eir_stuck)
3581{
3582 u32 emr;
3583
3584 *eir = I915_READ(EIR);
3585
3586 I915_WRITE(EIR, *eir);
3587
3588 *eir_stuck = I915_READ(EIR);
3589 if (*eir_stuck == 0)
3590 return;
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602 emr = I915_READ(EMR);
3603 I915_WRITE(EMR, 0xffffffff);
3604 I915_WRITE(EMR, emr | *eir_stuck);
3605}
3606
3607static void i9xx_error_irq_handler(struct drm_i915_private *dev_priv,
3608 u32 eir, u32 eir_stuck)
3609{
3610 DRM_DEBUG("Master Error, EIR 0x%08x\n", eir);
3611
3612 if (eir_stuck)
3613 drm_dbg(&dev_priv->drm, "EIR stuck: 0x%08x, masked\n",
3614 eir_stuck);
3615}
3616
3617static irqreturn_t i8xx_irq_handler(int irq, void *arg)
3618{
3619 struct drm_i915_private *dev_priv = arg;
3620 irqreturn_t ret = IRQ_NONE;
3621
3622 if (!intel_irqs_enabled(dev_priv))
3623 return IRQ_NONE;
3624
3625
3626 disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
3627
3628 do {
3629 u32 pipe_stats[I915_MAX_PIPES] = {};
3630 u16 eir = 0, eir_stuck = 0;
3631 u16 iir;
3632
3633 iir = intel_uncore_read16(&dev_priv->uncore, GEN2_IIR);
3634 if (iir == 0)
3635 break;
3636
3637 ret = IRQ_HANDLED;
3638
3639
3640
3641 i9xx_pipestat_irq_ack(dev_priv, iir, pipe_stats);
3642
3643 if (iir & I915_MASTER_ERROR_INTERRUPT)
3644 i8xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
3645
3646 intel_uncore_write16(&dev_priv->uncore, GEN2_IIR, iir);
3647
3648 if (iir & I915_USER_INTERRUPT)
3649 intel_engine_signal_breadcrumbs(dev_priv->engine[RCS0]);
3650
3651 if (iir & I915_MASTER_ERROR_INTERRUPT)
3652 i8xx_error_irq_handler(dev_priv, eir, eir_stuck);
3653
3654 i8xx_pipestat_irq_handler(dev_priv, iir, pipe_stats);
3655 } while (0);
3656
3657 enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
3658
3659 return ret;
3660}
3661
3662static void i915_irq_reset(struct drm_i915_private *dev_priv)
3663{
3664 struct intel_uncore *uncore = &dev_priv->uncore;
3665
3666 if (I915_HAS_HOTPLUG(dev_priv)) {
3667 i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
3668 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
3669 }
3670
3671 i9xx_pipestat_irq_reset(dev_priv);
3672
3673 GEN3_IRQ_RESET(uncore, GEN2_);
3674}
3675
3676static void i915_irq_postinstall(struct drm_i915_private *dev_priv)
3677{
3678 struct intel_uncore *uncore = &dev_priv->uncore;
3679 u32 enable_mask;
3680
3681 I915_WRITE(EMR, ~(I915_ERROR_PAGE_TABLE |
3682 I915_ERROR_MEMORY_REFRESH));
3683
3684
3685 dev_priv->irq_mask =
3686 ~(I915_ASLE_INTERRUPT |
3687 I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
3688 I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
3689 I915_MASTER_ERROR_INTERRUPT);
3690
3691 enable_mask =
3692 I915_ASLE_INTERRUPT |
3693 I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
3694 I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
3695 I915_MASTER_ERROR_INTERRUPT |
3696 I915_USER_INTERRUPT;
3697
3698 if (I915_HAS_HOTPLUG(dev_priv)) {
3699
3700 enable_mask |= I915_DISPLAY_PORT_INTERRUPT;
3701
3702 dev_priv->irq_mask &= ~I915_DISPLAY_PORT_INTERRUPT;
3703 }
3704
3705 GEN3_IRQ_INIT(uncore, GEN2_, dev_priv->irq_mask, enable_mask);
3706
3707
3708
3709 spin_lock_irq(&dev_priv->irq_lock);
3710 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_CRC_DONE_INTERRUPT_STATUS);
3711 i915_enable_pipestat(dev_priv, PIPE_B, PIPE_CRC_DONE_INTERRUPT_STATUS);
3712 spin_unlock_irq(&dev_priv->irq_lock);
3713
3714 i915_enable_asle_pipestat(dev_priv);
3715}
3716
3717static irqreturn_t i915_irq_handler(int irq, void *arg)
3718{
3719 struct drm_i915_private *dev_priv = arg;
3720 irqreturn_t ret = IRQ_NONE;
3721
3722 if (!intel_irqs_enabled(dev_priv))
3723 return IRQ_NONE;
3724
3725
3726 disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
3727
3728 do {
3729 u32 pipe_stats[I915_MAX_PIPES] = {};
3730 u32 eir = 0, eir_stuck = 0;
3731 u32 hotplug_status = 0;
3732 u32 iir;
3733
3734 iir = I915_READ(GEN2_IIR);
3735 if (iir == 0)
3736 break;
3737
3738 ret = IRQ_HANDLED;
3739
3740 if (I915_HAS_HOTPLUG(dev_priv) &&
3741 iir & I915_DISPLAY_PORT_INTERRUPT)
3742 hotplug_status = i9xx_hpd_irq_ack(dev_priv);
3743
3744
3745
3746 i9xx_pipestat_irq_ack(dev_priv, iir, pipe_stats);
3747
3748 if (iir & I915_MASTER_ERROR_INTERRUPT)
3749 i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
3750
3751 I915_WRITE(GEN2_IIR, iir);
3752
3753 if (iir & I915_USER_INTERRUPT)
3754 intel_engine_signal_breadcrumbs(dev_priv->engine[RCS0]);
3755
3756 if (iir & I915_MASTER_ERROR_INTERRUPT)
3757 i9xx_error_irq_handler(dev_priv, eir, eir_stuck);
3758
3759 if (hotplug_status)
3760 i9xx_hpd_irq_handler(dev_priv, hotplug_status);
3761
3762 i915_pipestat_irq_handler(dev_priv, iir, pipe_stats);
3763 } while (0);
3764
3765 enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
3766
3767 return ret;
3768}
3769
3770static void i965_irq_reset(struct drm_i915_private *dev_priv)
3771{
3772 struct intel_uncore *uncore = &dev_priv->uncore;
3773
3774 i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
3775 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
3776
3777 i9xx_pipestat_irq_reset(dev_priv);
3778
3779 GEN3_IRQ_RESET(uncore, GEN2_);
3780}
3781
3782static void i965_irq_postinstall(struct drm_i915_private *dev_priv)
3783{
3784 struct intel_uncore *uncore = &dev_priv->uncore;
3785 u32 enable_mask;
3786 u32 error_mask;
3787
3788
3789
3790
3791
3792 if (IS_G4X(dev_priv)) {
3793 error_mask = ~(GM45_ERROR_PAGE_TABLE |
3794 GM45_ERROR_MEM_PRIV |
3795 GM45_ERROR_CP_PRIV |
3796 I915_ERROR_MEMORY_REFRESH);
3797 } else {
3798 error_mask = ~(I915_ERROR_PAGE_TABLE |
3799 I915_ERROR_MEMORY_REFRESH);
3800 }
3801 I915_WRITE(EMR, error_mask);
3802
3803
3804 dev_priv->irq_mask =
3805 ~(I915_ASLE_INTERRUPT |
3806 I915_DISPLAY_PORT_INTERRUPT |
3807 I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
3808 I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
3809 I915_MASTER_ERROR_INTERRUPT);
3810
3811 enable_mask =
3812 I915_ASLE_INTERRUPT |
3813 I915_DISPLAY_PORT_INTERRUPT |
3814 I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
3815 I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
3816 I915_MASTER_ERROR_INTERRUPT |
3817 I915_USER_INTERRUPT;
3818
3819 if (IS_G4X(dev_priv))
3820 enable_mask |= I915_BSD_USER_INTERRUPT;
3821
3822 GEN3_IRQ_INIT(uncore, GEN2_, dev_priv->irq_mask, enable_mask);
3823
3824
3825
3826 spin_lock_irq(&dev_priv->irq_lock);
3827 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_GMBUS_INTERRUPT_STATUS);
3828 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_CRC_DONE_INTERRUPT_STATUS);
3829 i915_enable_pipestat(dev_priv, PIPE_B, PIPE_CRC_DONE_INTERRUPT_STATUS);
3830 spin_unlock_irq(&dev_priv->irq_lock);
3831
3832 i915_enable_asle_pipestat(dev_priv);
3833}
3834
3835static void i915_hpd_irq_setup(struct drm_i915_private *dev_priv)
3836{
3837 u32 hotplug_en;
3838
3839 lockdep_assert_held(&dev_priv->irq_lock);
3840
3841
3842
3843 hotplug_en = intel_hpd_enabled_irqs(dev_priv, hpd_mask_i915);
3844
3845
3846
3847
3848 if (IS_G4X(dev_priv))
3849 hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64;
3850 hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
3851
3852
3853 i915_hotplug_interrupt_update_locked(dev_priv,
3854 HOTPLUG_INT_EN_MASK |
3855 CRT_HOTPLUG_VOLTAGE_COMPARE_MASK |
3856 CRT_HOTPLUG_ACTIVATION_PERIOD_64,
3857 hotplug_en);
3858}
3859
3860static irqreturn_t i965_irq_handler(int irq, void *arg)
3861{
3862 struct drm_i915_private *dev_priv = arg;
3863 irqreturn_t ret = IRQ_NONE;
3864
3865 if (!intel_irqs_enabled(dev_priv))
3866 return IRQ_NONE;
3867
3868
3869 disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
3870
3871 do {
3872 u32 pipe_stats[I915_MAX_PIPES] = {};
3873 u32 eir = 0, eir_stuck = 0;
3874 u32 hotplug_status = 0;
3875 u32 iir;
3876
3877 iir = I915_READ(GEN2_IIR);
3878 if (iir == 0)
3879 break;
3880
3881 ret = IRQ_HANDLED;
3882
3883 if (iir & I915_DISPLAY_PORT_INTERRUPT)
3884 hotplug_status = i9xx_hpd_irq_ack(dev_priv);
3885
3886
3887
3888 i9xx_pipestat_irq_ack(dev_priv, iir, pipe_stats);
3889
3890 if (iir & I915_MASTER_ERROR_INTERRUPT)
3891 i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
3892
3893 I915_WRITE(GEN2_IIR, iir);
3894
3895 if (iir & I915_USER_INTERRUPT)
3896 intel_engine_signal_breadcrumbs(dev_priv->engine[RCS0]);
3897
3898 if (iir & I915_BSD_USER_INTERRUPT)
3899 intel_engine_signal_breadcrumbs(dev_priv->engine[VCS0]);
3900
3901 if (iir & I915_MASTER_ERROR_INTERRUPT)
3902 i9xx_error_irq_handler(dev_priv, eir, eir_stuck);
3903
3904 if (hotplug_status)
3905 i9xx_hpd_irq_handler(dev_priv, hotplug_status);
3906
3907 i965_pipestat_irq_handler(dev_priv, iir, pipe_stats);
3908 } while (0);
3909
3910 enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
3911
3912 return ret;
3913}
3914
3915
3916
3917
3918
3919
3920
3921
3922void intel_irq_init(struct drm_i915_private *dev_priv)
3923{
3924 struct drm_device *dev = &dev_priv->drm;
3925 int i;
3926
3927 intel_hpd_init_work(dev_priv);
3928
3929 INIT_WORK(&dev_priv->l3_parity.error_work, ivb_parity_work);
3930 for (i = 0; i < MAX_L3_SLICES; ++i)
3931 dev_priv->l3_parity.remap_info[i] = NULL;
3932
3933
3934 if (HAS_GT_UC(dev_priv) && INTEL_GEN(dev_priv) < 11)
3935 dev_priv->gt.pm_guc_events = GUC_INTR_GUC2HOST << 16;
3936
3937 dev->vblank_disable_immediate = true;
3938
3939
3940
3941
3942
3943
3944
3945 dev_priv->display_irqs_enabled = true;
3946 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
3947 dev_priv->display_irqs_enabled = false;
3948
3949 dev_priv->hotplug.hpd_storm_threshold = HPD_STORM_DEFAULT_THRESHOLD;
3950
3951
3952
3953
3954
3955
3956 dev_priv->hotplug.hpd_short_storm_enabled = !HAS_DP_MST(dev_priv);
3957
3958 if (HAS_GMCH(dev_priv)) {
3959 if (I915_HAS_HOTPLUG(dev_priv))
3960 dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup;
3961 } else {
3962 if (HAS_PCH_JSP(dev_priv))
3963 dev_priv->display.hpd_irq_setup = jsp_hpd_irq_setup;
3964 else if (HAS_PCH_MCC(dev_priv))
3965 dev_priv->display.hpd_irq_setup = mcc_hpd_irq_setup;
3966 else if (INTEL_GEN(dev_priv) >= 11)
3967 dev_priv->display.hpd_irq_setup = gen11_hpd_irq_setup;
3968 else if (IS_GEN9_LP(dev_priv))
3969 dev_priv->display.hpd_irq_setup = bxt_hpd_irq_setup;
3970 else if (INTEL_PCH_TYPE(dev_priv) >= PCH_SPT)
3971 dev_priv->display.hpd_irq_setup = spt_hpd_irq_setup;
3972 else
3973 dev_priv->display.hpd_irq_setup = ilk_hpd_irq_setup;
3974 }
3975}
3976
3977
3978
3979
3980
3981
3982
3983void intel_irq_fini(struct drm_i915_private *i915)
3984{
3985 int i;
3986
3987 for (i = 0; i < MAX_L3_SLICES; ++i)
3988 kfree(i915->l3_parity.remap_info[i]);
3989}
3990
3991static irq_handler_t intel_irq_handler(struct drm_i915_private *dev_priv)
3992{
3993 if (HAS_GMCH(dev_priv)) {
3994 if (IS_CHERRYVIEW(dev_priv))
3995 return cherryview_irq_handler;
3996 else if (IS_VALLEYVIEW(dev_priv))
3997 return valleyview_irq_handler;
3998 else if (IS_GEN(dev_priv, 4))
3999 return i965_irq_handler;
4000 else if (IS_GEN(dev_priv, 3))
4001 return i915_irq_handler;
4002 else
4003 return i8xx_irq_handler;
4004 } else {
4005 if (INTEL_GEN(dev_priv) >= 11)
4006 return gen11_irq_handler;
4007 else if (INTEL_GEN(dev_priv) >= 8)
4008 return gen8_irq_handler;
4009 else
4010 return ilk_irq_handler;
4011 }
4012}
4013
4014static void intel_irq_reset(struct drm_i915_private *dev_priv)
4015{
4016 if (HAS_GMCH(dev_priv)) {
4017 if (IS_CHERRYVIEW(dev_priv))
4018 cherryview_irq_reset(dev_priv);
4019 else if (IS_VALLEYVIEW(dev_priv))
4020 valleyview_irq_reset(dev_priv);
4021 else if (IS_GEN(dev_priv, 4))
4022 i965_irq_reset(dev_priv);
4023 else if (IS_GEN(dev_priv, 3))
4024 i915_irq_reset(dev_priv);
4025 else
4026 i8xx_irq_reset(dev_priv);
4027 } else {
4028 if (INTEL_GEN(dev_priv) >= 11)
4029 gen11_irq_reset(dev_priv);
4030 else if (INTEL_GEN(dev_priv) >= 8)
4031 gen8_irq_reset(dev_priv);
4032 else
4033 ilk_irq_reset(dev_priv);
4034 }
4035}
4036
4037static void intel_irq_postinstall(struct drm_i915_private *dev_priv)
4038{
4039 if (HAS_GMCH(dev_priv)) {
4040 if (IS_CHERRYVIEW(dev_priv))
4041 cherryview_irq_postinstall(dev_priv);
4042 else if (IS_VALLEYVIEW(dev_priv))
4043 valleyview_irq_postinstall(dev_priv);
4044 else if (IS_GEN(dev_priv, 4))
4045 i965_irq_postinstall(dev_priv);
4046 else if (IS_GEN(dev_priv, 3))
4047 i915_irq_postinstall(dev_priv);
4048 else
4049 i8xx_irq_postinstall(dev_priv);
4050 } else {
4051 if (INTEL_GEN(dev_priv) >= 11)
4052 gen11_irq_postinstall(dev_priv);
4053 else if (INTEL_GEN(dev_priv) >= 8)
4054 gen8_irq_postinstall(dev_priv);
4055 else
4056 ilk_irq_postinstall(dev_priv);
4057 }
4058}
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071int intel_irq_install(struct drm_i915_private *dev_priv)
4072{
4073 int irq = dev_priv->drm.pdev->irq;
4074 int ret;
4075
4076
4077
4078
4079
4080
4081 dev_priv->runtime_pm.irqs_enabled = true;
4082
4083 dev_priv->drm.irq_enabled = true;
4084
4085 intel_irq_reset(dev_priv);
4086
4087 ret = request_irq(irq, intel_irq_handler(dev_priv),
4088 IRQF_SHARED, DRIVER_NAME, dev_priv);
4089 if (ret < 0) {
4090 dev_priv->drm.irq_enabled = false;
4091 return ret;
4092 }
4093
4094 intel_irq_postinstall(dev_priv);
4095
4096 return ret;
4097}
4098
4099
4100
4101
4102
4103
4104
4105
4106void intel_irq_uninstall(struct drm_i915_private *dev_priv)
4107{
4108 int irq = dev_priv->drm.pdev->irq;
4109
4110
4111
4112
4113
4114
4115
4116 if (!dev_priv->drm.irq_enabled)
4117 return;
4118
4119 dev_priv->drm.irq_enabled = false;
4120
4121 intel_irq_reset(dev_priv);
4122
4123 free_irq(irq, dev_priv);
4124
4125 intel_hpd_cancel_work(dev_priv);
4126 dev_priv->runtime_pm.irqs_enabled = false;
4127}
4128
4129
4130
4131
4132
4133
4134
4135
4136void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv)
4137{
4138 intel_irq_reset(dev_priv);
4139 dev_priv->runtime_pm.irqs_enabled = false;
4140 intel_synchronize_irq(dev_priv);
4141}
4142
4143
4144
4145
4146
4147
4148
4149
4150void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv)
4151{
4152 dev_priv->runtime_pm.irqs_enabled = true;
4153 intel_irq_reset(dev_priv);
4154 intel_irq_postinstall(dev_priv);
4155}
4156
4157bool intel_irqs_enabled(struct drm_i915_private *dev_priv)
4158{
4159
4160
4161
4162
4163 return dev_priv->runtime_pm.irqs_enabled;
4164}
4165
4166void intel_synchronize_irq(struct drm_i915_private *i915)
4167{
4168 synchronize_irq(i915->drm.pdev->irq);
4169}
4170