2005-04-17 02:20:36 +04:00
/*
2005-11-05 02:33:55 +03:00
* smp . h : PowerPC - specific SMP code .
2005-04-17 02:20:36 +04:00
*
* Original was a copy of sparc smp . h . Now heavily modified
* for PPC .
*
* Copyright ( C ) 1996 David S . Miller ( davem @ caip . rutgers . edu )
* Copyright ( C ) 1996 - 2001 Cort Dougan < cort @ fsmlabs . com >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
2005-11-05 02:33:55 +03:00
# ifndef _ASM_POWERPC_SMP_H
# define _ASM_POWERPC_SMP_H
2005-04-17 02:20:36 +04:00
# ifdef __KERNEL__
# include <linux/threads.h>
# include <linux/cpumask.h>
# include <linux/kernel.h>
# ifndef __ASSEMBLY__
2005-11-05 02:33:55 +03:00
# ifdef CONFIG_PPC64
2005-04-17 02:20:36 +04:00
# include <asm/paca.h>
2005-11-05 02:33:55 +03:00
# endif
2005-04-17 02:20:36 +04:00
extern int boot_cpuid ;
extern void cpu_die ( void ) ;
# ifdef CONFIG_SMP
extern void smp_send_debugger_break ( int cpu ) ;
struct pt_regs ;
extern void smp_message_recv ( int , struct pt_regs * ) ;
# ifdef CONFIG_HOTPLUG_CPU
extern void fixup_irqs ( cpumask_t map ) ;
int generic_cpu_disable ( void ) ;
int generic_cpu_enable ( unsigned int cpu ) ;
void generic_cpu_die ( unsigned int cpu ) ;
void generic_mach_cpu_die ( void ) ;
# endif
2005-11-05 02:33:55 +03:00
# ifdef CONFIG_PPC64
2005-06-22 04:14:34 +04:00
# define raw_smp_processor_id() (get_paca()->paca_index)
2005-04-17 02:20:36 +04:00
# define hard_smp_processor_id() (get_paca()->hw_cpu_id)
2005-11-05 02:33:55 +03:00
# else
/* 32-bit */
extern int smp_hw_index [ ] ;
# define raw_smp_processor_id() (current_thread_info()->cpu)
# define hard_smp_processor_id() (smp_hw_index[smp_processor_id()])
# define get_hard_smp_processor_id(cpu) (smp_hw_index[(cpu)])
# define set_hard_smp_processor_id(cpu, phys)\
( smp_hw_index [ ( cpu ) ] = ( phys ) )
# endif
2005-04-17 02:20:36 +04:00
extern cpumask_t cpu_sibling_map [ NR_CPUS ] ;
/* Since OpenPIC has only 4 IPIs, we use slightly different message numbers.
*
* Make sure this matches openpic_request_IPIs in open_pic . c , or what shows up
* in / proc / interrupts will be wrong ! ! ! - - Troy */
# define PPC_MSG_CALL_FUNCTION 0
# define PPC_MSG_RESCHEDULE 1
/* This is unused now */
#if 0
# define PPC_MSG_MIGRATE_TASK 2
# endif
# define PPC_MSG_DEBUGGER_BREAK 3
void smp_init_iSeries ( void ) ;
void smp_init_pSeries ( void ) ;
2005-11-01 04:08:38 +03:00
void smp_init_cell ( void ) ;
2005-11-05 02:33:55 +03:00
void smp_setup_cpu_maps ( void ) ;
2005-04-17 02:20:36 +04:00
extern int __cpu_disable ( void ) ;
extern void __cpu_die ( unsigned int cpu ) ;
2005-11-05 02:33:55 +03:00
# else
/* for UP */
# define smp_setup_cpu_maps()
2005-04-17 02:20:36 +04:00
# endif /* CONFIG_SMP */
2005-11-05 02:33:55 +03:00
# ifdef CONFIG_PPC64
2005-04-17 02:20:36 +04:00
# define get_hard_smp_processor_id(CPU) (paca[(CPU)].hw_cpu_id)
# define set_hard_smp_processor_id(CPU, VAL) \
do { ( paca [ ( CPU ) ] . hw_cpu_id = ( VAL ) ) ; } while ( 0 )
2005-11-07 05:18:13 +03:00
extern void smp_release_cpus ( void ) ;
2005-11-05 02:33:55 +03:00
# else
/* 32-bit */
# ifndef CONFIG_SMP
2006-03-25 09:25:17 +03:00
extern int boot_cpuid_phys ;
2005-11-05 02:33:55 +03:00
# define get_hard_smp_processor_id(cpu) boot_cpuid_phys
# define set_hard_smp_processor_id(cpu, phys)
# endif
# endif
2005-04-17 02:20:36 +04:00
extern int smt_enabled_at_boot ;
extern int smp_mpic_probe ( void ) ;
extern void smp_mpic_setup_cpu ( int cpu ) ;
extern void smp_generic_kick_cpu ( int nr ) ;
extern void smp_generic_give_timebase ( void ) ;
extern void smp_generic_take_timebase ( void ) ;
extern struct smp_ops_t * smp_ops ;
# endif /* __ASSEMBLY__ */
# endif /* __KERNEL__ */
2005-11-05 02:33:55 +03:00
# endif /* _ASM_POWERPC_SMP_H) */