Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c71635d2 authored by Matthew McClintock's avatar Matthew McClintock Committed by Kumar Gala
Browse files

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: default avatarMatthew McClintock <msm@freescale.com>
Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
parent fbdd7144
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ extern void machine_kexec_simple(struct kimage *image);
extern void crash_kexec_secondary(struct pt_regs *regs);
extern int overlaps_crashkernel(unsigned long start, unsigned long size);
extern void reserve_crashkernel(void);
extern void machine_kexec_mask_interrupts(void);

#else /* !CONFIG_KEXEC */
static inline int kexec_sr_activated(int cpu) { return 0; }
+1 −12
Original line number Diff line number Diff line
@@ -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
+24 −0
Original line number Diff line number Diff line
@@ -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)
+4 −0
Original line number Diff line number Diff line
@@ -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 */