diff options
author | Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | 2013-06-05 03:04:54 -0400 |
---|---|---|
committer | Jason Cooper <jason@lakedaemon.net> | 2013-06-13 13:48:13 -0400 |
commit | b21dcafea36dd6249df9cf485a48c7337a8987af (patch) | |
tree | 9570b8a86b0cabcfb68fb19ab89f8910b02d1cab /arch/arm/mach-mvebu | |
parent | fdc0b43fbb0e0958f13d3453dfb9df707c0af904 (diff) |
arm: mvebu: remove dependency of SMP init on static I/O mapping
The ->smp_init_cpus() function is called very early during boot, at a
point where dynamic I/O mappings are not yet possible. However, in the
Armada 370/XP implementation of this function, we have to get the
number of CPUs. We used to do that by accessing a hardware register,
which requires relying on a static I/O mapping set up by
->map_io(). Not only this requires hardcoding a virtual address, but
it also prevents us from removing the static I/O mapping.
So this commit changes the way used to get the number of CPUs: we now
use the Device Tree, which is a representation of the hardware, and
provides us the number of available CPUs. This is also more accurate,
because it potentially allows to boot the Linux kernel on only a
number of CPUs given by the Device Tree, instead of unconditionally on
all CPUs.
As a consequence, the coherency_get_cpu_count() function becomes no
longer used, so we remove it.
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Diffstat (limited to 'arch/arm/mach-mvebu')
-rw-r--r-- | arch/arm/mach-mvebu/coherency.c | 12 | ||||
-rw-r--r-- | arch/arm/mach-mvebu/coherency.h | 4 | ||||
-rw-r--r-- | arch/arm/mach-mvebu/common.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-mvebu/platsmp.c | 10 |
4 files changed, 11 insertions, 17 deletions
diff --git a/arch/arm/mach-mvebu/coherency.c b/arch/arm/mach-mvebu/coherency.c index 8278960066c3..46d66c0a7dc5 100644 --- a/arch/arm/mach-mvebu/coherency.c +++ b/arch/arm/mach-mvebu/coherency.c | |||
@@ -47,18 +47,6 @@ static struct of_device_id of_coherency_table[] = { | |||
47 | { /* end of list */ }, | 47 | { /* end of list */ }, |
48 | }; | 48 | }; |
49 | 49 | ||
50 | #ifdef CONFIG_SMP | ||
51 | int coherency_get_cpu_count(void) | ||
52 | { | ||
53 | int reg, cnt; | ||
54 | |||
55 | reg = readl(coherency_base + COHERENCY_FABRIC_CFG_OFFSET); | ||
56 | cnt = (reg & 0xF) + 1; | ||
57 | |||
58 | return cnt; | ||
59 | } | ||
60 | #endif | ||
61 | |||
62 | /* Function defined in coherency_ll.S */ | 50 | /* Function defined in coherency_ll.S */ |
63 | int ll_set_cpu_coherent(void __iomem *base_addr, unsigned int hw_cpu_id); | 51 | int ll_set_cpu_coherent(void __iomem *base_addr, unsigned int hw_cpu_id); |
64 | 52 | ||
diff --git a/arch/arm/mach-mvebu/coherency.h b/arch/arm/mach-mvebu/coherency.h index 2f428137f6fe..df33ad8a6c08 100644 --- a/arch/arm/mach-mvebu/coherency.h +++ b/arch/arm/mach-mvebu/coherency.h | |||
@@ -14,10 +14,6 @@ | |||
14 | #ifndef __MACH_370_XP_COHERENCY_H | 14 | #ifndef __MACH_370_XP_COHERENCY_H |
15 | #define __MACH_370_XP_COHERENCY_H | 15 | #define __MACH_370_XP_COHERENCY_H |
16 | 16 | ||
17 | #ifdef CONFIG_SMP | ||
18 | int coherency_get_cpu_count(void); | ||
19 | #endif | ||
20 | |||
21 | int set_cpu_coherent(int cpu_id, int smp_group_id); | 17 | int set_cpu_coherent(int cpu_id, int smp_group_id); |
22 | int coherency_init(void); | 18 | int coherency_init(void); |
23 | 19 | ||
diff --git a/arch/arm/mach-mvebu/common.h b/arch/arm/mach-mvebu/common.h index aa27bc2ffb60..98defd5e92cd 100644 --- a/arch/arm/mach-mvebu/common.h +++ b/arch/arm/mach-mvebu/common.h | |||
@@ -15,6 +15,8 @@ | |||
15 | #ifndef __ARCH_MVEBU_COMMON_H | 15 | #ifndef __ARCH_MVEBU_COMMON_H |
16 | #define __ARCH_MVEBU_COMMON_H | 16 | #define __ARCH_MVEBU_COMMON_H |
17 | 17 | ||
18 | #define ARMADA_XP_MAX_CPUS 4 | ||
19 | |||
18 | void mvebu_restart(char mode, const char *cmd); | 20 | void mvebu_restart(char mode, const char *cmd); |
19 | 21 | ||
20 | void armada_370_xp_init_irq(void); | 22 | void armada_370_xp_init_irq(void); |
diff --git a/arch/arm/mach-mvebu/platsmp.c b/arch/arm/mach-mvebu/platsmp.c index 875ea748391c..93f2f3ab45f1 100644 --- a/arch/arm/mach-mvebu/platsmp.c +++ b/arch/arm/mach-mvebu/platsmp.c | |||
@@ -88,8 +88,16 @@ static int __cpuinit armada_xp_boot_secondary(unsigned int cpu, | |||
88 | 88 | ||
89 | static void __init armada_xp_smp_init_cpus(void) | 89 | static void __init armada_xp_smp_init_cpus(void) |
90 | { | 90 | { |
91 | struct device_node *np; | ||
91 | unsigned int i, ncores; | 92 | unsigned int i, ncores; |
92 | ncores = coherency_get_cpu_count(); | 93 | |
94 | np = of_find_node_by_name(NULL, "cpus"); | ||
95 | if (!np) | ||
96 | panic("No 'cpus' node found\n"); | ||
97 | |||
98 | ncores = of_get_child_count(np); | ||
99 | if (ncores == 0 || ncores > ARMADA_XP_MAX_CPUS) | ||
100 | panic("Invalid number of CPUs in DT\n"); | ||
93 | 101 | ||
94 | /* Limit possible CPUs to defconfig */ | 102 | /* Limit possible CPUs to defconfig */ |
95 | if (ncores > nr_cpu_ids) { | 103 | if (ncores > nr_cpu_ids) { |