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

[Xen-devel] [PATCH] AMD IOMMU: drop amd_iommu_setup_hwdom_device()



By moving its bridge special casing to amd_iommu_add_device(), we can
pass the latter to setup_hwdom_pci_devices() and at once consistently
handle bridges discovered at boot time as well as such reported by Dom0
later on.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>

--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
@@ -168,33 +168,6 @@ static void amd_iommu_setup_domain_devic
     }
 }
 
-static int __hwdom_init amd_iommu_setup_hwdom_device(
-    u8 devfn, struct pci_dev *pdev)
-{
-    int bdf = PCI_BDF2(pdev->bus, pdev->devfn);
-    struct amd_iommu *iommu = find_iommu_for_device(pdev->seg, bdf);
-
-    if ( unlikely(!iommu) )
-    {
-        /* Filter the bridge devices */
-        if ( pdev->type == DEV_TYPE_PCI_HOST_BRIDGE )
-        {
-            AMD_IOMMU_DEBUG("Skipping host bridge %04x:%02x:%02x.%u\n",
-                            pdev->seg, PCI_BUS(bdf), PCI_SLOT(bdf),
-                            PCI_FUNC(bdf));
-            return 0;
-        }
-
-        AMD_IOMMU_DEBUG("No iommu for device %04x:%02x:%02x.%u\n",
-                        pdev->seg, pdev->bus,
-                        PCI_SLOT(devfn), PCI_FUNC(devfn));
-        return -ENODEV;
-    }
-
-    amd_iommu_setup_domain_device(pdev->domain, iommu, devfn, pdev);
-    return 0;
-}
-
 int __init amd_iov_detect(void)
 {
     INIT_LIST_HEAD(&amd_iommu_head);
@@ -273,6 +246,8 @@ static int amd_iommu_domain_init(struct
     return 0;
 }
 
+static int amd_iommu_add_device(u8 devfn, struct pci_dev *pdev);
+
 static void __hwdom_init amd_iommu_hwdom_init(struct domain *d)
 {
     unsigned long i; 
@@ -318,7 +293,7 @@ static void __hwdom_init amd_iommu_hwdom
                                         IOMMU_MMIO_REGION_LENGTH - 1)) )
             BUG();
 
-    setup_hwdom_pci_devices(d, amd_iommu_setup_hwdom_device);
+    setup_hwdom_pci_devices(d, amd_iommu_add_device);
 }
 
 void amd_iommu_disable_domain_device(struct domain *domain,
@@ -490,15 +465,25 @@ static int amd_iommu_add_device(u8 devfn
 {
     struct amd_iommu *iommu;
     u16 bdf;
+
     if ( !pdev->domain )
         return -EINVAL;
 
     bdf = PCI_BDF2(pdev->bus, pdev->devfn);
     iommu = find_iommu_for_device(pdev->seg, bdf);
-    if ( !iommu )
+    if ( unlikely(!iommu) )
     {
-        AMD_IOMMU_DEBUG("Fail to find iommu."
-                        " %04x:%02x:%02x.%u cannot be assigned to dom%d\n",
+        /* Filter bridge devices. */
+        if ( pdev->type == DEV_TYPE_PCI_HOST_BRIDGE &&
+             is_hardware_domain(pdev->domain) )
+        {
+            AMD_IOMMU_DEBUG("Skipping host bridge %04x:%02x:%02x.%u\n",
+                            pdev->seg, PCI_BUS(bdf), PCI_SLOT(bdf),
+                            PCI_FUNC(bdf));
+            return 0;
+        }
+
+        AMD_IOMMU_DEBUG("No iommu for %04x:%02x:%02x.%u; cannot be handed to 
d%d\n",
                         pdev->seg, pdev->bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
                         pdev->domain->domain_id);
         return -ENODEV;




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

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