diff options
-rw-r--r-- | drivers/ntb/ntb_hw.c | 567 | ||||
-rw-r--r-- | drivers/ntb/ntb_hw.h | 19 | ||||
-rw-r--r-- | drivers/ntb/ntb_regs.h | 38 |
3 files changed, 501 insertions, 123 deletions
diff --git a/drivers/ntb/ntb_hw.c b/drivers/ntb/ntb_hw.c index 372e08c4ffef..cd29b1038c5e 100644 --- a/drivers/ntb/ntb_hw.c +++ b/drivers/ntb/ntb_hw.c | |||
@@ -64,10 +64,6 @@ MODULE_VERSION(NTB_VER); | |||
64 | MODULE_LICENSE("Dual BSD/GPL"); | 64 | MODULE_LICENSE("Dual BSD/GPL"); |
65 | MODULE_AUTHOR("Intel Corporation"); | 65 | MODULE_AUTHOR("Intel Corporation"); |
66 | 66 | ||
67 | static bool xeon_errata_workaround = true; | ||
68 | module_param(xeon_errata_workaround, bool, 0644); | ||
69 | MODULE_PARM_DESC(xeon_errata_workaround, "Workaround for the Xeon Errata"); | ||
70 | |||
71 | enum { | 67 | enum { |
72 | NTB_CONN_TRANSPARENT = 0, | 68 | NTB_CONN_TRANSPARENT = 0, |
73 | NTB_CONN_B2B, | 69 | NTB_CONN_B2B, |
@@ -88,8 +84,8 @@ static struct dentry *debugfs_dir; | |||
88 | 84 | ||
89 | #define BWD_LINK_RECOVERY_TIME 500 | 85 | #define BWD_LINK_RECOVERY_TIME 500 |
90 | 86 | ||
91 | /* Translate memory window 0,1 to BAR 2,4 */ | 87 | /* Translate memory window 0,1,2 to BAR 2,4,5 */ |
92 | #define MW_TO_BAR(mw) (mw * NTB_MAX_NUM_MW + 2) | 88 | #define MW_TO_BAR(mw) (mw == 0 ? 2 : (mw == 1 ? 4 : 5)) |
93 | 89 | ||
94 | static const struct pci_device_id ntb_pci_tbl[] = { | 90 | static const struct pci_device_id ntb_pci_tbl[] = { |
95 | {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_BWD)}, | 91 | {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_BWD)}, |
@@ -109,6 +105,65 @@ static const struct pci_device_id ntb_pci_tbl[] = { | |||
109 | }; | 105 | }; |
110 | MODULE_DEVICE_TABLE(pci, ntb_pci_tbl); | 106 | MODULE_DEVICE_TABLE(pci, ntb_pci_tbl); |
111 | 107 | ||
108 | static int is_ntb_xeon(struct ntb_device *ndev) | ||
109 | { | ||
110 | switch (ndev->pdev->device) { | ||
111 | case PCI_DEVICE_ID_INTEL_NTB_SS_JSF: | ||
112 | case PCI_DEVICE_ID_INTEL_NTB_SS_SNB: | ||
113 | case PCI_DEVICE_ID_INTEL_NTB_SS_IVT: | ||
114 | case PCI_DEVICE_ID_INTEL_NTB_SS_HSX: | ||
115 | case PCI_DEVICE_ID_INTEL_NTB_PS_JSF: | ||
116 | case PCI_DEVICE_ID_INTEL_NTB_PS_SNB: | ||
117 | case PCI_DEVICE_ID_INTEL_NTB_PS_IVT: | ||
118 | case PCI_DEVICE_ID_INTEL_NTB_PS_HSX: | ||
119 | case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF: | ||
120 | case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB: | ||
121 | case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT: | ||
122 | case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX: | ||
123 | return 1; | ||
124 | default: | ||
125 | return 0; | ||
126 | } | ||
127 | |||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | static int is_ntb_atom(struct ntb_device *ndev) | ||
132 | { | ||
133 | switch (ndev->pdev->device) { | ||
134 | case PCI_DEVICE_ID_INTEL_NTB_B2B_BWD: | ||
135 | return 1; | ||
136 | default: | ||
137 | return 0; | ||
138 | } | ||
139 | |||
140 | return 0; | ||
141 | } | ||
142 | |||
143 | static void ntb_set_errata_flags(struct ntb_device *ndev) | ||
144 | { | ||
145 | switch (ndev->pdev->device) { | ||
146 | /* | ||
147 | * this workaround applies to all platform up to IvyBridge | ||
148 | * Haswell has splitbar support and use a different workaround | ||
149 | */ | ||
150 | case PCI_DEVICE_ID_INTEL_NTB_SS_JSF: | ||
151 | case PCI_DEVICE_ID_INTEL_NTB_SS_SNB: | ||
152 | case PCI_DEVICE_ID_INTEL_NTB_SS_IVT: | ||
153 | case PCI_DEVICE_ID_INTEL_NTB_SS_HSX: | ||
154 | case PCI_DEVICE_ID_INTEL_NTB_PS_JSF: | ||
155 | case PCI_DEVICE_ID_INTEL_NTB_PS_SNB: | ||
156 | case PCI_DEVICE_ID_INTEL_NTB_PS_IVT: | ||
157 | case PCI_DEVICE_ID_INTEL_NTB_PS_HSX: | ||
158 | case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF: | ||
159 | case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB: | ||
160 | case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT: | ||
161 | case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX: | ||
162 | ndev->wa_flags |= WA_SNB_ERR; | ||
163 | break; | ||
164 | } | ||
165 | } | ||
166 | |||
112 | /** | 167 | /** |
113 | * ntb_register_event_callback() - register event callback | 168 | * ntb_register_event_callback() - register event callback |
114 | * @ndev: pointer to ntb_device instance | 169 | * @ndev: pointer to ntb_device instance |
@@ -451,8 +506,14 @@ void ntb_set_mw_addr(struct ntb_device *ndev, unsigned int mw, u64 addr) | |||
451 | case NTB_BAR_23: | 506 | case NTB_BAR_23: |
452 | writeq(addr, ndev->reg_ofs.bar2_xlat); | 507 | writeq(addr, ndev->reg_ofs.bar2_xlat); |
453 | break; | 508 | break; |
454 | case NTB_BAR_45: | 509 | case NTB_BAR_4: |
455 | writeq(addr, ndev->reg_ofs.bar4_xlat); | 510 | if (ndev->split_bar) |
511 | writel(addr, ndev->reg_ofs.bar4_xlat); | ||
512 | else | ||
513 | writeq(addr, ndev->reg_ofs.bar4_xlat); | ||
514 | break; | ||
515 | case NTB_BAR_5: | ||
516 | writel(addr, ndev->reg_ofs.bar5_xlat); | ||
456 | break; | 517 | break; |
457 | } | 518 | } |
458 | } | 519 | } |
@@ -535,7 +596,7 @@ static void ntb_link_event(struct ntb_device *ndev, int link_state) | |||
535 | ndev->link_status = NTB_LINK_UP; | 596 | ndev->link_status = NTB_LINK_UP; |
536 | event = NTB_EVENT_HW_LINK_UP; | 597 | event = NTB_EVENT_HW_LINK_UP; |
537 | 598 | ||
538 | if (ndev->hw_type == BWD_HW || | 599 | if (is_ntb_atom(ndev) || |
539 | ndev->conn_type == NTB_CONN_TRANSPARENT) | 600 | ndev->conn_type == NTB_CONN_TRANSPARENT) |
540 | status = readw(ndev->reg_ofs.lnk_stat); | 601 | status = readw(ndev->reg_ofs.lnk_stat); |
541 | else { | 602 | else { |
@@ -566,7 +627,7 @@ static int ntb_link_status(struct ntb_device *ndev) | |||
566 | { | 627 | { |
567 | int link_state; | 628 | int link_state; |
568 | 629 | ||
569 | if (ndev->hw_type == BWD_HW) { | 630 | if (is_ntb_atom(ndev)) { |
570 | u32 ntb_cntl; | 631 | u32 ntb_cntl; |
571 | 632 | ||
572 | ntb_cntl = readl(ndev->reg_ofs.lnk_cntl); | 633 | ntb_cntl = readl(ndev->reg_ofs.lnk_cntl); |
@@ -667,29 +728,16 @@ static void bwd_link_poll(struct work_struct *work) | |||
667 | 728 | ||
668 | static int ntb_xeon_setup(struct ntb_device *ndev) | 729 | static int ntb_xeon_setup(struct ntb_device *ndev) |
669 | { | 730 | { |
670 | int rc; | 731 | switch (ndev->conn_type) { |
671 | u8 val; | ||
672 | |||
673 | ndev->hw_type = SNB_HW; | ||
674 | |||
675 | rc = pci_read_config_byte(ndev->pdev, NTB_PPD_OFFSET, &val); | ||
676 | if (rc) | ||
677 | return rc; | ||
678 | |||
679 | if (val & SNB_PPD_DEV_TYPE) | ||
680 | ndev->dev_type = NTB_DEV_USD; | ||
681 | else | ||
682 | ndev->dev_type = NTB_DEV_DSD; | ||
683 | |||
684 | switch (val & SNB_PPD_CONN_TYPE) { | ||
685 | case NTB_CONN_B2B: | 732 | case NTB_CONN_B2B: |
686 | dev_info(&ndev->pdev->dev, "Conn Type = B2B\n"); | ||
687 | ndev->conn_type = NTB_CONN_B2B; | ||
688 | ndev->reg_ofs.ldb = ndev->reg_base + SNB_PDOORBELL_OFFSET; | 733 | ndev->reg_ofs.ldb = ndev->reg_base + SNB_PDOORBELL_OFFSET; |
689 | ndev->reg_ofs.ldb_mask = ndev->reg_base + SNB_PDBMSK_OFFSET; | 734 | ndev->reg_ofs.ldb_mask = ndev->reg_base + SNB_PDBMSK_OFFSET; |
690 | ndev->reg_ofs.spad_read = ndev->reg_base + SNB_SPAD_OFFSET; | 735 | ndev->reg_ofs.spad_read = ndev->reg_base + SNB_SPAD_OFFSET; |
691 | ndev->reg_ofs.bar2_xlat = ndev->reg_base + SNB_SBAR2XLAT_OFFSET; | 736 | ndev->reg_ofs.bar2_xlat = ndev->reg_base + SNB_SBAR2XLAT_OFFSET; |
692 | ndev->reg_ofs.bar4_xlat = ndev->reg_base + SNB_SBAR4XLAT_OFFSET; | 737 | ndev->reg_ofs.bar4_xlat = ndev->reg_base + SNB_SBAR4XLAT_OFFSET; |
738 | if (ndev->split_bar) | ||
739 | ndev->reg_ofs.bar5_xlat = | ||
740 | ndev->reg_base + SNB_SBAR5XLAT_OFFSET; | ||
693 | ndev->limits.max_spads = SNB_MAX_B2B_SPADS; | 741 | ndev->limits.max_spads = SNB_MAX_B2B_SPADS; |
694 | 742 | ||
695 | /* There is a Xeon hardware errata related to writes to | 743 | /* There is a Xeon hardware errata related to writes to |
@@ -698,16 +746,17 @@ static int ntb_xeon_setup(struct ntb_device *ndev) | |||
698 | * this use the second memory window to access the interrupt and | 746 | * this use the second memory window to access the interrupt and |
699 | * scratch pad registers on the remote system. | 747 | * scratch pad registers on the remote system. |
700 | */ | 748 | */ |
701 | if (xeon_errata_workaround) { | 749 | if (ndev->wa_flags & WA_SNB_ERR) { |
702 | if (!ndev->mw[1].bar_sz) | 750 | if (!ndev->mw[ndev->limits.max_mw - 1].bar_sz) |
703 | return -EINVAL; | 751 | return -EINVAL; |
704 | 752 | ||
705 | ndev->limits.max_mw = SNB_ERRATA_MAX_MW; | ||
706 | ndev->limits.max_db_bits = SNB_MAX_DB_BITS; | 753 | ndev->limits.max_db_bits = SNB_MAX_DB_BITS; |
707 | ndev->reg_ofs.spad_write = ndev->mw[1].vbase + | 754 | ndev->reg_ofs.spad_write = |
708 | SNB_SPAD_OFFSET; | 755 | ndev->mw[ndev->limits.max_mw - 1].vbase + |
709 | ndev->reg_ofs.rdb = ndev->mw[1].vbase + | 756 | SNB_SPAD_OFFSET; |
710 | SNB_PDOORBELL_OFFSET; | 757 | ndev->reg_ofs.rdb = |
758 | ndev->mw[ndev->limits.max_mw - 1].vbase + | ||
759 | SNB_PDOORBELL_OFFSET; | ||
711 | 760 | ||
712 | /* Set the Limit register to 4k, the minimum size, to | 761 | /* Set the Limit register to 4k, the minimum size, to |
713 | * prevent an illegal access | 762 | * prevent an illegal access |
@@ -720,9 +769,9 @@ static int ntb_xeon_setup(struct ntb_device *ndev) | |||
720 | * the driver defaults, but write the Limit registers | 769 | * the driver defaults, but write the Limit registers |
721 | * first just in case. | 770 | * first just in case. |
722 | */ | 771 | */ |
723 | } else { | ||
724 | ndev->limits.max_mw = SNB_MAX_MW; | ||
725 | 772 | ||
773 | ndev->limits.max_mw = SNB_ERRATA_MAX_MW; | ||
774 | } else { | ||
726 | /* HW Errata on bit 14 of b2bdoorbell register. Writes | 775 | /* HW Errata on bit 14 of b2bdoorbell register. Writes |
727 | * will not be mirrored to the remote system. Shrink | 776 | * will not be mirrored to the remote system. Shrink |
728 | * the number of bits by one, since bit 14 is the last | 777 | * the number of bits by one, since bit 14 is the last |
@@ -735,7 +784,8 @@ static int ntb_xeon_setup(struct ntb_device *ndev) | |||
735 | SNB_B2B_DOORBELL_OFFSET; | 784 | SNB_B2B_DOORBELL_OFFSET; |
736 | 785 | ||
737 | /* Disable the Limit register, just incase it is set to | 786 | /* Disable the Limit register, just incase it is set to |
738 | * something silly | 787 | * something silly. A 64bit write should handle it |
788 | * regardless of whether it has a split BAR or not. | ||
739 | */ | 789 | */ |
740 | writeq(0, ndev->reg_base + SNB_PBAR4LMT_OFFSET); | 790 | writeq(0, ndev->reg_base + SNB_PBAR4LMT_OFFSET); |
741 | /* HW errata on the Limit registers. They can only be | 791 | /* HW errata on the Limit registers. They can only be |
@@ -744,6 +794,10 @@ static int ntb_xeon_setup(struct ntb_device *ndev) | |||
744 | * the driver defaults, but write the Limit registers | 794 | * the driver defaults, but write the Limit registers |
745 | * first just in case. | 795 | * first just in case. |
746 | */ | 796 | */ |
797 | if (ndev->split_bar) | ||
798 | ndev->limits.max_mw = HSX_SPLITBAR_MAX_MW; | ||
799 | else | ||
800 | ndev->limits.max_mw = SNB_MAX_MW; | ||
747 | } | 801 | } |
748 | 802 | ||
749 | /* The Xeon errata workaround requires setting SBAR Base | 803 | /* The Xeon errata workaround requires setting SBAR Base |
@@ -753,12 +807,22 @@ static int ntb_xeon_setup(struct ntb_device *ndev) | |||
753 | if (ndev->dev_type == NTB_DEV_USD) { | 807 | if (ndev->dev_type == NTB_DEV_USD) { |
754 | writeq(SNB_MBAR23_DSD_ADDR, ndev->reg_base + | 808 | writeq(SNB_MBAR23_DSD_ADDR, ndev->reg_base + |
755 | SNB_PBAR2XLAT_OFFSET); | 809 | SNB_PBAR2XLAT_OFFSET); |
756 | if (xeon_errata_workaround) | 810 | if (ndev->wa_flags & WA_SNB_ERR) |
757 | writeq(SNB_MBAR01_DSD_ADDR, ndev->reg_base + | 811 | writeq(SNB_MBAR01_DSD_ADDR, ndev->reg_base + |
758 | SNB_PBAR4XLAT_OFFSET); | 812 | SNB_PBAR4XLAT_OFFSET); |
759 | else { | 813 | else { |
760 | writeq(SNB_MBAR45_DSD_ADDR, ndev->reg_base + | 814 | if (ndev->split_bar) { |
761 | SNB_PBAR4XLAT_OFFSET); | 815 | writel(SNB_MBAR4_DSD_ADDR, |
816 | ndev->reg_base + | ||
817 | SNB_PBAR4XLAT_OFFSET); | ||
818 | writel(SNB_MBAR5_DSD_ADDR, | ||
819 | ndev->reg_base + | ||
820 | SNB_PBAR5XLAT_OFFSET); | ||
821 | } else | ||
822 | writeq(SNB_MBAR4_DSD_ADDR, | ||
823 | ndev->reg_base + | ||
824 | SNB_PBAR4XLAT_OFFSET); | ||
825 | |||
762 | /* B2B_XLAT_OFFSET is a 64bit register, but can | 826 | /* B2B_XLAT_OFFSET is a 64bit register, but can |
763 | * only take 32bit writes | 827 | * only take 32bit writes |
764 | */ | 828 | */ |
@@ -772,18 +836,35 @@ static int ntb_xeon_setup(struct ntb_device *ndev) | |||
772 | SNB_SBAR0BASE_OFFSET); | 836 | SNB_SBAR0BASE_OFFSET); |
773 | writeq(SNB_MBAR23_USD_ADDR, ndev->reg_base + | 837 | writeq(SNB_MBAR23_USD_ADDR, ndev->reg_base + |
774 | SNB_SBAR2BASE_OFFSET); | 838 | SNB_SBAR2BASE_OFFSET); |
775 | writeq(SNB_MBAR45_USD_ADDR, ndev->reg_base + | 839 | if (ndev->split_bar) { |
776 | SNB_SBAR4BASE_OFFSET); | 840 | writel(SNB_MBAR4_USD_ADDR, ndev->reg_base + |
841 | SNB_SBAR4BASE_OFFSET); | ||
842 | writel(SNB_MBAR5_USD_ADDR, ndev->reg_base + | ||
843 | SNB_SBAR5BASE_OFFSET); | ||
844 | } else | ||
845 | writeq(SNB_MBAR4_USD_ADDR, ndev->reg_base + | ||
846 | SNB_SBAR4BASE_OFFSET); | ||
777 | } else { | 847 | } else { |
778 | writeq(SNB_MBAR23_USD_ADDR, ndev->reg_base + | 848 | writeq(SNB_MBAR23_USD_ADDR, ndev->reg_base + |
779 | SNB_PBAR2XLAT_OFFSET); | 849 | SNB_PBAR2XLAT_OFFSET); |
780 | if (xeon_errata_workaround) | 850 | if (ndev->wa_flags & WA_SNB_ERR) |
781 | writeq(SNB_MBAR01_USD_ADDR, ndev->reg_base + | 851 | writeq(SNB_MBAR01_USD_ADDR, ndev->reg_base + |
782 | SNB_PBAR4XLAT_OFFSET); | 852 | SNB_PBAR4XLAT_OFFSET); |
783 | else { | 853 | else { |
784 | writeq(SNB_MBAR45_USD_ADDR, ndev->reg_base + | 854 | if (ndev->split_bar) { |
785 | SNB_PBAR4XLAT_OFFSET); | 855 | writel(SNB_MBAR4_USD_ADDR, |
786 | /* B2B_XLAT_OFFSET is a 64bit register, but can | 856 | ndev->reg_base + |
857 | SNB_PBAR4XLAT_OFFSET); | ||
858 | writel(SNB_MBAR5_USD_ADDR, | ||
859 | ndev->reg_base + | ||
860 | SNB_PBAR5XLAT_OFFSET); | ||
861 | } else | ||
862 | writeq(SNB_MBAR4_USD_ADDR, | ||
863 | ndev->reg_base + | ||
864 | SNB_PBAR4XLAT_OFFSET); | ||
865 | |||
866 | /* | ||
867 | * B2B_XLAT_OFFSET is a 64bit register, but can | ||
787 | * only take 32bit writes | 868 | * only take 32bit writes |
788 | */ | 869 | */ |
789 | writel(SNB_MBAR01_USD_ADDR & 0xffffffff, | 870 | writel(SNB_MBAR01_USD_ADDR & 0xffffffff, |
@@ -795,17 +876,21 @@ static int ntb_xeon_setup(struct ntb_device *ndev) | |||
795 | SNB_SBAR0BASE_OFFSET); | 876 | SNB_SBAR0BASE_OFFSET); |
796 | writeq(SNB_MBAR23_DSD_ADDR, ndev->reg_base + | 877 | writeq(SNB_MBAR23_DSD_ADDR, ndev->reg_base + |
797 | SNB_SBAR2BASE_OFFSET); | 878 | SNB_SBAR2BASE_OFFSET); |
798 | writeq(SNB_MBAR45_DSD_ADDR, ndev->reg_base + | 879 | if (ndev->split_bar) { |
799 | SNB_SBAR4BASE_OFFSET); | 880 | writel(SNB_MBAR4_DSD_ADDR, ndev->reg_base + |
881 | SNB_SBAR4BASE_OFFSET); | ||
882 | writel(SNB_MBAR5_DSD_ADDR, ndev->reg_base + | ||
883 | SNB_SBAR5BASE_OFFSET); | ||
884 | } else | ||
885 | writeq(SNB_MBAR4_DSD_ADDR, ndev->reg_base + | ||
886 | SNB_SBAR4BASE_OFFSET); | ||
887 | |||
800 | } | 888 | } |
801 | break; | 889 | break; |
802 | case NTB_CONN_RP: | 890 | case NTB_CONN_RP: |
803 | dev_info(&ndev->pdev->dev, "Conn Type = RP\n"); | 891 | if (ndev->wa_flags & WA_SNB_ERR) { |
804 | ndev->conn_type = NTB_CONN_RP; | ||
805 | |||
806 | if (xeon_errata_workaround) { | ||
807 | dev_err(&ndev->pdev->dev, | 892 | dev_err(&ndev->pdev->dev, |
808 | "NTB-RP disabled due to hardware errata. To disregard this warning and potentially lock-up the system, add the parameter 'xeon_errata_workaround=0'.\n"); | 893 | "NTB-RP disabled due to hardware errata.\n"); |
809 | return -EINVAL; | 894 | return -EINVAL; |
810 | } | 895 | } |
811 | 896 | ||
@@ -829,11 +914,20 @@ static int ntb_xeon_setup(struct ntb_device *ndev) | |||
829 | ndev->reg_ofs.spad_read = ndev->reg_base + SNB_SPAD_OFFSET; | 914 | ndev->reg_ofs.spad_read = ndev->reg_base + SNB_SPAD_OFFSET; |
830 | ndev->reg_ofs.bar2_xlat = ndev->reg_base + SNB_SBAR2XLAT_OFFSET; | 915 | ndev->reg_ofs.bar2_xlat = ndev->reg_base + SNB_SBAR2XLAT_OFFSET; |
831 | ndev->reg_ofs.bar4_xlat = ndev->reg_base + SNB_SBAR4XLAT_OFFSET; | 916 | ndev->reg_ofs.bar4_xlat = ndev->reg_base + SNB_SBAR4XLAT_OFFSET; |
832 | ndev->limits.max_mw = SNB_MAX_MW; | 917 | if (ndev->split_bar) { |
918 | ndev->reg_ofs.bar5_xlat = | ||
919 | ndev->reg_base + SNB_SBAR5XLAT_OFFSET; | ||
920 | ndev->limits.max_mw = HSX_SPLITBAR_MAX_MW; | ||
921 | } else | ||
922 | ndev->limits.max_mw = SNB_MAX_MW; | ||
833 | break; | 923 | break; |
834 | case NTB_CONN_TRANSPARENT: | 924 | case NTB_CONN_TRANSPARENT: |
835 | dev_info(&ndev->pdev->dev, "Conn Type = TRANSPARENT\n"); | 925 | if (ndev->wa_flags & WA_SNB_ERR) { |
836 | ndev->conn_type = NTB_CONN_TRANSPARENT; | 926 | dev_err(&ndev->pdev->dev, |
927 | "NTB-TRANSPARENT disabled due to hardware errata.\n"); | ||
928 | return -EINVAL; | ||
929 | } | ||
930 | |||
837 | /* Scratch pads need to have exclusive access from the primary | 931 | /* Scratch pads need to have exclusive access from the primary |
838 | * or secondary side. Halve the num spads so that each side can | 932 | * or secondary side. Halve the num spads so that each side can |
839 | * have an equal amount. | 933 | * have an equal amount. |
@@ -852,13 +946,18 @@ static int ntb_xeon_setup(struct ntb_device *ndev) | |||
852 | ndev->reg_ofs.bar2_xlat = ndev->reg_base + SNB_PBAR2XLAT_OFFSET; | 946 | ndev->reg_ofs.bar2_xlat = ndev->reg_base + SNB_PBAR2XLAT_OFFSET; |
853 | ndev->reg_ofs.bar4_xlat = ndev->reg_base + SNB_PBAR4XLAT_OFFSET; | 947 | ndev->reg_ofs.bar4_xlat = ndev->reg_base + SNB_PBAR4XLAT_OFFSET; |
854 | 948 | ||
855 | ndev->limits.max_mw = SNB_MAX_MW; | 949 | if (ndev->split_bar) { |
950 | ndev->reg_ofs.bar5_xlat = | ||
951 | ndev->reg_base + SNB_PBAR5XLAT_OFFSET; | ||
952 | ndev->limits.max_mw = HSX_SPLITBAR_MAX_MW; | ||
953 | } else | ||
954 | ndev->limits.max_mw = SNB_MAX_MW; | ||
856 | break; | 955 | break; |
857 | default: | 956 | default: |
858 | /* Most likely caused by the remote NTB-RP device not being | 957 | /* |
859 | * configured | 958 | * we should never hit this. the detect function should've |
959 | * take cared of everything. | ||
860 | */ | 960 | */ |
861 | dev_err(&ndev->pdev->dev, "Unknown PPD %x\n", val); | ||
862 | return -EINVAL; | 961 | return -EINVAL; |
863 | } | 962 | } |
864 | 963 | ||
@@ -932,34 +1031,16 @@ static int ntb_device_setup(struct ntb_device *ndev) | |||
932 | { | 1031 | { |
933 | int rc; | 1032 | int rc; |
934 | 1033 | ||
935 | switch (ndev->pdev->device) { | 1034 | if (is_ntb_xeon(ndev)) |
936 | case PCI_DEVICE_ID_INTEL_NTB_SS_JSF: | ||
937 | case PCI_DEVICE_ID_INTEL_NTB_SS_SNB: | ||
938 | case PCI_DEVICE_ID_INTEL_NTB_SS_IVT: | ||
939 | case PCI_DEVICE_ID_INTEL_NTB_SS_HSX: | ||
940 | case PCI_DEVICE_ID_INTEL_NTB_PS_JSF: | ||
941 | case PCI_DEVICE_ID_INTEL_NTB_PS_SNB: | ||
942 | case PCI_DEVICE_ID_INTEL_NTB_PS_IVT: | ||
943 | case PCI_DEVICE_ID_INTEL_NTB_PS_HSX: | ||
944 | case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF: | ||
945 | case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB: | ||
946 | case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT: | ||
947 | case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX: | ||
948 | rc = ntb_xeon_setup(ndev); | 1035 | rc = ntb_xeon_setup(ndev); |
949 | break; | 1036 | else if (is_ntb_atom(ndev)) |
950 | case PCI_DEVICE_ID_INTEL_NTB_B2B_BWD: | ||
951 | rc = ntb_bwd_setup(ndev); | 1037 | rc = ntb_bwd_setup(ndev); |
952 | break; | 1038 | else |
953 | default: | ||
954 | rc = -ENODEV; | 1039 | rc = -ENODEV; |
955 | } | ||
956 | 1040 | ||
957 | if (rc) | 1041 | if (rc) |
958 | return rc; | 1042 | return rc; |
959 | 1043 | ||
960 | dev_info(&ndev->pdev->dev, "Device Type = %s\n", | ||
961 | ndev->dev_type == NTB_DEV_USD ? "USD/DSP" : "DSD/USP"); | ||
962 | |||
963 | if (ndev->conn_type == NTB_CONN_B2B) | 1044 | if (ndev->conn_type == NTB_CONN_B2B) |
964 | /* Enable Bus Master and Memory Space on the secondary side */ | 1045 | /* Enable Bus Master and Memory Space on the secondary side */ |
965 | writew(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER, | 1046 | writew(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER, |
@@ -970,7 +1051,7 @@ static int ntb_device_setup(struct ntb_device *ndev) | |||
970 | 1051 | ||
971 | static void ntb_device_free(struct ntb_device *ndev) | 1052 | static void ntb_device_free(struct ntb_device *ndev) |
972 | { | 1053 | { |
973 | if (ndev->hw_type == BWD_HW) { | 1054 | if (is_ntb_atom(ndev)) { |
974 | cancel_delayed_work_sync(&ndev->hb_timer); | 1055 | cancel_delayed_work_sync(&ndev->hb_timer); |
975 | cancel_delayed_work_sync(&ndev->lr_timer); | 1056 | cancel_delayed_work_sync(&ndev->lr_timer); |
976 | } | 1057 | } |
@@ -1050,7 +1131,7 @@ static irqreturn_t ntb_interrupt(int irq, void *dev) | |||
1050 | struct ntb_device *ndev = dev; | 1131 | struct ntb_device *ndev = dev; |
1051 | unsigned int i = 0; | 1132 | unsigned int i = 0; |
1052 | 1133 | ||
1053 | if (ndev->hw_type == BWD_HW) { | 1134 | if (is_ntb_atom(ndev)) { |
1054 | u64 ldb = readq(ndev->reg_ofs.ldb); | 1135 | u64 ldb = readq(ndev->reg_ofs.ldb); |
1055 | 1136 | ||
1056 | dev_dbg(&ndev->pdev->dev, "irq %d - ldb = %Lx\n", irq, ldb); | 1137 | dev_dbg(&ndev->pdev->dev, "irq %d - ldb = %Lx\n", irq, ldb); |
@@ -1192,7 +1273,7 @@ static int ntb_setup_msix(struct ntb_device *ndev) | |||
1192 | for (i = 0; i < msix_entries; i++) | 1273 | for (i = 0; i < msix_entries; i++) |
1193 | ndev->msix_entries[i].entry = i; | 1274 | ndev->msix_entries[i].entry = i; |
1194 | 1275 | ||
1195 | if (ndev->hw_type == BWD_HW) | 1276 | if (is_ntb_atom(ndev)) |
1196 | rc = ntb_setup_bwd_msix(ndev, msix_entries); | 1277 | rc = ntb_setup_bwd_msix(ndev, msix_entries); |
1197 | else | 1278 | else |
1198 | rc = ntb_setup_snb_msix(ndev, msix_entries); | 1279 | rc = ntb_setup_snb_msix(ndev, msix_entries); |
@@ -1252,7 +1333,7 @@ static int ntb_setup_interrupts(struct ntb_device *ndev) | |||
1252 | /* On BWD, disable all interrupts. On SNB, disable all but Link | 1333 | /* On BWD, disable all interrupts. On SNB, disable all but Link |
1253 | * Interrupt. The rest will be unmasked as callbacks are registered. | 1334 | * Interrupt. The rest will be unmasked as callbacks are registered. |
1254 | */ | 1335 | */ |
1255 | if (ndev->hw_type == BWD_HW) | 1336 | if (is_ntb_atom(ndev)) |
1256 | writeq(~0, ndev->reg_ofs.ldb_mask); | 1337 | writeq(~0, ndev->reg_ofs.ldb_mask); |
1257 | else { | 1338 | else { |
1258 | u16 var = 1 << SNB_LINK_DB; | 1339 | u16 var = 1 << SNB_LINK_DB; |
@@ -1285,7 +1366,7 @@ static void ntb_free_interrupts(struct ntb_device *ndev) | |||
1285 | struct pci_dev *pdev = ndev->pdev; | 1366 | struct pci_dev *pdev = ndev->pdev; |
1286 | 1367 | ||
1287 | /* mask interrupts */ | 1368 | /* mask interrupts */ |
1288 | if (ndev->hw_type == BWD_HW) | 1369 | if (is_ntb_atom(ndev)) |
1289 | writeq(~0, ndev->reg_ofs.ldb_mask); | 1370 | writeq(~0, ndev->reg_ofs.ldb_mask); |
1290 | else | 1371 | else |
1291 | writew(~0, ndev->reg_ofs.ldb_mask); | 1372 | writew(~0, ndev->reg_ofs.ldb_mask); |
@@ -1296,7 +1377,7 @@ static void ntb_free_interrupts(struct ntb_device *ndev) | |||
1296 | 1377 | ||
1297 | for (i = 0; i < ndev->num_msix; i++) { | 1378 | for (i = 0; i < ndev->num_msix; i++) { |
1298 | msix = &ndev->msix_entries[i]; | 1379 | msix = &ndev->msix_entries[i]; |
1299 | if (ndev->hw_type != BWD_HW && i == ndev->num_msix - 1) | 1380 | if (is_ntb_xeon(ndev) && i == ndev->num_msix - 1) |
1300 | free_irq(msix->vector, ndev); | 1381 | free_irq(msix->vector, ndev); |
1301 | else | 1382 | else |
1302 | free_irq(msix->vector, &ndev->db_cb[i]); | 1383 | free_irq(msix->vector, &ndev->db_cb[i]); |
@@ -1344,6 +1425,101 @@ static void ntb_free_callbacks(struct ntb_device *ndev) | |||
1344 | kfree(ndev->db_cb); | 1425 | kfree(ndev->db_cb); |
1345 | } | 1426 | } |
1346 | 1427 | ||
1428 | static ssize_t ntb_debugfs_read(struct file *filp, char __user *ubuf, | ||
1429 | size_t count, loff_t *offp) | ||
1430 | { | ||
1431 | struct ntb_device *ndev; | ||
1432 | char *buf; | ||
1433 | ssize_t ret, offset, out_count; | ||
1434 | |||
1435 | out_count = 500; | ||
1436 | |||
1437 | buf = kmalloc(out_count, GFP_KERNEL); | ||
1438 | if (!buf) | ||
1439 | return -ENOMEM; | ||
1440 | |||
1441 | ndev = filp->private_data; | ||
1442 | offset = 0; | ||
1443 | offset += snprintf(buf + offset, out_count - offset, | ||
1444 | "NTB Device Information:\n"); | ||
1445 | offset += snprintf(buf + offset, out_count - offset, | ||
1446 | "Connection Type - \t\t%s\n", | ||
1447 | ndev->conn_type == NTB_CONN_TRANSPARENT ? | ||
1448 | "Transparent" : (ndev->conn_type == NTB_CONN_B2B) ? | ||
1449 | "Back to back" : "Root Port"); | ||
1450 | offset += snprintf(buf + offset, out_count - offset, | ||
1451 | "Device Type - \t\t\t%s\n", | ||
1452 | ndev->dev_type == NTB_DEV_USD ? | ||
1453 | "DSD/USP" : "USD/DSP"); | ||
1454 | offset += snprintf(buf + offset, out_count - offset, | ||
1455 | "Max Number of Callbacks - \t%u\n", | ||
1456 | ntb_max_cbs(ndev)); | ||
1457 | offset += snprintf(buf + offset, out_count - offset, | ||
1458 | "Link Status - \t\t\t%s\n", | ||
1459 | ntb_hw_link_status(ndev) ? "Up" : "Down"); | ||
1460 | if (ntb_hw_link_status(ndev)) { | ||
1461 | offset += snprintf(buf + offset, out_count - offset, | ||
1462 | "Link Speed - \t\t\tPCI-E Gen %u\n", | ||
1463 | ndev->link_speed); | ||
1464 | offset += snprintf(buf + offset, out_count - offset, | ||
1465 | "Link Width - \t\t\tx%u\n", | ||
1466 | ndev->link_width); | ||
1467 | } | ||
1468 | |||
1469 | if (is_ntb_xeon(ndev)) { | ||
1470 | u32 status32; | ||
1471 | u16 status16; | ||
1472 | int rc; | ||
1473 | |||
1474 | offset += snprintf(buf + offset, out_count - offset, | ||
1475 | "\nNTB Device Statistics:\n"); | ||
1476 | offset += snprintf(buf + offset, out_count - offset, | ||
1477 | "Upstream Memory Miss - \t%u\n", | ||
1478 | readw(ndev->reg_base + | ||
1479 | SNB_USMEMMISS_OFFSET)); | ||
1480 | |||
1481 | offset += snprintf(buf + offset, out_count - offset, | ||
1482 | "\nNTB Hardware Errors:\n"); | ||
1483 | |||
1484 | rc = pci_read_config_word(ndev->pdev, SNB_DEVSTS_OFFSET, | ||
1485 | &status16); | ||
1486 | if (!rc) | ||
1487 | offset += snprintf(buf + offset, out_count - offset, | ||
1488 | "DEVSTS - \t%#06x\n", status16); | ||
1489 | |||
1490 | rc = pci_read_config_word(ndev->pdev, SNB_LINK_STATUS_OFFSET, | ||
1491 | &status16); | ||
1492 | if (!rc) | ||
1493 | offset += snprintf(buf + offset, out_count - offset, | ||
1494 | "LNKSTS - \t%#06x\n", status16); | ||
1495 | |||
1496 | rc = pci_read_config_dword(ndev->pdev, SNB_UNCERRSTS_OFFSET, | ||
1497 | &status32); | ||
1498 | if (!rc) | ||
1499 | offset += snprintf(buf + offset, out_count - offset, | ||
1500 | "UNCERRSTS - \t%#010x\n", status32); | ||
1501 | |||
1502 | rc = pci_read_config_dword(ndev->pdev, SNB_CORERRSTS_OFFSET, | ||
1503 | &status32); | ||
1504 | if (!rc) | ||
1505 | offset += snprintf(buf + offset, out_count - offset, | ||
1506 | "CORERRSTS - \t%#010x\n", status32); | ||
1507 | } | ||
1508 | |||
1509 | if (offset > out_count) | ||
1510 | offset = out_count; | ||
1511 | |||
1512 | ret = simple_read_from_buffer(ubuf, count, offp, buf, offset); | ||
1513 | kfree(buf); | ||
1514 | return ret; | ||
1515 | } | ||
1516 | |||
1517 | static const struct file_operations ntb_debugfs_info = { | ||
1518 | .owner = THIS_MODULE, | ||
1519 | .open = simple_open, | ||
1520 | .read = ntb_debugfs_read, | ||
1521 | }; | ||
1522 | |||
1347 | static void ntb_setup_debugfs(struct ntb_device *ndev) | 1523 | static void ntb_setup_debugfs(struct ntb_device *ndev) |
1348 | { | 1524 | { |
1349 | if (!debugfs_initialized()) | 1525 | if (!debugfs_initialized()) |
@@ -1354,6 +1530,11 @@ static void ntb_setup_debugfs(struct ntb_device *ndev) | |||
1354 | 1530 | ||
1355 | ndev->debugfs_dir = debugfs_create_dir(pci_name(ndev->pdev), | 1531 | ndev->debugfs_dir = debugfs_create_dir(pci_name(ndev->pdev), |
1356 | debugfs_dir); | 1532 | debugfs_dir); |
1533 | if (ndev->debugfs_dir) | ||
1534 | ndev->debugfs_info = debugfs_create_file("info", S_IRUSR, | ||
1535 | ndev->debugfs_dir, | ||
1536 | ndev, | ||
1537 | &ntb_debugfs_info); | ||
1357 | } | 1538 | } |
1358 | 1539 | ||
1359 | static void ntb_free_debugfs(struct ntb_device *ndev) | 1540 | static void ntb_free_debugfs(struct ntb_device *ndev) |
@@ -1377,7 +1558,11 @@ static void ntb_hw_link_up(struct ntb_device *ndev) | |||
1377 | ntb_cntl = readl(ndev->reg_ofs.lnk_cntl); | 1558 | ntb_cntl = readl(ndev->reg_ofs.lnk_cntl); |
1378 | ntb_cntl &= ~(NTB_CNTL_LINK_DISABLE | NTB_CNTL_CFG_LOCK); | 1559 | ntb_cntl &= ~(NTB_CNTL_LINK_DISABLE | NTB_CNTL_CFG_LOCK); |
1379 | ntb_cntl |= NTB_CNTL_P2S_BAR23_SNOOP | NTB_CNTL_S2P_BAR23_SNOOP; | 1560 | ntb_cntl |= NTB_CNTL_P2S_BAR23_SNOOP | NTB_CNTL_S2P_BAR23_SNOOP; |
1380 | ntb_cntl |= NTB_CNTL_P2S_BAR45_SNOOP | NTB_CNTL_S2P_BAR45_SNOOP; | 1561 | ntb_cntl |= NTB_CNTL_P2S_BAR4_SNOOP | NTB_CNTL_S2P_BAR4_SNOOP; |
1562 | if (ndev->split_bar) | ||
1563 | ntb_cntl |= NTB_CNTL_P2S_BAR5_SNOOP | | ||
1564 | NTB_CNTL_S2P_BAR5_SNOOP; | ||
1565 | |||
1381 | writel(ntb_cntl, ndev->reg_ofs.lnk_cntl); | 1566 | writel(ntb_cntl, ndev->reg_ofs.lnk_cntl); |
1382 | } | 1567 | } |
1383 | } | 1568 | } |
@@ -1394,11 +1579,128 @@ static void ntb_hw_link_down(struct ntb_device *ndev) | |||
1394 | /* Bring NTB link down */ | 1579 | /* Bring NTB link down */ |
1395 | ntb_cntl = readl(ndev->reg_ofs.lnk_cntl); | 1580 | ntb_cntl = readl(ndev->reg_ofs.lnk_cntl); |
1396 | ntb_cntl &= ~(NTB_CNTL_P2S_BAR23_SNOOP | NTB_CNTL_S2P_BAR23_SNOOP); | 1581 | ntb_cntl &= ~(NTB_CNTL_P2S_BAR23_SNOOP | NTB_CNTL_S2P_BAR23_SNOOP); |
1397 | ntb_cntl &= ~(NTB_CNTL_P2S_BAR45_SNOOP | NTB_CNTL_S2P_BAR45_SNOOP); | 1582 | ntb_cntl &= ~(NTB_CNTL_P2S_BAR4_SNOOP | NTB_CNTL_S2P_BAR4_SNOOP); |
1583 | if (ndev->split_bar) | ||
1584 | ntb_cntl &= ~(NTB_CNTL_P2S_BAR5_SNOOP | | ||
1585 | NTB_CNTL_S2P_BAR5_SNOOP); | ||
1398 | ntb_cntl |= NTB_CNTL_LINK_DISABLE | NTB_CNTL_CFG_LOCK; | 1586 | ntb_cntl |= NTB_CNTL_LINK_DISABLE | NTB_CNTL_CFG_LOCK; |
1399 | writel(ntb_cntl, ndev->reg_ofs.lnk_cntl); | 1587 | writel(ntb_cntl, ndev->reg_ofs.lnk_cntl); |
1400 | } | 1588 | } |
1401 | 1589 | ||
1590 | static void ntb_max_mw_detect(struct ntb_device *ndev) | ||
1591 | { | ||
1592 | if (ndev->split_bar) | ||
1593 | ndev->limits.max_mw = HSX_SPLITBAR_MAX_MW; | ||
1594 | else | ||
1595 | ndev->limits.max_mw = SNB_MAX_MW; | ||
1596 | } | ||
1597 | |||
1598 | static int ntb_xeon_detect(struct ntb_device *ndev) | ||
1599 | { | ||
1600 | int rc, bars_mask; | ||
1601 | u32 bars; | ||
1602 | u8 ppd; | ||
1603 | |||
1604 | ndev->hw_type = SNB_HW; | ||
1605 | |||
1606 | rc = pci_read_config_byte(ndev->pdev, NTB_PPD_OFFSET, &ppd); | ||
1607 | if (rc) | ||
1608 | return -EIO; | ||
1609 | |||
1610 | if (ppd & SNB_PPD_DEV_TYPE) | ||
1611 | ndev->dev_type = NTB_DEV_USD; | ||
1612 | else | ||
1613 | ndev->dev_type = NTB_DEV_DSD; | ||
1614 | |||
1615 | ndev->split_bar = (ppd & SNB_PPD_SPLIT_BAR) ? 1 : 0; | ||
1616 | |||
1617 | switch (ppd & SNB_PPD_CONN_TYPE) { | ||
1618 | case NTB_CONN_B2B: | ||
1619 | dev_info(&ndev->pdev->dev, "Conn Type = B2B\n"); | ||
1620 | ndev->conn_type = NTB_CONN_B2B; | ||
1621 | break; | ||
1622 | case NTB_CONN_RP: | ||
1623 | dev_info(&ndev->pdev->dev, "Conn Type = RP\n"); | ||
1624 | ndev->conn_type = NTB_CONN_RP; | ||
1625 | break; | ||
1626 | case NTB_CONN_TRANSPARENT: | ||
1627 | dev_info(&ndev->pdev->dev, "Conn Type = TRANSPARENT\n"); | ||
1628 | ndev->conn_type = NTB_CONN_TRANSPARENT; | ||
1629 | /* | ||
1630 | * This mode is default to USD/DSP. HW does not report | ||
1631 | * properly in transparent mode as it has no knowledge of | ||
1632 | * NTB. We will just force correct here. | ||
1633 | */ | ||
1634 | ndev->dev_type = NTB_DEV_USD; | ||
1635 | |||
1636 | /* | ||
1637 | * This is a way for transparent BAR to figure out if we | ||
1638 | * are doing split BAR or not. There is no way for the hw | ||
1639 | * on the transparent side to know and set the PPD. | ||
1640 | */ | ||
1641 | bars_mask = pci_select_bars(ndev->pdev, IORESOURCE_MEM); | ||
1642 | bars = hweight32(bars_mask); | ||
1643 | if (bars == (HSX_SPLITBAR_MAX_MW + 1)) | ||
1644 | ndev->split_bar = 1; | ||
1645 | |||
1646 | break; | ||
1647 | default: | ||
1648 | dev_err(&ndev->pdev->dev, "Unknown PPD %x\n", ppd); | ||
1649 | return -ENODEV; | ||
1650 | } | ||
1651 | |||
1652 | ntb_max_mw_detect(ndev); | ||
1653 | |||
1654 | return 0; | ||
1655 | } | ||
1656 | |||
1657 | static int ntb_atom_detect(struct ntb_device *ndev) | ||
1658 | { | ||
1659 | int rc; | ||
1660 | u32 ppd; | ||
1661 | |||
1662 | ndev->hw_type = BWD_HW; | ||
1663 | |||
1664 | rc = pci_read_config_dword(ndev->pdev, NTB_PPD_OFFSET, &ppd); | ||
1665 | if (rc) | ||
1666 | return rc; | ||
1667 | |||
1668 | switch ((ppd & BWD_PPD_CONN_TYPE) >> 8) { | ||
1669 | case NTB_CONN_B2B: | ||
1670 | dev_info(&ndev->pdev->dev, "Conn Type = B2B\n"); | ||
1671 | ndev->conn_type = NTB_CONN_B2B; | ||
1672 | break; | ||
1673 | case NTB_CONN_RP: | ||
1674 | default: | ||
1675 | dev_err(&ndev->pdev->dev, "Unsupported NTB configuration\n"); | ||
1676 | return -EINVAL; | ||
1677 | } | ||
1678 | |||
1679 | if (ppd & BWD_PPD_DEV_TYPE) | ||
1680 | ndev->dev_type = NTB_DEV_DSD; | ||
1681 | else | ||
1682 | ndev->dev_type = NTB_DEV_USD; | ||
1683 | |||
1684 | return 0; | ||
1685 | } | ||
1686 | |||
1687 | static int ntb_device_detect(struct ntb_device *ndev) | ||
1688 | { | ||
1689 | int rc; | ||
1690 | |||
1691 | if (is_ntb_xeon(ndev)) | ||
1692 | rc = ntb_xeon_detect(ndev); | ||
1693 | else if (is_ntb_atom(ndev)) | ||
1694 | rc = ntb_atom_detect(ndev); | ||
1695 | else | ||
1696 | rc = -ENODEV; | ||
1697 | |||
1698 | dev_info(&ndev->pdev->dev, "Device Type = %s\n", | ||
1699 | ndev->dev_type == NTB_DEV_USD ? "USD/DSP" : "DSD/USP"); | ||
1700 | |||
1701 | return 0; | ||
1702 | } | ||
1703 | |||
1402 | static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 1704 | static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
1403 | { | 1705 | { |
1404 | struct ntb_device *ndev; | 1706 | struct ntb_device *ndev; |
@@ -1409,6 +1711,9 @@ static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1409 | return -ENOMEM; | 1711 | return -ENOMEM; |
1410 | 1712 | ||
1411 | ndev->pdev = pdev; | 1713 | ndev->pdev = pdev; |
1714 | |||
1715 | ntb_set_errata_flags(ndev); | ||
1716 | |||
1412 | ndev->link_status = NTB_LINK_DOWN; | 1717 | ndev->link_status = NTB_LINK_DOWN; |
1413 | pci_set_drvdata(pdev, ndev); | 1718 | pci_set_drvdata(pdev, ndev); |
1414 | ntb_setup_debugfs(ndev); | 1719 | ntb_setup_debugfs(ndev); |
@@ -1419,22 +1724,54 @@ static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1419 | 1724 | ||
1420 | pci_set_master(ndev->pdev); | 1725 | pci_set_master(ndev->pdev); |
1421 | 1726 | ||
1422 | rc = pci_request_selected_regions(pdev, NTB_BAR_MASK, KBUILD_MODNAME); | 1727 | rc = ntb_device_detect(ndev); |
1423 | if (rc) | 1728 | if (rc) |
1729 | goto err; | ||
1730 | |||
1731 | ndev->mw = kcalloc(ndev->limits.max_mw, sizeof(struct ntb_mw), | ||
1732 | GFP_KERNEL); | ||
1733 | if (!ndev->mw) { | ||
1734 | rc = -ENOMEM; | ||
1424 | goto err1; | 1735 | goto err1; |
1736 | } | ||
1737 | |||
1738 | if (ndev->split_bar) | ||
1739 | rc = pci_request_selected_regions(pdev, NTB_SPLITBAR_MASK, | ||
1740 | KBUILD_MODNAME); | ||
1741 | else | ||
1742 | rc = pci_request_selected_regions(pdev, NTB_BAR_MASK, | ||
1743 | KBUILD_MODNAME); | ||
1744 | |||
1745 | if (rc) | ||
1746 | goto err2; | ||
1425 | 1747 | ||
1426 | ndev->reg_base = pci_ioremap_bar(pdev, NTB_BAR_MMIO); | 1748 | ndev->reg_base = pci_ioremap_bar(pdev, NTB_BAR_MMIO); |
1427 | if (!ndev->reg_base) { | 1749 | if (!ndev->reg_base) { |
1428 | dev_warn(&pdev->dev, "Cannot remap BAR 0\n"); | 1750 | dev_warn(&pdev->dev, "Cannot remap BAR 0\n"); |
1429 | rc = -EIO; | 1751 | rc = -EIO; |
1430 | goto err2; | 1752 | goto err3; |
1431 | } | 1753 | } |
1432 | 1754 | ||
1433 | for (i = 0; i < NTB_MAX_NUM_MW; i++) { | 1755 | for (i = 0; i < ndev->limits.max_mw; i++) { |
1434 | ndev->mw[i].bar_sz = pci_resource_len(pdev, MW_TO_BAR(i)); | 1756 | ndev->mw[i].bar_sz = pci_resource_len(pdev, MW_TO_BAR(i)); |
1435 | ndev->mw[i].vbase = | 1757 | |
1436 | ioremap_wc(pci_resource_start(pdev, MW_TO_BAR(i)), | 1758 | /* |
1437 | ndev->mw[i].bar_sz); | 1759 | * with the errata we need to steal last of the memory |
1760 | * windows for workarounds and they point to MMIO registers. | ||
1761 | */ | ||
1762 | if ((ndev->wa_flags & WA_SNB_ERR) && | ||
1763 | (i == (ndev->limits.max_mw - 1))) { | ||
1764 | ndev->mw[i].vbase = | ||
1765 | ioremap_nocache(pci_resource_start(pdev, | ||
1766 | MW_TO_BAR(i)), | ||
1767 | ndev->mw[i].bar_sz); | ||
1768 | } else { | ||
1769 | ndev->mw[i].vbase = | ||
1770 | ioremap_wc(pci_resource_start(pdev, | ||
1771 | MW_TO_BAR(i)), | ||
1772 | ndev->mw[i].bar_sz); | ||
1773 | } | ||
1774 | |||
1438 | dev_info(&pdev->dev, "MW %d size %llu\n", i, | 1775 | dev_info(&pdev->dev, "MW %d size %llu\n", i, |
1439 | (unsigned long long) ndev->mw[i].bar_sz); | 1776 | (unsigned long long) ndev->mw[i].bar_sz); |
1440 | if (!ndev->mw[i].vbase) { | 1777 | if (!ndev->mw[i].vbase) { |
@@ -1449,7 +1786,7 @@ static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1449 | if (rc) { | 1786 | if (rc) { |
1450 | rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); | 1787 | rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); |
1451 | if (rc) | 1788 | if (rc) |
1452 | goto err3; | 1789 | goto err4; |
1453 | 1790 | ||
1454 | dev_warn(&pdev->dev, "Cannot DMA highmem\n"); | 1791 | dev_warn(&pdev->dev, "Cannot DMA highmem\n"); |
1455 | } | 1792 | } |
@@ -1458,22 +1795,22 @@ static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1458 | if (rc) { | 1795 | if (rc) { |
1459 | rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); | 1796 | rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); |
1460 | if (rc) | 1797 | if (rc) |
1461 | goto err3; | 1798 | goto err4; |
1462 | 1799 | ||
1463 | dev_warn(&pdev->dev, "Cannot DMA consistent highmem\n"); | 1800 | dev_warn(&pdev->dev, "Cannot DMA consistent highmem\n"); |
1464 | } | 1801 | } |
1465 | 1802 | ||
1466 | rc = ntb_device_setup(ndev); | 1803 | rc = ntb_device_setup(ndev); |
1467 | if (rc) | 1804 | if (rc) |
1468 | goto err3; | 1805 | goto err4; |
1469 | 1806 | ||
1470 | rc = ntb_create_callbacks(ndev); | 1807 | rc = ntb_create_callbacks(ndev); |
1471 | if (rc) | 1808 | if (rc) |
1472 | goto err4; | 1809 | goto err5; |
1473 | 1810 | ||
1474 | rc = ntb_setup_interrupts(ndev); | 1811 | rc = ntb_setup_interrupts(ndev); |
1475 | if (rc) | 1812 | if (rc) |
1476 | goto err5; | 1813 | goto err6; |
1477 | 1814 | ||
1478 | /* The scratchpad registers keep the values between rmmod/insmod, | 1815 | /* The scratchpad registers keep the values between rmmod/insmod, |
1479 | * blast them now | 1816 | * blast them now |
@@ -1485,24 +1822,29 @@ static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1485 | 1822 | ||
1486 | rc = ntb_transport_init(pdev); | 1823 | rc = ntb_transport_init(pdev); |
1487 | if (rc) | 1824 | if (rc) |
1488 | goto err6; | 1825 | goto err7; |
1489 | 1826 | ||
1490 | ntb_hw_link_up(ndev); | 1827 | ntb_hw_link_up(ndev); |
1491 | 1828 | ||
1492 | return 0; | 1829 | return 0; |
1493 | 1830 | ||
1494 | err6: | 1831 | err7: |
1495 | ntb_free_interrupts(ndev); | 1832 | ntb_free_interrupts(ndev); |
1496 | err5: | 1833 | err6: |
1497 | ntb_free_callbacks(ndev); | 1834 | ntb_free_callbacks(ndev); |
1498 | err4: | 1835 | err5: |
1499 | ntb_device_free(ndev); | 1836 | ntb_device_free(ndev); |
1500 | err3: | 1837 | err4: |
1501 | for (i--; i >= 0; i--) | 1838 | for (i--; i >= 0; i--) |
1502 | iounmap(ndev->mw[i].vbase); | 1839 | iounmap(ndev->mw[i].vbase); |
1503 | iounmap(ndev->reg_base); | 1840 | iounmap(ndev->reg_base); |
1841 | err3: | ||
1842 | if (ndev->split_bar) | ||
1843 | pci_release_selected_regions(pdev, NTB_SPLITBAR_MASK); | ||
1844 | else | ||
1845 | pci_release_selected_regions(pdev, NTB_BAR_MASK); | ||
1504 | err2: | 1846 | err2: |
1505 | pci_release_selected_regions(pdev, NTB_BAR_MASK); | 1847 | kfree(ndev->mw); |
1506 | err1: | 1848 | err1: |
1507 | pci_disable_device(pdev); | 1849 | pci_disable_device(pdev); |
1508 | err: | 1850 | err: |
@@ -1526,11 +1868,19 @@ static void ntb_pci_remove(struct pci_dev *pdev) | |||
1526 | ntb_free_callbacks(ndev); | 1868 | ntb_free_callbacks(ndev); |
1527 | ntb_device_free(ndev); | 1869 | ntb_device_free(ndev); |
1528 | 1870 | ||
1529 | for (i = 0; i < NTB_MAX_NUM_MW; i++) | 1871 | /* need to reset max_mw limits so we can unmap properly */ |
1872 | if (ndev->hw_type == SNB_HW) | ||
1873 | ntb_max_mw_detect(ndev); | ||
1874 | |||
1875 | for (i = 0; i < ndev->limits.max_mw; i++) | ||
1530 | iounmap(ndev->mw[i].vbase); | 1876 | iounmap(ndev->mw[i].vbase); |
1531 | 1877 | ||
1878 | kfree(ndev->mw); | ||
1532 | iounmap(ndev->reg_base); | 1879 | iounmap(ndev->reg_base); |
1533 | pci_release_selected_regions(pdev, NTB_BAR_MASK); | 1880 | if (ndev->split_bar) |
1881 | pci_release_selected_regions(pdev, NTB_SPLITBAR_MASK); | ||
1882 | else | ||
1883 | pci_release_selected_regions(pdev, NTB_BAR_MASK); | ||
1534 | pci_disable_device(pdev); | 1884 | pci_disable_device(pdev); |
1535 | ntb_free_debugfs(ndev); | 1885 | ntb_free_debugfs(ndev); |
1536 | kfree(ndev); | 1886 | kfree(ndev); |
@@ -1542,4 +1892,5 @@ static struct pci_driver ntb_pci_driver = { | |||
1542 | .probe = ntb_pci_probe, | 1892 | .probe = ntb_pci_probe, |
1543 | .remove = ntb_pci_remove, | 1893 | .remove = ntb_pci_remove, |
1544 | }; | 1894 | }; |
1895 | |||
1545 | module_pci_driver(ntb_pci_driver); | 1896 | module_pci_driver(ntb_pci_driver); |
diff --git a/drivers/ntb/ntb_hw.h b/drivers/ntb/ntb_hw.h index 465517b7393e..96de5fc95f90 100644 --- a/drivers/ntb/ntb_hw.h +++ b/drivers/ntb/ntb_hw.h | |||
@@ -78,14 +78,16 @@ static inline void writeq(u64 val, void __iomem *addr) | |||
78 | 78 | ||
79 | #define NTB_BAR_MMIO 0 | 79 | #define NTB_BAR_MMIO 0 |
80 | #define NTB_BAR_23 2 | 80 | #define NTB_BAR_23 2 |
81 | #define NTB_BAR_45 4 | 81 | #define NTB_BAR_4 4 |
82 | #define NTB_BAR_5 5 | ||
83 | |||
82 | #define NTB_BAR_MASK ((1 << NTB_BAR_MMIO) | (1 << NTB_BAR_23) |\ | 84 | #define NTB_BAR_MASK ((1 << NTB_BAR_MMIO) | (1 << NTB_BAR_23) |\ |
83 | (1 << NTB_BAR_45)) | 85 | (1 << NTB_BAR_4)) |
86 | #define NTB_SPLITBAR_MASK ((1 << NTB_BAR_MMIO) | (1 << NTB_BAR_23) |\ | ||
87 | (1 << NTB_BAR_4) | (1 << NTB_BAR_5)) | ||
84 | 88 | ||
85 | #define NTB_HB_TIMEOUT msecs_to_jiffies(1000) | 89 | #define NTB_HB_TIMEOUT msecs_to_jiffies(1000) |
86 | 90 | ||
87 | #define NTB_MAX_NUM_MW 2 | ||
88 | |||
89 | enum ntb_hw_event { | 91 | enum ntb_hw_event { |
90 | NTB_EVENT_SW_EVENT0 = 0, | 92 | NTB_EVENT_SW_EVENT0 = 0, |
91 | NTB_EVENT_SW_EVENT1, | 93 | NTB_EVENT_SW_EVENT1, |
@@ -109,11 +111,13 @@ struct ntb_db_cb { | |||
109 | struct tasklet_struct irq_work; | 111 | struct tasklet_struct irq_work; |
110 | }; | 112 | }; |
111 | 113 | ||
114 | #define WA_SNB_ERR 0x00000001 | ||
115 | |||
112 | struct ntb_device { | 116 | struct ntb_device { |
113 | struct pci_dev *pdev; | 117 | struct pci_dev *pdev; |
114 | struct msix_entry *msix_entries; | 118 | struct msix_entry *msix_entries; |
115 | void __iomem *reg_base; | 119 | void __iomem *reg_base; |
116 | struct ntb_mw mw[NTB_MAX_NUM_MW]; | 120 | struct ntb_mw *mw; |
117 | struct { | 121 | struct { |
118 | unsigned char max_mw; | 122 | unsigned char max_mw; |
119 | unsigned char max_spads; | 123 | unsigned char max_spads; |
@@ -126,6 +130,7 @@ struct ntb_device { | |||
126 | void __iomem *rdb; | 130 | void __iomem *rdb; |
127 | void __iomem *bar2_xlat; | 131 | void __iomem *bar2_xlat; |
128 | void __iomem *bar4_xlat; | 132 | void __iomem *bar4_xlat; |
133 | void __iomem *bar5_xlat; | ||
129 | void __iomem *spad_write; | 134 | void __iomem *spad_write; |
130 | void __iomem *spad_read; | 135 | void __iomem *spad_read; |
131 | void __iomem *lnk_cntl; | 136 | void __iomem *lnk_cntl; |
@@ -145,6 +150,7 @@ struct ntb_device { | |||
145 | unsigned char link_width; | 150 | unsigned char link_width; |
146 | unsigned char link_speed; | 151 | unsigned char link_speed; |
147 | unsigned char link_status; | 152 | unsigned char link_status; |
153 | unsigned char split_bar; | ||
148 | 154 | ||
149 | struct delayed_work hb_timer; | 155 | struct delayed_work hb_timer; |
150 | unsigned long last_ts; | 156 | unsigned long last_ts; |
@@ -152,6 +158,9 @@ struct ntb_device { | |||
152 | struct delayed_work lr_timer; | 158 | struct delayed_work lr_timer; |
153 | 159 | ||
154 | struct dentry *debugfs_dir; | 160 | struct dentry *debugfs_dir; |
161 | struct dentry *debugfs_info; | ||
162 | |||
163 | unsigned int wa_flags; | ||
155 | }; | 164 | }; |
156 | 165 | ||
157 | /** | 166 | /** |
diff --git a/drivers/ntb/ntb_regs.h b/drivers/ntb/ntb_regs.h index 9774506419d7..f028ff81fd77 100644 --- a/drivers/ntb/ntb_regs.h +++ b/drivers/ntb/ntb_regs.h | |||
@@ -57,34 +57,43 @@ | |||
57 | #define SNB_MAX_DB_BITS 15 | 57 | #define SNB_MAX_DB_BITS 15 |
58 | #define SNB_LINK_DB 15 | 58 | #define SNB_LINK_DB 15 |
59 | #define SNB_DB_BITS_PER_VEC 5 | 59 | #define SNB_DB_BITS_PER_VEC 5 |
60 | #define HSX_SPLITBAR_MAX_MW 3 | ||
60 | #define SNB_MAX_MW 2 | 61 | #define SNB_MAX_MW 2 |
61 | #define SNB_ERRATA_MAX_MW 1 | 62 | #define SNB_ERRATA_MAX_MW 1 |
62 | 63 | ||
63 | #define SNB_DB_HW_LINK 0x8000 | 64 | #define SNB_DB_HW_LINK 0x8000 |
64 | 65 | ||
66 | #define SNB_UNCERRSTS_OFFSET 0x014C | ||
67 | #define SNB_CORERRSTS_OFFSET 0x0158 | ||
68 | #define SNB_LINK_STATUS_OFFSET 0x01A2 | ||
65 | #define SNB_PCICMD_OFFSET 0x0504 | 69 | #define SNB_PCICMD_OFFSET 0x0504 |
66 | #define SNB_DEVCTRL_OFFSET 0x0598 | 70 | #define SNB_DEVCTRL_OFFSET 0x0598 |
71 | #define SNB_DEVSTS_OFFSET 0x059A | ||
67 | #define SNB_SLINK_STATUS_OFFSET 0x05A2 | 72 | #define SNB_SLINK_STATUS_OFFSET 0x05A2 |
68 | #define SNB_LINK_STATUS_OFFSET 0x01A2 | ||
69 | 73 | ||
70 | #define SNB_PBAR2LMT_OFFSET 0x0000 | 74 | #define SNB_PBAR2LMT_OFFSET 0x0000 |
71 | #define SNB_PBAR4LMT_OFFSET 0x0008 | 75 | #define SNB_PBAR4LMT_OFFSET 0x0008 |
76 | #define SNB_PBAR5LMT_OFFSET 0x000C | ||
72 | #define SNB_PBAR2XLAT_OFFSET 0x0010 | 77 | #define SNB_PBAR2XLAT_OFFSET 0x0010 |
73 | #define SNB_PBAR4XLAT_OFFSET 0x0018 | 78 | #define SNB_PBAR4XLAT_OFFSET 0x0018 |
79 | #define SNB_PBAR5XLAT_OFFSET 0x001C | ||
74 | #define SNB_SBAR2LMT_OFFSET 0x0020 | 80 | #define SNB_SBAR2LMT_OFFSET 0x0020 |
75 | #define SNB_SBAR4LMT_OFFSET 0x0028 | 81 | #define SNB_SBAR4LMT_OFFSET 0x0028 |
82 | #define SNB_SBAR5LMT_OFFSET 0x002C | ||
76 | #define SNB_SBAR2XLAT_OFFSET 0x0030 | 83 | #define SNB_SBAR2XLAT_OFFSET 0x0030 |
77 | #define SNB_SBAR4XLAT_OFFSET 0x0038 | 84 | #define SNB_SBAR4XLAT_OFFSET 0x0038 |
85 | #define SNB_SBAR5XLAT_OFFSET 0x003C | ||
78 | #define SNB_SBAR0BASE_OFFSET 0x0040 | 86 | #define SNB_SBAR0BASE_OFFSET 0x0040 |
79 | #define SNB_SBAR2BASE_OFFSET 0x0048 | 87 | #define SNB_SBAR2BASE_OFFSET 0x0048 |
80 | #define SNB_SBAR4BASE_OFFSET 0x0050 | 88 | #define SNB_SBAR4BASE_OFFSET 0x0050 |
89 | #define SNB_SBAR5BASE_OFFSET 0x0054 | ||
81 | #define SNB_NTBCNTL_OFFSET 0x0058 | 90 | #define SNB_NTBCNTL_OFFSET 0x0058 |
82 | #define SNB_SBDF_OFFSET 0x005C | 91 | #define SNB_SBDF_OFFSET 0x005C |
83 | #define SNB_PDOORBELL_OFFSET 0x0060 | 92 | #define SNB_PDOORBELL_OFFSET 0x0060 |
84 | #define SNB_PDBMSK_OFFSET 0x0062 | 93 | #define SNB_PDBMSK_OFFSET 0x0062 |
85 | #define SNB_SDOORBELL_OFFSET 0x0064 | 94 | #define SNB_SDOORBELL_OFFSET 0x0064 |
86 | #define SNB_SDBMSK_OFFSET 0x0066 | 95 | #define SNB_SDBMSK_OFFSET 0x0066 |
87 | #define SNB_USMEMMISS 0x0070 | 96 | #define SNB_USMEMMISS_OFFSET 0x0070 |
88 | #define SNB_SPAD_OFFSET 0x0080 | 97 | #define SNB_SPAD_OFFSET 0x0080 |
89 | #define SNB_SPADSEMA4_OFFSET 0x00c0 | 98 | #define SNB_SPADSEMA4_OFFSET 0x00c0 |
90 | #define SNB_WCCNTRL_OFFSET 0x00e0 | 99 | #define SNB_WCCNTRL_OFFSET 0x00e0 |
@@ -93,12 +102,18 @@ | |||
93 | #define SNB_B2B_XLAT_OFFSETL 0x0144 | 102 | #define SNB_B2B_XLAT_OFFSETL 0x0144 |
94 | #define SNB_B2B_XLAT_OFFSETU 0x0148 | 103 | #define SNB_B2B_XLAT_OFFSETU 0x0148 |
95 | 104 | ||
96 | #define SNB_MBAR01_USD_ADDR 0x000000210000000CULL | 105 | /* |
97 | #define SNB_MBAR23_USD_ADDR 0x000000410000000CULL | 106 | * The addresses are setup so the 32bit BARs can function. Thus |
98 | #define SNB_MBAR45_USD_ADDR 0x000000810000000CULL | 107 | * the addresses are all in 32bit space |
99 | #define SNB_MBAR01_DSD_ADDR 0x000000200000000CULL | 108 | */ |
100 | #define SNB_MBAR23_DSD_ADDR 0x000000400000000CULL | 109 | #define SNB_MBAR01_USD_ADDR 0x000000002100000CULL |
101 | #define SNB_MBAR45_DSD_ADDR 0x000000800000000CULL | 110 | #define SNB_MBAR23_USD_ADDR 0x000000004100000CULL |
111 | #define SNB_MBAR4_USD_ADDR 0x000000008100000CULL | ||
112 | #define SNB_MBAR5_USD_ADDR 0x00000000A100000CULL | ||
113 | #define SNB_MBAR01_DSD_ADDR 0x000000002000000CULL | ||
114 | #define SNB_MBAR23_DSD_ADDR 0x000000004000000CULL | ||
115 | #define SNB_MBAR4_DSD_ADDR 0x000000008000000CULL | ||
116 | #define SNB_MBAR5_DSD_ADDR 0x00000000A000000CULL | ||
102 | 117 | ||
103 | #define BWD_MSIX_CNT 34 | 118 | #define BWD_MSIX_CNT 34 |
104 | #define BWD_MAX_SPADS 16 | 119 | #define BWD_MAX_SPADS 16 |
@@ -147,13 +162,16 @@ | |||
147 | #define NTB_CNTL_LINK_DISABLE (1 << 1) | 162 | #define NTB_CNTL_LINK_DISABLE (1 << 1) |
148 | #define NTB_CNTL_S2P_BAR23_SNOOP (1 << 2) | 163 | #define NTB_CNTL_S2P_BAR23_SNOOP (1 << 2) |
149 | #define NTB_CNTL_P2S_BAR23_SNOOP (1 << 4) | 164 | #define NTB_CNTL_P2S_BAR23_SNOOP (1 << 4) |
150 | #define NTB_CNTL_S2P_BAR45_SNOOP (1 << 6) | 165 | #define NTB_CNTL_S2P_BAR4_SNOOP (1 << 6) |
151 | #define NTB_CNTL_P2S_BAR45_SNOOP (1 << 8) | 166 | #define NTB_CNTL_P2S_BAR4_SNOOP (1 << 8) |
167 | #define NTB_CNTL_S2P_BAR5_SNOOP (1 << 12) | ||
168 | #define NTB_CNTL_P2S_BAR5_SNOOP (1 << 14) | ||
152 | #define BWD_CNTL_LINK_DOWN (1 << 16) | 169 | #define BWD_CNTL_LINK_DOWN (1 << 16) |
153 | 170 | ||
154 | #define NTB_PPD_OFFSET 0x00D4 | 171 | #define NTB_PPD_OFFSET 0x00D4 |
155 | #define SNB_PPD_CONN_TYPE 0x0003 | 172 | #define SNB_PPD_CONN_TYPE 0x0003 |
156 | #define SNB_PPD_DEV_TYPE 0x0010 | 173 | #define SNB_PPD_DEV_TYPE 0x0010 |
174 | #define SNB_PPD_SPLIT_BAR (1 << 6) | ||
157 | #define BWD_PPD_INIT_LINK 0x0008 | 175 | #define BWD_PPD_INIT_LINK 0x0008 |
158 | #define BWD_PPD_CONN_TYPE 0x0300 | 176 | #define BWD_PPD_CONN_TYPE 0x0300 |
159 | #define BWD_PPD_DEV_TYPE 0x1000 | 177 | #define BWD_PPD_DEV_TYPE 0x1000 |