diff options
Diffstat (limited to 'src/security/tpm/tss/tcg-2.0/tss.c')
-rw-r--r-- | src/security/tpm/tss/tcg-2.0/tss.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/security/tpm/tss/tcg-2.0/tss.c b/src/security/tpm/tss/tcg-2.0/tss.c index c67fdfaa49..e579bff78e 100644 --- a/src/security/tpm/tss/tcg-2.0/tss.c +++ b/src/security/tpm/tss/tcg-2.0/tss.c @@ -87,6 +87,35 @@ uint32_t tlcl_resume(void) return tlcl_send_startup(TPM_SU_STATE); } +static uint32_t tlcl_send_shutdown(TPM_SU type) +{ + struct tpm2_shutdown shutdown; + struct tpm2_response *response; + + shutdown.shutdown_type = type; + response = tpm_process_command(TPM2_Shutdown, &shutdown); + + /* IO error, tpm2_response pointer is empty. */ + if (response == NULL) { + printk(BIOS_ERR, "%s: TPM communication error\n", __func__); + return TPM_E_IOERROR; + } + + printk(BIOS_INFO, "%s: Shutdown return code is %x\n", + __func__, response->hdr.tpm_code); + + if (response->hdr.tpm_code == TPM2_RC_SUCCESS) + return TPM_SUCCESS; + + /* Collapse any other errors into TPM_E_IOERROR. */ + return TPM_E_IOERROR; +} + +uint32_t tlcl_save_state(void) +{ + return tlcl_send_shutdown(TPM_SU_STATE); +} + uint32_t tlcl_assert_physical_presence(void) { /* |