From patchwork Thu May 30 17:48:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Walker, Benjamin" X-Patchwork-Id: 53917 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B3A491B94F; Thu, 30 May 2019 19:48:37 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 18A74378B for ; Thu, 30 May 2019 19:48:28 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 May 2019 10:48:28 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,532,1549958400"; d="scan'208";a="180020115" Received: from bwalker-desk.ch.intel.com ([143.182.136.145]) by fmsmga002.fm.intel.com with ESMTP; 30 May 2019 10:48:28 -0700 From: Ben Walker To: dev@dpdk.org Cc: Ben Walker Date: Thu, 30 May 2019 10:48:18 -0700 Message-Id: <20190530174819.1160221-12-benjamin.walker@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190530174819.1160221-1-benjamin.walker@intel.com> References: <20190530174819.1160221-1-benjamin.walker@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 11/12] eal/pci: rte_pci_get_iommu_class handles no drivers X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" In the case where no drivers are registered with the system, rte_pci_get_iommu_class should return RTE_IOVA_DC. Signed-off-by: Ben Walker Change-Id: Ia5b0cae100cfcfe46a9e4996328f9746ce33cfd3 --- drivers/bus/pci/linux/pci.c | 79 ++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c index 09af66571..abc21061f 100644 --- a/drivers/bus/pci/linux/pci.c +++ b/drivers/bus/pci/linux/pci.c @@ -589,49 +589,68 @@ pci_ignore_device(struct rte_pci_device *dev) enum rte_iova_mode rte_pci_get_iommu_class(void) { - bool is_bound = false; - bool is_vfio_noiommu_enabled = true; - bool has_iova_va = false; - bool is_bound_uio = false; - bool iommu_no_va = false; - struct rte_pci_device *dev = NULL; - struct rte_pci_driver *drv = NULL; + struct rte_pci_device *dev; + struct rte_pci_driver *drv; + struct rte_pci_addr *addr; + enum rte_iova_mode iova_mode; + + iova_mode = RTE_IOVA_DC; FOREACH_DEVICE_ON_PCIBUS(dev) { if (pci_ignore_device(dev)) continue; + addr = &dev->addr; + switch (dev->kdrv) { case RTE_KDRV_UNKNOWN: case RTE_KDRV_NONE: break; case RTE_KDRV_VFIO: - is_bound = true; FOREACH_DRIVER_ON_PCIBUS(drv) { if (!rte_pci_match(drv, dev)) continue; - /* - * just one PCI device needs to be checked out because - * the IOMMU hardware is the same for all of them. - */ - iommu_no_va = !pci_one_device_iommu_support_va(dev); + if ((drv->drv_flags & RTE_PCI_DRV_IOVA_AS_VA) == 0) + continue; - if (drv->drv_flags & RTE_PCI_DRV_IOVA_AS_VA) { - has_iova_va = true; - break; + if (!pci_one_device_iommu_support_va(dev)) { + RTE_LOG(WARNING, EAL, "Device " PCI_PRI_FMT " wanted IOVA as VA, but ", + addr->domain, addr->bus, addr->devid, addr->function); + RTE_LOG(WARNING, EAL, "IOMMU does not support it.\n"); + iova_mode = RTE_IOVA_PA; + } +#ifdef VFIO_PRESENT + else if (rte_vfio_noiommu_is_enabled()) { + RTE_LOG(WARNING, EAL, "Device " PCI_PRI_FMT " wanted IOVA as VA, but ", + addr->domain, addr->bus, addr->devid, addr->function); + RTE_LOG(WARNING, EAL, "vfio-noiommu is enabled.\n"); + iova_mode = RTE_IOVA_PA; +#endif + } else if (iova_mode == RTE_IOVA_PA) { + RTE_LOG(WARNING, EAL, "Device " PCI_PRI_FMT " wanted IOVA as VA, but ", + addr->domain, addr->bus, addr->devid, addr->function); + RTE_LOG(WARNING, EAL, "other devices require PA.\n"); + } else { + iova_mode = RTE_IOVA_VA; } } break; case RTE_KDRV_IGB_UIO: case RTE_KDRV_UIO_GENERIC: case RTE_KDRV_NIC_UIO: - is_bound = true; FOREACH_DRIVER_ON_PCIBUS(drv) { if (!rte_pci_match(drv, dev)) continue; - is_bound_uio = true; + if (iova_mode == RTE_IOVA_VA) { + RTE_LOG(WARNING, EAL, "Some devices wanted IOVA as VA, but "); + RTE_LOG(WARNING, EAL, "device " PCI_PRI_FMT " requires PA.\n", + addr->domain, addr->bus, addr->devid, addr->function); + + } + + iova_mode = RTE_IOVA_PA; break; } break; @@ -639,29 +658,7 @@ rte_pci_get_iommu_class(void) } } - if (!is_bound) - return RTE_IOVA_DC; - -#ifdef VFIO_PRESENT - is_vfio_noiommu_enabled = rte_vfio_noiommu_is_enabled() == true ? - true : false; -#endif - - if (has_iova_va && !is_bound_uio && !is_vfio_noiommu_enabled && - !iommu_no_va) - return RTE_IOVA_VA; - - if (has_iova_va) { - RTE_LOG(WARNING, EAL, "Some devices want iova as va but pa will be used because.. "); - if (is_vfio_noiommu_enabled) - RTE_LOG(WARNING, EAL, "vfio-noiommu mode configured\n"); - if (is_bound_uio) - RTE_LOG(WARNING, EAL, "few device bound to UIO\n"); - if (iommu_no_va) - RTE_LOG(WARNING, EAL, "IOMMU does not support IOVA as VA\n"); - } - - return RTE_IOVA_PA; + return iova_mode; } /* Read PCI config space. */