]> git.ipfire.org Git - people/ms/u-boot.git/blame - arch/arm/cpu/armv7/mx6/hab.c
imx: add status reporting for HAB status
[people/ms/u-boot.git] / arch / arm / cpu / armv7 / mx6 / hab.c
CommitLineData
b83c709e
SB
1/*
2 * Copyright (C) 2010-2013 Freescale Semiconductor, Inc.
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7#include <common.h>
8#include <asm/io.h>
9#include <asm/arch/hab.h>
10
11/* -------- start of HAB API updates ------------*/
12#define hab_rvt_report_event ((hab_rvt_report_event_t *)HAB_RVT_REPORT_EVENT)
13#define hab_rvt_report_status ((hab_rvt_report_status_t *)HAB_RVT_REPORT_STATUS)
14#define hab_rvt_authenticate_image \
15 ((hab_rvt_authenticate_image_t *)HAB_RVT_AUTHENTICATE_IMAGE)
16#define hab_rvt_entry ((hab_rvt_entry_t *)HAB_RVT_ENTRY)
17#define hab_rvt_exit ((hab_rvt_exit_t *)HAB_RVT_EXIT)
18#define hab_rvt_clock_init HAB_RVT_CLOCK_INIT
19
20bool is_hab_enabled(void)
21{
22 struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
23 struct fuse_bank *bank = &ocotp->bank[0];
24 struct fuse_bank0_regs *fuse =
25 (struct fuse_bank0_regs *)bank->fuse_regs;
26 uint32_t reg = readl(&fuse->cfg5);
27
28 return (reg & 0x2) == 0x2;
29}
30
31void display_event(uint8_t *event_data, size_t bytes)
32{
33 uint32_t i;
34
35 if (!(event_data && bytes > 0))
36 return;
37
38 for (i = 0; i < bytes; i++) {
39 if (i == 0)
40 printf("\t0x%02x", event_data[i]);
41 else if ((i % 8) == 0)
42 printf("\n\t0x%02x", event_data[i]);
43 else
44 printf(" 0x%02x", event_data[i]);
45 }
46}
47
48int get_hab_status(void)
49{
50 uint32_t index = 0; /* Loop index */
51 uint8_t event_data[128]; /* Event data buffer */
52 size_t bytes = sizeof(event_data); /* Event size in bytes */
53 enum hab_config config = 0;
54 enum hab_state state = 0;
55
56 if (is_hab_enabled())
57 puts("\nSecure boot enabled\n");
58 else
59 puts("\nSecure boot disabled\n");
60
61 /* Check HAB status */
62 if (hab_rvt_report_status(&config, &state) != HAB_SUCCESS) {
63 printf("\nHAB Configuration: 0x%02x, HAB State: 0x%02x\n",
64 config, state);
65
66 /* Display HAB Error events */
67 while (hab_rvt_report_event(HAB_FAILURE, index, event_data,
68 &bytes) == HAB_SUCCESS) {
69 puts("\n");
70 printf("--------- HAB Event %d -----------------\n",
71 index + 1);
72 puts("event data:\n");
73 display_event(event_data, bytes);
74 puts("\n");
75 bytes = sizeof(event_data);
76 index++;
77 }
78 }
79 /* Display message if no HAB events are found */
80 else {
81 printf("\nHAB Configuration: 0x%02x, HAB State: 0x%02x\n",
82 config, state);
83 puts("No HAB Events Found!\n\n");
84 }
85 return 0;
86}
87
88int do_hab_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
89{
90 if ((argc != 1)) {
91 cmd_usage(cmdtp);
92 return 1;
93 }
94
95 get_hab_status();
96
97 return 0;
98}
99
100U_BOOT_CMD(
101 hab_status, CONFIG_SYS_MAXARGS, 1, do_hab_status,
102 "display HAB status",
103 ""
104 );