aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/drivers/passthrough/amd/iommu_detect.c4
-rw-r--r--xen/drivers/passthrough/amd/iommu_init.c7
-rw-r--r--xen/include/asm-x86/amd-iommu.h1
3 files changed, 4 insertions, 8 deletions
diff --git a/xen/drivers/passthrough/amd/iommu_detect.c b/xen/drivers/passthrough/amd/iommu_detect.c
index e0e571b35c..7efcb0065b 100644
--- a/xen/drivers/passthrough/amd/iommu_detect.c
+++ b/xen/drivers/passthrough/amd/iommu_detect.c
@@ -122,10 +122,6 @@ int __init amd_iommu_detect_one_acpi(void *ivhd)
spin_lock_init(&iommu->lock);
iommu->seg = ivhd_block->pci_segment;
- if (alloc_ivrs_mappings(ivhd_block->pci_segment)) {
- xfree(iommu);
- return -ENOMEM;
- }
iommu->bdf = ivhd_block->header.dev_id;
iommu->cap_offset = ivhd_block->cap_offset;
iommu->mmio_base_phys = ivhd_block->mmio_base;
diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c
index 248a379cd4..f870017d69 100644
--- a/xen/drivers/passthrough/amd/iommu_init.c
+++ b/xen/drivers/passthrough/amd/iommu_init.c
@@ -769,7 +769,7 @@ int iterate_ivrs_entries(int (*handler)(u16 seg, struct ivrs_mappings *))
return rc;
}
-int __init alloc_ivrs_mappings(u16 seg)
+static int __init alloc_ivrs_mappings(u16 seg)
{
struct ivrs_mappings *ivrs_mappings;
int bdf;
@@ -882,8 +882,9 @@ int __init amd_iommu_init(void)
goto error_out;
radix_tree_init(&ivrs_maps);
- if ( alloc_ivrs_mappings(0) != 0 )
- goto error_out;
+ for_each_amd_iommu ( iommu )
+ if ( alloc_ivrs_mappings(iommu->seg) != 0 )
+ goto error_out;
if ( amd_iommu_update_ivrs_mapping_acpi() != 0 )
goto error_out;
diff --git a/xen/include/asm-x86/amd-iommu.h b/xen/include/asm-x86/amd-iommu.h
index ea40310c78..5dc97c6766 100644
--- a/xen/include/asm-x86/amd-iommu.h
+++ b/xen/include/asm-x86/amd-iommu.h
@@ -103,7 +103,6 @@ struct ivrs_mappings {
extern unsigned short ivrs_bdf_entries;
-int alloc_ivrs_mappings(u16 seg);
struct ivrs_mappings *get_ivrs_mappings(u16 seg);
int iterate_ivrs_mappings(int (*)(u16 seg, struct ivrs_mappings *));
int iterate_ivrs_entries(int (*)(u16 seg, struct ivrs_mappings *));