Rev 6935 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6935 | Rev 6937 | ||
---|---|---|---|
Line 137... | Line 137... | ||
137 | } while (0) |
137 | } while (0) |
Line 138... | Line 138... | ||
138 | 138 | ||
139 | /* |
139 | /* |
140 | * We should clear IMR at preinstall/uninstall, and just check at postinstall. |
140 | * We should clear IMR at preinstall/uninstall, and just check at postinstall. |
141 | */ |
141 | */ |
- | 142 | static void gen5_assert_iir_is_zero(struct drm_i915_private *dev_priv, |
|
142 | static void gen5_assert_iir_is_zero(struct drm_i915_private *dev_priv, u32 reg) |
143 | i915_reg_t reg) |
143 | { |
144 | { |
Line 144... | Line 145... | ||
144 | u32 val = I915_READ(reg); |
145 | u32 val = I915_READ(reg); |
145 | 146 | ||
Line 146... | Line 147... | ||
146 | if (val == 0) |
147 | if (val == 0) |
147 | return; |
148 | return; |
148 | 149 | ||
149 | WARN(1, "Interrupt register 0x%x is not zero: 0x%08x\n", |
150 | WARN(1, "Interrupt register 0x%x is not zero: 0x%08x\n", |
150 | reg, val); |
151 | i915_mmio_reg_offset(reg), val); |
151 | I915_WRITE(reg, 0xffffffff); |
152 | I915_WRITE(reg, 0xffffffff); |
152 | POSTING_READ(reg); |
153 | POSTING_READ(reg); |
Line 212... | Line 213... | ||
212 | * ilk_update_display_irq - update DEIMR |
213 | * ilk_update_display_irq - update DEIMR |
213 | * @dev_priv: driver private |
214 | * @dev_priv: driver private |
214 | * @interrupt_mask: mask of interrupt bits to update |
215 | * @interrupt_mask: mask of interrupt bits to update |
215 | * @enabled_irq_mask: mask of interrupt bits to enable |
216 | * @enabled_irq_mask: mask of interrupt bits to enable |
216 | */ |
217 | */ |
217 | static void ilk_update_display_irq(struct drm_i915_private *dev_priv, |
218 | void ilk_update_display_irq(struct drm_i915_private *dev_priv, |
218 | uint32_t interrupt_mask, |
219 | uint32_t interrupt_mask, |
219 | uint32_t enabled_irq_mask) |
220 | uint32_t enabled_irq_mask) |
220 | { |
221 | { |
221 | uint32_t new_val; |
222 | uint32_t new_val; |
Line 236... | Line 237... | ||
236 | I915_WRITE(DEIMR, dev_priv->irq_mask); |
237 | I915_WRITE(DEIMR, dev_priv->irq_mask); |
237 | POSTING_READ(DEIMR); |
238 | POSTING_READ(DEIMR); |
238 | } |
239 | } |
239 | } |
240 | } |
Line 240... | Line -... | ||
240 | - | ||
241 | void |
- | |
242 | ironlake_enable_display_irq(struct drm_i915_private *dev_priv, u32 mask) |
- | |
243 | { |
- | |
244 | ilk_update_display_irq(dev_priv, mask, mask); |
- | |
245 | } |
- | |
246 | - | ||
247 | void |
- | |
248 | ironlake_disable_display_irq(struct drm_i915_private *dev_priv, u32 mask) |
- | |
249 | { |
- | |
250 | ilk_update_display_irq(dev_priv, mask, 0); |
- | |
251 | } |
- | |
252 | 241 | ||
253 | /** |
242 | /** |
254 | * ilk_update_gt_irq - update GTIMR |
243 | * ilk_update_gt_irq - update GTIMR |
255 | * @dev_priv: driver private |
244 | * @dev_priv: driver private |
256 | * @interrupt_mask: mask of interrupt bits to update |
245 | * @interrupt_mask: mask of interrupt bits to update |
Line 281... | Line 270... | ||
281 | void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask) |
270 | void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask) |
282 | { |
271 | { |
283 | ilk_update_gt_irq(dev_priv, mask, 0); |
272 | ilk_update_gt_irq(dev_priv, mask, 0); |
284 | } |
273 | } |
Line 285... | Line 274... | ||
285 | 274 | ||
286 | static u32 gen6_pm_iir(struct drm_i915_private *dev_priv) |
275 | static i915_reg_t gen6_pm_iir(struct drm_i915_private *dev_priv) |
287 | { |
276 | { |
288 | return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IIR(2) : GEN6_PMIIR; |
277 | return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IIR(2) : GEN6_PMIIR; |
Line 289... | Line 278... | ||
289 | } |
278 | } |
290 | 279 | ||
291 | static u32 gen6_pm_imr(struct drm_i915_private *dev_priv) |
280 | static i915_reg_t gen6_pm_imr(struct drm_i915_private *dev_priv) |
292 | { |
281 | { |
Line 293... | Line 282... | ||
293 | return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IMR(2) : GEN6_PMIMR; |
282 | return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IMR(2) : GEN6_PMIMR; |
294 | } |
283 | } |
295 | 284 | ||
296 | static u32 gen6_pm_ier(struct drm_i915_private *dev_priv) |
285 | static i915_reg_t gen6_pm_ier(struct drm_i915_private *dev_priv) |
Line 297... | Line 286... | ||
297 | { |
286 | { |
Line 348... | Line 337... | ||
348 | } |
337 | } |
Line 349... | Line 338... | ||
349 | 338 | ||
350 | void gen6_reset_rps_interrupts(struct drm_device *dev) |
339 | void gen6_reset_rps_interrupts(struct drm_device *dev) |
351 | { |
340 | { |
352 | struct drm_i915_private *dev_priv = dev->dev_private; |
341 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 353... | Line 342... | ||
353 | uint32_t reg = gen6_pm_iir(dev_priv); |
342 | i915_reg_t reg = gen6_pm_iir(dev_priv); |
354 | 343 | ||
355 | spin_lock_irq(&dev_priv->irq_lock); |
344 | spin_lock_irq(&dev_priv->irq_lock); |
356 | I915_WRITE(reg, dev_priv->pm_rps_events); |
345 | I915_WRITE(reg, dev_priv->pm_rps_events); |
Line 399... | Line 388... | ||
399 | 388 | ||
400 | spin_lock_irq(&dev_priv->irq_lock); |
389 | spin_lock_irq(&dev_priv->irq_lock); |
401 | dev_priv->rps.interrupts_enabled = false; |
390 | dev_priv->rps.interrupts_enabled = false; |
Line 402... | Line -... | ||
402 | spin_unlock_irq(&dev_priv->irq_lock); |
- | |
Line 403... | Line 391... | ||
403 | 391 | spin_unlock_irq(&dev_priv->irq_lock); |
|
Line 404... | Line 392... | ||
404 | cancel_work_sync(&dev_priv->rps.work); |
392 | |
Line 446... | Line 434... | ||
446 | POSTING_READ(GEN8_DE_PORT_IMR); |
434 | POSTING_READ(GEN8_DE_PORT_IMR); |
447 | } |
435 | } |
448 | } |
436 | } |
Line 449... | Line 437... | ||
449 | 437 | ||
- | 438 | /** |
|
- | 439 | * bdw_update_pipe_irq - update DE pipe interrupt |
|
- | 440 | * @dev_priv: driver private |
|
- | 441 | * @pipe: pipe whose interrupt to update |
|
- | 442 | * @interrupt_mask: mask of interrupt bits to update |
|
- | 443 | * @enabled_irq_mask: mask of interrupt bits to enable |
|
- | 444 | */ |
|
- | 445 | void bdw_update_pipe_irq(struct drm_i915_private *dev_priv, |
|
- | 446 | enum pipe pipe, |
|
- | 447 | uint32_t interrupt_mask, |
|
- | 448 | uint32_t enabled_irq_mask) |
|
- | 449 | { |
|
- | 450 | uint32_t new_val; |
|
- | 451 | ||
- | 452 | assert_spin_locked(&dev_priv->irq_lock); |
|
- | 453 | ||
- | 454 | WARN_ON(enabled_irq_mask & ~interrupt_mask); |
|
- | 455 | ||
- | 456 | if (WARN_ON(!intel_irqs_enabled(dev_priv))) |
|
- | 457 | return; |
|
- | 458 | ||
- | 459 | new_val = dev_priv->de_irq_mask[pipe]; |
|
- | 460 | new_val &= ~interrupt_mask; |
|
- | 461 | new_val |= (~enabled_irq_mask & interrupt_mask); |
|
- | 462 | ||
- | 463 | if (new_val != dev_priv->de_irq_mask[pipe]) { |
|
- | 464 | dev_priv->de_irq_mask[pipe] = new_val; |
|
- | 465 | I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]); |
|
- | 466 | POSTING_READ(GEN8_DE_PIPE_IMR(pipe)); |
|
- | 467 | } |
|
- | 468 | } |
|
- | 469 | ||
450 | /** |
470 | /** |
451 | * ibx_display_interrupt_update - update SDEIMR |
471 | * ibx_display_interrupt_update - update SDEIMR |
452 | * @dev_priv: driver private |
472 | * @dev_priv: driver private |
453 | * @interrupt_mask: mask of interrupt bits to update |
473 | * @interrupt_mask: mask of interrupt bits to update |
454 | * @enabled_irq_mask: mask of interrupt bits to enable |
474 | * @enabled_irq_mask: mask of interrupt bits to enable |
Line 474... | Line 494... | ||
474 | 494 | ||
475 | static void |
495 | static void |
476 | __i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, |
496 | __i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, |
477 | u32 enable_mask, u32 status_mask) |
497 | u32 enable_mask, u32 status_mask) |
478 | { |
498 | { |
479 | u32 reg = PIPESTAT(pipe); |
499 | i915_reg_t reg = PIPESTAT(pipe); |
Line 480... | Line 500... | ||
480 | u32 pipestat = I915_READ(reg) & PIPESTAT_INT_ENABLE_MASK; |
500 | u32 pipestat = I915_READ(reg) & PIPESTAT_INT_ENABLE_MASK; |
481 | 501 | ||
Line 501... | Line 521... | ||
501 | 521 | ||
502 | static void |
522 | static void |
503 | __i915_disable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, |
523 | __i915_disable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, |
504 | u32 enable_mask, u32 status_mask) |
524 | u32 enable_mask, u32 status_mask) |
505 | { |
525 | { |
506 | u32 reg = PIPESTAT(pipe); |
526 | i915_reg_t reg = PIPESTAT(pipe); |
Line 507... | Line 527... | ||
507 | u32 pipestat = I915_READ(reg) & PIPESTAT_INT_ENABLE_MASK; |
527 | u32 pipestat = I915_READ(reg) & PIPESTAT_INT_ENABLE_MASK; |
508 | 528 | ||
Line 557... | Line 577... | ||
557 | i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, |
577 | i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, |
558 | u32 status_mask) |
578 | u32 status_mask) |
559 | { |
579 | { |
560 | u32 enable_mask; |
580 | u32 enable_mask; |
Line 561... | Line 581... | ||
561 | 581 | ||
562 | if (IS_VALLEYVIEW(dev_priv->dev)) |
582 | if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) |
563 | enable_mask = vlv_get_pipestat_enable_mask(dev_priv->dev, |
583 | enable_mask = vlv_get_pipestat_enable_mask(dev_priv->dev, |
564 | status_mask); |
584 | status_mask); |
565 | else |
585 | else |
566 | enable_mask = status_mask << 16; |
586 | enable_mask = status_mask << 16; |
Line 571... | Line 591... | ||
571 | i915_disable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, |
591 | i915_disable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, |
572 | u32 status_mask) |
592 | u32 status_mask) |
573 | { |
593 | { |
574 | u32 enable_mask; |
594 | u32 enable_mask; |
Line 575... | Line 595... | ||
575 | 595 | ||
576 | if (IS_VALLEYVIEW(dev_priv->dev)) |
596 | if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) |
577 | enable_mask = vlv_get_pipestat_enable_mask(dev_priv->dev, |
597 | enable_mask = vlv_get_pipestat_enable_mask(dev_priv->dev, |
578 | status_mask); |
598 | status_mask); |
579 | else |
599 | else |
580 | enable_mask = status_mask << 16; |
600 | enable_mask = status_mask << 16; |
Line 662... | Line 682... | ||
662 | * we use as a pipe index |
682 | * we use as a pipe index |
663 | */ |
683 | */ |
664 | static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe) |
684 | static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe) |
665 | { |
685 | { |
666 | struct drm_i915_private *dev_priv = dev->dev_private; |
686 | struct drm_i915_private *dev_priv = dev->dev_private; |
667 | unsigned long high_frame; |
- | |
668 | unsigned long low_frame; |
687 | i915_reg_t high_frame, low_frame; |
669 | u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal; |
688 | u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal; |
670 | struct intel_crtc *intel_crtc = |
689 | struct intel_crtc *intel_crtc = |
671 | to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]); |
690 | to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]); |
672 | const struct drm_display_mode *mode = &intel_crtc->base.hwmode; |
691 | const struct drm_display_mode *mode = &intel_crtc->base.hwmode; |
Line 714... | Line 733... | ||
714 | struct drm_i915_private *dev_priv = dev->dev_private; |
733 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 715... | Line 734... | ||
715 | 734 | ||
716 | return I915_READ(PIPE_FRMCOUNT_G4X(pipe)); |
735 | return I915_READ(PIPE_FRMCOUNT_G4X(pipe)); |
Line 717... | Line 736... | ||
717 | } |
736 | } |
718 | - | ||
719 | /* raw reads, only for fast reads of display block, no need for forcewake etc. */ |
- | |
720 | #define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__)) |
737 | |
721 | 738 | /* I915_READ_FW, only for fast reads of display block, no need for forcewake etc. */ |
|
722 | static int __intel_get_crtc_scanline(struct intel_crtc *crtc) |
739 | static int __intel_get_crtc_scanline(struct intel_crtc *crtc) |
723 | { |
740 | { |
724 | struct drm_device *dev = crtc->base.dev; |
741 | struct drm_device *dev = crtc->base.dev; |
Line 730... | Line 747... | ||
730 | vtotal = mode->crtc_vtotal; |
747 | vtotal = mode->crtc_vtotal; |
731 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
748 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
732 | vtotal /= 2; |
749 | vtotal /= 2; |
Line 733... | Line 750... | ||
733 | 750 | ||
734 | if (IS_GEN2(dev)) |
751 | if (IS_GEN2(dev)) |
735 | position = __raw_i915_read32(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN2; |
752 | position = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN2; |
736 | else |
753 | else |
Line 737... | Line 754... | ||
737 | position = __raw_i915_read32(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3; |
754 | position = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN3; |
738 | 755 | ||
739 | /* |
756 | /* |
740 | * On HSW, the DSL reg (0x70000) appears to return 0 if we |
757 | * On HSW, the DSL reg (0x70000) appears to return 0 if we |
Line 824... | Line 841... | ||
824 | } else { |
841 | } else { |
825 | /* Have access to pixelcount since start of frame. |
842 | /* Have access to pixelcount since start of frame. |
826 | * We can split this into vertical and horizontal |
843 | * We can split this into vertical and horizontal |
827 | * scanout position. |
844 | * scanout position. |
828 | */ |
845 | */ |
829 | position = (__raw_i915_read32(dev_priv, PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT; |
846 | position = (I915_READ_FW(PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT; |
Line 830... | Line 847... | ||
830 | 847 | ||
831 | /* convert to pixel counts */ |
848 | /* convert to pixel counts */ |
832 | vbl_start *= htotal; |
849 | vbl_start *= htotal; |
833 | vbl_end *= htotal; |
850 | vbl_end *= htotal; |
Line 991... | Line 1008... | ||
991 | ei->cz_clock = vlv_punit_read(dev_priv, PUNIT_REG_CZ_TIMESTAMP); |
1008 | ei->cz_clock = vlv_punit_read(dev_priv, PUNIT_REG_CZ_TIMESTAMP); |
992 | ei->render_c0 = I915_READ(VLV_RENDER_C0_COUNT); |
1009 | ei->render_c0 = I915_READ(VLV_RENDER_C0_COUNT); |
993 | ei->media_c0 = I915_READ(VLV_MEDIA_C0_COUNT); |
1010 | ei->media_c0 = I915_READ(VLV_MEDIA_C0_COUNT); |
994 | } |
1011 | } |
Line -... | Line 1012... | ||
- | 1012 | ||
- | 1013 | static bool vlv_c0_above(struct drm_i915_private *dev_priv, |
|
- | 1014 | const struct intel_rps_ei *old, |
|
- | 1015 | const struct intel_rps_ei *now, |
|
- | 1016 | int threshold) |
|
- | 1017 | { |
|
- | 1018 | u64 time, c0; |
|
- | 1019 | unsigned int mul = 100; |
|
- | 1020 | ||
- | 1021 | if (old->cz_clock == 0) |
|
- | 1022 | return false; |
|
- | 1023 | ||
- | 1024 | if (I915_READ(VLV_COUNTER_CONTROL) & VLV_COUNT_RANGE_HIGH) |
|
- | 1025 | mul <<= 8; |
|
- | 1026 | ||
- | 1027 | time = now->cz_clock - old->cz_clock; |
|
- | 1028 | time *= threshold * dev_priv->czclk_freq; |
|
- | 1029 | ||
- | 1030 | /* Workload can be split between render + media, e.g. SwapBuffers |
|
- | 1031 | * being blitted in X after being rendered in mesa. To account for |
|
- | 1032 | * this we need to combine both engines into our activity counter. |
|
- | 1033 | */ |
|
- | 1034 | c0 = now->render_c0 - old->render_c0; |
|
- | 1035 | c0 += now->media_c0 - old->media_c0; |
|
- | 1036 | c0 *= mul * VLV_CZ_CLOCK_TO_MILLI_SEC; |
|
- | 1037 | ||
- | 1038 | return c0 >= time; |
|
- | 1039 | } |
|
995 | 1040 | ||
996 | void gen6_rps_reset_ei(struct drm_i915_private *dev_priv) |
1041 | void gen6_rps_reset_ei(struct drm_i915_private *dev_priv) |
- | 1042 | { |
|
997 | { |
1043 | vlv_c0_read(dev_priv, &dev_priv->rps.down_ei); |
998 | memset(&dev_priv->rps.ei, 0, sizeof(dev_priv->rps.ei)); |
1044 | dev_priv->rps.up_ei = dev_priv->rps.down_ei; |
Line 999... | Line 1045... | ||
999 | } |
1045 | } |
1000 | 1046 | ||
1001 | static u32 vlv_wa_c0_ei(struct drm_i915_private *dev_priv, u32 pm_iir) |
- | |
1002 | { |
1047 | static u32 vlv_wa_c0_ei(struct drm_i915_private *dev_priv, u32 pm_iir) |
1003 | const struct intel_rps_ei *prev = &dev_priv->rps.ei; |
1048 | { |
Line 1004... | Line 1049... | ||
1004 | struct intel_rps_ei now; |
1049 | struct intel_rps_ei now; |
1005 | u32 events = 0; |
1050 | u32 events = 0; |
Line 1006... | Line 1051... | ||
1006 | 1051 | ||
1007 | if ((pm_iir & GEN6_PM_RP_UP_EI_EXPIRED) == 0) |
1052 | if ((pm_iir & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED)) == 0) |
1008 | return 0; |
1053 | return 0; |
Line 1009... | Line -... | ||
1009 | - | ||
1010 | vlv_c0_read(dev_priv, &now); |
- | |
1011 | if (now.cz_clock == 0) |
- | |
1012 | return 0; |
- | |
1013 | - | ||
1014 | if (prev->cz_clock) { |
1054 | |
1015 | u64 time, c0; |
- | |
1016 | unsigned int mul; |
- | |
1017 | 1055 | vlv_c0_read(dev_priv, &now); |
|
1018 | mul = VLV_CZ_CLOCK_TO_MILLI_SEC * 100; /* scale to threshold% */ |
1056 | if (now.cz_clock == 0) |
1019 | if (I915_READ(VLV_COUNTER_CONTROL) & VLV_COUNT_RANGE_HIGH) |
- | |
1020 | mul <<= 8; |
1057 | return 0; |
1021 | - | ||
1022 | time = now.cz_clock - prev->cz_clock; |
1058 | |
1023 | time *= dev_priv->czclk_freq; |
1059 | if (pm_iir & GEN6_PM_RP_DOWN_EI_EXPIRED) { |
1024 | 1060 | if (!vlv_c0_above(dev_priv, |
|
1025 | /* Workload can be split between render + media, |
- | |
1026 | * e.g. SwapBuffers being blitted in X after being rendered in |
- | |
1027 | * mesa. To account for this we need to combine both engines |
- | |
Line 1028... | Line 1061... | ||
1028 | * into our activity counter. |
1061 | &dev_priv->rps.down_ei, &now, |
- | 1062 | dev_priv->rps.down_threshold)) |
|
1029 | */ |
1063 | events |= GEN6_PM_RP_DOWN_THRESHOLD; |
1030 | c0 = now.render_c0 - prev->render_c0; |
1064 | dev_priv->rps.down_ei = now; |
1031 | c0 += now.media_c0 - prev->media_c0; |
1065 | } |
- | 1066 | ||
1032 | c0 *= mul; |
1067 | if (pm_iir & GEN6_PM_RP_UP_EI_EXPIRED) { |
Line 1033... | Line -... | ||
1033 | - | ||
1034 | if (c0 > time * dev_priv->rps.up_threshold) |
1068 | if (vlv_c0_above(dev_priv, |
1035 | events = GEN6_PM_RP_UP_THRESHOLD; |
1069 | &dev_priv->rps.up_ei, &now, |
Line 1036... | Line 1070... | ||
1036 | else if (c0 < time * dev_priv->rps.down_threshold) |
1070 | dev_priv->rps.up_threshold)) |
1037 | events = GEN6_PM_RP_DOWN_THRESHOLD; |
1071 | events |= GEN6_PM_RP_UP_THRESHOLD; |
Line 1065... | Line 1099... | ||
1065 | /* Speed up work cancelation during disabling rps interrupts. */ |
1099 | /* Speed up work cancelation during disabling rps interrupts. */ |
1066 | if (!dev_priv->rps.interrupts_enabled) { |
1100 | if (!dev_priv->rps.interrupts_enabled) { |
1067 | spin_unlock_irq(&dev_priv->irq_lock); |
1101 | spin_unlock_irq(&dev_priv->irq_lock); |
1068 | return; |
1102 | return; |
1069 | } |
1103 | } |
- | 1104 | ||
- | 1105 | /* |
|
- | 1106 | * The RPS work is synced during runtime suspend, we don't require a |
|
- | 1107 | * wakeref. TODO: instead of disabling the asserts make sure that we |
|
- | 1108 | * always hold an RPM reference while the work is running. |
|
- | 1109 | */ |
|
- | 1110 | DISABLE_RPM_WAKEREF_ASSERTS(dev_priv); |
|
- | 1111 | ||
1070 | pm_iir = dev_priv->rps.pm_iir; |
1112 | pm_iir = dev_priv->rps.pm_iir; |
1071 | dev_priv->rps.pm_iir = 0; |
1113 | dev_priv->rps.pm_iir = 0; |
1072 | /* Make sure not to corrupt PMIMR state used by ringbuffer on GEN6 */ |
1114 | /* Make sure not to corrupt PMIMR state used by ringbuffer on GEN6 */ |
1073 | gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events); |
1115 | gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events); |
1074 | client_boost = dev_priv->rps.client_boost; |
1116 | client_boost = dev_priv->rps.client_boost; |
Line 1077... | Line 1119... | ||
1077 | 1119 | ||
1078 | /* Make sure we didn't queue anything we're not going to process. */ |
1120 | /* Make sure we didn't queue anything we're not going to process. */ |
Line 1079... | Line 1121... | ||
1079 | WARN_ON(pm_iir & ~dev_priv->pm_rps_events); |
1121 | WARN_ON(pm_iir & ~dev_priv->pm_rps_events); |
1080 | 1122 | ||
Line 1081... | Line 1123... | ||
1081 | if ((pm_iir & dev_priv->pm_rps_events) == 0 && !client_boost) |
1123 | if ((pm_iir & dev_priv->pm_rps_events) == 0 && !client_boost) |
Line 1082... | Line 1124... | ||
1082 | return; |
1124 | goto out; |
Line 1132... | Line 1174... | ||
1132 | new_delay = clamp_t(int, new_delay, min, max); |
1174 | new_delay = clamp_t(int, new_delay, min, max); |
Line 1133... | Line 1175... | ||
1133 | 1175 | ||
Line 1134... | Line 1176... | ||
1134 | intel_set_rps(dev_priv->dev, new_delay); |
1176 | intel_set_rps(dev_priv->dev, new_delay); |
- | 1177 | ||
- | 1178 | mutex_unlock(&dev_priv->rps.hw_lock); |
|
1135 | 1179 | out: |
|
Line 1136... | Line 1180... | ||
1136 | mutex_unlock(&dev_priv->rps.hw_lock); |
1180 | ENABLE_RPM_WAKEREF_ASSERTS(dev_priv); |
1137 | } |
1181 | } |
Line 1168... | Line 1212... | ||
1168 | misccpctl = I915_READ(GEN7_MISCCPCTL); |
1212 | misccpctl = I915_READ(GEN7_MISCCPCTL); |
1169 | I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE); |
1213 | I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE); |
1170 | POSTING_READ(GEN7_MISCCPCTL); |
1214 | POSTING_READ(GEN7_MISCCPCTL); |
Line 1171... | Line 1215... | ||
1171 | 1215 | ||
1172 | while ((slice = ffs(dev_priv->l3_parity.which_slice)) != 0) { |
1216 | while ((slice = ffs(dev_priv->l3_parity.which_slice)) != 0) { |
Line 1173... | Line 1217... | ||
1173 | u32 reg; |
1217 | i915_reg_t reg; |
1174 | 1218 | ||
1175 | slice--; |
1219 | slice--; |
Line 1176... | Line 1220... | ||
1176 | if (WARN_ON_ONCE(slice >= NUM_L3_SLICES(dev_priv->dev))) |
1220 | if (WARN_ON_ONCE(slice >= NUM_L3_SLICES(dev_priv->dev))) |
Line 1177... | Line 1221... | ||
1177 | break; |
1221 | break; |
Line 1178... | Line 1222... | ||
1178 | 1222 | ||
1179 | dev_priv->l3_parity.which_slice &= ~(1< |
1223 | dev_priv->l3_parity.which_slice &= ~(1< |
1180 | 1224 | ||
1181 | reg = GEN7_L3CDERRST1 + (slice * 0x200); |
1225 | reg = GEN7_L3CDERRST1(slice); |
Line 1256... | Line 1300... | ||
1256 | 1300 | ||
1257 | if (gt_iir & GT_PARITY_ERROR(dev)) |
1301 | if (gt_iir & GT_PARITY_ERROR(dev)) |
1258 | ivybridge_parity_error_irq_handler(dev, gt_iir); |
1302 | ivybridge_parity_error_irq_handler(dev, gt_iir); |
Line -... | Line 1303... | ||
- | 1303 | } |
|
- | 1304 | ||
- | 1305 | static __always_inline void |
|
- | 1306 | gen8_cs_irq_handler(struct intel_engine_cs *ring, u32 iir, int test_shift) |
|
- | 1307 | { |
|
- | 1308 | if (iir & (GT_RENDER_USER_INTERRUPT << test_shift)) |
|
- | 1309 | notify_ring(ring); |
|
- | 1310 | if (iir & (GT_CONTEXT_SWITCH_INTERRUPT << test_shift)) |
|
- | 1311 | intel_lrc_irq_handler(ring); |
|
1259 | } |
1312 | } |
1260 | 1313 | ||
1261 | static irqreturn_t gen8_gt_irq_handler(struct drm_i915_private *dev_priv, |
1314 | static irqreturn_t gen8_gt_irq_handler(struct drm_i915_private *dev_priv, |
1262 | u32 master_ctl) |
1315 | u32 master_ctl) |
Line 1263... | Line 1316... | ||
1263 | { |
1316 | { |
1264 | irqreturn_t ret = IRQ_NONE; |
1317 | irqreturn_t ret = IRQ_NONE; |
1265 | 1318 | ||
1266 | if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) { |
1319 | if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) { |
1267 | u32 tmp = I915_READ_FW(GEN8_GT_IIR(0)); |
1320 | u32 iir = I915_READ_FW(GEN8_GT_IIR(0)); |
Line 1268... | Line -... | ||
1268 | if (tmp) { |
- | |
1269 | I915_WRITE_FW(GEN8_GT_IIR(0), tmp); |
1321 | if (iir) { |
1270 | ret = IRQ_HANDLED; |
- | |
1271 | 1322 | I915_WRITE_FW(GEN8_GT_IIR(0), iir); |
|
Line 1272... | Line -... | ||
1272 | if (tmp & (GT_CONTEXT_SWITCH_INTERRUPT << GEN8_RCS_IRQ_SHIFT)) |
- | |
1273 | intel_lrc_irq_handler(&dev_priv->ring[RCS]); |
1323 | ret = IRQ_HANDLED; |
1274 | if (tmp & (GT_RENDER_USER_INTERRUPT << GEN8_RCS_IRQ_SHIFT)) |
- | |
1275 | notify_ring(&dev_priv->ring[RCS]); |
1324 | |
1276 | 1325 | gen8_cs_irq_handler(&dev_priv->ring[RCS], |
|
1277 | if (tmp & (GT_CONTEXT_SWITCH_INTERRUPT << GEN8_BCS_IRQ_SHIFT)) |
1326 | iir, GEN8_RCS_IRQ_SHIFT); |
1278 | intel_lrc_irq_handler(&dev_priv->ring[BCS]); |
1327 | |
Line 1279... | Line 1328... | ||
1279 | if (tmp & (GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT)) |
1328 | gen8_cs_irq_handler(&dev_priv->ring[BCS], |
1280 | notify_ring(&dev_priv->ring[BCS]); |
1329 | iir, GEN8_BCS_IRQ_SHIFT); |
1281 | } else |
1330 | } else |
1282 | DRM_ERROR("The master control interrupt lied (GT0)!\n"); |
1331 | DRM_ERROR("The master control interrupt lied (GT0)!\n"); |
1283 | } |
1332 | } |
Line 1284... | Line -... | ||
1284 | - | ||
1285 | if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) { |
1333 | |
1286 | u32 tmp = I915_READ_FW(GEN8_GT_IIR(1)); |
- | |
1287 | if (tmp) { |
1334 | if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) { |
Line 1288... | Line -... | ||
1288 | I915_WRITE_FW(GEN8_GT_IIR(1), tmp); |
- | |
1289 | ret = IRQ_HANDLED; |
1335 | u32 iir = I915_READ_FW(GEN8_GT_IIR(1)); |
1290 | 1336 | if (iir) { |
|
1291 | if (tmp & (GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS1_IRQ_SHIFT)) |
- | |
1292 | intel_lrc_irq_handler(&dev_priv->ring[VCS]); |
1337 | I915_WRITE_FW(GEN8_GT_IIR(1), iir); |
1293 | if (tmp & (GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT)) |
1338 | ret = IRQ_HANDLED; |
1294 | notify_ring(&dev_priv->ring[VCS]); |
1339 | |
Line 1295... | Line 1340... | ||
1295 | 1340 | gen8_cs_irq_handler(&dev_priv->ring[VCS], |
|
1296 | if (tmp & (GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS2_IRQ_SHIFT)) |
1341 | iir, GEN8_VCS1_IRQ_SHIFT); |
1297 | intel_lrc_irq_handler(&dev_priv->ring[VCS2]); |
1342 | |
1298 | if (tmp & (GT_RENDER_USER_INTERRUPT << GEN8_VCS2_IRQ_SHIFT)) |
1343 | gen8_cs_irq_handler(&dev_priv->ring[VCS2], |
1299 | notify_ring(&dev_priv->ring[VCS2]); |
1344 | iir, GEN8_VCS2_IRQ_SHIFT); |
Line 1300... | Line -... | ||
1300 | } else |
- | |
1301 | DRM_ERROR("The master control interrupt lied (GT1)!\n"); |
1345 | } else |
1302 | } |
1346 | DRM_ERROR("The master control interrupt lied (GT1)!\n"); |
1303 | - | ||
1304 | if (master_ctl & GEN8_GT_VECS_IRQ) { |
1347 | } |
1305 | u32 tmp = I915_READ_FW(GEN8_GT_IIR(3)); |
1348 | |
1306 | if (tmp) { |
1349 | if (master_ctl & GEN8_GT_VECS_IRQ) { |
Line 1307... | Line 1350... | ||
1307 | I915_WRITE_FW(GEN8_GT_IIR(3), tmp); |
1350 | u32 iir = I915_READ_FW(GEN8_GT_IIR(3)); |
1308 | ret = IRQ_HANDLED; |
1351 | if (iir) { |
1309 | 1352 | I915_WRITE_FW(GEN8_GT_IIR(3), iir); |
|
1310 | if (tmp & (GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VECS_IRQ_SHIFT)) |
1353 | ret = IRQ_HANDLED; |
1311 | intel_lrc_irq_handler(&dev_priv->ring[VECS]); |
1354 | |
1312 | if (tmp & (GT_RENDER_USER_INTERRUPT << GEN8_VECS_IRQ_SHIFT)) |
1355 | gen8_cs_irq_handler(&dev_priv->ring[VECS], |
1313 | notify_ring(&dev_priv->ring[VECS]); |
1356 | iir, GEN8_VECS_IRQ_SHIFT); |
1314 | } else |
1357 | } else |
1315 | DRM_ERROR("The master control interrupt lied (GT3)!\n"); |
1358 | DRM_ERROR("The master control interrupt lied (GT3)!\n"); |
1316 | } |
1359 | } |
Line 1317... | Line 1360... | ||
1317 | 1360 | ||
Line 1591... | Line 1634... | ||
1591 | u32 pipe_stats[I915_MAX_PIPES] = { }; |
1634 | u32 pipe_stats[I915_MAX_PIPES] = { }; |
1592 | int pipe; |
1635 | int pipe; |
Line 1593... | Line 1636... | ||
1593 | 1636 | ||
1594 | spin_lock(&dev_priv->irq_lock); |
1637 | spin_lock(&dev_priv->irq_lock); |
1595 | for_each_pipe(dev_priv, pipe) { |
1638 | for_each_pipe(dev_priv, pipe) { |
1596 | int reg; |
1639 | i915_reg_t reg; |
Line 1597... | Line 1640... | ||
1597 | u32 mask, iir_bit = 0; |
1640 | u32 mask, iir_bit = 0; |
1598 | 1641 | ||
1599 | /* |
1642 | /* |
Line 1672... | Line 1715... | ||
1672 | * Make sure hotplug status is cleared before we clear IIR, or else we |
1715 | * Make sure hotplug status is cleared before we clear IIR, or else we |
1673 | * may miss hotplug events. |
1716 | * may miss hotplug events. |
1674 | */ |
1717 | */ |
1675 | POSTING_READ(PORT_HOTPLUG_STAT); |
1718 | POSTING_READ(PORT_HOTPLUG_STAT); |
Line 1676... | Line 1719... | ||
1676 | 1719 | ||
1677 | if (IS_G4X(dev) || IS_VALLEYVIEW(dev)) { |
1720 | if (IS_G4X(dev) || IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) { |
Line 1678... | Line 1721... | ||
1678 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X; |
1721 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X; |
1679 | 1722 | ||
1680 | if (hotplug_trigger) { |
1723 | if (hotplug_trigger) { |
Line 1707... | Line 1750... | ||
1707 | irqreturn_t ret = IRQ_NONE; |
1750 | irqreturn_t ret = IRQ_NONE; |
Line 1708... | Line 1751... | ||
1708 | 1751 | ||
1709 | if (!intel_irqs_enabled(dev_priv)) |
1752 | if (!intel_irqs_enabled(dev_priv)) |
Line -... | Line 1753... | ||
- | 1753 | return IRQ_NONE; |
|
- | 1754 | ||
- | 1755 | /* IRQs are synced during runtime_suspend, we don't require a wakeref */ |
|
1710 | return IRQ_NONE; |
1756 | disable_rpm_wakeref_asserts(dev_priv); |
1711 | 1757 | ||
Line 1712... | Line 1758... | ||
1712 | while (true) { |
1758 | while (true) { |
1713 | /* Find, clear, then process each source of interrupt */ |
1759 | /* Find, clear, then process each source of interrupt */ |
Line 1741... | Line 1787... | ||
1741 | * signalled in iir */ |
1787 | * signalled in iir */ |
1742 | valleyview_pipestat_irq_handler(dev, iir); |
1788 | valleyview_pipestat_irq_handler(dev, iir); |
1743 | } |
1789 | } |
Line 1744... | Line 1790... | ||
1744 | 1790 | ||
- | 1791 | out: |
|
- | 1792 | enable_rpm_wakeref_asserts(dev_priv); |
|
1745 | out: |
1793 | |
1746 | return ret; |
1794 | return ret; |
Line 1747... | Line 1795... | ||
1747 | } |
1795 | } |
1748 | 1796 | ||
Line 1754... | Line 1802... | ||
1754 | irqreturn_t ret = IRQ_NONE; |
1802 | irqreturn_t ret = IRQ_NONE; |
Line 1755... | Line 1803... | ||
1755 | 1803 | ||
1756 | if (!intel_irqs_enabled(dev_priv)) |
1804 | if (!intel_irqs_enabled(dev_priv)) |
Line -... | Line 1805... | ||
- | 1805 | return IRQ_NONE; |
|
- | 1806 | ||
- | 1807 | /* IRQs are synced during runtime_suspend, we don't require a wakeref */ |
|
1757 | return IRQ_NONE; |
1808 | disable_rpm_wakeref_asserts(dev_priv); |
1758 | 1809 | ||
1759 | for (;;) { |
1810 | for (;;) { |
Line 1760... | Line 1811... | ||
1760 | master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL; |
1811 | master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL; |
Line 1784... | Line 1835... | ||
1784 | 1835 | ||
1785 | I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL); |
1836 | I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL); |
1786 | POSTING_READ(GEN8_MASTER_IRQ); |
1837 | POSTING_READ(GEN8_MASTER_IRQ); |
Line -... | Line 1838... | ||
- | 1838 | } |
|
- | 1839 | ||
1787 | } |
1840 | enable_rpm_wakeref_asserts(dev_priv); |
1788 | 1841 | ||
Line 1789... | Line 1842... | ||
1789 | return ret; |
1842 | return ret; |
1790 | } |
1843 | } |
1791 | 1844 | ||
1792 | static void ibx_hpd_irq_handler(struct drm_device *dev, u32 hotplug_trigger, |
1845 | static void ibx_hpd_irq_handler(struct drm_device *dev, u32 hotplug_trigger, |
1793 | const u32 hpd[HPD_NUM_PINS]) |
1846 | const u32 hpd[HPD_NUM_PINS]) |
Line -... | Line 1847... | ||
- | 1847 | { |
|
- | 1848 | struct drm_i915_private *dev_priv = to_i915(dev); |
|
- | 1849 | u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; |
|
- | 1850 | ||
- | 1851 | /* |
|
- | 1852 | * Somehow the PCH doesn't seem to really ack the interrupt to the CPU |
|
1794 | { |
1853 | * unless we touch the hotplug register, even if hotplug_trigger is |
- | 1854 | * zero. Not acking leads to "The master control interrupt lied (SDE)!" |
|
- | 1855 | * errors. |
|
- | 1856 | */ |
|
- | 1857 | dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG); |
|
- | 1858 | if (!hotplug_trigger) { |
|
- | 1859 | u32 mask = PORTA_HOTPLUG_STATUS_MASK | |
|
- | 1860 | PORTD_HOTPLUG_STATUS_MASK | |
|
- | 1861 | PORTC_HOTPLUG_STATUS_MASK | |
|
1795 | struct drm_i915_private *dev_priv = to_i915(dev); |
1862 | PORTB_HOTPLUG_STATUS_MASK; |
- | 1863 | dig_hotplug_reg &= ~mask; |
|
- | 1864 | } |
|
Line 1796... | Line 1865... | ||
1796 | u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; |
1865 | |
1797 | 1866 | I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg); |
|
1798 | dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG); |
1867 | if (!hotplug_trigger) |
Line 1809... | Line 1878... | ||
1809 | { |
1878 | { |
1810 | struct drm_i915_private *dev_priv = dev->dev_private; |
1879 | struct drm_i915_private *dev_priv = dev->dev_private; |
1811 | int pipe; |
1880 | int pipe; |
1812 | u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK; |
1881 | u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK; |
Line 1813... | Line -... | ||
1813 | - | ||
1814 | if (hotplug_trigger) |
1882 | |
Line 1815... | Line 1883... | ||
1815 | ibx_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx); |
1883 | ibx_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx); |
1816 | 1884 | ||
1817 | if (pch_iir & SDE_AUDIO_POWER_MASK) { |
1885 | if (pch_iir & SDE_AUDIO_POWER_MASK) { |
Line 1903... | Line 1971... | ||
1903 | { |
1971 | { |
1904 | struct drm_i915_private *dev_priv = dev->dev_private; |
1972 | struct drm_i915_private *dev_priv = dev->dev_private; |
1905 | int pipe; |
1973 | int pipe; |
1906 | u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT; |
1974 | u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT; |
Line 1907... | Line -... | ||
1907 | - | ||
1908 | if (hotplug_trigger) |
1975 | |
Line 1909... | Line 1976... | ||
1909 | ibx_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt); |
1976 | ibx_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt); |
1910 | 1977 | ||
1911 | if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) { |
1978 | if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) { |
Line 2100... | Line 2167... | ||
2100 | irqreturn_t ret = IRQ_NONE; |
2167 | irqreturn_t ret = IRQ_NONE; |
Line 2101... | Line 2168... | ||
2101 | 2168 | ||
2102 | if (!intel_irqs_enabled(dev_priv)) |
2169 | if (!intel_irqs_enabled(dev_priv)) |
Line -... | Line 2170... | ||
- | 2170 | return IRQ_NONE; |
|
- | 2171 | ||
- | 2172 | /* IRQs are synced during runtime_suspend, we don't require a wakeref */ |
|
2103 | return IRQ_NONE; |
2173 | disable_rpm_wakeref_asserts(dev_priv); |
2104 | 2174 | ||
2105 | /* We get interrupts on unclaimed registers, so check for this before we |
2175 | /* We get interrupts on unclaimed registers, so check for this before we |
Line 2106... | Line 2176... | ||
2106 | * do any I915_{READ,WRITE}. */ |
2176 | * do any I915_{READ,WRITE}. */ |
Line 2158... | Line 2228... | ||
2158 | if (!HAS_PCH_NOP(dev)) { |
2228 | if (!HAS_PCH_NOP(dev)) { |
2159 | I915_WRITE(SDEIER, sde_ier); |
2229 | I915_WRITE(SDEIER, sde_ier); |
2160 | POSTING_READ(SDEIER); |
2230 | POSTING_READ(SDEIER); |
2161 | } |
2231 | } |
Line -... | Line 2232... | ||
- | 2232 | ||
- | 2233 | /* IRQs are synced during runtime_suspend, we don't require a wakeref */ |
|
- | 2234 | enable_rpm_wakeref_asserts(dev_priv); |
|
2162 | 2235 | ||
2163 | return ret; |
2236 | return ret; |
Line 2164... | Line 2237... | ||
2164 | } |
2237 | } |
2165 | 2238 | ||
Line 2190... | Line 2263... | ||
2190 | u32 aux_mask = GEN8_AUX_CHANNEL_A; |
2263 | u32 aux_mask = GEN8_AUX_CHANNEL_A; |
Line 2191... | Line 2264... | ||
2191 | 2264 | ||
2192 | if (!intel_irqs_enabled(dev_priv)) |
2265 | if (!intel_irqs_enabled(dev_priv)) |
Line -... | Line 2266... | ||
- | 2266 | return IRQ_NONE; |
|
- | 2267 | ||
- | 2268 | /* IRQs are synced during runtime_suspend, we don't require a wakeref */ |
|
2193 | return IRQ_NONE; |
2269 | disable_rpm_wakeref_asserts(dev_priv); |
2194 | 2270 | ||
2195 | if (INTEL_INFO(dev_priv)->gen >= 9) |
2271 | if (INTEL_INFO(dev_priv)->gen >= 9) |
Line 2196... | Line 2272... | ||
2196 | aux_mask |= GEN9_AUX_CHANNEL_B | GEN9_AUX_CHANNEL_C | |
2272 | aux_mask |= GEN9_AUX_CHANNEL_B | GEN9_AUX_CHANNEL_C | |
2197 | GEN9_AUX_CHANNEL_D; |
2273 | GEN9_AUX_CHANNEL_D; |
2198 | 2274 | ||
2199 | master_ctl = I915_READ_FW(GEN8_MASTER_IRQ); |
2275 | master_ctl = I915_READ_FW(GEN8_MASTER_IRQ); |
Line 2200... | Line 2276... | ||
2200 | master_ctl &= ~GEN8_MASTER_IRQ_CONTROL; |
2276 | master_ctl &= ~GEN8_MASTER_IRQ_CONTROL; |
Line 2201... | Line 2277... | ||
2201 | if (!master_ctl) |
2277 | if (!master_ctl) |
Line 2332... | Line 2408... | ||
2332 | } |
2408 | } |
Line 2333... | Line 2409... | ||
2333 | 2409 | ||
2334 | I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL); |
2410 | I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL); |
Line -... | Line 2411... | ||
- | 2411 | POSTING_READ_FW(GEN8_MASTER_IRQ); |
|
- | 2412 | ||
- | 2413 | out: |
|
2335 | POSTING_READ_FW(GEN8_MASTER_IRQ); |
2414 | enable_rpm_wakeref_asserts(dev_priv); |
2336 | 2415 | ||
Line 2337... | Line 2416... | ||
2337 | return ret; |
2416 | return ret; |
2338 | } |
2417 | } |
Line 2391... | Line 2470... | ||
2391 | * the reset in-progress bit is only ever set by code outside of this |
2470 | * the reset in-progress bit is only ever set by code outside of this |
2392 | * work we don't need to worry about any other races. |
2471 | * work we don't need to worry about any other races. |
2393 | */ |
2472 | */ |
2394 | if (i915_reset_in_progress(error) && !i915_terminally_wedged(error)) { |
2473 | if (i915_reset_in_progress(error) && !i915_terminally_wedged(error)) { |
2395 | DRM_DEBUG_DRIVER("resetting chip\n"); |
2474 | DRM_DEBUG_DRIVER("resetting chip\n"); |
- | 2475 | /* |
|
- | 2476 | * In most cases it's guaranteed that we get here with an RPM |
|
- | 2477 | * reference held, for example because there is a pending GPU |
|
- | 2478 | * request that won't finish until the reset is done. This |
|
- | 2479 | * isn't the case at least when we get here by doing a |
|
- | 2480 | * simulated reset via debugs, so get an RPM reference. |
|
- | 2481 | */ |
|
2396 | intel_runtime_pm_get(dev_priv); |
2482 | intel_runtime_pm_get(dev_priv); |
Line 2397... | Line 2483... | ||
2397 | 2483 | ||
2398 | /* |
2484 | /* |
2399 | * All state reset _must_ be completed before we update the |
2485 | * All state reset _must_ be completed before we update the |
Line 2598... | Line 2684... | ||
2598 | unsigned long irqflags; |
2684 | unsigned long irqflags; |
2599 | uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) : |
2685 | uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) : |
2600 | DE_PIPE_VBLANK(pipe); |
2686 | DE_PIPE_VBLANK(pipe); |
Line 2601... | Line 2687... | ||
2601 | 2687 | ||
2602 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
2688 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
2603 | ironlake_enable_display_irq(dev_priv, bit); |
2689 | ilk_enable_display_irq(dev_priv, bit); |
Line 2604... | Line 2690... | ||
2604 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
2690 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
2605 | 2691 | ||
Line 2623... | Line 2709... | ||
2623 | { |
2709 | { |
2624 | struct drm_i915_private *dev_priv = dev->dev_private; |
2710 | struct drm_i915_private *dev_priv = dev->dev_private; |
2625 | unsigned long irqflags; |
2711 | unsigned long irqflags; |
Line 2626... | Line 2712... | ||
2626 | 2712 | ||
2627 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
2713 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
2628 | dev_priv->de_irq_mask[pipe] &= ~GEN8_PIPE_VBLANK; |
- | |
2629 | I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]); |
- | |
2630 | POSTING_READ(GEN8_DE_PIPE_IMR(pipe)); |
2714 | bdw_enable_pipe_irq(dev_priv, pipe, GEN8_PIPE_VBLANK); |
- | 2715 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
|
2631 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
2716 | |
2632 | return 0; |
2717 | return 0; |
Line 2633... | Line 2718... | ||
2633 | } |
2718 | } |
2634 | 2719 | ||
Line 2653... | Line 2738... | ||
2653 | unsigned long irqflags; |
2738 | unsigned long irqflags; |
2654 | uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) : |
2739 | uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) : |
2655 | DE_PIPE_VBLANK(pipe); |
2740 | DE_PIPE_VBLANK(pipe); |
Line 2656... | Line 2741... | ||
2656 | 2741 | ||
2657 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
2742 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
2658 | ironlake_disable_display_irq(dev_priv, bit); |
2743 | ilk_disable_display_irq(dev_priv, bit); |
2659 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
2744 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
Line 2660... | Line 2745... | ||
2660 | } |
2745 | } |
2661 | 2746 | ||
Line 2674... | Line 2759... | ||
2674 | { |
2759 | { |
2675 | struct drm_i915_private *dev_priv = dev->dev_private; |
2760 | struct drm_i915_private *dev_priv = dev->dev_private; |
2676 | unsigned long irqflags; |
2761 | unsigned long irqflags; |
Line 2677... | Line 2762... | ||
2677 | 2762 | ||
2678 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
2763 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
2679 | dev_priv->de_irq_mask[pipe] |= GEN8_PIPE_VBLANK; |
- | |
2680 | I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]); |
- | |
2681 | POSTING_READ(GEN8_DE_PIPE_IMR(pipe)); |
2764 | bdw_disable_pipe_irq(dev_priv, pipe, GEN8_PIPE_VBLANK); |
2682 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
2765 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
Line 2683... | Line 2766... | ||
2683 | } |
2766 | } |
2684 | 2767 | ||
Line 2915... | Line 2998... | ||
2915 | #define HUNG 20 |
2998 | #define HUNG 20 |
Line 2916... | Line 2999... | ||
2916 | 2999 | ||
2917 | if (!i915.enable_hangcheck) |
3000 | if (!i915.enable_hangcheck) |
Line -... | Line 3001... | ||
- | 3001 | return; |
|
- | 3002 | ||
- | 3003 | /* |
|
- | 3004 | * The hangcheck work is synced during runtime suspend, we don't |
|
- | 3005 | * require a wakeref. TODO: instead of disabling the asserts make |
|
- | 3006 | * sure that we hold a reference when this work is running. |
|
- | 3007 | */ |
|
2918 | return; |
3008 | DISABLE_RPM_WAKEREF_ASSERTS(dev_priv); |
2919 | 3009 | ||
2920 | for_each_ring(ring, dev_priv, i) { |
3010 | for_each_ring(ring, dev_priv, i) { |
2921 | u64 acthd; |
3011 | u64 acthd; |
Line 3385... | Line 3475... | ||
3385 | * |
3475 | * |
3386 | * spinlocking not required here for correctness since interrupt |
3476 | * spinlocking not required here for correctness since interrupt |
3387 | * setup is guaranteed to run in single-threaded context. But we |
3477 | * setup is guaranteed to run in single-threaded context. But we |
3388 | * need it to make the assert_spin_locked happy. */ |
3478 | * need it to make the assert_spin_locked happy. */ |
3389 | spin_lock_irq(&dev_priv->irq_lock); |
3479 | spin_lock_irq(&dev_priv->irq_lock); |
3390 | ironlake_enable_display_irq(dev_priv, DE_PCU_EVENT); |
3480 | ilk_enable_display_irq(dev_priv, DE_PCU_EVENT); |
3391 | spin_unlock_irq(&dev_priv->irq_lock); |
3481 | spin_unlock_irq(&dev_priv->irq_lock); |
3392 | } |
3482 | } |
Line 3393... | Line 3483... | ||
3393 | 3483 | ||
3394 | return 0; |
3484 | return 0; |
Line 3785... | Line 3875... | ||
3785 | u32 pipe_stats[2]; |
3875 | u32 pipe_stats[2]; |
3786 | int pipe; |
3876 | int pipe; |
3787 | u16 flip_mask = |
3877 | u16 flip_mask = |
3788 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | |
3878 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | |
3789 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT; |
3879 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT; |
- | 3880 | irqreturn_t ret; |
|
Line 3790... | Line 3881... | ||
3790 | 3881 | ||
3791 | if (!intel_irqs_enabled(dev_priv)) |
3882 | if (!intel_irqs_enabled(dev_priv)) |
Line -... | Line 3883... | ||
- | 3883 | return IRQ_NONE; |
|
- | 3884 | ||
- | 3885 | /* IRQs are synced during runtime_suspend, we don't require a wakeref */ |
|
- | 3886 | disable_rpm_wakeref_asserts(dev_priv); |
|
3792 | return IRQ_NONE; |
3887 | |
3793 | 3888 | ret = IRQ_NONE; |
|
3794 | iir = I915_READ16(IIR); |
3889 | iir = I915_READ16(IIR); |
Line 3795... | Line 3890... | ||
3795 | if (iir == 0) |
3890 | if (iir == 0) |
3796 | return IRQ_NONE; |
3891 | goto out; |
3797 | 3892 | ||
3798 | while (iir & ~flip_mask) { |
3893 | while (iir & ~flip_mask) { |
Line 3804... | Line 3899... | ||
3804 | spin_lock(&dev_priv->irq_lock); |
3899 | spin_lock(&dev_priv->irq_lock); |
3805 | if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) |
3900 | if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) |
3806 | DRM_DEBUG("Command parser error, iir 0x%08x\n", iir); |
3901 | DRM_DEBUG("Command parser error, iir 0x%08x\n", iir); |
Line 3807... | Line 3902... | ||
3807 | 3902 | ||
3808 | for_each_pipe(dev_priv, pipe) { |
3903 | for_each_pipe(dev_priv, pipe) { |
3809 | int reg = PIPESTAT(pipe); |
3904 | i915_reg_t reg = PIPESTAT(pipe); |
Line 3810... | Line 3905... | ||
3810 | pipe_stats[pipe] = I915_READ(reg); |
3905 | pipe_stats[pipe] = I915_READ(reg); |
3811 | 3906 | ||
3812 | /* |
3907 | /* |
Line 3840... | Line 3935... | ||
3840 | pipe); |
3935 | pipe); |
3841 | } |
3936 | } |
Line 3842... | Line 3937... | ||
3842 | 3937 | ||
3843 | iir = new_iir; |
3938 | iir = new_iir; |
- | 3939 | } |
|
Line -... | Line 3940... | ||
- | 3940 | ret = IRQ_HANDLED; |
|
- | 3941 | ||
- | 3942 | out: |
|
3844 | } |
3943 | enable_rpm_wakeref_asserts(dev_priv); |
3845 | 3944 | ||
Line 3846... | Line 3945... | ||
3846 | return IRQ_HANDLED; |
3945 | return ret; |
3847 | } |
3946 | } |
3848 | 3947 | ||
Line 3972... | Line 4071... | ||
3972 | int pipe, ret = IRQ_NONE; |
4071 | int pipe, ret = IRQ_NONE; |
Line 3973... | Line 4072... | ||
3973 | 4072 | ||
3974 | if (!intel_irqs_enabled(dev_priv)) |
4073 | if (!intel_irqs_enabled(dev_priv)) |
Line -... | Line 4074... | ||
- | 4074 | return IRQ_NONE; |
|
- | 4075 | ||
- | 4076 | /* IRQs are synced during runtime_suspend, we don't require a wakeref */ |
|
3975 | return IRQ_NONE; |
4077 | disable_rpm_wakeref_asserts(dev_priv); |
3976 | 4078 | ||
3977 | iir = I915_READ(IIR); |
4079 | iir = I915_READ(IIR); |
3978 | do { |
4080 | do { |
Line 3987... | Line 4089... | ||
3987 | spin_lock(&dev_priv->irq_lock); |
4089 | spin_lock(&dev_priv->irq_lock); |
3988 | if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) |
4090 | if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) |
3989 | DRM_DEBUG("Command parser error, iir 0x%08x\n", iir); |
4091 | DRM_DEBUG("Command parser error, iir 0x%08x\n", iir); |
Line 3990... | Line 4092... | ||
3990 | 4092 | ||
3991 | for_each_pipe(dev_priv, pipe) { |
4093 | for_each_pipe(dev_priv, pipe) { |
3992 | int reg = PIPESTAT(pipe); |
4094 | i915_reg_t reg = PIPESTAT(pipe); |
Line 3993... | Line 4095... | ||
3993 | pipe_stats[pipe] = I915_READ(reg); |
4095 | pipe_stats[pipe] = I915_READ(reg); |
3994 | 4096 | ||
3995 | /* Clear the PIPE*STAT regs before the IIR */ |
4097 | /* Clear the PIPE*STAT regs before the IIR */ |
Line 4054... | Line 4156... | ||
4054 | */ |
4156 | */ |
4055 | ret = IRQ_HANDLED; |
4157 | ret = IRQ_HANDLED; |
4056 | iir = new_iir; |
4158 | iir = new_iir; |
4057 | } while (iir & ~flip_mask); |
4159 | } while (iir & ~flip_mask); |
Line -... | Line 4160... | ||
- | 4160 | ||
- | 4161 | enable_rpm_wakeref_asserts(dev_priv); |
|
4058 | 4162 | ||
4059 | return ret; |
4163 | return ret; |
Line 4060... | Line 4164... | ||
4060 | } |
4164 | } |
4061 | 4165 | ||
Line 4193... | Line 4297... | ||
4193 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT; |
4297 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT; |
Line 4194... | Line 4298... | ||
4194 | 4298 | ||
4195 | if (!intel_irqs_enabled(dev_priv)) |
4299 | if (!intel_irqs_enabled(dev_priv)) |
Line -... | Line 4300... | ||
- | 4300 | return IRQ_NONE; |
|
- | 4301 | ||
- | 4302 | /* IRQs are synced during runtime_suspend, we don't require a wakeref */ |
|
4196 | return IRQ_NONE; |
4303 | disable_rpm_wakeref_asserts(dev_priv); |
Line 4197... | Line 4304... | ||
4197 | 4304 | ||
4198 | iir = I915_READ(IIR); |
4305 | iir = I915_READ(IIR); |
4199 | 4306 | ||
Line 4209... | Line 4316... | ||
4209 | spin_lock(&dev_priv->irq_lock); |
4316 | spin_lock(&dev_priv->irq_lock); |
4210 | if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) |
4317 | if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) |
4211 | DRM_DEBUG("Command parser error, iir 0x%08x\n", iir); |
4318 | DRM_DEBUG("Command parser error, iir 0x%08x\n", iir); |
Line 4212... | Line 4319... | ||
4212 | 4319 | ||
4213 | for_each_pipe(dev_priv, pipe) { |
4320 | for_each_pipe(dev_priv, pipe) { |
4214 | int reg = PIPESTAT(pipe); |
4321 | i915_reg_t reg = PIPESTAT(pipe); |
Line 4215... | Line 4322... | ||
4215 | pipe_stats[pipe] = I915_READ(reg); |
4322 | pipe_stats[pipe] = I915_READ(reg); |
4216 | 4323 | ||
4217 | /* |
4324 | /* |
Line 4278... | Line 4385... | ||
4278 | * stray interrupts. |
4385 | * stray interrupts. |
4279 | */ |
4386 | */ |
4280 | iir = new_iir; |
4387 | iir = new_iir; |
4281 | } |
4388 | } |
Line -... | Line 4389... | ||
- | 4389 | ||
- | 4390 | enable_rpm_wakeref_asserts(dev_priv); |
|
4282 | 4391 | ||
4283 | return ret; |
4392 | return ret; |
Line 4284... | Line 4393... | ||
4284 | } |
4393 | } |
4285 | 4394 | ||
Line 4321... | Line 4430... | ||
4321 | 4430 | ||
4322 | INIT_WORK(&dev_priv->rps.work, gen6_pm_rps_work); |
4431 | INIT_WORK(&dev_priv->rps.work, gen6_pm_rps_work); |
Line 4323... | Line 4432... | ||
4323 | INIT_WORK(&dev_priv->l3_parity.error_work, ivybridge_parity_work); |
4432 | INIT_WORK(&dev_priv->l3_parity.error_work, ivybridge_parity_work); |
4324 | 4433 | ||
4325 | /* Let's track the enabled rps events */ |
4434 | /* Let's track the enabled rps events */ |
4326 | if (IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) |
4435 | if (IS_VALLEYVIEW(dev_priv)) |
4327 | /* WaGsvRC0ResidencyMethod:vlv */ |
4436 | /* WaGsvRC0ResidencyMethod:vlv */ |
4328 | dev_priv->pm_rps_events = GEN6_PM_RP_UP_EI_EXPIRED; |
4437 | dev_priv->pm_rps_events = GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED; |
Line 4329... | Line 4438... | ||
4329 | else |
4438 | else |
4330 | dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS; |
4439 | dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS; |