|
@@ -0,0 +1,104 @@
|
|
|
+/*
|
|
|
+ * 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",
|
|
|
+ ""
|
|
|
+ );
|