summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/timestamp.h10
-rw-r--r--src/lib/timestamp.c14
2 files changed, 24 insertions, 0 deletions
diff --git a/src/include/timestamp.h b/src/include/timestamp.h
index 95470f53d6..db675b5d2b 100644
--- a/src/include/timestamp.h
+++ b/src/include/timestamp.h
@@ -2,6 +2,7 @@
* This file is part of the coreboot project.
*
* Copyright (C) 2011 The ChromiumOS Authors. All rights reserved.
+ * Copyright 2017 Siemens AG.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -40,11 +41,20 @@ void timestamp_add_now(enum timestamp_id id);
/* Apply a factor of N/M to all timestamps recorded so far. */
void timestamp_rescale_table(uint16_t N, uint16_t M);
+/*
+ * Get the time since boot scaled in microseconds. Therefore use the base time
+ * of the timestamps to get the initial value which is subtracted from
+ * current timestamp at call time. This will provide a more reliable value even
+ * if the TSC is not reset on soft reset or warm start.
+ */
+uint32_t get_us_since_boot(void);
+
#else
#define timestamp_init(base)
#define timestamp_add(id, time)
#define timestamp_add_now(id)
#define timestamp_rescale_table(N, M)
+#define get_us_since_boot() 0
#endif
/* Implemented by the architecture code */
diff --git a/src/lib/timestamp.c b/src/lib/timestamp.c
index 30f7c13fb8..2e14fdd647 100644
--- a/src/lib/timestamp.c
+++ b/src/lib/timestamp.c
@@ -2,6 +2,7 @@
* This file is part of the coreboot project.
*
* Copyright (C) 2011 The ChromiumOS Authors. All rights reserved.
+ * Copyright 2017 Siemens AG.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -327,6 +328,19 @@ void timestamp_rescale_table(uint16_t N, uint16_t M)
}
}
+/*
+ * Get the time in microseconds since boot (or more precise: since timestamp
+ * table was initialized).
+ */
+uint32_t get_us_since_boot(void)
+{
+ struct timestamp_table *ts = timestamp_table_get();
+
+ if (ts == NULL || ts->tick_freq_mhz == 0)
+ return 0;
+ return (timestamp_get() - ts->base_time) / ts->tick_freq_mhz;
+}
+
ROMSTAGE_CBMEM_INIT_HOOK(timestamp_sync_cache_to_cbmem)
RAMSTAGE_CBMEM_INIT_HOOK(timestamp_sync_cache_to_cbmem)