diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/timestamp.h | 10 | ||||
-rw-r--r-- | src/lib/timestamp.c | 14 |
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) |