diff options
| author | Joerg Roedel <joerg.roedel@amd.com> | 2012-06-15 18:05:20 +0200 | 
|---|---|---|
| committer | Joerg Roedel <joerg.roedel@amd.com> | 2012-09-28 17:30:04 +0200 | 
| commit | 0ea2c422bc8da99d14baa46d4789861a4f8d4ec0 (patch) | |
| tree | da722904779083287e209324b77d9b80235d2348 | |
| parent | 05152a0494449f60031da683e6d4cd60d0882214 (diff) | |
| download | olio-linux-3.10-0ea2c422bc8da99d14baa46d4789861a4f8d4ec0.tar.xz olio-linux-3.10-0ea2c422bc8da99d14baa46d4789861a4f8d4ec0.zip  | |
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>
| -rw-r--r-- | drivers/iommu/amd_iommu_init.c | 16 | ||||
| -rw-r--r-- | drivers/iommu/amd_iommu_types.h | 9 | 
2 files changed, 25 insertions, 0 deletions
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 073ed5d1e05..2d923fe7c2a 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -184,6 +184,12 @@ u16 *amd_iommu_alias_table;  struct amd_iommu **amd_iommu_rlookup_table;  /* + * This table is used to find the irq remapping table for a given device id + * quickly. + */ +struct irq_remap_table **irq_lookup_table; + +/*   * AMD IOMMU allows up to 2^16 differend protection domains. This is a bitmap   * to know which ones are already in use.   */ @@ -1532,9 +1538,13 @@ static struct syscore_ops amd_iommu_syscore_ops = {  static void __init free_on_init_error(void)  { +	free_pages((unsigned long)irq_lookup_table, +		   get_order(rlookup_table_size)); +  	if (amd_iommu_irq_cache) {  		kmem_cache_destroy(amd_iommu_irq_cache);  		amd_iommu_irq_cache = NULL; +  	}  	amd_iommu_uninit_devices(); @@ -1687,6 +1697,12 @@ static int __init early_amd_iommu_init(void)  				0, NULL);  		if (!amd_iommu_irq_cache)  			goto out; + +		irq_lookup_table = (void *)__get_free_pages( +				GFP_KERNEL | __GFP_ZERO, +				get_order(rlookup_table_size)); +		if (!irq_lookup_table) +			goto out;  	}  	ret = init_memory_definitions(ivrs_base); diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h index 953cea80daa..1a7d48078d3 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h @@ -175,6 +175,7 @@  #define DEV_ENTRY_EX            0x67  #define DEV_ENTRY_SYSMGT1       0x68  #define DEV_ENTRY_SYSMGT2       0x69 +#define DEV_ENTRY_IRQ_TBL_EN	0x80  #define DEV_ENTRY_INIT_PASS     0xb8  #define DEV_ENTRY_EINT_PASS     0xb9  #define DEV_ENTRY_NMI_PASS      0xba @@ -337,6 +338,14 @@ extern bool amd_iommu_iotlb_sup;  #define MAX_IRQS_PER_TABLE	256  #define IRQ_TABLE_ALIGNMENT	128 +struct irq_remap_table { +	spinlock_t lock; +	unsigned min_index; +	u32 *table; +}; + +extern struct irq_remap_table **irq_lookup_table; +  /* Interrupt remapping feature used? */  extern bool amd_iommu_irq_remap;  |