summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorArthur Heymans <arthur@aheymans.xyz>2020-11-18 12:27:28 +0100
committerPatrick Georgi <pgeorgi@google.com>2020-11-22 22:26:25 +0000
commit02dec12629824174e788658f40b79bdd5337ffa7 (patch)
treeec030bed8bdf56ee589c350c82267d41075bcac6 /src
parent832dd4388a8f8a56acd70da5c1cdfa97deb3bf5d (diff)
downloadcoreboot-02dec12629824174e788658f40b79bdd5337ffa7.tar.gz
coreboot-02dec12629824174e788658f40b79bdd5337ffa7.tar.bz2
coreboot-02dec12629824174e788658f40b79bdd5337ffa7.zip
soc/intel/xeon_sp: Work around FSP-T not respecting its own API
The CPX FSP-T does not respect the FSP2.x spec and uses registers where coreboot has its initial timestamp stored. If the initial timestamp is later than some other timestamps this messes up the timestamps 'cbmem -t' reports as it thinks they are a result from a timestamp overflow (reporting that it took 100k years to boot). TEST: The ocp/deltalake boots within the span of a lifetime. Change-Id: I4ba15decec22cd473e63149ec399d82c5e3fd214 Signed-off-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-on: https://review.coreboot.org/c/coreboot/+/47738 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/soc/intel/xeon_sp/bootblock.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/soc/intel/xeon_sp/bootblock.c b/src/soc/intel/xeon_sp/bootblock.c
index 5adda44d9351..baf5ab5ad9b3 100644
--- a/src/soc/intel/xeon_sp/bootblock.c
+++ b/src/soc/intel/xeon_sp/bootblock.c
@@ -33,11 +33,20 @@ const FSPT_UPD temp_ram_init_params = {
.UpdTerminator = 0x55AA,
};
+static uint64_t assembly_timestamp;
+static uint64_t bootblock_timestamp;
+
asmlinkage void bootblock_c_entry(uint64_t base_timestamp)
{
+ /*
+ * FSP-T does not respect its own API and trashes registers
+ * coreboot uses to store its initial timestamp.
+ */
+ assembly_timestamp = base_timestamp;
+ bootblock_timestamp = timestamp_get();
fast_spi_cache_bios_region();
- bootblock_main_with_basetime(base_timestamp);
+ bootblock_main_with_basetime(MIN(assembly_timestamp, bootblock_timestamp));
}
void bootblock_soc_early_init(void)
@@ -55,6 +64,10 @@ void bootblock_soc_init(void)
{
if (CONFIG(BOOTBLOCK_CONSOLE))
printk(BIOS_DEBUG, "FSP TempRamInit successful...\n");
+
+ if (assembly_timestamp > bootblock_timestamp)
+ printk(BIOS_WARNING, "Invalid initial timestamp detected\n");
+
if (CONFIG(FSP_CAR))
report_fspt_output();
bootblock_pch_init();