]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
arm: stm32mp: bsec: Update OTP shadow registers in SPL
authorPatrick Delaunay <patrick.delaunay@foss.st.com>
Mon, 11 Oct 2021 07:52:48 +0000 (09:52 +0200)
committerPatrice Chotard <patrice.chotard@foss.st.com>
Wed, 10 Nov 2021 16:06:51 +0000 (17:06 +0100)
Currently the upper OTP (after 57) are shadowed in U-Boot proper,
when TFABOOT is not used.

This choice cause an issue when U-Boot is not executed after SPL,
so this BSEC initialization is moved in SPL and no more executed in U-Boot,
so it is still executed only one time.

After this patch this BSEC initialization is done in FSBL: SPL or TF-A.

To force this initialization in all the case, the probe of the BSEC
driver is forced in SPL in the arch st32mp function: spl_board_init().

Even if today BSEC driver is already probed in STM32MP15x clock driver
clk_stm32mp1.c because get_cpu_type() is called in
stm32mp1_get_max_opp_freq() function.

Reported-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
arch/arm/mach-stm32mp/bsec.c
arch/arm/mach-stm32mp/cpu.c

index fe39bd80cfe454809dd93e560bde59dc14c71d3f..e517acdd01b166cc6bc2dd508c3361ab04687834 100644 (file)
@@ -503,10 +503,9 @@ static int stm32mp_bsec_probe(struct udevice *dev)
 
        /*
         * update unlocked shadow for OTP cleared by the rom code
-        * only executed in U-Boot proper when TF-A is not used
+        * only executed in SPL, it is done in TF-A for TFABOOT
         */
-
-       if (!IS_ENABLED(CONFIG_TFABOOT) && !IS_ENABLED(CONFIG_SPL_BUILD)) {
+       if (IS_ENABLED(CONFIG_SPL_BUILD)) {
                plat = dev_get_plat(dev);
 
                for (otp = 57; otp <= BSEC_OTP_MAX_VALUE; otp++)
index eb79f3ffd2cf154b0b881e1749dd6ce162b1ba94..0263ffe96a2fd6b851cc415131b6bea27ad1d285 100644 (file)
@@ -174,7 +174,15 @@ static void dbgmcu_init(void)
 
 void spl_board_init(void)
 {
+       struct udevice *dev;
+       int ret;
+
        dbgmcu_init();
+
+       /* force probe of BSEC driver to shadow the upper OTP */
+       ret = uclass_get_device_by_driver(UCLASS_MISC, DM_DRIVER_GET(stm32mp_bsec), &dev);
+       if (ret)
+               log_warning("BSEC probe failed: %d\n", ret);
 }
 #endif /* !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD) */