diff options
author | Namyoon Woo <namyoon@chromium.org> | 2019-12-06 15:59:15 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-02-22 01:46:38 +0000 |
commit | 9d9c4ca2342d09ccf241173d36d3cf2b16ed3c41 (patch) | |
tree | a8c0914043964dd7e51ce86546e4366d1944074c | |
parent | c5322ba116003017deab926f5d1e9bdd16f649b8 (diff) | |
download | chrome-ec-9d9c4ca2342d09ccf241173d36d3cf2b16ed3c41.tar.gz |
cr50: add TPM vendor-specific commands to support EC-EFS2
Based on the design in go/ec-efs2, this patch adds two TPM
vendor-specific commands:
- VENDOR_CC_GET_BOOT_MODE
- VENDOR_CC_RESET_EC
BUG=b:141578322
BRANCH=cr50
TEST=tested with EC-EFS supporting EC/AP firmware.
With CR50 dev image, tested with gsctool on Octopus and Helios
by sending each of new vendor commands.
Checked flash_ec working on Scarlet in bitbang mode.
Change-Id: Ia8f38a7b9cc45b172a1a1ef7e216034e520b79c7
Signed-off-by: Namyoon Woo <namyoon@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1956409
Reviewed-by: Mary Ruthven <mruthven@chromium.org>
-rw-r--r-- | board/cr50/ec_efs.c | 43 | ||||
-rw-r--r-- | common/extension.c | 2 | ||||
-rw-r--r-- | include/tpm_vendor_cmds.h | 4 |
3 files changed, 49 insertions, 0 deletions
diff --git a/board/cr50/ec_efs.c b/board/cr50/ec_efs.c index 677fb7d7f9..d7919e105c 100644 --- a/board/cr50/ec_efs.c +++ b/board/cr50/ec_efs.c @@ -9,6 +9,7 @@ #include "ec_comm.h" #include "crc8.h" #include "ec_commands.h" +#include "extension.h" #include "hooks.h" #include "registers.h" #include "system.h" @@ -115,6 +116,48 @@ static void ec_efs_init_(void) } DECLARE_HOOK(HOOK_INIT, ec_efs_init_, HOOK_PRIO_DEFAULT); +/** + * TPM vendor command handler to respond with EC Boot Mode. + * + * @return VENDOR_RC_SUCCESS + * + */ +static enum vendor_cmd_rc vc_get_boot_mode_(struct vendor_cmd_params *p) +{ + uint8_t *buffer; + + if (!board_has_ec_cr50_comm_support()) + return VENDOR_RC_NO_SUCH_SUBCOMMAND; + + buffer = (uint8_t *)p->buffer; + buffer[0] = (uint8_t)ec_efs_ctx.boot_mode; + + p->out_size = 1; + + return VENDOR_RC_SUCCESS; +} +DECLARE_VENDOR_COMMAND_P(VENDOR_CC_GET_BOOT_MODE, vc_get_boot_mode_); + +/** + * TPM vendor command handler to reset EC. + * + * @return VEDOR_RC_SUCCESS + */ +static enum vendor_cmd_rc vc_reset_ec_(struct vendor_cmd_params *p) +{ + if (!board_has_ec_cr50_comm_support()) + return VENDOR_RC_NO_SUCH_SUBCOMMAND; + + /* + * Let's reset EC a little later so that CR50 can send a TPM command + * to AP. + */ + board_reboot_ec_deferred(50 * MSEC); + + return VENDOR_RC_SUCCESS; +} +DECLARE_VENDOR_COMMAND_P(VENDOR_CC_RESET_EC, vc_reset_ec_); + void ec_efs_reset(void) { set_boot_mode_(EC_EFS_BOOT_MODE_NORMAL); diff --git a/common/extension.c b/common/extension.c index d2a26a6cd2..5a8daf6210 100644 --- a/common/extension.c +++ b/common/extension.c @@ -34,10 +34,12 @@ uint32_t extension_route_command(struct vendor_cmd_params *p) case VENDOR_CC_SN_SET_HASH: case VENDOR_CC_SN_INC_RMA: case VENDOR_CC_ENDORSEMENT_SEED: + case VENDOR_CC_RESET_EC: #endif /* defined(CR50_DEV) */ case EXTENSION_POST_RESET: /* Always need to reset. */ case VENDOR_CC_CCD: case VENDOR_CC_GET_BOARD_ID: + case VENDOR_CC_GET_BOOT_MODE: case VENDOR_CC_RMA_CHALLENGE_RESPONSE: case VENDOR_CC_SPI_HASH: /* Requires physical presence. */ case VENDOR_CC_TURN_UPDATE_ON: diff --git a/include/tpm_vendor_cmds.h b/include/tpm_vendor_cmds.h index 5afd1fc84b..9f37e1a33c 100644 --- a/include/tpm_vendor_cmds.h +++ b/include/tpm_vendor_cmds.h @@ -143,6 +143,10 @@ enum vendor_cmd_cc { VENDOR_CC_TRNG_TEST = 51, + /* EC EFS(Early Firmware Selection) commands */ + VENDOR_CC_GET_BOOT_MODE = 52, + VENDOR_CC_RESET_EC = 53, + LAST_VENDOR_COMMAND = 65535, }; |