summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVignesh Raghavendra <[email protected]>2021-12-23 19:26:03 +0530
committerTom Rini <[email protected]>2022-01-15 10:38:26 -0500
commit584216315dee17d3a104379ff087ff57d2bbda48 (patch)
tree262622af35c8c5399963c3867ff436ff3d1e4c7f
parent67c8678346055e8455ac062cbc18ab5b693c40a1 (diff)
ARM: mach-k3: sysfw-loader: Copy sysfw.itb to OCRAM in OSPI/SPI bootmode
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 <[email protected]> Reviewed-by: Dave Gerlach <[email protected]> Tested-by: Keerthy <[email protected]> Acked-by: Pratyush Yadav <[email protected]>
-rw-r--r--arch/arm/mach-k3/sysfw-loader.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/arch/arm/mach-k3/sysfw-loader.c b/arch/arm/mach-k3/sysfw-loader.c
index 9ce576186c7..5e48c36ccd5 100644
--- a/arch/arm/mach-k3/sysfw-loader.c
+++ b/arch/arm/mach-k3/sysfw-loader.c
@@ -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)