return -1;
}
+bool
+pci_device_iommu_support_va(__rte_unused const struct rte_pci_device *dev)
+{
+ return false;
+}
+
enum rte_iova_mode
pci_device_iova_mode(const struct rte_pci_driver *pdrv __rte_unused,
const struct rte_pci_device *pdev)
}
#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)
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;
}
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: {
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)
- iova_mode = RTE_IOVA_PA;
- }
return iova_mode;
}
const struct rte_pci_driver *drv;
bool devices_want_va = false;
bool devices_want_pa = false;
+ int iommu_no_va = -1;
FOREACH_DEVICE_ON_PCIBUS(dev) {
+ /*
+ * 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_device_iommu_support_va(dev)
+ ? 0 : 1;
if (pci_ignore_device(dev))
continue;
if (dev->kdrv == RTE_KDRV_UNKNOWN ||
devices_want_va = true;
}
}
- if (devices_want_va && !devices_want_pa) {
+ if (iommu_no_va == 1) {
+ iova_mode = RTE_IOVA_PA;
+ if (devices_want_va) {
+ RTE_LOG(WARNING, EAL, "Some devices want 'VA' but IOMMU does not support 'VA'.\n");
+ RTE_LOG(WARNING, EAL, "The devices that want 'VA' won't initialize.\n");
+ }
+ } else if (devices_want_va && !devices_want_pa) {
iova_mode = RTE_IOVA_VA;
} else if (devices_want_pa && !devices_want_va) {
iova_mode = RTE_IOVA_PA;
const struct rte_pci_device *pci_dev);
/**
- * OS specific callback for rte_pci_get_iommu_class
+ * OS specific callbacks for rte_pci_get_iommu_class
*
*/
+bool
+pci_device_iommu_support_va(const struct rte_pci_device *dev);
+
enum rte_iova_mode
pci_device_iova_mode(const struct rte_pci_driver *pci_drv,
const struct rte_pci_device *pci_dev);