diff options
-rw-r--r-- | xen/drivers/passthrough/amd/iommu_detect.c | 4 | ||||
-rw-r--r-- | xen/drivers/passthrough/amd/iommu_init.c | 7 | ||||
-rw-r--r-- | xen/include/asm-x86/amd-iommu.h | 1 |
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 *)); |