From cf2acc5b7cde7c8af295e2e2424d83a63d8949f5 Mon Sep 17 00:00:00 2001 From: Ye Li Date: Mon, 14 Jan 2019 21:34:23 -0800 Subject: [PATCH] MLK-18942-2 imx8: ahab: Add ahab_status command Add new u-boot command "ahab_status" to display seco events and current lifecycle. It parses the seco event only for authenticating container command, so that user can know the authentication failure. Signed-off-by: Ye Li Acked-by: Peng Fan --- arch/arm/mach-imx/imx8/ahab.c | 113 ++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/arch/arm/mach-imx/imx8/ahab.c b/arch/arm/mach-imx/imx8/ahab.c index 3c3d0d4597..4a942c89c4 100644 --- a/arch/arm/mach-imx/imx8/ahab.c +++ b/arch/arm/mach-imx/imx8/ahab.c @@ -129,9 +129,122 @@ static int do_authenticate(cmd_tbl_t *cmdtp, int flag, int argc, char * const ar return CMD_RET_SUCCESS; } +static void display_life_cycle(uint16_t lc) +{ + printf("Lifecycle: 0x%04X, ", lc); + switch (lc) { + case 0x1: + printf("Pristine\n\n"); + break; + case 0x2: + printf("Fab\n\n"); + break; + case 0x8: + printf("Open\n\n"); + break; + case 0x20: + printf("NXP closed\n\n"); + break; + case 0x80: + printf("OEM closed\n\n"); + break; + case 0x100: + printf("Partial field return\n\n"); + break; + case 0x200: + printf("Full field return\n\n"); + break; + case 0x400: + printf("No return\n\n"); + break; + default: + printf("Unknown\n\n"); + break; + } +} + +#define AHAB_AUTH_CONTAINER_REQ 0x87 + +#define AHAB_NO_AUTHENTICATION_IND 0xee +#define AHAB_BAD_KEY_HASH_IND 0xfa +#define AHAB_INVALID_KEY_IND 0xf9 +#define AHAB_BAD_SIGNATURE_IND 0xf0 +#define AHAB_BAD_HASH_IND 0xf1 + +static void display_ahab_auth_event(uint32_t event) +{ + uint8_t cmd = (event >> 16) & 0xff; + uint8_t resp_ind =(event >> 8) & 0xff; + + if (cmd != AHAB_AUTH_CONTAINER_REQ) + return; + + printf("\tCMD = AHAB_AUTH_CONTAINER_REQ (0x%02X)\n", cmd); + printf("\tIND = "); + switch (resp_ind) { + case AHAB_NO_AUTHENTICATION_IND: + printf("AHAB_NO_AUTHENTICATION_IND (0x%02X)\n\n", resp_ind); + break; + case AHAB_BAD_KEY_HASH_IND: + printf("AHAB_BAD_KEY_HASH_IND (0x%02X)\n\n", resp_ind); + break; + case AHAB_INVALID_KEY_IND: + printf("AHAB_INVALID_KEY_IND (0x%02X)\n\n", resp_ind); + break; + case AHAB_BAD_SIGNATURE_IND: + printf("AHAB_BAD_SIGNATURE_IND (0x%02X)\n\n", resp_ind); + break; + case AHAB_BAD_HASH_IND: + printf("AHAB_BAD_HASH_IND (0x%02X)\n\n", resp_ind); + break; + default: + printf("Unknown Indicator (0x%02X)\n\n", resp_ind); + break; + } +} + + +static int do_ahab_status(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + sc_err_t err; + uint8_t idx = 0U; + uint32_t event; + uint16_t lc; + sc_ipc_t ipcHndl = gd->arch.ipc_channel_handle; + + err = sc_misc_seco_chip_info(ipcHndl, &lc, NULL, NULL, NULL); + if (err != SC_ERR_NONE) { + printf("Error in get lifecycle\n"); + return -EIO; + } + + display_life_cycle(lc); + + err = sc_misc_seco_get_event(ipcHndl, idx, &event); + while (err == SC_ERR_NONE) { + printf ("SECO Event[%u] = 0x%08X\n", idx, event); + display_ahab_auth_event(event); + + idx++; + err = sc_misc_seco_get_event(ipcHndl, idx, &event); + } + + if (idx == 0) + printf("No SECO Events Found!\n\n"); + + return 0; +} + U_BOOT_CMD( auth_cntr, CONFIG_SYS_MAXARGS, 1, do_authenticate, "autenticate OS container via AHAB", "addr\n" "addr - OS container hex address\n" ); + +U_BOOT_CMD( + ahab_status, CONFIG_SYS_MAXARGS, 1, do_ahab_status, + "display AHAB lifecycle and events from seco", + "" + );