From a2f08aa5c4420053d80ca23992b9e61888976f7c Mon Sep 17 00:00:00 2001 From: Jon Murphy Date: Tue, 5 Sep 2023 11:43:14 -0600 Subject: drivers/tpm: Add tpm failure handling Add additional failure mode logic for the TPM to enable an automated recovery mode for GSC hangs. BUG=b:296439237 TEST=Force the error by hard coding the return code and observe the device entering hibernate. BRANCH=None Change-Id: Ieec7e9227d538130354dea8b772d0306cdda1237 Signed-off-by: Jon Murphy Reviewed-on: https://review.coreboot.org/c/coreboot/+/77667 Reviewed-by: Eric Lai Reviewed-by: Julius Werner Tested-by: build bot (Jenkins) --- src/security/vboot/vboot_logic.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/security/vboot/vboot_logic.c') diff --git a/src/security/vboot/vboot_logic.c b/src/security/vboot/vboot_logic.c index ab38085f48..11983b9e1e 100644 --- a/src/security/vboot/vboot_logic.c +++ b/src/security/vboot/vboot_logic.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -271,9 +272,23 @@ void verstage_main(void) * check the return value here because vb2api_fw_phase1 will catch * invalid secdata and tell us what to do (=reboot). */ timestamp_add_now(TS_TPMINIT_START); - if (vboot_setup_tpm(ctx) == TPM_SUCCESS) { + rv = vboot_setup_tpm(ctx); + if (rv == TPM_SUCCESS) { antirollback_read_space_firmware(ctx); antirollback_read_space_kernel(ctx); + } else { + vb2api_fail(ctx, VB2_RECOVERY_RO_TPM_S_ERROR, rv); + if (CONFIG(TPM_SETUP_HIBERNATE_ON_ERR) && + rv == TPM_CB_COMMUNICATION_ERROR) { + printk(BIOS_ERR, "Failed to communicate with TPM\n" + "Next reboot will hibernate to reset TPM"); + /* Command the EC to hibernate on next AP shutdown */ + if (google_chromeec_reboot( + EC_REBOOT_HIBERNATE, + EC_REBOOT_FLAG_ON_AP_SHUTDOWN)) { + printk(BIOS_ERR, "Failed to get EC to schedule hibernate"); + } + } } timestamp_add_now(TS_TPMINIT_END); -- cgit v1.2.3