mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 19:11:53 +00:00
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>
This commit is contained in:
parent
57be9172fc
commit
2f899e03a9
2 changed files with 29 additions and 0 deletions
|
@ -68,4 +68,16 @@ int video_init(void);
|
||||||
void board_init_f_r_trampoline(ulong) __attribute__ ((noreturn));
|
void board_init_f_r_trampoline(ulong) __attribute__ ((noreturn));
|
||||||
void board_init_f_r(void) __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_ */
|
#endif /* _U_BOOT_I386_H_ */
|
||||||
|
|
|
@ -37,6 +37,7 @@ struct timer_isr_function {
|
||||||
|
|
||||||
static struct timer_isr_function *first_timer_isr;
|
static struct timer_isr_function *first_timer_isr;
|
||||||
static unsigned long system_ticks;
|
static unsigned long system_ticks;
|
||||||
|
static uint64_t base_value;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* register_timer_isr() allows multiple architecture and board specific
|
* register_timer_isr() allows multiple architecture and board specific
|
||||||
|
@ -98,3 +99,19 @@ ulong get_timer(ulong base)
|
||||||
{
|
{
|
||||||
return system_ticks - 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;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue