diff options
Diffstat (limited to 'arch/arm/mach-keystone/platsmp.c')
| -rw-r--r-- | arch/arm/mach-keystone/platsmp.c | 17 | 
1 files changed, 16 insertions, 1 deletions
diff --git a/arch/arm/mach-keystone/platsmp.c b/arch/arm/mach-keystone/platsmp.c index c12296157d4..5f46a7cf907 100644 --- a/arch/arm/mach-keystone/platsmp.c +++ b/arch/arm/mach-keystone/platsmp.c @@ -18,13 +18,15 @@  #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", @@ -37,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,  };  | 
