Merge branch 'next' of git://git.infradead.org/users/pcmoore/selinux into next
[sfrench/cifs-2.6.git] / arch / arm / mach-keystone / platsmp.c
index 5cf0683577ea83e54861b927a12cdf9b87d08bd6..5f46a7cf907b1f0fe162278c283431ce69aa8bed 100644 (file)
 #include <linux/io.h>
 
 #include <asm/smp_plat.h>
+#include <asm/prom.h>
+#include <asm/tlbflush.h>
+#include <asm/pgtable.h>
 
 #include "keystone.h"
 
 static int keystone_smp_boot_secondary(unsigned int cpu,
                                                struct task_struct *idle)
 {
-       unsigned long start = virt_to_phys(&secondary_startup);
+       unsigned long start = virt_to_idmap(&secondary_startup);
        int error;
 
        pr_debug("keystone-smp: booting cpu %d, vector %08lx\n",
@@ -36,6 +39,19 @@ static int keystone_smp_boot_secondary(unsigned int cpu,
        return error;
 }
 
+#ifdef CONFIG_ARM_LPAE
+static void __cpuinit keystone_smp_secondary_initmem(unsigned int cpu)
+{
+       pgd_t *pgd0 = pgd_offset_k(0);
+       cpu_set_ttbr(1, __pa(pgd0) + TTBR1_OFFSET);
+       local_flush_tlb_all();
+}
+#else
+static inline void __cpuinit keystone_smp_secondary_initmem(unsigned int cpu)
+{}
+#endif
+
 struct smp_operations keystone_smp_ops __initdata = {
        .smp_boot_secondary     = keystone_smp_boot_secondary,
+       .smp_secondary_init     = keystone_smp_secondary_initmem,
 };