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

[Xen-changelog] [xen master] AMD IOMMU: drop amd_iommu_setup_hwdom_device()



commit 7c275549f46c5c46611592f7107c1345e93ed457
Author:     Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Thu Aug 10 12:34:21 2017 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu Aug 10 12:34:21 2017 +0200

    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>
    Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
 xen/drivers/passthrough/amd/pci_amd_iommu.c | 47 ++++++++++-------------------
 1 file changed, 16 insertions(+), 31 deletions(-)

diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c 
b/xen/drivers/passthrough/amd/pci_amd_iommu.c
index 8c25110..12d2695 100644
--- 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_device(
     }
 }
 
-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 domain *d)
     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_init(struct domain 
*d)
                                         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 pci_dev 
*pdev)
 {
     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, pdev->bus, PCI_SLOT(devfn),
+                            PCI_FUNC(devfn));
+            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;
--
generated by git-patchbot for /home/xen/git/xen.git#master

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

 


Rackspace

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