Rev 6660 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6660 | Rev 6937 | ||
---|---|---|---|
Line 27... | Line 27... | ||
27 | 27 | ||
Line 28... | Line 28... | ||
28 | #include |
28 | #include |
Line 29... | Line -... | ||
29 | - | ||
30 | #define FORCEWAKE_ACK_TIMEOUT_MS 50 |
- | |
31 | - | ||
32 | #define __raw_i915_read8(dev_priv__, reg__) readb((dev_priv__)->regs + (reg__)) |
- | |
33 | #define __raw_i915_write8(dev_priv__, reg__, val__) writeb(val__, (dev_priv__)->regs + (reg__)) |
- | |
34 | - | ||
35 | #define __raw_i915_read16(dev_priv__, reg__) readw((dev_priv__)->regs + (reg__)) |
- | |
36 | #define __raw_i915_write16(dev_priv__, reg__, val__) writew(val__, (dev_priv__)->regs + (reg__)) |
- | |
37 | - | ||
38 | #define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__)) |
- | |
39 | #define __raw_i915_write32(dev_priv__, reg__, val__) writel(val__, (dev_priv__)->regs + (reg__)) |
- | |
40 | - | ||
41 | #define __raw_i915_read64(dev_priv__, reg__) readq((dev_priv__)->regs + (reg__)) |
29 | |
Line 42... | Line 30... | ||
42 | #define __raw_i915_write64(dev_priv__, reg__, val__) writeq(val__, (dev_priv__)->regs + (reg__)) |
30 | #define FORCEWAKE_ACK_TIMEOUT_MS 50 |
43 | 31 | ||
44 | #define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32(dev_priv__, reg__) |
32 | #define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32((dev_priv__), (reg__)) |
45 | 33 | ||
Line 60... | Line 48... | ||
60 | WARN_ON(id); |
48 | WARN_ON(id); |
Line 61... | Line 49... | ||
61 | 49 | ||
62 | return "unknown"; |
50 | return "unknown"; |
Line 63... | Line -... | ||
63 | } |
- | |
64 | - | ||
65 | static void |
- | |
66 | assert_device_not_suspended(struct drm_i915_private *dev_priv) |
- | |
67 | { |
- | |
68 | WARN_ONCE(HAS_RUNTIME_PM(dev_priv->dev) && dev_priv->pm.suspended, |
- | |
69 | "Device suspended\n"); |
- | |
70 | } |
51 | } |
71 | 52 | ||
72 | static inline void |
53 | static inline void |
73 | fw_domain_reset(const struct intel_uncore_forcewake_domain *d) |
54 | fw_domain_reset(const struct intel_uncore_forcewake_domain *d) |
74 | { |
55 | { |
75 | WARN_ON(d->reg_set == 0); |
56 | WARN_ON(!i915_mmio_reg_valid(d->reg_set)); |
Line 76... | Line 57... | ||
76 | __raw_i915_write32(d->i915, d->reg_set, d->val_reset); |
57 | __raw_i915_write32(d->i915, d->reg_set, d->val_reset); |
77 | } |
58 | } |
Line 118... | Line 99... | ||
118 | 99 | ||
119 | static inline void |
100 | static inline void |
120 | fw_domain_posting_read(const struct intel_uncore_forcewake_domain *d) |
101 | fw_domain_posting_read(const struct intel_uncore_forcewake_domain *d) |
121 | { |
102 | { |
122 | /* something from same cacheline, but not from the set register */ |
103 | /* something from same cacheline, but not from the set register */ |
123 | if (d->reg_post) |
104 | if (i915_mmio_reg_valid(d->reg_post)) |
124 | __raw_posting_read(d->i915, d->reg_post); |
105 | __raw_posting_read(d->i915, d->reg_post); |
Line 125... | Line 106... | ||
125 | } |
106 | } |
126 | 107 | ||
Line 248... | Line 229... | ||
248 | static void intel_uncore_fw_release_timer(unsigned long arg) |
229 | static void intel_uncore_fw_release_timer(unsigned long arg) |
249 | { |
230 | { |
250 | struct intel_uncore_forcewake_domain *domain = (void *)arg; |
231 | struct intel_uncore_forcewake_domain *domain = (void *)arg; |
251 | unsigned long irqflags; |
232 | unsigned long irqflags; |
Line 252... | Line 233... | ||
252 | 233 | ||
Line 253... | Line 234... | ||
253 | assert_device_not_suspended(domain->i915); |
234 | assert_rpm_device_not_suspended(domain->i915); |
254 | 235 | ||
255 | spin_lock_irqsave(&domain->i915->uncore.lock, irqflags); |
236 | spin_lock_irqsave(&domain->i915->uncore.lock, irqflags); |
Line 423... | Line 404... | ||
423 | unsigned long irqflags; |
404 | unsigned long irqflags; |
Line 424... | Line 405... | ||
424 | 405 | ||
425 | if (!dev_priv->uncore.funcs.force_wake_get) |
406 | if (!dev_priv->uncore.funcs.force_wake_get) |
Line 426... | Line 407... | ||
426 | return; |
407 | return; |
Line 427... | Line 408... | ||
427 | 408 | ||
428 | WARN_ON(dev_priv->pm.suspended); |
409 | assert_rpm_wakelock_held(dev_priv); |
429 | 410 | ||
430 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); |
411 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); |
Line 525... | Line 506... | ||
525 | for_each_fw_domain(domain, dev_priv, id) |
506 | for_each_fw_domain(domain, dev_priv, id) |
526 | WARN_ON(domain->wake_count); |
507 | WARN_ON(domain->wake_count); |
527 | } |
508 | } |
Line 528... | Line 509... | ||
528 | 509 | ||
529 | /* We give fast paths for the really cool registers */ |
510 | /* We give fast paths for the really cool registers */ |
530 | #define NEEDS_FORCE_WAKE(reg) \ |
- | |
Line 531... | Line 511... | ||
531 | ((reg) < 0x40000 && (reg) != FORCEWAKE) |
511 | #define NEEDS_FORCE_WAKE(reg) ((reg) < 0x40000) |
Line 532... | Line 512... | ||
532 | 512 | ||
533 | #define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end)) |
513 | #define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end)) |
Line 605... | Line 585... | ||
605 | * hence harmless to write 0 into. */ |
585 | * hence harmless to write 0 into. */ |
606 | __raw_i915_write32(dev_priv, MI_MODE, 0); |
586 | __raw_i915_write32(dev_priv, MI_MODE, 0); |
607 | } |
587 | } |
Line 608... | Line 588... | ||
608 | 588 | ||
609 | static void |
589 | static void |
610 | hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv, u32 reg, bool read, |
590 | hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv, |
611 | bool before) |
591 | i915_reg_t reg, bool read, bool before) |
612 | { |
592 | { |
613 | const char *op = read ? "reading" : "writing to"; |
593 | const char *op = read ? "reading" : "writing to"; |
Line 614... | Line 594... | ||
614 | const char *when = before ? "before" : "after"; |
594 | const char *when = before ? "before" : "after"; |
615 | 595 | ||
Line 616... | Line 596... | ||
616 | if (!i915.mmio_debug) |
596 | if (!i915.mmio_debug) |
617 | return; |
597 | return; |
618 | 598 | ||
619 | if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) { |
599 | if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) { |
620 | WARN(1, "Unclaimed register detected %s %s register 0x%x\n", |
600 | WARN(1, "Unclaimed register detected %s %s register 0x%x\n", |
621 | when, op, reg); |
601 | when, op, i915_mmio_reg_offset(reg)); |
622 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
602 | __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); |
Line 641... | Line 621... | ||
641 | } |
621 | } |
642 | } |
622 | } |
Line 643... | Line 623... | ||
643 | 623 | ||
644 | #define GEN2_READ_HEADER(x) \ |
624 | #define GEN2_READ_HEADER(x) \ |
645 | u##x val = 0; \ |
625 | u##x val = 0; \ |
Line 646... | Line 626... | ||
646 | assert_device_not_suspended(dev_priv); |
626 | assert_rpm_wakelock_held(dev_priv); |
647 | 627 | ||
648 | #define GEN2_READ_FOOTER \ |
628 | #define GEN2_READ_FOOTER \ |
Line 649... | Line 629... | ||
649 | trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \ |
629 | trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \ |
650 | return val |
630 | return val |
651 | 631 | ||
652 | #define __gen2_read(x) \ |
632 | #define __gen2_read(x) \ |
653 | static u##x \ |
633 | static u##x \ |
654 | gen2_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
634 | gen2_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
655 | GEN2_READ_HEADER(x); \ |
635 | GEN2_READ_HEADER(x); \ |
Line 656... | Line 636... | ||
656 | val = __raw_i915_read##x(dev_priv, reg); \ |
636 | val = __raw_i915_read##x(dev_priv, reg); \ |
657 | GEN2_READ_FOOTER; \ |
637 | GEN2_READ_FOOTER; \ |
658 | } |
638 | } |
659 | 639 | ||
660 | #define __gen5_read(x) \ |
640 | #define __gen5_read(x) \ |
661 | static u##x \ |
641 | static u##x \ |
662 | gen5_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
642 | gen5_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
663 | GEN2_READ_HEADER(x); \ |
643 | GEN2_READ_HEADER(x); \ |
Line 680... | Line 660... | ||
680 | 660 | ||
681 | #undef GEN2_READ_FOOTER |
661 | #undef GEN2_READ_FOOTER |
Line 682... | Line 662... | ||
682 | #undef GEN2_READ_HEADER |
662 | #undef GEN2_READ_HEADER |
- | 663 | ||
683 | 664 | #define GEN6_READ_HEADER(x) \ |
|
684 | #define GEN6_READ_HEADER(x) \ |
665 | u32 offset = i915_mmio_reg_offset(reg); \ |
685 | unsigned long irqflags; \ |
666 | unsigned long irqflags; \ |
686 | u##x val = 0; \ |
667 | u##x val = 0; \ |
Line 687... | Line 668... | ||
687 | assert_device_not_suspended(dev_priv); \ |
668 | assert_rpm_wakelock_held(dev_priv); \ |
688 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) |
669 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) |
689 | 670 | ||
Line 714... | Line 695... | ||
714 | 695 | ||
715 | if (fw_domains) |
696 | if (fw_domains) |
716 | dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains); |
697 | dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains); |
Line 717... | Line -... | ||
717 | } |
- | |
718 | - | ||
719 | #define __vgpu_read(x) \ |
- | |
720 | static u##x \ |
- | |
721 | vgpu_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
- | |
722 | GEN6_READ_HEADER(x); \ |
- | |
723 | val = __raw_i915_read##x(dev_priv, reg); \ |
- | |
724 | GEN6_READ_FOOTER; \ |
- | |
725 | } |
698 | } |
726 | 699 | ||
727 | #define __gen6_read(x) \ |
700 | #define __gen6_read(x) \ |
728 | static u##x \ |
701 | static u##x \ |
729 | gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
702 | gen6_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
730 | GEN6_READ_HEADER(x); \ |
703 | GEN6_READ_HEADER(x); \ |
731 | hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \ |
704 | hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \ |
732 | if (NEEDS_FORCE_WAKE(reg)) \ |
705 | if (NEEDS_FORCE_WAKE(offset)) \ |
733 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
706 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
734 | val = __raw_i915_read##x(dev_priv, reg); \ |
707 | val = __raw_i915_read##x(dev_priv, reg); \ |
735 | hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \ |
708 | hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \ |
Line 736... | Line 709... | ||
736 | GEN6_READ_FOOTER; \ |
709 | GEN6_READ_FOOTER; \ |
737 | } |
710 | } |
738 | 711 | ||
- | 712 | #define __vlv_read(x) \ |
|
739 | #define __vlv_read(x) \ |
713 | static u##x \ |
- | 714 | vlv_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
|
- | 715 | enum forcewake_domains fw_engine = 0; \ |
|
740 | static u##x \ |
716 | GEN6_READ_HEADER(x); \ |
741 | vlv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
717 | if (!NEEDS_FORCE_WAKE(offset)) \ |
742 | GEN6_READ_HEADER(x); \ |
718 | fw_engine = 0; \ |
- | 719 | else if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(offset)) \ |
|
- | 720 | fw_engine = FORCEWAKE_RENDER; \ |
|
743 | if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg)) \ |
721 | else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(offset)) \ |
744 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
722 | fw_engine = FORCEWAKE_MEDIA; \ |
745 | else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)) \ |
723 | if (fw_engine) \ |
746 | __force_wake_get(dev_priv, FORCEWAKE_MEDIA); \ |
724 | __force_wake_get(dev_priv, fw_engine); \ |
Line 747... | Line 725... | ||
747 | val = __raw_i915_read##x(dev_priv, reg); \ |
725 | val = __raw_i915_read##x(dev_priv, reg); \ |
748 | GEN6_READ_FOOTER; \ |
726 | GEN6_READ_FOOTER; \ |
749 | } |
727 | } |
- | 728 | ||
750 | 729 | #define __chv_read(x) \ |
|
- | 730 | static u##x \ |
|
- | 731 | chv_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
|
751 | #define __chv_read(x) \ |
732 | enum forcewake_domains fw_engine = 0; \ |
752 | static u##x \ |
733 | GEN6_READ_HEADER(x); \ |
753 | chv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
734 | if (!NEEDS_FORCE_WAKE(offset)) \ |
754 | GEN6_READ_HEADER(x); \ |
735 | fw_engine = 0; \ |
755 | if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) \ |
736 | else if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(offset)) \ |
- | 737 | fw_engine = FORCEWAKE_RENDER; \ |
|
756 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
738 | else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(offset)) \ |
757 | else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) \ |
739 | fw_engine = FORCEWAKE_MEDIA; \ |
758 | __force_wake_get(dev_priv, FORCEWAKE_MEDIA); \ |
740 | else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(offset)) \ |
759 | else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) \ |
741 | fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \ |
760 | __force_wake_get(dev_priv, \ |
742 | if (fw_engine) \ |
Line 761... | Line 743... | ||
761 | FORCEWAKE_RENDER | FORCEWAKE_MEDIA); \ |
743 | __force_wake_get(dev_priv, fw_engine); \ |
762 | val = __raw_i915_read##x(dev_priv, reg); \ |
744 | val = __raw_i915_read##x(dev_priv, reg); \ |
Line 763... | Line 745... | ||
763 | GEN6_READ_FOOTER; \ |
745 | GEN6_READ_FOOTER; \ |
764 | } |
746 | } |
765 | 747 | ||
766 | #define SKL_NEEDS_FORCE_WAKE(reg) \ |
748 | #define SKL_NEEDS_FORCE_WAKE(reg) \ |
767 | ((reg) < 0x40000 && !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg)) |
749 | ((reg) < 0x40000 && !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg)) |
768 | 750 | ||
769 | #define __gen9_read(x) \ |
751 | #define __gen9_read(x) \ |
770 | static u##x \ |
752 | static u##x \ |
771 | gen9_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ |
753 | gen9_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
772 | enum forcewake_domains fw_engine; \ |
754 | enum forcewake_domains fw_engine; \ |
773 | GEN6_READ_HEADER(x); \ |
755 | GEN6_READ_HEADER(x); \ |
774 | hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \ |
756 | hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \ |
775 | if (!SKL_NEEDS_FORCE_WAKE(reg)) \ |
757 | if (!SKL_NEEDS_FORCE_WAKE(offset)) \ |
776 | fw_engine = 0; \ |
758 | fw_engine = 0; \ |
777 | else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg)) \ |
759 | else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \ |
778 | fw_engine = FORCEWAKE_RENDER; \ |
760 | fw_engine = FORCEWAKE_RENDER; \ |
779 | else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg)) \ |
761 | else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \ |
780 | fw_engine = FORCEWAKE_MEDIA; \ |
762 | fw_engine = FORCEWAKE_MEDIA; \ |
781 | else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg)) \ |
763 | else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(offset)) \ |
782 | fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \ |
764 | fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \ |
783 | else \ |
765 | else \ |
784 | fw_engine = FORCEWAKE_BLITTER; \ |
766 | fw_engine = FORCEWAKE_BLITTER; \ |
Line 785... | Line -... | ||
785 | if (fw_engine) \ |
- | |
786 | __force_wake_get(dev_priv, fw_engine); \ |
- | |
787 | val = __raw_i915_read##x(dev_priv, reg); \ |
- | |
788 | hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \ |
- | |
789 | GEN6_READ_FOOTER; \ |
767 | if (fw_engine) \ |
790 | } |
768 | __force_wake_get(dev_priv, fw_engine); \ |
791 | 769 | val = __raw_i915_read##x(dev_priv, reg); \ |
|
792 | __vgpu_read(8) |
770 | hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \ |
793 | __vgpu_read(16) |
771 | GEN6_READ_FOOTER; \ |
Line 812... | Line 790... | ||
812 | 790 | ||
813 | #undef __gen9_read |
791 | #undef __gen9_read |
814 | #undef __chv_read |
792 | #undef __chv_read |
815 | #undef __vlv_read |
793 | #undef __vlv_read |
816 | #undef __gen6_read |
- | |
817 | #undef __vgpu_read |
794 | #undef __gen6_read |
818 | #undef GEN6_READ_FOOTER |
795 | #undef GEN6_READ_FOOTER |
Line -... | Line 796... | ||
- | 796 | #undef GEN6_READ_HEADER |
|
- | 797 | ||
- | 798 | #define VGPU_READ_HEADER(x) \ |
|
- | 799 | unsigned long irqflags; \ |
|
- | 800 | u##x val = 0; \ |
|
- | 801 | assert_rpm_device_not_suspended(dev_priv); \ |
|
- | 802 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) |
|
- | 803 | ||
- | 804 | #define VGPU_READ_FOOTER \ |
|
- | 805 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \ |
|
- | 806 | trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \ |
|
- | 807 | return val |
|
- | 808 | ||
- | 809 | #define __vgpu_read(x) \ |
|
- | 810 | static u##x \ |
|
- | 811 | vgpu_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \ |
|
- | 812 | VGPU_READ_HEADER(x); \ |
|
- | 813 | val = __raw_i915_read##x(dev_priv, reg); \ |
|
- | 814 | VGPU_READ_FOOTER; \ |
|
- | 815 | } |
|
- | 816 | ||
- | 817 | __vgpu_read(8) |
|
- | 818 | __vgpu_read(16) |
|
- | 819 | __vgpu_read(32) |
|
- | 820 | __vgpu_read(64) |
|
- | 821 | ||
- | 822 | #undef __vgpu_read |
|
- | 823 | #undef VGPU_READ_FOOTER |
|
819 | #undef GEN6_READ_HEADER |
824 | #undef VGPU_READ_HEADER |
820 | 825 | ||
821 | #define GEN2_WRITE_HEADER \ |
826 | #define GEN2_WRITE_HEADER \ |
Line 822... | Line 827... | ||
822 | trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ |
827 | trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ |
Line 823... | Line 828... | ||
823 | assert_device_not_suspended(dev_priv); \ |
828 | assert_rpm_wakelock_held(dev_priv); \ |
824 | 829 | ||
825 | #define GEN2_WRITE_FOOTER |
830 | #define GEN2_WRITE_FOOTER |
826 | 831 | ||
827 | #define __gen2_write(x) \ |
832 | #define __gen2_write(x) \ |
828 | static void \ |
833 | static void \ |
829 | gen2_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
834 | gen2_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \ |
Line 830... | Line 835... | ||
830 | GEN2_WRITE_HEADER; \ |
835 | GEN2_WRITE_HEADER; \ |
831 | __raw_i915_write##x(dev_priv, reg, val); \ |
836 | __raw_i915_write##x(dev_priv, reg, val); \ |
832 | GEN2_WRITE_FOOTER; \ |
837 | GEN2_WRITE_FOOTER; \ |
833 | } |
838 | } |
834 | 839 | ||
835 | #define __gen5_write(x) \ |
840 | #define __gen5_write(x) \ |
836 | static void \ |
841 | static void \ |
837 | gen5_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
842 | gen5_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \ |
Line 855... | Line 860... | ||
855 | 860 | ||
856 | #undef GEN2_WRITE_FOOTER |
861 | #undef GEN2_WRITE_FOOTER |
Line 857... | Line 862... | ||
857 | #undef GEN2_WRITE_HEADER |
862 | #undef GEN2_WRITE_HEADER |
- | 863 | ||
858 | 864 | #define GEN6_WRITE_HEADER \ |
|
859 | #define GEN6_WRITE_HEADER \ |
865 | u32 offset = i915_mmio_reg_offset(reg); \ |
860 | unsigned long irqflags; \ |
866 | unsigned long irqflags; \ |
861 | trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ |
867 | trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ |
Line 862... | Line 868... | ||
862 | assert_device_not_suspended(dev_priv); \ |
868 | assert_rpm_wakelock_held(dev_priv); \ |
863 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) |
869 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) |
Line 864... | Line 870... | ||
864 | 870 | ||
865 | #define GEN6_WRITE_FOOTER \ |
871 | #define GEN6_WRITE_FOOTER \ |
866 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags) |
872 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags) |
867 | 873 | ||
868 | #define __gen6_write(x) \ |
874 | #define __gen6_write(x) \ |
869 | static void \ |
875 | static void \ |
870 | gen6_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
876 | gen6_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \ |
871 | u32 __fifo_ret = 0; \ |
877 | u32 __fifo_ret = 0; \ |
872 | GEN6_WRITE_HEADER; \ |
878 | GEN6_WRITE_HEADER; \ |
873 | if (NEEDS_FORCE_WAKE(reg)) { \ |
879 | if (NEEDS_FORCE_WAKE(offset)) { \ |
874 | __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ |
880 | __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ |
Line 880... | Line 886... | ||
880 | GEN6_WRITE_FOOTER; \ |
886 | GEN6_WRITE_FOOTER; \ |
881 | } |
887 | } |
Line 882... | Line 888... | ||
882 | 888 | ||
883 | #define __hsw_write(x) \ |
889 | #define __hsw_write(x) \ |
884 | static void \ |
890 | static void \ |
885 | hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
891 | hsw_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \ |
886 | u32 __fifo_ret = 0; \ |
892 | u32 __fifo_ret = 0; \ |
887 | GEN6_WRITE_HEADER; \ |
893 | GEN6_WRITE_HEADER; \ |
888 | if (NEEDS_FORCE_WAKE(reg)) { \ |
894 | if (NEEDS_FORCE_WAKE(offset)) { \ |
889 | __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ |
895 | __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ |
890 | } \ |
896 | } \ |
891 | hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ |
897 | hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ |
892 | __raw_i915_write##x(dev_priv, reg, val); \ |
898 | __raw_i915_write##x(dev_priv, reg, val); \ |
Line 896... | Line 902... | ||
896 | hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \ |
902 | hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \ |
897 | hsw_unclaimed_reg_detect(dev_priv); \ |
903 | hsw_unclaimed_reg_detect(dev_priv); \ |
898 | GEN6_WRITE_FOOTER; \ |
904 | GEN6_WRITE_FOOTER; \ |
899 | } |
905 | } |
Line 900... | Line -... | ||
900 | - | ||
901 | #define __vgpu_write(x) \ |
- | |
902 | static void vgpu_write##x(struct drm_i915_private *dev_priv, \ |
- | |
903 | off_t reg, u##x val, bool trace) { \ |
- | |
904 | GEN6_WRITE_HEADER; \ |
- | |
905 | __raw_i915_write##x(dev_priv, reg, val); \ |
- | |
906 | GEN6_WRITE_FOOTER; \ |
- | |
907 | } |
- | |
908 | 906 | ||
909 | static const u32 gen8_shadowed_regs[] = { |
907 | static const i915_reg_t gen8_shadowed_regs[] = { |
910 | FORCEWAKE_MT, |
908 | FORCEWAKE_MT, |
911 | GEN6_RPNSWREQ, |
909 | GEN6_RPNSWREQ, |
912 | GEN6_RC_VIDEO_FREQ, |
910 | GEN6_RC_VIDEO_FREQ, |
913 | RING_TAIL(RENDER_RING_BASE), |
911 | RING_TAIL(RENDER_RING_BASE), |
914 | RING_TAIL(GEN6_BSD_RING_BASE), |
912 | RING_TAIL(GEN6_BSD_RING_BASE), |
915 | RING_TAIL(VEBOX_RING_BASE), |
913 | RING_TAIL(VEBOX_RING_BASE), |
916 | RING_TAIL(BLT_RING_BASE), |
914 | RING_TAIL(BLT_RING_BASE), |
917 | /* TODO: Other registers are not yet used */ |
915 | /* TODO: Other registers are not yet used */ |
Line 918... | Line 916... | ||
918 | }; |
916 | }; |
- | 917 | ||
919 | 918 | static bool is_gen8_shadowed(struct drm_i915_private *dev_priv, |
|
920 | static bool is_gen8_shadowed(struct drm_i915_private *dev_priv, u32 reg) |
919 | i915_reg_t reg) |
921 | { |
920 | { |
922 | int i; |
921 | int i; |
923 | for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++) |
922 | for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++) |
Line 924... | Line 923... | ||
924 | if (reg == gen8_shadowed_regs[i]) |
923 | if (i915_mmio_reg_equal(reg, gen8_shadowed_regs[i])) |
925 | return true; |
924 | return true; |
Line 926... | Line 925... | ||
926 | 925 | ||
927 | return false; |
926 | return false; |
928 | } |
927 | } |
929 | 928 | ||
930 | #define __gen8_write(x) \ |
929 | #define __gen8_write(x) \ |
931 | static void \ |
930 | static void \ |
932 | gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
931 | gen8_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \ |
933 | GEN6_WRITE_HEADER; \ |
932 | GEN6_WRITE_HEADER; \ |
934 | hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ |
933 | hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ |
935 | if (reg < 0x40000 && !is_gen8_shadowed(dev_priv, reg)) \ |
934 | if (NEEDS_FORCE_WAKE(offset) && !is_gen8_shadowed(dev_priv, reg)) \ |
936 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
935 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
937 | __raw_i915_write##x(dev_priv, reg, val); \ |
936 | __raw_i915_write##x(dev_priv, reg, val); \ |
Line 938... | Line 937... | ||
938 | hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \ |
937 | hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \ |
939 | hsw_unclaimed_reg_detect(dev_priv); \ |
938 | hsw_unclaimed_reg_detect(dev_priv); \ |
940 | GEN6_WRITE_FOOTER; \ |
939 | GEN6_WRITE_FOOTER; \ |
941 | } |
940 | } |
942 | 941 | ||
- | 942 | #define __chv_write(x) \ |
|
- | 943 | static void \ |
|
943 | #define __chv_write(x) \ |
944 | chv_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \ |
944 | static void \ |
945 | enum forcewake_domains fw_engine = 0; \ |
945 | chv_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ |
946 | GEN6_WRITE_HEADER; \ |
946 | bool shadowed = is_gen8_shadowed(dev_priv, reg); \ |
947 | if (!NEEDS_FORCE_WAKE(offset) || \ |
947 | GEN6_WRITE_HEADER; \ |
948 | is_gen8_shadowed(dev_priv, reg)) \ |
948 | if (!shadowed) { \ |
949 | fw_engine = 0; \ |
949 | if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) \ |
950 | else if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(offset)) \ |
950 | __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ |
951 | fw_engine = FORCEWAKE_RENDER; \ |
- | 952 | else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(offset)) \ |
|
951 | else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) \ |
953 | fw_engine = FORCEWAKE_MEDIA; \ |
952 | __force_wake_get(dev_priv, FORCEWAKE_MEDIA); \ |
954 | else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(offset)) \ |
953 | else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) \ |
955 | fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \ |
Line 954... | Line 956... | ||
954 | __force_wake_get(dev_priv, FORCEWAKE_RENDER | FORCEWAKE_MEDIA); \ |
956 | if (fw_engine) \ |
955 | } \ |
957 | __force_wake_get(dev_priv, fw_engine); \ |
956 | __raw_i915_write##x(dev_priv, reg, val); \ |
958 | __raw_i915_write##x(dev_priv, reg, val); \ |
957 | GEN6_WRITE_FOOTER; \ |
959 | GEN6_WRITE_FOOTER; \ |
958 | } |
960 | } |
959 | 961 | ||
Line 968... | Line 970... | ||
968 | GEN6_RPNSWREQ, |
970 | GEN6_RPNSWREQ, |
969 | GEN6_RC_VIDEO_FREQ, |
971 | GEN6_RC_VIDEO_FREQ, |
970 | /* TODO: Other registers are not yet used */ |
972 | /* TODO: Other registers are not yet used */ |
971 | }; |
973 | }; |
Line 972... | Line 974... | ||
972 | 974 | ||
- | 975 | static bool is_gen9_shadowed(struct drm_i915_private *dev_priv, |
|
973 | static bool is_gen9_shadowed(struct drm_i915_private *dev_priv, u32 reg) |
976 | i915_reg_t reg) |
974 | { |
977 | { |
975 | int i; |
978 | int i; |
976 | for (i = 0; i < ARRAY_SIZE(gen9_shadowed_regs); i++) |
979 | for (i = 0; i < ARRAY_SIZE(gen9_shadowed_regs); i++) |
977 | if (reg == gen9_shadowed_regs[i]) |
980 | if (i915_mmio_reg_equal(reg, gen9_shadowed_regs[i])) |
Line 978... | Line 981... | ||
978 | return true; |
981 | return true; |
979 | 982 | ||
Line 980... | Line 983... | ||
980 | return false; |
983 | return false; |
981 | } |
984 | } |
982 | 985 | ||
983 | #define __gen9_write(x) \ |
986 | #define __gen9_write(x) \ |
984 | static void \ |
987 | static void \ |
985 | gen9_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, \ |
988 | gen9_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, \ |
986 | bool trace) { \ |
989 | bool trace) { \ |
987 | enum forcewake_domains fw_engine; \ |
990 | enum forcewake_domains fw_engine; \ |
988 | GEN6_WRITE_HEADER; \ |
991 | GEN6_WRITE_HEADER; \ |
989 | hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ |
992 | hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ |
990 | if (!SKL_NEEDS_FORCE_WAKE(reg) || \ |
993 | if (!SKL_NEEDS_FORCE_WAKE(offset) || \ |
991 | is_gen9_shadowed(dev_priv, reg)) \ |
994 | is_gen9_shadowed(dev_priv, reg)) \ |
992 | fw_engine = 0; \ |
995 | fw_engine = 0; \ |
993 | else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg)) \ |
996 | else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \ |
994 | fw_engine = FORCEWAKE_RENDER; \ |
997 | fw_engine = FORCEWAKE_RENDER; \ |
995 | else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg)) \ |
998 | else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \ |
996 | fw_engine = FORCEWAKE_MEDIA; \ |
999 | fw_engine = FORCEWAKE_MEDIA; \ |
997 | else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg)) \ |
1000 | else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(offset)) \ |
998 | fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \ |
1001 | fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \ |
999 | else \ |
1002 | else \ |
Line 1024... | Line 1027... | ||
1024 | __hsw_write(64) |
1027 | __hsw_write(64) |
1025 | __gen6_write(8) |
1028 | __gen6_write(8) |
1026 | __gen6_write(16) |
1029 | __gen6_write(16) |
1027 | __gen6_write(32) |
1030 | __gen6_write(32) |
1028 | __gen6_write(64) |
1031 | __gen6_write(64) |
1029 | __vgpu_write(8) |
- | |
1030 | __vgpu_write(16) |
- | |
1031 | __vgpu_write(32) |
- | |
1032 | __vgpu_write(64) |
- | |
Line 1033... | Line 1032... | ||
1033 | 1032 | ||
1034 | #undef __gen9_write |
1033 | #undef __gen9_write |
1035 | #undef __chv_write |
1034 | #undef __chv_write |
1036 | #undef __gen8_write |
1035 | #undef __gen8_write |
1037 | #undef __hsw_write |
1036 | #undef __hsw_write |
1038 | #undef __gen6_write |
- | |
1039 | #undef __vgpu_write |
1037 | #undef __gen6_write |
1040 | #undef GEN6_WRITE_FOOTER |
1038 | #undef GEN6_WRITE_FOOTER |
Line -... | Line 1039... | ||
- | 1039 | #undef GEN6_WRITE_HEADER |
|
- | 1040 | ||
- | 1041 | #define VGPU_WRITE_HEADER \ |
|
- | 1042 | unsigned long irqflags; \ |
|
- | 1043 | trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ |
|
- | 1044 | assert_rpm_device_not_suspended(dev_priv); \ |
|
- | 1045 | spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) |
|
- | 1046 | ||
- | 1047 | #define VGPU_WRITE_FOOTER \ |
|
- | 1048 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags) |
|
- | 1049 | ||
- | 1050 | #define __vgpu_write(x) \ |
|
- | 1051 | static void vgpu_write##x(struct drm_i915_private *dev_priv, \ |
|
- | 1052 | i915_reg_t reg, u##x val, bool trace) { \ |
|
- | 1053 | VGPU_WRITE_HEADER; \ |
|
- | 1054 | __raw_i915_write##x(dev_priv, reg, val); \ |
|
- | 1055 | VGPU_WRITE_FOOTER; \ |
|
- | 1056 | } |
|
- | 1057 | ||
- | 1058 | __vgpu_write(8) |
|
- | 1059 | __vgpu_write(16) |
|
- | 1060 | __vgpu_write(32) |
|
- | 1061 | __vgpu_write(64) |
|
- | 1062 | ||
- | 1063 | #undef __vgpu_write |
|
- | 1064 | #undef VGPU_WRITE_FOOTER |
|
1041 | #undef GEN6_WRITE_HEADER |
1065 | #undef VGPU_WRITE_HEADER |
1042 | 1066 | ||
1043 | #define ASSIGN_WRITE_MMIO_VFUNCS(x) \ |
1067 | #define ASSIGN_WRITE_MMIO_VFUNCS(x) \ |
1044 | do { \ |
1068 | do { \ |
1045 | dev_priv->uncore.funcs.mmio_writeb = x##_write8; \ |
1069 | dev_priv->uncore.funcs.mmio_writeb = x##_write8; \ |
Line 1057... | Line 1081... | ||
1057 | } while (0) |
1081 | } while (0) |
Line 1058... | Line 1082... | ||
1058 | 1082 | ||
1059 | 1083 | ||
- | 1084 | static void fw_domain_init(struct drm_i915_private *dev_priv, |
|
1060 | static void fw_domain_init(struct drm_i915_private *dev_priv, |
1085 | enum forcewake_domain_id domain_id, |
1061 | enum forcewake_domain_id domain_id, |
1086 | i915_reg_t reg_set, |
1062 | u32 reg_set, u32 reg_ack) |
1087 | i915_reg_t reg_ack) |
Line 1063... | Line 1088... | ||
1063 | { |
1088 | { |
1064 | struct intel_uncore_forcewake_domain *d; |
1089 | struct intel_uncore_forcewake_domain *d; |
Line 1083... | Line 1108... | ||
1083 | d->val_reset = _MASKED_BIT_DISABLE(0xffff); |
1108 | d->val_reset = _MASKED_BIT_DISABLE(0xffff); |
1084 | d->val_set = _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL); |
1109 | d->val_set = _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL); |
1085 | d->val_clear = _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL); |
1110 | d->val_clear = _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL); |
1086 | } |
1111 | } |
Line 1087... | Line 1112... | ||
1087 | 1112 | ||
1088 | if (IS_VALLEYVIEW(dev_priv)) |
1113 | if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) |
1089 | d->reg_post = FORCEWAKE_ACK_VLV; |
1114 | d->reg_post = FORCEWAKE_ACK_VLV; |
1090 | else if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv) || IS_GEN8(dev_priv)) |
1115 | else if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv) || IS_GEN8(dev_priv)) |
1091 | d->reg_post = ECOBUS; |
- | |
1092 | else |
- | |
Line 1093... | Line 1116... | ||
1093 | d->reg_post = 0; |
1116 | d->reg_post = ECOBUS; |
1094 | 1117 | ||
Line 1095... | Line 1118... | ||
1095 | d->i915 = dev_priv; |
1118 | d->i915 = dev_priv; |
Line 1118... | Line 1141... | ||
1118 | fw_domain_init(dev_priv, FW_DOMAIN_ID_BLITTER, |
1141 | fw_domain_init(dev_priv, FW_DOMAIN_ID_BLITTER, |
1119 | FORCEWAKE_BLITTER_GEN9, |
1142 | FORCEWAKE_BLITTER_GEN9, |
1120 | FORCEWAKE_ACK_BLITTER_GEN9); |
1143 | FORCEWAKE_ACK_BLITTER_GEN9); |
1121 | fw_domain_init(dev_priv, FW_DOMAIN_ID_MEDIA, |
1144 | fw_domain_init(dev_priv, FW_DOMAIN_ID_MEDIA, |
1122 | FORCEWAKE_MEDIA_GEN9, FORCEWAKE_ACK_MEDIA_GEN9); |
1145 | FORCEWAKE_MEDIA_GEN9, FORCEWAKE_ACK_MEDIA_GEN9); |
1123 | } else if (IS_VALLEYVIEW(dev)) { |
1146 | } else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) { |
1124 | dev_priv->uncore.funcs.force_wake_get = fw_domains_get; |
1147 | dev_priv->uncore.funcs.force_wake_get = fw_domains_get; |
1125 | if (!IS_CHERRYVIEW(dev)) |
1148 | if (!IS_CHERRYVIEW(dev)) |
1126 | dev_priv->uncore.funcs.force_wake_put = |
1149 | dev_priv->uncore.funcs.force_wake_put = |
1127 | fw_domains_put_with_fifo; |
1150 | fw_domains_put_with_fifo; |
1128 | else |
1151 | else |
Line 1266... | Line 1289... | ||
1266 | } |
1289 | } |
Line 1267... | Line 1290... | ||
1267 | 1290 | ||
Line 1268... | Line 1291... | ||
1268 | #define GEN_RANGE(l, h) GENMASK(h, l) |
1291 | #define GEN_RANGE(l, h) GENMASK(h, l) |
1269 | 1292 | ||
1270 | static const struct register_whitelist { |
1293 | static const struct register_whitelist { |
1271 | uint64_t offset; |
1294 | i915_reg_t offset_ldw, offset_udw; |
1272 | uint32_t size; |
1295 | uint32_t size; |
1273 | /* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */ |
1296 | /* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */ |
- | 1297 | uint32_t gen_bitmask; |
|
- | 1298 | } whitelist[] = { |
|
1274 | uint32_t gen_bitmask; |
1299 | { .offset_ldw = RING_TIMESTAMP(RENDER_RING_BASE), |
1275 | } whitelist[] = { |
1300 | .offset_udw = RING_TIMESTAMP_UDW(RENDER_RING_BASE), |
Line 1276... | Line 1301... | ||
1276 | { RING_TIMESTAMP(RENDER_RING_BASE), 8, GEN_RANGE(4, 9) }, |
1301 | .size = 8, .gen_bitmask = GEN_RANGE(4, 9) }, |
1277 | }; |
1302 | }; |
1278 | 1303 | ||
1279 | int i915_reg_read_ioctl(struct drm_device *dev, |
1304 | int i915_reg_read_ioctl(struct drm_device *dev, |
1280 | void *data, struct drm_file *file) |
1305 | void *data, struct drm_file *file) |
1281 | { |
1306 | { |
1282 | struct drm_i915_private *dev_priv = dev->dev_private; |
1307 | struct drm_i915_private *dev_priv = dev->dev_private; |
1283 | struct drm_i915_reg_read *reg = data; |
1308 | struct drm_i915_reg_read *reg = data; |
1284 | struct register_whitelist const *entry = whitelist; |
1309 | struct register_whitelist const *entry = whitelist; |
Line 1285... | Line 1310... | ||
1285 | unsigned size; |
1310 | unsigned size; |
1286 | u64 offset; |
1311 | i915_reg_t offset_ldw, offset_udw; |
1287 | int i, ret = 0; |
1312 | int i, ret = 0; |
1288 | 1313 | ||
1289 | for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) { |
1314 | for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) { |
Line 1290... | Line 1315... | ||
1290 | if (entry->offset == (reg->offset & -entry->size) && |
1315 | if (i915_mmio_reg_offset(entry->offset_ldw) == (reg->offset & -entry->size) && |
Line 1297... | Line 1322... | ||
1297 | 1322 | ||
1298 | /* We use the low bits to encode extra flags as the register should |
1323 | /* We use the low bits to encode extra flags as the register should |
1299 | * be naturally aligned (and those that are not so aligned merely |
1324 | * be naturally aligned (and those that are not so aligned merely |
1300 | * limit the available flags for that register). |
1325 | * limit the available flags for that register). |
- | 1326 | */ |
|
1301 | */ |
1327 | offset_ldw = entry->offset_ldw; |
1302 | offset = entry->offset; |
1328 | offset_udw = entry->offset_udw; |
1303 | size = entry->size; |
1329 | size = entry->size; |
Line 1304... | Line 1330... | ||
1304 | size |= reg->offset ^ offset; |
1330 | size |= reg->offset ^ i915_mmio_reg_offset(offset_ldw); |
Line 1305... | Line 1331... | ||
1305 | 1331 | ||
1306 | intel_runtime_pm_get(dev_priv); |
1332 | intel_runtime_pm_get(dev_priv); |
1307 | 1333 | ||
1308 | switch (size) { |
1334 | switch (size) { |
1309 | case 8 | 1: |
1335 | case 8 | 1: |
1310 | reg->val = I915_READ64_2x32(offset, offset+4); |
1336 | reg->val = I915_READ64_2x32(offset_ldw, offset_udw); |
1311 | break; |
1337 | break; |
1312 | case 8: |
1338 | case 8: |
1313 | reg->val = I915_READ64(offset); |
1339 | reg->val = I915_READ64(offset_ldw); |
1314 | break; |
1340 | break; |
1315 | case 4: |
1341 | case 4: |
1316 | reg->val = I915_READ(offset); |
1342 | reg->val = I915_READ(offset_ldw); |
1317 | break; |
1343 | break; |
1318 | case 2: |
1344 | case 2: |
1319 | reg->val = I915_READ16(offset); |
1345 | reg->val = I915_READ16(offset_ldw); |
1320 | break; |
1346 | break; |
1321 | case 1: |
1347 | case 1: |
1322 | reg->val = I915_READ8(offset); |
1348 | reg->val = I915_READ8(offset_ldw); |
1323 | break; |
1349 | break; |
1324 | default: |
1350 | default: |
Line 1341... | Line 1367... | ||
1341 | int ret; |
1367 | int ret; |
Line 1342... | Line 1368... | ||
1342 | 1368 | ||
1343 | if (args->flags || args->pad) |
1369 | if (args->flags || args->pad) |
Line -... | Line 1370... | ||
- | 1370 | return -EINVAL; |
|
- | 1371 | ||
- | 1372 | if (args->ctx_id == DEFAULT_CONTEXT_HANDLE && !capable(CAP_SYS_ADMIN)) |
|
1344 | return -EINVAL; |
1373 | return -EPERM; |
1345 | 1374 | ||
1346 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
1375 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
Line 1347... | Line 1376... | ||
1347 | if (ret) |
1376 | if (ret) |
Line 1352... | Line 1381... | ||
1352 | mutex_unlock(&dev->struct_mutex); |
1381 | mutex_unlock(&dev->struct_mutex); |
1353 | return PTR_ERR(ctx); |
1382 | return PTR_ERR(ctx); |
1354 | } |
1383 | } |
1355 | hs = &ctx->hang_stats; |
1384 | hs = &ctx->hang_stats; |
Line -... | Line 1385... | ||
- | 1385 | ||
1356 | 1386 | if (capable(CAP_SYS_ADMIN)) |
|
- | 1387 | args->reset_count = i915_reset_count(&dev_priv->gpu_error); |
|
- | 1388 | else |
|
Line 1357... | Line 1389... | ||
1357 | args->reset_count = i915_reset_count(&dev_priv->gpu_error); |
1389 | args->reset_count = 0; |
1358 | 1390 | ||
Line 1359... | Line 1391... | ||
1359 | args->batch_active = hs->batch_active; |
1391 | args->batch_active = hs->batch_active; |
Line 1468... | Line 1500... | ||
1468 | 1500 | ||
1469 | return ret; |
1501 | return ret; |
Line 1470... | Line 1502... | ||
1470 | } |
1502 | } |
1471 | 1503 | ||
1472 | static int wait_for_register(struct drm_i915_private *dev_priv, |
1504 | static int wait_for_register(struct drm_i915_private *dev_priv, |
1473 | const u32 reg, |
1505 | i915_reg_t reg, |
1474 | const u32 mask, |
1506 | const u32 mask, |
1475 | const u32 value, |
1507 | const u32 value, |
1476 | const unsigned long timeout_ms) |
1508 | const unsigned long timeout_ms) |