]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
arm: zynq: Invalidate L1 in secondary boot
authorSoren Brinkmann <soren.brinkmann@xilinx.com>
Tue, 16 Jul 2013 20:35:03 +0000 (13:35 -0700)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 23 Aug 2013 13:01:26 +0000 (15:01 +0200)
With an implementation of cpu_kill() (commit fda2191, 'zynq: Add support
for zynq_cpu_kill function') the killed core's L1 is not guaranteed to
be properly flushed when going into suspend. Also, during boot, Linux
initiates a clean-invalidate operation only, resulting in faulty data to
be written to the memory system during resume.
Therefore invalidate the L1 in the secondary boot path to avoid these
issues.

Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/mach-zynq/common.h
arch/arm/mach-zynq/headsmp.S
arch/arm/mach-zynq/platsmp.c

index e520ef9df1219329019b8ef8c7594e717d286314..dffde7a14dc0f7f2dcb21d1222b7eb506752e9f8 100644 (file)
@@ -21,6 +21,8 @@ void __init xttcps_timer_init_old(void);
 void __init xttcpss_timer_init(void);
 void platform_device_init(void);
 
+void zynq_secondary_startup(void);
+
 extern int zynq_slcr_init(void);
 extern void zynq_slcr_system_reset(void);
 extern void zynq_slcr_cpu_stop(int cpu);
index d183cd234a9bb68fe3c387718c89ed39d3499452..d20a079a593822fc971d4330272e8965af28d791 100644 (file)
@@ -20,5 +20,9 @@ zynq_secondary_trampoline_jump:
        .word   /* cpu 1 */
 .globl zynq_secondary_trampoline_end
 zynq_secondary_trampoline_end:
-
 ENDPROC(zynq_secondary_trampoline)
+
+ENTRY(zynq_secondary_startup)
+       bl      v7_invalidate_l1
+       b       secondary_startup
+ENDPROC(zynq_secondary_startup)
index cc6803e550ddebffb3cacadb667d19ef09beb341..ef261e8cd51fe01d121f62a02fa2e16b00592297 100644 (file)
@@ -110,7 +110,7 @@ EXPORT_SYMBOL(zynq_cpun_start);
 static int __cpuinit zynq_boot_secondary(unsigned int cpu,
                                                struct task_struct *idle)
 {
-       return zynq_cpun_start(virt_to_phys(secondary_startup), cpu);
+       return zynq_cpun_start(virt_to_phys(zynq_secondary_startup), cpu);
 }
 
 /*