diff options
| author | Matthew McClintock <msm@freescale.com> | 2010-09-16 17:58:23 -0500 | 
|---|---|---|
| committer | Kumar Gala <galak@kernel.crashing.org> | 2010-10-14 00:52:46 -0500 | 
| commit | c71635d288ffd3bcdfb30308f681f9af34f0fc81 (patch) | |
| tree | f3bbfcb3c81b85bf3dc228a7685d093a5ac2760d /arch/powerpc/kernel | |
| parent | fbdd7144ceadd578bc2a875af1dabd67e80ba0d0 (diff) | |
| download | olio-linux-3.10-c71635d288ffd3bcdfb30308f681f9af34f0fc81.tar.xz olio-linux-3.10-c71635d288ffd3bcdfb30308f681f9af34f0fc81.zip  | |
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/kernel')
| -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 | 
3 files changed, 29 insertions, 12 deletions
diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c index 4457382f866..832c8c4db25 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)  	crash_kexec_wait_realmode(crashing_cpu);  #endif -	for_each_irq(i) { -		struct irq_desc *desc = irq_to_desc(i); - -		if (!desc || !desc->chip || !desc->chip->eoi) -			continue; - -		if (desc->status & IRQ_INPROGRESS) -			desc->chip->eoi(i); - -		if (!(desc->status & IRQ_DISABLED)) -			desc->chip->shutdown(i); -	} +	machine_kexec_mask_interrupts();  	/*  	 * Call registered shutdown routines savely.  Swap out diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index dd6c141f166..df7e20c191c 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c @@ -14,10 +14,34 @@  #include <linux/threads.h>  #include <linux/memblock.h>  #include <linux/of.h> +#include <linux/irq.h> +  #include <asm/machdep.h>  #include <asm/prom.h>  #include <asm/sections.h> +void machine_kexec_mask_interrupts(void) { +	unsigned int i; + +	for_each_irq(i) { +		struct irq_desc *desc = irq_to_desc(i); + +		if (!desc || !desc->chip) +			continue; + +		if (desc->chip->eoi && +		    desc->status & IRQ_INPROGRESS) +			desc->chip->eoi(i); + +		if (desc->chip->mask) +			desc->chip->mask(i); + +		if (desc->chip->disable && +		    !(desc->status & IRQ_DISABLED)) +			desc->chip->disable(i); +	} +} +  void machine_crash_shutdown(struct pt_regs *regs)  {  	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 ae63a964b85..e63f2e7d2ef 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)  	/* Interrupts aren't acceptable while we reboot */  	local_irq_disable(); +	/* mask each interrupt so we are in a more sane state for the +	 * kexec kernel */ +	machine_kexec_mask_interrupts(); +  	page_list = image->head;  	/* we need both effective and real address here */  |