diff options
Diffstat (limited to 'common/tpm_registers.c')
-rw-r--r-- | common/tpm_registers.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/common/tpm_registers.c b/common/tpm_registers.c index d2862d5814..db2cba9b88 100644 --- a/common/tpm_registers.c +++ b/common/tpm_registers.c @@ -85,6 +85,7 @@ #define TPM_DID_VID (0xf00) #define TPM_RID (0xf04) #define TPM_FW_VER (0xf90) +#define TPM_BOARD_CFG (0xfe0) #define GOOGLE_VID 0x1ae0 #define GOOGLE_DID 0x0028 @@ -417,6 +418,17 @@ static void fifo_reg_write(const uint8_t *data, uint32_t data_size) tpm_.regs.sts &= ~expect; } +/* Collect received data and write that value on TPM_BOARD_CFG register. */ +static void board_cfg_reg_write_(const uint8_t *data, uint32_t data_size) +{ + uint32_t value = 0; + + data_size = MIN(data_size, sizeof(value)); + memcpy(&value, data, data_size); + + board_cfg_reg_write(value); +} + /* TODO: data_size is between 1 and 64, but is not trustworthy! Don't write * past the end of any actual registers if data_size is larger than the spec * allows. */ @@ -446,6 +458,9 @@ void tpm_register_put(uint32_t regaddr, const uint8_t *data, uint32_t data_size) /* Reset read byte count */ tpm_fw_ver_index = 0; break; + case TPM_BOARD_CFG: + board_cfg_reg_write_(data, data_size); + break; default: CPRINTF("%s(0x%06x, %d bytes:", __func__, regaddr, data_size); for (i = 0; i < data_size; i++) @@ -539,6 +554,9 @@ void tpm_register_get(uint32_t regaddr, uint8_t *dest, uint32_t data_size) *dest++ = 0; } break; + case TPM_BOARD_CFG: + copy_bytes(dest, data_size, board_cfg_reg_read()); + break; default: CPRINTS("%s(0x%06x, %d) => ??", __func__, regaddr, data_size); return; @@ -1033,6 +1051,13 @@ void tpm_task(void *u) */ if (command_code == TPM2_PCR_Read) system_process_retry_counter(); + else if (command_code == TPM2_PCR_Extend) + /* + * Cr50 recognizes BIOS-RO exit indirectly + * by this command. + */ + board_cfg_reg_write_disable(); + #ifdef CONFIG_EXTENSION_COMMAND if (!IS_CUSTOM_CODE(command_code)) #endif |