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>
This commit is contained in:
parent
fdc0b43fbb
commit
b21dcafea3
@ -47,18 +47,6 @@ static struct of_device_id of_coherency_table[] = {
|
||||
{ /* 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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -88,8 +88,16 @@ static int __cpuinit armada_xp_boot_secondary(unsigned int cpu,
|
||||
|
||||
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) {
|
||||
|
Loading…
Reference in New Issue
Block a user