2013-06-10 12:20:17 -04:00
/*
* Keystone SOC SMP platform code
*
* Copyright 2013 Texas Instruments , Inc .
* Cyril Chemparathy < cyril @ ti . com >
* Santosh Shilimkar < santosh . shillimkar @ ti . com >
*
* Based on platsmp . c , Copyright ( C ) 2002 ARM Ltd .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*/
# include <linux/init.h>
# include <linux/smp.h>
# include <linux/io.h>
# include <asm/smp_plat.h>
2013-06-13 19:24:39 -04:00
# include <asm/prom.h>
# include <asm/tlbflush.h>
# include <asm/pgtable.h>
2013-06-10 12:20:17 -04:00
# include "keystone.h"
2013-06-17 15:43:14 -04:00
static int keystone_smp_boot_secondary ( unsigned int cpu ,
2013-06-10 12:20:17 -04:00
struct task_struct * idle )
{
2013-06-13 19:24:39 -04:00
unsigned long start = virt_to_idmap ( & secondary_startup ) ;
2013-06-10 12:20:17 -04:00
int error ;
pr_debug ( " keystone-smp: booting cpu %d, vector %08lx \n " ,
cpu , start ) ;
2013-06-21 18:54:47 -04:00
error = keystone_cpu_smc ( KEYSTONE_MON_CPU_UP_IDX , cpu , start ) ;
if ( error )
pr_err ( " CPU %d bringup failed with %d \n " , cpu , error ) ;
2013-06-10 12:20:17 -04:00
return error ;
}
2013-06-13 19:24:39 -04:00
# 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
2013-06-10 12:20:17 -04:00
struct smp_operations keystone_smp_ops __initdata = {
. smp_boot_secondary = keystone_smp_boot_secondary ,
2013-06-13 19:24:39 -04:00
. smp_secondary_init = keystone_smp_secondary_initmem ,
2013-06-10 12:20:17 -04:00
} ;