Message ID | 1412192304-1209-2-git-send-email-atull@opensource.altera.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed 2014-10-01 14:38:23, atull@opensource.altera.com wrote: > From: Alan Tull <atull@opensource.altera.com> > > Use WFI when putting CPU1 to sleep. Don't hold CPU1 in reset > since that results in increased power consumption. > > Reset CPU1 briefly during CPU1 bootup. > > This has been tested for hotplug and suspend/resume and results > in no increased power consumption. > > Signed-off-by: Alan Tull <atull@opensource.altera.com> It is nice to Cc people who commented ont the patch before. > if (cpu1start_addr) { > + /* This will put CPU #1 into reset. */ > + __raw_writel(RSTMGR_MPUMODRST_CPU1, > + rst_manager_base_addr + SOCFPGA_RSTMGR_MODMPURST); > + I thought conclusion was to use writel (not __raw variant) here?
On Tue, 7 Oct 2014, Pavel Machek wrote: > On Wed 2014-10-01 14:38:23, atull@opensource.altera.com wrote: > > From: Alan Tull <atull@opensource.altera.com> > > > > Use WFI when putting CPU1 to sleep. Don't hold CPU1 in reset > > since that results in increased power consumption. > > > > Reset CPU1 briefly during CPU1 bootup. > > > > This has been tested for hotplug and suspend/resume and results > > in no increased power consumption. > > > > Signed-off-by: Alan Tull <atull@opensource.altera.com> > > It is nice to Cc people who commented ont the patch before. HI Pavel, OK, adding you and others who commented. > > > if (cpu1start_addr) { > > + /* This will put CPU #1 into reset. */ > > + __raw_writel(RSTMGR_MPUMODRST_CPU1, > > + rst_manager_base_addr + SOCFPGA_RSTMGR_MODMPURST); > > + > > I thought conclusion was to use writel (not __raw variant) here? Yes it was. Fixed in v3, soon. Alan > > -- > (english) http://www.livejournal.com/~pavelmachek > (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ >
diff --git a/arch/arm/mach-socfpga/core.h b/arch/arm/mach-socfpga/core.h index 572b8f7..953a9c0 100644 --- a/arch/arm/mach-socfpga/core.h +++ b/arch/arm/mach-socfpga/core.h @@ -21,6 +21,7 @@ #define __MACH_CORE_H #define SOCFPGA_RSTMGR_CTRL 0x04 +#define SOCFPGA_RSTMGR_MODMPURST 0x10 #define SOCFPGA_RSTMGR_MODPERRST 0x14 #define SOCFPGA_RSTMGR_BRGMODRST 0x1c @@ -28,6 +29,8 @@ #define RSTMGR_CTRL_SWCOLDRSTREQ 0x1 /* Cold Reset */ #define RSTMGR_CTRL_SWWARMRSTREQ 0x2 /* Warm Reset */ +#define RSTMGR_MPUMODRST_CPU1 0x2 /* CPU1 Reset */ + extern void socfpga_secondary_startup(void); extern void __iomem *socfpga_scu_base_addr; diff --git a/arch/arm/mach-socfpga/platsmp.c b/arch/arm/mach-socfpga/platsmp.c index 5356a72..97907dd 100644 --- a/arch/arm/mach-socfpga/platsmp.c +++ b/arch/arm/mach-socfpga/platsmp.c @@ -34,6 +34,10 @@ static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle) int trampoline_size = &secondary_trampoline_end - &secondary_trampoline; if (cpu1start_addr) { + /* This will put CPU #1 into reset. */ + __raw_writel(RSTMGR_MPUMODRST_CPU1, + rst_manager_base_addr + SOCFPGA_RSTMGR_MODMPURST); + memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size); __raw_writel(virt_to_phys(socfpga_secondary_startup), @@ -43,8 +47,9 @@ static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle) smp_wmb(); outer_clean_range(0, trampoline_size); - /* This will release CPU #1 out of reset.*/ - __raw_writel(0, rst_manager_base_addr + 0x10); + /* This will release CPU #1 out of reset. */ + __raw_writel(0, + rst_manager_base_addr + SOCFPGA_RSTMGR_MODMPURST); } return 0; @@ -86,10 +91,9 @@ static void __init socfpga_smp_prepare_cpus(unsigned int max_cpus) */ static void socfpga_cpu_die(unsigned int cpu) { - cpu_do_idle(); - - /* We should have never returned from idle */ - panic("cpu %d unexpectedly exit from shutdown\n", cpu); + /* Do WFI. If we wake up early, go back into WFI */ + while (1) + cpu_do_idle(); } struct smp_operations socfpga_smp_ops __initdata = {