 c73deb6aec
			
		
	
	
	c73deb6aec
	
	
	
		
			
			For modern CPUs, perf clock is directly related to TSC. TSC can be calculated from perf clock and vice versa using a simple calculation. Two of the three componenets of that calculation are already exported in struct perf_event_mmap_page. This patch exports the third. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: "H. Peter Anvin" <hpa@zytor.com> Link: http://lkml.kernel.org/r/1372425741-1676-3-git-send-email-adrian.hunter@intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
		
			
				
	
	
		
			68 lines
		
	
	
	
		
			1.4 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			1.4 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * x86 TSC related functions
 | |
|  */
 | |
| #ifndef _ASM_X86_TSC_H
 | |
| #define _ASM_X86_TSC_H
 | |
| 
 | |
| #include <asm/processor.h>
 | |
| 
 | |
| #define NS_SCALE	10 /* 2^10, carefully chosen */
 | |
| #define US_SCALE	32 /* 2^32, arbitralrily chosen */
 | |
| 
 | |
| /*
 | |
|  * Standard way to access the cycle counter.
 | |
|  */
 | |
| typedef unsigned long long cycles_t;
 | |
| 
 | |
| extern unsigned int cpu_khz;
 | |
| extern unsigned int tsc_khz;
 | |
| 
 | |
| extern void disable_TSC(void);
 | |
| 
 | |
| static inline cycles_t get_cycles(void)
 | |
| {
 | |
| 	unsigned long long ret = 0;
 | |
| 
 | |
| #ifndef CONFIG_X86_TSC
 | |
| 	if (!cpu_has_tsc)
 | |
| 		return 0;
 | |
| #endif
 | |
| 	rdtscll(ret);
 | |
| 
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| static __always_inline cycles_t vget_cycles(void)
 | |
| {
 | |
| 	/*
 | |
| 	 * We only do VDSOs on TSC capable CPUs, so this shouldn't
 | |
| 	 * access boot_cpu_data (which is not VDSO-safe):
 | |
| 	 */
 | |
| #ifndef CONFIG_X86_TSC
 | |
| 	if (!cpu_has_tsc)
 | |
| 		return 0;
 | |
| #endif
 | |
| 	return (cycles_t)__native_read_tsc();
 | |
| }
 | |
| 
 | |
| extern void tsc_init(void);
 | |
| extern void mark_tsc_unstable(char *reason);
 | |
| extern int unsynchronized_tsc(void);
 | |
| extern int check_tsc_unstable(void);
 | |
| extern int check_tsc_disabled(void);
 | |
| extern unsigned long native_calibrate_tsc(void);
 | |
| 
 | |
| extern int tsc_clocksource_reliable;
 | |
| 
 | |
| /*
 | |
|  * Boot-time check whether the TSCs are synchronized across
 | |
|  * all CPUs/cores:
 | |
|  */
 | |
| extern void check_tsc_sync_source(int cpu);
 | |
| extern void check_tsc_sync_target(void);
 | |
| 
 | |
| extern int notsc_setup(char *);
 | |
| extern void tsc_save_sched_clock_state(void);
 | |
| extern void tsc_restore_sched_clock_state(void);
 | |
| 
 | |
| #endif /* _ASM_X86_TSC_H */
 |