1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2017 6WIND S.A. 3 */ 4 5 #ifndef _PCI_PRIVATE_H_ 6 #define _PCI_PRIVATE_H_ 7 8 #include <stdbool.h> 9 #include <stdio.h> 10 #include <rte_pci.h> 11 #include <rte_bus_pci.h> 12 13 extern struct rte_pci_bus rte_pci_bus; 14 15 struct rte_pci_driver; 16 struct rte_pci_device; 17 18 extern struct rte_pci_bus rte_pci_bus; 19 20 /** 21 * Probe the PCI bus 22 * 23 * @return 24 * - 0 on success. 25 * - !0 on error. 26 */ 27 int 28 rte_pci_probe(void); 29 30 /** 31 * Scan the content of the PCI bus, and the devices in the devices 32 * list 33 * 34 * @return 35 * 0 on success, negative on error 36 */ 37 int rte_pci_scan(void); 38 39 /** 40 * Find the name of a PCI device. 41 */ 42 void 43 pci_name_set(struct rte_pci_device *dev); 44 45 /** 46 * Add a PCI device to the PCI Bus (append to PCI Device list). This function 47 * also updates the bus references of the PCI Device (and the generic device 48 * object embedded within. 49 * 50 * @param pci_dev 51 * PCI device to add 52 * @return void 53 */ 54 void rte_pci_add_device(struct rte_pci_device *pci_dev); 55 56 /** 57 * Insert a PCI device in the PCI Bus at a particular location in the device 58 * list. It also updates the PCI Bus reference of the new devices to be 59 * inserted. 60 * 61 * @param exist_pci_dev 62 * Existing PCI device in PCI Bus 63 * @param new_pci_dev 64 * PCI device to be added before exist_pci_dev 65 * @return void 66 */ 67 void rte_pci_insert_device(struct rte_pci_device *exist_pci_dev, 68 struct rte_pci_device *new_pci_dev); 69 70 /** 71 * Update a pci device object by asking the kernel for the latest information. 72 * 73 * This function is private to EAL. 74 * 75 * @param addr 76 * The PCI Bus-Device-Function address to look for 77 * @return 78 * - 0 on success. 79 * - negative on error. 80 */ 81 int pci_update_device(const struct rte_pci_addr *addr); 82 83 /** 84 * Map the PCI resource of a PCI device in virtual memory 85 * 86 * This function is private to EAL. 87 * 88 * @return 89 * 0 on success, negative on error 90 */ 91 int pci_uio_map_resource(struct rte_pci_device *dev); 92 93 /** 94 * Unmap the PCI resource of a PCI device 95 * 96 * This function is private to EAL. 97 */ 98 void pci_uio_unmap_resource(struct rte_pci_device *dev); 99 100 /** 101 * Allocate uio resource for PCI device 102 * 103 * This function is private to EAL. 104 * 105 * @param dev 106 * PCI device to allocate uio resource 107 * @param uio_res 108 * Pointer to uio resource. 109 * If the function returns 0, the pointer will be filled. 110 * @return 111 * 0 on success, negative on error 112 */ 113 int pci_uio_alloc_resource(struct rte_pci_device *dev, 114 struct mapped_pci_resource **uio_res); 115 116 /** 117 * Free uio resource for PCI device 118 * 119 * This function is private to EAL. 120 * 121 * @param dev 122 * PCI device to free uio resource 123 * @param uio_res 124 * Pointer to uio resource. 125 */ 126 void pci_uio_free_resource(struct rte_pci_device *dev, 127 struct mapped_pci_resource *uio_res); 128 129 /** 130 * Remap the PCI resource of a PCI device in anonymous virtual memory. 131 * 132 * @param dev 133 * Point to the struct rte pci device. 134 * @return 135 * - On success, zero. 136 * - On failure, a negative value. 137 */ 138 int 139 pci_uio_remap_resource(struct rte_pci_device *dev); 140 141 /** 142 * Map device memory to uio resource 143 * 144 * This function is private to EAL. 145 * 146 * @param dev 147 * PCI device that has memory information. 148 * @param res_idx 149 * Memory resource index of the PCI device. 150 * @param uio_res 151 * uio resource that will keep mapping information. 152 * @param map_idx 153 * Mapping information index of the uio resource. 154 * @return 155 * 0 on success, negative on error 156 */ 157 int pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, 158 struct mapped_pci_resource *uio_res, int map_idx); 159 160 /* 161 * Match the PCI Driver and Device using the ID Table 162 * 163 * @param pci_drv 164 * PCI driver from which ID table would be extracted 165 * @param pci_dev 166 * PCI device to match against the driver 167 * @return 168 * 1 for successful match 169 * 0 for unsuccessful match 170 */ 171 int 172 rte_pci_match(const struct rte_pci_driver *pci_drv, 173 const struct rte_pci_device *pci_dev); 174 175 /** 176 * OS specific callbacks for rte_pci_get_iommu_class 177 * 178 */ 179 bool 180 pci_device_iommu_support_va(const struct rte_pci_device *dev); 181 182 enum rte_iova_mode 183 pci_device_iova_mode(const struct rte_pci_driver *pci_drv, 184 const struct rte_pci_device *pci_dev); 185 186 /** 187 * Get iommu class of PCI devices on the bus. 188 * And return their preferred iova mapping mode. 189 * 190 * @return 191 * - enum rte_iova_mode. 192 */ 193 enum rte_iova_mode 194 rte_pci_get_iommu_class(void); 195 196 /* 197 * Iterate over internal devices, 198 * matching any device against the provided 199 * string. 200 * 201 * @param start 202 * Iteration starting point. 203 * 204 * @param str 205 * Device string to match against. 206 * 207 * @param it 208 * (unused) iterator structure. 209 * 210 * @return 211 * A pointer to the next matching device if any. 212 * NULL otherwise. 213 */ 214 void * 215 rte_pci_dev_iterate(const void *start, 216 const char *str, 217 const struct rte_dev_iterator *it); 218 219 #endif /* _PCI_PRIVATE_H_ */ 220