]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
imx: spl: fix imx8m secure boot
authorHeiko Schocher <hs@denx.de>
Tue, 17 Aug 2021 06:17:18 +0000 (08:17 +0200)
committerStefano Babic <sbabic@denx.de>
Thu, 7 Oct 2021 14:53:50 +0000 (16:53 +0200)
cherry-picked from NXP code:
719d665a87c6: ("MLK-20467 imx8m: Fix issue for booting signed image through uuu")

which fixes secure boot on imx8m based boards. Problem was
that FIT header and so IVT header too, was loaded to
memallocated address. So the ivt header address coded
in IVT itself does not fit with the real position.

Signed-off-by: Heiko Schocher <hs@denx.de>
Tested-by: Tim Harvey <tharvey@gateworks.com>
arch/arm/mach-imx/spl.c
common/spl/spl_fit.c

index 01f6f0a1dee0264a66cb432626b8528c4722f1ae..427b7f78599089ce8a56ae278272ac28fc6a2c8d 100644 (file)
@@ -334,6 +334,20 @@ void board_spl_fit_post_load(const void *fit)
 }
 #endif
 
+void *board_spl_fit_buffer_addr(ulong fit_size, int sectors, int bl_len)
+{
+       int align_len = ARCH_DMA_MINALIGN - 1;
+
+       /* Some devices like SDP, NOR, NAND, SPI are using bl_len =1, so their fit address
+        * is different with SD/MMC, this cause mismatch with signed address. Thus, adjust
+        * the bl_len to align with SD/MMC.
+        */
+       if (bl_len < 512)
+               bl_len = 512;
+
+       return  (void *)((CONFIG_SYS_TEXT_BASE - fit_size - bl_len -
+                       align_len) & ~align_len);
+}
 #endif
 
 #if defined(CONFIG_MX6) && defined(CONFIG_SPL_OS_BOOT)
index 849e01ad8ee11c9805223e2cd98ab159195476ff..5fe0273d66d4683ce40ed8235882a7ae77b67db7 100644 (file)
@@ -538,6 +538,11 @@ static void *spl_get_fit_load_buffer(size_t size)
        return buf;
 }
 
+__weak void *board_spl_fit_buffer_addr(ulong fit_size, int sectors, int bl_len)
+{
+       return spl_get_fit_load_buffer(sectors * bl_len);
+}
+
 /*
  * Weak default function to allow customizing SPL fit loading for load-only
  * use cases by allowing to skip the parsing/processing of the FIT contents
@@ -640,7 +645,7 @@ static int spl_simple_fit_read(struct spl_fit_info *ctx,
         * For FIT with external data, data is not loaded in this step.
         */
        sectors = get_aligned_image_size(info, size, 0);
-       buf = spl_get_fit_load_buffer(sectors * info->bl_len);
+       buf = board_spl_fit_buffer_addr(size, sectors, info->bl_len);
 
        count = info->read(info, sector, sectors, buf);
        ctx->fit = buf;