diff options
author | Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | 2013-06-06 06:24:28 -0400 |
---|---|---|
committer | Jason Cooper <jason@lakedaemon.net> | 2013-06-13 13:48:40 -0400 |
commit | 580ff0eea15c341d17d564f7e5c519df37033d8e (patch) | |
tree | f3572705e6f41aab6d06fae867ed266ab7fbb0cc /arch/arm/mach-mvebu/coherency.c | |
parent | 488275beda149fe5cffdf5aa457344aa619d54f1 (diff) |
arm: mvebu: don't hardcode a physical address in headsmp.S
Now that the coherency_init() function is called a bit earlier, we can
actually read the physical address of the coherency unit registers
from the Device Tree, and communicate that to the headsmp.S code,
which avoids hardcoding a physical address.
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Acked-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Diffstat (limited to 'arch/arm/mach-mvebu/coherency.c')
-rw-r--r-- | arch/arm/mach-mvebu/coherency.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/arm/mach-mvebu/coherency.c b/arch/arm/mach-mvebu/coherency.c index d74794a590f1..32fcf69f4202 100644 --- a/arch/arm/mach-mvebu/coherency.c +++ b/arch/arm/mach-mvebu/coherency.c | |||
@@ -25,8 +25,10 @@ | |||
25 | #include <linux/dma-mapping.h> | 25 | #include <linux/dma-mapping.h> |
26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
27 | #include <asm/smp_plat.h> | 27 | #include <asm/smp_plat.h> |
28 | #include <asm/cacheflush.h> | ||
28 | #include "armada-370-xp.h" | 29 | #include "armada-370-xp.h" |
29 | 30 | ||
31 | unsigned long __cpuinitdata coherency_phys_base; | ||
30 | static void __iomem *coherency_base; | 32 | static void __iomem *coherency_base; |
31 | static void __iomem *coherency_cpu_base; | 33 | static void __iomem *coherency_cpu_base; |
32 | 34 | ||
@@ -124,7 +126,17 @@ int __init coherency_init(void) | |||
124 | 126 | ||
125 | np = of_find_matching_node(NULL, of_coherency_table); | 127 | np = of_find_matching_node(NULL, of_coherency_table); |
126 | if (np) { | 128 | if (np) { |
129 | struct resource res; | ||
127 | pr_info("Initializing Coherency fabric\n"); | 130 | pr_info("Initializing Coherency fabric\n"); |
131 | of_address_to_resource(np, 0, &res); | ||
132 | coherency_phys_base = res.start; | ||
133 | /* | ||
134 | * Ensure secondary CPUs will see the updated value, | ||
135 | * which they read before they join the coherency | ||
136 | * fabric, and therefore before they are coherent with | ||
137 | * the boot CPU cache. | ||
138 | */ | ||
139 | sync_cache_w(&coherency_phys_base); | ||
128 | coherency_base = of_iomap(np, 0); | 140 | coherency_base = of_iomap(np, 0); |
129 | coherency_cpu_base = of_iomap(np, 1); | 141 | coherency_cpu_base = of_iomap(np, 1); |
130 | set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0); | 142 | set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0); |