Felix Held has submitted this change. ( https://review.coreboot.org/c/coreboot/+/47976 )
Change subject: soc/amd: move vboot-on-PSP-related functions to common/vboot ......................................................................
soc/amd: move vboot-on-PSP-related functions to common/vboot
Change-Id: I4f07d3ab12116229a13d2e8c02b2deb06e51a1af Signed-off-by: Felix Held felix-coreboot@felixheld.de Reviewed-on: https://review.coreboot.org/c/coreboot/+/47976 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Martin Roth martinroth@google.com --- M src/soc/amd/common/vboot/vboot_bootblock.c M src/soc/amd/picasso/bootblock/bootblock.c M src/soc/amd/picasso/include/soc/psp_transfer.h 3 files changed, 52 insertions(+), 50 deletions(-)
Approvals: build bot (Jenkins): Verified Martin Roth: Looks good to me, approved
diff --git a/src/soc/amd/common/vboot/vboot_bootblock.c b/src/soc/amd/common/vboot/vboot_bootblock.c index 3fbc4ef..45ad9de 100644 --- a/src/soc/amd/common/vboot/vboot_bootblock.c +++ b/src/soc/amd/common/vboot/vboot_bootblock.c @@ -2,13 +2,23 @@
#include <amdblocks/reset.h> #include <bl_uapp/bl_syscall_public.h> +#include <bootblock_common.h> #include <console/console.h> #include <pc80/mc146818rtc.h> #include <security/vboot/vbnv.h> #include <security/vboot/symbols.h> #include <soc/psp_transfer.h> +#include <timestamp.h> #include <2struct.h>
+static int transfer_buffer_valid(const struct transfer_info_struct *ptr) +{ + if (ptr->magic_val == TRANSFER_MAGIC_VAL) + return 1; + else + return 0; +} + void verify_psp_transfer_buf(void) { if (*(uint32_t *)_vboot2_work == VB2_SHARED_DATA_MAGIC) { @@ -51,3 +61,43 @@ "Production" : "Pre-Production"); } } + +void boot_with_psp_timestamp(uint64_t base_timestamp) +{ + const struct transfer_info_struct *info = (const struct transfer_info_struct *) + (void *)(uintptr_t)_transfer_buffer; + + if (!transfer_buffer_valid(info) || info->timestamp == 0) + return; + + /* + * info->timestamp is PSP's timestamp (in microseconds) + * when x86 processor is released. + */ + uint64_t psp_last_ts = info->timestamp; + + int i; + struct timestamp_table *psp_ts_table = + (struct timestamp_table *)(void *) + ((uintptr_t)_transfer_buffer + info->timestamp_offset); + /* new base_timestamp will be offset for all PSP timestamps. */ + base_timestamp -= psp_last_ts; + + for (i = 0; i < psp_ts_table->num_entries; i++) { + struct timestamp_entry *tse = &psp_ts_table->entries[i]; + /* + * We ignore the time between x86 processor release and bootblock. + * Since timestamp_add subtracts base_time, we first add old base_time + * to make it absolute then add base_timestamp again since + * it'll be a new base_time. + * + * We don't need to convert unit since both PSP and coreboot + * will use 1us granularity. + * + */ + tse->entry_stamp += psp_ts_table->base_time + base_timestamp; + } + + bootblock_main_with_timestamp(base_timestamp, psp_ts_table->entries, + psp_ts_table->num_entries); +} diff --git a/src/soc/amd/picasso/bootblock/bootblock.c b/src/soc/amd/picasso/bootblock/bootblock.c index 4bff042..0b52a17 100644 --- a/src/soc/amd/picasso/bootblock/bootblock.c +++ b/src/soc/amd/picasso/bootblock/bootblock.c @@ -3,7 +3,6 @@ #include <stdint.h> #include <symbols.h> #include <amdblocks/reset.h> -#include <timestamp.h> #include <bootblock_common.h> #include <console/console.h> #include <cpu/x86/cache.h> @@ -18,7 +17,6 @@ #include <soc/i2c.h> #include <amdblocks/amd_pci_mmconf.h> #include <acpi/acpi.h> -#include <security/vboot/vbnv.h>
asmlinkage void bootblock_resume_entry(void);
@@ -110,54 +108,6 @@ wrmsr(S3_RESUME_EIP_MSR, s3_resume_entry); }
-static int transfer_buffer_valid(const struct transfer_info_struct *ptr) -{ - if (ptr->magic_val == TRANSFER_MAGIC_VAL) - return 1; - else - return 0; -} - -static void boot_with_psp_timestamp(uint64_t base_timestamp) -{ - const struct transfer_info_struct *info = (const struct transfer_info_struct *) - (void *)(uintptr_t)_transfer_buffer; - - if (!transfer_buffer_valid(info) || info->timestamp == 0) - return; - - /* - * info->timestamp is PSP's timestamp (in microseconds) - * when x86 processor is released. - */ - uint64_t psp_last_ts = info->timestamp; - - int i; - struct timestamp_table *psp_ts_table = - (struct timestamp_table *)(void *) - ((uintptr_t)_transfer_buffer + info->timestamp_offset); - /* new base_timestamp will be offset for all PSP timestamps. */ - base_timestamp -= psp_last_ts; - - for (i = 0; i < psp_ts_table->num_entries; i++) { - struct timestamp_entry *tse = &psp_ts_table->entries[i]; - /* - * We ignore the time between x86 processor release and bootblock. - * Since timestamp_add subtracts base_time, we first add old base_time - * to make it absolute then add base_timestamp again since - * it'll be a new base_time. - * - * We don't need to convert unit since both PSP and coreboot - * will use 1us granularity. - * - */ - tse->entry_stamp += psp_ts_table->base_time + base_timestamp; - } - - bootblock_main_with_timestamp(base_timestamp, psp_ts_table->entries, - psp_ts_table->num_entries); -} - asmlinkage void bootblock_c_entry(uint64_t base_timestamp) { set_caching(); diff --git a/src/soc/amd/picasso/include/soc/psp_transfer.h b/src/soc/amd/picasso/include/soc/psp_transfer.h index ce197c1..8c78496 100644 --- a/src/soc/amd/picasso/include/soc/psp_transfer.h +++ b/src/soc/amd/picasso/include/soc/psp_transfer.h @@ -46,6 +46,8 @@ void verify_psp_transfer_buf(void); /* Display the transfer block's PSP_info data */ void show_psp_transfer_info(void); +/* Called by bootblock_c_entry in the VBOOT_STARTS_BEFORE_BOOTBLOCK case */ +void boot_with_psp_timestamp(uint64_t base_timestamp);
#endif