ARM: vexpress: Select multi-cluster SMP operation if required
Signed-off-by: Jon Medhurst <tixy@linaro.org> Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org> Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Acked-by: Pawel Moll <pawel.moll@arm.com>
This commit is contained in:
parent
d41418c0c0
commit
033a899c9b
3 changed files with 23 additions and 0 deletions
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
void vexpress_dt_smp_map_io(void);
|
void vexpress_dt_smp_map_io(void);
|
||||||
|
|
||||||
|
bool vexpress_smp_init_ops(void);
|
||||||
|
|
||||||
extern struct smp_operations vexpress_smp_ops;
|
extern struct smp_operations vexpress_smp_ops;
|
||||||
|
|
||||||
extern void vexpress_cpu_die(unsigned int cpu);
|
extern void vexpress_cpu_die(unsigned int cpu);
|
||||||
|
|
|
@ -12,9 +12,11 @@
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/of.h>
|
||||||
#include <linux/of_fdt.h>
|
#include <linux/of_fdt.h>
|
||||||
#include <linux/vexpress.h>
|
#include <linux/vexpress.h>
|
||||||
|
|
||||||
|
#include <asm/mcpm.h>
|
||||||
#include <asm/smp_scu.h>
|
#include <asm/smp_scu.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
|
||||||
|
@ -203,3 +205,21 @@ struct smp_operations __initdata vexpress_smp_ops = {
|
||||||
.cpu_die = vexpress_cpu_die,
|
.cpu_die = vexpress_cpu_die,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool __init vexpress_smp_init_ops(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_MCPM
|
||||||
|
/*
|
||||||
|
* The best way to detect a multi-cluster configuration at the moment
|
||||||
|
* is to look for the presence of a CCI in the system.
|
||||||
|
* Override the default vexpress_smp_ops if so.
|
||||||
|
*/
|
||||||
|
struct device_node *node;
|
||||||
|
node = of_find_compatible_node(NULL, NULL, "arm,cci-400");
|
||||||
|
if (node && of_device_is_available(node)) {
|
||||||
|
mcpm_smp_set_ops();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -456,6 +456,7 @@ static const char * const v2m_dt_match[] __initconst = {
|
||||||
DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express")
|
DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express")
|
||||||
.dt_compat = v2m_dt_match,
|
.dt_compat = v2m_dt_match,
|
||||||
.smp = smp_ops(vexpress_smp_ops),
|
.smp = smp_ops(vexpress_smp_ops),
|
||||||
|
.smp_init = smp_init_ops(vexpress_smp_init_ops),
|
||||||
.map_io = v2m_dt_map_io,
|
.map_io = v2m_dt_map_io,
|
||||||
.init_early = v2m_dt_init_early,
|
.init_early = v2m_dt_init_early,
|
||||||
.init_irq = irqchip_init,
|
.init_irq = irqchip_init,
|
||||||
|
|
Loading…
Add table
Reference in a new issue