diff options
Diffstat (limited to 'target/linux/mvebu/patches-3.10/0024-arm-mvebu-remove-dependency-of-SMP-init-on-static-I-.patch')
-rw-r--r-- | target/linux/mvebu/patches-3.10/0024-arm-mvebu-remove-dependency-of-SMP-init-on-static-I-.patch | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/target/linux/mvebu/patches-3.10/0024-arm-mvebu-remove-dependency-of-SMP-init-on-static-I-.patch b/target/linux/mvebu/patches-3.10/0024-arm-mvebu-remove-dependency-of-SMP-init-on-static-I-.patch new file mode 100644 index 0000000000..38c908fb8c --- /dev/null +++ b/target/linux/mvebu/patches-3.10/0024-arm-mvebu-remove-dependency-of-SMP-init-on-static-I-.patch @@ -0,0 +1,99 @@ +From 9398729313b826469fede3acda5fedd1eb21cb3e Mon Sep 17 00:00:00 2001 +From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> +Date: Wed, 5 Jun 2013 09:04:54 +0200 +Subject: [PATCH 024/203] 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> +--- + arch/arm/mach-mvebu/coherency.c | 12 ------------ + arch/arm/mach-mvebu/coherency.h | 4 ---- + arch/arm/mach-mvebu/common.h | 2 ++ + arch/arm/mach-mvebu/platsmp.c | 10 +++++++++- + 4 files changed, 11 insertions(+), 17 deletions(-) + +--- 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_ + { /* end of list */ }, + }; + +-#ifdef CONFIG_SMP +-int coherency_get_cpu_count(void) +-{ +- int reg, cnt; +- +- reg = readl(coherency_base + COHERENCY_FABRIC_CFG_OFFSET); +- cnt = (reg & 0xF) + 1; +- +- return cnt; +-} +-#endif +- + /* Function defined in coherency_ll.S */ + int ll_set_cpu_coherent(void __iomem *base_addr, unsigned int hw_cpu_id); + +--- a/arch/arm/mach-mvebu/coherency.h ++++ b/arch/arm/mach-mvebu/coherency.h +@@ -14,10 +14,6 @@ + #ifndef __MACH_370_XP_COHERENCY_H + #define __MACH_370_XP_COHERENCY_H + +-#ifdef CONFIG_SMP +-int coherency_get_cpu_count(void); +-#endif +- + int set_cpu_coherent(int cpu_id, int smp_group_id); + int coherency_init(void); + +--- a/arch/arm/mach-mvebu/common.h ++++ b/arch/arm/mach-mvebu/common.h +@@ -15,6 +15,8 @@ + #ifndef __ARCH_MVEBU_COMMON_H + #define __ARCH_MVEBU_COMMON_H + ++#define ARMADA_XP_MAX_CPUS 4 ++ + void mvebu_restart(char mode, const char *cmd); + + void armada_370_xp_init_irq(void); +--- a/arch/arm/mach-mvebu/platsmp.c ++++ b/arch/arm/mach-mvebu/platsmp.c +@@ -88,8 +88,16 @@ static int __cpuinit armada_xp_boot_seco + + static void __init armada_xp_smp_init_cpus(void) + { ++ struct device_node *np; + unsigned int i, ncores; +- ncores = coherency_get_cpu_count(); ++ ++ np = of_find_node_by_name(NULL, "cpus"); ++ if (!np) ++ panic("No 'cpus' node found\n"); ++ ++ ncores = of_get_child_count(np); ++ if (ncores == 0 || ncores > ARMADA_XP_MAX_CPUS) ++ panic("Invalid number of CPUs in DT\n"); + + /* Limit possible CPUs to defconfig */ + if (ncores > nr_cpu_ids) { |