Skip to content
Snippets Groups Projects
Commit 1922df20 authored by Miquel Raynal's avatar Miquel Raynal Committed by Tom Rini
Browse files

tpm: add TPM2_Startup command support


Add support for the TPM2_Startup command.

Change the command file and the help accordingly.

Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
Reviewed-by: default avatarTom Rini <trini@konsulko.com>
parent bcdf6b9f
No related branches found
No related tags found
No related merge requests found
...@@ -11,9 +11,30 @@ ...@@ -11,9 +11,30 @@
#include <tpm-v2.h> #include <tpm-v2.h>
#include "tpm-user-utils.h" #include "tpm-user-utils.h"
static int do_tpm2_startup(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[])
{
enum tpm2_startup_types mode;
if (argc != 2)
return CMD_RET_USAGE;
if (!strcasecmp("TPM2_SU_CLEAR", argv[1])) {
mode = TPM2_SU_CLEAR;
} else if (!strcasecmp("TPM2_SU_STATE", argv[1])) {
mode = TPM2_SU_STATE;
} else {
printf("Couldn't recognize mode string: %s\n", argv[1]);
return CMD_RET_FAILURE;
}
return report_return_code(tpm2_startup(mode));
}
static cmd_tbl_t tpm2_commands[] = { static cmd_tbl_t tpm2_commands[] = {
U_BOOT_CMD_MKENT(info, 0, 1, do_tpm_info, "", ""), U_BOOT_CMD_MKENT(info, 0, 1, do_tpm_info, "", ""),
U_BOOT_CMD_MKENT(init, 0, 1, do_tpm_init, "", ""), U_BOOT_CMD_MKENT(init, 0, 1, do_tpm_init, "", ""),
U_BOOT_CMD_MKENT(startup, 0, 1, do_tpm2_startup, "", ""),
}; };
cmd_tbl_t *get_tpm_commands(unsigned int *size) cmd_tbl_t *get_tpm_commands(unsigned int *size)
...@@ -30,4 +51,9 @@ U_BOOT_CMD(tpm, CONFIG_SYS_MAXARGS, 1, do_tpm, "Issue a TPMv2.x command", ...@@ -30,4 +51,9 @@ U_BOOT_CMD(tpm, CONFIG_SYS_MAXARGS, 1, do_tpm, "Issue a TPMv2.x command",
" Show information about the TPM.\n" " Show information about the TPM.\n"
"init\n" "init\n"
" Initialize the software stack. Always the first command to issue.\n" " Initialize the software stack. Always the first command to issue.\n"
"startup <mode>\n"
" Issue a TPM2_Startup command.\n"
" <mode> is one of:\n"
" * TPM2_SU_CLEAR (reset state)\n"
" * TPM2_SU_STATE (preserved state)\n"
); );
...@@ -125,4 +125,13 @@ enum tpm2_algorithms { ...@@ -125,4 +125,13 @@ enum tpm2_algorithms {
TPM2_ALG_NULL = 0x10, TPM2_ALG_NULL = 0x10,
}; };
/**
* Issue a TPM2_Startup command.
*
* @mode TPM startup mode
*
* @return code of the operation
*/
u32 tpm2_startup(enum tpm2_startup_types mode);
#endif /* __TPM_V2_H */ #endif /* __TPM_V2_H */
...@@ -9,3 +9,24 @@ ...@@ -9,3 +9,24 @@
#include <tpm-common.h> #include <tpm-common.h>
#include <tpm-v2.h> #include <tpm-v2.h>
#include "tpm-utils.h" #include "tpm-utils.h"
u32 tpm2_startup(enum tpm2_startup_types mode)
{
const u8 command_v2[12] = {
tpm_u16(TPM2_ST_NO_SESSIONS),
tpm_u32(12),
tpm_u32(TPM2_CC_STARTUP),
tpm_u16(mode),
};
int ret;
/*
* Note TPM2_Startup command will return RC_SUCCESS the first time,
* but will return RC_INITIALIZE otherwise.
*/
ret = tpm_sendrecv_command(command_v2, NULL, NULL);
if (ret && ret != TPM2_RC_INITIALIZE)
return ret;
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment