diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2009-08-20 03:59:09 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2009-08-31 03:35:45 -0400 |
commit | 66bcaf0bde100a4b54b82fc6fea6ceee2212ffb4 (patch) | |
tree | 4d9e290bcf8da7e043d12f047b10ea4b6c3f33ff /arch/x86 | |
parent | d9112f43021554ded2ef2b9bea5f88ba4b52abe0 (diff) |
x86: Move irq_init to x86_init_ops
irq_init is overridden by x86_quirks and by paravirts. Unify the whole
mess and make it an unconditional x86_init_ops function which defaults
to the standard function and can be overridden by the early platform
code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/include/asm/irq.h | 1 | ||||
-rw-r--r-- | arch/x86/include/asm/paravirt_types.h | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/setup.h | 3 | ||||
-rw-r--r-- | arch/x86/include/asm/x86_init.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/numaq_32.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/irqinit.c | 12 | ||||
-rw-r--r-- | arch/x86/kernel/paravirt.c | 6 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 17 | ||||
-rw-r--r-- | arch/x86/kernel/visws_quirks.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/x86_init.c | 1 | ||||
-rw-r--r-- | arch/x86/lguest/boot.c | 2 | ||||
-rw-r--r-- | arch/x86/xen/irq.c | 5 |
12 files changed, 11 insertions, 42 deletions
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h index 8fe2782a253..ddda6cbed6f 100644 --- a/arch/x86/include/asm/irq.h +++ b/arch/x86/include/asm/irq.h | |||
@@ -37,7 +37,6 @@ extern void fixup_irqs(void); | |||
37 | #endif | 37 | #endif |
38 | 38 | ||
39 | extern void (*generic_interrupt_extension)(void); | 39 | extern void (*generic_interrupt_extension)(void); |
40 | extern void init_IRQ(void); | ||
41 | extern void native_init_IRQ(void); | 40 | extern void native_init_IRQ(void); |
42 | extern bool handle_irq(unsigned irq, struct pt_regs *regs); | 41 | extern bool handle_irq(unsigned irq, struct pt_regs *regs); |
43 | 42 | ||
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index 6d668968b6b..25922afb634 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h | |||
@@ -201,8 +201,6 @@ struct pv_cpu_ops { | |||
201 | }; | 201 | }; |
202 | 202 | ||
203 | struct pv_irq_ops { | 203 | struct pv_irq_ops { |
204 | void (*init_IRQ)(void); | ||
205 | |||
206 | /* | 204 | /* |
207 | * Get/set interrupt state. save_fl and restore_fl are only | 205 | * Get/set interrupt state. save_fl and restore_fl are only |
208 | * expected to use X86_EFLAGS_IF; all other bits | 206 | * expected to use X86_EFLAGS_IF; all other bits |
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index 66a319709d6..404086f9411 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h | |||
@@ -16,12 +16,9 @@ | |||
16 | struct x86_quirks { | 16 | struct x86_quirks { |
17 | int (*arch_pre_time_init)(void); | 17 | int (*arch_pre_time_init)(void); |
18 | int (*arch_time_init)(void); | 18 | int (*arch_time_init)(void); |
19 | int (*arch_intr_init)(void); | ||
20 | int (*arch_trap_init)(void); | 19 | int (*arch_trap_init)(void); |
21 | }; | 20 | }; |
22 | 21 | ||
23 | extern void x86_quirk_intr_init(void); | ||
24 | |||
25 | extern void x86_quirk_trap_init(void); | 22 | extern void x86_quirk_trap_init(void); |
26 | 23 | ||
27 | extern void x86_quirk_pre_time_init(void); | 24 | extern void x86_quirk_pre_time_init(void); |
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 65e3394c77f..8d7be65ccf7 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h | |||
@@ -47,9 +47,11 @@ struct x86_init_resources { | |||
47 | * struct x86_init_irqs - platform specific interrupt setup | 47 | * struct x86_init_irqs - platform specific interrupt setup |
48 | * @pre_vector_init: init code to run before interrupt vectors | 48 | * @pre_vector_init: init code to run before interrupt vectors |
49 | * are set up. | 49 | * are set up. |
50 | * @intr_init: interrupt init code | ||
50 | */ | 51 | */ |
51 | struct x86_init_irqs { | 52 | struct x86_init_irqs { |
52 | void (*pre_vector_init)(void); | 53 | void (*pre_vector_init)(void); |
54 | void (*intr_init)(void); | ||
53 | }; | 55 | }; |
54 | 56 | ||
55 | /** | 57 | /** |
diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c index ec8b3113716..eafd341e42d 100644 --- a/arch/x86/kernel/apic/numaq_32.c +++ b/arch/x86/kernel/apic/numaq_32.c | |||
@@ -265,7 +265,6 @@ static void __init smp_read_mpc_oem(struct mpc_table *mpc) | |||
265 | static struct x86_quirks numaq_x86_quirks __initdata = { | 265 | static struct x86_quirks numaq_x86_quirks __initdata = { |
266 | .arch_pre_time_init = numaq_pre_time_init, | 266 | .arch_pre_time_init = numaq_pre_time_init, |
267 | .arch_time_init = NULL, | 267 | .arch_time_init = NULL, |
268 | .arch_intr_init = NULL, | ||
269 | .arch_trap_init = NULL, | 268 | .arch_trap_init = NULL, |
270 | }; | 269 | }; |
271 | 270 | ||
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c index acdf088c758..e0142cda239 100644 --- a/arch/x86/kernel/irqinit.c +++ b/arch/x86/kernel/irqinit.c | |||
@@ -140,8 +140,10 @@ void __init init_ISA_irqs(void) | |||
140 | } | 140 | } |
141 | } | 141 | } |
142 | 142 | ||
143 | /* Overridden in paravirt.c */ | 143 | void init_IRQ(void) |
144 | void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ"))); | 144 | { |
145 | x86_init.irqs.intr_init(); | ||
146 | } | ||
145 | 147 | ||
146 | static void __init smp_intr_init(void) | 148 | static void __init smp_intr_init(void) |
147 | { | 149 | { |
@@ -238,12 +240,6 @@ void __init native_init_IRQ(void) | |||
238 | 240 | ||
239 | #ifdef CONFIG_X86_32 | 241 | #ifdef CONFIG_X86_32 |
240 | /* | 242 | /* |
241 | * Call quirks after call gates are initialised (usually add in | ||
242 | * the architecture specific gates): | ||
243 | */ | ||
244 | x86_quirk_intr_init(); | ||
245 | |||
246 | /* | ||
247 | * External FPU? Set up irq13 if so, for | 243 | * External FPU? Set up irq13 if so, for |
248 | * original braindamaged IBM FERR coupling. | 244 | * original braindamaged IBM FERR coupling. |
249 | */ | 245 | */ |
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 532c9a2626c..d76bfbec71a 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
@@ -183,11 +183,6 @@ unsigned paravirt_patch_insns(void *insnbuf, unsigned len, | |||
183 | return insn_len; | 183 | return insn_len; |
184 | } | 184 | } |
185 | 185 | ||
186 | void init_IRQ(void) | ||
187 | { | ||
188 | pv_irq_ops.init_IRQ(); | ||
189 | } | ||
190 | |||
191 | static void native_flush_tlb(void) | 186 | static void native_flush_tlb(void) |
192 | { | 187 | { |
193 | __native_flush_tlb(); | 188 | __native_flush_tlb(); |
@@ -328,7 +323,6 @@ struct pv_time_ops pv_time_ops = { | |||
328 | }; | 323 | }; |
329 | 324 | ||
330 | struct pv_irq_ops pv_irq_ops = { | 325 | struct pv_irq_ops pv_irq_ops = { |
331 | .init_IRQ = native_init_IRQ, | ||
332 | .save_fl = __PV_IS_CALLEE_SAVE(native_save_fl), | 326 | .save_fl = __PV_IS_CALLEE_SAVE(native_save_fl), |
333 | .restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl), | 327 | .restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl), |
334 | .irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable), | 328 | .irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable), |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 54043cb7ba6..d3da0f7333f 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -1021,23 +1021,6 @@ void __init setup_arch(char **cmdline_p) | |||
1021 | #ifdef CONFIG_X86_32 | 1021 | #ifdef CONFIG_X86_32 |
1022 | 1022 | ||
1023 | /** | 1023 | /** |
1024 | * x86_quirk_intr_init - post gate setup interrupt initialisation | ||
1025 | * | ||
1026 | * Description: | ||
1027 | * Fill in any interrupts that may have been left out by the general | ||
1028 | * init_IRQ() routine. interrupts having to do with the machine rather | ||
1029 | * than the devices on the I/O bus (like APIC interrupts in intel MP | ||
1030 | * systems) are started here. | ||
1031 | **/ | ||
1032 | void __init x86_quirk_intr_init(void) | ||
1033 | { | ||
1034 | if (x86_quirks->arch_intr_init) { | ||
1035 | if (x86_quirks->arch_intr_init()) | ||
1036 | return; | ||
1037 | } | ||
1038 | } | ||
1039 | |||
1040 | /** | ||
1041 | * x86_quirk_trap_init - initialise system specific traps | 1024 | * x86_quirk_trap_init - initialise system specific traps |
1042 | * | 1025 | * |
1043 | * Description: | 1026 | * Description: |
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c index 1d6309d70df..a49013716da 100644 --- a/arch/x86/kernel/visws_quirks.c +++ b/arch/x86/kernel/visws_quirks.c | |||
@@ -228,7 +228,6 @@ static int visws_trap_init(void); | |||
228 | 228 | ||
229 | static struct x86_quirks visws_x86_quirks __initdata = { | 229 | static struct x86_quirks visws_x86_quirks __initdata = { |
230 | .arch_time_init = visws_time_init, | 230 | .arch_time_init = visws_time_init, |
231 | .arch_intr_init = NULL, | ||
232 | .arch_trap_init = visws_trap_init, | 231 | .arch_trap_init = visws_trap_init, |
233 | }; | 232 | }; |
234 | 233 | ||
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index f2abe2136da..8cb59332e3b 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c | |||
@@ -39,5 +39,6 @@ struct __initdata x86_init_ops x86_init = { | |||
39 | 39 | ||
40 | .irqs = { | 40 | .irqs = { |
41 | .pre_vector_init = init_ISA_irqs, | 41 | .pre_vector_init = init_ISA_irqs, |
42 | .intr_init = native_init_IRQ, | ||
42 | }, | 43 | }, |
43 | }; | 44 | }; |
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index 11445c176de..1ff986511f1 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
@@ -1262,7 +1262,6 @@ __init void lguest_init(void) | |||
1262 | */ | 1262 | */ |
1263 | 1263 | ||
1264 | /* Interrupt-related operations */ | 1264 | /* Interrupt-related operations */ |
1265 | pv_irq_ops.init_IRQ = lguest_init_IRQ; | ||
1266 | pv_irq_ops.save_fl = PV_CALLEE_SAVE(save_fl); | 1265 | pv_irq_ops.save_fl = PV_CALLEE_SAVE(save_fl); |
1267 | pv_irq_ops.restore_fl = __PV_IS_CALLEE_SAVE(lg_restore_fl); | 1266 | pv_irq_ops.restore_fl = __PV_IS_CALLEE_SAVE(lg_restore_fl); |
1268 | pv_irq_ops.irq_disable = PV_CALLEE_SAVE(irq_disable); | 1267 | pv_irq_ops.irq_disable = PV_CALLEE_SAVE(irq_disable); |
@@ -1325,6 +1324,7 @@ __init void lguest_init(void) | |||
1325 | pv_time_ops.get_tsc_khz = lguest_tsc_khz; | 1324 | pv_time_ops.get_tsc_khz = lguest_tsc_khz; |
1326 | 1325 | ||
1327 | x86_init.resources.memory_setup = lguest_memory_setup; | 1326 | x86_init.resources.memory_setup = lguest_memory_setup; |
1327 | x86_init.irqs.intr_init = lguest_init_IRQ; | ||
1328 | 1328 | ||
1329 | /* | 1329 | /* |
1330 | * Now is a good time to look at the implementations of these functions | 1330 | * Now is a good time to look at the implementations of these functions |
diff --git a/arch/x86/xen/irq.c b/arch/x86/xen/irq.c index cfd17799bd6..9d30105a0c4 100644 --- a/arch/x86/xen/irq.c +++ b/arch/x86/xen/irq.c | |||
@@ -1,5 +1,7 @@ | |||
1 | #include <linux/hardirq.h> | 1 | #include <linux/hardirq.h> |
2 | 2 | ||
3 | #include <asm/x86_init.h> | ||
4 | |||
3 | #include <xen/interface/xen.h> | 5 | #include <xen/interface/xen.h> |
4 | #include <xen/interface/sched.h> | 6 | #include <xen/interface/sched.h> |
5 | #include <xen/interface/vcpu.h> | 7 | #include <xen/interface/vcpu.h> |
@@ -112,8 +114,6 @@ static void xen_halt(void) | |||
112 | } | 114 | } |
113 | 115 | ||
114 | static const struct pv_irq_ops xen_irq_ops __initdata = { | 116 | static const struct pv_irq_ops xen_irq_ops __initdata = { |
115 | .init_IRQ = xen_init_IRQ, | ||
116 | |||
117 | .save_fl = PV_CALLEE_SAVE(xen_save_fl), | 117 | .save_fl = PV_CALLEE_SAVE(xen_save_fl), |
118 | .restore_fl = PV_CALLEE_SAVE(xen_restore_fl), | 118 | .restore_fl = PV_CALLEE_SAVE(xen_restore_fl), |
119 | .irq_disable = PV_CALLEE_SAVE(xen_irq_disable), | 119 | .irq_disable = PV_CALLEE_SAVE(xen_irq_disable), |
@@ -129,4 +129,5 @@ static const struct pv_irq_ops xen_irq_ops __initdata = { | |||
129 | void __init xen_init_irq_ops() | 129 | void __init xen_init_irq_ops() |
130 | { | 130 | { |
131 | pv_irq_ops = xen_irq_ops; | 131 | pv_irq_ops = xen_irq_ops; |
132 | x86_init.irqs.intr_init = xen_init_IRQ; | ||
132 | } | 133 | } |