| /* |
| * Copyright (C) 2010-2013 Freescale Semiconductor, Inc. |
| * |
| * SPDX-License-Identifier: GPL-2.0+ |
| */ |
| |
| #include <common.h> |
| #include <asm/io.h> |
| #include <asm/arch/hab.h> |
| |
| /* -------- start of HAB API updates ------------*/ |
| #define hab_rvt_report_event ((hab_rvt_report_event_t *)HAB_RVT_REPORT_EVENT) |
| #define hab_rvt_report_status ((hab_rvt_report_status_t *)HAB_RVT_REPORT_STATUS) |
| #define hab_rvt_authenticate_image \ |
| ((hab_rvt_authenticate_image_t *)HAB_RVT_AUTHENTICATE_IMAGE) |
| #define hab_rvt_entry ((hab_rvt_entry_t *)HAB_RVT_ENTRY) |
| #define hab_rvt_exit ((hab_rvt_exit_t *)HAB_RVT_EXIT) |
| #define hab_rvt_clock_init HAB_RVT_CLOCK_INIT |
| |
| bool is_hab_enabled(void) |
| { |
| struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; |
| struct fuse_bank *bank = &ocotp->bank[0]; |
| struct fuse_bank0_regs *fuse = |
| (struct fuse_bank0_regs *)bank->fuse_regs; |
| uint32_t reg = readl(&fuse->cfg5); |
| |
| return (reg & 0x2) == 0x2; |
| } |
| |
| void display_event(uint8_t *event_data, size_t bytes) |
| { |
| uint32_t i; |
| |
| if (!(event_data && bytes > 0)) |
| return; |
| |
| for (i = 0; i < bytes; i++) { |
| if (i == 0) |
| printf("\t0x%02x", event_data[i]); |
| else if ((i % 8) == 0) |
| printf("\n\t0x%02x", event_data[i]); |
| else |
| printf(" 0x%02x", event_data[i]); |
| } |
| } |
| |
| int get_hab_status(void) |
| { |
| uint32_t index = 0; /* Loop index */ |
| uint8_t event_data[128]; /* Event data buffer */ |
| size_t bytes = sizeof(event_data); /* Event size in bytes */ |
| enum hab_config config = 0; |
| enum hab_state state = 0; |
| |
| if (is_hab_enabled()) |
| puts("\nSecure boot enabled\n"); |
| else |
| puts("\nSecure boot disabled\n"); |
| |
| /* Check HAB status */ |
| if (hab_rvt_report_status(&config, &state) != HAB_SUCCESS) { |
| printf("\nHAB Configuration: 0x%02x, HAB State: 0x%02x\n", |
| config, state); |
| |
| /* Display HAB Error events */ |
| while (hab_rvt_report_event(HAB_FAILURE, index, event_data, |
| &bytes) == HAB_SUCCESS) { |
| puts("\n"); |
| printf("--------- HAB Event %d -----------------\n", |
| index + 1); |
| puts("event data:\n"); |
| display_event(event_data, bytes); |
| puts("\n"); |
| bytes = sizeof(event_data); |
| index++; |
| } |
| } |
| /* Display message if no HAB events are found */ |
| else { |
| printf("\nHAB Configuration: 0x%02x, HAB State: 0x%02x\n", |
| config, state); |
| puts("No HAB Events Found!\n\n"); |
| } |
| return 0; |
| } |
| |
| int do_hab_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
| { |
| if ((argc != 1)) { |
| cmd_usage(cmdtp); |
| return 1; |
| } |
| |
| get_hab_status(); |
| |
| return 0; |
| } |
| |
| U_BOOT_CMD( |
| hab_status, CONFIG_SYS_MAXARGS, 1, do_hab_status, |
| "display HAB status", |
| "" |
| ); |