diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2008-06-26 15:28:04 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-06-27 04:12:20 -0400 |
commit | c432f3df8ea740e2ecb27da88bd6b5a254714959 (patch) | |
tree | df10967104c41c0e2c1a65e33a3ecdf51f58060d /arch/x86/kernel/amd_iommu.c | |
parent | 5d8b53cf3f8762b2230fb3d5b4e2ff78c5e701d8 (diff) |
x86, AMD IOMMU: add pre-allocation of protection domains
This patch adds a function to pre-allocate protection domains. So we don't have
to allocate it on the first request for a device (which can happen in atomic
mode).
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Cc: iommu@lists.linux-foundation.org
Cc: bhavna.sarathy@amd.com
Cc: Sebastian.Biemueller@amd.com
Cc: robert.richter@amd.com
Cc: joro@8bytes.org
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/amd_iommu.c')
-rw-r--r-- | arch/x86/kernel/amd_iommu.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index aab9125ac0b2..bed5f820898d 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
@@ -872,3 +872,37 @@ free_mem: | |||
872 | free_pages((unsigned long)virt_addr, get_order(size)); | 872 | free_pages((unsigned long)virt_addr, get_order(size)); |
873 | } | 873 | } |
874 | 874 | ||
875 | /* | ||
876 | * If the driver core informs the DMA layer if a driver grabs a device | ||
877 | * we don't need to preallocate the protection domains anymore. | ||
878 | * For now we have to. | ||
879 | */ | ||
880 | void prealloc_protection_domains(void) | ||
881 | { | ||
882 | struct pci_dev *dev = NULL; | ||
883 | struct dma_ops_domain *dma_dom; | ||
884 | struct amd_iommu *iommu; | ||
885 | int order = amd_iommu_aperture_order; | ||
886 | u16 devid; | ||
887 | |||
888 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | ||
889 | devid = (dev->bus->number << 8) | dev->devfn; | ||
890 | if (devid >= amd_iommu_last_bdf) | ||
891 | continue; | ||
892 | devid = amd_iommu_alias_table[devid]; | ||
893 | if (domain_for_device(devid)) | ||
894 | continue; | ||
895 | iommu = amd_iommu_rlookup_table[devid]; | ||
896 | if (!iommu) | ||
897 | continue; | ||
898 | dma_dom = dma_ops_domain_alloc(iommu, order); | ||
899 | if (!dma_dom) | ||
900 | continue; | ||
901 | init_unity_mappings_for_device(dma_dom, devid); | ||
902 | set_device_domain(iommu, &dma_dom->domain, devid); | ||
903 | printk(KERN_INFO "AMD IOMMU: Allocated domain %d for device ", | ||
904 | dma_dom->domain.id); | ||
905 | print_devid(devid, 1); | ||
906 | } | ||
907 | } | ||
908 | |||