/* try mapping the NIC resources using VFIO if it exists */
switch (dev->kdrv) {
- case RTE_KDRV_VFIO:
+ case RTE_PCI_KDRV_VFIO:
#ifdef VFIO_PRESENT
if (pci_vfio_is_enabled())
ret = pci_vfio_map_resource(dev);
#endif
break;
- case RTE_KDRV_IGB_UIO:
- case RTE_KDRV_UIO_GENERIC:
+ case RTE_PCI_KDRV_IGB_UIO:
+ case RTE_PCI_KDRV_UIO_GENERIC:
if (rte_eal_using_phys_addrs()) {
/* map resources for devices that use uio */
ret = pci_uio_map_resource(dev);
{
/* try unmapping the NIC resources using VFIO if it exists */
switch (dev->kdrv) {
- case RTE_KDRV_VFIO:
+ case RTE_PCI_KDRV_VFIO:
#ifdef VFIO_PRESENT
if (pci_vfio_is_enabled())
pci_vfio_unmap_resource(dev);
#endif
break;
- case RTE_KDRV_IGB_UIO:
- case RTE_KDRV_UIO_GENERIC:
+ case RTE_PCI_KDRV_IGB_UIO:
+ case RTE_PCI_KDRV_UIO_GENERIC:
/* unmap resources for devices that use uio */
pci_uio_unmap_resource(dev);
break;
if (!ret) {
if (!strcmp(driver, "vfio-pci"))
- dev->kdrv = RTE_KDRV_VFIO;
+ dev->kdrv = RTE_PCI_KDRV_VFIO;
else if (!strcmp(driver, "igb_uio"))
- dev->kdrv = RTE_KDRV_IGB_UIO;
+ dev->kdrv = RTE_PCI_KDRV_IGB_UIO;
else if (!strcmp(driver, "uio_pci_generic"))
- dev->kdrv = RTE_KDRV_UIO_GENERIC;
+ dev->kdrv = RTE_PCI_KDRV_UIO_GENERIC;
else
- dev->kdrv = RTE_KDRV_UNKNOWN;
- } else
- dev->kdrv = RTE_KDRV_NONE;
-
+ dev->kdrv = RTE_PCI_KDRV_UNKNOWN;
+ } else {
+ dev->kdrv = RTE_PCI_KDRV_NONE;
+ return 0;
+ }
/* device is valid, add in list (sorted) */
if (TAILQ_EMPTY(&rte_pci_bus.device_list)) {
rte_pci_add_device(dev);
*/
RTE_LOG(ERR, EAL, "Unexpected device scan at %s!\n",
filename);
+ else if (dev2->device.devargs !=
+ dev->device.devargs) {
+ rte_devargs_remove(dev2->device.devargs);
+ pci_name_set(dev2);
+ }
}
free(dev);
}
if (parse_pci_addr_format(e->d_name, sizeof(e->d_name), &addr) != 0)
continue;
+ if (rte_pci_ignore_device(&addr))
+ continue;
+
snprintf(dirname, sizeof(dirname), "%s/%s",
rte_pci_get_sysfs_path(), e->d_name);
bool
pci_device_iommu_support_va(__rte_unused const struct rte_pci_device *dev)
{
- return false;
+ /*
+ * IOMMU is always present on a PowerNV host (IOMMUv2).
+ * IOMMU is also present in a KVM/QEMU VM (IOMMUv1) but is not
+ * currently supported by DPDK. Test for our current environment
+ * and report VA support as appropriate.
+ */
+
+ char *line = NULL;
+ size_t len = 0;
+ char filename[PATH_MAX] = "/proc/cpuinfo";
+ FILE *fp = fopen(filename, "r");
+ bool ret = false;
+
+ if (fp == NULL) {
+ RTE_LOG(ERR, EAL, "%s(): can't open %s: %s\n",
+ __func__, filename, strerror(errno));
+ return ret;
+ }
+
+ /* Check for a PowerNV platform */
+ while (getline(&line, &len, fp) != -1) {
+ if (strstr(line, "platform") != NULL)
+ continue;
+
+ if (strstr(line, "PowerNV") != NULL) {
+ RTE_LOG(DEBUG, EAL, "Running on a PowerNV system\n");
+ ret = true;
+ break;
+ }
+ }
+
+ free(line);
+ fclose(fp);
+ return ret;
}
#else
bool
enum rte_iova_mode iova_mode = RTE_IOVA_DC;
switch (pdev->kdrv) {
- case RTE_KDRV_VFIO: {
+ case RTE_PCI_KDRV_VFIO: {
#ifdef VFIO_PRESENT
static int is_vfio_noiommu_enabled = -1;
break;
}
- case RTE_KDRV_IGB_UIO:
- case RTE_KDRV_UIO_GENERIC:
+ case RTE_PCI_KDRV_IGB_UIO:
+ case RTE_PCI_KDRV_UIO_GENERIC:
iova_mode = RTE_IOVA_PA;
break;
const struct rte_intr_handle *intr_handle = &device->intr_handle;
switch (device->kdrv) {
- case RTE_KDRV_IGB_UIO:
- case RTE_KDRV_UIO_GENERIC:
+ case RTE_PCI_KDRV_IGB_UIO:
+ case RTE_PCI_KDRV_UIO_GENERIC:
return pci_uio_read_config(intr_handle, buf, len, offset);
#ifdef VFIO_PRESENT
- case RTE_KDRV_VFIO:
+ case RTE_PCI_KDRV_VFIO:
return pci_vfio_read_config(intr_handle, buf, len, offset);
#endif
default:
const struct rte_intr_handle *intr_handle = &device->intr_handle;
switch (device->kdrv) {
- case RTE_KDRV_IGB_UIO:
- case RTE_KDRV_UIO_GENERIC:
+ case RTE_PCI_KDRV_IGB_UIO:
+ case RTE_PCI_KDRV_UIO_GENERIC:
return pci_uio_write_config(intr_handle, buf, len, offset);
#ifdef VFIO_PRESENT
- case RTE_KDRV_VFIO:
+ case RTE_PCI_KDRV_VFIO:
return pci_vfio_write_config(intr_handle, buf, len, offset);
#endif
default:
int found = 0;
size_t linesz;
+ if (rte_eal_iopl_init() != 0) {
+ RTE_LOG(ERR, EAL, "%s(): insufficient ioport permissions for PCI device %s\n",
+ __func__, dev->name);
+ return -1;
+ }
+
snprintf(pci_id, sizeof(pci_id), PCI_PRI_FMT,
dev->addr.domain, dev->addr.bus,
dev->addr.devid, dev->addr.function);
switch (dev->kdrv) {
#ifdef VFIO_PRESENT
- case RTE_KDRV_VFIO:
+ case RTE_PCI_KDRV_VFIO:
if (pci_vfio_is_enabled())
ret = pci_vfio_ioport_map(dev, bar, p);
break;
#endif
- case RTE_KDRV_IGB_UIO:
+ case RTE_PCI_KDRV_IGB_UIO:
ret = pci_uio_ioport_map(dev, bar, p);
break;
- case RTE_KDRV_UIO_GENERIC:
+ case RTE_PCI_KDRV_UIO_GENERIC:
#if defined(RTE_ARCH_X86)
ret = pci_ioport_map(dev, bar, p);
#else
ret = pci_uio_ioport_map(dev, bar, p);
-#endif
- break;
- case RTE_KDRV_NONE:
-#if defined(RTE_ARCH_X86)
- ret = pci_ioport_map(dev, bar, p);
#endif
break;
default:
{
switch (p->dev->kdrv) {
#ifdef VFIO_PRESENT
- case RTE_KDRV_VFIO:
+ case RTE_PCI_KDRV_VFIO:
pci_vfio_ioport_read(p, data, len, offset);
break;
#endif
- case RTE_KDRV_IGB_UIO:
- pci_uio_ioport_read(p, data, len, offset);
- break;
- case RTE_KDRV_UIO_GENERIC:
+ case RTE_PCI_KDRV_IGB_UIO:
pci_uio_ioport_read(p, data, len, offset);
break;
- case RTE_KDRV_NONE:
-#if defined(RTE_ARCH_X86)
+ case RTE_PCI_KDRV_UIO_GENERIC:
pci_uio_ioport_read(p, data, len, offset);
-#endif
break;
default:
break;
{
switch (p->dev->kdrv) {
#ifdef VFIO_PRESENT
- case RTE_KDRV_VFIO:
+ case RTE_PCI_KDRV_VFIO:
pci_vfio_ioport_write(p, data, len, offset);
break;
#endif
- case RTE_KDRV_IGB_UIO:
+ case RTE_PCI_KDRV_IGB_UIO:
pci_uio_ioport_write(p, data, len, offset);
break;
- case RTE_KDRV_UIO_GENERIC:
+ case RTE_PCI_KDRV_UIO_GENERIC:
pci_uio_ioport_write(p, data, len, offset);
break;
- case RTE_KDRV_NONE:
-#if defined(RTE_ARCH_X86)
- pci_uio_ioport_write(p, data, len, offset);
-#endif
- break;
default:
break;
}
switch (p->dev->kdrv) {
#ifdef VFIO_PRESENT
- case RTE_KDRV_VFIO:
+ case RTE_PCI_KDRV_VFIO:
if (pci_vfio_is_enabled())
ret = pci_vfio_ioport_unmap(p);
break;
#endif
- case RTE_KDRV_IGB_UIO:
+ case RTE_PCI_KDRV_IGB_UIO:
ret = pci_uio_ioport_unmap(p);
break;
- case RTE_KDRV_UIO_GENERIC:
+ case RTE_PCI_KDRV_UIO_GENERIC:
#if defined(RTE_ARCH_X86)
ret = 0;
#else
ret = pci_uio_ioport_unmap(p);
-#endif
- break;
- case RTE_KDRV_NONE:
-#if defined(RTE_ARCH_X86)
- ret = 0;
#endif
break;
default: