diff options
-rw-r--r-- | arch/arm/mach-mvebu/headsmp-a9.S | 12 | ||||
-rw-r--r-- | arch/arm/mach-mvebu/platsmp-a9.c | 32 |
2 files changed, 44 insertions, 0 deletions
diff --git a/arch/arm/mach-mvebu/headsmp-a9.S b/arch/arm/mach-mvebu/headsmp-a9.S index 78e66c96e718..5925366bc03c 100644 --- a/arch/arm/mach-mvebu/headsmp-a9.S +++ b/arch/arm/mach-mvebu/headsmp-a9.S | |||
@@ -16,6 +16,18 @@ | |||
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | 17 | ||
18 | __CPUINIT | 18 | __CPUINIT |
19 | #define CPU_RESUME_ADDR_REG 0xf10182d4 | ||
20 | |||
21 | .global armada_375_smp_cpu1_enable_code_start | ||
22 | .global armada_375_smp_cpu1_enable_code_end | ||
23 | |||
24 | armada_375_smp_cpu1_enable_code_start: | ||
25 | ldr r0, [pc, #4] | ||
26 | ldr r1, [r0] | ||
27 | mov pc, r1 | ||
28 | .word CPU_RESUME_ADDR_REG | ||
29 | armada_375_smp_cpu1_enable_code_end: | ||
30 | |||
19 | ENTRY(mvebu_cortex_a9_secondary_startup) | 31 | ENTRY(mvebu_cortex_a9_secondary_startup) |
20 | bl v7_invalidate_l1 | 32 | bl v7_invalidate_l1 |
21 | b secondary_startup | 33 | b secondary_startup |
diff --git a/arch/arm/mach-mvebu/platsmp-a9.c b/arch/arm/mach-mvebu/platsmp-a9.c index 27dacfc7fe98..04d0b1847c39 100644 --- a/arch/arm/mach-mvebu/platsmp-a9.c +++ b/arch/arm/mach-mvebu/platsmp-a9.c | |||
@@ -16,11 +16,36 @@ | |||
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <linux/of.h> | 17 | #include <linux/of.h> |
18 | #include <linux/smp.h> | 18 | #include <linux/smp.h> |
19 | #include <linux/mbus.h> | ||
19 | #include <asm/smp_scu.h> | 20 | #include <asm/smp_scu.h> |
20 | #include <asm/smp_plat.h> | 21 | #include <asm/smp_plat.h> |
21 | #include "common.h" | 22 | #include "common.h" |
22 | #include "pmsu.h" | 23 | #include "pmsu.h" |
23 | 24 | ||
25 | #define CRYPT0_ENG_ID 41 | ||
26 | #define CRYPT0_ENG_ATTR 0x1 | ||
27 | #define SRAM_PHYS_BASE 0xFFFF0000 | ||
28 | |||
29 | #define BOOTROM_BASE 0xFFF00000 | ||
30 | #define BOOTROM_SIZE 0x100000 | ||
31 | |||
32 | extern unsigned char armada_375_smp_cpu1_enable_code_end; | ||
33 | extern unsigned char armada_375_smp_cpu1_enable_code_start; | ||
34 | |||
35 | void armada_375_smp_cpu1_enable_wa(void) | ||
36 | { | ||
37 | void __iomem *sram_virt_base; | ||
38 | |||
39 | mvebu_mbus_del_window(BOOTROM_BASE, BOOTROM_SIZE); | ||
40 | mvebu_mbus_add_window_by_id(CRYPT0_ENG_ID, CRYPT0_ENG_ATTR, | ||
41 | SRAM_PHYS_BASE, SZ_64K); | ||
42 | sram_virt_base = ioremap(SRAM_PHYS_BASE, SZ_64K); | ||
43 | |||
44 | memcpy(sram_virt_base, &armada_375_smp_cpu1_enable_code_start, | ||
45 | &armada_375_smp_cpu1_enable_code_end | ||
46 | - &armada_375_smp_cpu1_enable_code_start); | ||
47 | } | ||
48 | |||
24 | extern void mvebu_cortex_a9_secondary_startup(void); | 49 | extern void mvebu_cortex_a9_secondary_startup(void); |
25 | 50 | ||
26 | static int __cpuinit mvebu_cortex_a9_boot_secondary(unsigned int cpu, | 51 | static int __cpuinit mvebu_cortex_a9_boot_secondary(unsigned int cpu, |
@@ -55,7 +80,14 @@ static int __cpuinit mvebu_cortex_a9_boot_secondary(unsigned int cpu, | |||
55 | return 0; | 80 | return 0; |
56 | } | 81 | } |
57 | 82 | ||
83 | static void __init mvebu_cortex_a9_smp_prepare_cpus(unsigned int max_cpus) | ||
84 | { | ||
85 | if (of_machine_is_compatible("marvell,armada375")) | ||
86 | armada_375_smp_cpu1_enable_wa(); | ||
87 | } | ||
88 | |||
58 | static struct smp_operations mvebu_cortex_a9_smp_ops __initdata = { | 89 | static struct smp_operations mvebu_cortex_a9_smp_ops __initdata = { |
90 | .smp_prepare_cpus = mvebu_cortex_a9_smp_prepare_cpus, | ||
59 | .smp_boot_secondary = mvebu_cortex_a9_boot_secondary, | 91 | .smp_boot_secondary = mvebu_cortex_a9_boot_secondary, |
60 | #ifdef CONFIG_HOTPLUG_CPU | 92 | #ifdef CONFIG_HOTPLUG_CPU |
61 | .cpu_die = armada_xp_cpu_die, | 93 | .cpu_die = armada_xp_cpu_die, |