[PATCH v2 2/2] imx: hab: Make imx_hab_is_enabled dependent on FIELD_RETURN
Paul Geurts
paul.geurts at prodrive-technologies.com
Mon Jun 24 21:28:03 CEST 2024
The decision on whether HAB is enabled is solely based on the SEC_CONFIG
fuse. The HAB FIELD_RETURN feature is able to permanently disable HAB on
a CPU, after which it is able to boot unsigned firmware. U-Boot however
does not take into account the FIELD_RETURN mode, and refuses to boot
unsigned software when the feature is enabled.
Also take the FIELD_RETURN fuse into account when deciding whether HAB
is enabled. When The FIELD_RETURN fuse is blown, HAB is not enabled.
Tested on i.MX8M Mini, i.MX8M Plus, i.MX8M Nano and i.MX6ULL
Signed-off-by: Paul Geurts <paul.geurts at prodrive-technologies.com>
---
arch/arm/include/asm/mach-imx/hab.h | 1 +
arch/arm/mach-imx/hab.c | 19 ++++++++++++++++---
arch/arm/mach-imx/imx8m/soc.c | 5 +++++
arch/arm/mach-imx/mx6/soc.c | 5 +++++
arch/arm/mach-imx/mx7/soc.c | 5 +++++
arch/arm/mach-imx/mx7ulp/soc.c | 5 +++++
6 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/arch/arm/include/asm/mach-imx/hab.h b/arch/arm/include/asm/mach-imx/hab.h
index 52cd8aff87e1..d70e8eac1358 100644
--- a/arch/arm/include/asm/mach-imx/hab.h
+++ b/arch/arm/include/asm/mach-imx/hab.h
@@ -139,6 +139,7 @@ struct imx_fuse_t {
#if defined(CONFIG_IMX_HAB)
extern struct imx_fuse_t const imx_sec_config_fuse;
+extern struct imx_fuse_t const imx_field_return_fuse;
#endif
/*Function prototype description*/
diff --git a/arch/arm/mach-imx/hab.c b/arch/arm/mach-imx/hab.c
index 1de0b648efdb..03d827e6c1eb 100644
--- a/arch/arm/mach-imx/hab.c
+++ b/arch/arm/mach-imx/hab.c
@@ -27,6 +27,7 @@ DECLARE_GLOBAL_DATA_PTR;
#define IS_HAB_ENABLED_BIT \
(is_soc_type(MXC_SOC_MX7ULP) ? 0x80000000 : \
((is_soc_type(MXC_SOC_MX7) || is_soc_type(MXC_SOC_IMX8M)) ? 0x2000000 : 0x2))
+#define IS_FIELD_RETURN_BIT 0x00000001
#ifdef CONFIG_MX7ULP
#define HAB_M4_PERSISTENT_START ((soc_rev() >= CHIP_REV_2_0) ? 0x20008040 : \
@@ -871,18 +872,30 @@ static int validate_ivt(struct ivt *ivt_initial)
bool imx_hab_is_enabled(void)
{
- struct imx_fuse_t *fuse =
+ struct imx_fuse_t *sec_config =
(struct imx_fuse_t *)&imx_sec_config_fuse;
+ struct imx_fuse_t *field_return =
+ (struct imx_fuse_t *)&imx_field_return_fuse;
uint32_t reg;
+ bool is_enabled;
int ret;
- ret = fuse_read(fuse->bank, fuse->word, ®);
+ ret = fuse_read(sec_config->bank, sec_config->word, ®);
if (ret) {
puts("\nSecure boot fuse read error\n");
return ret;
}
+ is_enabled = (reg & IS_HAB_ENABLED_BIT) == IS_HAB_ENABLED_BIT;
+ if (is_enabled) {
+ ret = fuse_read(field_return->bank, field_return->word, ®);
+ if (ret) {
+ puts("\nField return fuse read error\n");
+ return ret;
+ }
+ is_enabled = !(reg & IS_FIELD_RETURN_BIT);
+ }
- return (reg & IS_HAB_ENABLED_BIT) == IS_HAB_ENABLED_BIT;
+ return is_enabled;
}
int imx_hab_authenticate_image(uint32_t ddr_start, uint32_t image_size,
diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c
index 89e77236f024..af0844946378 100644
--- a/arch/arm/mach-imx/imx8m/soc.c
+++ b/arch/arm/mach-imx/imx8m/soc.c
@@ -40,6 +40,11 @@ struct imx_fuse_t const imx_sec_config_fuse = {
.bank = 1,
.word = 3,
};
+
+struct imx_fuse_t const imx_field_return_fuse = {
+ .bank = 8,
+ .word = 3,
+};
#endif
int timer_init(void)
diff --git a/arch/arm/mach-imx/mx6/soc.c b/arch/arm/mach-imx/mx6/soc.c
index 703f2b3093dc..02179b02b8d2 100644
--- a/arch/arm/mach-imx/mx6/soc.c
+++ b/arch/arm/mach-imx/mx6/soc.c
@@ -56,6 +56,11 @@ struct imx_fuse_t const imx_sec_config_fuse = {
.bank = 0,
.word = 6,
};
+
+struct imx_fuse_t const imx_field_return_fuse = {
+ .bank = 5,
+ .word = 6,
+};
#endif
u32 get_nr_cpus(void)
diff --git a/arch/arm/mach-imx/mx7/soc.c b/arch/arm/mach-imx/mx7/soc.c
index f95c7845cf06..3369696e4614 100644
--- a/arch/arm/mach-imx/mx7/soc.c
+++ b/arch/arm/mach-imx/mx7/soc.c
@@ -132,6 +132,11 @@ struct imx_fuse_t const imx_sec_config_fuse = {
.bank = 1,
.word = 3,
};
+
+struct imx_fuse_t const imx_field_return_fuse = {
+ .bank = 8,
+ .word = 3,
+};
#endif
static bool is_mx7d(void)
diff --git a/arch/arm/mach-imx/mx7ulp/soc.c b/arch/arm/mach-imx/mx7ulp/soc.c
index e0b17e1b4ff1..d11204cb2479 100644
--- a/arch/arm/mach-imx/mx7ulp/soc.c
+++ b/arch/arm/mach-imx/mx7ulp/soc.c
@@ -42,6 +42,11 @@ struct imx_fuse_t const imx_sec_config_fuse = {
.bank = 29,
.word = 6,
};
+
+struct imx_fuse_t const imx_field_return_fuse = {
+ .bank = 9,
+ .word = 6,
+};
#endif
#define ROM_VERSION_ADDR 0x80
--
2.30.2
More information about the U-Boot
mailing list