Revert "ARM: cpu hotplug: remove majority of cache flushing from platforms"
Dan Willemsen [Tue, 20 Aug 2013 04:36:12 +0000 (21:36 -0700)]
This reverts commit bca7a5a04933700a8bde4ea5798119607a8b0436.

Signed-off-by: Dan Willemsen <dwillemsen@nvidia.com>

arch/arm/mach-exynos/hotplug.c
arch/arm/mach-highbank/hotplug.c
arch/arm/mach-msm/hotplug.c
arch/arm/mach-omap2/omap-hotplug.c
arch/arm/mach-prima2/hotplug.c
arch/arm/mach-realview/hotplug.c
arch/arm/mach-shmobile/smp-sh73a0.c
arch/arm/mach-spear/hotplug.c
arch/arm/mach-tegra/hotplug.c
arch/arm/mach-ux500/hotplug.c
arch/arm/mach-vexpress/hotplug.c

index af90cfa..c3f825b 100644 (file)
@@ -28,6 +28,7 @@ static inline void cpu_enter_lowpower_a9(void)
 {
        unsigned int v;
 
+       flush_cache_all();
        asm volatile(
        "       mcr     p15, 0, %1, c7, c5, 0\n"
        "       mcr     p15, 0, %1, c7, c10, 4\n"
index a019e4e..7454fc6 100644 (file)
@@ -16,6 +16,8 @@
 #include <linux/kernel.h>
 #include <asm/cacheflush.h>
 
+#include <asm/cacheflush.h>
+
 #include "core.h"
 #include "sysregs.h"
 
@@ -27,6 +29,8 @@ extern void secondary_startup(void);
  */
 void __ref highbank_cpu_die(unsigned int cpu)
 {
+       flush_cache_all();
+
        highbank_set_cpu_jump(cpu, phys_to_virt(0));
 
        flush_cache_louis();
index 326a872..750446f 100644 (file)
 #include <linux/errno.h>
 #include <linux/smp.h>
 
+#include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 
 #include "common.h"
 
 static inline void cpu_enter_lowpower(void)
 {
+       /* Just flush the cache. Changing the coherency is not yet
+        * available on msm. */
+       flush_cache_all();
 }
 
 static inline void cpu_leave_lowpower(void)
index 458f72f..494fcd2 100644 (file)
@@ -32,6 +32,9 @@ void __ref omap4_cpu_die(unsigned int cpu)
        unsigned int boot_cpu = 0;
        void __iomem *base = omap_get_wakeupgen_base();
 
+       flush_cache_all();
+       dsb();
+
        /*
         * we're ready for shutdown now, so do it
         */
index 0ab2f8b..f4b17cb 100644 (file)
 #include <linux/errno.h>
 #include <linux/smp.h>
 
+#include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 
 static inline void platform_do_lowpower(unsigned int cpu)
 {
+       flush_cache_all();
+
        /* we put the platform to just WFI */
        for (;;) {
                __asm__ __volatile__("dsb\n\t" "wfi\n\t"
index ac22dd4..53818e5 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/errno.h>
 #include <linux/smp.h>
 
+#include <asm/cacheflush.h>
 #include <asm/cp15.h>
 #include <asm/smp_plat.h>
 
@@ -19,6 +20,7 @@ static inline void cpu_enter_lowpower(void)
 {
        unsigned int v;
 
+       flush_cache_all();
        asm volatile(
        "       mcr     p15, 0, %1, c7, c5, 0\n"
        "       mcr     p15, 0, %1, c7, c10, 4\n"
index 496592b..bf79626 100644 (file)
@@ -104,6 +104,14 @@ static int sh73a0_cpu_kill(unsigned int cpu)
 
 static void sh73a0_cpu_die(unsigned int cpu)
 {
+       /*
+        * The ARM MPcore does not issue a cache coherency request for the L1
+        * cache when powering off single CPUs. We must take care of this and
+        * further caches.
+        */
+       dsb();
+       flush_cache_all();
+
        /* Set power off mode. This takes the CPU out of the MP cluster */
        scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF);
 
index d97749c..a7d2dd1 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/smp.h>
+#include <asm/cacheflush.h>
 #include <asm/cp15.h>
 #include <asm/smp_plat.h>
 
@@ -20,6 +21,7 @@ static inline void cpu_enter_lowpower(void)
 {
        unsigned int v;
 
+       flush_cache_all();
        asm volatile(
        "       mcr     p15, 0, %1, c7, c5, 0\n"
        "       dsb\n"
index 184914a..a557bc9 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/smp.h>
 #include <linux/clk/tegra.h>
 
+#include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 
 #include "fuse.h"
index 2bc00b0..87abcf2 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/errno.h>
 #include <linux/smp.h>
 
+#include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 
 #include "setup.h"
@@ -23,6 +24,8 @@
  */
 void __ref ux500_cpu_die(unsigned int cpu)
 {
+       flush_cache_all();
+
        /* directly enter low power state, skipping secure registers */
        for (;;) {
                __asm__ __volatile__("dsb\n\t" "wfi\n\t"
index f0ce6b8..a141b98 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/errno.h>
 #include <linux/smp.h>
 
+#include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 #include <asm/cp15.h>
 
@@ -19,6 +20,7 @@ static inline void cpu_enter_lowpower(void)
 {
        unsigned int v;
 
+       flush_cache_all();
        asm volatile(
                "mcr    p15, 0, %1, c7, c5, 0\n"
        "       mcr     p15, 0, %1, c7, c10, 4\n"