aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorMichal Simek <michal.simek@xilinx.com>2013-05-24 11:58:55 -0400
committerMichal Simek <michal.simek@xilinx.com>2013-06-17 01:35:31 -0400
commit88cd4e882de73c2e62c38591abfe8c13fcc8386a (patch)
tree928df494011ef788f535068e63bc13a68d180e00 /arch
parent7ac161c43506f60b07684bc8a98eeb50d8e8664c (diff)
ARM: zynq: Not to rewrite jump code when starting address is 0x0
This configuration is used by remoteproc. Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-zynq/platsmp.c52
1 files changed, 26 insertions, 26 deletions
diff --git a/arch/arm/mach-zynq/platsmp.c b/arch/arm/mach-zynq/platsmp.c
index 5fc167e07619..023f225493f2 100644
--- a/arch/arm/mach-zynq/platsmp.c
+++ b/arch/arm/mach-zynq/platsmp.c
@@ -53,34 +53,34 @@ int __cpuinit zynq_cpun_start(u32 address, int cpu)
53 &zynq_secondary_trampoline; 53 &zynq_secondary_trampoline;
54 54
55 zynq_slcr_cpu_stop(cpu); 55 zynq_slcr_cpu_stop(cpu);
56 56 if (address) {
57 if (__pa(PAGE_OFFSET)) { 57 if (__pa(PAGE_OFFSET)) {
58 zero = ioremap(0, trampoline_code_size); 58 zero = ioremap(0, trampoline_code_size);
59 if (!zero) { 59 if (!zero) {
60 pr_warn("BOOTUP jump vectors not accessible\n"); 60 pr_warn("BOOTUP jump vectors not accessible\n");
61 return -1; 61 return -1;
62 }
63 } else {
64 zero = (__force u8 __iomem *)PAGE_OFFSET;
62 } 65 }
63 } else {
64 zero = (__force u8 __iomem *)PAGE_OFFSET;
65 }
66
67 /*
68 * This is elegant way how to jump to any address
69 * 0x0: Load address at 0x8 to r0
70 * 0x4: Jump by mov instruction
71 * 0x8: Jumping address
72 */
73 memcpy((__force void *)zero, &zynq_secondary_trampoline,
74 trampoline_size);
75 writel(address, zero + trampoline_size);
76
77 flush_cache_all();
78 outer_flush_range(0, trampoline_code_size);
79 smp_wmb();
80
81 if (__pa(PAGE_OFFSET))
82 iounmap(zero);
83 66
67 /*
68 * This is elegant way how to jump to any address
69 * 0x0: Load address at 0x8 to r0
70 * 0x4: Jump by mov instruction
71 * 0x8: Jumping address
72 */
73 memcpy((__force void *)zero, &zynq_secondary_trampoline,
74 trampoline_size);
75 writel(address, zero + trampoline_size);
76
77 flush_cache_all();
78 outer_flush_range(0, trampoline_code_size);
79 smp_wmb();
80
81 if (__pa(PAGE_OFFSET))
82 iounmap(zero);
83 }
84 zynq_slcr_cpu_start(cpu); 84 zynq_slcr_cpu_start(cpu);
85 85
86 return 0; 86 return 0;