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 | |
| 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>
| -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 8fe2782a2537..ddda6cbed6f4 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 6d668968b6b8..25922afb6347 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 66a319709d66..404086f9411c 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 65e3394c77fd..8d7be65ccf7f 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 ec8b3113716d..eafd341e42dd 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 acdf088c7583..e0142cda2394 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 532c9a2626c7..d76bfbec71ae 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 54043cb7ba68..d3da0f7333f7 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 1d6309d70dfa..a49013716da9 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 f2abe2136da1..8cb59332e3b4 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 11445c176de6..1ff986511f1d 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 cfd17799bd6d..9d30105a0c4a 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 | } |
