/* SPDX-License-Identifier: GPL-2.0-only */ #ifndef __TIMESTAMP_H__ #define __TIMESTAMP_H__ #include #include #if CONFIG(COLLECT_TIMESTAMPS) /* * timestamp_init() needs to be called once in *one* of the ENV_ROMSTAGE_OR_BEFORE * stages (bootblock, romstage, verstage, etc). It's up to the chipset/arch * to make the call in the earliest stage, otherwise some timestamps will be lost. * For x86 ENV_BOOTBLOCK / ENV_SEPARATE_ROMSTAGE call must be made before CAR is torn down. */ void timestamp_init(uint64_t base); /* * Add a new timestamp. For ENV_ROMSTAGE_OR_BEFORE, this timestamp will be stored * inside REGION(timestamp) before cbmem comes online. For later stages, timestamps * added before cbmem_[recovery|initialize] calls will be lost. */ void timestamp_add(enum timestamp_id id, int64_t ts_time); /* Calls timestamp_add with current timestamp. */ 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 /** * Workaround for guard combination above. */ #if CONFIG(COLLECT_TIMESTAMPS) /* Implemented by the architecture code */ uint64_t timestamp_get(void); #else #define timestamp_get() 0 #endif uint64_t get_initial_timestamp(void); /* Returns timestamp tick frequency in MHz. */ int timestamp_tick_freq_mhz(void); #endif