|
@@ -12,9 +12,11 @@
|
|
|
#include <linux/errno.h>
|
|
|
#include <linux/smp.h>
|
|
|
#include <linux/io.h>
|
|
|
+#include <linux/of.h>
|
|
|
#include <linux/of_fdt.h>
|
|
|
#include <linux/vexpress.h>
|
|
|
|
|
|
+#include <asm/mcpm.h>
|
|
|
#include <asm/smp_scu.h>
|
|
|
#include <asm/mach/map.h>
|
|
|
|
|
@@ -203,3 +205,21 @@ struct smp_operations __initdata vexpress_smp_ops = {
|
|
|
.cpu_die = vexpress_cpu_die,
|
|
|
#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;
|
|
|
+}
|