-struct uio_map {
- void *addr;
- uint64_t offset;
- uint64_t size;
- uint64_t phaddr;
-};
-
-/*
- * For multi-process we need to reproduce all PCI mappings in secondary
- * processes, so save them in a tailq.
- */
-struct uio_resource {
- TAILQ_ENTRY(uio_resource) next;
-
- struct rte_pci_addr pci_addr;
- char path[PATH_MAX];
- size_t nb_maps;
- struct uio_map maps[PCI_MAX_RESOURCE];
-};
-
-TAILQ_HEAD(uio_res_list, uio_resource);
-
-static struct uio_res_list *uio_res_list = NULL;
-static int pci_parse_sysfs_value(const char *filename, uint64_t *val);
-
-/* forward prototype of function called in pci_switch_module below */
-static int pci_uio_map_resource(struct rte_pci_device *dev);
-
-#ifdef RTE_EAL_UNBIND_PORTS
-#define PROC_MODULES "/proc/modules"
-
-#define IGB_UIO_NAME "igb_uio"
-
-#define UIO_DRV_PATH "/sys/bus/pci/drivers/%s"
-
-/* maximum time to wait that /dev/uioX appears */
-#define UIO_DEV_WAIT_TIMEOUT 3 /* seconds */
-
-/*
- * Check that a kernel module is loaded. Returns 0 on success, or if the
- * parameter is NULL, or -1 if the module is not loaded.
- */
-static int
-pci_uio_check_module(const char *module_name)
-{
- FILE *f;
- unsigned i;
- char buf[BUFSIZ];
-
- if (module_name == NULL)
- return 0;
-
- f = fopen(PROC_MODULES, "r");
- if (f == NULL) {
- RTE_LOG(ERR, EAL, "Cannot open "PROC_MODULES": %s\n",
- strerror(errno));
- return -1;
- }
-
- while(fgets(buf, sizeof(buf), f) != NULL) {
-
- for (i = 0; i < sizeof(buf) && buf[i] != '\0'; i++) {
- if (isspace(buf[i]))
- buf[i] = '\0';
- }
-
- if (strncmp(buf, module_name, sizeof(buf)) == 0) {
- fclose(f);
- return 0;
- }
- }
- fclose(f);
- return -1;
-}
-
-/* bind a PCI to the kernel module driver */
-static int
-pci_bind_device(struct rte_pci_device *dev, char dr_path[])
-{
- FILE *f;
- int n;
- char buf[BUFSIZ];
- char dev_bind[PATH_MAX];
- struct rte_pci_addr *loc = &dev->addr;
-
- n = rte_snprintf(dev_bind, sizeof(dev_bind), "%s/bind", dr_path);
- if ((n < 0) || (n >= (int)sizeof(buf))) {
- RTE_LOG(ERR, EAL, "Cannot rte_snprintf device bind path\n");
- return -1;
- }
-
- f = fopen(dev_bind, "w");
- if (f == NULL) {
- RTE_LOG(ERR, EAL, "Cannot open %s\n", dev_bind);
- return -1;
- }
- n = rte_snprintf(buf, sizeof(buf), PCI_PRI_FMT "\n",
- loc->domain, loc->bus, loc->devid, loc->function);
- if ((n < 0) || (n >= (int)sizeof(buf))) {
- RTE_LOG(ERR, EAL, "Cannot rte_snprintf PCI infos\n");
- fclose(f);
- return -1;
- }
- if (fwrite(buf, n, 1, f) == 0) {
- fclose(f);
- return -1;
- }
-
- fclose(f);
- return 0;
-}
-
-static int
-pci_uio_bind_device(struct rte_pci_device *dev, const char *module_name)
-{
- FILE *f;
- int n;
- char buf[BUFSIZ];
- char uio_newid[PATH_MAX];
- char uio_bind[PATH_MAX];
-
- n = rte_snprintf(uio_newid, sizeof(uio_newid), UIO_DRV_PATH "/new_id", module_name);
- if ((n < 0) || (n >= (int)sizeof(uio_newid))) {
- RTE_LOG(ERR, EAL, "Cannot rte_snprintf uio_newid name\n");
- return -1;
- }
-
- n = rte_snprintf(uio_bind, sizeof(uio_bind), UIO_DRV_PATH, module_name);
- if ((n < 0) || (n >= (int)sizeof(uio_bind))) {
- RTE_LOG(ERR, EAL, "Cannot rte_snprintf uio_bind name\n");
- return -1;
- }
-
- n = rte_snprintf(buf, sizeof(buf), "%x %x\n",
- dev->id.vendor_id, dev->id.device_id);
- if ((n < 0) || (n >= (int)sizeof(buf))) {
- RTE_LOG(ERR, EAL, "Cannot rte_snprintf vendor_id/device_id\n");
- return -1;
- }
-
- f = fopen(uio_newid, "w");
- if (f == NULL) {
- RTE_LOG(ERR, EAL, "Cannot open %s\n", uio_newid);
- return -1;
- }
- if (fwrite(buf, n, 1, f) == 0) {
- fclose(f);
- return -1;
- }
- fclose(f);
-
- pci_bind_device(dev, uio_bind);
- return 0;
-}