You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.1 KiB
99 lines
3.1 KiB
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) {
|
|
|