Rev 6937 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6937 | Rev 7144 | ||
---|---|---|---|
Line 327... | Line 327... | ||
327 | dev_priv->ellc_size = 128; |
327 | dev_priv->ellc_size = 128; |
328 | DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size); |
328 | DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size); |
329 | } |
329 | } |
330 | } |
330 | } |
Line -... | Line 331... | ||
- | 331 | ||
- | 332 | static bool |
|
- | 333 | fpga_check_for_unclaimed_mmio(struct drm_i915_private *dev_priv) |
|
- | 334 | { |
|
- | 335 | u32 dbg; |
|
- | 336 | ||
- | 337 | dbg = __raw_i915_read32(dev_priv, FPGA_DBG); |
|
- | 338 | if (likely(!(dbg & FPGA_DBG_RM_NOCLAIM))) |
|
- | 339 | return false; |
|
- | 340 | ||
- | 341 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
|
- | 342 | ||
- | 343 | return true; |
|
- | 344 | } |
|
- | 345 | ||
- | 346 | static bool |
|
- | 347 | vlv_check_for_unclaimed_mmio(struct drm_i915_private *dev_priv) |
|
- | 348 | { |
|
- | 349 | u32 cer; |
|
- | 350 | ||
- | 351 | cer = __raw_i915_read32(dev_priv, CLAIM_ER); |
|
- | 352 | if (likely(!(cer & (CLAIM_ER_OVERFLOW | CLAIM_ER_CTR_MASK)))) |
|
- | 353 | return false; |
|
- | 354 | ||
- | 355 | __raw_i915_write32(dev_priv, CLAIM_ER, CLAIM_ER_CLR); |
|
- | 356 | ||
- | 357 | return true; |
|
- | 358 | } |
|
- | 359 | ||
- | 360 | static bool |
|
- | 361 | check_for_unclaimed_mmio(struct drm_i915_private *dev_priv) |
|
- | 362 | { |
|
- | 363 | if (HAS_FPGA_DBG_UNCLAIMED(dev_priv)) |
|
- | 364 | return fpga_check_for_unclaimed_mmio(dev_priv); |
|
- | 365 | ||
- | 366 | if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) |
|
- | 367 | return vlv_check_for_unclaimed_mmio(dev_priv); |
|
- | 368 | ||
- | 369 | return false; |
|
- | 370 | } |
|
331 | 371 | ||
332 | static void __intel_uncore_early_sanitize(struct drm_device *dev, |
372 | static void __intel_uncore_early_sanitize(struct drm_device *dev, |
333 | bool restore_forcewake) |
373 | bool restore_forcewake) |
334 | { |
374 | { |
Line -... | Line 375... | ||
- | 375 | struct drm_i915_private *dev_priv = dev->dev_private; |
|
335 | struct drm_i915_private *dev_priv = dev->dev_private; |
376 | |
336 | 377 | /* clear out unclaimed reg detection bit */ |
|
Line 337... | Line 378... | ||
337 | if (HAS_FPGA_DBG_UNCLAIMED(dev)) |
378 | if (check_for_unclaimed_mmio(dev_priv)) |
338 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
379 | DRM_DEBUG("unclaimed mmio detected on uncore init, clearing\n"); |
339 | 380 | ||
340 | /* clear out old GT FIFO errors */ |
381 | /* clear out old GT FIFO errors */ |
Line 359... | Line 400... | ||
359 | i915_check_and_clear_faults(dev); |
400 | i915_check_and_clear_faults(dev); |
360 | } |
401 | } |
Line 361... | Line 402... | ||
361 | 402 | ||
362 | void intel_uncore_sanitize(struct drm_device *dev) |
403 | void intel_uncore_sanitize(struct drm_device *dev) |
- | 404 | { |
|
- | 405 | i915.enable_rc6 = sanitize_rc6_option(dev, i915.enable_rc6); |
|
363 | { |
406 | |
364 | /* BIOS often leaves RC6 enabled, but disable it for hw init */ |
407 | /* BIOS often leaves RC6 enabled, but disable it for hw init */ |
365 | intel_disable_gt_powersave(dev); |
408 | intel_disable_gt_powersave(dev); |
Line 366... | Line 409... | ||
366 | } |
409 | } |
Line 585... | Line 628... | ||
585 | * hence harmless to write 0 into. */ |
628 | * hence harmless to write 0 into. */ |
586 | __raw_i915_write32(dev_priv, MI_MODE, 0); |
629 | __raw_i915_write32(dev_priv, MI_MODE, 0); |
587 | } |
630 | } |
Line 588... | Line 631... | ||
588 | 631 | ||
589 | static void |
632 | static void |
- | 633 | __unclaimed_reg_debug(struct drm_i915_private *dev_priv, |
|
- | 634 | const i915_reg_t reg, |
|
590 | hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv, |
635 | const bool read, |
591 | i915_reg_t reg, bool read, bool before) |
636 | const bool before) |
592 | { |
637 | { |
- | 638 | /* XXX. We limit the auto arming traces for mmio |
|
- | 639 | * debugs on these platforms. There are just too many |
|
593 | const char *op = read ? "reading" : "writing to"; |
640 | * revealed by these and CI/Bat suffers from the noise. |
594 | const char *when = before ? "before" : "after"; |
641 | * Please fix and then re-enable the automatic traces. |
595 | 642 | */ |
|
- | 643 | if (i915.mmio_debug < 2 && |
|
596 | if (!i915.mmio_debug) |
644 | (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))) |
Line 597... | Line 645... | ||
597 | return; |
645 | return; |
598 | 646 | ||
599 | if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) { |
647 | if (WARN(check_for_unclaimed_mmio(dev_priv), |
- | 648 | "Unclaimed register detected %s %s register 0x%x\n", |
|
600 | WARN(1, "Unclaimed register detected %s %s register 0x%x\n", |
649 | before ? "before" : "after", |
601 | when, op, i915_mmio_reg_offset(reg)); |
650 | read ? "reading" : "writing to", |
602 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
651 | i915_mmio_reg_offset(reg))) |
603 | i915.mmio_debug--; /* Only report the first N failures */ |
- | |
Line 604... | Line 652... | ||
604 | } |
652 | i915.mmio_debug--; /* Only report the first N failures */ |
605 | } |
653 | } |
- | 654 | ||
- | 655 | static inline void |
|
- | 656 | unclaimed_reg_debug(struct drm_i915_private *dev_priv, |
|
606 | 657 | const i915_reg_t reg, |
|
607 | static void |
- | |
608 | hsw_unclaimed_reg_detect(struct drm_i915_private *dev_priv) |
- | |
609 | { |
658 | const bool read, |
610 | static bool mmio_debug_once = true; |
659 | const bool before) |
Line 611... | Line -... | ||
611 | - | ||
612 | if (i915.mmio_debug || !mmio_debug_once) |
- | |
613 | return; |
- | |
614 | - | ||
615 | if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) { |
660 | { |
616 | DRM_DEBUG("Unclaimed register detected, " |
- | |
617 | "enabling oneshot unclaimed register reporting. " |
- | |
618 | "Please use i915.mmio_debug=N for more information.\n"); |
661 | if (likely(!i915.mmio_debug)) |
Line 619... | Line 662... | ||
619 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
662 | return; |
620 | i915.mmio_debug = mmio_debug_once--; |
663 | |
621 | } |
664 | __unclaimed_reg_debug(dev_priv, reg, read, before); |
Line 664... | Line 707... | ||
664 | #define GEN6_READ_HEADER(x) \ |
707 | #define GEN6_READ_HEADER(x) \ |
665 | u32 offset = i915_mmio_reg_offset(reg); \ |
708 | u32 offset = i915_mmio_reg_offset(reg); \ |
666 | unsigned long irqflags; \ |
709 | unsigned long irqflags; \ |
667 | u##x val = 0; \ |
710 | u##x val = 0; \ |
668 | assert_rpm_wakelock_held(dev_priv); \ |
711 | assert_rpm_wakelock_held(dev_priv); \ |
669 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) |
712 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); \ |
- | 713 | unclaimed_reg_debug(dev_priv, reg, true, true) |
|
Line 670... | Line 714... | ||
670 | 714 | ||
- | 715 | #define GEN6_READ_FOOTER \ |
|
671 | #define GEN6_READ_FOOTER \ |
716 | unclaimed_reg_debug(dev_priv, reg, true, false); \ |
672 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \ |
717 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \ |
673 | trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \ |
718 | trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \ |
Line 674... | Line 719... | ||
674 | return val |
719 | return val |
Line 699... | Line 744... | ||
699 | 744 | ||
700 | #define __gen6_read(x) \ |
745 | #define __gen6_read(x) \ |
701 | static u##x \ |
746 | static u##x \ |
702 | gen6_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
747 | gen6_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
703 | GEN6_READ_HEADER(x); \ |
- | |
704 | hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \ |
748 | GEN6_READ_HEADER(x); \ |
705 | if (NEEDS_FORCE_WAKE(offset)) \ |
749 | if (NEEDS_FORCE_WAKE(offset)) \ |
706 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
750 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
707 | val = __raw_i915_read##x(dev_priv, reg); \ |
- | |
708 | hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \ |
751 | val = __raw_i915_read##x(dev_priv, reg); \ |
709 | GEN6_READ_FOOTER; \ |
752 | GEN6_READ_FOOTER; \ |
Line 710... | Line 753... | ||
710 | } |
753 | } |
711 | 754 | ||
Line 751... | Line 794... | ||
751 | #define __gen9_read(x) \ |
794 | #define __gen9_read(x) \ |
752 | static u##x \ |
795 | static u##x \ |
753 | gen9_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
796 | gen9_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
754 | enum forcewake_domains fw_engine; \ |
797 | enum forcewake_domains fw_engine; \ |
755 | GEN6_READ_HEADER(x); \ |
798 | GEN6_READ_HEADER(x); \ |
756 | hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \ |
- | |
757 | if (!SKL_NEEDS_FORCE_WAKE(offset)) \ |
799 | if (!SKL_NEEDS_FORCE_WAKE(offset)) \ |
758 | fw_engine = 0; \ |
800 | fw_engine = 0; \ |
759 | else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \ |
801 | else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \ |
760 | fw_engine = FORCEWAKE_RENDER; \ |
802 | fw_engine = FORCEWAKE_RENDER; \ |
761 | else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \ |
803 | else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \ |
Line 765... | Line 807... | ||
765 | else \ |
807 | else \ |
766 | fw_engine = FORCEWAKE_BLITTER; \ |
808 | fw_engine = FORCEWAKE_BLITTER; \ |
767 | if (fw_engine) \ |
809 | if (fw_engine) \ |
768 | __force_wake_get(dev_priv, fw_engine); \ |
810 | __force_wake_get(dev_priv, fw_engine); \ |
769 | val = __raw_i915_read##x(dev_priv, reg); \ |
811 | val = __raw_i915_read##x(dev_priv, reg); \ |
770 | hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \ |
- | |
771 | GEN6_READ_FOOTER; \ |
812 | GEN6_READ_FOOTER; \ |
772 | } |
813 | } |
Line 773... | Line 814... | ||
773 | 814 | ||
774 | __gen9_read(8) |
815 | __gen9_read(8) |
Line 864... | Line 905... | ||
864 | #define GEN6_WRITE_HEADER \ |
905 | #define GEN6_WRITE_HEADER \ |
865 | u32 offset = i915_mmio_reg_offset(reg); \ |
906 | u32 offset = i915_mmio_reg_offset(reg); \ |
866 | unsigned long irqflags; \ |
907 | unsigned long irqflags; \ |
867 | trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ |
908 | trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ |
868 | assert_rpm_wakelock_held(dev_priv); \ |
909 | assert_rpm_wakelock_held(dev_priv); \ |
869 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) |
910 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); \ |
- | 911 | unclaimed_reg_debug(dev_priv, reg, false, true) |
|
Line 870... | Line 912... | ||
870 | 912 | ||
- | 913 | #define GEN6_WRITE_FOOTER \ |
|
871 | #define GEN6_WRITE_FOOTER \ |
914 | unclaimed_reg_debug(dev_priv, reg, false, false); \ |
Line 872... | Line 915... | ||
872 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags) |
915 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags) |
873 | 916 | ||
874 | #define __gen6_write(x) \ |
917 | #define __gen6_write(x) \ |
Line 892... | Line 935... | ||
892 | u32 __fifo_ret = 0; \ |
935 | u32 __fifo_ret = 0; \ |
893 | GEN6_WRITE_HEADER; \ |
936 | GEN6_WRITE_HEADER; \ |
894 | if (NEEDS_FORCE_WAKE(offset)) { \ |
937 | if (NEEDS_FORCE_WAKE(offset)) { \ |
895 | __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ |
938 | __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ |
896 | } \ |
939 | } \ |
897 | hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ |
- | |
898 | __raw_i915_write##x(dev_priv, reg, val); \ |
940 | __raw_i915_write##x(dev_priv, reg, val); \ |
899 | if (unlikely(__fifo_ret)) { \ |
941 | if (unlikely(__fifo_ret)) { \ |
900 | gen6_gt_check_fifodbg(dev_priv); \ |
942 | gen6_gt_check_fifodbg(dev_priv); \ |
901 | } \ |
943 | } \ |
902 | hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \ |
- | |
903 | hsw_unclaimed_reg_detect(dev_priv); \ |
- | |
904 | GEN6_WRITE_FOOTER; \ |
944 | GEN6_WRITE_FOOTER; \ |
905 | } |
945 | } |
Line 906... | Line 946... | ||
906 | 946 | ||
907 | static const i915_reg_t gen8_shadowed_regs[] = { |
947 | static const i915_reg_t gen8_shadowed_regs[] = { |
Line 928... | Line 968... | ||
928 | 968 | ||
929 | #define __gen8_write(x) \ |
969 | #define __gen8_write(x) \ |
930 | static void \ |
970 | static void \ |
931 | gen8_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \ |
971 | gen8_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \ |
932 | GEN6_WRITE_HEADER; \ |
- | |
933 | hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ |
972 | GEN6_WRITE_HEADER; \ |
934 | if (NEEDS_FORCE_WAKE(offset) && !is_gen8_shadowed(dev_priv, reg)) \ |
973 | if (NEEDS_FORCE_WAKE(offset) && !is_gen8_shadowed(dev_priv, reg)) \ |
935 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
974 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
936 | __raw_i915_write##x(dev_priv, reg, val); \ |
- | |
937 | hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \ |
- | |
938 | hsw_unclaimed_reg_detect(dev_priv); \ |
975 | __raw_i915_write##x(dev_priv, reg, val); \ |
939 | GEN6_WRITE_FOOTER; \ |
976 | GEN6_WRITE_FOOTER; \ |
Line 940... | Line 977... | ||
940 | } |
977 | } |
941 | 978 | ||
Line 987... | Line 1024... | ||
987 | static void \ |
1024 | static void \ |
988 | gen9_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, \ |
1025 | gen9_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, \ |
989 | bool trace) { \ |
1026 | bool trace) { \ |
990 | enum forcewake_domains fw_engine; \ |
1027 | enum forcewake_domains fw_engine; \ |
991 | GEN6_WRITE_HEADER; \ |
1028 | GEN6_WRITE_HEADER; \ |
992 | hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ |
- | |
993 | if (!SKL_NEEDS_FORCE_WAKE(offset) || \ |
1029 | if (!SKL_NEEDS_FORCE_WAKE(offset) || \ |
994 | is_gen9_shadowed(dev_priv, reg)) \ |
1030 | is_gen9_shadowed(dev_priv, reg)) \ |
995 | fw_engine = 0; \ |
1031 | fw_engine = 0; \ |
996 | else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \ |
1032 | else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \ |
997 | fw_engine = FORCEWAKE_RENDER; \ |
1033 | fw_engine = FORCEWAKE_RENDER; \ |
Line 1002... | Line 1038... | ||
1002 | else \ |
1038 | else \ |
1003 | fw_engine = FORCEWAKE_BLITTER; \ |
1039 | fw_engine = FORCEWAKE_BLITTER; \ |
1004 | if (fw_engine) \ |
1040 | if (fw_engine) \ |
1005 | __force_wake_get(dev_priv, fw_engine); \ |
1041 | __force_wake_get(dev_priv, fw_engine); \ |
1006 | __raw_i915_write##x(dev_priv, reg, val); \ |
1042 | __raw_i915_write##x(dev_priv, reg, val); \ |
1007 | hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \ |
- | |
1008 | hsw_unclaimed_reg_detect(dev_priv); \ |
- | |
1009 | GEN6_WRITE_FOOTER; \ |
1043 | GEN6_WRITE_FOOTER; \ |
1010 | } |
1044 | } |
Line 1011... | Line 1045... | ||
1011 | 1045 | ||
1012 | __gen9_write(8) |
1046 | __gen9_write(8) |
Line 1227... | Line 1261... | ||
1227 | 1261 | ||
1228 | intel_uncore_ellc_detect(dev); |
1262 | intel_uncore_ellc_detect(dev); |
1229 | intel_uncore_fw_domains_init(dev); |
1263 | intel_uncore_fw_domains_init(dev); |
Line -... | Line 1264... | ||
- | 1264 | __intel_uncore_early_sanitize(dev, false); |
|
- | 1265 | ||
1230 | __intel_uncore_early_sanitize(dev, false); |
1266 | dev_priv->uncore.unclaimed_mmio_check = 1; |
1231 | 1267 | ||
1232 | switch (INTEL_INFO(dev)->gen) { |
1268 | switch (INTEL_INFO(dev)->gen) { |
1233 | default: |
1269 | default: |
1234 | case 9: |
1270 | case 9: |
Line 1584... | Line 1620... | ||
1584 | bool intel_has_gpu_reset(struct drm_device *dev) |
1620 | bool intel_has_gpu_reset(struct drm_device *dev) |
1585 | { |
1621 | { |
1586 | return intel_get_gpu_reset(dev) != NULL; |
1622 | return intel_get_gpu_reset(dev) != NULL; |
1587 | } |
1623 | } |
Line 1588... | Line 1624... | ||
1588 | 1624 | ||
1589 | void intel_uncore_check_errors(struct drm_device *dev) |
1625 | bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv) |
1590 | { |
1626 | { |
- | 1627 | return check_for_unclaimed_mmio(dev_priv); |
|
Line -... | Line 1628... | ||
- | 1628 | } |
|
- | 1629 | ||
- | 1630 | bool |
|
1591 | struct drm_i915_private *dev_priv = dev->dev_private; |
1631 | intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv) |
1592 | 1632 | { |
|
- | 1633 | if (unlikely(i915.mmio_debug || |
|
- | 1634 | dev_priv->uncore.unclaimed_mmio_check <= 0)) |
|
- | 1635 | return false; |
|
1593 | if (HAS_FPGA_DBG_UNCLAIMED(dev) && |
1636 | |
- | 1637 | if (unlikely(intel_uncore_unclaimed_mmio(dev_priv))) { |
|
1594 | (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM)) { |
1638 | DRM_DEBUG("Unclaimed register detected, " |
- | 1639 | "enabling oneshot unclaimed register reporting. " |
|
- | 1640 | "Please use i915.mmio_debug=N for more information.\n"); |
|
- | 1641 | i915.mmio_debug++; |
|
1595 | DRM_ERROR("Unclaimed register before interrupt\n"); |
1642 | dev_priv->uncore.unclaimed_mmio_check--; |
- | 1643 | return true; |
|
- | 1644 | } |
|
1596 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
1645 |