diff options
| author | Vadim Bendebury <vbendeb@chromium.org> | 2012-10-23 18:04:32 +0000 | 
|---|---|---|
| committer | Simon Glass <sjg@chromium.org> | 2012-12-06 14:30:38 -0800 | 
| commit | 2f899e03a94cac4b092e4c013c6afda73178cc9f (patch) | |
| tree | 0b849b105c20f56c6b173f11bb2beeee4e0d4928 | |
| parent | 57be9172fc87fa156973faadb7b74c36ae5c52e7 (diff) | |
| download | olio-uboot-2014.01-2f899e03a94cac4b092e4c013c6afda73178cc9f.tar.xz olio-uboot-2014.01-2f899e03a94cac4b092e4c013c6afda73178cc9f.zip | |
x86: Add function to read time stamp counter
Put this function in the u-boot-x86.h header file. We could instead create
timer.h perhaps.
We support setting a base time, and reading the time relative to this base.
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Signed-off-by: Stefan Reinauer <reinauer@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
| -rw-r--r-- | arch/x86/include/asm/u-boot-x86.h | 12 | ||||
| -rw-r--r-- | arch/x86/lib/timer.c | 17 | 
2 files changed, 29 insertions, 0 deletions
| diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h index a4a5ae05d..11be5c35b 100644 --- a/arch/x86/include/asm/u-boot-x86.h +++ b/arch/x86/include/asm/u-boot-x86.h @@ -68,4 +68,16 @@ int video_init(void);  void	board_init_f_r_trampoline(ulong) __attribute__ ((noreturn));  void	board_init_f_r(void) __attribute__ ((noreturn)); +/* Read the time stamp counter */ +static inline uint64_t rdtsc(void) +{ +	uint32_t high, low; +	__asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)); +	return (((uint64_t)high) << 32) | low; +} + +/* board/... */ +void timer_set_tsc_base(uint64_t new_base); +uint64_t timer_get_tsc(void); +  #endif	/* _U_BOOT_I386_H_ */ diff --git a/arch/x86/lib/timer.c b/arch/x86/lib/timer.c index fd7032e92..a13424b3e 100644 --- a/arch/x86/lib/timer.c +++ b/arch/x86/lib/timer.c @@ -37,6 +37,7 @@ struct timer_isr_function {  static struct timer_isr_function *first_timer_isr;  static unsigned long system_ticks; +static uint64_t base_value;  /*   * register_timer_isr() allows multiple architecture and board specific @@ -98,3 +99,19 @@ ulong get_timer(ulong base)  {  	return system_ticks - base;  } + +void timer_set_tsc_base(uint64_t new_base) +{ +	base_value = new_base; +} + +uint64_t timer_get_tsc(void) +{ +	uint64_t time_now; + +	time_now = rdtsc(); +	if (!base_value) +		base_value = time_now; + +	return time_now - base_value; +} |