.. | .. |
---|
60 | 60 | #include "ntb_hw_intel.h" |
---|
61 | 61 | #include "ntb_hw_gen1.h" |
---|
62 | 62 | #include "ntb_hw_gen3.h" |
---|
| 63 | +#include "ntb_hw_gen4.h" |
---|
63 | 64 | |
---|
64 | 65 | #define NTB_NAME "ntb_hw_intel" |
---|
65 | 66 | #define NTB_DESC "Intel(R) PCI-E Non-Transparent Bridge Driver" |
---|
.. | .. |
---|
180 | 181 | return ndev->reg->mw_bar[idx]; |
---|
181 | 182 | } |
---|
182 | 183 | |
---|
183 | | -static inline int ndev_db_addr(struct intel_ntb_dev *ndev, |
---|
| 184 | +void ndev_db_addr(struct intel_ntb_dev *ndev, |
---|
184 | 185 | phys_addr_t *db_addr, resource_size_t *db_size, |
---|
185 | 186 | phys_addr_t reg_addr, unsigned long reg) |
---|
186 | 187 | { |
---|
.. | .. |
---|
196 | 197 | *db_size = ndev->reg->db_size; |
---|
197 | 198 | dev_dbg(&ndev->ntb.pdev->dev, "Peer db size %llx\n", *db_size); |
---|
198 | 199 | } |
---|
199 | | - |
---|
200 | | - return 0; |
---|
201 | 200 | } |
---|
202 | 201 | |
---|
203 | 202 | u64 ndev_db_read(struct intel_ntb_dev *ndev, |
---|
.. | .. |
---|
764 | 763 | return ndev_ntb_debugfs_read(filp, ubuf, count, offp); |
---|
765 | 764 | else if (pdev_is_gen3(ndev->ntb.pdev)) |
---|
766 | 765 | return ndev_ntb3_debugfs_read(filp, ubuf, count, offp); |
---|
| 766 | + else if (pdev_is_gen4(ndev->ntb.pdev)) |
---|
| 767 | + return ndev_ntb4_debugfs_read(filp, ubuf, count, offp); |
---|
767 | 768 | |
---|
768 | 769 | return -ENXIO; |
---|
769 | 770 | } |
---|
.. | .. |
---|
1111 | 1112 | ndev->self_reg->db_mask); |
---|
1112 | 1113 | } |
---|
1113 | 1114 | |
---|
1114 | | -int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr, |
---|
1115 | | - resource_size_t *db_size) |
---|
| 1115 | +static int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr, |
---|
| 1116 | + resource_size_t *db_size, u64 *db_data, int db_bit) |
---|
1116 | 1117 | { |
---|
| 1118 | + u64 db_bits; |
---|
1117 | 1119 | struct intel_ntb_dev *ndev = ntb_ndev(ntb); |
---|
1118 | 1120 | |
---|
1119 | | - return ndev_db_addr(ndev, db_addr, db_size, ndev->peer_addr, |
---|
| 1121 | + if (unlikely(db_bit >= BITS_PER_LONG_LONG)) |
---|
| 1122 | + return -EINVAL; |
---|
| 1123 | + |
---|
| 1124 | + db_bits = BIT_ULL(db_bit); |
---|
| 1125 | + |
---|
| 1126 | + if (unlikely(db_bits & ~ntb_ndev(ntb)->db_valid_mask)) |
---|
| 1127 | + return -EINVAL; |
---|
| 1128 | + |
---|
| 1129 | + ndev_db_addr(ndev, db_addr, db_size, ndev->peer_addr, |
---|
1120 | 1130 | ndev->peer_reg->db_bell); |
---|
| 1131 | + |
---|
| 1132 | + if (db_data) |
---|
| 1133 | + *db_data = db_bits; |
---|
| 1134 | + |
---|
| 1135 | + |
---|
| 1136 | + return 0; |
---|
1121 | 1137 | } |
---|
1122 | 1138 | |
---|
1123 | 1139 | static int intel_ntb_peer_db_set(struct ntb_dev *ntb, u64 db_bits) |
---|
.. | .. |
---|
1189 | 1205 | ndev->peer_reg->spad); |
---|
1190 | 1206 | } |
---|
1191 | 1207 | |
---|
1192 | | -static u64 xeon_db_ioread(void __iomem *mmio) |
---|
| 1208 | +static u64 xeon_db_ioread(const void __iomem *mmio) |
---|
1193 | 1209 | { |
---|
1194 | 1210 | return (u64)ioread16(mmio); |
---|
1195 | 1211 | } |
---|
.. | .. |
---|
1770 | 1786 | goto err_dma_mask; |
---|
1771 | 1787 | dev_warn(&pdev->dev, "Cannot DMA consistent highmem\n"); |
---|
1772 | 1788 | } |
---|
1773 | | - rc = dma_coerce_mask_and_coherent(&ndev->ntb.dev, |
---|
1774 | | - dma_get_mask(&pdev->dev)); |
---|
1775 | | - if (rc) |
---|
1776 | | - goto err_dma_mask; |
---|
1777 | 1789 | |
---|
1778 | 1790 | ndev->self_mmio = pci_iomap(pdev, 0, 0); |
---|
1779 | 1791 | if (!ndev->self_mmio) { |
---|
.. | .. |
---|
1845 | 1857 | int rc, node; |
---|
1846 | 1858 | |
---|
1847 | 1859 | node = dev_to_node(&pdev->dev); |
---|
| 1860 | + ndev = kzalloc_node(sizeof(*ndev), GFP_KERNEL, node); |
---|
| 1861 | + if (!ndev) { |
---|
| 1862 | + rc = -ENOMEM; |
---|
| 1863 | + goto err_ndev; |
---|
| 1864 | + } |
---|
| 1865 | + |
---|
| 1866 | + ndev_init_struct(ndev, pdev); |
---|
1848 | 1867 | |
---|
1849 | 1868 | if (pdev_is_gen1(pdev)) { |
---|
1850 | | - ndev = kzalloc_node(sizeof(*ndev), GFP_KERNEL, node); |
---|
1851 | | - if (!ndev) { |
---|
1852 | | - rc = -ENOMEM; |
---|
1853 | | - goto err_ndev; |
---|
1854 | | - } |
---|
1855 | | - |
---|
1856 | | - ndev_init_struct(ndev, pdev); |
---|
1857 | | - |
---|
1858 | 1869 | rc = intel_ntb_init_pci(ndev, pdev); |
---|
1859 | 1870 | if (rc) |
---|
1860 | 1871 | goto err_init_pci; |
---|
.. | .. |
---|
1862 | 1873 | rc = xeon_init_dev(ndev); |
---|
1863 | 1874 | if (rc) |
---|
1864 | 1875 | goto err_init_dev; |
---|
1865 | | - |
---|
1866 | 1876 | } else if (pdev_is_gen3(pdev)) { |
---|
1867 | | - ndev = kzalloc_node(sizeof(*ndev), GFP_KERNEL, node); |
---|
1868 | | - if (!ndev) { |
---|
1869 | | - rc = -ENOMEM; |
---|
1870 | | - goto err_ndev; |
---|
1871 | | - } |
---|
1872 | | - |
---|
1873 | | - ndev_init_struct(ndev, pdev); |
---|
1874 | 1877 | ndev->ntb.ops = &intel_ntb3_ops; |
---|
1875 | | - |
---|
1876 | 1878 | rc = intel_ntb_init_pci(ndev, pdev); |
---|
1877 | 1879 | if (rc) |
---|
1878 | 1880 | goto err_init_pci; |
---|
.. | .. |
---|
1880 | 1882 | rc = gen3_init_dev(ndev); |
---|
1881 | 1883 | if (rc) |
---|
1882 | 1884 | goto err_init_dev; |
---|
| 1885 | + } else if (pdev_is_gen4(pdev)) { |
---|
| 1886 | + ndev->ntb.ops = &intel_ntb4_ops; |
---|
| 1887 | + rc = intel_ntb_init_pci(ndev, pdev); |
---|
| 1888 | + if (rc) |
---|
| 1889 | + goto err_init_pci; |
---|
1883 | 1890 | |
---|
| 1891 | + rc = gen4_init_dev(ndev); |
---|
| 1892 | + if (rc) |
---|
| 1893 | + goto err_init_dev; |
---|
1884 | 1894 | } else { |
---|
1885 | 1895 | rc = -EINVAL; |
---|
1886 | | - goto err_ndev; |
---|
| 1896 | + goto err_init_pci; |
---|
1887 | 1897 | } |
---|
1888 | 1898 | |
---|
1889 | 1899 | ndev_reset_unsafe_flags(ndev); |
---|
.. | .. |
---|
1902 | 1912 | |
---|
1903 | 1913 | err_register: |
---|
1904 | 1914 | ndev_deinit_debugfs(ndev); |
---|
1905 | | - if (pdev_is_gen1(pdev) || pdev_is_gen3(pdev)) |
---|
| 1915 | + if (pdev_is_gen1(pdev) || pdev_is_gen3(pdev) || pdev_is_gen4(pdev)) |
---|
1906 | 1916 | xeon_deinit_dev(ndev); |
---|
1907 | 1917 | err_init_dev: |
---|
1908 | 1918 | intel_ntb_deinit_pci(ndev); |
---|
.. | .. |
---|
1918 | 1928 | |
---|
1919 | 1929 | ntb_unregister_device(&ndev->ntb); |
---|
1920 | 1930 | ndev_deinit_debugfs(ndev); |
---|
1921 | | - if (pdev_is_gen1(pdev) || pdev_is_gen3(pdev)) |
---|
| 1931 | + if (pdev_is_gen1(pdev) || pdev_is_gen3(pdev) || pdev_is_gen4(pdev)) |
---|
1922 | 1932 | xeon_deinit_dev(ndev); |
---|
1923 | 1933 | intel_ntb_deinit_pci(ndev); |
---|
1924 | 1934 | kfree(ndev); |
---|
.. | .. |
---|
2023 | 2033 | }; |
---|
2024 | 2034 | |
---|
2025 | 2035 | static const struct pci_device_id intel_ntb_pci_tbl[] = { |
---|
| 2036 | + /* GEN1 */ |
---|
2026 | 2037 | {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_JSF)}, |
---|
2027 | 2038 | {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_SNB)}, |
---|
2028 | 2039 | {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_IVT)}, |
---|
.. | .. |
---|
2038 | 2049 | {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_IVT)}, |
---|
2039 | 2050 | {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_HSX)}, |
---|
2040 | 2051 | {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_BDX)}, |
---|
| 2052 | + |
---|
| 2053 | + /* GEN3 */ |
---|
2041 | 2054 | {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_SKX)}, |
---|
| 2055 | + |
---|
| 2056 | + /* GEN4 */ |
---|
| 2057 | + {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_ICX)}, |
---|
2042 | 2058 | {0} |
---|
2043 | 2059 | }; |
---|
2044 | 2060 | MODULE_DEVICE_TABLE(pci, intel_ntb_pci_tbl); |
---|
.. | .. |
---|
2052 | 2068 | |
---|
2053 | 2069 | static int __init intel_ntb_pci_driver_init(void) |
---|
2054 | 2070 | { |
---|
| 2071 | + int ret; |
---|
2055 | 2072 | pr_info("%s %s\n", NTB_DESC, NTB_VER); |
---|
2056 | 2073 | |
---|
2057 | 2074 | if (debugfs_initialized()) |
---|
2058 | 2075 | debugfs_dir = debugfs_create_dir(KBUILD_MODNAME, NULL); |
---|
2059 | 2076 | |
---|
2060 | | - return pci_register_driver(&intel_ntb_pci_driver); |
---|
| 2077 | + ret = pci_register_driver(&intel_ntb_pci_driver); |
---|
| 2078 | + if (ret) |
---|
| 2079 | + debugfs_remove_recursive(debugfs_dir); |
---|
| 2080 | + |
---|
| 2081 | + return ret; |
---|
2061 | 2082 | } |
---|
2062 | 2083 | module_init(intel_ntb_pci_driver_init); |
---|
2063 | 2084 | |
---|