2005-09-30 13:59:37 +01:00
/*
* Copyright ( C ) 2005 MIPS Technologies , Inc . All rights reserved .
*
* This program is free software ; you can distribute it and / or modify it
* under the terms of the GNU General Public License ( Version 2 ) as
* published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* for more details .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 59 Temple Place - Suite 330 , Boston MA 02111 - 1307 , USA .
*
*/
/*
2007-11-19 12:23:51 +00:00
* Simulator Platform - specific hooks for SMTC operation
2005-09-30 13:59:37 +01:00
*/
# include <linux/kernel.h>
# include <linux/sched.h>
# include <linux/cpumask.h>
# include <linux/interrupt.h>
2007-07-10 17:32:56 +01:00
# include <linux/smp.h>
2011-07-26 16:09:06 -07:00
# include <linux/atomic.h>
2005-09-30 13:59:37 +01:00
# include <asm/cpu.h>
# include <asm/processor.h>
2011-03-25 18:45:13 +01:00
# include <asm/smtc.h>
2005-09-30 13:59:37 +01:00
# include <asm/system.h>
# include <asm/mmu_context.h>
# include <asm/smtc_ipi.h>
/* VPE/SMP Prototype implements platform interfaces directly */
/*
* Cause the specified action to be performed on a targeted " CPU "
*/
2007-11-19 12:23:51 +00:00
static void ssmtc_send_ipi_single ( int cpu , unsigned int action )
2005-09-30 13:59:37 +01:00
{
smtc_send_ipi ( cpu , LINUX_SMP_IPI , action ) ;
2007-11-19 12:23:51 +00:00
/* "CPU" may be TC of same VPE, VPE of same CPU, or different CPU */
}
2009-09-24 09:34:44 -06:00
static inline void ssmtc_send_ipi_mask ( const struct cpumask * mask ,
unsigned int action )
2007-11-19 12:23:51 +00:00
{
unsigned int i ;
2005-09-30 13:59:37 +01:00
2009-09-24 09:34:44 -06:00
for_each_cpu ( i , mask )
2007-11-19 12:23:51 +00:00
ssmtc_send_ipi_single ( i , action ) ;
2005-09-30 13:59:37 +01:00
}
/*
2007-11-19 12:23:51 +00:00
* Post - config but pre - boot cleanup entry point
2005-09-30 13:59:37 +01:00
*/
2007-11-19 12:23:51 +00:00
static void __cpuinit ssmtc_init_secondary ( void )
2005-09-30 13:59:37 +01:00
{
2007-11-19 12:23:51 +00:00
smtc_init_secondary ( ) ;
2005-09-30 13:59:37 +01:00
}
/*
2007-11-19 12:23:51 +00:00
* SMP initialization finalization entry point
2005-09-30 13:59:37 +01:00
*/
2007-11-19 12:23:51 +00:00
static void __cpuinit ssmtc_smp_finish ( void )
{
smtc_smp_finish ( ) ;
}
2005-09-30 13:59:37 +01:00
2007-11-19 12:23:51 +00:00
/*
* Hook for after all CPUs are online
*/
static void ssmtc_cpus_done ( void )
2005-09-30 13:59:37 +01:00
{
2007-11-19 12:23:51 +00:00
}
2005-09-30 13:59:37 +01:00
2007-11-19 12:23:51 +00:00
/*
* Platform " CPU " startup hook
*/
static void __cpuinit ssmtc_boot_secondary ( int cpu , struct task_struct * idle )
{
smtc_boot_secondary ( cpu , idle ) ;
2005-09-30 13:59:37 +01:00
}
2007-11-19 12:23:51 +00:00
static void __init ssmtc_smp_setup ( void )
2007-07-10 17:32:56 +01:00
{
if ( read_c0_config3 ( ) & ( 1 < < 2 ) )
mipsmt_build_cpu_map ( 0 ) ;
}
2005-09-30 13:59:37 +01:00
/*
* Platform SMP pre - initialization
*/
2007-11-19 12:23:51 +00:00
static void ssmtc_prepare_cpus ( unsigned int max_cpus )
2005-09-30 13:59:37 +01:00
{
/*
2006-03-11 08:18:41 +00:00
* As noted above , we can assume a single CPU for now
2005-09-30 13:59:37 +01:00
* but it may be multithreaded .
*/
2007-07-10 17:32:56 +01:00
if ( read_c0_config3 ( ) & ( 1 < < 2 ) ) {
mipsmt_prepare_cpus ( ) ;
2005-09-30 13:59:37 +01:00
}
}
2007-11-19 12:23:51 +00:00
struct plat_smp_ops ssmtc_smp_ops = {
. send_ipi_single = ssmtc_send_ipi_single ,
. send_ipi_mask = ssmtc_send_ipi_mask ,
. init_secondary = ssmtc_init_secondary ,
. smp_finish = ssmtc_smp_finish ,
. cpus_done = ssmtc_cpus_done ,
. boot_secondary = ssmtc_boot_secondary ,
. smp_setup = ssmtc_smp_setup ,
. prepare_cpus = ssmtc_prepare_cpus ,
} ;