2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 2004 Anton Blanchard < anton @ au . ibm . com > , IBM
*
* Based on alpha version .
*
* 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-09-19 17:21:15 +04:00
# ifndef _ASM_POWERPC_OPROFILE_IMPL_H
# define _ASM_POWERPC_OPROFILE_IMPL_H
2005-12-17 00:43:46 +03:00
# ifdef __KERNEL__
2005-04-17 02:20:36 +04:00
# define OP_MAX_COUNTER 8
/* Per-counter configuration as set via oprofilefs. */
struct op_counter_config {
unsigned long enabled ;
unsigned long event ;
unsigned long count ;
2005-12-16 05:02:04 +03:00
/* Classic doesn't support per-counter user/kernel selection */
2005-04-17 02:20:36 +04:00
unsigned long kernel ;
unsigned long user ;
unsigned long unit_mask ;
} ;
/* System-wide configuration as set via oprofilefs. */
struct op_system_config {
2005-12-16 05:02:04 +03:00
# ifdef CONFIG_PPC64
2005-04-17 02:20:36 +04:00
unsigned long mmcr0 ;
unsigned long mmcr1 ;
unsigned long mmcra ;
2005-09-19 17:21:15 +04:00
# endif
2005-04-17 02:20:36 +04:00
unsigned long enable_kernel ;
unsigned long enable_user ;
} ;
/* Per-arch configuration */
2005-09-19 17:18:31 +04:00
struct op_powerpc_model {
2005-04-17 02:20:36 +04:00
void ( * reg_setup ) ( struct op_counter_config * ,
struct op_system_config * ,
int num_counters ) ;
void ( * cpu_setup ) ( void * ) ;
void ( * start ) ( struct op_counter_config * ) ;
void ( * stop ) ( void ) ;
void ( * handle_interrupt ) ( struct pt_regs * ,
struct op_counter_config * ) ;
int num_counters ;
} ;
2005-12-16 05:02:04 +03:00
extern struct op_powerpc_model op_model_fsl_booke ;
2005-09-19 17:18:31 +04:00
extern struct op_powerpc_model op_model_rs64 ;
extern struct op_powerpc_model op_model_power4 ;
2005-12-16 05:02:04 +03:00
extern struct op_powerpc_model op_model_7450 ;
2006-03-27 04:23:29 +04:00
# ifndef CONFIG_FSL_BOOKE
2005-12-16 05:02:04 +03:00
/* All the classic PPC parts use these */
2005-04-17 02:20:36 +04:00
static inline unsigned int ctr_read ( unsigned int i )
{
switch ( i ) {
case 0 :
return mfspr ( SPRN_PMC1 ) ;
case 1 :
return mfspr ( SPRN_PMC2 ) ;
case 2 :
return mfspr ( SPRN_PMC3 ) ;
case 3 :
return mfspr ( SPRN_PMC4 ) ;
case 4 :
return mfspr ( SPRN_PMC5 ) ;
case 5 :
return mfspr ( SPRN_PMC6 ) ;
2005-12-16 05:02:04 +03:00
/* No PPC32 chip has more than 6 so far */
# ifdef CONFIG_PPC64
2005-04-17 02:20:36 +04:00
case 6 :
return mfspr ( SPRN_PMC7 ) ;
case 7 :
return mfspr ( SPRN_PMC8 ) ;
2005-12-16 05:02:04 +03:00
# endif
2005-04-17 02:20:36 +04:00
default :
return 0 ;
}
}
static inline void ctr_write ( unsigned int i , unsigned int val )
{
switch ( i ) {
case 0 :
mtspr ( SPRN_PMC1 , val ) ;
break ;
case 1 :
mtspr ( SPRN_PMC2 , val ) ;
break ;
case 2 :
mtspr ( SPRN_PMC3 , val ) ;
break ;
case 3 :
mtspr ( SPRN_PMC4 , val ) ;
break ;
case 4 :
mtspr ( SPRN_PMC5 , val ) ;
break ;
case 5 :
mtspr ( SPRN_PMC6 , val ) ;
break ;
2005-12-16 05:02:04 +03:00
/* No PPC32 chip has more than 6, yet */
# ifdef CONFIG_PPC64
2005-04-17 02:20:36 +04:00
case 6 :
mtspr ( SPRN_PMC7 , val ) ;
break ;
case 7 :
mtspr ( SPRN_PMC8 , val ) ;
break ;
2005-12-16 05:02:04 +03:00
# endif
2005-04-17 02:20:36 +04:00
default :
break ;
}
}
2005-12-16 05:02:04 +03:00
# endif /* !CONFIG_FSL_BOOKE */
2005-04-17 02:20:36 +04:00
2006-03-27 04:57:01 +04:00
extern void op_powerpc_backtrace ( struct pt_regs * const regs , unsigned int depth ) ;
2005-12-17 00:43:46 +03:00
# endif /* __KERNEL__ */
2005-09-19 17:21:15 +04:00
# endif /* _ASM_POWERPC_OPROFILE_IMPL_H */