mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-12 16:07:30 +00:00
f2f07e8553
According to: http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git/log/?h=imx_v2009.08_3.0.35_4.1.0 ENGR00287268 mx6: fix the secure boot issue on the new tapout chip commit 424cb1a79e9f5ae4ede9350dfb5e10dc9680e90b newer i.MX6 silicon revisions have an updated ROM and HAB API table. Please see also: i.MX Applications Processors Documentation Engineering Bulletins EB803, i.MX 6Dual/6Quad Applications Processor Silicon Revsion 1.2 to 1.3 Comparison With this change the secure boot status is correctly displayed Signed-off-by: Stefano Babic <sbabic@denx.de>
163 lines
4.3 KiB
C
163 lines
4.3 KiB
C
/*
|
|
* 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>
|
|
#include <asm/arch/sys_proto.h>
|
|
|
|
/* -------- start of HAB API updates ------------*/
|
|
|
|
#define hab_rvt_report_event_p \
|
|
( \
|
|
((is_cpu_type(MXC_CPU_MX6Q) || \
|
|
is_cpu_type(MXC_CPU_MX6D)) && \
|
|
(soc_rev() >= CHIP_REV_1_5)) ? \
|
|
((hab_rvt_report_event_t *)HAB_RVT_REPORT_EVENT_NEW) : \
|
|
(is_cpu_type(MXC_CPU_MX6DL) && \
|
|
(soc_rev() >= CHIP_REV_1_2)) ? \
|
|
((hab_rvt_report_event_t *)HAB_RVT_REPORT_EVENT_NEW) : \
|
|
((hab_rvt_report_event_t *)HAB_RVT_REPORT_EVENT) \
|
|
)
|
|
|
|
#define hab_rvt_report_status_p \
|
|
( \
|
|
((is_cpu_type(MXC_CPU_MX6Q) || \
|
|
is_cpu_type(MXC_CPU_MX6D)) && \
|
|
(soc_rev() >= CHIP_REV_1_5)) ? \
|
|
((hab_rvt_report_status_t *)HAB_RVT_REPORT_STATUS_NEW) :\
|
|
(is_cpu_type(MXC_CPU_MX6DL) && \
|
|
(soc_rev() >= CHIP_REV_1_2)) ? \
|
|
((hab_rvt_report_status_t *)HAB_RVT_REPORT_STATUS_NEW) :\
|
|
((hab_rvt_report_status_t *)HAB_RVT_REPORT_STATUS) \
|
|
)
|
|
|
|
#define hab_rvt_authenticate_image_p \
|
|
( \
|
|
((is_cpu_type(MXC_CPU_MX6Q) || \
|
|
is_cpu_type(MXC_CPU_MX6D)) && \
|
|
(soc_rev() >= CHIP_REV_1_5)) ? \
|
|
((hab_rvt_authenticate_image_t *)HAB_RVT_AUTHENTICATE_IMAGE_NEW) : \
|
|
(is_cpu_type(MXC_CPU_MX6DL) && \
|
|
(soc_rev() >= CHIP_REV_1_2)) ? \
|
|
((hab_rvt_authenticate_image_t *)HAB_RVT_AUTHENTICATE_IMAGE_NEW) : \
|
|
((hab_rvt_authenticate_image_t *)HAB_RVT_AUTHENTICATE_IMAGE) \
|
|
)
|
|
|
|
#define hab_rvt_entry_p \
|
|
( \
|
|
((is_cpu_type(MXC_CPU_MX6Q) || \
|
|
is_cpu_type(MXC_CPU_MX6D)) && \
|
|
(soc_rev() >= CHIP_REV_1_5)) ? \
|
|
((hab_rvt_entry_t *)HAB_RVT_ENTRY_NEW) : \
|
|
(is_cpu_type(MXC_CPU_MX6DL) && \
|
|
(soc_rev() >= CHIP_REV_1_2)) ? \
|
|
((hab_rvt_entry_t *)HAB_RVT_ENTRY_NEW) : \
|
|
((hab_rvt_entry_t *)HAB_RVT_ENTRY) \
|
|
)
|
|
|
|
#define hab_rvt_exit_p \
|
|
( \
|
|
((is_cpu_type(MXC_CPU_MX6Q) || \
|
|
is_cpu_type(MXC_CPU_MX6D)) && \
|
|
(soc_rev() >= CHIP_REV_1_5)) ? \
|
|
((hab_rvt_exit_t *)HAB_RVT_EXIT_NEW) : \
|
|
(is_cpu_type(MXC_CPU_MX6DL) && \
|
|
(soc_rev() >= CHIP_REV_1_2)) ? \
|
|
((hab_rvt_exit_t *)HAB_RVT_EXIT_NEW) : \
|
|
((hab_rvt_exit_t *)HAB_RVT_EXIT) \
|
|
)
|
|
|
|
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;
|
|
hab_rvt_report_event_t *hab_rvt_report_event;
|
|
hab_rvt_report_status_t *hab_rvt_report_status;
|
|
|
|
hab_rvt_report_event = hab_rvt_report_event_p;
|
|
hab_rvt_report_status = hab_rvt_report_status_p;
|
|
|
|
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",
|
|
""
|
|
);
|