| .. | .. |
|---|
| 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); |
|---|