#include <stdbool.h>
#include <stdio.h>
-#include <rte_pci.h>
+
#include <rte_bus_pci.h>
+#include <rte_os_shim.h>
+#include <rte_pci.h>
+
+extern struct rte_pci_bus rte_pci_bus;
struct rte_pci_driver;
struct rte_pci_device;
-/**
- * Probe the PCI bus
- *
- * @return
- * - 0 on success.
- * - !0 on error.
- */
-int
-rte_pci_probe(void);
-
/**
* Scan the content of the PCI bus, and the devices in the devices
* list
int rte_pci_scan(void);
/**
- * Probe the single PCI device.
- *
- * Scan the content of the PCI bus, and find the pci device specified by pci
- * address, then call the probe() function for registered driver that has a
- * matching entry in its id_table for discovered device.
- *
- * @param addr
- * The PCI Bus-Device-Function address to probe.
- * @return
- * - 0 on success.
- * - Negative on error.
+ * Find the name of a PCI device.
*/
-int rte_pci_probe_one(const struct rte_pci_addr *addr);
+void
+pci_name_set(struct rte_pci_device *dev);
/**
- * Close the single PCI device.
- *
- * Scan the content of the PCI bus, and find the pci device specified by pci
- * address, then call the remove() function for registered driver that has a
- * matching entry in its id_table for discovered device.
+ * Validate whether a device with given PCI address should be ignored or not.
*
- * @param addr
- * The PCI Bus-Device-Function address to close.
+ * @param pci_addr
+ * PCI address of device to be validated
* @return
- * - 0 on success.
- * - Negative on error.
+ * true: if device is to be ignored,
+ * false: if device is to be scanned,
*/
-int rte_pci_detach(const struct rte_pci_addr *addr);
-
-/**
- * Find the name of a PCI device.
- */
-void
-pci_name_set(struct rte_pci_device *dev);
+bool rte_pci_ignore_device(const struct rte_pci_addr *pci_addr);
/**
* Add a PCI device to the PCI Bus (append to PCI Device list). This function
struct rte_pci_device *new_pci_dev);
/**
- * Remove a PCI device from the PCI Bus. This sets to NULL the bus references
- * in the PCI device object as well as the generic device object.
- *
- * @param pci_device
- * PCI device to be removed from PCI Bus
- * @return void
+ * A structure describing a PCI mapping.
*/
-void rte_pci_remove_device(struct rte_pci_device *pci_device);
+struct pci_map {
+ void *addr;
+ char *path;
+ uint64_t offset;
+ uint64_t size;
+ uint64_t phaddr;
+};
+
+struct pci_msix_table {
+ int bar_index;
+ uint32_t offset;
+ uint32_t size;
+};
/**
- * Update a pci device object by asking the kernel for the latest information.
- *
- * This function is private to EAL.
+ * A structure describing a mapped PCI resource.
+ * For multi-process we need to reproduce all PCI mappings in secondary
+ * processes, so save them in a tailq.
+ */
+struct mapped_pci_resource {
+ TAILQ_ENTRY(mapped_pci_resource) next;
+
+ struct rte_pci_addr pci_addr;
+ char path[PATH_MAX];
+ int nb_maps;
+ struct pci_map maps[PCI_MAX_RESOURCE];
+ struct pci_msix_table msix_table;
+};
+
+/** mapped pci device list */
+TAILQ_HEAD(mapped_pci_res_list, mapped_pci_resource);
+
+/**
+ * Map a particular resource from a file.
*
- * @param addr
- * The PCI Bus-Device-Function address to look for
+ * @param requested_addr
+ * The starting address for the new mapping range.
+ * @param fd
+ * The file descriptor.
+ * @param offset
+ * The offset for the mapping range.
+ * @param size
+ * The size for the mapping range.
+ * @param additional_flags
+ * The additional rte_mem_map() flags for the mapping range.
* @return
- * - 0 on success.
- * - negative on error.
+ * - On success, the function returns a pointer to the mapped area.
+ * - On error, NULL is returned.
*/
-int pci_update_device(const struct rte_pci_addr *addr);
+void *pci_map_resource(void *requested_addr, int fd, off_t offset,
+ size_t size, int additional_flags);
/**
- * Unbind kernel driver for this device
+ * Unmap a particular resource.
*
- * This function is private to EAL.
- *
- * @return
- * 0 on success, negative on error
+ * @param requested_addr
+ * The address for the unmapping range.
+ * @param size
+ * The size for the unmapping range.
*/
-int pci_unbind_kernel_driver(struct rte_pci_device *dev);
+void pci_unmap_resource(void *requested_addr, size_t size);
/**
* Map the PCI resource of a PCI device in virtual memory
void pci_uio_free_resource(struct rte_pci_device *dev,
struct mapped_pci_resource *uio_res);
+/**
+ * Remap the PCI resource of a PCI device in anonymous virtual memory.
+ *
+ * @param dev
+ * Point to the struct rte pci device.
+ * @return
+ * - On success, zero.
+ * - On failure, a negative value.
+ */
+int
+pci_uio_remap_resource(struct rte_pci_device *dev);
+
/**
* Map device memory to uio resource
*
rte_pci_match(const struct rte_pci_driver *pci_drv,
const struct rte_pci_device *pci_dev);
+/**
+ * OS specific callbacks for rte_pci_get_iommu_class
+ *
+ */
+bool
+pci_device_iommu_support_va(const struct rte_pci_device *dev);
+
+enum rte_iova_mode
+pci_device_iova_mode(const struct rte_pci_driver *pci_drv,
+ const struct rte_pci_device *pci_dev);
+
/**
* Get iommu class of PCI devices on the bus.
* And return their preferred iova mapping mode.
enum rte_iova_mode
rte_pci_get_iommu_class(void);
+/*
+ * Iterate over internal devices,
+ * matching any device against the provided
+ * string.
+ *
+ * @param start
+ * Iteration starting point.
+ *
+ * @param str
+ * Device string to match against.
+ *
+ * @param it
+ * (unused) iterator structure.
+ *
+ * @return
+ * A pointer to the next matching device if any.
+ * NULL otherwise.
+ */
+void *
+rte_pci_dev_iterate(const void *start,
+ const char *str,
+ const struct rte_dev_iterator *it);
+
#endif /* _PCI_PRIVATE_H_ */