[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 4/8] iommu/arm: iommu_add_dt_pci_device phantom handling


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
  • Date: Thu, 11 May 2023 15:16:50 -0400
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Inv85I3n2ejvqoWpRiGzQrvDhgSa+TdZRQ6ClAmebH8=; b=lvpyvywFyUV9sB/e1wCiHUb2rF9rs/1Dbcm/RSG+CROWgjBzD6OqdMKTbdGfwQzu63HecwTAokLVKuaNNm0+BlYsO8tniNiFiRXh5QkBWwxKY3UK0bBX5z9B2b9bzA+g3KXbsQpnOBdakYjMZF7bOVk8u/BhsgsgYYY19FVhP1j5FChuvVOKg7SwvWUFETOJC7L2xAmkLuALR10y5L/REupwNYyG/wK1rbjx/BjU8+Z+IwjCwRTN3SaSy7/NQwY+9x/cbnV6sZMZfKH4sagXUy8j5MV15h0kDnbe9Elpxrd3GVLaSIdynjDb7kq58V2YZYPNLc43WmGBh8zGYCcwZw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cHlBC3twaD0QcwAZzctAdvpgiJLTsz63RaOEVJ9msGHr8Y7j2zoLjVFuny0/5ogQz5rxJ1Q+NRSoufixqQCeNkpimpZkIgSnXM+DW6asFCLMt3NTAnSrj/zIIZzDF4SDUnnpnIQmdZhreh6fBzsq5UUaNJH+marOXj3Rh4VIPCOoaM4Er1HxwAQ4WA/mAd8e7gqWCy7igpxVN7DmiECKvErtNXC4AvuXQzOWZPDVHy31qAFbEQwbX9cg/ngqYz+6vZ9GyVd2pzE+w5CjK7moXejaEDWF6dvPNgbTDPDm47so+ox2K8d5JN3+5TDP5X6SFKK5Y5Jv9H9QAsua1ccshg==
  • Cc: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>
  • Delivery-date: Thu, 11 May 2023 19:19:20 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Handle phantom functions in iommu_add_dt_pci_device(). Each phantom function
will have a unique requestor ID (RID)/BDF. On ARM, we need to map/translate the
RID/BDF to an AXI stream ID for each phantom function according to the pci-iommu
device tree mapping [1]. The RID/BDF -> AXI stream ID mapping in DT could allow
phantom devices (i.e. devices with phantom functions) to use different AXI
stream IDs based on the (phantom) function.

[1] 
https://www.kernel.org/doc/Documentation/devicetree/bindings/pci/pci-iommu.txt

Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
---
v1->v2:
* new patch

---
 xen/drivers/passthrough/device_tree.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/xen/drivers/passthrough/device_tree.c 
b/xen/drivers/passthrough/device_tree.c
index 5e462e5c2ca8..ced911f4fb31 100644
--- a/xen/drivers/passthrough/device_tree.c
+++ b/xen/drivers/passthrough/device_tree.c
@@ -247,6 +247,7 @@ int iommu_add_dt_pci_device(struct pci_dev *pdev)
     struct device *dev = pci_to_dev(pdev);
     const struct dt_device_node *np;
     int rc = NO_IOMMU;
+    unsigned int devfn = pdev->devfn;
 
     if ( !iommu_enabled )
         return NO_IOMMU;
@@ -275,7 +276,7 @@ int iommu_add_dt_pci_device(struct pci_dev *pdev)
      * According to the Documentation/devicetree/bindings/pci/pci-iommu.txt
      * from Linux.
      */
-    rc = iommu_dt_pci_map_id(np, PCI_BDF(pdev->bus, pdev->devfn), "iommu-map",
+    rc = iommu_dt_pci_map_id(np, PCI_BDF(pdev->bus, devfn), "iommu-map",
                              "iommu-map-mask", &iommu_spec.np, 
iommu_spec.args);
     if ( rc )
         return rc == -ENODEV ? NO_IOMMU : rc;
@@ -286,6 +287,26 @@ int iommu_add_dt_pci_device(struct pci_dev *pdev)
         iommu_fwspec_free(pci_to_dev(pdev));
         return -EINVAL;
     }
+    for ( ; pdev->phantom_stride ; )
+    {
+        devfn += pdev->phantom_stride;
+        if ( PCI_SLOT(devfn) != PCI_SLOT(pdev->devfn) )
+            break;
+        rc = iommu_dt_pci_map_id(np, PCI_BDF(pdev->bus, devfn), "iommu-map",
+                                 "iommu-map-mask", &iommu_spec.np, 
iommu_spec.args);
+        if ( rc )
+        {
+            printk(XENLOG_WARNING "IOMMU: add %pp failed (%d)\n",
+                   &PCI_SBDF(pdev->seg, pdev->bus, devfn), rc);
+            return rc == -ENODEV ? NO_IOMMU : rc;
+        }
+        rc = iommu_dt_xlate(dev, &iommu_spec);
+        if ( rc < 0 )
+        {
+            iommu_fwspec_free(pci_to_dev(pdev));
+            return -EINVAL;
+        }
+    }
 
     return rc;
 }
-- 
2.40.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.