diff options
-rw-r--r-- | board/cr50/board.c | 8 | ||||
-rw-r--r-- | common/tpm_registers.c | 7 | ||||
-rw-r--r-- | include/tpm_registers.h | 7 |
3 files changed, 19 insertions, 3 deletions
diff --git a/board/cr50/board.c b/board/cr50/board.c index e370973778..b232633a87 100644 --- a/board/cr50/board.c +++ b/board/cr50/board.c @@ -390,9 +390,13 @@ void sys_rst_asserted(enum gpio_signal signal) * Cr50 drives SYS_RST_L in certain scenarios, in those cases * this signal's assertion should be ignored here. */ - CPRINTS("%s", __func__); - if (usb_spi_update_in_progress() || is_sys_rst_asserted()) + CPRINTS("%s from %d", __func__, signal); + if (usb_spi_update_in_progress() || + is_sys_rst_asserted() || + tpm_is_resetting()) { + CPRINTS("%s ignored", __func__); return; + } /* Re-initialize the TPM software state */ tpm_reset(); diff --git a/common/tpm_registers.c b/common/tpm_registers.c index a2bdec4925..0e2733b472 100644 --- a/common/tpm_registers.c +++ b/common/tpm_registers.c @@ -625,6 +625,11 @@ int tpm_reset(void) return 1; } +int tpm_is_resetting(void) +{ + return reset_in_progress; +} + static void tpm_reset_now(void) { reset_in_progress = 1; @@ -659,7 +664,7 @@ static void tpm_reset_now(void) void tpm_task(void) { - tpm_init(); + tpm_reset_now(); while (1) { uint8_t *response; unsigned response_size; diff --git a/include/tpm_registers.h b/include/tpm_registers.h index 9c9390ffb7..dfdfefdc34 100644 --- a/include/tpm_registers.h +++ b/include/tpm_registers.h @@ -42,6 +42,13 @@ void tpm_register_interface(interface_restart_func interface_restart); int tpm_reset(void); /* + * Return true if tpm is being reset. Usually this helps to avoid unnecessary + * extra reset early at startup time, when TPM could be busy installing + * endorsement certificates. + */ +int tpm_is_resetting(void); + +/* * This structure describes the header of all commands and responses sent and * received over TPM FIFO. * |