bootstage: Define an optional microsecond timer
authorSimon Glass <sjg@chromium.org>
Sat, 10 Dec 2011 11:08:03 +0000 (11:08 +0000)
committerWolfgang Denk <wd@denx.de>
Sun, 18 Mar 2012 20:33:53 +0000 (21:33 +0100)
Define timer_get_boot_us() which returns the number of microseconds
since boot. If undefined then we use get_timer() * 1000.

We can fit this in a 32-bit register which keeps everyone happy on
the efficiency side. It will wrap around after about an hour. If we
are still looking at it after an hour then we had better not be
timing the boot.

Signed-off-by: Simon Glass <sjg@chromium.org>
include/common.h
lib/time.c

index 399363af1c92a994eb80d2cb241aa5454524e13b..85eaa77aafabbfd747691f9cc2a32b11b78405cc 100644 (file)
@@ -206,6 +206,13 @@ typedef void (interrupt_handler_t)(void *);
 
 #endif /* CONFIG_SERIAL_MULTI */
 
+/*
+ * Return the time since boot in microseconds, This is needed for bootstage
+ * and should be defined in CPU- or board-specific code. If undefined then
+ * millisecond resolution will be used (the standard get_timer()).
+ */
+ulong timer_get_boot_us(void);
+
 /*
  * General Purpose Utilities
  */
index 6e2937b8e726d4f2ffc009d91f6f4ff53a432c6f..69edc3d39b2563a367e03b2e410d4946fe3b0ca6 100644 (file)
@@ -47,3 +47,20 @@ void mdelay(unsigned long msec)
        while (msec--)
                udelay(1000);
 }
+
+ulong __timer_get_boot_us(void)
+{
+       static ulong base_time;
+
+       /*
+        * We can't implement this properly. Return 0 on the first call and
+        * larger values after that.
+        */
+       if (base_time)
+               return get_timer(base_time) * 1000;
+       base_time = get_timer(0);
+       return 0;
+}
+
+ulong timer_get_boot_us(void)
+       __attribute__((weak, alias("__timer_get_boot_us")));