2008-12-17 11:02:19 +03:00
# ifndef _ASM_X86_PERF_COUNTER_H
# define _ASM_X86_PERF_COUNTER_H
2007-10-15 15:57:47 +04:00
2008-12-17 11:09:13 +03:00
/*
* Performance counter hw details :
*/
# define X86_PMC_MAX_GENERIC 8
# define X86_PMC_MAX_FIXED 3
2008-12-17 15:09:20 +03:00
# define X86_PMC_IDX_GENERIC 0
# define X86_PMC_IDX_FIXED 32
# define X86_PMC_IDX_MAX 64
2008-12-03 12:39:53 +03:00
# define MSR_ARCH_PERFMON_PERFCTR0 0xc1
# define MSR_ARCH_PERFMON_PERFCTR1 0xc2
2007-10-15 15:57:47 +04:00
2008-12-03 12:39:53 +03:00
# define MSR_ARCH_PERFMON_EVENTSEL0 0x186
# define MSR_ARCH_PERFMON_EVENTSEL1 0x187
2007-10-15 15:57:47 +04:00
2008-12-03 12:39:53 +03:00
# define ARCH_PERFMON_EVENTSEL0_ENABLE (1 << 22)
# define ARCH_PERFMON_EVENTSEL_INT (1 << 20)
# define ARCH_PERFMON_EVENTSEL_OS (1 << 17)
# define ARCH_PERFMON_EVENTSEL_USR (1 << 16)
2007-10-15 15:57:47 +04:00
2008-12-22 13:10:42 +03:00
/*
* Includes eventsel and unit mask as well :
*/
# define ARCH_PERFMON_EVENT_MASK 0xffff
2008-12-03 12:39:53 +03:00
# define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL 0x3c
# define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8)
# define ARCH_PERFMON_UNHALTED_CORE_CYCLES_INDEX 0
2007-10-15 15:57:47 +04:00
# define ARCH_PERFMON_UNHALTED_CORE_CYCLES_PRESENT \
2008-12-03 12:39:53 +03:00
( 1 < < ( ARCH_PERFMON_UNHALTED_CORE_CYCLES_INDEX ) )
# define ARCH_PERFMON_BRANCH_MISSES_RETIRED 6
2007-10-15 15:57:47 +04:00
2008-12-17 11:09:13 +03:00
/*
* Intel " Architectural Performance Monitoring " CPUID
* detection / enumeration details :
*/
2007-10-15 15:57:47 +04:00
union cpuid10_eax {
struct {
unsigned int version_id : 8 ;
unsigned int num_counters : 8 ;
unsigned int bit_width : 8 ;
unsigned int mask_length : 8 ;
} split ;
unsigned int full ;
} ;
2008-12-17 12:51:15 +03:00
union cpuid10_edx {
struct {
unsigned int num_counters_fixed : 4 ;
unsigned int reserved : 28 ;
} split ;
unsigned int full ;
} ;
/*
* Fixed - purpose performance counters :
*/
2008-12-17 15:09:20 +03:00
/*
* All 3 fixed - mode PMCs are configured via this single MSR :
*/
# define MSR_ARCH_PERFMON_FIXED_CTR_CTRL 0x38d
/*
* The counts are available in three separate MSRs :
*/
2008-12-17 12:51:15 +03:00
/* Instr_Retired.Any: */
# define MSR_ARCH_PERFMON_FIXED_CTR0 0x309
2008-12-22 13:10:42 +03:00
# define X86_PMC_IDX_FIXED_INSTRUCTIONS (X86_PMC_IDX_FIXED + 0)
2008-12-17 12:51:15 +03:00
/* CPU_CLK_Unhalted.Core: */
# define MSR_ARCH_PERFMON_FIXED_CTR1 0x30a
2008-12-22 13:10:42 +03:00
# define X86_PMC_IDX_FIXED_CPU_CYCLES (X86_PMC_IDX_FIXED + 1)
2008-12-17 12:51:15 +03:00
/* CPU_CLK_Unhalted.Ref: */
# define MSR_ARCH_PERFMON_FIXED_CTR2 0x30b
2008-12-22 13:10:42 +03:00
# define X86_PMC_IDX_FIXED_BUS_CYCLES (X86_PMC_IDX_FIXED + 2)
2008-12-17 12:51:15 +03:00
2008-12-03 12:39:53 +03:00
# ifdef CONFIG_PERF_COUNTERS
extern void init_hw_perf_counters ( void ) ;
2009-05-29 09:28:35 +04:00
extern void perf_counters_lapic_init ( void ) ;
2008-12-03 12:39:53 +03:00
# else
static inline void init_hw_perf_counters ( void ) { }
2009-05-29 09:28:35 +04:00
static inline void perf_counters_lapic_init ( void ) { }
2008-12-03 12:39:53 +03:00
# endif
2008-12-17 11:02:19 +03:00
# endif /* _ASM_X86_PERF_COUNTER_H */