]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
x86/amd-iommu: attach devices to pre-allocated domains early
authorJoerg Roedel <joerg.roedel@amd.com>
Mon, 23 Nov 2009 11:50:00 +0000 (12:50 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 18 Dec 2009 21:43:38 +0000 (13:43 -0800)
commit be831297716036de5b24308447ecb69f1706a846 upstream.

For some devices the ACPI table may define unity map
requirements which must me met when the IOMMU is enabled. So
we need to attach devices to their domains as early as
possible so that these mappings are in place when needed.
This patch assigns the domains right after they are
allocated. Otherwise this can result in I/O page faults
before a driver binds to a device and BIOS is still using
it.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/x86/kernel/amd_iommu.c

index f5cb46a09e6098442cc847e1a8d35549e2a3fdd1..d7be38c297b0a27cd0ed06c7f5d703add48ba14d 100644 (file)
@@ -1873,10 +1873,10 @@ static void prealloc_protection_domains(void)
        struct pci_dev *dev = NULL;
        struct dma_ops_domain *dma_dom;
        struct amd_iommu *iommu;
-       u16 devid;
+       u16 devid, __devid;
 
        while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-               devid = calc_devid(dev->bus->number, dev->devfn);
+               __devid = devid = calc_devid(dev->bus->number, dev->devfn);
                if (devid > amd_iommu_last_bdf)
                        continue;
                devid = amd_iommu_alias_table[devid];
@@ -1891,6 +1891,10 @@ static void prealloc_protection_domains(void)
                init_unity_mappings_for_device(dma_dom, devid);
                dma_dom->target_dev = devid;
 
+               attach_device(iommu, &dma_dom->domain, devid);
+               if (__devid != devid)
+                       attach_device(iommu, &dma_dom->domain, __devid);
+
                list_add_tail(&dma_dom->list, &iommu_pd_list);
        }
 }