diff --git a/include/common.h b/include/common.h
index 399363af1c92a994eb80d2cb241aa5454524e13b..85eaa77aafabbfd747691f9cc2a32b11b78405cc 100644
--- a/include/common.h
+++ b/include/common.h
@@ -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
  */
diff --git a/lib/time.c b/lib/time.c
index 6e2937b8e726d4f2ffc009d91f6f4ff53a432c6f..69edc3d39b2563a367e03b2e410d4946fe3b0ca6 100644
--- a/lib/time.c
+++ b/lib/time.c
@@ -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")));