diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2012-06-15 12:05:20 -0400 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2012-09-28 11:30:04 -0400 |
commit | 0ea2c422bc8da99d14baa46d4789861a4f8d4ec0 (patch) | |
tree | da722904779083287e209324b77d9b80235d2348 /drivers/iommu/amd_iommu_init.c | |
parent | 05152a0494449f60031da683e6d4cd60d0882214 (diff) |
iommu/amd: Allocate data structures to keep track of irq remapping tables
To easily map device ids to interrupt remapping table
entries a new lookup table is necessary.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'drivers/iommu/amd_iommu_init.c')
-rw-r--r-- | drivers/iommu/amd_iommu_init.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 073ed5d1e053..2d923fe7c2a1 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c | |||
@@ -184,6 +184,12 @@ u16 *amd_iommu_alias_table; | |||
184 | struct amd_iommu **amd_iommu_rlookup_table; | 184 | struct amd_iommu **amd_iommu_rlookup_table; |
185 | 185 | ||
186 | /* | 186 | /* |
187 | * This table is used to find the irq remapping table for a given device id | ||
188 | * quickly. | ||
189 | */ | ||
190 | struct irq_remap_table **irq_lookup_table; | ||
191 | |||
192 | /* | ||
187 | * AMD IOMMU allows up to 2^16 differend protection domains. This is a bitmap | 193 | * AMD IOMMU allows up to 2^16 differend protection domains. This is a bitmap |
188 | * to know which ones are already in use. | 194 | * to know which ones are already in use. |
189 | */ | 195 | */ |
@@ -1532,9 +1538,13 @@ static struct syscore_ops amd_iommu_syscore_ops = { | |||
1532 | 1538 | ||
1533 | static void __init free_on_init_error(void) | 1539 | static void __init free_on_init_error(void) |
1534 | { | 1540 | { |
1541 | free_pages((unsigned long)irq_lookup_table, | ||
1542 | get_order(rlookup_table_size)); | ||
1543 | |||
1535 | if (amd_iommu_irq_cache) { | 1544 | if (amd_iommu_irq_cache) { |
1536 | kmem_cache_destroy(amd_iommu_irq_cache); | 1545 | kmem_cache_destroy(amd_iommu_irq_cache); |
1537 | amd_iommu_irq_cache = NULL; | 1546 | amd_iommu_irq_cache = NULL; |
1547 | |||
1538 | } | 1548 | } |
1539 | 1549 | ||
1540 | amd_iommu_uninit_devices(); | 1550 | amd_iommu_uninit_devices(); |
@@ -1687,6 +1697,12 @@ static int __init early_amd_iommu_init(void) | |||
1687 | 0, NULL); | 1697 | 0, NULL); |
1688 | if (!amd_iommu_irq_cache) | 1698 | if (!amd_iommu_irq_cache) |
1689 | goto out; | 1699 | goto out; |
1700 | |||
1701 | irq_lookup_table = (void *)__get_free_pages( | ||
1702 | GFP_KERNEL | __GFP_ZERO, | ||
1703 | get_order(rlookup_table_size)); | ||
1704 | if (!irq_lookup_table) | ||
1705 | goto out; | ||
1690 | } | 1706 | } |
1691 | 1707 | ||
1692 | ret = init_memory_definitions(ivrs_base); | 1708 | ret = init_memory_definitions(ivrs_base); |