diff options
Diffstat (limited to 'arch/x86/kernel/irqinit_32.c')
| -rw-r--r-- | arch/x86/kernel/irqinit_32.c | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/arch/x86/kernel/irqinit_32.c b/arch/x86/kernel/irqinit_32.c index 10a09c2f1828..bc1326105448 100644 --- a/arch/x86/kernel/irqinit_32.c +++ b/arch/x86/kernel/irqinit_32.c | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | #include <asm/pgtable.h> | 18 | #include <asm/pgtable.h> |
| 19 | #include <asm/desc.h> | 19 | #include <asm/desc.h> |
| 20 | #include <asm/apic.h> | 20 | #include <asm/apic.h> |
| 21 | #include <asm/arch_hooks.h> | 21 | #include <asm/setup.h> |
| 22 | #include <asm/i8259.h> | 22 | #include <asm/i8259.h> |
| 23 | #include <asm/traps.h> | 23 | #include <asm/traps.h> |
| 24 | 24 | ||
| @@ -78,6 +78,15 @@ void __init init_ISA_irqs(void) | |||
| 78 | } | 78 | } |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | /* | ||
| 82 | * IRQ2 is cascade interrupt to second interrupt controller | ||
| 83 | */ | ||
| 84 | static struct irqaction irq2 = { | ||
| 85 | .handler = no_action, | ||
| 86 | .mask = CPU_MASK_NONE, | ||
| 87 | .name = "cascade", | ||
| 88 | }; | ||
| 89 | |||
| 81 | DEFINE_PER_CPU(vector_irq_t, vector_irq) = { | 90 | DEFINE_PER_CPU(vector_irq_t, vector_irq) = { |
| 82 | [0 ... IRQ0_VECTOR - 1] = -1, | 91 | [0 ... IRQ0_VECTOR - 1] = -1, |
| 83 | [IRQ0_VECTOR] = 0, | 92 | [IRQ0_VECTOR] = 0, |
| @@ -118,8 +127,8 @@ void __init native_init_IRQ(void) | |||
| 118 | { | 127 | { |
| 119 | int i; | 128 | int i; |
| 120 | 129 | ||
| 121 | /* all the set up before the call gates are initialised */ | 130 | /* Execute any quirks before the call gates are initialised: */ |
| 122 | pre_intr_init_hook(); | 131 | x86_quirk_pre_intr_init(); |
| 123 | 132 | ||
| 124 | /* | 133 | /* |
| 125 | * Cover the whole vector space, no vector can escape | 134 | * Cover the whole vector space, no vector can escape |
| @@ -140,8 +149,15 @@ void __init native_init_IRQ(void) | |||
| 140 | */ | 149 | */ |
| 141 | alloc_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt); | 150 | alloc_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt); |
| 142 | 151 | ||
| 143 | /* IPI for invalidation */ | 152 | /* IPIs for invalidation */ |
| 144 | alloc_intr_gate(INVALIDATE_TLB_VECTOR, invalidate_interrupt); | 153 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+0, invalidate_interrupt0); |
| 154 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+1, invalidate_interrupt1); | ||
| 155 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+2, invalidate_interrupt2); | ||
| 156 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+3, invalidate_interrupt3); | ||
| 157 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+4, invalidate_interrupt4); | ||
| 158 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+5, invalidate_interrupt5); | ||
| 159 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+6, invalidate_interrupt6); | ||
| 160 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+7, invalidate_interrupt7); | ||
| 145 | 161 | ||
| 146 | /* IPI for generic function call */ | 162 | /* IPI for generic function call */ |
| 147 | alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); | 163 | alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); |
| @@ -159,6 +175,9 @@ void __init native_init_IRQ(void) | |||
| 159 | /* self generated IPI for local APIC timer */ | 175 | /* self generated IPI for local APIC timer */ |
| 160 | alloc_intr_gate(LOCAL_TIMER_VECTOR, apic_timer_interrupt); | 176 | alloc_intr_gate(LOCAL_TIMER_VECTOR, apic_timer_interrupt); |
| 161 | 177 | ||
| 178 | /* generic IPI for platform specific use */ | ||
| 179 | alloc_intr_gate(GENERIC_INTERRUPT_VECTOR, generic_interrupt); | ||
| 180 | |||
| 162 | /* IPI vectors for APIC spurious and error interrupts */ | 181 | /* IPI vectors for APIC spurious and error interrupts */ |
| 163 | alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); | 182 | alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); |
| 164 | alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); | 183 | alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); |
| @@ -169,10 +188,14 @@ void __init native_init_IRQ(void) | |||
| 169 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); | 188 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); |
| 170 | #endif | 189 | #endif |
| 171 | 190 | ||
| 172 | /* setup after call gates are initialised (usually add in | 191 | if (!acpi_ioapic) |
| 173 | * the architecture specific gates) | 192 | setup_irq(2, &irq2); |
| 193 | |||
| 194 | /* | ||
| 195 | * Call quirks after call gates are initialised (usually add in | ||
| 196 | * the architecture specific gates): | ||
| 174 | */ | 197 | */ |
| 175 | intr_init_hook(); | 198 | x86_quirk_intr_init(); |
| 176 | 199 | ||
| 177 | /* | 200 | /* |
| 178 | * External FPU? Set up irq13 if so, for | 201 | * External FPU? Set up irq13 if so, for |
