coreboot/src/include/timestamp.h
Arthur Heymans a2bc2540c2 Allow to build romstage sources inside the bootblock
Having a separate romstage is only desirable:
 - with advanced setups like vboot or normal/fallback
 - boot medium is slow at startup (some ARM SOCs)
 - bootblock is limited in size (Intel APL 32K)

When this is not the case there is no need for the extra complexity
that romstage brings. Including the romstage sources inside the
bootblock substantially reduces the total code footprint. Often the
resulting code is 10-20k smaller.

This is controlled via a Kconfig option.

TESTED: works on qemu x86, arm and aarch64 with and without VBOOT.

Change-Id: Id68390edc1ba228b121cca89b80c64a92553e284
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/55068
Reviewed-by: Julius Werner <jwerner@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
2023-11-09 13:20:18 +00:00

59 lines
1.9 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef __TIMESTAMP_H__
#define __TIMESTAMP_H__
#include <commonlib/timestamp_serialized.h>
#include <stdint.h>
#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