pipeline: increase SWX immediate operand size
[dpdk.git] / drivers / bus / pci / bsd / pci.c
index facc4b1..4b8a208 100644 (file)
@@ -1,34 +1,5 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2014 Intel Corporation
  */
 
 #include <ctype.h>
@@ -62,7 +33,6 @@
 #include <rte_launch.h>
 #include <rte_memory.h>
 #include <rte_eal.h>
-#include <rte_eal_memconfig.h>
 #include <rte_per_lcore.h>
 #include <rte_lcore.h>
 #include <rte_malloc.h>
 
 /**
  * @file
- * PCI probing under linux
+ * PCI probing under BSD
  *
  * This code is used to simulate a PCI probe by parsing information in
  * sysfs. Moreover, when a registered driver matches a device, the
  * kernel driver currently using it is unloaded and replaced by
- * igb_uio module, which is a very minimal userland driver for Intel
+ * nic_uio module, which is a very minimal userland driver for Intel
  * network card, only providing access to PCI BAR to applications, and
  * enabling bus master.
  */
@@ -95,7 +65,7 @@ rte_pci_map_device(struct rte_pci_device *dev)
 
        /* try mapping the NIC resources */
        switch (dev->kdrv) {
-       case RTE_KDRV_NIC_UIO:
+       case RTE_PCI_KDRV_NIC_UIO:
                /* map resources for devices that use uio */
                ret = pci_uio_map_resource(dev);
                break;
@@ -115,7 +85,7 @@ rte_pci_unmap_device(struct rte_pci_device *dev)
 {
        /* try unmapping the NIC resources */
        switch (dev->kdrv) {
-       case RTE_KDRV_NIC_UIO:
+       case RTE_PCI_KDRV_NIC_UIO:
                /* unmap resources for devices that use uio */
                pci_uio_unmap_resource(dev);
                break;
@@ -174,7 +144,7 @@ pci_uio_alloc_resource(struct rte_pci_device *dev,
                goto error;
        }
 
-       snprintf((*uio_res)->path, sizeof((*uio_res)->path), "%s", devname);
+       strlcpy((*uio_res)->path, devname, sizeof((*uio_res)->path));
        memcpy(&(*uio_res)->pci_addr, &dev->addr, sizeof((*uio_res)->pci_addr));
 
        return 0;
@@ -222,7 +192,7 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx,
        mapaddr = pci_map_resource(NULL, fd, (off_t)offset,
                        (size_t)dev->mem_resource[res_idx].len, 0);
        close(fd);
-       if (mapaddr == MAP_FAILED)
+       if (mapaddr == NULL)
                goto error;
 
        maps[map_idx].phaddr = dev->mem_resource[res_idx].phys_addr;
@@ -252,6 +222,8 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
        }
 
        memset(dev, 0, sizeof(*dev));
+       dev->device.bus = &rte_pci_bus.bus;
+
        dev->addr.domain = conf->pc_sel.pc_domain;
        dev->addr.bus = conf->pc_sel.pc_bus;
        dev->addr.devid = conf->pc_sel.pc_dev;
@@ -283,7 +255,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
        pci_name_set(dev);
 
        /* FreeBSD has only one pass through driver */
-       dev->kdrv = RTE_KDRV_NIC_UIO;
+       dev->kdrv = RTE_PCI_KDRV_NIC_UIO;
 
        /* parse resources */
        switch (conf->pc_hdr & PCIM_HDRTYPE) {
@@ -366,6 +338,7 @@ rte_pci_scan(void)
                        .match_buf_len = sizeof(matches),
                        .matches = &matches[0],
        };
+       struct rte_pci_addr pci_addr;
 
        /* for debug purposes, PCI can be disabled */
        if (!rte_eal_has_pci())
@@ -385,9 +358,18 @@ rte_pci_scan(void)
                        goto error;
                }
 
-               for (i = 0; i < conf_io.num_matches; i++)
+               for (i = 0; i < conf_io.num_matches; i++) {
+                       pci_addr.domain = matches[i].pc_sel.pc_domain;
+                       pci_addr.bus = matches[i].pc_sel.pc_bus;
+                       pci_addr.devid = matches[i].pc_sel.pc_dev;
+                       pci_addr.function = matches[i].pc_sel.pc_func;
+
+                       if (rte_pci_ignore_device(&pci_addr))
+                               continue;
+
                        if (pci_scan_one(fd, &matches[i]) < 0)
                                goto error;
+               }
 
                dev_count += conf_io.num_matches;
        } while(conf_io.status == PCI_GETCONF_MORE_DEVS);
@@ -403,63 +385,20 @@ error:
        return -1;
 }
 
-/*
- * Get iommu class of PCI devices on the bus.
- */
-enum rte_iova_mode
-rte_pci_get_iommu_class(void)
+bool
+pci_device_iommu_support_va(__rte_unused const struct rte_pci_device *dev)
 {
-       /* Supports only RTE_KDRV_NIC_UIO */
-       return RTE_IOVA_PA;
+       return false;
 }
 
-int
-pci_update_device(const struct rte_pci_addr *addr)
+enum rte_iova_mode
+pci_device_iova_mode(const struct rte_pci_driver *pdrv __rte_unused,
+                    const struct rte_pci_device *pdev)
 {
-       int fd;
-       struct pci_conf matches[2];
-       struct pci_match_conf match = {
-               .pc_sel = {
-                       .pc_domain = addr->domain,
-                       .pc_bus = addr->bus,
-                       .pc_dev = addr->devid,
-                       .pc_func = addr->function,
-               },
-       };
-       struct pci_conf_io conf_io = {
-               .pat_buf_len = 0,
-               .num_patterns = 1,
-               .patterns = &match,
-               .match_buf_len = sizeof(matches),
-               .matches = &matches[0],
-       };
-
-       fd = open("/dev/pci", O_RDONLY);
-       if (fd < 0) {
-               RTE_LOG(ERR, EAL, "%s(): error opening /dev/pci\n", __func__);
-               goto error;
-       }
-
-       if (ioctl(fd, PCIOCGETCONF, &conf_io) < 0) {
-               RTE_LOG(ERR, EAL, "%s(): error with ioctl on /dev/pci: %s\n",
-                               __func__, strerror(errno));
-               goto error;
-       }
-
-       if (conf_io.num_matches != 1)
-               goto error;
-
-       if (pci_scan_one(fd, &matches[0]) < 0)
-               goto error;
+       if (pdev->kdrv != RTE_PCI_KDRV_NIC_UIO)
+               RTE_LOG(DEBUG, EAL, "Unsupported kernel driver? Defaulting to IOVA as 'PA'\n");
 
-       close(fd);
-
-       return 0;
-
-error:
-       if (fd >= 0)
-               close(fd);
-       return -1;
+       return RTE_IOVA_PA;
 }
 
 /* Read PCI config space. */
@@ -468,6 +407,8 @@ int rte_pci_read_config(const struct rte_pci_device *dev,
 {
        int fd = -1;
        int size;
+       /* Copy Linux implementation's behaviour */
+       const int return_len = len;
        struct pci_io pi = {
                .pi_sel = {
                        .pc_domain = dev->addr.domain,
@@ -498,7 +439,7 @@ int rte_pci_read_config(const struct rte_pci_device *dev,
        }
        close(fd);
 
-       return 0;
+       return return_len;
 
  error:
        if (fd >= 0)
@@ -557,7 +498,12 @@ rte_pci_ioport_map(struct rte_pci_device *dev, int bar,
 
        switch (dev->kdrv) {
 #if defined(RTE_ARCH_X86)
-       case RTE_KDRV_NIC_UIO:
+       case RTE_PCI_KDRV_NIC_UIO:
+               if (rte_eal_iopl_init() != 0) {
+                       RTE_LOG(ERR, EAL, "%s(): insufficient ioport permissions for PCI device %s\n",
+                               __func__, dev->name);
+                       return -1;
+               }
                if ((uintptr_t) dev->mem_resource[bar].addr <= UINT16_MAX) {
                        p->base = (uintptr_t)dev->mem_resource[bar].addr;
                        ret = 0;
@@ -610,7 +556,7 @@ 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:
+       case RTE_PCI_KDRV_NIC_UIO:
                pci_uio_ioport_read(p, data, len, offset);
                break;
        default:
@@ -652,7 +598,7 @@ 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:
+       case RTE_PCI_KDRV_NIC_UIO:
                pci_uio_ioport_write(p, data, len, offset);
                break;
        default:
@@ -667,7 +613,7 @@ rte_pci_ioport_unmap(struct rte_pci_ioport *p)
 
        switch (p->dev->kdrv) {
 #if defined(RTE_ARCH_X86)
-       case RTE_KDRV_NIC_UIO:
+       case RTE_PCI_KDRV_NIC_UIO:
                ret = 0;
                break;
 #endif