Merge remote-tracking branch 'asoc/topic/rcar' into asoc-next
[cascardo/linux.git] / arch / arm / mach-keystone / platsmp.c
index 5cf0683..5f46a7c 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,
 };