]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
ARM: mach-k3: sysfw-loader: Copy sysfw.itb to OCRAM in OSPI/SPI bootmode
authorVignesh Raghavendra <vigneshr@ti.com>
Thu, 23 Dec 2021 13:56:03 +0000 (19:26 +0530)
committerTom Rini <trini@konsulko.com>
Sat, 15 Jan 2022 15:38:26 +0000 (10:38 -0500)
In case of xSPI bootmode OSPI flash is in DDR mode and needs to be accessed
in multiple of 16bit accesses Hence we cannot parse sysfw.itb FIT image
directly on OSPI flash via MMIO window. So, copy the image to internal
on-chip RAM before parsing the image.

Moreover, board cfg data maybe modified by ROM/TIFS in case of HS platform
and thus cannot reside in OSPI/xSPI and needs to be copied over to
internal OCRAM.

This unblocks OSPI/xSPI boot on HS platforms

Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
Reviewed-by: Dave Gerlach <d-gerlach@ti.com>
Tested-by: Keerthy <j-keerthy@ti.com>
Acked-by: Pratyush Yadav <p.yadav@ti.com>
arch/arm/mach-k3/sysfw-loader.c

index 9ce576186c75f37b00a99d5aa5d49b5e7811a90e..5e48c36ccd58cf79c7a045699e25d37413e001df 100644 (file)
@@ -22,6 +22,7 @@
 #include <dm/uclass-internal.h>
 #include <spi_flash.h>
 
+#include <asm/io.h>
 #include <asm/arch/sys_proto.h>
 #include "common.h"
 
@@ -335,6 +336,14 @@ static void *k3_sysfw_get_spi_addr(void)
 
        return (void *)(addr + CONFIG_K3_SYSFW_IMAGE_SPI_OFFS);
 }
+
+static void k3_sysfw_spi_copy(u32 *dst, u32 *src, size_t len)
+{
+       size_t i;
+
+       for (i = 0; i < len / sizeof(*dst); i++)
+               *dst++ = *src++;
+}
 #endif
 
 void k3_sysfw_loader(bool rom_loaded_sysfw,
@@ -344,6 +353,9 @@ void k3_sysfw_loader(bool rom_loaded_sysfw,
        struct spl_image_info spl_image = { 0 };
        struct spl_boot_device bootdev = { 0 };
        struct ti_sci_handle *ti_sci;
+#if CONFIG_IS_ENABLED(SPI_LOAD)
+       void *sysfw_spi_base;
+#endif
        int ret = 0;
 
        if (rom_loaded_sysfw) {
@@ -394,9 +406,11 @@ void k3_sysfw_loader(bool rom_loaded_sysfw,
 #endif
 #if CONFIG_IS_ENABLED(SPI_LOAD)
        case BOOT_DEVICE_SPI:
-               sysfw_load_address = k3_sysfw_get_spi_addr();
-               if (!sysfw_load_address)
+               sysfw_spi_base = k3_sysfw_get_spi_addr();
+               if (!sysfw_spi_base)
                        ret = -ENODEV;
+               k3_sysfw_spi_copy(sysfw_load_address, sysfw_spi_base,
+                                 CONFIG_K3_SYSFW_IMAGE_SIZE_MAX);
                break;
 #endif
 #if CONFIG_IS_ENABLED(YMODEM_SUPPORT)