core/iommu changes for v3.5
Linus,
Please pull the latest core-iommu-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core-iommu-for-linus
HEAD: fefe1ed1398b81e3fadc92d11d91162d343c8836 iommu: Fix off by one in dmar_get_fault_reason()
The IOMMU changes in this cycle are mostly about factoring out Intel-VT-d specific IRQ remapping details and introducing struct irq_remap_ops, in preparation for AMD specific hardware.
Thanks,
Ingo
------------------>
Dan Carpenter (1):
iommu: Fix off by one in dmar_get_fault_reason()
Joerg Roedel (8):
iommu: Rename intr_remapping files to intel_intr_remapping iommu/vt-d: Make intr-remapping initialization generic iommu/vt-d: Convert missing apic.c intr-remapping call to remap_ops iommu/vt-d: Convert IR ioapic-setup to use remap_ops iommu/vt-d: Convert IR set_affinity function to remap_ops iommu/vt-d: Convert free_irte into a remap_ops callback iommu/vt-d: Convert MSI remapping setup to remap_ops x86, iommu/vt-d: Clean up interfaces for interrupt remapping
Suresh Siddha (5):
iommu: rename intr_remapping references to irq_remapping
iommu: rename intr_remapping.[ch] to irq_remapping.[ch]
irq_remap: Fix compiler warning with CONFIG_IRQ_REMAP=y
irq_remap: Fix UP build failure
irq_remap: Fix the 'sub_handle' uninitialized warning
arch/ia64/include/asm/irq_remapping.h | 4 +
arch/x86/include/asm/irq_remapping.h | 118 +++++--
arch/x86/kernel/apic/apic.c | 30 +-
arch/x86/kernel/apic/io_apic.c | 297 ++++-------------
drivers/iommu/Makefile | 2 +-
drivers/iommu/dmar.c | 11 +-
drivers/iommu/intel-iommu.c | 3 +-
.../{intr_remapping.c => intel_irq_remapping.c} | 359 ++++++++++++++++----
drivers/iommu/intr_remapping.h | 17 -
drivers/iommu/irq_remapping.c | 166 +++++++++
drivers/iommu/irq_remapping.h | 90 +++++
include/linux/dmar.h | 85 -----
12 files changed, 731 insertions(+), 451 deletions(-)
create mode 100644 arch/ia64/include/asm/irq_remapping.h
rename drivers/iommu/{intr_remapping.c => intel_irq_remapping.c} (66%)
delete mode 100644 drivers/iommu/intr_remapping.h
create mode 100644 drivers/iommu/irq_remapping.c
create mode 100644 drivers/iommu/irq_remapping.harch/ia64/include/asm/irq_remapping.h new file +4 -0
@@ -0,0 +1,4 @@ +#ifndef __IA64_INTR_REMAPPING_H +#define __IA64_INTR_REMAPPING_H +#define irq_remapping_enabled 0 +#endif
arch/x86/include/asm/irq_remapping.h +87 -31
132 lines not on this page · raw message
arch/x86/kernel/apic/apic.c +17 -13
@@ -35,6 +35,7 @@#include <linux/smp.h> #include <linux/mm.h> +#include <asm/irq_remapping.h> #include <asm/perf_event.h> #include <asm/x86_init.h> #include <asm/pgalloc.h>
@@ -1441,8 +1442,8 @@ void __init bsp_end_local_APIC_setup(void)* Now that local APIC setup is completed for BP, configure the fault * handling for interrupt remapping. */ -if (intr_remapping_enabled) -enable_drhd_fault_handling (); +if (irq_remapping_enabled) +irq_remap_enable_fault_handling (); }
@@ -1517,7 +1518,7 @@ void enable_x2apic(void)int __init enable_IR (void ) {#ifdef CONFIG_IRQ_REMAP -if (!intr_remapping_supported ()) { +if (!irq_remapping_supported ()) {pr_debug ("intr-remapping not supported\n" );return -1 ; }
@@ -1528,7 +1529,7 @@ int __init enable_IR(void) return -1; } -return enable_intr_remapping (); +return irq_remapping_enable ();#endif return -1 ; }
@@ -1537,10 +1538,13 @@ void __init enable_IR_x2apic(void) {unsigned long flags;int ret, x2apic_enabled =0 ; -int dmar_table_init_ret; +int hardware_init_ret; - dmar_table_init_ret =dmar_table_init (); -if (dmar_table_init_ret && !x2apic_supported ()) +/* Make sure irq_remap_ops are initialized */ +setup_irq_remapping_ops (); + + hardware_init_ret =irq_remapping_prepare (); +if (hardware_init_ret && !x2apic_supported ())return ; ret =save_ioapic_entries ();
@@ -1556,7 +1560,7 @@ void __init enable_IR_x2apic(void)if (x2apic_preenabled && nox2apic)disable_x2apic (); -if (dmar_table_init_ret) +if (hardware_init_ret) ret =-1 ;else ret =enable_IR ();
@@ -2176,8 +2180,8 @@ static int lapic_suspend(void)local_irq_save (flags);disable_local_APIC (); -if (intr_remapping_enabled) -disable_intr_remapping (); +if (irq_remapping_enabled) +irq_remapping_disable ();local_irq_restore (flags);return 0 ;
@@ -2193,7 +2197,7 @@ static void lapic_resume(void)return ;local_irq_save (flags); -if (intr_remapping_enabled) { +if (irq_remapping_enabled) {/* * IO-APIC and PIC have their own resume routines. * We just mask them here to make sure the interrupt
@@ -2245,8 +2249,8 @@ static void lapic_resume(void)apic_write (APIC_ESR ,0 );apic_read (APIC_ESR ); -if (intr_remapping_enabled) -reenable_intr_remapping (x2apic_mode); +if (irq_remapping_enabled) +irq_remapping_reenable (x2apic_mode);local_irq_restore (flags); }
arch/x86/kernel/apic/io_apic.c +61 -236
425 lines not on this page · raw message
drivers/iommu/Makefile +1 -1
@@ -4,7 +4,7 @@ obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o obj-$(CONFIG_AMD_IOMMU_V2) += amd_iommu_v2.o obj-$(CONFIG_DMAR_TABLE) += dmar.o obj-$(CONFIG_INTEL_IOMMU) += iova.o intel-iommu.o -obj-$(CONFIG_IRQ_REMAP) += intr_remapping.o +obj-$(CONFIG_IRQ_REMAP) += intel_irq_remapping.o irq_remapping.o obj-$(CONFIG_OMAP_IOMMU) += omap-iommu.o obj-$(CONFIG_OMAP_IOVMM) += omap-iovmm.o obj-$(CONFIG_OMAP_IOMMU_DEBUG) += omap-iommu-debug.o
drivers/iommu/dmar.c +6 -5
@@ -36,6 +36,7 @@#include <linux/tboot.h> #include <linux/dmi.h> #include <linux/slab.h> +#include <asm/irq_remapping.h> #include <asm/iommu_table.h> #define PREFIX "DMAR: "
@@ -555,7 +556,7 @@ int __init detect_intel_iommu(void) dmar = (struct acpi_table_dmar *) dmar_tbl; -if (ret && intr_remapping_enabled && cpu_has_x2apic && +if (ret && irq_remapping_enabled && cpu_has_x2apic && dmar->flags &0x1 )printk (KERN_INFO "Queued invalidation will be enabled to support x2apic and Intr-remapping.\n" );
@@ -1041,7 +1042,7 @@ static const char *dma_remap_fault_reasons[] = "non-zero reserved fields in PTE", }; -static const char *intr_remap_fault_reasons[] = +static const char *irq_remap_fault_reasons[] = {"Detected reserved fields in the decoded interrupt-remapped request" ,"Interrupt index exceeded the interrupt-remapping table size" ,
@@ -1056,10 +1057,10 @@ static const char *intr_remap_fault_reasons[] =const char *dmar_get_fault_reason (u8 fault_reason,int *fault_type) { -if (fault_reason >=0x20 && (fault_reason <=0x20 + -ARRAY_SIZE (intr_remap_fault_reasons))) { +if (fault_reason >=0x20 && (fault_reason -0x20 < +ARRAY_SIZE (irq_remap_fault_reasons))) { *fault_type =INTR_REMAP ; -return intr_remap_fault_reasons[fault_reason -0x20 ]; +return irq_remap_fault_reasons[fault_reason -0x20 ]; }else if (fault_reason <ARRAY_SIZE (dma_remap_fault_reasons)) { *fault_type =DMA_REMAP ;return dma_remap_fault_reasons[fault_reason];
drivers/iommu/intel-iommu.c +2 -1
@@ -42,6 +42,7 @@#include <linux/dmi.h> #include <linux/pci-ats.h> #include <linux/memblock.h> +#include <asm/irq_remapping.h> #include <asm/cacheflush.h> #include <asm/iommu.h>
@@ -4082,7 +4083,7 @@ static int intel_iommu_domain_has_cap(struct iommu_domain *domain,if (cap ==IOMMU_CAP_CACHE_COHERENCY )return dmar_domain->iommu_snooping;if (cap ==IOMMU_CAP_INTR_REMAP ) -return intr_remapping_enabled; +return irq_remapping_enabled;return 0 ; }
drivers/iommu/intel_irq_remapping.c renamed from drivers/iommu/intr_remapping.c +297 -62
525 lines not on this page · raw message
drivers/iommu/intr_remapping.h deleted +0 -17
@@ -1,17 +0,0 @@ -#include <linux/intel-iommu.h> - -struct ioapic_scope { -struct intel_iommu *iommu; -unsigned int id; -unsigned int bus;/* PCI bus number */ -unsigned int devfn;/* PCI devfn number */ -}; - -struct hpet_scope { -struct intel_iommu *iommu; -u8 id; -unsigned int bus; -unsigned int devfn; -}; - -#define IR_X2APIC_MODE (mode) (mode ? (1 << 11) : 0)
drivers/iommu/irq_remapping.c new file +166 -0
166 lines not on this page · raw message
drivers/iommu/irq_remapping.h new file +90 -0
90 lines not on this page · raw message
include/linux/dmar.h +0 -85
91 lines not on this page · raw message