diff options
Diffstat (limited to 'arch/x86/kernel/irqinit_64.c')
| -rw-r--r-- | arch/x86/kernel/irqinit_64.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/arch/x86/kernel/irqinit_64.c b/arch/x86/kernel/irqinit_64.c index 1f26fd9ec4f4..5b5be9d43c2a 100644 --- a/arch/x86/kernel/irqinit_64.c +++ b/arch/x86/kernel/irqinit_64.c | |||
| @@ -135,7 +135,7 @@ DEFINE_PER_CPU(vector_irq_t, vector_irq) = { | |||
| 135 | [IRQ15_VECTOR + 1 ... NR_VECTORS - 1] = -1 | 135 | [IRQ15_VECTOR + 1 ... NR_VECTORS - 1] = -1 |
| 136 | }; | 136 | }; |
| 137 | 137 | ||
| 138 | static void __init init_ISA_irqs (void) | 138 | void __init init_ISA_irqs(void) |
| 139 | { | 139 | { |
| 140 | int i; | 140 | int i; |
| 141 | 141 | ||
| @@ -164,22 +164,8 @@ static void __init init_ISA_irqs (void) | |||
| 164 | 164 | ||
| 165 | void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ"))); | 165 | void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ"))); |
| 166 | 166 | ||
| 167 | void __init native_init_IRQ(void) | 167 | static void __init smp_intr_init(void) |
| 168 | { | 168 | { |
| 169 | int i; | ||
| 170 | |||
| 171 | init_ISA_irqs(); | ||
| 172 | /* | ||
| 173 | * Cover the whole vector space, no vector can escape | ||
| 174 | * us. (some of these will be overridden and become | ||
| 175 | * 'special' SMP interrupts) | ||
| 176 | */ | ||
| 177 | for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) { | ||
| 178 | int vector = FIRST_EXTERNAL_VECTOR + i; | ||
| 179 | if (vector != IA32_SYSCALL_VECTOR) | ||
| 180 | set_intr_gate(vector, interrupt[i]); | ||
| 181 | } | ||
| 182 | |||
| 183 | #ifdef CONFIG_SMP | 169 | #ifdef CONFIG_SMP |
| 184 | /* | 170 | /* |
| 185 | * The reschedule interrupt is a CPU-to-CPU reschedule-helper | 171 | * The reschedule interrupt is a CPU-to-CPU reschedule-helper |
| @@ -207,6 +193,12 @@ void __init native_init_IRQ(void) | |||
| 207 | /* Low priority IPI to cleanup after moving an irq */ | 193 | /* Low priority IPI to cleanup after moving an irq */ |
| 208 | set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt); | 194 | set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt); |
| 209 | #endif | 195 | #endif |
| 196 | } | ||
| 197 | |||
| 198 | static void __init apic_intr_init(void) | ||
| 199 | { | ||
| 200 | smp_intr_init(); | ||
| 201 | |||
| 210 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); | 202 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); |
| 211 | alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt); | 203 | alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt); |
| 212 | 204 | ||
| @@ -216,6 +208,25 @@ void __init native_init_IRQ(void) | |||
| 216 | /* IPI vectors for APIC spurious and error interrupts */ | 208 | /* IPI vectors for APIC spurious and error interrupts */ |
| 217 | alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); | 209 | alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); |
| 218 | alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); | 210 | alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); |
| 211 | } | ||
| 212 | |||
| 213 | void __init native_init_IRQ(void) | ||
| 214 | { | ||
| 215 | int i; | ||
| 216 | |||
| 217 | init_ISA_irqs(); | ||
| 218 | /* | ||
| 219 | * Cover the whole vector space, no vector can escape | ||
| 220 | * us. (some of these will be overridden and become | ||
| 221 | * 'special' SMP interrupts) | ||
| 222 | */ | ||
| 223 | for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) { | ||
| 224 | int vector = FIRST_EXTERNAL_VECTOR + i; | ||
| 225 | if (vector != IA32_SYSCALL_VECTOR) | ||
| 226 | set_intr_gate(vector, interrupt[i]); | ||
| 227 | } | ||
| 228 | |||
| 229 | apic_intr_init(); | ||
| 219 | 230 | ||
| 220 | if (!acpi_ioapic) | 231 | if (!acpi_ioapic) |
| 221 | setup_irq(2, &irq2); | 232 | setup_irq(2, &irq2); |
