X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fbus%2Fpci%2Flinux%2Fpci.c;h=740a2cdad4ecc3f0474912e35a59adbc9f839baa;hb=f4fd0af59787c8668d3983d1498e2fc63264ee54;hp=33c8ea7e97e3a42c1a688fdfaffd4b60037575f4;hpb=703458e19c16135143b3f30089e1af66100c82dc;p=dpdk.git diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c index 33c8ea7e97..740a2cdad4 100644 --- a/drivers/bus/pci/linux/pci.c +++ b/drivers/bus/pci/linux/pci.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -329,9 +328,6 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr) dev->kdrv = RTE_KDRV_IGB_UIO; else if (!strcmp(driver, "uio_pci_generic")) dev->kdrv = RTE_KDRV_UIO_GENERIC; - else if (!strcmp(driver, "mlx4_core") || - !strcmp(driver, "mlx5_core")) - dev->kdrv = RTE_KDRV_NIC_MLX; else dev->kdrv = RTE_KDRV_UNKNOWN; } else @@ -501,12 +497,11 @@ error: } #if defined(RTE_ARCH_X86) -static bool -pci_one_device_iommu_support_va(const struct rte_pci_device *dev) +bool +pci_device_iommu_support_va(const struct rte_pci_device *dev) { #define VTD_CAP_MGAW_SHIFT 16 #define VTD_CAP_MGAW_MASK (0x3fULL << VTD_CAP_MGAW_SHIFT) -#define X86_VA_WIDTH 47 /* From Documentation/x86/x86_64/mm.txt */ const struct rte_pci_addr *addr = &dev->addr; char filename[PATH_MAX]; FILE *fp; @@ -516,18 +511,19 @@ pci_one_device_iommu_support_va(const struct rte_pci_device *dev) "%s/" PCI_PRI_FMT "/iommu/intel-iommu/cap", rte_pci_get_sysfs_path(), addr->domain, addr->bus, addr->devid, addr->function); - if (access(filename, F_OK) == -1) { - /* We don't have an Intel IOMMU, assume VA supported*/ - return true; - } - /* We have an intel IOMMU */ fp = fopen(filename, "r"); if (fp == NULL) { - RTE_LOG(ERR, EAL, "%s(): can't open %s\n", __func__, filename); + /* We don't have an Intel IOMMU, assume VA supported */ + if (errno == ENOENT) + return true; + + RTE_LOG(ERR, EAL, "%s(): can't open %s: %s\n", + __func__, filename, strerror(errno)); return false; } + /* We have an Intel IOMMU */ if (fscanf(fp, "%" PRIx64, &vtd_cap_reg) != 1) { RTE_LOG(ERR, EAL, "%s(): can't read %s\n", __func__, filename); fclose(fp); @@ -550,14 +546,14 @@ pci_one_device_iommu_support_va(const struct rte_pci_device *dev) return true; } #elif defined(RTE_ARCH_PPC_64) -static bool -pci_one_device_iommu_support_va(__rte_unused const struct rte_pci_device *dev) +bool +pci_device_iommu_support_va(__rte_unused const struct rte_pci_device *dev) { return false; } #else -static bool -pci_one_device_iommu_support_va(__rte_unused const struct rte_pci_device *dev) +bool +pci_device_iommu_support_va(__rte_unused const struct rte_pci_device *dev) { return true; } @@ -568,7 +564,6 @@ pci_device_iova_mode(const struct rte_pci_driver *pdrv, const struct rte_pci_device *pdev) { enum rte_iova_mode iova_mode = RTE_IOVA_DC; - static int iommu_no_va = -1; switch (pdev->kdrv) { case RTE_KDRV_VFIO: { @@ -581,45 +576,24 @@ pci_device_iova_mode(const struct rte_pci_driver *pdrv, else is_vfio_noiommu_enabled = 0; } - if ((pdrv->drv_flags & RTE_PCI_DRV_IOVA_AS_VA) == 0) { + if (is_vfio_noiommu_enabled != 0) iova_mode = RTE_IOVA_PA; - } else if (is_vfio_noiommu_enabled != 0) { - RTE_LOG(DEBUG, EAL, "Forcing to 'PA', vfio-noiommu mode configured\n"); - iova_mode = RTE_IOVA_PA; - } + else if ((pdrv->drv_flags & RTE_PCI_DRV_NEED_IOVA_AS_VA) != 0) + iova_mode = RTE_IOVA_VA; #endif break; } - case RTE_KDRV_NIC_MLX: - if ((pdrv->drv_flags & RTE_PCI_DRV_IOVA_AS_VA) == 0) - iova_mode = RTE_IOVA_PA; - break; - case RTE_KDRV_IGB_UIO: case RTE_KDRV_UIO_GENERIC: iova_mode = RTE_IOVA_PA; break; default: - RTE_LOG(DEBUG, EAL, "Unsupported kernel driver? Defaulting to IOVA as 'PA'\n"); - iova_mode = RTE_IOVA_PA; + if ((pdrv->drv_flags & RTE_PCI_DRV_NEED_IOVA_AS_VA) != 0) + iova_mode = RTE_IOVA_VA; break; } - - if (iova_mode != RTE_IOVA_PA) { - /* - * We can check this only once, because the IOMMU hardware is - * the same for all of them. - */ - if (iommu_no_va == -1) - iommu_no_va = pci_one_device_iommu_support_va(pdev) - ? 0 : 1; - if (iommu_no_va != 0) { - RTE_LOG(DEBUG, EAL, "Forcing to 'PA', IOMMU does not support IOVA as 'VA'\n"); - iova_mode = RTE_IOVA_PA; - } - } return iova_mode; } @@ -683,6 +657,12 @@ pci_ioport_map(struct rte_pci_device *dev, int bar __rte_unused, 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);