diff options
author | Soren Brinkmann <soren.brinkmann@xilinx.com> | 2013-10-31 12:10:15 -0400 |
---|---|---|
committer | Michal Simek <michal.simek@xilinx.com> | 2013-12-10 08:17:55 -0500 |
commit | 6a37ff388a0b5f39062b883ae2a0f5c742c2492b (patch) | |
tree | 1dbce0d979b08ee077fe83b9e48961b8f14b495d | |
parent | 11e031308ba660b31ffaf31f0295a2c1c358b574 (diff) |
arm: zynq: Invalidate L1 in secondary boot
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>
-rw-r--r-- | arch/arm/mach-zynq/common.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-zynq/headsmp.S | 6 | ||||
-rw-r--r-- | arch/arm/mach-zynq/platsmp.c | 2 |
3 files changed, 8 insertions, 2 deletions
diff --git a/arch/arm/mach-zynq/common.h b/arch/arm/mach-zynq/common.h index 3040d219570f..c22c92cea8cb 100644 --- a/arch/arm/mach-zynq/common.h +++ b/arch/arm/mach-zynq/common.h | |||
@@ -17,6 +17,8 @@ | |||
17 | #ifndef __MACH_ZYNQ_COMMON_H__ | 17 | #ifndef __MACH_ZYNQ_COMMON_H__ |
18 | #define __MACH_ZYNQ_COMMON_H__ | 18 | #define __MACH_ZYNQ_COMMON_H__ |
19 | 19 | ||
20 | void zynq_secondary_startup(void); | ||
21 | |||
20 | extern int zynq_slcr_init(void); | 22 | extern int zynq_slcr_init(void); |
21 | extern void zynq_slcr_system_reset(void); | 23 | extern void zynq_slcr_system_reset(void); |
22 | extern void zynq_slcr_cpu_stop(int cpu); | 24 | extern void zynq_slcr_cpu_stop(int cpu); |
diff --git a/arch/arm/mach-zynq/headsmp.S b/arch/arm/mach-zynq/headsmp.S index d4cd5f34fe5c..57a32869f0aa 100644 --- a/arch/arm/mach-zynq/headsmp.S +++ b/arch/arm/mach-zynq/headsmp.S | |||
@@ -18,5 +18,9 @@ zynq_secondary_trampoline_jump: | |||
18 | .word /* cpu 1 */ | 18 | .word /* cpu 1 */ |
19 | .globl zynq_secondary_trampoline_end | 19 | .globl zynq_secondary_trampoline_end |
20 | zynq_secondary_trampoline_end: | 20 | zynq_secondary_trampoline_end: |
21 | |||
22 | ENDPROC(zynq_secondary_trampoline) | 21 | ENDPROC(zynq_secondary_trampoline) |
22 | |||
23 | ENTRY(zynq_secondary_startup) | ||
24 | bl v7_invalidate_l1 | ||
25 | b secondary_startup | ||
26 | ENDPROC(zynq_secondary_startup) | ||
diff --git a/arch/arm/mach-zynq/platsmp.c b/arch/arm/mach-zynq/platsmp.c index 03a62d5df8f4..f6e62c4a0afc 100644 --- a/arch/arm/mach-zynq/platsmp.c +++ b/arch/arm/mach-zynq/platsmp.c | |||
@@ -90,7 +90,7 @@ EXPORT_SYMBOL(zynq_cpun_start); | |||
90 | static int zynq_boot_secondary(unsigned int cpu, | 90 | static int zynq_boot_secondary(unsigned int cpu, |
91 | struct task_struct *idle) | 91 | struct task_struct *idle) |
92 | { | 92 | { |
93 | return zynq_cpun_start(virt_to_phys(secondary_startup), cpu); | 93 | return zynq_cpun_start(virt_to_phys(zynq_secondary_startup), cpu); |
94 | } | 94 | } |
95 | 95 | ||
96 | /* | 96 | /* |