|
@@ -15,11 +15,13 @@
|
|
|
#include <linux/smp.h>
|
|
|
|
|
|
#include <asm/cacheflush.h>
|
|
|
-#include <asm/hardware/arm_scu.h>
|
|
|
#include <asm/hardware.h>
|
|
|
#include <asm/io.h>
|
|
|
#include <asm/mach-types.h>
|
|
|
|
|
|
+#include <asm/arch/board-eb.h>
|
|
|
+#include <asm/arch/scu.h>
|
|
|
+
|
|
|
extern void realview_secondary_startup(void);
|
|
|
|
|
|
/*
|
|
@@ -31,9 +33,13 @@ volatile int __cpuinitdata pen_release = -1;
|
|
|
static unsigned int __init get_core_count(void)
|
|
|
{
|
|
|
unsigned int ncores;
|
|
|
+ void __iomem *scu_base = 0;
|
|
|
+
|
|
|
+ if (machine_is_realview_eb() && core_tile_eb11mp())
|
|
|
+ scu_base = __io_address(REALVIEW_EB11MP_SCU_BASE);
|
|
|
|
|
|
- if (machine_is_realview_eb() && core_tile_eb11mp()) {
|
|
|
- ncores = __raw_readl(__io_address(REALVIEW_EB11MP_SCU_BASE) + SCU_CONFIG);
|
|
|
+ if (scu_base) {
|
|
|
+ ncores = __raw_readl(scu_base + SCU_CONFIG);
|
|
|
ncores = (ncores & 0x03) + 1;
|
|
|
} else
|
|
|
ncores = 1;
|
|
@@ -41,6 +47,24 @@ static unsigned int __init get_core_count(void)
|
|
|
return ncores;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Setup the SCU
|
|
|
+ */
|
|
|
+static void scu_enable(void)
|
|
|
+{
|
|
|
+ u32 scu_ctrl;
|
|
|
+ void __iomem *scu_base;
|
|
|
+
|
|
|
+ if (machine_is_realview_eb() && core_tile_eb11mp())
|
|
|
+ scu_base = __io_address(REALVIEW_EB11MP_SCU_BASE);
|
|
|
+ else
|
|
|
+ BUG();
|
|
|
+
|
|
|
+ scu_ctrl = __raw_readl(scu_base + SCU_CTRL);
|
|
|
+ scu_ctrl |= 1;
|
|
|
+ __raw_writel(scu_ctrl, scu_base + SCU_CTRL);
|
|
|
+}
|
|
|
+
|
|
|
static DEFINE_SPINLOCK(boot_lock);
|
|
|
|
|
|
void __cpuinit platform_secondary_init(unsigned int cpu)
|
|
@@ -210,11 +234,14 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|
|
cpu_set(i, cpu_present_map);
|
|
|
|
|
|
/*
|
|
|
- * Do we need any more CPUs? If so, then let them know where
|
|
|
- * to start. Note that, on modern versions of MILO, the "poke"
|
|
|
- * doesn't actually do anything until each individual core is
|
|
|
- * sent a soft interrupt to get it out of WFI
|
|
|
+ * Initialise the SCU if there are more than one CPU and let
|
|
|
+ * them know where to start. Note that, on modern versions of
|
|
|
+ * MILO, the "poke" doesn't actually do anything until each
|
|
|
+ * individual core is sent a soft interrupt to get it out of
|
|
|
+ * WFI
|
|
|
*/
|
|
|
- if (max_cpus > 1)
|
|
|
+ if (max_cpus > 1) {
|
|
|
+ scu_enable();
|
|
|
poke_milo();
|
|
|
+ }
|
|
|
}
|