diff options
author | Matthew McClintock <msm@freescale.com> | 2010-09-16 18:58:23 -0400 |
---|---|---|
committer | Kumar Gala <galak@kernel.crashing.org> | 2010-10-14 01:52:46 -0400 |
commit | c71635d288ffd3bcdfb30308f681f9af34f0fc81 (patch) | |
tree | f3bbfcb3c81b85bf3dc228a7685d093a5ac2760d /arch/powerpc | |
parent | fbdd7144ceadd578bc2a875af1dabd67e80ba0d0 (diff) |
powerpc/kexec: make masking/disabling interrupts generic
Right now just the kexec crash pathway turns turns off the interrupts.
Pull that out and make a generic version for use elsewhere
Signed-off-by: Matthew McClintock <msm@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/include/asm/kexec.h | 1 | ||||
-rw-r--r-- | arch/powerpc/kernel/crash.c | 13 | ||||
-rw-r--r-- | arch/powerpc/kernel/machine_kexec.c | 24 | ||||
-rw-r--r-- | arch/powerpc/kernel/machine_kexec_32.c | 4 |
4 files changed, 30 insertions, 12 deletions
diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h index 076327f2eff7..f54408d995b5 100644 --- a/arch/powerpc/include/asm/kexec.h +++ b/arch/powerpc/include/asm/kexec.h | |||
@@ -91,6 +91,7 @@ extern void machine_kexec_simple(struct kimage *image); | |||
91 | extern void crash_kexec_secondary(struct pt_regs *regs); | 91 | extern void crash_kexec_secondary(struct pt_regs *regs); |
92 | extern int overlaps_crashkernel(unsigned long start, unsigned long size); | 92 | extern int overlaps_crashkernel(unsigned long start, unsigned long size); |
93 | extern void reserve_crashkernel(void); | 93 | extern void reserve_crashkernel(void); |
94 | extern void machine_kexec_mask_interrupts(void); | ||
94 | 95 | ||
95 | #else /* !CONFIG_KEXEC */ | 96 | #else /* !CONFIG_KEXEC */ |
96 | static inline int kexec_sr_activated(int cpu) { return 0; } | 97 | static inline int kexec_sr_activated(int cpu) { return 0; } |
diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c index 4457382f8667..832c8c4db254 100644 --- a/arch/powerpc/kernel/crash.c +++ b/arch/powerpc/kernel/crash.c | |||
@@ -414,18 +414,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs) | |||
414 | crash_kexec_wait_realmode(crashing_cpu); | 414 | crash_kexec_wait_realmode(crashing_cpu); |
415 | #endif | 415 | #endif |
416 | 416 | ||
417 | for_each_irq(i) { | 417 | machine_kexec_mask_interrupts(); |
418 | struct irq_desc *desc = irq_to_desc(i); | ||
419 | |||
420 | if (!desc || !desc->chip || !desc->chip->eoi) | ||
421 | continue; | ||
422 | |||
423 | if (desc->status & IRQ_INPROGRESS) | ||
424 | desc->chip->eoi(i); | ||
425 | |||
426 | if (!(desc->status & IRQ_DISABLED)) | ||
427 | desc->chip->shutdown(i); | ||
428 | } | ||
429 | 418 | ||
430 | /* | 419 | /* |
431 | * Call registered shutdown routines savely. Swap out | 420 | * Call registered shutdown routines savely. Swap out |
diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index dd6c141f1662..df7e20c191cd 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c | |||
@@ -14,10 +14,34 @@ | |||
14 | #include <linux/threads.h> | 14 | #include <linux/threads.h> |
15 | #include <linux/memblock.h> | 15 | #include <linux/memblock.h> |
16 | #include <linux/of.h> | 16 | #include <linux/of.h> |
17 | #include <linux/irq.h> | ||
18 | |||
17 | #include <asm/machdep.h> | 19 | #include <asm/machdep.h> |
18 | #include <asm/prom.h> | 20 | #include <asm/prom.h> |
19 | #include <asm/sections.h> | 21 | #include <asm/sections.h> |
20 | 22 | ||
23 | void machine_kexec_mask_interrupts(void) { | ||
24 | unsigned int i; | ||
25 | |||
26 | for_each_irq(i) { | ||
27 | struct irq_desc *desc = irq_to_desc(i); | ||
28 | |||
29 | if (!desc || !desc->chip) | ||
30 | continue; | ||
31 | |||
32 | if (desc->chip->eoi && | ||
33 | desc->status & IRQ_INPROGRESS) | ||
34 | desc->chip->eoi(i); | ||
35 | |||
36 | if (desc->chip->mask) | ||
37 | desc->chip->mask(i); | ||
38 | |||
39 | if (desc->chip->disable && | ||
40 | !(desc->status & IRQ_DISABLED)) | ||
41 | desc->chip->disable(i); | ||
42 | } | ||
43 | } | ||
44 | |||
21 | void machine_crash_shutdown(struct pt_regs *regs) | 45 | void machine_crash_shutdown(struct pt_regs *regs) |
22 | { | 46 | { |
23 | if (ppc_md.machine_crash_shutdown) | 47 | if (ppc_md.machine_crash_shutdown) |
diff --git a/arch/powerpc/kernel/machine_kexec_32.c b/arch/powerpc/kernel/machine_kexec_32.c index ae63a964b858..e63f2e7d2efb 100644 --- a/arch/powerpc/kernel/machine_kexec_32.c +++ b/arch/powerpc/kernel/machine_kexec_32.c | |||
@@ -39,6 +39,10 @@ void default_machine_kexec(struct kimage *image) | |||
39 | /* Interrupts aren't acceptable while we reboot */ | 39 | /* Interrupts aren't acceptable while we reboot */ |
40 | local_irq_disable(); | 40 | local_irq_disable(); |
41 | 41 | ||
42 | /* mask each interrupt so we are in a more sane state for the | ||
43 | * kexec kernel */ | ||
44 | machine_kexec_mask_interrupts(); | ||
45 | |||
42 | page_list = image->head; | 46 | page_list = image->head; |
43 | 47 | ||
44 | /* we need both effective and real address here */ | 48 | /* we need both effective and real address here */ |