diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 807 |
1 files changed, 367 insertions, 440 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index aab47f7bb61b..1c2aec392412 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -259,12 +259,12 @@ static void ilk_update_gt_irq(struct drm_i915_private *dev_priv, | |||
259 | dev_priv->gt_irq_mask &= ~interrupt_mask; | 259 | dev_priv->gt_irq_mask &= ~interrupt_mask; |
260 | dev_priv->gt_irq_mask |= (~enabled_irq_mask & interrupt_mask); | 260 | dev_priv->gt_irq_mask |= (~enabled_irq_mask & interrupt_mask); |
261 | I915_WRITE(GTIMR, dev_priv->gt_irq_mask); | 261 | I915_WRITE(GTIMR, dev_priv->gt_irq_mask); |
262 | POSTING_READ(GTIMR); | ||
263 | } | 262 | } |
264 | 263 | ||
265 | void gen5_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask) | 264 | void gen5_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask) |
266 | { | 265 | { |
267 | ilk_update_gt_irq(dev_priv, mask, mask); | 266 | ilk_update_gt_irq(dev_priv, mask, mask); |
267 | POSTING_READ_FW(GTIMR); | ||
268 | } | 268 | } |
269 | 269 | ||
270 | 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) |
@@ -336,9 +336,8 @@ void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask) | |||
336 | __gen6_disable_pm_irq(dev_priv, mask); | 336 | __gen6_disable_pm_irq(dev_priv, mask); |
337 | } | 337 | } |
338 | 338 | ||
339 | void gen6_reset_rps_interrupts(struct drm_device *dev) | 339 | void gen6_reset_rps_interrupts(struct drm_i915_private *dev_priv) |
340 | { | 340 | { |
341 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
342 | i915_reg_t reg = gen6_pm_iir(dev_priv); | 341 | i915_reg_t reg = gen6_pm_iir(dev_priv); |
343 | 342 | ||
344 | spin_lock_irq(&dev_priv->irq_lock); | 343 | spin_lock_irq(&dev_priv->irq_lock); |
@@ -349,14 +348,11 @@ void gen6_reset_rps_interrupts(struct drm_device *dev) | |||
349 | spin_unlock_irq(&dev_priv->irq_lock); | 348 | spin_unlock_irq(&dev_priv->irq_lock); |
350 | } | 349 | } |
351 | 350 | ||
352 | void gen6_enable_rps_interrupts(struct drm_device *dev) | 351 | void gen6_enable_rps_interrupts(struct drm_i915_private *dev_priv) |
353 | { | 352 | { |
354 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
355 | |||
356 | spin_lock_irq(&dev_priv->irq_lock); | 353 | spin_lock_irq(&dev_priv->irq_lock); |
357 | 354 | WARN_ON_ONCE(dev_priv->rps.pm_iir); | |
358 | WARN_ON(dev_priv->rps.pm_iir); | 355 | WARN_ON_ONCE(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events); |
359 | WARN_ON(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events); | ||
360 | dev_priv->rps.interrupts_enabled = true; | 356 | dev_priv->rps.interrupts_enabled = true; |
361 | I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) | | 357 | I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) | |
362 | dev_priv->pm_rps_events); | 358 | dev_priv->pm_rps_events); |
@@ -367,32 +363,13 @@ void gen6_enable_rps_interrupts(struct drm_device *dev) | |||
367 | 363 | ||
368 | u32 gen6_sanitize_rps_pm_mask(struct drm_i915_private *dev_priv, u32 mask) | 364 | u32 gen6_sanitize_rps_pm_mask(struct drm_i915_private *dev_priv, u32 mask) |
369 | { | 365 | { |
370 | /* | 366 | return (mask & ~dev_priv->rps.pm_intr_keep); |
371 | * SNB,IVB can while VLV,CHV may hard hang on looping batchbuffer | ||
372 | * if GEN6_PM_UP_EI_EXPIRED is masked. | ||
373 | * | ||
374 | * TODO: verify if this can be reproduced on VLV,CHV. | ||
375 | */ | ||
376 | if (INTEL_INFO(dev_priv)->gen <= 7 && !IS_HASWELL(dev_priv)) | ||
377 | mask &= ~GEN6_PM_RP_UP_EI_EXPIRED; | ||
378 | |||
379 | if (INTEL_INFO(dev_priv)->gen >= 8) | ||
380 | mask &= ~GEN8_PMINTR_REDIRECT_TO_NON_DISP; | ||
381 | |||
382 | return mask; | ||
383 | } | 367 | } |
384 | 368 | ||
385 | void gen6_disable_rps_interrupts(struct drm_device *dev) | 369 | void gen6_disable_rps_interrupts(struct drm_i915_private *dev_priv) |
386 | { | 370 | { |
387 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
388 | |||
389 | spin_lock_irq(&dev_priv->irq_lock); | 371 | spin_lock_irq(&dev_priv->irq_lock); |
390 | dev_priv->rps.interrupts_enabled = false; | 372 | dev_priv->rps.interrupts_enabled = false; |
391 | spin_unlock_irq(&dev_priv->irq_lock); | ||
392 | |||
393 | cancel_work_sync(&dev_priv->rps.work); | ||
394 | |||
395 | spin_lock_irq(&dev_priv->irq_lock); | ||
396 | 373 | ||
397 | I915_WRITE(GEN6_PMINTRMSK, gen6_sanitize_rps_pm_mask(dev_priv, ~0)); | 374 | I915_WRITE(GEN6_PMINTRMSK, gen6_sanitize_rps_pm_mask(dev_priv, ~0)); |
398 | 375 | ||
@@ -401,8 +378,15 @@ void gen6_disable_rps_interrupts(struct drm_device *dev) | |||
401 | ~dev_priv->pm_rps_events); | 378 | ~dev_priv->pm_rps_events); |
402 | 379 | ||
403 | spin_unlock_irq(&dev_priv->irq_lock); | 380 | spin_unlock_irq(&dev_priv->irq_lock); |
381 | synchronize_irq(dev_priv->drm.irq); | ||
404 | 382 | ||
405 | synchronize_irq(dev->irq); | 383 | /* Now that we will not be generating any more work, flush any |
384 | * outsanding tasks. As we are called on the RPS idle path, | ||
385 | * we will reset the GPU to minimum frequencies, so the current | ||
386 | * state of the worker can be discarded. | ||
387 | */ | ||
388 | cancel_work_sync(&dev_priv->rps.work); | ||
389 | gen6_reset_rps_interrupts(dev_priv); | ||
406 | } | 390 | } |
407 | 391 | ||
408 | /** | 392 | /** |
@@ -582,7 +566,7 @@ i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, | |||
582 | u32 enable_mask; | 566 | u32 enable_mask; |
583 | 567 | ||
584 | if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) | 568 | if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) |
585 | enable_mask = vlv_get_pipestat_enable_mask(dev_priv->dev, | 569 | enable_mask = vlv_get_pipestat_enable_mask(&dev_priv->drm, |
586 | status_mask); | 570 | status_mask); |
587 | else | 571 | else |
588 | enable_mask = status_mask << 16; | 572 | enable_mask = status_mask << 16; |
@@ -596,7 +580,7 @@ i915_disable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, | |||
596 | u32 enable_mask; | 580 | u32 enable_mask; |
597 | 581 | ||
598 | if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) | 582 | if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) |
599 | enable_mask = vlv_get_pipestat_enable_mask(dev_priv->dev, | 583 | enable_mask = vlv_get_pipestat_enable_mask(&dev_priv->drm, |
600 | status_mask); | 584 | status_mask); |
601 | else | 585 | else |
602 | enable_mask = status_mask << 16; | 586 | enable_mask = status_mask << 16; |
@@ -605,19 +589,17 @@ i915_disable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, | |||
605 | 589 | ||
606 | /** | 590 | /** |
607 | * i915_enable_asle_pipestat - enable ASLE pipestat for OpRegion | 591 | * i915_enable_asle_pipestat - enable ASLE pipestat for OpRegion |
608 | * @dev: drm device | 592 | * @dev_priv: i915 device private |
609 | */ | 593 | */ |
610 | static void i915_enable_asle_pipestat(struct drm_device *dev) | 594 | static void i915_enable_asle_pipestat(struct drm_i915_private *dev_priv) |
611 | { | 595 | { |
612 | struct drm_i915_private *dev_priv = dev->dev_private; | 596 | if (!dev_priv->opregion.asle || !IS_MOBILE(dev_priv)) |
613 | |||
614 | if (!dev_priv->opregion.asle || !IS_MOBILE(dev)) | ||
615 | return; | 597 | return; |
616 | 598 | ||
617 | spin_lock_irq(&dev_priv->irq_lock); | 599 | spin_lock_irq(&dev_priv->irq_lock); |
618 | 600 | ||
619 | i915_enable_pipestat(dev_priv, PIPE_B, PIPE_LEGACY_BLC_EVENT_STATUS); | 601 | i915_enable_pipestat(dev_priv, PIPE_B, PIPE_LEGACY_BLC_EVENT_STATUS); |
620 | if (INTEL_INFO(dev)->gen >= 4) | 602 | if (INTEL_GEN(dev_priv) >= 4) |
621 | i915_enable_pipestat(dev_priv, PIPE_A, | 603 | i915_enable_pipestat(dev_priv, PIPE_A, |
622 | PIPE_LEGACY_BLC_EVENT_STATUS); | 604 | PIPE_LEGACY_BLC_EVENT_STATUS); |
623 | 605 | ||
@@ -685,7 +667,7 @@ static u32 i8xx_get_vblank_counter(struct drm_device *dev, unsigned int pipe) | |||
685 | */ | 667 | */ |
686 | static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe) | 668 | static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe) |
687 | { | 669 | { |
688 | struct drm_i915_private *dev_priv = dev->dev_private; | 670 | struct drm_i915_private *dev_priv = to_i915(dev); |
689 | i915_reg_t high_frame, low_frame; | 671 | i915_reg_t high_frame, low_frame; |
690 | u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal; | 672 | u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal; |
691 | struct intel_crtc *intel_crtc = | 673 | struct intel_crtc *intel_crtc = |
@@ -732,7 +714,7 @@ static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe) | |||
732 | 714 | ||
733 | static u32 g4x_get_vblank_counter(struct drm_device *dev, unsigned int pipe) | 715 | static u32 g4x_get_vblank_counter(struct drm_device *dev, unsigned int pipe) |
734 | { | 716 | { |
735 | struct drm_i915_private *dev_priv = dev->dev_private; | 717 | struct drm_i915_private *dev_priv = to_i915(dev); |
736 | 718 | ||
737 | return I915_READ(PIPE_FRMCOUNT_G4X(pipe)); | 719 | return I915_READ(PIPE_FRMCOUNT_G4X(pipe)); |
738 | } | 720 | } |
@@ -741,7 +723,7 @@ static u32 g4x_get_vblank_counter(struct drm_device *dev, unsigned int pipe) | |||
741 | static int __intel_get_crtc_scanline(struct intel_crtc *crtc) | 723 | static int __intel_get_crtc_scanline(struct intel_crtc *crtc) |
742 | { | 724 | { |
743 | struct drm_device *dev = crtc->base.dev; | 725 | struct drm_device *dev = crtc->base.dev; |
744 | struct drm_i915_private *dev_priv = dev->dev_private; | 726 | struct drm_i915_private *dev_priv = to_i915(dev); |
745 | const struct drm_display_mode *mode = &crtc->base.hwmode; | 727 | const struct drm_display_mode *mode = &crtc->base.hwmode; |
746 | enum pipe pipe = crtc->pipe; | 728 | enum pipe pipe = crtc->pipe; |
747 | int position, vtotal; | 729 | int position, vtotal; |
@@ -750,7 +732,7 @@ static int __intel_get_crtc_scanline(struct intel_crtc *crtc) | |||
750 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | 732 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
751 | vtotal /= 2; | 733 | vtotal /= 2; |
752 | 734 | ||
753 | if (IS_GEN2(dev)) | 735 | if (IS_GEN2(dev_priv)) |
754 | position = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN2; | 736 | position = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN2; |
755 | else | 737 | else |
756 | position = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN3; | 738 | position = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN3; |
@@ -767,7 +749,7 @@ static int __intel_get_crtc_scanline(struct intel_crtc *crtc) | |||
767 | * problem. We may need to extend this to include other platforms, | 749 | * problem. We may need to extend this to include other platforms, |
768 | * but so far testing only shows the problem on HSW. | 750 | * but so far testing only shows the problem on HSW. |
769 | */ | 751 | */ |
770 | if (HAS_DDI(dev) && !position) { | 752 | if (HAS_DDI(dev_priv) && !position) { |
771 | int i, temp; | 753 | int i, temp; |
772 | 754 | ||
773 | for (i = 0; i < 100; i++) { | 755 | for (i = 0; i < 100; i++) { |
@@ -793,7 +775,7 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, | |||
793 | ktime_t *stime, ktime_t *etime, | 775 | ktime_t *stime, ktime_t *etime, |
794 | const struct drm_display_mode *mode) | 776 | const struct drm_display_mode *mode) |
795 | { | 777 | { |
796 | struct drm_i915_private *dev_priv = dev->dev_private; | 778 | struct drm_i915_private *dev_priv = to_i915(dev); |
797 | struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; | 779 | struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; |
798 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 780 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
799 | int position; | 781 | int position; |
@@ -835,7 +817,7 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, | |||
835 | if (stime) | 817 | if (stime) |
836 | *stime = ktime_get(); | 818 | *stime = ktime_get(); |
837 | 819 | ||
838 | if (IS_GEN2(dev) || IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) { | 820 | if (IS_GEN2(dev_priv) || IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5) { |
839 | /* No obvious pixelcount register. Only query vertical | 821 | /* No obvious pixelcount register. Only query vertical |
840 | * scanout position from Display scan line register. | 822 | * scanout position from Display scan line register. |
841 | */ | 823 | */ |
@@ -897,7 +879,7 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, | |||
897 | else | 879 | else |
898 | position += vtotal - vbl_end; | 880 | position += vtotal - vbl_end; |
899 | 881 | ||
900 | if (IS_GEN2(dev) || IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) { | 882 | if (IS_GEN2(dev_priv) || IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5) { |
901 | *vpos = position; | 883 | *vpos = position; |
902 | *hpos = 0; | 884 | *hpos = 0; |
903 | } else { | 885 | } else { |
@@ -914,7 +896,7 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, | |||
914 | 896 | ||
915 | int intel_get_crtc_scanline(struct intel_crtc *crtc) | 897 | int intel_get_crtc_scanline(struct intel_crtc *crtc) |
916 | { | 898 | { |
917 | struct drm_i915_private *dev_priv = crtc->base.dev->dev_private; | 899 | struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); |
918 | unsigned long irqflags; | 900 | unsigned long irqflags; |
919 | int position; | 901 | int position; |
920 | 902 | ||
@@ -955,9 +937,8 @@ static int i915_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe, | |||
955 | &crtc->hwmode); | 937 | &crtc->hwmode); |
956 | } | 938 | } |
957 | 939 | ||
958 | static void ironlake_rps_change_irq_handler(struct drm_device *dev) | 940 | static void ironlake_rps_change_irq_handler(struct drm_i915_private *dev_priv) |
959 | { | 941 | { |
960 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
961 | u32 busy_up, busy_down, max_avg, min_avg; | 942 | u32 busy_up, busy_down, max_avg, min_avg; |
962 | u8 new_delay; | 943 | u8 new_delay; |
963 | 944 | ||
@@ -986,7 +967,7 @@ static void ironlake_rps_change_irq_handler(struct drm_device *dev) | |||
986 | new_delay = dev_priv->ips.min_delay; | 967 | new_delay = dev_priv->ips.min_delay; |
987 | } | 968 | } |
988 | 969 | ||
989 | if (ironlake_set_drps(dev, new_delay)) | 970 | if (ironlake_set_drps(dev_priv, new_delay)) |
990 | dev_priv->ips.cur_delay = new_delay; | 971 | dev_priv->ips.cur_delay = new_delay; |
991 | 972 | ||
992 | spin_unlock(&mchdev_lock); | 973 | spin_unlock(&mchdev_lock); |
@@ -996,13 +977,11 @@ static void ironlake_rps_change_irq_handler(struct drm_device *dev) | |||
996 | 977 | ||
997 | static void notify_ring(struct intel_engine_cs *engine) | 978 | static void notify_ring(struct intel_engine_cs *engine) |
998 | { | 979 | { |
999 | if (!intel_engine_initialized(engine)) | 980 | smp_store_mb(engine->breadcrumbs.irq_posted, true); |
1000 | return; | 981 | if (intel_engine_wakeup(engine)) { |
1001 | 982 | trace_i915_gem_request_notify(engine); | |
1002 | trace_i915_gem_request_notify(engine); | 983 | engine->breadcrumbs.irq_wakeups++; |
1003 | engine->user_interrupts++; | 984 | } |
1004 | |||
1005 | wake_up_all(&engine->irq_queue); | ||
1006 | } | 985 | } |
1007 | 986 | ||
1008 | static void vlv_c0_read(struct drm_i915_private *dev_priv, | 987 | static void vlv_c0_read(struct drm_i915_private *dev_priv, |
@@ -1083,7 +1062,7 @@ static bool any_waiters(struct drm_i915_private *dev_priv) | |||
1083 | struct intel_engine_cs *engine; | 1062 | struct intel_engine_cs *engine; |
1084 | 1063 | ||
1085 | for_each_engine(engine, dev_priv) | 1064 | for_each_engine(engine, dev_priv) |
1086 | if (engine->irq_refcount) | 1065 | if (intel_engine_has_waiter(engine)) |
1087 | return true; | 1066 | return true; |
1088 | 1067 | ||
1089 | return false; | 1068 | return false; |
@@ -1104,13 +1083,6 @@ static void gen6_pm_rps_work(struct work_struct *work) | |||
1104 | return; | 1083 | return; |
1105 | } | 1084 | } |
1106 | 1085 | ||
1107 | /* | ||
1108 | * The RPS work is synced during runtime suspend, we don't require a | ||
1109 | * wakeref. TODO: instead of disabling the asserts make sure that we | ||
1110 | * always hold an RPM reference while the work is running. | ||
1111 | */ | ||
1112 | DISABLE_RPM_WAKEREF_ASSERTS(dev_priv); | ||
1113 | |||
1114 | pm_iir = dev_priv->rps.pm_iir; | 1086 | pm_iir = dev_priv->rps.pm_iir; |
1115 | dev_priv->rps.pm_iir = 0; | 1087 | dev_priv->rps.pm_iir = 0; |
1116 | /* Make sure not to corrupt PMIMR state used by ringbuffer on GEN6 */ | 1088 | /* Make sure not to corrupt PMIMR state used by ringbuffer on GEN6 */ |
@@ -1123,7 +1095,7 @@ static void gen6_pm_rps_work(struct work_struct *work) | |||
1123 | WARN_ON(pm_iir & ~dev_priv->pm_rps_events); | 1095 | WARN_ON(pm_iir & ~dev_priv->pm_rps_events); |
1124 | 1096 | ||
1125 | if ((pm_iir & dev_priv->pm_rps_events) == 0 && !client_boost) | 1097 | if ((pm_iir & dev_priv->pm_rps_events) == 0 && !client_boost) |
1126 | goto out; | 1098 | return; |
1127 | 1099 | ||
1128 | mutex_lock(&dev_priv->rps.hw_lock); | 1100 | mutex_lock(&dev_priv->rps.hw_lock); |
1129 | 1101 | ||
@@ -1175,11 +1147,9 @@ static void gen6_pm_rps_work(struct work_struct *work) | |||
1175 | new_delay += adj; | 1147 | new_delay += adj; |
1176 | new_delay = clamp_t(int, new_delay, min, max); | 1148 | new_delay = clamp_t(int, new_delay, min, max); |
1177 | 1149 | ||
1178 | intel_set_rps(dev_priv->dev, new_delay); | 1150 | intel_set_rps(dev_priv, new_delay); |
1179 | 1151 | ||
1180 | mutex_unlock(&dev_priv->rps.hw_lock); | 1152 | mutex_unlock(&dev_priv->rps.hw_lock); |
1181 | out: | ||
1182 | ENABLE_RPM_WAKEREF_ASSERTS(dev_priv); | ||
1183 | } | 1153 | } |
1184 | 1154 | ||
1185 | 1155 | ||
@@ -1205,7 +1175,7 @@ static void ivybridge_parity_work(struct work_struct *work) | |||
1205 | * In order to prevent a get/put style interface, acquire struct mutex | 1175 | * In order to prevent a get/put style interface, acquire struct mutex |
1206 | * any time we access those registers. | 1176 | * any time we access those registers. |
1207 | */ | 1177 | */ |
1208 | mutex_lock(&dev_priv->dev->struct_mutex); | 1178 | mutex_lock(&dev_priv->drm.struct_mutex); |
1209 | 1179 | ||
1210 | /* If we've screwed up tracking, just let the interrupt fire again */ | 1180 | /* If we've screwed up tracking, just let the interrupt fire again */ |
1211 | if (WARN_ON(!dev_priv->l3_parity.which_slice)) | 1181 | if (WARN_ON(!dev_priv->l3_parity.which_slice)) |
@@ -1241,7 +1211,7 @@ static void ivybridge_parity_work(struct work_struct *work) | |||
1241 | parity_event[4] = kasprintf(GFP_KERNEL, "SLICE=%d", slice); | 1211 | parity_event[4] = kasprintf(GFP_KERNEL, "SLICE=%d", slice); |
1242 | parity_event[5] = NULL; | 1212 | parity_event[5] = NULL; |
1243 | 1213 | ||
1244 | kobject_uevent_env(&dev_priv->dev->primary->kdev->kobj, | 1214 | kobject_uevent_env(&dev_priv->drm.primary->kdev->kobj, |
1245 | KOBJ_CHANGE, parity_event); | 1215 | KOBJ_CHANGE, parity_event); |
1246 | 1216 | ||
1247 | DRM_DEBUG("Parity error: Slice = %d, Row = %d, Bank = %d, Sub bank = %d.\n", | 1217 | DRM_DEBUG("Parity error: Slice = %d, Row = %d, Bank = %d, Sub bank = %d.\n", |
@@ -1261,7 +1231,7 @@ out: | |||
1261 | gen5_enable_gt_irq(dev_priv, GT_PARITY_ERROR(dev_priv)); | 1231 | gen5_enable_gt_irq(dev_priv, GT_PARITY_ERROR(dev_priv)); |
1262 | spin_unlock_irq(&dev_priv->irq_lock); | 1232 | spin_unlock_irq(&dev_priv->irq_lock); |
1263 | 1233 | ||
1264 | mutex_unlock(&dev_priv->dev->struct_mutex); | 1234 | mutex_unlock(&dev_priv->drm.struct_mutex); |
1265 | } | 1235 | } |
1266 | 1236 | ||
1267 | static void ivybridge_parity_error_irq_handler(struct drm_i915_private *dev_priv, | 1237 | static void ivybridge_parity_error_irq_handler(struct drm_i915_private *dev_priv, |
@@ -1287,8 +1257,7 @@ static void ivybridge_parity_error_irq_handler(struct drm_i915_private *dev_priv | |||
1287 | static void ilk_gt_irq_handler(struct drm_i915_private *dev_priv, | 1257 | static void ilk_gt_irq_handler(struct drm_i915_private *dev_priv, |
1288 | u32 gt_iir) | 1258 | u32 gt_iir) |
1289 | { | 1259 | { |
1290 | if (gt_iir & | 1260 | if (gt_iir & GT_RENDER_USER_INTERRUPT) |
1291 | (GT_RENDER_USER_INTERRUPT | GT_RENDER_PIPECTL_NOTIFY_INTERRUPT)) | ||
1292 | notify_ring(&dev_priv->engine[RCS]); | 1261 | notify_ring(&dev_priv->engine[RCS]); |
1293 | if (gt_iir & ILK_BSD_USER_INTERRUPT) | 1262 | if (gt_iir & ILK_BSD_USER_INTERRUPT) |
1294 | notify_ring(&dev_priv->engine[VCS]); | 1263 | notify_ring(&dev_priv->engine[VCS]); |
@@ -1297,9 +1266,7 @@ static void ilk_gt_irq_handler(struct drm_i915_private *dev_priv, | |||
1297 | static void snb_gt_irq_handler(struct drm_i915_private *dev_priv, | 1266 | static void snb_gt_irq_handler(struct drm_i915_private *dev_priv, |
1298 | u32 gt_iir) | 1267 | u32 gt_iir) |
1299 | { | 1268 | { |
1300 | 1269 | if (gt_iir & GT_RENDER_USER_INTERRUPT) | |
1301 | if (gt_iir & | ||
1302 | (GT_RENDER_USER_INTERRUPT | GT_RENDER_PIPECTL_NOTIFY_INTERRUPT)) | ||
1303 | notify_ring(&dev_priv->engine[RCS]); | 1270 | notify_ring(&dev_priv->engine[RCS]); |
1304 | if (gt_iir & GT_BSD_USER_INTERRUPT) | 1271 | if (gt_iir & GT_BSD_USER_INTERRUPT) |
1305 | notify_ring(&dev_priv->engine[VCS]); | 1272 | notify_ring(&dev_priv->engine[VCS]); |
@@ -1506,27 +1473,23 @@ static void intel_get_hpd_pins(u32 *pin_mask, u32 *long_mask, | |||
1506 | 1473 | ||
1507 | } | 1474 | } |
1508 | 1475 | ||
1509 | static void gmbus_irq_handler(struct drm_device *dev) | 1476 | static void gmbus_irq_handler(struct drm_i915_private *dev_priv) |
1510 | { | 1477 | { |
1511 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1512 | |||
1513 | wake_up_all(&dev_priv->gmbus_wait_queue); | 1478 | wake_up_all(&dev_priv->gmbus_wait_queue); |
1514 | } | 1479 | } |
1515 | 1480 | ||
1516 | static void dp_aux_irq_handler(struct drm_device *dev) | 1481 | static void dp_aux_irq_handler(struct drm_i915_private *dev_priv) |
1517 | { | 1482 | { |
1518 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1519 | |||
1520 | wake_up_all(&dev_priv->gmbus_wait_queue); | 1483 | wake_up_all(&dev_priv->gmbus_wait_queue); |
1521 | } | 1484 | } |
1522 | 1485 | ||
1523 | #if defined(CONFIG_DEBUG_FS) | 1486 | #if defined(CONFIG_DEBUG_FS) |
1524 | static void display_pipe_crc_irq_handler(struct drm_device *dev, enum pipe pipe, | 1487 | static void display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv, |
1488 | enum pipe pipe, | ||
1525 | uint32_t crc0, uint32_t crc1, | 1489 | uint32_t crc0, uint32_t crc1, |
1526 | uint32_t crc2, uint32_t crc3, | 1490 | uint32_t crc2, uint32_t crc3, |
1527 | uint32_t crc4) | 1491 | uint32_t crc4) |
1528 | { | 1492 | { |
1529 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1530 | struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe]; | 1493 | struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe]; |
1531 | struct intel_pipe_crc_entry *entry; | 1494 | struct intel_pipe_crc_entry *entry; |
1532 | int head, tail; | 1495 | int head, tail; |
@@ -1550,7 +1513,8 @@ static void display_pipe_crc_irq_handler(struct drm_device *dev, enum pipe pipe, | |||
1550 | 1513 | ||
1551 | entry = &pipe_crc->entries[head]; | 1514 | entry = &pipe_crc->entries[head]; |
1552 | 1515 | ||
1553 | entry->frame = dev->driver->get_vblank_counter(dev, pipe); | 1516 | entry->frame = dev_priv->drm.driver->get_vblank_counter(&dev_priv->drm, |
1517 | pipe); | ||
1554 | entry->crc[0] = crc0; | 1518 | entry->crc[0] = crc0; |
1555 | entry->crc[1] = crc1; | 1519 | entry->crc[1] = crc1; |
1556 | entry->crc[2] = crc2; | 1520 | entry->crc[2] = crc2; |
@@ -1566,27 +1530,26 @@ static void display_pipe_crc_irq_handler(struct drm_device *dev, enum pipe pipe, | |||
1566 | } | 1530 | } |
1567 | #else | 1531 | #else |
1568 | static inline void | 1532 | static inline void |
1569 | display_pipe_crc_irq_handler(struct drm_device *dev, enum pipe pipe, | 1533 | display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv, |
1534 | enum pipe pipe, | ||
1570 | uint32_t crc0, uint32_t crc1, | 1535 | uint32_t crc0, uint32_t crc1, |
1571 | uint32_t crc2, uint32_t crc3, | 1536 | uint32_t crc2, uint32_t crc3, |
1572 | uint32_t crc4) {} | 1537 | uint32_t crc4) {} |
1573 | #endif | 1538 | #endif |
1574 | 1539 | ||
1575 | 1540 | ||
1576 | static void hsw_pipe_crc_irq_handler(struct drm_device *dev, enum pipe pipe) | 1541 | static void hsw_pipe_crc_irq_handler(struct drm_i915_private *dev_priv, |
1542 | enum pipe pipe) | ||
1577 | { | 1543 | { |
1578 | struct drm_i915_private *dev_priv = dev->dev_private; | 1544 | display_pipe_crc_irq_handler(dev_priv, pipe, |
1579 | |||
1580 | display_pipe_crc_irq_handler(dev, pipe, | ||
1581 | I915_READ(PIPE_CRC_RES_1_IVB(pipe)), | 1545 | I915_READ(PIPE_CRC_RES_1_IVB(pipe)), |
1582 | 0, 0, 0, 0); | 1546 | 0, 0, 0, 0); |
1583 | } | 1547 | } |
1584 | 1548 | ||
1585 | static void ivb_pipe_crc_irq_handler(struct drm_device *dev, enum pipe pipe) | 1549 | static void ivb_pipe_crc_irq_handler(struct drm_i915_private *dev_priv, |
1550 | enum pipe pipe) | ||
1586 | { | 1551 | { |
1587 | struct drm_i915_private *dev_priv = dev->dev_private; | 1552 | display_pipe_crc_irq_handler(dev_priv, pipe, |
1588 | |||
1589 | display_pipe_crc_irq_handler(dev, pipe, | ||
1590 | I915_READ(PIPE_CRC_RES_1_IVB(pipe)), | 1553 | I915_READ(PIPE_CRC_RES_1_IVB(pipe)), |
1591 | I915_READ(PIPE_CRC_RES_2_IVB(pipe)), | 1554 | I915_READ(PIPE_CRC_RES_2_IVB(pipe)), |
1592 | I915_READ(PIPE_CRC_RES_3_IVB(pipe)), | 1555 | I915_READ(PIPE_CRC_RES_3_IVB(pipe)), |
@@ -1594,22 +1557,22 @@ static void ivb_pipe_crc_irq_handler(struct drm_device *dev, enum pipe pipe) | |||
1594 | I915_READ(PIPE_CRC_RES_5_IVB(pipe))); | 1557 | I915_READ(PIPE_CRC_RES_5_IVB(pipe))); |
1595 | } | 1558 | } |
1596 | 1559 | ||
1597 | static void i9xx_pipe_crc_irq_handler(struct drm_device *dev, enum pipe pipe) | 1560 | static void i9xx_pipe_crc_irq_handler(struct drm_i915_private *dev_priv, |
1561 | enum pipe pipe) | ||
1598 | { | 1562 | { |
1599 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1600 | uint32_t res1, res2; | 1563 | uint32_t res1, res2; |
1601 | 1564 | ||
1602 | if (INTEL_INFO(dev)->gen >= 3) | 1565 | if (INTEL_GEN(dev_priv) >= 3) |
1603 | res1 = I915_READ(PIPE_CRC_RES_RES1_I915(pipe)); | 1566 | res1 = I915_READ(PIPE_CRC_RES_RES1_I915(pipe)); |
1604 | else | 1567 | else |
1605 | res1 = 0; | 1568 | res1 = 0; |
1606 | 1569 | ||
1607 | if (INTEL_INFO(dev)->gen >= 5 || IS_G4X(dev)) | 1570 | if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) |
1608 | res2 = I915_READ(PIPE_CRC_RES_RES2_G4X(pipe)); | 1571 | res2 = I915_READ(PIPE_CRC_RES_RES2_G4X(pipe)); |
1609 | else | 1572 | else |
1610 | res2 = 0; | 1573 | res2 = 0; |
1611 | 1574 | ||
1612 | display_pipe_crc_irq_handler(dev, pipe, | 1575 | display_pipe_crc_irq_handler(dev_priv, pipe, |
1613 | I915_READ(PIPE_CRC_RES_RED(pipe)), | 1576 | I915_READ(PIPE_CRC_RES_RED(pipe)), |
1614 | I915_READ(PIPE_CRC_RES_GREEN(pipe)), | 1577 | I915_READ(PIPE_CRC_RES_GREEN(pipe)), |
1615 | I915_READ(PIPE_CRC_RES_BLUE(pipe)), | 1578 | I915_READ(PIPE_CRC_RES_BLUE(pipe)), |
@@ -1626,7 +1589,7 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir) | |||
1626 | gen6_disable_pm_irq(dev_priv, pm_iir & dev_priv->pm_rps_events); | 1589 | gen6_disable_pm_irq(dev_priv, pm_iir & dev_priv->pm_rps_events); |
1627 | if (dev_priv->rps.interrupts_enabled) { | 1590 | if (dev_priv->rps.interrupts_enabled) { |
1628 | dev_priv->rps.pm_iir |= pm_iir & dev_priv->pm_rps_events; | 1591 | dev_priv->rps.pm_iir |= pm_iir & dev_priv->pm_rps_events; |
1629 | queue_work(dev_priv->wq, &dev_priv->rps.work); | 1592 | schedule_work(&dev_priv->rps.work); |
1630 | } | 1593 | } |
1631 | spin_unlock(&dev_priv->irq_lock); | 1594 | spin_unlock(&dev_priv->irq_lock); |
1632 | } | 1595 | } |
@@ -1643,18 +1606,21 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir) | |||
1643 | } | 1606 | } |
1644 | } | 1607 | } |
1645 | 1608 | ||
1646 | static bool intel_pipe_handle_vblank(struct drm_device *dev, enum pipe pipe) | 1609 | static bool intel_pipe_handle_vblank(struct drm_i915_private *dev_priv, |
1610 | enum pipe pipe) | ||
1647 | { | 1611 | { |
1648 | if (!drm_handle_vblank(dev, pipe)) | 1612 | bool ret; |
1649 | return false; | ||
1650 | 1613 | ||
1651 | return true; | 1614 | ret = drm_handle_vblank(&dev_priv->drm, pipe); |
1615 | if (ret) | ||
1616 | intel_finish_page_flip_mmio(dev_priv, pipe); | ||
1617 | |||
1618 | return ret; | ||
1652 | } | 1619 | } |
1653 | 1620 | ||
1654 | static void valleyview_pipestat_irq_ack(struct drm_device *dev, u32 iir, | 1621 | static void valleyview_pipestat_irq_ack(struct drm_i915_private *dev_priv, |
1655 | u32 pipe_stats[I915_MAX_PIPES]) | 1622 | u32 iir, u32 pipe_stats[I915_MAX_PIPES]) |
1656 | { | 1623 | { |
1657 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1658 | int pipe; | 1624 | int pipe; |
1659 | 1625 | ||
1660 | spin_lock(&dev_priv->irq_lock); | 1626 | spin_lock(&dev_priv->irq_lock); |
@@ -1710,31 +1676,28 @@ static void valleyview_pipestat_irq_ack(struct drm_device *dev, u32 iir, | |||
1710 | spin_unlock(&dev_priv->irq_lock); | 1676 | spin_unlock(&dev_priv->irq_lock); |
1711 | } | 1677 | } |
1712 | 1678 | ||
1713 | static void valleyview_pipestat_irq_handler(struct drm_device *dev, | 1679 | static void valleyview_pipestat_irq_handler(struct drm_i915_private *dev_priv, |
1714 | u32 pipe_stats[I915_MAX_PIPES]) | 1680 | u32 pipe_stats[I915_MAX_PIPES]) |
1715 | { | 1681 | { |
1716 | struct drm_i915_private *dev_priv = to_i915(dev); | ||
1717 | enum pipe pipe; | 1682 | enum pipe pipe; |
1718 | 1683 | ||
1719 | for_each_pipe(dev_priv, pipe) { | 1684 | for_each_pipe(dev_priv, pipe) { |
1720 | if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS && | 1685 | if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS && |
1721 | intel_pipe_handle_vblank(dev, pipe)) | 1686 | intel_pipe_handle_vblank(dev_priv, pipe)) |
1722 | intel_check_page_flip(dev, pipe); | 1687 | intel_check_page_flip(dev_priv, pipe); |
1723 | 1688 | ||
1724 | if (pipe_stats[pipe] & PLANE_FLIP_DONE_INT_STATUS_VLV) { | 1689 | if (pipe_stats[pipe] & PLANE_FLIP_DONE_INT_STATUS_VLV) |
1725 | intel_prepare_page_flip(dev, pipe); | 1690 | intel_finish_page_flip_cs(dev_priv, pipe); |
1726 | intel_finish_page_flip(dev, pipe); | ||
1727 | } | ||
1728 | 1691 | ||
1729 | if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS) | 1692 | if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS) |
1730 | i9xx_pipe_crc_irq_handler(dev, pipe); | 1693 | i9xx_pipe_crc_irq_handler(dev_priv, pipe); |
1731 | 1694 | ||
1732 | if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS) | 1695 | if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS) |
1733 | intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe); | 1696 | intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe); |
1734 | } | 1697 | } |
1735 | 1698 | ||
1736 | if (pipe_stats[0] & PIPE_GMBUS_INTERRUPT_STATUS) | 1699 | if (pipe_stats[0] & PIPE_GMBUS_INTERRUPT_STATUS) |
1737 | gmbus_irq_handler(dev); | 1700 | gmbus_irq_handler(dev_priv); |
1738 | } | 1701 | } |
1739 | 1702 | ||
1740 | static u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv) | 1703 | static u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv) |
@@ -1747,12 +1710,13 @@ static u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv) | |||
1747 | return hotplug_status; | 1710 | return hotplug_status; |
1748 | } | 1711 | } |
1749 | 1712 | ||
1750 | static void i9xx_hpd_irq_handler(struct drm_device *dev, | 1713 | static void i9xx_hpd_irq_handler(struct drm_i915_private *dev_priv, |
1751 | u32 hotplug_status) | 1714 | u32 hotplug_status) |
1752 | { | 1715 | { |
1753 | u32 pin_mask = 0, long_mask = 0; | 1716 | u32 pin_mask = 0, long_mask = 0; |
1754 | 1717 | ||
1755 | if (IS_G4X(dev) || IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) { | 1718 | if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) || |
1719 | IS_CHERRYVIEW(dev_priv)) { | ||
1756 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X; | 1720 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X; |
1757 | 1721 | ||
1758 | if (hotplug_trigger) { | 1722 | if (hotplug_trigger) { |
@@ -1760,11 +1724,11 @@ static void i9xx_hpd_irq_handler(struct drm_device *dev, | |||
1760 | hotplug_trigger, hpd_status_g4x, | 1724 | hotplug_trigger, hpd_status_g4x, |
1761 | i9xx_port_hotplug_long_detect); | 1725 | i9xx_port_hotplug_long_detect); |
1762 | 1726 | ||
1763 | intel_hpd_irq_handler(dev, pin_mask, long_mask); | 1727 | intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); |
1764 | } | 1728 | } |
1765 | 1729 | ||
1766 | if (hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X) | 1730 | if (hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X) |
1767 | dp_aux_irq_handler(dev); | 1731 | dp_aux_irq_handler(dev_priv); |
1768 | } else { | 1732 | } else { |
1769 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915; | 1733 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915; |
1770 | 1734 | ||
@@ -1772,7 +1736,7 @@ static void i9xx_hpd_irq_handler(struct drm_device *dev, | |||
1772 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, | 1736 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, |
1773 | hotplug_trigger, hpd_status_i915, | 1737 | hotplug_trigger, hpd_status_i915, |
1774 | i9xx_port_hotplug_long_detect); | 1738 | i9xx_port_hotplug_long_detect); |
1775 | intel_hpd_irq_handler(dev, pin_mask, long_mask); | 1739 | intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); |
1776 | } | 1740 | } |
1777 | } | 1741 | } |
1778 | } | 1742 | } |
@@ -1780,7 +1744,7 @@ static void i9xx_hpd_irq_handler(struct drm_device *dev, | |||
1780 | static irqreturn_t valleyview_irq_handler(int irq, void *arg) | 1744 | static irqreturn_t valleyview_irq_handler(int irq, void *arg) |
1781 | { | 1745 | { |
1782 | struct drm_device *dev = arg; | 1746 | struct drm_device *dev = arg; |
1783 | struct drm_i915_private *dev_priv = dev->dev_private; | 1747 | struct drm_i915_private *dev_priv = to_i915(dev); |
1784 | irqreturn_t ret = IRQ_NONE; | 1748 | irqreturn_t ret = IRQ_NONE; |
1785 | 1749 | ||
1786 | if (!intel_irqs_enabled(dev_priv)) | 1750 | if (!intel_irqs_enabled(dev_priv)) |
@@ -1831,7 +1795,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg) | |||
1831 | 1795 | ||
1832 | /* Call regardless, as some status bits might not be | 1796 | /* Call regardless, as some status bits might not be |
1833 | * signalled in iir */ | 1797 | * signalled in iir */ |
1834 | valleyview_pipestat_irq_ack(dev, iir, pipe_stats); | 1798 | valleyview_pipestat_irq_ack(dev_priv, iir, pipe_stats); |
1835 | 1799 | ||
1836 | /* | 1800 | /* |
1837 | * VLV_IIR is single buffered, and reflects the level | 1801 | * VLV_IIR is single buffered, and reflects the level |
@@ -1850,9 +1814,9 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg) | |||
1850 | gen6_rps_irq_handler(dev_priv, pm_iir); | 1814 | gen6_rps_irq_handler(dev_priv, pm_iir); |
1851 | 1815 | ||
1852 | if (hotplug_status) | 1816 | if (hotplug_status) |
1853 | i9xx_hpd_irq_handler(dev, hotplug_status); | 1817 | i9xx_hpd_irq_handler(dev_priv, hotplug_status); |
1854 | 1818 | ||
1855 | valleyview_pipestat_irq_handler(dev, pipe_stats); | 1819 | valleyview_pipestat_irq_handler(dev_priv, pipe_stats); |
1856 | } while (0); | 1820 | } while (0); |
1857 | 1821 | ||
1858 | enable_rpm_wakeref_asserts(dev_priv); | 1822 | enable_rpm_wakeref_asserts(dev_priv); |
@@ -1863,7 +1827,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg) | |||
1863 | static irqreturn_t cherryview_irq_handler(int irq, void *arg) | 1827 | static irqreturn_t cherryview_irq_handler(int irq, void *arg) |
1864 | { | 1828 | { |
1865 | struct drm_device *dev = arg; | 1829 | struct drm_device *dev = arg; |
1866 | struct drm_i915_private *dev_priv = dev->dev_private; | 1830 | struct drm_i915_private *dev_priv = to_i915(dev); |
1867 | irqreturn_t ret = IRQ_NONE; | 1831 | irqreturn_t ret = IRQ_NONE; |
1868 | 1832 | ||
1869 | if (!intel_irqs_enabled(dev_priv)) | 1833 | if (!intel_irqs_enabled(dev_priv)) |
@@ -1911,7 +1875,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg) | |||
1911 | 1875 | ||
1912 | /* Call regardless, as some status bits might not be | 1876 | /* Call regardless, as some status bits might not be |
1913 | * signalled in iir */ | 1877 | * signalled in iir */ |
1914 | valleyview_pipestat_irq_ack(dev, iir, pipe_stats); | 1878 | valleyview_pipestat_irq_ack(dev_priv, iir, pipe_stats); |
1915 | 1879 | ||
1916 | /* | 1880 | /* |
1917 | * VLV_IIR is single buffered, and reflects the level | 1881 | * VLV_IIR is single buffered, and reflects the level |
@@ -1927,9 +1891,9 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg) | |||
1927 | gen8_gt_irq_handler(dev_priv, gt_iir); | 1891 | gen8_gt_irq_handler(dev_priv, gt_iir); |
1928 | 1892 | ||
1929 | if (hotplug_status) | 1893 | if (hotplug_status) |
1930 | i9xx_hpd_irq_handler(dev, hotplug_status); | 1894 | i9xx_hpd_irq_handler(dev_priv, hotplug_status); |
1931 | 1895 | ||
1932 | valleyview_pipestat_irq_handler(dev, pipe_stats); | 1896 | valleyview_pipestat_irq_handler(dev_priv, pipe_stats); |
1933 | } while (0); | 1897 | } while (0); |
1934 | 1898 | ||
1935 | enable_rpm_wakeref_asserts(dev_priv); | 1899 | enable_rpm_wakeref_asserts(dev_priv); |
@@ -1937,10 +1901,10 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg) | |||
1937 | return ret; | 1901 | return ret; |
1938 | } | 1902 | } |
1939 | 1903 | ||
1940 | static void ibx_hpd_irq_handler(struct drm_device *dev, u32 hotplug_trigger, | 1904 | static void ibx_hpd_irq_handler(struct drm_i915_private *dev_priv, |
1905 | u32 hotplug_trigger, | ||
1941 | const u32 hpd[HPD_NUM_PINS]) | 1906 | const u32 hpd[HPD_NUM_PINS]) |
1942 | { | 1907 | { |
1943 | struct drm_i915_private *dev_priv = to_i915(dev); | ||
1944 | u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; | 1908 | u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; |
1945 | 1909 | ||
1946 | /* | 1910 | /* |
@@ -1966,16 +1930,15 @@ static void ibx_hpd_irq_handler(struct drm_device *dev, u32 hotplug_trigger, | |||
1966 | dig_hotplug_reg, hpd, | 1930 | dig_hotplug_reg, hpd, |
1967 | pch_port_hotplug_long_detect); | 1931 | pch_port_hotplug_long_detect); |
1968 | 1932 | ||
1969 | intel_hpd_irq_handler(dev, pin_mask, long_mask); | 1933 | intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); |
1970 | } | 1934 | } |
1971 | 1935 | ||
1972 | static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir) | 1936 | static void ibx_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) |
1973 | { | 1937 | { |
1974 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1975 | int pipe; | 1938 | int pipe; |
1976 | u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK; | 1939 | u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK; |
1977 | 1940 | ||
1978 | ibx_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx); | 1941 | ibx_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_ibx); |
1979 | 1942 | ||
1980 | if (pch_iir & SDE_AUDIO_POWER_MASK) { | 1943 | if (pch_iir & SDE_AUDIO_POWER_MASK) { |
1981 | int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK) >> | 1944 | int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK) >> |
@@ -1985,10 +1948,10 @@ static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir) | |||
1985 | } | 1948 | } |
1986 | 1949 | ||
1987 | if (pch_iir & SDE_AUX_MASK) | 1950 | if (pch_iir & SDE_AUX_MASK) |
1988 | dp_aux_irq_handler(dev); | 1951 | dp_aux_irq_handler(dev_priv); |
1989 | 1952 | ||
1990 | if (pch_iir & SDE_GMBUS) | 1953 | if (pch_iir & SDE_GMBUS) |
1991 | gmbus_irq_handler(dev); | 1954 | gmbus_irq_handler(dev_priv); |
1992 | 1955 | ||
1993 | if (pch_iir & SDE_AUDIO_HDCP_MASK) | 1956 | if (pch_iir & SDE_AUDIO_HDCP_MASK) |
1994 | DRM_DEBUG_DRIVER("PCH HDCP audio interrupt\n"); | 1957 | DRM_DEBUG_DRIVER("PCH HDCP audio interrupt\n"); |
@@ -2018,9 +1981,8 @@ static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir) | |||
2018 | intel_pch_fifo_underrun_irq_handler(dev_priv, TRANSCODER_B); | 1981 | intel_pch_fifo_underrun_irq_handler(dev_priv, TRANSCODER_B); |
2019 | } | 1982 | } |
2020 | 1983 | ||
2021 | static void ivb_err_int_handler(struct drm_device *dev) | 1984 | static void ivb_err_int_handler(struct drm_i915_private *dev_priv) |
2022 | { | 1985 | { |
2023 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2024 | u32 err_int = I915_READ(GEN7_ERR_INT); | 1986 | u32 err_int = I915_READ(GEN7_ERR_INT); |
2025 | enum pipe pipe; | 1987 | enum pipe pipe; |
2026 | 1988 | ||
@@ -2032,19 +1994,18 @@ static void ivb_err_int_handler(struct drm_device *dev) | |||
2032 | intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe); | 1994 | intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe); |
2033 | 1995 | ||
2034 | if (err_int & ERR_INT_PIPE_CRC_DONE(pipe)) { | 1996 | if (err_int & ERR_INT_PIPE_CRC_DONE(pipe)) { |
2035 | if (IS_IVYBRIDGE(dev)) | 1997 | if (IS_IVYBRIDGE(dev_priv)) |
2036 | ivb_pipe_crc_irq_handler(dev, pipe); | 1998 | ivb_pipe_crc_irq_handler(dev_priv, pipe); |
2037 | else | 1999 | else |
2038 | hsw_pipe_crc_irq_handler(dev, pipe); | 2000 | hsw_pipe_crc_irq_handler(dev_priv, pipe); |
2039 | } | 2001 | } |
2040 | } | 2002 | } |
2041 | 2003 | ||
2042 | I915_WRITE(GEN7_ERR_INT, err_int); | 2004 | I915_WRITE(GEN7_ERR_INT, err_int); |
2043 | } | 2005 | } |
2044 | 2006 | ||
2045 | static void cpt_serr_int_handler(struct drm_device *dev) | 2007 | static void cpt_serr_int_handler(struct drm_i915_private *dev_priv) |
2046 | { | 2008 | { |
2047 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2048 | u32 serr_int = I915_READ(SERR_INT); | 2009 | u32 serr_int = I915_READ(SERR_INT); |
2049 | 2010 | ||
2050 | if (serr_int & SERR_INT_POISON) | 2011 | if (serr_int & SERR_INT_POISON) |
@@ -2062,13 +2023,12 @@ static void cpt_serr_int_handler(struct drm_device *dev) | |||
2062 | I915_WRITE(SERR_INT, serr_int); | 2023 | I915_WRITE(SERR_INT, serr_int); |
2063 | } | 2024 | } |
2064 | 2025 | ||
2065 | static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) | 2026 | static void cpt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) |
2066 | { | 2027 | { |
2067 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2068 | int pipe; | 2028 | int pipe; |
2069 | u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT; | 2029 | u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT; |
2070 | 2030 | ||
2071 | ibx_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt); | 2031 | ibx_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_cpt); |
2072 | 2032 | ||
2073 | if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) { | 2033 | if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) { |
2074 | int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK_CPT) >> | 2034 | int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK_CPT) >> |
@@ -2078,10 +2038,10 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) | |||
2078 | } | 2038 | } |
2079 | 2039 | ||
2080 | if (pch_iir & SDE_AUX_MASK_CPT) | 2040 | if (pch_iir & SDE_AUX_MASK_CPT) |
2081 | dp_aux_irq_handler(dev); | 2041 | dp_aux_irq_handler(dev_priv); |
2082 | 2042 | ||
2083 | if (pch_iir & SDE_GMBUS_CPT) | 2043 | if (pch_iir & SDE_GMBUS_CPT) |
2084 | gmbus_irq_handler(dev); | 2044 | gmbus_irq_handler(dev_priv); |
2085 | 2045 | ||
2086 | if (pch_iir & SDE_AUDIO_CP_REQ_CPT) | 2046 | if (pch_iir & SDE_AUDIO_CP_REQ_CPT) |
2087 | DRM_DEBUG_DRIVER("Audio CP request interrupt\n"); | 2047 | DRM_DEBUG_DRIVER("Audio CP request interrupt\n"); |
@@ -2096,12 +2056,11 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) | |||
2096 | I915_READ(FDI_RX_IIR(pipe))); | 2056 | I915_READ(FDI_RX_IIR(pipe))); |
2097 | 2057 | ||
2098 | if (pch_iir & SDE_ERROR_CPT) | 2058 | if (pch_iir & SDE_ERROR_CPT) |
2099 | cpt_serr_int_handler(dev); | 2059 | cpt_serr_int_handler(dev_priv); |
2100 | } | 2060 | } |
2101 | 2061 | ||
2102 | static void spt_irq_handler(struct drm_device *dev, u32 pch_iir) | 2062 | static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) |
2103 | { | 2063 | { |
2104 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2105 | u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_SPT & | 2064 | u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_SPT & |
2106 | ~SDE_PORTE_HOTPLUG_SPT; | 2065 | ~SDE_PORTE_HOTPLUG_SPT; |
2107 | u32 hotplug2_trigger = pch_iir & SDE_PORTE_HOTPLUG_SPT; | 2066 | u32 hotplug2_trigger = pch_iir & SDE_PORTE_HOTPLUG_SPT; |
@@ -2130,16 +2089,16 @@ static void spt_irq_handler(struct drm_device *dev, u32 pch_iir) | |||
2130 | } | 2089 | } |
2131 | 2090 | ||
2132 | if (pin_mask) | 2091 | if (pin_mask) |
2133 | intel_hpd_irq_handler(dev, pin_mask, long_mask); | 2092 | intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); |
2134 | 2093 | ||
2135 | if (pch_iir & SDE_GMBUS_CPT) | 2094 | if (pch_iir & SDE_GMBUS_CPT) |
2136 | gmbus_irq_handler(dev); | 2095 | gmbus_irq_handler(dev_priv); |
2137 | } | 2096 | } |
2138 | 2097 | ||
2139 | static void ilk_hpd_irq_handler(struct drm_device *dev, u32 hotplug_trigger, | 2098 | static void ilk_hpd_irq_handler(struct drm_i915_private *dev_priv, |
2099 | u32 hotplug_trigger, | ||
2140 | const u32 hpd[HPD_NUM_PINS]) | 2100 | const u32 hpd[HPD_NUM_PINS]) |
2141 | { | 2101 | { |
2142 | struct drm_i915_private *dev_priv = to_i915(dev); | ||
2143 | u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; | 2102 | u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; |
2144 | 2103 | ||
2145 | dig_hotplug_reg = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL); | 2104 | dig_hotplug_reg = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL); |
@@ -2149,97 +2108,93 @@ static void ilk_hpd_irq_handler(struct drm_device *dev, u32 hotplug_trigger, | |||
2149 | dig_hotplug_reg, hpd, | 2108 | dig_hotplug_reg, hpd, |
2150 | ilk_port_hotplug_long_detect); | 2109 | ilk_port_hotplug_long_detect); |
2151 | 2110 | ||
2152 | intel_hpd_irq_handler(dev, pin_mask, long_mask); | 2111 | intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); |
2153 | } | 2112 | } |
2154 | 2113 | ||
2155 | static void ilk_display_irq_handler(struct drm_device *dev, u32 de_iir) | 2114 | static void ilk_display_irq_handler(struct drm_i915_private *dev_priv, |
2115 | u32 de_iir) | ||
2156 | { | 2116 | { |
2157 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2158 | enum pipe pipe; | 2117 | enum pipe pipe; |
2159 | u32 hotplug_trigger = de_iir & DE_DP_A_HOTPLUG; | 2118 | u32 hotplug_trigger = de_iir & DE_DP_A_HOTPLUG; |
2160 | 2119 | ||
2161 | if (hotplug_trigger) | 2120 | if (hotplug_trigger) |
2162 | ilk_hpd_irq_handler(dev, hotplug_trigger, hpd_ilk); | 2121 | ilk_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_ilk); |
2163 | 2122 | ||
2164 | if (de_iir & DE_AUX_CHANNEL_A) | 2123 | if (de_iir & DE_AUX_CHANNEL_A) |
2165 | dp_aux_irq_handler(dev); | 2124 | dp_aux_irq_handler(dev_priv); |
2166 | 2125 | ||
2167 | if (de_iir & DE_GSE) | 2126 | if (de_iir & DE_GSE) |
2168 | intel_opregion_asle_intr(dev); | 2127 | intel_opregion_asle_intr(dev_priv); |
2169 | 2128 | ||
2170 | if (de_iir & DE_POISON) | 2129 | if (de_iir & DE_POISON) |
2171 | DRM_ERROR("Poison interrupt\n"); | 2130 | DRM_ERROR("Poison interrupt\n"); |
2172 | 2131 | ||
2173 | for_each_pipe(dev_priv, pipe) { | 2132 | for_each_pipe(dev_priv, pipe) { |
2174 | if (de_iir & DE_PIPE_VBLANK(pipe) && | 2133 | if (de_iir & DE_PIPE_VBLANK(pipe) && |
2175 | intel_pipe_handle_vblank(dev, pipe)) | 2134 | intel_pipe_handle_vblank(dev_priv, pipe)) |
2176 | intel_check_page_flip(dev, pipe); | 2135 | intel_check_page_flip(dev_priv, pipe); |
2177 | 2136 | ||
2178 | if (de_iir & DE_PIPE_FIFO_UNDERRUN(pipe)) | 2137 | if (de_iir & DE_PIPE_FIFO_UNDERRUN(pipe)) |
2179 | intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe); | 2138 | intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe); |
2180 | 2139 | ||
2181 | if (de_iir & DE_PIPE_CRC_DONE(pipe)) | 2140 | if (de_iir & DE_PIPE_CRC_DONE(pipe)) |
2182 | i9xx_pipe_crc_irq_handler(dev, pipe); | 2141 | i9xx_pipe_crc_irq_handler(dev_priv, pipe); |
2183 | 2142 | ||
2184 | /* plane/pipes map 1:1 on ilk+ */ | 2143 | /* plane/pipes map 1:1 on ilk+ */ |
2185 | if (de_iir & DE_PLANE_FLIP_DONE(pipe)) { | 2144 | if (de_iir & DE_PLANE_FLIP_DONE(pipe)) |
2186 | intel_prepare_page_flip(dev, pipe); | 2145 | intel_finish_page_flip_cs(dev_priv, pipe); |
2187 | intel_finish_page_flip_plane(dev, pipe); | ||
2188 | } | ||
2189 | } | 2146 | } |
2190 | 2147 | ||
2191 | /* check event from PCH */ | 2148 | /* check event from PCH */ |
2192 | if (de_iir & DE_PCH_EVENT) { | 2149 | if (de_iir & DE_PCH_EVENT) { |
2193 | u32 pch_iir = I915_READ(SDEIIR); | 2150 | u32 pch_iir = I915_READ(SDEIIR); |
2194 | 2151 | ||
2195 | if (HAS_PCH_CPT(dev)) | 2152 | if (HAS_PCH_CPT(dev_priv)) |
2196 | cpt_irq_handler(dev, pch_iir); | 2153 | cpt_irq_handler(dev_priv, pch_iir); |
2197 | else | 2154 | else |
2198 | ibx_irq_handler(dev, pch_iir); | 2155 | ibx_irq_handler(dev_priv, pch_iir); |
2199 | 2156 | ||
2200 | /* should clear PCH hotplug event before clear CPU irq */ | 2157 | /* should clear PCH hotplug event before clear CPU irq */ |
2201 | I915_WRITE(SDEIIR, pch_iir); | 2158 | I915_WRITE(SDEIIR, pch_iir); |
2202 | } | 2159 | } |
2203 | 2160 | ||
2204 | if (IS_GEN5(dev) && de_iir & DE_PCU_EVENT) | 2161 | if (IS_GEN5(dev_priv) && de_iir & DE_PCU_EVENT) |
2205 | ironlake_rps_change_irq_handler(dev); | 2162 | ironlake_rps_change_irq_handler(dev_priv); |
2206 | } | 2163 | } |
2207 | 2164 | ||
2208 | static void ivb_display_irq_handler(struct drm_device *dev, u32 de_iir) | 2165 | static void ivb_display_irq_handler(struct drm_i915_private *dev_priv, |
2166 | u32 de_iir) | ||
2209 | { | 2167 | { |
2210 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2211 | enum pipe pipe; | 2168 | enum pipe pipe; |
2212 | u32 hotplug_trigger = de_iir & DE_DP_A_HOTPLUG_IVB; | 2169 | u32 hotplug_trigger = de_iir & DE_DP_A_HOTPLUG_IVB; |
2213 | 2170 | ||
2214 | if (hotplug_trigger) | 2171 | if (hotplug_trigger) |
2215 | ilk_hpd_irq_handler(dev, hotplug_trigger, hpd_ivb); | 2172 | ilk_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_ivb); |
2216 | 2173 | ||
2217 | if (de_iir & DE_ERR_INT_IVB) | 2174 | if (de_iir & DE_ERR_INT_IVB) |
2218 | ivb_err_int_handler(dev); | 2175 | ivb_err_int_handler(dev_priv); |
2219 | 2176 | ||
2220 | if (de_iir & DE_AUX_CHANNEL_A_IVB) | 2177 | if (de_iir & DE_AUX_CHANNEL_A_IVB) |
2221 | dp_aux_irq_handler(dev); | 2178 | dp_aux_irq_handler(dev_priv); |
2222 | 2179 | ||
2223 | if (de_iir & DE_GSE_IVB) | 2180 | if (de_iir & DE_GSE_IVB) |
2224 | intel_opregion_asle_intr(dev); | 2181 | intel_opregion_asle_intr(dev_priv); |
2225 | 2182 | ||
2226 | for_each_pipe(dev_priv, pipe) { | 2183 | for_each_pipe(dev_priv, pipe) { |
2227 | if (de_iir & (DE_PIPE_VBLANK_IVB(pipe)) && | 2184 | if (de_iir & (DE_PIPE_VBLANK_IVB(pipe)) && |
2228 | intel_pipe_handle_vblank(dev, pipe)) | 2185 | intel_pipe_handle_vblank(dev_priv, pipe)) |
2229 | intel_check_page_flip(dev, pipe); | 2186 | intel_check_page_flip(dev_priv, pipe); |
2230 | 2187 | ||
2231 | /* plane/pipes map 1:1 on ilk+ */ | 2188 | /* plane/pipes map 1:1 on ilk+ */ |
2232 | if (de_iir & DE_PLANE_FLIP_DONE_IVB(pipe)) { | 2189 | if (de_iir & DE_PLANE_FLIP_DONE_IVB(pipe)) |
2233 | intel_prepare_page_flip(dev, pipe); | 2190 | intel_finish_page_flip_cs(dev_priv, pipe); |
2234 | intel_finish_page_flip_plane(dev, pipe); | ||
2235 | } | ||
2236 | } | 2191 | } |
2237 | 2192 | ||
2238 | /* check event from PCH */ | 2193 | /* check event from PCH */ |
2239 | if (!HAS_PCH_NOP(dev) && (de_iir & DE_PCH_EVENT_IVB)) { | 2194 | if (!HAS_PCH_NOP(dev_priv) && (de_iir & DE_PCH_EVENT_IVB)) { |
2240 | u32 pch_iir = I915_READ(SDEIIR); | 2195 | u32 pch_iir = I915_READ(SDEIIR); |
2241 | 2196 | ||
2242 | cpt_irq_handler(dev, pch_iir); | 2197 | cpt_irq_handler(dev_priv, pch_iir); |
2243 | 2198 | ||
2244 | /* clear PCH hotplug event before clear CPU irq */ | 2199 | /* clear PCH hotplug event before clear CPU irq */ |
2245 | I915_WRITE(SDEIIR, pch_iir); | 2200 | I915_WRITE(SDEIIR, pch_iir); |
@@ -2257,7 +2212,7 @@ static void ivb_display_irq_handler(struct drm_device *dev, u32 de_iir) | |||
2257 | static irqreturn_t ironlake_irq_handler(int irq, void *arg) | 2212 | static irqreturn_t ironlake_irq_handler(int irq, void *arg) |
2258 | { | 2213 | { |
2259 | struct drm_device *dev = arg; | 2214 | struct drm_device *dev = arg; |
2260 | struct drm_i915_private *dev_priv = dev->dev_private; | 2215 | struct drm_i915_private *dev_priv = to_i915(dev); |
2261 | u32 de_iir, gt_iir, de_ier, sde_ier = 0; | 2216 | u32 de_iir, gt_iir, de_ier, sde_ier = 0; |
2262 | irqreturn_t ret = IRQ_NONE; | 2217 | irqreturn_t ret = IRQ_NONE; |
2263 | 2218 | ||
@@ -2277,7 +2232,7 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg) | |||
2277 | * able to process them after we restore SDEIER (as soon as we restore | 2232 | * able to process them after we restore SDEIER (as soon as we restore |
2278 | * it, we'll get an interrupt if SDEIIR still has something to process | 2233 | * it, we'll get an interrupt if SDEIIR still has something to process |
2279 | * due to its back queue). */ | 2234 | * due to its back queue). */ |
2280 | if (!HAS_PCH_NOP(dev)) { | 2235 | if (!HAS_PCH_NOP(dev_priv)) { |
2281 | sde_ier = I915_READ(SDEIER); | 2236 | sde_ier = I915_READ(SDEIER); |
2282 | I915_WRITE(SDEIER, 0); | 2237 | I915_WRITE(SDEIER, 0); |
2283 | POSTING_READ(SDEIER); | 2238 | POSTING_READ(SDEIER); |
@@ -2289,7 +2244,7 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg) | |||
2289 | if (gt_iir) { | 2244 | if (gt_iir) { |
2290 | I915_WRITE(GTIIR, gt_iir); | 2245 | I915_WRITE(GTIIR, gt_iir); |
2291 | ret = IRQ_HANDLED; | 2246 | ret = IRQ_HANDLED; |
2292 | if (INTEL_INFO(dev)->gen >= 6) | 2247 | if (INTEL_GEN(dev_priv) >= 6) |
2293 | snb_gt_irq_handler(dev_priv, gt_iir); | 2248 | snb_gt_irq_handler(dev_priv, gt_iir); |
2294 | else | 2249 | else |
2295 | ilk_gt_irq_handler(dev_priv, gt_iir); | 2250 | ilk_gt_irq_handler(dev_priv, gt_iir); |
@@ -2299,13 +2254,13 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg) | |||
2299 | if (de_iir) { | 2254 | if (de_iir) { |
2300 | I915_WRITE(DEIIR, de_iir); | 2255 | I915_WRITE(DEIIR, de_iir); |
2301 | ret = IRQ_HANDLED; | 2256 | ret = IRQ_HANDLED; |
2302 | if (INTEL_INFO(dev)->gen >= 7) | 2257 | if (INTEL_GEN(dev_priv) >= 7) |
2303 | ivb_display_irq_handler(dev, de_iir); | 2258 | ivb_display_irq_handler(dev_priv, de_iir); |
2304 | else | 2259 | else |
2305 | ilk_display_irq_handler(dev, de_iir); | 2260 | ilk_display_irq_handler(dev_priv, de_iir); |
2306 | } | 2261 | } |
2307 | 2262 | ||
2308 | if (INTEL_INFO(dev)->gen >= 6) { | 2263 | if (INTEL_GEN(dev_priv) >= 6) { |
2309 | u32 pm_iir = I915_READ(GEN6_PMIIR); | 2264 | u32 pm_iir = I915_READ(GEN6_PMIIR); |
2310 | if (pm_iir) { | 2265 | if (pm_iir) { |
2311 | I915_WRITE(GEN6_PMIIR, pm_iir); | 2266 | I915_WRITE(GEN6_PMIIR, pm_iir); |
@@ -2316,7 +2271,7 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg) | |||
2316 | 2271 | ||
2317 | I915_WRITE(DEIER, de_ier); | 2272 | I915_WRITE(DEIER, de_ier); |
2318 | POSTING_READ(DEIER); | 2273 | POSTING_READ(DEIER); |
2319 | if (!HAS_PCH_NOP(dev)) { | 2274 | if (!HAS_PCH_NOP(dev_priv)) { |
2320 | I915_WRITE(SDEIER, sde_ier); | 2275 | I915_WRITE(SDEIER, sde_ier); |
2321 | POSTING_READ(SDEIER); | 2276 | POSTING_READ(SDEIER); |
2322 | } | 2277 | } |
@@ -2327,10 +2282,10 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg) | |||
2327 | return ret; | 2282 | return ret; |
2328 | } | 2283 | } |
2329 | 2284 | ||
2330 | static void bxt_hpd_irq_handler(struct drm_device *dev, u32 hotplug_trigger, | 2285 | static void bxt_hpd_irq_handler(struct drm_i915_private *dev_priv, |
2286 | u32 hotplug_trigger, | ||
2331 | const u32 hpd[HPD_NUM_PINS]) | 2287 | const u32 hpd[HPD_NUM_PINS]) |
2332 | { | 2288 | { |
2333 | struct drm_i915_private *dev_priv = to_i915(dev); | ||
2334 | u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; | 2289 | u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; |
2335 | 2290 | ||
2336 | dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG); | 2291 | dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG); |
@@ -2340,13 +2295,12 @@ static void bxt_hpd_irq_handler(struct drm_device *dev, u32 hotplug_trigger, | |||
2340 | dig_hotplug_reg, hpd, | 2295 | dig_hotplug_reg, hpd, |
2341 | bxt_port_hotplug_long_detect); | 2296 | bxt_port_hotplug_long_detect); |
2342 | 2297 | ||
2343 | intel_hpd_irq_handler(dev, pin_mask, long_mask); | 2298 | intel_hpd_irq_handler(dev_priv, pin_mask, long_mask); |
2344 | } | 2299 | } |
2345 | 2300 | ||
2346 | static irqreturn_t | 2301 | static irqreturn_t |
2347 | gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) | 2302 | gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) |
2348 | { | 2303 | { |
2349 | struct drm_device *dev = dev_priv->dev; | ||
2350 | irqreturn_t ret = IRQ_NONE; | 2304 | irqreturn_t ret = IRQ_NONE; |
2351 | u32 iir; | 2305 | u32 iir; |
2352 | enum pipe pipe; | 2306 | enum pipe pipe; |
@@ -2357,7 +2311,7 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) | |||
2357 | I915_WRITE(GEN8_DE_MISC_IIR, iir); | 2311 | I915_WRITE(GEN8_DE_MISC_IIR, iir); |
2358 | ret = IRQ_HANDLED; | 2312 | ret = IRQ_HANDLED; |
2359 | if (iir & GEN8_DE_MISC_GSE) | 2313 | if (iir & GEN8_DE_MISC_GSE) |
2360 | intel_opregion_asle_intr(dev); | 2314 | intel_opregion_asle_intr(dev_priv); |
2361 | else | 2315 | else |
2362 | DRM_ERROR("Unexpected DE Misc interrupt\n"); | 2316 | DRM_ERROR("Unexpected DE Misc interrupt\n"); |
2363 | } | 2317 | } |
@@ -2381,26 +2335,28 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) | |||
2381 | GEN9_AUX_CHANNEL_D; | 2335 | GEN9_AUX_CHANNEL_D; |
2382 | 2336 | ||
2383 | if (iir & tmp_mask) { | 2337 | if (iir & tmp_mask) { |
2384 | dp_aux_irq_handler(dev); | 2338 | dp_aux_irq_handler(dev_priv); |
2385 | found = true; | 2339 | found = true; |
2386 | } | 2340 | } |
2387 | 2341 | ||
2388 | if (IS_BROXTON(dev_priv)) { | 2342 | if (IS_BROXTON(dev_priv)) { |
2389 | tmp_mask = iir & BXT_DE_PORT_HOTPLUG_MASK; | 2343 | tmp_mask = iir & BXT_DE_PORT_HOTPLUG_MASK; |
2390 | if (tmp_mask) { | 2344 | if (tmp_mask) { |
2391 | bxt_hpd_irq_handler(dev, tmp_mask, hpd_bxt); | 2345 | bxt_hpd_irq_handler(dev_priv, tmp_mask, |
2346 | hpd_bxt); | ||
2392 | found = true; | 2347 | found = true; |
2393 | } | 2348 | } |
2394 | } else if (IS_BROADWELL(dev_priv)) { | 2349 | } else if (IS_BROADWELL(dev_priv)) { |
2395 | tmp_mask = iir & GEN8_PORT_DP_A_HOTPLUG; | 2350 | tmp_mask = iir & GEN8_PORT_DP_A_HOTPLUG; |
2396 | if (tmp_mask) { | 2351 | if (tmp_mask) { |
2397 | ilk_hpd_irq_handler(dev, tmp_mask, hpd_bdw); | 2352 | ilk_hpd_irq_handler(dev_priv, |
2353 | tmp_mask, hpd_bdw); | ||
2398 | found = true; | 2354 | found = true; |
2399 | } | 2355 | } |
2400 | } | 2356 | } |
2401 | 2357 | ||
2402 | if (IS_BROXTON(dev) && (iir & BXT_DE_PORT_GMBUS)) { | 2358 | if (IS_BROXTON(dev_priv) && (iir & BXT_DE_PORT_GMBUS)) { |
2403 | gmbus_irq_handler(dev); | 2359 | gmbus_irq_handler(dev_priv); |
2404 | found = true; | 2360 | found = true; |
2405 | } | 2361 | } |
2406 | 2362 | ||
@@ -2427,8 +2383,8 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) | |||
2427 | I915_WRITE(GEN8_DE_PIPE_IIR(pipe), iir); | 2383 | I915_WRITE(GEN8_DE_PIPE_IIR(pipe), iir); |
2428 | 2384 | ||
2429 | if (iir & GEN8_PIPE_VBLANK && | 2385 | if (iir & GEN8_PIPE_VBLANK && |
2430 | intel_pipe_handle_vblank(dev, pipe)) | 2386 | intel_pipe_handle_vblank(dev_priv, pipe)) |
2431 | intel_check_page_flip(dev, pipe); | 2387 | intel_check_page_flip(dev_priv, pipe); |
2432 | 2388 | ||
2433 | flip_done = iir; | 2389 | flip_done = iir; |
2434 | if (INTEL_INFO(dev_priv)->gen >= 9) | 2390 | if (INTEL_INFO(dev_priv)->gen >= 9) |
@@ -2436,13 +2392,11 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) | |||
2436 | else | 2392 | else |
2437 | flip_done &= GEN8_PIPE_PRIMARY_FLIP_DONE; | 2393 | flip_done &= GEN8_PIPE_PRIMARY_FLIP_DONE; |
2438 | 2394 | ||
2439 | if (flip_done) { | 2395 | if (flip_done) |
2440 | intel_prepare_page_flip(dev, pipe); | 2396 | intel_finish_page_flip_cs(dev_priv, pipe); |
2441 | intel_finish_page_flip_plane(dev, pipe); | ||
2442 | } | ||
2443 | 2397 | ||
2444 | if (iir & GEN8_PIPE_CDCLK_CRC_DONE) | 2398 | if (iir & GEN8_PIPE_CDCLK_CRC_DONE) |
2445 | hsw_pipe_crc_irq_handler(dev, pipe); | 2399 | hsw_pipe_crc_irq_handler(dev_priv, pipe); |
2446 | 2400 | ||
2447 | if (iir & GEN8_PIPE_FIFO_UNDERRUN) | 2401 | if (iir & GEN8_PIPE_FIFO_UNDERRUN) |
2448 | intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe); | 2402 | intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe); |
@@ -2459,7 +2413,7 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) | |||
2459 | fault_errors); | 2413 | fault_errors); |
2460 | } | 2414 | } |
2461 | 2415 | ||
2462 | if (HAS_PCH_SPLIT(dev) && !HAS_PCH_NOP(dev) && | 2416 | if (HAS_PCH_SPLIT(dev_priv) && !HAS_PCH_NOP(dev_priv) && |
2463 | master_ctl & GEN8_DE_PCH_IRQ) { | 2417 | master_ctl & GEN8_DE_PCH_IRQ) { |
2464 | /* | 2418 | /* |
2465 | * FIXME(BDW): Assume for now that the new interrupt handling | 2419 | * FIXME(BDW): Assume for now that the new interrupt handling |
@@ -2472,9 +2426,9 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) | |||
2472 | ret = IRQ_HANDLED; | 2426 | ret = IRQ_HANDLED; |
2473 | 2427 | ||
2474 | if (HAS_PCH_SPT(dev_priv) || HAS_PCH_KBP(dev_priv)) | 2428 | if (HAS_PCH_SPT(dev_priv) || HAS_PCH_KBP(dev_priv)) |
2475 | spt_irq_handler(dev, iir); | 2429 | spt_irq_handler(dev_priv, iir); |
2476 | else | 2430 | else |
2477 | cpt_irq_handler(dev, iir); | 2431 | cpt_irq_handler(dev_priv, iir); |
2478 | } else { | 2432 | } else { |
2479 | /* | 2433 | /* |
2480 | * Like on previous PCH there seems to be something | 2434 | * Like on previous PCH there seems to be something |
@@ -2490,7 +2444,7 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl) | |||
2490 | static irqreturn_t gen8_irq_handler(int irq, void *arg) | 2444 | static irqreturn_t gen8_irq_handler(int irq, void *arg) |
2491 | { | 2445 | { |
2492 | struct drm_device *dev = arg; | 2446 | struct drm_device *dev = arg; |
2493 | struct drm_i915_private *dev_priv = dev->dev_private; | 2447 | struct drm_i915_private *dev_priv = to_i915(dev); |
2494 | u32 master_ctl; | 2448 | u32 master_ctl; |
2495 | u32 gt_iir[4] = {}; | 2449 | u32 gt_iir[4] = {}; |
2496 | irqreturn_t ret; | 2450 | irqreturn_t ret; |
@@ -2521,11 +2475,8 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg) | |||
2521 | return ret; | 2475 | return ret; |
2522 | } | 2476 | } |
2523 | 2477 | ||
2524 | static void i915_error_wake_up(struct drm_i915_private *dev_priv, | 2478 | static void i915_error_wake_up(struct drm_i915_private *dev_priv) |
2525 | bool reset_completed) | ||
2526 | { | 2479 | { |
2527 | struct intel_engine_cs *engine; | ||
2528 | |||
2529 | /* | 2480 | /* |
2530 | * Notify all waiters for GPU completion events that reset state has | 2481 | * Notify all waiters for GPU completion events that reset state has |
2531 | * been changed, and that they need to restart their wait after | 2482 | * been changed, and that they need to restart their wait after |
@@ -2534,36 +2485,28 @@ static void i915_error_wake_up(struct drm_i915_private *dev_priv, | |||
2534 | */ | 2485 | */ |
2535 | 2486 | ||
2536 | /* Wake up __wait_seqno, potentially holding dev->struct_mutex. */ | 2487 | /* Wake up __wait_seqno, potentially holding dev->struct_mutex. */ |
2537 | for_each_engine(engine, dev_priv) | 2488 | wake_up_all(&dev_priv->gpu_error.wait_queue); |
2538 | wake_up_all(&engine->irq_queue); | ||
2539 | 2489 | ||
2540 | /* Wake up intel_crtc_wait_for_pending_flips, holding crtc->mutex. */ | 2490 | /* Wake up intel_crtc_wait_for_pending_flips, holding crtc->mutex. */ |
2541 | wake_up_all(&dev_priv->pending_flip_queue); | 2491 | wake_up_all(&dev_priv->pending_flip_queue); |
2542 | |||
2543 | /* | ||
2544 | * Signal tasks blocked in i915_gem_wait_for_error that the pending | ||
2545 | * reset state is cleared. | ||
2546 | */ | ||
2547 | if (reset_completed) | ||
2548 | wake_up_all(&dev_priv->gpu_error.reset_queue); | ||
2549 | } | 2492 | } |
2550 | 2493 | ||
2551 | /** | 2494 | /** |
2552 | * i915_reset_and_wakeup - do process context error handling work | 2495 | * i915_reset_and_wakeup - do process context error handling work |
2553 | * @dev: drm device | 2496 | * @dev_priv: i915 device private |
2554 | * | 2497 | * |
2555 | * Fire an error uevent so userspace can see that a hang or error | 2498 | * Fire an error uevent so userspace can see that a hang or error |
2556 | * was detected. | 2499 | * was detected. |
2557 | */ | 2500 | */ |
2558 | static void i915_reset_and_wakeup(struct drm_device *dev) | 2501 | static void i915_reset_and_wakeup(struct drm_i915_private *dev_priv) |
2559 | { | 2502 | { |
2560 | struct drm_i915_private *dev_priv = to_i915(dev); | 2503 | struct kobject *kobj = &dev_priv->drm.primary->kdev->kobj; |
2561 | char *error_event[] = { I915_ERROR_UEVENT "=1", NULL }; | 2504 | char *error_event[] = { I915_ERROR_UEVENT "=1", NULL }; |
2562 | char *reset_event[] = { I915_RESET_UEVENT "=1", NULL }; | 2505 | char *reset_event[] = { I915_RESET_UEVENT "=1", NULL }; |
2563 | char *reset_done_event[] = { I915_ERROR_UEVENT "=0", NULL }; | 2506 | char *reset_done_event[] = { I915_ERROR_UEVENT "=0", NULL }; |
2564 | int ret; | 2507 | int ret; |
2565 | 2508 | ||
2566 | kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE, error_event); | 2509 | kobject_uevent_env(kobj, KOBJ_CHANGE, error_event); |
2567 | 2510 | ||
2568 | /* | 2511 | /* |
2569 | * Note that there's only one work item which does gpu resets, so we | 2512 | * Note that there's only one work item which does gpu resets, so we |
@@ -2577,8 +2520,7 @@ static void i915_reset_and_wakeup(struct drm_device *dev) | |||
2577 | */ | 2520 | */ |
2578 | if (i915_reset_in_progress(&dev_priv->gpu_error)) { | 2521 | if (i915_reset_in_progress(&dev_priv->gpu_error)) { |
2579 | DRM_DEBUG_DRIVER("resetting chip\n"); | 2522 | DRM_DEBUG_DRIVER("resetting chip\n"); |
2580 | kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE, | 2523 | kobject_uevent_env(kobj, KOBJ_CHANGE, reset_event); |
2581 | reset_event); | ||
2582 | 2524 | ||
2583 | /* | 2525 | /* |
2584 | * In most cases it's guaranteed that we get here with an RPM | 2526 | * In most cases it's guaranteed that we get here with an RPM |
@@ -2589,7 +2531,7 @@ static void i915_reset_and_wakeup(struct drm_device *dev) | |||
2589 | */ | 2531 | */ |
2590 | intel_runtime_pm_get(dev_priv); | 2532 | intel_runtime_pm_get(dev_priv); |
2591 | 2533 | ||
2592 | intel_prepare_reset(dev); | 2534 | intel_prepare_reset(dev_priv); |
2593 | 2535 | ||
2594 | /* | 2536 | /* |
2595 | * All state reset _must_ be completed before we update the | 2537 | * All state reset _must_ be completed before we update the |
@@ -2597,27 +2539,26 @@ static void i915_reset_and_wakeup(struct drm_device *dev) | |||
2597 | * pending state and not properly drop locks, resulting in | 2539 | * pending state and not properly drop locks, resulting in |
2598 | * deadlocks with the reset work. | 2540 | * deadlocks with the reset work. |
2599 | */ | 2541 | */ |
2600 | ret = i915_reset(dev); | 2542 | ret = i915_reset(dev_priv); |
2601 | 2543 | ||
2602 | intel_finish_reset(dev); | 2544 | intel_finish_reset(dev_priv); |
2603 | 2545 | ||
2604 | intel_runtime_pm_put(dev_priv); | 2546 | intel_runtime_pm_put(dev_priv); |
2605 | 2547 | ||
2606 | if (ret == 0) | 2548 | if (ret == 0) |
2607 | kobject_uevent_env(&dev->primary->kdev->kobj, | 2549 | kobject_uevent_env(kobj, |
2608 | KOBJ_CHANGE, reset_done_event); | 2550 | KOBJ_CHANGE, reset_done_event); |
2609 | 2551 | ||
2610 | /* | 2552 | /* |
2611 | * Note: The wake_up also serves as a memory barrier so that | 2553 | * Note: The wake_up also serves as a memory barrier so that |
2612 | * waiters see the update value of the reset counter atomic_t. | 2554 | * waiters see the update value of the reset counter atomic_t. |
2613 | */ | 2555 | */ |
2614 | i915_error_wake_up(dev_priv, true); | 2556 | wake_up_all(&dev_priv->gpu_error.reset_queue); |
2615 | } | 2557 | } |
2616 | } | 2558 | } |
2617 | 2559 | ||
2618 | static void i915_report_and_clear_eir(struct drm_device *dev) | 2560 | static void i915_report_and_clear_eir(struct drm_i915_private *dev_priv) |
2619 | { | 2561 | { |
2620 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2621 | uint32_t instdone[I915_NUM_INSTDONE_REG]; | 2562 | uint32_t instdone[I915_NUM_INSTDONE_REG]; |
2622 | u32 eir = I915_READ(EIR); | 2563 | u32 eir = I915_READ(EIR); |
2623 | int pipe, i; | 2564 | int pipe, i; |
@@ -2627,9 +2568,9 @@ static void i915_report_and_clear_eir(struct drm_device *dev) | |||
2627 | 2568 | ||
2628 | pr_err("render error detected, EIR: 0x%08x\n", eir); | 2569 | pr_err("render error detected, EIR: 0x%08x\n", eir); |
2629 | 2570 | ||
2630 | i915_get_extra_instdone(dev, instdone); | 2571 | i915_get_extra_instdone(dev_priv, instdone); |
2631 | 2572 | ||
2632 | if (IS_G4X(dev)) { | 2573 | if (IS_G4X(dev_priv)) { |
2633 | if (eir & (GM45_ERROR_MEM_PRIV | GM45_ERROR_CP_PRIV)) { | 2574 | if (eir & (GM45_ERROR_MEM_PRIV | GM45_ERROR_CP_PRIV)) { |
2634 | u32 ipeir = I915_READ(IPEIR_I965); | 2575 | u32 ipeir = I915_READ(IPEIR_I965); |
2635 | 2576 | ||
@@ -2651,7 +2592,7 @@ static void i915_report_and_clear_eir(struct drm_device *dev) | |||
2651 | } | 2592 | } |
2652 | } | 2593 | } |
2653 | 2594 | ||
2654 | if (!IS_GEN2(dev)) { | 2595 | if (!IS_GEN2(dev_priv)) { |
2655 | if (eir & I915_ERROR_PAGE_TABLE) { | 2596 | if (eir & I915_ERROR_PAGE_TABLE) { |
2656 | u32 pgtbl_err = I915_READ(PGTBL_ER); | 2597 | u32 pgtbl_err = I915_READ(PGTBL_ER); |
2657 | pr_err("page table error\n"); | 2598 | pr_err("page table error\n"); |
@@ -2673,7 +2614,7 @@ static void i915_report_and_clear_eir(struct drm_device *dev) | |||
2673 | pr_err(" INSTPM: 0x%08x\n", I915_READ(INSTPM)); | 2614 | pr_err(" INSTPM: 0x%08x\n", I915_READ(INSTPM)); |
2674 | for (i = 0; i < ARRAY_SIZE(instdone); i++) | 2615 | for (i = 0; i < ARRAY_SIZE(instdone); i++) |
2675 | pr_err(" INSTDONE_%d: 0x%08x\n", i, instdone[i]); | 2616 | pr_err(" INSTDONE_%d: 0x%08x\n", i, instdone[i]); |
2676 | if (INTEL_INFO(dev)->gen < 4) { | 2617 | if (INTEL_GEN(dev_priv) < 4) { |
2677 | u32 ipeir = I915_READ(IPEIR); | 2618 | u32 ipeir = I915_READ(IPEIR); |
2678 | 2619 | ||
2679 | pr_err(" IPEIR: 0x%08x\n", I915_READ(IPEIR)); | 2620 | pr_err(" IPEIR: 0x%08x\n", I915_READ(IPEIR)); |
@@ -2709,18 +2650,19 @@ static void i915_report_and_clear_eir(struct drm_device *dev) | |||
2709 | 2650 | ||
2710 | /** | 2651 | /** |
2711 | * i915_handle_error - handle a gpu error | 2652 | * i915_handle_error - handle a gpu error |
2712 | * @dev: drm device | 2653 | * @dev_priv: i915 device private |
2713 | * @engine_mask: mask representing engines that are hung | 2654 | * @engine_mask: mask representing engines that are hung |
2714 | * Do some basic checking of register state at error time and | 2655 | * Do some basic checking of register state at error time and |
2715 | * dump it to the syslog. Also call i915_capture_error_state() to make | 2656 | * dump it to the syslog. Also call i915_capture_error_state() to make |
2716 | * sure we get a record and make it available in debugfs. Fire a uevent | 2657 | * sure we get a record and make it available in debugfs. Fire a uevent |
2717 | * so userspace knows something bad happened (should trigger collection | 2658 | * so userspace knows something bad happened (should trigger collection |
2718 | * of a ring dump etc.). | 2659 | * of a ring dump etc.). |
2660 | * @fmt: Error message format string | ||
2719 | */ | 2661 | */ |
2720 | void i915_handle_error(struct drm_device *dev, u32 engine_mask, | 2662 | void i915_handle_error(struct drm_i915_private *dev_priv, |
2663 | u32 engine_mask, | ||
2721 | const char *fmt, ...) | 2664 | const char *fmt, ...) |
2722 | { | 2665 | { |
2723 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2724 | va_list args; | 2666 | va_list args; |
2725 | char error_msg[80]; | 2667 | char error_msg[80]; |
2726 | 2668 | ||
@@ -2728,8 +2670,8 @@ void i915_handle_error(struct drm_device *dev, u32 engine_mask, | |||
2728 | vscnprintf(error_msg, sizeof(error_msg), fmt, args); | 2670 | vscnprintf(error_msg, sizeof(error_msg), fmt, args); |
2729 | va_end(args); | 2671 | va_end(args); |
2730 | 2672 | ||
2731 | i915_capture_error_state(dev, engine_mask, error_msg); | 2673 | i915_capture_error_state(dev_priv, engine_mask, error_msg); |
2732 | i915_report_and_clear_eir(dev); | 2674 | i915_report_and_clear_eir(dev_priv); |
2733 | 2675 | ||
2734 | if (engine_mask) { | 2676 | if (engine_mask) { |
2735 | atomic_or(I915_RESET_IN_PROGRESS_FLAG, | 2677 | atomic_or(I915_RESET_IN_PROGRESS_FLAG, |
@@ -2748,10 +2690,10 @@ void i915_handle_error(struct drm_device *dev, u32 engine_mask, | |||
2748 | * ensure that the waiters see the updated value of the reset | 2690 | * ensure that the waiters see the updated value of the reset |
2749 | * counter atomic_t. | 2691 | * counter atomic_t. |
2750 | */ | 2692 | */ |
2751 | i915_error_wake_up(dev_priv, false); | 2693 | i915_error_wake_up(dev_priv); |
2752 | } | 2694 | } |
2753 | 2695 | ||
2754 | i915_reset_and_wakeup(dev); | 2696 | i915_reset_and_wakeup(dev_priv); |
2755 | } | 2697 | } |
2756 | 2698 | ||
2757 | /* Called from drm generic code, passed 'crtc' which | 2699 | /* Called from drm generic code, passed 'crtc' which |
@@ -2759,7 +2701,7 @@ void i915_handle_error(struct drm_device *dev, u32 engine_mask, | |||
2759 | */ | 2701 | */ |
2760 | static int i915_enable_vblank(struct drm_device *dev, unsigned int pipe) | 2702 | static int i915_enable_vblank(struct drm_device *dev, unsigned int pipe) |
2761 | { | 2703 | { |
2762 | struct drm_i915_private *dev_priv = dev->dev_private; | 2704 | struct drm_i915_private *dev_priv = to_i915(dev); |
2763 | unsigned long irqflags; | 2705 | unsigned long irqflags; |
2764 | 2706 | ||
2765 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); | 2707 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
@@ -2776,7 +2718,7 @@ static int i915_enable_vblank(struct drm_device *dev, unsigned int pipe) | |||
2776 | 2718 | ||
2777 | static int ironlake_enable_vblank(struct drm_device *dev, unsigned int pipe) | 2719 | static int ironlake_enable_vblank(struct drm_device *dev, unsigned int pipe) |
2778 | { | 2720 | { |
2779 | struct drm_i915_private *dev_priv = dev->dev_private; | 2721 | struct drm_i915_private *dev_priv = to_i915(dev); |
2780 | unsigned long irqflags; | 2722 | unsigned long irqflags; |
2781 | uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) : | 2723 | uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) : |
2782 | DE_PIPE_VBLANK(pipe); | 2724 | DE_PIPE_VBLANK(pipe); |
@@ -2790,7 +2732,7 @@ static int ironlake_enable_vblank(struct drm_device *dev, unsigned int pipe) | |||
2790 | 2732 | ||
2791 | static int valleyview_enable_vblank(struct drm_device *dev, unsigned int pipe) | 2733 | static int valleyview_enable_vblank(struct drm_device *dev, unsigned int pipe) |
2792 | { | 2734 | { |
2793 | struct drm_i915_private *dev_priv = dev->dev_private; | 2735 | struct drm_i915_private *dev_priv = to_i915(dev); |
2794 | unsigned long irqflags; | 2736 | unsigned long irqflags; |
2795 | 2737 | ||
2796 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); | 2738 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
@@ -2803,7 +2745,7 @@ static int valleyview_enable_vblank(struct drm_device *dev, unsigned int pipe) | |||
2803 | 2745 | ||
2804 | static int gen8_enable_vblank(struct drm_device *dev, unsigned int pipe) | 2746 | static int gen8_enable_vblank(struct drm_device *dev, unsigned int pipe) |
2805 | { | 2747 | { |
2806 | struct drm_i915_private *dev_priv = dev->dev_private; | 2748 | struct drm_i915_private *dev_priv = to_i915(dev); |
2807 | unsigned long irqflags; | 2749 | unsigned long irqflags; |
2808 | 2750 | ||
2809 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); | 2751 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
@@ -2818,7 +2760,7 @@ static int gen8_enable_vblank(struct drm_device *dev, unsigned int pipe) | |||
2818 | */ | 2760 | */ |
2819 | static void i915_disable_vblank(struct drm_device *dev, unsigned int pipe) | 2761 | static void i915_disable_vblank(struct drm_device *dev, unsigned int pipe) |
2820 | { | 2762 | { |
2821 | struct drm_i915_private *dev_priv = dev->dev_private; | 2763 | struct drm_i915_private *dev_priv = to_i915(dev); |
2822 | unsigned long irqflags; | 2764 | unsigned long irqflags; |
2823 | 2765 | ||
2824 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); | 2766 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
@@ -2830,7 +2772,7 @@ static void i915_disable_vblank(struct drm_device *dev, unsigned int pipe) | |||
2830 | 2772 | ||
2831 | static void ironlake_disable_vblank(struct drm_device *dev, unsigned int pipe) | 2773 | static void ironlake_disable_vblank(struct drm_device *dev, unsigned int pipe) |
2832 | { | 2774 | { |
2833 | struct drm_i915_private *dev_priv = dev->dev_private; | 2775 | struct drm_i915_private *dev_priv = to_i915(dev); |
2834 | unsigned long irqflags; | 2776 | unsigned long irqflags; |
2835 | uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) : | 2777 | uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) : |
2836 | DE_PIPE_VBLANK(pipe); | 2778 | DE_PIPE_VBLANK(pipe); |
@@ -2842,7 +2784,7 @@ static void ironlake_disable_vblank(struct drm_device *dev, unsigned int pipe) | |||
2842 | 2784 | ||
2843 | static void valleyview_disable_vblank(struct drm_device *dev, unsigned int pipe) | 2785 | static void valleyview_disable_vblank(struct drm_device *dev, unsigned int pipe) |
2844 | { | 2786 | { |
2845 | struct drm_i915_private *dev_priv = dev->dev_private; | 2787 | struct drm_i915_private *dev_priv = to_i915(dev); |
2846 | unsigned long irqflags; | 2788 | unsigned long irqflags; |
2847 | 2789 | ||
2848 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); | 2790 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
@@ -2853,7 +2795,7 @@ static void valleyview_disable_vblank(struct drm_device *dev, unsigned int pipe) | |||
2853 | 2795 | ||
2854 | static void gen8_disable_vblank(struct drm_device *dev, unsigned int pipe) | 2796 | static void gen8_disable_vblank(struct drm_device *dev, unsigned int pipe) |
2855 | { | 2797 | { |
2856 | struct drm_i915_private *dev_priv = dev->dev_private; | 2798 | struct drm_i915_private *dev_priv = to_i915(dev); |
2857 | unsigned long irqflags; | 2799 | unsigned long irqflags; |
2858 | 2800 | ||
2859 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); | 2801 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
@@ -2869,9 +2811,9 @@ ring_idle(struct intel_engine_cs *engine, u32 seqno) | |||
2869 | } | 2811 | } |
2870 | 2812 | ||
2871 | static bool | 2813 | static bool |
2872 | ipehr_is_semaphore_wait(struct drm_device *dev, u32 ipehr) | 2814 | ipehr_is_semaphore_wait(struct intel_engine_cs *engine, u32 ipehr) |
2873 | { | 2815 | { |
2874 | if (INTEL_INFO(dev)->gen >= 8) { | 2816 | if (INTEL_GEN(engine->i915) >= 8) { |
2875 | return (ipehr >> 23) == 0x1c; | 2817 | return (ipehr >> 23) == 0x1c; |
2876 | } else { | 2818 | } else { |
2877 | ipehr &= ~MI_SEMAPHORE_SYNC_MASK; | 2819 | ipehr &= ~MI_SEMAPHORE_SYNC_MASK; |
@@ -2884,10 +2826,10 @@ static struct intel_engine_cs * | |||
2884 | semaphore_wait_to_signaller_ring(struct intel_engine_cs *engine, u32 ipehr, | 2826 | semaphore_wait_to_signaller_ring(struct intel_engine_cs *engine, u32 ipehr, |
2885 | u64 offset) | 2827 | u64 offset) |
2886 | { | 2828 | { |
2887 | struct drm_i915_private *dev_priv = engine->dev->dev_private; | 2829 | struct drm_i915_private *dev_priv = engine->i915; |
2888 | struct intel_engine_cs *signaller; | 2830 | struct intel_engine_cs *signaller; |
2889 | 2831 | ||
2890 | if (INTEL_INFO(dev_priv)->gen >= 8) { | 2832 | if (INTEL_GEN(dev_priv) >= 8) { |
2891 | for_each_engine(signaller, dev_priv) { | 2833 | for_each_engine(signaller, dev_priv) { |
2892 | if (engine == signaller) | 2834 | if (engine == signaller) |
2893 | continue; | 2835 | continue; |
@@ -2916,7 +2858,7 @@ semaphore_wait_to_signaller_ring(struct intel_engine_cs *engine, u32 ipehr, | |||
2916 | static struct intel_engine_cs * | 2858 | static struct intel_engine_cs * |
2917 | semaphore_waits_for(struct intel_engine_cs *engine, u32 *seqno) | 2859 | semaphore_waits_for(struct intel_engine_cs *engine, u32 *seqno) |
2918 | { | 2860 | { |
2919 | struct drm_i915_private *dev_priv = engine->dev->dev_private; | 2861 | struct drm_i915_private *dev_priv = engine->i915; |
2920 | u32 cmd, ipehr, head; | 2862 | u32 cmd, ipehr, head; |
2921 | u64 offset = 0; | 2863 | u64 offset = 0; |
2922 | int i, backwards; | 2864 | int i, backwards; |
@@ -2942,7 +2884,7 @@ semaphore_waits_for(struct intel_engine_cs *engine, u32 *seqno) | |||
2942 | return NULL; | 2884 | return NULL; |
2943 | 2885 | ||
2944 | ipehr = I915_READ(RING_IPEHR(engine->mmio_base)); | 2886 | ipehr = I915_READ(RING_IPEHR(engine->mmio_base)); |
2945 | if (!ipehr_is_semaphore_wait(engine->dev, ipehr)) | 2887 | if (!ipehr_is_semaphore_wait(engine, ipehr)) |
2946 | return NULL; | 2888 | return NULL; |
2947 | 2889 | ||
2948 | /* | 2890 | /* |
@@ -2954,7 +2896,7 @@ semaphore_waits_for(struct intel_engine_cs *engine, u32 *seqno) | |||
2954 | * ringbuffer itself. | 2896 | * ringbuffer itself. |
2955 | */ | 2897 | */ |
2956 | head = I915_READ_HEAD(engine) & HEAD_ADDR; | 2898 | head = I915_READ_HEAD(engine) & HEAD_ADDR; |
2957 | backwards = (INTEL_INFO(engine->dev)->gen >= 8) ? 5 : 4; | 2899 | backwards = (INTEL_GEN(dev_priv) >= 8) ? 5 : 4; |
2958 | 2900 | ||
2959 | for (i = backwards; i; --i) { | 2901 | for (i = backwards; i; --i) { |
2960 | /* | 2902 | /* |
@@ -2976,7 +2918,7 @@ semaphore_waits_for(struct intel_engine_cs *engine, u32 *seqno) | |||
2976 | return NULL; | 2918 | return NULL; |
2977 | 2919 | ||
2978 | *seqno = ioread32(engine->buffer->virtual_start + head + 4) + 1; | 2920 | *seqno = ioread32(engine->buffer->virtual_start + head + 4) + 1; |
2979 | if (INTEL_INFO(engine->dev)->gen >= 8) { | 2921 | if (INTEL_GEN(dev_priv) >= 8) { |
2980 | offset = ioread32(engine->buffer->virtual_start + head + 12); | 2922 | offset = ioread32(engine->buffer->virtual_start + head + 12); |
2981 | offset <<= 32; | 2923 | offset <<= 32; |
2982 | offset = ioread32(engine->buffer->virtual_start + head + 8); | 2924 | offset = ioread32(engine->buffer->virtual_start + head + 8); |
@@ -2986,7 +2928,7 @@ semaphore_waits_for(struct intel_engine_cs *engine, u32 *seqno) | |||
2986 | 2928 | ||
2987 | static int semaphore_passed(struct intel_engine_cs *engine) | 2929 | static int semaphore_passed(struct intel_engine_cs *engine) |
2988 | { | 2930 | { |
2989 | struct drm_i915_private *dev_priv = engine->dev->dev_private; | 2931 | struct drm_i915_private *dev_priv = engine->i915; |
2990 | struct intel_engine_cs *signaller; | 2932 | struct intel_engine_cs *signaller; |
2991 | u32 seqno; | 2933 | u32 seqno; |
2992 | 2934 | ||
@@ -3000,7 +2942,7 @@ static int semaphore_passed(struct intel_engine_cs *engine) | |||
3000 | if (signaller->hangcheck.deadlock >= I915_NUM_ENGINES) | 2942 | if (signaller->hangcheck.deadlock >= I915_NUM_ENGINES) |
3001 | return -1; | 2943 | return -1; |
3002 | 2944 | ||
3003 | if (i915_seqno_passed(signaller->get_seqno(signaller), seqno)) | 2945 | if (i915_seqno_passed(intel_engine_get_seqno(signaller), seqno)) |
3004 | return 1; | 2946 | return 1; |
3005 | 2947 | ||
3006 | /* cursory check for an unkickable deadlock */ | 2948 | /* cursory check for an unkickable deadlock */ |
@@ -3028,7 +2970,7 @@ static bool subunits_stuck(struct intel_engine_cs *engine) | |||
3028 | if (engine->id != RCS) | 2970 | if (engine->id != RCS) |
3029 | return true; | 2971 | return true; |
3030 | 2972 | ||
3031 | i915_get_extra_instdone(engine->dev, instdone); | 2973 | i915_get_extra_instdone(engine->i915, instdone); |
3032 | 2974 | ||
3033 | /* There might be unstable subunit states even when | 2975 | /* There might be unstable subunit states even when |
3034 | * actual head is not moving. Filter out the unstable ones by | 2976 | * actual head is not moving. Filter out the unstable ones by |
@@ -3069,8 +3011,7 @@ head_stuck(struct intel_engine_cs *engine, u64 acthd) | |||
3069 | static enum intel_ring_hangcheck_action | 3011 | static enum intel_ring_hangcheck_action |
3070 | ring_stuck(struct intel_engine_cs *engine, u64 acthd) | 3012 | ring_stuck(struct intel_engine_cs *engine, u64 acthd) |
3071 | { | 3013 | { |
3072 | struct drm_device *dev = engine->dev; | 3014 | struct drm_i915_private *dev_priv = engine->i915; |
3073 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3074 | enum intel_ring_hangcheck_action ha; | 3015 | enum intel_ring_hangcheck_action ha; |
3075 | u32 tmp; | 3016 | u32 tmp; |
3076 | 3017 | ||
@@ -3078,7 +3019,7 @@ ring_stuck(struct intel_engine_cs *engine, u64 acthd) | |||
3078 | if (ha != HANGCHECK_HUNG) | 3019 | if (ha != HANGCHECK_HUNG) |
3079 | return ha; | 3020 | return ha; |
3080 | 3021 | ||
3081 | if (IS_GEN2(dev)) | 3022 | if (IS_GEN2(dev_priv)) |
3082 | return HANGCHECK_HUNG; | 3023 | return HANGCHECK_HUNG; |
3083 | 3024 | ||
3084 | /* Is the chip hanging on a WAIT_FOR_EVENT? | 3025 | /* Is the chip hanging on a WAIT_FOR_EVENT? |
@@ -3088,19 +3029,19 @@ ring_stuck(struct intel_engine_cs *engine, u64 acthd) | |||
3088 | */ | 3029 | */ |
3089 | tmp = I915_READ_CTL(engine); | 3030 | tmp = I915_READ_CTL(engine); |
3090 | if (tmp & RING_WAIT) { | 3031 | if (tmp & RING_WAIT) { |
3091 | i915_handle_error(dev, 0, | 3032 | i915_handle_error(dev_priv, 0, |
3092 | "Kicking stuck wait on %s", | 3033 | "Kicking stuck wait on %s", |
3093 | engine->name); | 3034 | engine->name); |
3094 | I915_WRITE_CTL(engine, tmp); | 3035 | I915_WRITE_CTL(engine, tmp); |
3095 | return HANGCHECK_KICK; | 3036 | return HANGCHECK_KICK; |
3096 | } | 3037 | } |
3097 | 3038 | ||
3098 | if (INTEL_INFO(dev)->gen >= 6 && tmp & RING_WAIT_SEMAPHORE) { | 3039 | if (INTEL_GEN(dev_priv) >= 6 && tmp & RING_WAIT_SEMAPHORE) { |
3099 | switch (semaphore_passed(engine)) { | 3040 | switch (semaphore_passed(engine)) { |
3100 | default: | 3041 | default: |
3101 | return HANGCHECK_HUNG; | 3042 | return HANGCHECK_HUNG; |
3102 | case 1: | 3043 | case 1: |
3103 | i915_handle_error(dev, 0, | 3044 | i915_handle_error(dev_priv, 0, |
3104 | "Kicking stuck semaphore on %s", | 3045 | "Kicking stuck semaphore on %s", |
3105 | engine->name); | 3046 | engine->name); |
3106 | I915_WRITE_CTL(engine, tmp); | 3047 | I915_WRITE_CTL(engine, tmp); |
@@ -3113,23 +3054,21 @@ ring_stuck(struct intel_engine_cs *engine, u64 acthd) | |||
3113 | return HANGCHECK_HUNG; | 3054 | return HANGCHECK_HUNG; |
3114 | } | 3055 | } |
3115 | 3056 | ||
3116 | static unsigned kick_waiters(struct intel_engine_cs *engine) | 3057 | static unsigned long kick_waiters(struct intel_engine_cs *engine) |
3117 | { | 3058 | { |
3118 | struct drm_i915_private *i915 = to_i915(engine->dev); | 3059 | struct drm_i915_private *i915 = engine->i915; |
3119 | unsigned user_interrupts = READ_ONCE(engine->user_interrupts); | 3060 | unsigned long irq_count = READ_ONCE(engine->breadcrumbs.irq_wakeups); |
3120 | 3061 | ||
3121 | if (engine->hangcheck.user_interrupts == user_interrupts && | 3062 | if (engine->hangcheck.user_interrupts == irq_count && |
3122 | !test_and_set_bit(engine->id, &i915->gpu_error.missed_irq_rings)) { | 3063 | !test_and_set_bit(engine->id, &i915->gpu_error.missed_irq_rings)) { |
3123 | if (!(i915->gpu_error.test_irq_rings & intel_engine_flag(engine))) | 3064 | if (!test_bit(engine->id, &i915->gpu_error.test_irq_rings)) |
3124 | DRM_ERROR("Hangcheck timer elapsed... %s idle\n", | 3065 | DRM_ERROR("Hangcheck timer elapsed... %s idle\n", |
3125 | engine->name); | 3066 | engine->name); |
3126 | else | 3067 | |
3127 | DRM_INFO("Fake missed irq on %s\n", | 3068 | intel_engine_enable_fake_irq(engine); |
3128 | engine->name); | ||
3129 | wake_up_all(&engine->irq_queue); | ||
3130 | } | 3069 | } |
3131 | 3070 | ||
3132 | return user_interrupts; | 3071 | return irq_count; |
3133 | } | 3072 | } |
3134 | /* | 3073 | /* |
3135 | * This is called when the chip hasn't reported back with completed | 3074 | * This is called when the chip hasn't reported back with completed |
@@ -3144,11 +3083,9 @@ static void i915_hangcheck_elapsed(struct work_struct *work) | |||
3144 | struct drm_i915_private *dev_priv = | 3083 | struct drm_i915_private *dev_priv = |
3145 | container_of(work, typeof(*dev_priv), | 3084 | container_of(work, typeof(*dev_priv), |
3146 | gpu_error.hangcheck_work.work); | 3085 | gpu_error.hangcheck_work.work); |
3147 | struct drm_device *dev = dev_priv->dev; | ||
3148 | struct intel_engine_cs *engine; | 3086 | struct intel_engine_cs *engine; |
3149 | enum intel_engine_id id; | 3087 | unsigned int hung = 0, stuck = 0; |
3150 | int busy_count = 0, rings_hung = 0; | 3088 | int busy_count = 0; |
3151 | bool stuck[I915_NUM_ENGINES] = { 0 }; | ||
3152 | #define BUSY 1 | 3089 | #define BUSY 1 |
3153 | #define KICK 5 | 3090 | #define KICK 5 |
3154 | #define HUNG 20 | 3091 | #define HUNG 20 |
@@ -3157,12 +3094,8 @@ static void i915_hangcheck_elapsed(struct work_struct *work) | |||
3157 | if (!i915.enable_hangcheck) | 3094 | if (!i915.enable_hangcheck) |
3158 | return; | 3095 | return; |
3159 | 3096 | ||
3160 | /* | 3097 | if (!READ_ONCE(dev_priv->gt.awake)) |
3161 | * The hangcheck work is synced during runtime suspend, we don't | 3098 | return; |
3162 | * require a wakeref. TODO: instead of disabling the asserts make | ||
3163 | * sure that we hold a reference when this work is running. | ||
3164 | */ | ||
3165 | DISABLE_RPM_WAKEREF_ASSERTS(dev_priv); | ||
3166 | 3099 | ||
3167 | /* As enabling the GPU requires fairly extensive mmio access, | 3100 | /* As enabling the GPU requires fairly extensive mmio access, |
3168 | * periodically arm the mmio checker to see if we are triggering | 3101 | * periodically arm the mmio checker to see if we are triggering |
@@ -3170,11 +3103,11 @@ static void i915_hangcheck_elapsed(struct work_struct *work) | |||
3170 | */ | 3103 | */ |
3171 | intel_uncore_arm_unclaimed_mmio_detection(dev_priv); | 3104 | intel_uncore_arm_unclaimed_mmio_detection(dev_priv); |
3172 | 3105 | ||
3173 | for_each_engine_id(engine, dev_priv, id) { | 3106 | for_each_engine(engine, dev_priv) { |
3107 | bool busy = intel_engine_has_waiter(engine); | ||
3174 | u64 acthd; | 3108 | u64 acthd; |
3175 | u32 seqno; | 3109 | u32 seqno; |
3176 | unsigned user_interrupts; | 3110 | unsigned user_interrupts; |
3177 | bool busy = true; | ||
3178 | 3111 | ||
3179 | semaphore_clear_deadlocks(dev_priv); | 3112 | semaphore_clear_deadlocks(dev_priv); |
3180 | 3113 | ||
@@ -3189,7 +3122,7 @@ static void i915_hangcheck_elapsed(struct work_struct *work) | |||
3189 | engine->irq_seqno_barrier(engine); | 3122 | engine->irq_seqno_barrier(engine); |
3190 | 3123 | ||
3191 | acthd = intel_ring_get_active_head(engine); | 3124 | acthd = intel_ring_get_active_head(engine); |
3192 | seqno = engine->get_seqno(engine); | 3125 | seqno = intel_engine_get_seqno(engine); |
3193 | 3126 | ||
3194 | /* Reset stuck interrupts between batch advances */ | 3127 | /* Reset stuck interrupts between batch advances */ |
3195 | user_interrupts = 0; | 3128 | user_interrupts = 0; |
@@ -3197,12 +3130,11 @@ static void i915_hangcheck_elapsed(struct work_struct *work) | |||
3197 | if (engine->hangcheck.seqno == seqno) { | 3130 | if (engine->hangcheck.seqno == seqno) { |
3198 | if (ring_idle(engine, seqno)) { | 3131 | if (ring_idle(engine, seqno)) { |
3199 | engine->hangcheck.action = HANGCHECK_IDLE; | 3132 | engine->hangcheck.action = HANGCHECK_IDLE; |
3200 | if (waitqueue_active(&engine->irq_queue)) { | 3133 | if (busy) { |
3201 | /* Safeguard against driver failure */ | 3134 | /* Safeguard against driver failure */ |
3202 | user_interrupts = kick_waiters(engine); | 3135 | user_interrupts = kick_waiters(engine); |
3203 | engine->hangcheck.score += BUSY; | 3136 | engine->hangcheck.score += BUSY; |
3204 | } else | 3137 | } |
3205 | busy = false; | ||
3206 | } else { | 3138 | } else { |
3207 | /* We always increment the hangcheck score | 3139 | /* We always increment the hangcheck score |
3208 | * if the ring is busy and still processing | 3140 | * if the ring is busy and still processing |
@@ -3234,10 +3166,15 @@ static void i915_hangcheck_elapsed(struct work_struct *work) | |||
3234 | break; | 3166 | break; |
3235 | case HANGCHECK_HUNG: | 3167 | case HANGCHECK_HUNG: |
3236 | engine->hangcheck.score += HUNG; | 3168 | engine->hangcheck.score += HUNG; |
3237 | stuck[id] = true; | ||
3238 | break; | 3169 | break; |
3239 | } | 3170 | } |
3240 | } | 3171 | } |
3172 | |||
3173 | if (engine->hangcheck.score >= HANGCHECK_SCORE_RING_HUNG) { | ||
3174 | hung |= intel_engine_flag(engine); | ||
3175 | if (engine->hangcheck.action != HANGCHECK_HUNG) | ||
3176 | stuck |= intel_engine_flag(engine); | ||
3177 | } | ||
3241 | } else { | 3178 | } else { |
3242 | engine->hangcheck.action = HANGCHECK_ACTIVE; | 3179 | engine->hangcheck.action = HANGCHECK_ACTIVE; |
3243 | 3180 | ||
@@ -3262,48 +3199,33 @@ static void i915_hangcheck_elapsed(struct work_struct *work) | |||
3262 | busy_count += busy; | 3199 | busy_count += busy; |
3263 | } | 3200 | } |
3264 | 3201 | ||
3265 | for_each_engine_id(engine, dev_priv, id) { | 3202 | if (hung) { |
3266 | if (engine->hangcheck.score >= HANGCHECK_SCORE_RING_HUNG) { | 3203 | char msg[80]; |
3267 | DRM_INFO("%s on %s\n", | 3204 | int len; |
3268 | stuck[id] ? "stuck" : "no progress", | ||
3269 | engine->name); | ||
3270 | rings_hung |= intel_engine_flag(engine); | ||
3271 | } | ||
3272 | } | ||
3273 | 3205 | ||
3274 | if (rings_hung) { | 3206 | /* If some rings hung but others were still busy, only |
3275 | i915_handle_error(dev, rings_hung, "Engine(s) hung"); | 3207 | * blame the hanging rings in the synopsis. |
3276 | goto out; | 3208 | */ |
3209 | if (stuck != hung) | ||
3210 | hung &= ~stuck; | ||
3211 | len = scnprintf(msg, sizeof(msg), | ||
3212 | "%s on ", stuck == hung ? "No progress" : "Hang"); | ||
3213 | for_each_engine_masked(engine, dev_priv, hung) | ||
3214 | len += scnprintf(msg + len, sizeof(msg) - len, | ||
3215 | "%s, ", engine->name); | ||
3216 | msg[len-2] = '\0'; | ||
3217 | |||
3218 | return i915_handle_error(dev_priv, hung, msg); | ||
3277 | } | 3219 | } |
3278 | 3220 | ||
3221 | /* Reset timer in case GPU hangs without another request being added */ | ||
3279 | if (busy_count) | 3222 | if (busy_count) |
3280 | /* Reset timer case chip hangs without another request | 3223 | i915_queue_hangcheck(dev_priv); |
3281 | * being added */ | ||
3282 | i915_queue_hangcheck(dev); | ||
3283 | |||
3284 | out: | ||
3285 | ENABLE_RPM_WAKEREF_ASSERTS(dev_priv); | ||
3286 | } | ||
3287 | |||
3288 | void i915_queue_hangcheck(struct drm_device *dev) | ||
3289 | { | ||
3290 | struct i915_gpu_error *e = &to_i915(dev)->gpu_error; | ||
3291 | |||
3292 | if (!i915.enable_hangcheck) | ||
3293 | return; | ||
3294 | |||
3295 | /* Don't continually defer the hangcheck so that it is always run at | ||
3296 | * least once after work has been scheduled on any ring. Otherwise, | ||
3297 | * we will ignore a hung ring if a second ring is kept busy. | ||
3298 | */ | ||
3299 | |||
3300 | queue_delayed_work(e->hangcheck_wq, &e->hangcheck_work, | ||
3301 | round_jiffies_up_relative(DRM_I915_HANGCHECK_JIFFIES)); | ||
3302 | } | 3224 | } |
3303 | 3225 | ||
3304 | static void ibx_irq_reset(struct drm_device *dev) | 3226 | static void ibx_irq_reset(struct drm_device *dev) |
3305 | { | 3227 | { |
3306 | struct drm_i915_private *dev_priv = dev->dev_private; | 3228 | struct drm_i915_private *dev_priv = to_i915(dev); |
3307 | 3229 | ||
3308 | if (HAS_PCH_NOP(dev)) | 3230 | if (HAS_PCH_NOP(dev)) |
3309 | return; | 3231 | return; |
@@ -3324,7 +3246,7 @@ static void ibx_irq_reset(struct drm_device *dev) | |||
3324 | */ | 3246 | */ |
3325 | static void ibx_irq_pre_postinstall(struct drm_device *dev) | 3247 | static void ibx_irq_pre_postinstall(struct drm_device *dev) |
3326 | { | 3248 | { |
3327 | struct drm_i915_private *dev_priv = dev->dev_private; | 3249 | struct drm_i915_private *dev_priv = to_i915(dev); |
3328 | 3250 | ||
3329 | if (HAS_PCH_NOP(dev)) | 3251 | if (HAS_PCH_NOP(dev)) |
3330 | return; | 3252 | return; |
@@ -3336,7 +3258,7 @@ static void ibx_irq_pre_postinstall(struct drm_device *dev) | |||
3336 | 3258 | ||
3337 | static void gen5_gt_irq_reset(struct drm_device *dev) | 3259 | static void gen5_gt_irq_reset(struct drm_device *dev) |
3338 | { | 3260 | { |
3339 | struct drm_i915_private *dev_priv = dev->dev_private; | 3261 | struct drm_i915_private *dev_priv = to_i915(dev); |
3340 | 3262 | ||
3341 | GEN5_IRQ_RESET(GT); | 3263 | GEN5_IRQ_RESET(GT); |
3342 | if (INTEL_INFO(dev)->gen >= 6) | 3264 | if (INTEL_INFO(dev)->gen >= 6) |
@@ -3396,7 +3318,7 @@ static void vlv_display_irq_postinstall(struct drm_i915_private *dev_priv) | |||
3396 | */ | 3318 | */ |
3397 | static void ironlake_irq_reset(struct drm_device *dev) | 3319 | static void ironlake_irq_reset(struct drm_device *dev) |
3398 | { | 3320 | { |
3399 | struct drm_i915_private *dev_priv = dev->dev_private; | 3321 | struct drm_i915_private *dev_priv = to_i915(dev); |
3400 | 3322 | ||
3401 | I915_WRITE(HWSTAM, 0xffffffff); | 3323 | I915_WRITE(HWSTAM, 0xffffffff); |
3402 | 3324 | ||
@@ -3411,7 +3333,7 @@ static void ironlake_irq_reset(struct drm_device *dev) | |||
3411 | 3333 | ||
3412 | static void valleyview_irq_preinstall(struct drm_device *dev) | 3334 | static void valleyview_irq_preinstall(struct drm_device *dev) |
3413 | { | 3335 | { |
3414 | struct drm_i915_private *dev_priv = dev->dev_private; | 3336 | struct drm_i915_private *dev_priv = to_i915(dev); |
3415 | 3337 | ||
3416 | I915_WRITE(VLV_MASTER_IER, 0); | 3338 | I915_WRITE(VLV_MASTER_IER, 0); |
3417 | POSTING_READ(VLV_MASTER_IER); | 3339 | POSTING_READ(VLV_MASTER_IER); |
@@ -3434,7 +3356,7 @@ static void gen8_gt_irq_reset(struct drm_i915_private *dev_priv) | |||
3434 | 3356 | ||
3435 | static void gen8_irq_reset(struct drm_device *dev) | 3357 | static void gen8_irq_reset(struct drm_device *dev) |
3436 | { | 3358 | { |
3437 | struct drm_i915_private *dev_priv = dev->dev_private; | 3359 | struct drm_i915_private *dev_priv = to_i915(dev); |
3438 | int pipe; | 3360 | int pipe; |
3439 | 3361 | ||
3440 | I915_WRITE(GEN8_MASTER_IRQ, 0); | 3362 | I915_WRITE(GEN8_MASTER_IRQ, 0); |
@@ -3480,12 +3402,12 @@ void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv, | |||
3480 | spin_unlock_irq(&dev_priv->irq_lock); | 3402 | spin_unlock_irq(&dev_priv->irq_lock); |
3481 | 3403 | ||
3482 | /* make sure we're done processing display irqs */ | 3404 | /* make sure we're done processing display irqs */ |
3483 | synchronize_irq(dev_priv->dev->irq); | 3405 | synchronize_irq(dev_priv->drm.irq); |
3484 | } | 3406 | } |
3485 | 3407 | ||
3486 | static void cherryview_irq_preinstall(struct drm_device *dev) | 3408 | static void cherryview_irq_preinstall(struct drm_device *dev) |
3487 | { | 3409 | { |
3488 | struct drm_i915_private *dev_priv = dev->dev_private; | 3410 | struct drm_i915_private *dev_priv = to_i915(dev); |
3489 | 3411 | ||
3490 | I915_WRITE(GEN8_MASTER_IRQ, 0); | 3412 | I915_WRITE(GEN8_MASTER_IRQ, 0); |
3491 | POSTING_READ(GEN8_MASTER_IRQ); | 3413 | POSTING_READ(GEN8_MASTER_IRQ); |
@@ -3500,31 +3422,29 @@ static void cherryview_irq_preinstall(struct drm_device *dev) | |||
3500 | spin_unlock_irq(&dev_priv->irq_lock); | 3422 | spin_unlock_irq(&dev_priv->irq_lock); |
3501 | } | 3423 | } |
3502 | 3424 | ||
3503 | static u32 intel_hpd_enabled_irqs(struct drm_device *dev, | 3425 | static u32 intel_hpd_enabled_irqs(struct drm_i915_private *dev_priv, |
3504 | const u32 hpd[HPD_NUM_PINS]) | 3426 | const u32 hpd[HPD_NUM_PINS]) |
3505 | { | 3427 | { |
3506 | struct drm_i915_private *dev_priv = to_i915(dev); | ||
3507 | struct intel_encoder *encoder; | 3428 | struct intel_encoder *encoder; |
3508 | u32 enabled_irqs = 0; | 3429 | u32 enabled_irqs = 0; |
3509 | 3430 | ||
3510 | for_each_intel_encoder(dev, encoder) | 3431 | for_each_intel_encoder(&dev_priv->drm, encoder) |
3511 | if (dev_priv->hotplug.stats[encoder->hpd_pin].state == HPD_ENABLED) | 3432 | if (dev_priv->hotplug.stats[encoder->hpd_pin].state == HPD_ENABLED) |
3512 | enabled_irqs |= hpd[encoder->hpd_pin]; | 3433 | enabled_irqs |= hpd[encoder->hpd_pin]; |
3513 | 3434 | ||
3514 | return enabled_irqs; | 3435 | return enabled_irqs; |
3515 | } | 3436 | } |
3516 | 3437 | ||
3517 | static void ibx_hpd_irq_setup(struct drm_device *dev) | 3438 | static void ibx_hpd_irq_setup(struct drm_i915_private *dev_priv) |
3518 | { | 3439 | { |
3519 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3520 | u32 hotplug_irqs, hotplug, enabled_irqs; | 3440 | u32 hotplug_irqs, hotplug, enabled_irqs; |
3521 | 3441 | ||
3522 | if (HAS_PCH_IBX(dev)) { | 3442 | if (HAS_PCH_IBX(dev_priv)) { |
3523 | hotplug_irqs = SDE_HOTPLUG_MASK; | 3443 | hotplug_irqs = SDE_HOTPLUG_MASK; |
3524 | enabled_irqs = intel_hpd_enabled_irqs(dev, hpd_ibx); | 3444 | enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_ibx); |
3525 | } else { | 3445 | } else { |
3526 | hotplug_irqs = SDE_HOTPLUG_MASK_CPT; | 3446 | hotplug_irqs = SDE_HOTPLUG_MASK_CPT; |
3527 | enabled_irqs = intel_hpd_enabled_irqs(dev, hpd_cpt); | 3447 | enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_cpt); |
3528 | } | 3448 | } |
3529 | 3449 | ||
3530 | ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs); | 3450 | ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs); |
@@ -3543,18 +3463,17 @@ static void ibx_hpd_irq_setup(struct drm_device *dev) | |||
3543 | * When CPU and PCH are on the same package, port A | 3463 | * When CPU and PCH are on the same package, port A |
3544 | * HPD must be enabled in both north and south. | 3464 | * HPD must be enabled in both north and south. |
3545 | */ | 3465 | */ |
3546 | if (HAS_PCH_LPT_LP(dev)) | 3466 | if (HAS_PCH_LPT_LP(dev_priv)) |
3547 | hotplug |= PORTA_HOTPLUG_ENABLE; | 3467 | hotplug |= PORTA_HOTPLUG_ENABLE; |
3548 | I915_WRITE(PCH_PORT_HOTPLUG, hotplug); | 3468 | I915_WRITE(PCH_PORT_HOTPLUG, hotplug); |
3549 | } | 3469 | } |
3550 | 3470 | ||
3551 | static void spt_hpd_irq_setup(struct drm_device *dev) | 3471 | static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv) |
3552 | { | 3472 | { |
3553 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3554 | u32 hotplug_irqs, hotplug, enabled_irqs; | 3473 | u32 hotplug_irqs, hotplug, enabled_irqs; |
3555 | 3474 | ||
3556 | hotplug_irqs = SDE_HOTPLUG_MASK_SPT; | 3475 | hotplug_irqs = SDE_HOTPLUG_MASK_SPT; |
3557 | enabled_irqs = intel_hpd_enabled_irqs(dev, hpd_spt); | 3476 | enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_spt); |
3558 | 3477 | ||
3559 | ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs); | 3478 | ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs); |
3560 | 3479 | ||
@@ -3569,24 +3488,23 @@ static void spt_hpd_irq_setup(struct drm_device *dev) | |||
3569 | I915_WRITE(PCH_PORT_HOTPLUG2, hotplug); | 3488 | I915_WRITE(PCH_PORT_HOTPLUG2, hotplug); |
3570 | } | 3489 | } |
3571 | 3490 | ||
3572 | static void ilk_hpd_irq_setup(struct drm_device *dev) | 3491 | static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv) |
3573 | { | 3492 | { |
3574 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3575 | u32 hotplug_irqs, hotplug, enabled_irqs; | 3493 | u32 hotplug_irqs, hotplug, enabled_irqs; |
3576 | 3494 | ||
3577 | if (INTEL_INFO(dev)->gen >= 8) { | 3495 | if (INTEL_GEN(dev_priv) >= 8) { |
3578 | hotplug_irqs = GEN8_PORT_DP_A_HOTPLUG; | 3496 | hotplug_irqs = GEN8_PORT_DP_A_HOTPLUG; |
3579 | enabled_irqs = intel_hpd_enabled_irqs(dev, hpd_bdw); | 3497 | enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bdw); |
3580 | 3498 | ||
3581 | bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs); | 3499 | bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs); |
3582 | } else if (INTEL_INFO(dev)->gen >= 7) { | 3500 | } else if (INTEL_GEN(dev_priv) >= 7) { |
3583 | hotplug_irqs = DE_DP_A_HOTPLUG_IVB; | 3501 | hotplug_irqs = DE_DP_A_HOTPLUG_IVB; |
3584 | enabled_irqs = intel_hpd_enabled_irqs(dev, hpd_ivb); | 3502 | enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_ivb); |
3585 | 3503 | ||
3586 | ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs); | 3504 | ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs); |
3587 | } else { | 3505 | } else { |
3588 | hotplug_irqs = DE_DP_A_HOTPLUG; | 3506 | hotplug_irqs = DE_DP_A_HOTPLUG; |
3589 | enabled_irqs = intel_hpd_enabled_irqs(dev, hpd_ilk); | 3507 | enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_ilk); |
3590 | 3508 | ||
3591 | ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs); | 3509 | ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs); |
3592 | } | 3510 | } |
@@ -3601,15 +3519,14 @@ static void ilk_hpd_irq_setup(struct drm_device *dev) | |||
3601 | hotplug |= DIGITAL_PORTA_HOTPLUG_ENABLE | DIGITAL_PORTA_PULSE_DURATION_2ms; | 3519 | hotplug |= DIGITAL_PORTA_HOTPLUG_ENABLE | DIGITAL_PORTA_PULSE_DURATION_2ms; |
3602 | I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, hotplug); | 3520 | I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, hotplug); |
3603 | 3521 | ||
3604 | ibx_hpd_irq_setup(dev); | 3522 | ibx_hpd_irq_setup(dev_priv); |
3605 | } | 3523 | } |
3606 | 3524 | ||
3607 | static void bxt_hpd_irq_setup(struct drm_device *dev) | 3525 | static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv) |
3608 | { | 3526 | { |
3609 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3610 | u32 hotplug_irqs, hotplug, enabled_irqs; | 3527 | u32 hotplug_irqs, hotplug, enabled_irqs; |
3611 | 3528 | ||
3612 | enabled_irqs = intel_hpd_enabled_irqs(dev, hpd_bxt); | 3529 | enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bxt); |
3613 | hotplug_irqs = BXT_DE_PORT_HOTPLUG_MASK; | 3530 | hotplug_irqs = BXT_DE_PORT_HOTPLUG_MASK; |
3614 | 3531 | ||
3615 | bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs); | 3532 | bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs); |
@@ -3642,7 +3559,7 @@ static void bxt_hpd_irq_setup(struct drm_device *dev) | |||
3642 | 3559 | ||
3643 | static void ibx_irq_postinstall(struct drm_device *dev) | 3560 | static void ibx_irq_postinstall(struct drm_device *dev) |
3644 | { | 3561 | { |
3645 | struct drm_i915_private *dev_priv = dev->dev_private; | 3562 | struct drm_i915_private *dev_priv = to_i915(dev); |
3646 | u32 mask; | 3563 | u32 mask; |
3647 | 3564 | ||
3648 | if (HAS_PCH_NOP(dev)) | 3565 | if (HAS_PCH_NOP(dev)) |
@@ -3659,7 +3576,7 @@ static void ibx_irq_postinstall(struct drm_device *dev) | |||
3659 | 3576 | ||
3660 | static void gen5_gt_irq_postinstall(struct drm_device *dev) | 3577 | static void gen5_gt_irq_postinstall(struct drm_device *dev) |
3661 | { | 3578 | { |
3662 | struct drm_i915_private *dev_priv = dev->dev_private; | 3579 | struct drm_i915_private *dev_priv = to_i915(dev); |
3663 | u32 pm_irqs, gt_irqs; | 3580 | u32 pm_irqs, gt_irqs; |
3664 | 3581 | ||
3665 | pm_irqs = gt_irqs = 0; | 3582 | pm_irqs = gt_irqs = 0; |
@@ -3673,8 +3590,7 @@ static void gen5_gt_irq_postinstall(struct drm_device *dev) | |||
3673 | 3590 | ||
3674 | gt_irqs |= GT_RENDER_USER_INTERRUPT; | 3591 | gt_irqs |= GT_RENDER_USER_INTERRUPT; |
3675 | if (IS_GEN5(dev)) { | 3592 | if (IS_GEN5(dev)) { |
3676 | gt_irqs |= GT_RENDER_PIPECTL_NOTIFY_INTERRUPT | | 3593 | gt_irqs |= ILK_BSD_USER_INTERRUPT; |
3677 | ILK_BSD_USER_INTERRUPT; | ||
3678 | } else { | 3594 | } else { |
3679 | gt_irqs |= GT_BLT_USER_INTERRUPT | GT_BSD_USER_INTERRUPT; | 3595 | gt_irqs |= GT_BLT_USER_INTERRUPT | GT_BSD_USER_INTERRUPT; |
3680 | } | 3596 | } |
@@ -3696,7 +3612,7 @@ static void gen5_gt_irq_postinstall(struct drm_device *dev) | |||
3696 | 3612 | ||
3697 | static int ironlake_irq_postinstall(struct drm_device *dev) | 3613 | static int ironlake_irq_postinstall(struct drm_device *dev) |
3698 | { | 3614 | { |
3699 | struct drm_i915_private *dev_priv = dev->dev_private; | 3615 | struct drm_i915_private *dev_priv = to_i915(dev); |
3700 | u32 display_mask, extra_mask; | 3616 | u32 display_mask, extra_mask; |
3701 | 3617 | ||
3702 | if (INTEL_INFO(dev)->gen >= 7) { | 3618 | if (INTEL_INFO(dev)->gen >= 7) { |
@@ -3775,7 +3691,7 @@ void valleyview_disable_display_irqs(struct drm_i915_private *dev_priv) | |||
3775 | 3691 | ||
3776 | static int valleyview_irq_postinstall(struct drm_device *dev) | 3692 | static int valleyview_irq_postinstall(struct drm_device *dev) |
3777 | { | 3693 | { |
3778 | struct drm_i915_private *dev_priv = dev->dev_private; | 3694 | struct drm_i915_private *dev_priv = to_i915(dev); |
3779 | 3695 | ||
3780 | gen5_gt_irq_postinstall(dev); | 3696 | gen5_gt_irq_postinstall(dev); |
3781 | 3697 | ||
@@ -3827,6 +3743,7 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv) | |||
3827 | uint32_t de_pipe_enables; | 3743 | uint32_t de_pipe_enables; |
3828 | u32 de_port_masked = GEN8_AUX_CHANNEL_A; | 3744 | u32 de_port_masked = GEN8_AUX_CHANNEL_A; |
3829 | u32 de_port_enables; | 3745 | u32 de_port_enables; |
3746 | u32 de_misc_masked = GEN8_DE_MISC_GSE; | ||
3830 | enum pipe pipe; | 3747 | enum pipe pipe; |
3831 | 3748 | ||
3832 | if (INTEL_INFO(dev_priv)->gen >= 9) { | 3749 | if (INTEL_INFO(dev_priv)->gen >= 9) { |
@@ -3862,11 +3779,12 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv) | |||
3862 | de_pipe_enables); | 3779 | de_pipe_enables); |
3863 | 3780 | ||
3864 | GEN5_IRQ_INIT(GEN8_DE_PORT_, ~de_port_masked, de_port_enables); | 3781 | GEN5_IRQ_INIT(GEN8_DE_PORT_, ~de_port_masked, de_port_enables); |
3782 | GEN5_IRQ_INIT(GEN8_DE_MISC_, ~de_misc_masked, de_misc_masked); | ||
3865 | } | 3783 | } |
3866 | 3784 | ||
3867 | static int gen8_irq_postinstall(struct drm_device *dev) | 3785 | static int gen8_irq_postinstall(struct drm_device *dev) |
3868 | { | 3786 | { |
3869 | struct drm_i915_private *dev_priv = dev->dev_private; | 3787 | struct drm_i915_private *dev_priv = to_i915(dev); |
3870 | 3788 | ||
3871 | if (HAS_PCH_SPLIT(dev)) | 3789 | if (HAS_PCH_SPLIT(dev)) |
3872 | ibx_irq_pre_postinstall(dev); | 3790 | ibx_irq_pre_postinstall(dev); |
@@ -3885,7 +3803,7 @@ static int gen8_irq_postinstall(struct drm_device *dev) | |||
3885 | 3803 | ||
3886 | static int cherryview_irq_postinstall(struct drm_device *dev) | 3804 | static int cherryview_irq_postinstall(struct drm_device *dev) |
3887 | { | 3805 | { |
3888 | struct drm_i915_private *dev_priv = dev->dev_private; | 3806 | struct drm_i915_private *dev_priv = to_i915(dev); |
3889 | 3807 | ||
3890 | gen8_gt_irq_postinstall(dev_priv); | 3808 | gen8_gt_irq_postinstall(dev_priv); |
3891 | 3809 | ||
@@ -3902,7 +3820,7 @@ static int cherryview_irq_postinstall(struct drm_device *dev) | |||
3902 | 3820 | ||
3903 | static void gen8_irq_uninstall(struct drm_device *dev) | 3821 | static void gen8_irq_uninstall(struct drm_device *dev) |
3904 | { | 3822 | { |
3905 | struct drm_i915_private *dev_priv = dev->dev_private; | 3823 | struct drm_i915_private *dev_priv = to_i915(dev); |
3906 | 3824 | ||
3907 | if (!dev_priv) | 3825 | if (!dev_priv) |
3908 | return; | 3826 | return; |
@@ -3912,7 +3830,7 @@ static void gen8_irq_uninstall(struct drm_device *dev) | |||
3912 | 3830 | ||
3913 | static void valleyview_irq_uninstall(struct drm_device *dev) | 3831 | static void valleyview_irq_uninstall(struct drm_device *dev) |
3914 | { | 3832 | { |
3915 | struct drm_i915_private *dev_priv = dev->dev_private; | 3833 | struct drm_i915_private *dev_priv = to_i915(dev); |
3916 | 3834 | ||
3917 | if (!dev_priv) | 3835 | if (!dev_priv) |
3918 | return; | 3836 | return; |
@@ -3932,7 +3850,7 @@ static void valleyview_irq_uninstall(struct drm_device *dev) | |||
3932 | 3850 | ||
3933 | static void cherryview_irq_uninstall(struct drm_device *dev) | 3851 | static void cherryview_irq_uninstall(struct drm_device *dev) |
3934 | { | 3852 | { |
3935 | struct drm_i915_private *dev_priv = dev->dev_private; | 3853 | struct drm_i915_private *dev_priv = to_i915(dev); |
3936 | 3854 | ||
3937 | if (!dev_priv) | 3855 | if (!dev_priv) |
3938 | return; | 3856 | return; |
@@ -3952,7 +3870,7 @@ static void cherryview_irq_uninstall(struct drm_device *dev) | |||
3952 | 3870 | ||
3953 | static void ironlake_irq_uninstall(struct drm_device *dev) | 3871 | static void ironlake_irq_uninstall(struct drm_device *dev) |
3954 | { | 3872 | { |
3955 | struct drm_i915_private *dev_priv = dev->dev_private; | 3873 | struct drm_i915_private *dev_priv = to_i915(dev); |
3956 | 3874 | ||
3957 | if (!dev_priv) | 3875 | if (!dev_priv) |
3958 | return; | 3876 | return; |
@@ -3962,7 +3880,7 @@ static void ironlake_irq_uninstall(struct drm_device *dev) | |||
3962 | 3880 | ||
3963 | static void i8xx_irq_preinstall(struct drm_device * dev) | 3881 | static void i8xx_irq_preinstall(struct drm_device * dev) |
3964 | { | 3882 | { |
3965 | struct drm_i915_private *dev_priv = dev->dev_private; | 3883 | struct drm_i915_private *dev_priv = to_i915(dev); |
3966 | int pipe; | 3884 | int pipe; |
3967 | 3885 | ||
3968 | for_each_pipe(dev_priv, pipe) | 3886 | for_each_pipe(dev_priv, pipe) |
@@ -3974,7 +3892,7 @@ static void i8xx_irq_preinstall(struct drm_device * dev) | |||
3974 | 3892 | ||
3975 | static int i8xx_irq_postinstall(struct drm_device *dev) | 3893 | static int i8xx_irq_postinstall(struct drm_device *dev) |
3976 | { | 3894 | { |
3977 | struct drm_i915_private *dev_priv = dev->dev_private; | 3895 | struct drm_i915_private *dev_priv = to_i915(dev); |
3978 | 3896 | ||
3979 | I915_WRITE16(EMR, | 3897 | I915_WRITE16(EMR, |
3980 | ~(I915_ERROR_PAGE_TABLE | I915_ERROR_MEMORY_REFRESH)); | 3898 | ~(I915_ERROR_PAGE_TABLE | I915_ERROR_MEMORY_REFRESH)); |
@@ -4006,13 +3924,12 @@ static int i8xx_irq_postinstall(struct drm_device *dev) | |||
4006 | /* | 3924 | /* |
4007 | * Returns true when a page flip has completed. | 3925 | * Returns true when a page flip has completed. |
4008 | */ | 3926 | */ |
4009 | static bool i8xx_handle_vblank(struct drm_device *dev, | 3927 | static bool i8xx_handle_vblank(struct drm_i915_private *dev_priv, |
4010 | int plane, int pipe, u32 iir) | 3928 | int plane, int pipe, u32 iir) |
4011 | { | 3929 | { |
4012 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
4013 | u16 flip_pending = DISPLAY_PLANE_FLIP_PENDING(plane); | 3930 | u16 flip_pending = DISPLAY_PLANE_FLIP_PENDING(plane); |
4014 | 3931 | ||
4015 | if (!intel_pipe_handle_vblank(dev, pipe)) | 3932 | if (!intel_pipe_handle_vblank(dev_priv, pipe)) |
4016 | return false; | 3933 | return false; |
4017 | 3934 | ||
4018 | if ((iir & flip_pending) == 0) | 3935 | if ((iir & flip_pending) == 0) |
@@ -4027,19 +3944,18 @@ static bool i8xx_handle_vblank(struct drm_device *dev, | |||
4027 | if (I915_READ16(ISR) & flip_pending) | 3944 | if (I915_READ16(ISR) & flip_pending) |
4028 | goto check_page_flip; | 3945 | goto check_page_flip; |
4029 | 3946 | ||
4030 | intel_prepare_page_flip(dev, plane); | 3947 | intel_finish_page_flip_cs(dev_priv, pipe); |
4031 | intel_finish_page_flip(dev, pipe); | ||
4032 | return true; | 3948 | return true; |
4033 | 3949 | ||
4034 | check_page_flip: | 3950 | check_page_flip: |
4035 | intel_check_page_flip(dev, pipe); | 3951 | intel_check_page_flip(dev_priv, pipe); |
4036 | return false; | 3952 | return false; |
4037 | } | 3953 | } |
4038 | 3954 | ||
4039 | static irqreturn_t i8xx_irq_handler(int irq, void *arg) | 3955 | static irqreturn_t i8xx_irq_handler(int irq, void *arg) |
4040 | { | 3956 | { |
4041 | struct drm_device *dev = arg; | 3957 | struct drm_device *dev = arg; |
4042 | struct drm_i915_private *dev_priv = dev->dev_private; | 3958 | struct drm_i915_private *dev_priv = to_i915(dev); |
4043 | u16 iir, new_iir; | 3959 | u16 iir, new_iir; |
4044 | u32 pipe_stats[2]; | 3960 | u32 pipe_stats[2]; |
4045 | int pipe; | 3961 | int pipe; |
@@ -4089,15 +4005,15 @@ static irqreturn_t i8xx_irq_handler(int irq, void *arg) | |||
4089 | 4005 | ||
4090 | for_each_pipe(dev_priv, pipe) { | 4006 | for_each_pipe(dev_priv, pipe) { |
4091 | int plane = pipe; | 4007 | int plane = pipe; |
4092 | if (HAS_FBC(dev)) | 4008 | if (HAS_FBC(dev_priv)) |
4093 | plane = !plane; | 4009 | plane = !plane; |
4094 | 4010 | ||
4095 | if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS && | 4011 | if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS && |
4096 | i8xx_handle_vblank(dev, plane, pipe, iir)) | 4012 | i8xx_handle_vblank(dev_priv, plane, pipe, iir)) |
4097 | flip_mask &= ~DISPLAY_PLANE_FLIP_PENDING(plane); | 4013 | flip_mask &= ~DISPLAY_PLANE_FLIP_PENDING(plane); |
4098 | 4014 | ||
4099 | if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS) | 4015 | if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS) |
4100 | i9xx_pipe_crc_irq_handler(dev, pipe); | 4016 | i9xx_pipe_crc_irq_handler(dev_priv, pipe); |
4101 | 4017 | ||
4102 | if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS) | 4018 | if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS) |
4103 | intel_cpu_fifo_underrun_irq_handler(dev_priv, | 4019 | intel_cpu_fifo_underrun_irq_handler(dev_priv, |
@@ -4116,7 +4032,7 @@ out: | |||
4116 | 4032 | ||
4117 | static void i8xx_irq_uninstall(struct drm_device * dev) | 4033 | static void i8xx_irq_uninstall(struct drm_device * dev) |
4118 | { | 4034 | { |
4119 | struct drm_i915_private *dev_priv = dev->dev_private; | 4035 | struct drm_i915_private *dev_priv = to_i915(dev); |
4120 | int pipe; | 4036 | int pipe; |
4121 | 4037 | ||
4122 | for_each_pipe(dev_priv, pipe) { | 4038 | for_each_pipe(dev_priv, pipe) { |
@@ -4131,7 +4047,7 @@ static void i8xx_irq_uninstall(struct drm_device * dev) | |||
4131 | 4047 | ||
4132 | static void i915_irq_preinstall(struct drm_device * dev) | 4048 | static void i915_irq_preinstall(struct drm_device * dev) |
4133 | { | 4049 | { |
4134 | struct drm_i915_private *dev_priv = dev->dev_private; | 4050 | struct drm_i915_private *dev_priv = to_i915(dev); |
4135 | int pipe; | 4051 | int pipe; |
4136 | 4052 | ||
4137 | if (I915_HAS_HOTPLUG(dev)) { | 4053 | if (I915_HAS_HOTPLUG(dev)) { |
@@ -4149,7 +4065,7 @@ static void i915_irq_preinstall(struct drm_device * dev) | |||
4149 | 4065 | ||
4150 | static int i915_irq_postinstall(struct drm_device *dev) | 4066 | static int i915_irq_postinstall(struct drm_device *dev) |
4151 | { | 4067 | { |
4152 | struct drm_i915_private *dev_priv = dev->dev_private; | 4068 | struct drm_i915_private *dev_priv = to_i915(dev); |
4153 | u32 enable_mask; | 4069 | u32 enable_mask; |
4154 | 4070 | ||
4155 | I915_WRITE(EMR, ~(I915_ERROR_PAGE_TABLE | I915_ERROR_MEMORY_REFRESH)); | 4071 | I915_WRITE(EMR, ~(I915_ERROR_PAGE_TABLE | I915_ERROR_MEMORY_REFRESH)); |
@@ -4182,7 +4098,7 @@ static int i915_irq_postinstall(struct drm_device *dev) | |||
4182 | I915_WRITE(IER, enable_mask); | 4098 | I915_WRITE(IER, enable_mask); |
4183 | POSTING_READ(IER); | 4099 | POSTING_READ(IER); |
4184 | 4100 | ||
4185 | i915_enable_asle_pipestat(dev); | 4101 | i915_enable_asle_pipestat(dev_priv); |
4186 | 4102 | ||
4187 | /* Interrupt setup is already guaranteed to be single-threaded, this is | 4103 | /* Interrupt setup is already guaranteed to be single-threaded, this is |
4188 | * just to make the assert_spin_locked check happy. */ | 4104 | * just to make the assert_spin_locked check happy. */ |
@@ -4197,13 +4113,12 @@ static int i915_irq_postinstall(struct drm_device *dev) | |||
4197 | /* | 4113 | /* |
4198 | * Returns true when a page flip has completed. | 4114 | * Returns true when a page flip has completed. |
4199 | */ | 4115 | */ |
4200 | static bool i915_handle_vblank(struct drm_device *dev, | 4116 | static bool i915_handle_vblank(struct drm_i915_private *dev_priv, |
4201 | int plane, int pipe, u32 iir) | 4117 | int plane, int pipe, u32 iir) |
4202 | { | 4118 | { |
4203 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
4204 | u32 flip_pending = DISPLAY_PLANE_FLIP_PENDING(plane); | 4119 | u32 flip_pending = DISPLAY_PLANE_FLIP_PENDING(plane); |
4205 | 4120 | ||
4206 | if (!intel_pipe_handle_vblank(dev, pipe)) | 4121 | if (!intel_pipe_handle_vblank(dev_priv, pipe)) |
4207 | return false; | 4122 | return false; |
4208 | 4123 | ||
4209 | if ((iir & flip_pending) == 0) | 4124 | if ((iir & flip_pending) == 0) |
@@ -4218,19 +4133,18 @@ static bool i915_handle_vblank(struct drm_device *dev, | |||
4218 | if (I915_READ(ISR) & flip_pending) | 4133 | if (I915_READ(ISR) & flip_pending) |
4219 | goto check_page_flip; | 4134 | goto check_page_flip; |
4220 | 4135 | ||
4221 | intel_prepare_page_flip(dev, plane); | 4136 | intel_finish_page_flip_cs(dev_priv, pipe); |
4222 | intel_finish_page_flip(dev, pipe); | ||
4223 | return true; | 4137 | return true; |
4224 | 4138 | ||
4225 | check_page_flip: | 4139 | check_page_flip: |
4226 | intel_check_page_flip(dev, pipe); | 4140 | intel_check_page_flip(dev_priv, pipe); |
4227 | return false; | 4141 | return false; |
4228 | } | 4142 | } |
4229 | 4143 | ||
4230 | static irqreturn_t i915_irq_handler(int irq, void *arg) | 4144 | static irqreturn_t i915_irq_handler(int irq, void *arg) |
4231 | { | 4145 | { |
4232 | struct drm_device *dev = arg; | 4146 | struct drm_device *dev = arg; |
4233 | struct drm_i915_private *dev_priv = dev->dev_private; | 4147 | struct drm_i915_private *dev_priv = to_i915(dev); |
4234 | u32 iir, new_iir, pipe_stats[I915_MAX_PIPES]; | 4148 | u32 iir, new_iir, pipe_stats[I915_MAX_PIPES]; |
4235 | u32 flip_mask = | 4149 | u32 flip_mask = |
4236 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | | 4150 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | |
@@ -4273,11 +4187,11 @@ static irqreturn_t i915_irq_handler(int irq, void *arg) | |||
4273 | break; | 4187 | break; |
4274 | 4188 | ||
4275 | /* Consume port. Then clear IIR or we'll miss events */ | 4189 | /* Consume port. Then clear IIR or we'll miss events */ |
4276 | if (I915_HAS_HOTPLUG(dev) && | 4190 | if (I915_HAS_HOTPLUG(dev_priv) && |
4277 | iir & I915_DISPLAY_PORT_INTERRUPT) { | 4191 | iir & I915_DISPLAY_PORT_INTERRUPT) { |
4278 | u32 hotplug_status = i9xx_hpd_irq_ack(dev_priv); | 4192 | u32 hotplug_status = i9xx_hpd_irq_ack(dev_priv); |
4279 | if (hotplug_status) | 4193 | if (hotplug_status) |
4280 | i9xx_hpd_irq_handler(dev, hotplug_status); | 4194 | i9xx_hpd_irq_handler(dev_priv, hotplug_status); |
4281 | } | 4195 | } |
4282 | 4196 | ||
4283 | I915_WRITE(IIR, iir & ~flip_mask); | 4197 | I915_WRITE(IIR, iir & ~flip_mask); |
@@ -4288,18 +4202,18 @@ static irqreturn_t i915_irq_handler(int irq, void *arg) | |||
4288 | 4202 | ||
4289 | for_each_pipe(dev_priv, pipe) { | 4203 | for_each_pipe(dev_priv, pipe) { |
4290 | int plane = pipe; | 4204 | int plane = pipe; |
4291 | if (HAS_FBC(dev)) | 4205 | if (HAS_FBC(dev_priv)) |
4292 | plane = !plane; | 4206 | plane = !plane; |
4293 | 4207 | ||
4294 | if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS && | 4208 | if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS && |
4295 | i915_handle_vblank(dev, plane, pipe, iir)) | 4209 | i915_handle_vblank(dev_priv, plane, pipe, iir)) |
4296 | flip_mask &= ~DISPLAY_PLANE_FLIP_PENDING(plane); | 4210 | flip_mask &= ~DISPLAY_PLANE_FLIP_PENDING(plane); |
4297 | 4211 | ||
4298 | if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS) | 4212 | if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS) |
4299 | blc_event = true; | 4213 | blc_event = true; |
4300 | 4214 | ||
4301 | if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS) | 4215 | if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS) |
4302 | i9xx_pipe_crc_irq_handler(dev, pipe); | 4216 | i9xx_pipe_crc_irq_handler(dev_priv, pipe); |
4303 | 4217 | ||
4304 | if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS) | 4218 | if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS) |
4305 | intel_cpu_fifo_underrun_irq_handler(dev_priv, | 4219 | intel_cpu_fifo_underrun_irq_handler(dev_priv, |
@@ -4307,7 +4221,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg) | |||
4307 | } | 4221 | } |
4308 | 4222 | ||
4309 | if (blc_event || (iir & I915_ASLE_INTERRUPT)) | 4223 | if (blc_event || (iir & I915_ASLE_INTERRUPT)) |
4310 | intel_opregion_asle_intr(dev); | 4224 | intel_opregion_asle_intr(dev_priv); |
4311 | 4225 | ||
4312 | /* With MSI, interrupts are only generated when iir | 4226 | /* With MSI, interrupts are only generated when iir |
4313 | * transitions from zero to nonzero. If another bit got | 4227 | * transitions from zero to nonzero. If another bit got |
@@ -4335,7 +4249,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg) | |||
4335 | 4249 | ||
4336 | static void i915_irq_uninstall(struct drm_device * dev) | 4250 | static void i915_irq_uninstall(struct drm_device * dev) |
4337 | { | 4251 | { |
4338 | struct drm_i915_private *dev_priv = dev->dev_private; | 4252 | struct drm_i915_private *dev_priv = to_i915(dev); |
4339 | int pipe; | 4253 | int pipe; |
4340 | 4254 | ||
4341 | if (I915_HAS_HOTPLUG(dev)) { | 4255 | if (I915_HAS_HOTPLUG(dev)) { |
@@ -4357,7 +4271,7 @@ static void i915_irq_uninstall(struct drm_device * dev) | |||
4357 | 4271 | ||
4358 | static void i965_irq_preinstall(struct drm_device * dev) | 4272 | static void i965_irq_preinstall(struct drm_device * dev) |
4359 | { | 4273 | { |
4360 | struct drm_i915_private *dev_priv = dev->dev_private; | 4274 | struct drm_i915_private *dev_priv = to_i915(dev); |
4361 | int pipe; | 4275 | int pipe; |
4362 | 4276 | ||
4363 | i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0); | 4277 | i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0); |
@@ -4373,7 +4287,7 @@ static void i965_irq_preinstall(struct drm_device * dev) | |||
4373 | 4287 | ||
4374 | static int i965_irq_postinstall(struct drm_device *dev) | 4288 | static int i965_irq_postinstall(struct drm_device *dev) |
4375 | { | 4289 | { |
4376 | struct drm_i915_private *dev_priv = dev->dev_private; | 4290 | struct drm_i915_private *dev_priv = to_i915(dev); |
4377 | u32 enable_mask; | 4291 | u32 enable_mask; |
4378 | u32 error_mask; | 4292 | u32 error_mask; |
4379 | 4293 | ||
@@ -4391,7 +4305,7 @@ static int i965_irq_postinstall(struct drm_device *dev) | |||
4391 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT); | 4305 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT); |
4392 | enable_mask |= I915_USER_INTERRUPT; | 4306 | enable_mask |= I915_USER_INTERRUPT; |
4393 | 4307 | ||
4394 | if (IS_G4X(dev)) | 4308 | if (IS_G4X(dev_priv)) |
4395 | enable_mask |= I915_BSD_USER_INTERRUPT; | 4309 | enable_mask |= I915_BSD_USER_INTERRUPT; |
4396 | 4310 | ||
4397 | /* Interrupt setup is already guaranteed to be single-threaded, this is | 4311 | /* Interrupt setup is already guaranteed to be single-threaded, this is |
@@ -4406,7 +4320,7 @@ static int i965_irq_postinstall(struct drm_device *dev) | |||
4406 | * Enable some error detection, note the instruction error mask | 4320 | * Enable some error detection, note the instruction error mask |
4407 | * bit is reserved, so we leave it masked. | 4321 | * bit is reserved, so we leave it masked. |
4408 | */ | 4322 | */ |
4409 | if (IS_G4X(dev)) { | 4323 | if (IS_G4X(dev_priv)) { |
4410 | error_mask = ~(GM45_ERROR_PAGE_TABLE | | 4324 | error_mask = ~(GM45_ERROR_PAGE_TABLE | |
4411 | GM45_ERROR_MEM_PRIV | | 4325 | GM45_ERROR_MEM_PRIV | |
4412 | GM45_ERROR_CP_PRIV | | 4326 | GM45_ERROR_CP_PRIV | |
@@ -4424,26 +4338,25 @@ static int i965_irq_postinstall(struct drm_device *dev) | |||
4424 | i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0); | 4338 | i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0); |
4425 | POSTING_READ(PORT_HOTPLUG_EN); | 4339 | POSTING_READ(PORT_HOTPLUG_EN); |
4426 | 4340 | ||
4427 | i915_enable_asle_pipestat(dev); | 4341 | i915_enable_asle_pipestat(dev_priv); |
4428 | 4342 | ||
4429 | return 0; | 4343 | return 0; |
4430 | } | 4344 | } |
4431 | 4345 | ||
4432 | static void i915_hpd_irq_setup(struct drm_device *dev) | 4346 | static void i915_hpd_irq_setup(struct drm_i915_private *dev_priv) |
4433 | { | 4347 | { |
4434 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
4435 | u32 hotplug_en; | 4348 | u32 hotplug_en; |
4436 | 4349 | ||
4437 | assert_spin_locked(&dev_priv->irq_lock); | 4350 | assert_spin_locked(&dev_priv->irq_lock); |
4438 | 4351 | ||
4439 | /* Note HDMI and DP share hotplug bits */ | 4352 | /* Note HDMI and DP share hotplug bits */ |
4440 | /* enable bits are the same for all generations */ | 4353 | /* enable bits are the same for all generations */ |
4441 | hotplug_en = intel_hpd_enabled_irqs(dev, hpd_mask_i915); | 4354 | hotplug_en = intel_hpd_enabled_irqs(dev_priv, hpd_mask_i915); |
4442 | /* Programming the CRT detection parameters tends | 4355 | /* Programming the CRT detection parameters tends |
4443 | to generate a spurious hotplug event about three | 4356 | to generate a spurious hotplug event about three |
4444 | seconds later. So just do it once. | 4357 | seconds later. So just do it once. |
4445 | */ | 4358 | */ |
4446 | if (IS_G4X(dev)) | 4359 | if (IS_G4X(dev_priv)) |
4447 | hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64; | 4360 | hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64; |
4448 | hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; | 4361 | hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; |
4449 | 4362 | ||
@@ -4458,7 +4371,7 @@ static void i915_hpd_irq_setup(struct drm_device *dev) | |||
4458 | static irqreturn_t i965_irq_handler(int irq, void *arg) | 4371 | static irqreturn_t i965_irq_handler(int irq, void *arg) |
4459 | { | 4372 | { |
4460 | struct drm_device *dev = arg; | 4373 | struct drm_device *dev = arg; |
4461 | struct drm_i915_private *dev_priv = dev->dev_private; | 4374 | struct drm_i915_private *dev_priv = to_i915(dev); |
4462 | u32 iir, new_iir; | 4375 | u32 iir, new_iir; |
4463 | u32 pipe_stats[I915_MAX_PIPES]; | 4376 | u32 pipe_stats[I915_MAX_PIPES]; |
4464 | int ret = IRQ_NONE, pipe; | 4377 | int ret = IRQ_NONE, pipe; |
@@ -4510,7 +4423,7 @@ static irqreturn_t i965_irq_handler(int irq, void *arg) | |||
4510 | if (iir & I915_DISPLAY_PORT_INTERRUPT) { | 4423 | if (iir & I915_DISPLAY_PORT_INTERRUPT) { |
4511 | u32 hotplug_status = i9xx_hpd_irq_ack(dev_priv); | 4424 | u32 hotplug_status = i9xx_hpd_irq_ack(dev_priv); |
4512 | if (hotplug_status) | 4425 | if (hotplug_status) |
4513 | i9xx_hpd_irq_handler(dev, hotplug_status); | 4426 | i9xx_hpd_irq_handler(dev_priv, hotplug_status); |
4514 | } | 4427 | } |
4515 | 4428 | ||
4516 | I915_WRITE(IIR, iir & ~flip_mask); | 4429 | I915_WRITE(IIR, iir & ~flip_mask); |
@@ -4523,24 +4436,24 @@ static irqreturn_t i965_irq_handler(int irq, void *arg) | |||
4523 | 4436 | ||
4524 | for_each_pipe(dev_priv, pipe) { | 4437 | for_each_pipe(dev_priv, pipe) { |
4525 | if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS && | 4438 | if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS && |
4526 | i915_handle_vblank(dev, pipe, pipe, iir)) | 4439 | i915_handle_vblank(dev_priv, pipe, pipe, iir)) |
4527 | flip_mask &= ~DISPLAY_PLANE_FLIP_PENDING(pipe); | 4440 | flip_mask &= ~DISPLAY_PLANE_FLIP_PENDING(pipe); |
4528 | 4441 | ||
4529 | if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS) | 4442 | if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS) |
4530 | blc_event = true; | 4443 | blc_event = true; |
4531 | 4444 | ||
4532 | if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS) | 4445 | if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS) |
4533 | i9xx_pipe_crc_irq_handler(dev, pipe); | 4446 | i9xx_pipe_crc_irq_handler(dev_priv, pipe); |
4534 | 4447 | ||
4535 | if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS) | 4448 | if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS) |
4536 | intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe); | 4449 | intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe); |
4537 | } | 4450 | } |
4538 | 4451 | ||
4539 | if (blc_event || (iir & I915_ASLE_INTERRUPT)) | 4452 | if (blc_event || (iir & I915_ASLE_INTERRUPT)) |
4540 | intel_opregion_asle_intr(dev); | 4453 | intel_opregion_asle_intr(dev_priv); |
4541 | 4454 | ||
4542 | if (pipe_stats[0] & PIPE_GMBUS_INTERRUPT_STATUS) | 4455 | if (pipe_stats[0] & PIPE_GMBUS_INTERRUPT_STATUS) |
4543 | gmbus_irq_handler(dev); | 4456 | gmbus_irq_handler(dev_priv); |
4544 | 4457 | ||
4545 | /* With MSI, interrupts are only generated when iir | 4458 | /* With MSI, interrupts are only generated when iir |
4546 | * transitions from zero to nonzero. If another bit got | 4459 | * transitions from zero to nonzero. If another bit got |
@@ -4567,7 +4480,7 @@ static irqreturn_t i965_irq_handler(int irq, void *arg) | |||
4567 | 4480 | ||
4568 | static void i965_irq_uninstall(struct drm_device * dev) | 4481 | static void i965_irq_uninstall(struct drm_device * dev) |
4569 | { | 4482 | { |
4570 | struct drm_i915_private *dev_priv = dev->dev_private; | 4483 | struct drm_i915_private *dev_priv = to_i915(dev); |
4571 | int pipe; | 4484 | int pipe; |
4572 | 4485 | ||
4573 | if (!dev_priv) | 4486 | if (!dev_priv) |
@@ -4597,7 +4510,7 @@ static void i965_irq_uninstall(struct drm_device * dev) | |||
4597 | */ | 4510 | */ |
4598 | void intel_irq_init(struct drm_i915_private *dev_priv) | 4511 | void intel_irq_init(struct drm_i915_private *dev_priv) |
4599 | { | 4512 | { |
4600 | struct drm_device *dev = dev_priv->dev; | 4513 | struct drm_device *dev = &dev_priv->drm; |
4601 | 4514 | ||
4602 | intel_hpd_init_work(dev_priv); | 4515 | intel_hpd_init_work(dev_priv); |
4603 | 4516 | ||
@@ -4611,6 +4524,20 @@ void intel_irq_init(struct drm_i915_private *dev_priv) | |||
4611 | else | 4524 | else |
4612 | dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS; | 4525 | dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS; |
4613 | 4526 | ||
4527 | dev_priv->rps.pm_intr_keep = 0; | ||
4528 | |||
4529 | /* | ||
4530 | * SNB,IVB can while VLV,CHV may hard hang on looping batchbuffer | ||
4531 | * if GEN6_PM_UP_EI_EXPIRED is masked. | ||
4532 | * | ||
4533 | * TODO: verify if this can be reproduced on VLV,CHV. | ||
4534 | */ | ||
4535 | if (INTEL_INFO(dev_priv)->gen <= 7 && !IS_HASWELL(dev_priv)) | ||
4536 | dev_priv->rps.pm_intr_keep |= GEN6_PM_RP_UP_EI_EXPIRED; | ||
4537 | |||
4538 | if (INTEL_INFO(dev_priv)->gen >= 8) | ||
4539 | dev_priv->rps.pm_intr_keep |= GEN8_PMINTR_REDIRECT_TO_NON_DISP; | ||
4540 | |||
4614 | INIT_DELAYED_WORK(&dev_priv->gpu_error.hangcheck_work, | 4541 | INIT_DELAYED_WORK(&dev_priv->gpu_error.hangcheck_work, |
4615 | i915_hangcheck_elapsed); | 4542 | i915_hangcheck_elapsed); |
4616 | 4543 | ||
@@ -4674,12 +4601,12 @@ void intel_irq_init(struct drm_i915_private *dev_priv) | |||
4674 | dev->driver->disable_vblank = ironlake_disable_vblank; | 4601 | dev->driver->disable_vblank = ironlake_disable_vblank; |
4675 | dev_priv->display.hpd_irq_setup = ilk_hpd_irq_setup; | 4602 | dev_priv->display.hpd_irq_setup = ilk_hpd_irq_setup; |
4676 | } else { | 4603 | } else { |
4677 | if (INTEL_INFO(dev_priv)->gen == 2) { | 4604 | if (IS_GEN2(dev_priv)) { |
4678 | dev->driver->irq_preinstall = i8xx_irq_preinstall; | 4605 | dev->driver->irq_preinstall = i8xx_irq_preinstall; |
4679 | dev->driver->irq_postinstall = i8xx_irq_postinstall; | 4606 | dev->driver->irq_postinstall = i8xx_irq_postinstall; |
4680 | dev->driver->irq_handler = i8xx_irq_handler; | 4607 | dev->driver->irq_handler = i8xx_irq_handler; |
4681 | dev->driver->irq_uninstall = i8xx_irq_uninstall; | 4608 | dev->driver->irq_uninstall = i8xx_irq_uninstall; |
4682 | } else if (INTEL_INFO(dev_priv)->gen == 3) { | 4609 | } else if (IS_GEN3(dev_priv)) { |
4683 | dev->driver->irq_preinstall = i915_irq_preinstall; | 4610 | dev->driver->irq_preinstall = i915_irq_preinstall; |
4684 | dev->driver->irq_postinstall = i915_irq_postinstall; | 4611 | dev->driver->irq_postinstall = i915_irq_postinstall; |
4685 | dev->driver->irq_uninstall = i915_irq_uninstall; | 4612 | dev->driver->irq_uninstall = i915_irq_uninstall; |
@@ -4717,7 +4644,7 @@ int intel_irq_install(struct drm_i915_private *dev_priv) | |||
4717 | */ | 4644 | */ |
4718 | dev_priv->pm.irqs_enabled = true; | 4645 | dev_priv->pm.irqs_enabled = true; |
4719 | 4646 | ||
4720 | return drm_irq_install(dev_priv->dev, dev_priv->dev->pdev->irq); | 4647 | return drm_irq_install(&dev_priv->drm, dev_priv->drm.pdev->irq); |
4721 | } | 4648 | } |
4722 | 4649 | ||
4723 | /** | 4650 | /** |
@@ -4729,7 +4656,7 @@ int intel_irq_install(struct drm_i915_private *dev_priv) | |||
4729 | */ | 4656 | */ |
4730 | void intel_irq_uninstall(struct drm_i915_private *dev_priv) | 4657 | void intel_irq_uninstall(struct drm_i915_private *dev_priv) |
4731 | { | 4658 | { |
4732 | drm_irq_uninstall(dev_priv->dev); | 4659 | drm_irq_uninstall(&dev_priv->drm); |
4733 | intel_hpd_cancel_work(dev_priv); | 4660 | intel_hpd_cancel_work(dev_priv); |
4734 | dev_priv->pm.irqs_enabled = false; | 4661 | dev_priv->pm.irqs_enabled = false; |
4735 | } | 4662 | } |
@@ -4743,9 +4670,9 @@ void intel_irq_uninstall(struct drm_i915_private *dev_priv) | |||
4743 | */ | 4670 | */ |
4744 | void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv) | 4671 | void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv) |
4745 | { | 4672 | { |
4746 | dev_priv->dev->driver->irq_uninstall(dev_priv->dev); | 4673 | dev_priv->drm.driver->irq_uninstall(&dev_priv->drm); |
4747 | dev_priv->pm.irqs_enabled = false; | 4674 | dev_priv->pm.irqs_enabled = false; |
4748 | synchronize_irq(dev_priv->dev->irq); | 4675 | synchronize_irq(dev_priv->drm.irq); |
4749 | } | 4676 | } |
4750 | 4677 | ||
4751 | /** | 4678 | /** |
@@ -4758,6 +4685,6 @@ void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv) | |||
4758 | void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv) | 4685 | void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv) |
4759 | { | 4686 | { |
4760 | dev_priv->pm.irqs_enabled = true; | 4687 | dev_priv->pm.irqs_enabled = true; |
4761 | dev_priv->dev->driver->irq_preinstall(dev_priv->dev); | 4688 | dev_priv->drm.driver->irq_preinstall(&dev_priv->drm); |
4762 | dev_priv->dev->driver->irq_postinstall(dev_priv->dev); | 4689 | dev_priv->drm.driver->irq_postinstall(&dev_priv->drm); |
4763 | } | 4690 | } |