diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-10-28 11:54:49 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-10-28 11:54:49 -0400 |
commit | d1a76187a5be4f89c6cb19d800cb5fb7aac735c5 (patch) | |
tree | 2fac3ffbfffc7560eeef8364b541d0d7a0057920 /arch/x86/kernel/irqinit_64.c | |
parent | c7e78cff6b7518212247fb20b1dc6411540dc9af (diff) | |
parent | 0173a3265b228da319ceb9c1ec6a5682fd1b2d92 (diff) |
Merge commit 'v2.6.28-rc2' into core/locking
Conflicts:
arch/um/include/asm/system.h
Diffstat (limited to 'arch/x86/kernel/irqinit_64.c')
-rw-r--r-- | arch/x86/kernel/irqinit_64.c | 69 |
1 files changed, 38 insertions, 31 deletions
diff --git a/arch/x86/kernel/irqinit_64.c b/arch/x86/kernel/irqinit_64.c index 1f26fd9ec4f..ff023539128 100644 --- a/arch/x86/kernel/irqinit_64.c +++ b/arch/x86/kernel/irqinit_64.c | |||
@@ -135,51 +135,33 @@ 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 | ||
142 | init_bsp_APIC(); | 142 | init_bsp_APIC(); |
143 | init_8259A(0); | 143 | init_8259A(0); |
144 | 144 | ||
145 | for (i = 0; i < NR_IRQS; i++) { | 145 | for (i = 0; i < 16; i++) { |
146 | irq_desc[i].status = IRQ_DISABLED; | 146 | /* first time call this irq_desc */ |
147 | irq_desc[i].action = NULL; | 147 | struct irq_desc *desc = irq_to_desc(i); |
148 | irq_desc[i].depth = 1; | ||
149 | 148 | ||
150 | if (i < 16) { | 149 | desc->status = IRQ_DISABLED; |
151 | /* | 150 | desc->action = NULL; |
152 | * 16 old-style INTA-cycle interrupts: | 151 | desc->depth = 1; |
153 | */ | 152 | |
154 | set_irq_chip_and_handler_name(i, &i8259A_chip, | 153 | /* |
154 | * 16 old-style INTA-cycle interrupts: | ||
155 | */ | ||
156 | set_irq_chip_and_handler_name(i, &i8259A_chip, | ||
155 | handle_level_irq, "XT"); | 157 | handle_level_irq, "XT"); |
156 | } else { | ||
157 | /* | ||
158 | * 'high' PCI IRQs filled in on demand | ||
159 | */ | ||
160 | irq_desc[i].chip = &no_irq_chip; | ||
161 | } | ||
162 | } | 158 | } |
163 | } | 159 | } |
164 | 160 | ||
165 | void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ"))); | 161 | void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ"))); |
166 | 162 | ||
167 | void __init native_init_IRQ(void) | 163 | static void __init smp_intr_init(void) |
168 | { | 164 | { |
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 | 165 | #ifdef CONFIG_SMP |
184 | /* | 166 | /* |
185 | * The reschedule interrupt is a CPU-to-CPU reschedule-helper | 167 | * The reschedule interrupt is a CPU-to-CPU reschedule-helper |
@@ -207,6 +189,12 @@ void __init native_init_IRQ(void) | |||
207 | /* Low priority IPI to cleanup after moving an irq */ | 189 | /* Low priority IPI to cleanup after moving an irq */ |
208 | set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt); | 190 | set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt); |
209 | #endif | 191 | #endif |
192 | } | ||
193 | |||
194 | static void __init apic_intr_init(void) | ||
195 | { | ||
196 | smp_intr_init(); | ||
197 | |||
210 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); | 198 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); |
211 | alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt); | 199 | alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt); |
212 | 200 | ||
@@ -216,6 +204,25 @@ void __init native_init_IRQ(void) | |||
216 | /* IPI vectors for APIC spurious and error interrupts */ | 204 | /* IPI vectors for APIC spurious and error interrupts */ |
217 | alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); | 205 | alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); |
218 | alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); | 206 | alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); |
207 | } | ||
208 | |||
209 | void __init native_init_IRQ(void) | ||
210 | { | ||
211 | int i; | ||
212 | |||
213 | init_ISA_irqs(); | ||
214 | /* | ||
215 | * Cover the whole vector space, no vector can escape | ||
216 | * us. (some of these will be overridden and become | ||
217 | * 'special' SMP interrupts) | ||
218 | */ | ||
219 | for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) { | ||
220 | int vector = FIRST_EXTERNAL_VECTOR + i; | ||
221 | if (vector != IA32_SYSCALL_VECTOR) | ||
222 | set_intr_gate(vector, interrupt[i]); | ||
223 | } | ||
224 | |||
225 | apic_intr_init(); | ||
219 | 226 | ||
220 | if (!acpi_ioapic) | 227 | if (!acpi_ioapic) |
221 | setup_irq(2, &irq2); | 228 | setup_irq(2, &irq2); |