net/bonding: use local prefix namespace
[dpdk.git] / lib / librte_eal / bsdapp / eal / eal_pci.c
index 6ef8781..e73b7cd 100644 (file)
@@ -41,7 +41,6 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#include <stdarg.h>
 #include <errno.h>
 #include <dirent.h>
 #include <limits.h>
@@ -52,7 +51,6 @@
 #include <dev/pci/pcireg.h>
 
 #if defined(RTE_ARCH_X86)
-#include <sys/types.h>
 #include <machine/cpufunc.h>
 #endif
 
@@ -91,7 +89,7 @@ extern struct rte_pci_bus rte_pci_bus;
 
 /* Map pci device */
 int
-rte_eal_pci_map_device(struct rte_pci_device *dev)
+rte_pci_map_device(struct rte_pci_device *dev)
 {
        int ret = -1;
 
@@ -113,7 +111,7 @@ rte_eal_pci_map_device(struct rte_pci_device *dev)
 
 /* Unmap pci device */
 void
-rte_eal_pci_unmap_device(struct rte_pci_device *dev)
+rte_pci_unmap_device(struct rte_pci_device *dev)
 {
        /* try unmapping the NIC resources */
        switch (dev->kdrv) {
@@ -282,6 +280,8 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
        /* FreeBSD has no NUMA support (yet) */
        dev->device.numa_node = 0;
 
+       pci_name_set(dev);
+
        /* FreeBSD has only one pass through driver */
        dev->kdrv = RTE_KDRV_NIC_UIO;
 
@@ -315,24 +315,23 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
        }
 
        /* device is valid, add in list (sorted) */
-       if (TAILQ_EMPTY(&pci_device_list)) {
-               rte_eal_device_insert(&dev->device);
-               TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
+       if (TAILQ_EMPTY(&rte_pci_bus.device_list)) {
+               rte_pci_add_device(dev);
        }
        else {
                struct rte_pci_device *dev2 = NULL;
                int ret;
 
-               TAILQ_FOREACH(dev2, &pci_device_list, next) {
-                       ret = rte_eal_compare_pci_addr(&dev->addr, &dev2->addr);
+               TAILQ_FOREACH(dev2, &rte_pci_bus.device_list, next) {
+                       ret = rte_pci_addr_cmp(&dev->addr, &dev2->addr);
                        if (ret > 0)
                                continue;
                        else if (ret < 0) {
-                               TAILQ_INSERT_BEFORE(dev2, dev, next);
-                               rte_eal_device_insert(&dev->device);
+                               rte_pci_insert_device(dev2, dev);
                        } else { /* already registered */
                                dev2->kdrv = dev->kdrv;
                                dev2->max_vfs = dev->max_vfs;
+                               pci_name_set(dev2);
                                memmove(dev2->mem_resource,
                                        dev->mem_resource,
                                        sizeof(dev->mem_resource));
@@ -340,8 +339,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
                        }
                        return 0;
                }
-               rte_eal_device_insert(&dev->device);
-               TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
+               rte_pci_add_device(dev);
        }
 
        return 0;
@@ -356,7 +354,7 @@ skipdev:
  * list. Call pci_scan_one() for each pci entry found.
  */
 int
-rte_eal_pci_scan(void)
+rte_pci_scan(void)
 {
        int fd;
        unsigned dev_count = 0;
@@ -369,6 +367,10 @@ rte_eal_pci_scan(void)
                        .matches = &matches[0],
        };
 
+       /* for debug purposes, PCI can be disabled */
+       if (!rte_eal_has_pci())
+               return 0;
+
        fd = open("/dev/pci", O_RDONLY);
        if (fd < 0) {
                RTE_LOG(ERR, EAL, "%s(): error opening /dev/pci\n", __func__);
@@ -392,7 +394,7 @@ rte_eal_pci_scan(void)
 
        close(fd);
 
-       RTE_LOG(ERR, EAL, "PCI scan found %u devices\n", dev_count);
+       RTE_LOG(DEBUG, EAL, "PCI scan found %u devices\n", dev_count);
        return 0;
 
 error:
@@ -401,6 +403,16 @@ error:
        return -1;
 }
 
+/*
+ * Get iommu class of PCI devices on the bus.
+ */
+enum rte_iova_mode
+rte_pci_get_iommu_class(void)
+{
+       /* Supports only RTE_KDRV_NIC_UIO */
+       return RTE_IOVA_PA;
+}
+
 int
 pci_update_device(const struct rte_pci_addr *addr)
 {
@@ -451,10 +463,11 @@ error:
 }
 
 /* Read PCI config space. */
-int rte_eal_pci_read_config(const struct rte_pci_device *dev,
-                           void *buf, size_t len, off_t offset)
+int rte_pci_read_config(const struct rte_pci_device *dev,
+               void *buf, size_t len, off_t offset)
 {
        int fd = -1;
+       int size;
        struct pci_io pi = {
                .pi_sel = {
                        .pc_domain = dev->addr.domain,
@@ -463,25 +476,28 @@ int rte_eal_pci_read_config(const struct rte_pci_device *dev,
                        .pc_func = dev->addr.function,
                },
                .pi_reg = offset,
-               .pi_width = len,
        };
 
-       if (len == 3 || len > sizeof(pi.pi_data)) {
-               RTE_LOG(ERR, EAL, "%s(): invalid pci read length\n", __func__);
-               goto error;
-       }
-
        fd = open("/dev/pci", O_RDWR);
        if (fd < 0) {
                RTE_LOG(ERR, EAL, "%s(): error opening /dev/pci\n", __func__);
                goto error;
        }
 
-       if (ioctl(fd, PCIOCREAD, &pi) < 0)
-               goto error;
+       while (len > 0) {
+               size = (len >= 4) ? 4 : ((len >= 2) ? 2 : 1);
+               pi.pi_width = size;
+
+               if (ioctl(fd, PCIOCREAD, &pi) < 0)
+                       goto error;
+               memcpy(buf, &pi.pi_data, size);
+
+               buf = (char *)buf + size;
+               pi.pi_reg += size;
+               len -= size;
+       }
        close(fd);
 
-       memcpy(buf, &pi.pi_data, len);
        return 0;
 
  error:
@@ -491,8 +507,8 @@ int rte_eal_pci_read_config(const struct rte_pci_device *dev,
 }
 
 /* Write PCI config space. */
-int rte_eal_pci_write_config(const struct rte_pci_device *dev,
-                            const void *buf, size_t len, off_t offset)
+int rte_pci_write_config(const struct rte_pci_device *dev,
+               const void *buf, size_t len, off_t offset)
 {
        int fd = -1;
 
@@ -534,8 +550,8 @@ int rte_eal_pci_write_config(const struct rte_pci_device *dev,
 }
 
 int
-rte_eal_pci_ioport_map(struct rte_pci_device *dev, int bar,
-                      struct rte_pci_ioport *p)
+rte_pci_ioport_map(struct rte_pci_device *dev, int bar,
+               struct rte_pci_ioport *p)
 {
        int ret;
 
@@ -562,7 +578,7 @@ rte_eal_pci_ioport_map(struct rte_pci_device *dev, int bar,
 
 static void
 pci_uio_ioport_read(struct rte_pci_ioport *p,
-                   void *data, size_t len, off_t offset)
+               void *data, size_t len, off_t offset)
 {
 #if defined(RTE_ARCH_X86)
        uint8_t *d;
@@ -590,8 +606,8 @@ pci_uio_ioport_read(struct rte_pci_ioport *p,
 }
 
 void
-rte_eal_pci_ioport_read(struct rte_pci_ioport *p,
-                       void *data, size_t len, off_t offset)
+rte_pci_ioport_read(struct rte_pci_ioport *p,
+               void *data, size_t len, off_t offset)
 {
        switch (p->dev->kdrv) {
        case RTE_KDRV_NIC_UIO:
@@ -604,7 +620,7 @@ rte_eal_pci_ioport_read(struct rte_pci_ioport *p,
 
 static void
 pci_uio_ioport_write(struct rte_pci_ioport *p,
-                    const void *data, size_t len, off_t offset)
+               const void *data, size_t len, off_t offset)
 {
 #if defined(RTE_ARCH_X86)
        const uint8_t *s;
@@ -614,13 +630,13 @@ pci_uio_ioport_write(struct rte_pci_ioport *p,
        for (s = data; len > 0; s += size, reg += size, len -= size) {
                if (len >= 4) {
                        size = 4;
-                       outl(*(const uint32_t *)s, reg);
+                       outl(reg, *(const uint32_t *)s);
                } else if (len >= 2) {
                        size = 2;
-                       outw(*(const uint16_t *)s, reg);
+                       outw(reg, *(const uint16_t *)s);
                } else {
                        size = 1;
-                       outb(*s, reg);
+                       outb(reg, *s);
                }
        }
 #else
@@ -632,8 +648,8 @@ pci_uio_ioport_write(struct rte_pci_ioport *p,
 }
 
 void
-rte_eal_pci_ioport_write(struct rte_pci_ioport *p,
-                        const void *data, size_t len, off_t offset)
+rte_pci_ioport_write(struct rte_pci_ioport *p,
+               const void *data, size_t len, off_t offset)
 {
        switch (p->dev->kdrv) {
        case RTE_KDRV_NIC_UIO:
@@ -645,7 +661,7 @@ rte_eal_pci_ioport_write(struct rte_pci_ioport *p,
 }
 
 int
-rte_eal_pci_ioport_unmap(struct rte_pci_ioport *p)
+rte_pci_ioport_unmap(struct rte_pci_ioport *p)
 {
        int ret;
 
@@ -662,18 +678,3 @@ rte_eal_pci_ioport_unmap(struct rte_pci_ioport *p)
 
        return ret;
 }
-
-/* Init the PCI EAL subsystem */
-int
-rte_eal_pci_init(void)
-{
-       /* for debug purposes, PCI can be disabled */
-       if (internal_config.no_pci)
-               return 0;
-
-       if (rte_eal_pci_scan() < 0) {
-               RTE_LOG(ERR, EAL, "%s(): Cannot scan PCI bus\n", __func__);
-               return -1;
-       }
-       return 0;
-}