summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2012-10-23 18:04:32 +0000
committerSimon Glass <sjg@chromium.org>2012-12-06 14:30:38 -0800
commit2f899e03a94cac4b092e4c013c6afda73178cc9f (patch)
tree0b849b105c20f56c6b173f11bb2beeee4e0d4928 /arch
parent57be9172fc87fa156973faadb7b74c36ae5c52e7 (diff)
downloadu-boot-imx-2f899e03a94cac4b092e4c013c6afda73178cc9f.zip
u-boot-imx-2f899e03a94cac4b092e4c013c6afda73178cc9f.tar.gz
u-boot-imx-2f899e03a94cac4b092e4c013c6afda73178cc9f.tar.bz2
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>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/include/asm/u-boot-x86.h12
-rw-r--r--arch/x86/lib/timer.c17
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 a4a5ae0..11be5c3 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 fd7032e..a13424b 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;
+}