summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 57be917)
raw | patch | inline | side by side (parent: 57be917)
author | Vadim Bendebury <vbendeb@chromium.org> | |
Tue, 23 Oct 2012 18:04:32 +0000 (18:04 +0000) | ||
committer | Simon Glass <sjg@chromium.org> | |
Thu, 6 Dec 2012 22:30:38 +0000 (14:30 -0800) |
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>
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>
arch/x86/include/asm/u-boot-x86.h | patch | blob | history | |
arch/x86/lib/timer.c | patch | blob | history |
index a4a5ae05d119a92bd456b94b59e6eac7e5231499..11be5c35b562b79a9f4c52ad8df1cbf6c035e4fc 100644 (file)
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 fd7032e92c9f40e007348aac3a249e5078284b82..a13424b3e378ce14819ca445afb9109c60874359 100644 (file)
--- a/arch/x86/lib/timer.c
+++ b/arch/x86/lib/timer.c
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
{
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;
+}