Skip to content

Commit

Permalink
powerpc/85xx: kexec for SMP 85xx BookE systems
Browse files Browse the repository at this point in the history
Adds support for kexec on 85xx machines for the BookE platform.
Including support for SMP machines

Based off work from Maxim Uvarov <muvarov@mvista.com>
Signed-off-by: Matthew McClintock <msm@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
  • Loading branch information
Matthew McClintock authored and Kumar Gala committed Aug 2, 2010
1 parent e8e5c21 commit f933a41
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 5 deletions.
10 changes: 5 additions & 5 deletions arch/powerpc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ config ARCH_ENABLE_MEMORY_HOTREMOVE

config KEXEC
bool "kexec system call (EXPERIMENTAL)"
depends on (PPC_BOOK3S || (FSL_BOOKE && !SMP)) && EXPERIMENTAL
depends on (PPC_BOOK3S || FSL_BOOKE) && EXPERIMENTAL
help
kexec is a system call that implements the ability to shutdown your
current kernel, and to start another kernel. It is like a reboot
Expand All @@ -369,8 +369,8 @@ config KEXEC

config CRASH_DUMP
bool "Build a kdump crash kernel"
depends on PPC64 || 6xx
select RELOCATABLE if PPC64
depends on PPC64 || 6xx || FSL_BOOKE
select RELOCATABLE if PPC64 || FSL_BOOKE
help
Build a kernel suitable for use as a kdump capture kernel.
The same kernel binary can be used as production kernel and dump
Expand Down Expand Up @@ -898,7 +898,7 @@ config KERNEL_START_BOOL
config KERNEL_START
hex "Virtual address of kernel base" if KERNEL_START_BOOL
default PAGE_OFFSET if PAGE_OFFSET_BOOL
default "0xc2000000" if CRASH_DUMP
default "0xc2000000" if CRASH_DUMP && !RELOCATABLE
default "0xc0000000"

config PHYSICAL_START_BOOL
Expand All @@ -911,7 +911,7 @@ config PHYSICAL_START_BOOL

config PHYSICAL_START
hex "Physical address where the kernel is loaded" if PHYSICAL_START_BOOL
default "0x02000000" if PPC_STD_MMU && CRASH_DUMP
default "0x02000000" if PPC_STD_MMU && CRASH_DUMP && !RELOCATABLE
default "0x00000000"

config PHYSICAL_ALIGN
Expand Down
63 changes: 63 additions & 0 deletions arch/powerpc/platforms/85xx/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/kexec.h>

#include <asm/machdep.h>
#include <asm/pgtable.h>
Expand All @@ -24,6 +25,7 @@
#include <asm/dbell.h>

#include <sysdev/fsl_soc.h>
#include <sysdev/mpic.h>

extern void __early_start(void);

Expand Down Expand Up @@ -105,8 +107,64 @@ smp_85xx_setup_cpu(int cpu_nr)

struct smp_ops_t smp_85xx_ops = {
.kick_cpu = smp_85xx_kick_cpu,
#ifdef CONFIG_KEXEC
.give_timebase = smp_generic_give_timebase,
.take_timebase = smp_generic_take_timebase,
#endif
};

#ifdef CONFIG_KEXEC
static int kexec_down_cpus = 0;

void mpc85xx_smp_kexec_cpu_down(int crash_shutdown, int secondary)
{
mpic_teardown_this_cpu(1);

/* When crashing, this gets called on all CPU's we only
* take down the non-boot cpus */
if (smp_processor_id() != boot_cpuid)
{
local_irq_disable();
kexec_down_cpus++;

while (1);
}
}

static void mpc85xx_smp_kexec_down(void *arg)
{
if (ppc_md.kexec_cpu_down)
ppc_md.kexec_cpu_down(0,1);
}

static void mpc85xx_smp_machine_kexec(struct kimage *image)
{
int timeout = 2000;
int i;

set_cpus_allowed(current, cpumask_of_cpu(boot_cpuid));

smp_call_function(mpc85xx_smp_kexec_down, NULL, 0);

while ( (kexec_down_cpus != (num_online_cpus() - 1)) &&
( timeout > 0 ) )
{
timeout--;
}

if ( !timeout )
printk(KERN_ERR "Unable to bring down secondary cpu(s)");

for (i = 0; i < num_present_cpus(); i++)
{
if ( i == smp_processor_id() ) continue;
mpic_reset_core(i);
}

default_machine_kexec(image);
}
#endif /* CONFIG_KEXEC */

void __init mpc85xx_smp_init(void)
{
struct device_node *np;
Expand All @@ -124,4 +182,9 @@ void __init mpc85xx_smp_init(void)
BUG_ON(!smp_85xx_ops.message_pass);

smp_ops = &smp_85xx_ops;

#ifdef CONFIG_KEXEC
ppc_md.kexec_cpu_down = mpc85xx_smp_kexec_cpu_down;
ppc_md.machine_kexec = mpc85xx_smp_machine_kexec;
#endif
}

0 comments on commit f933a41

Please sign in to comment.