
Support loading FIT in SPL for RAM bootmode. CONFIG_SPL_LOAD_FIT_ADRESS points to address where FIT image is stored in memory.
Signed-off-by: Michal Simek michal.simek@xilinx.com ---
Not sure if solution with CONFIG_SPL_LOAD_FIT_ADDRESS is accepted. But it should be out of TEXT_BASE.
--- common/spl/spl.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-)
diff --git a/common/spl/spl.c b/common/spl/spl.c index f1e792dd7c61..128ccaa55e3e 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -134,19 +134,45 @@ __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) }
#ifdef CONFIG_SPL_RAM_DEVICE +#ifdef CONFIG_SPL_LOAD_FIT +static ulong spl_ram_load_read(struct spl_load_info *load, ulong sector, + ulong count, void *buf) +{ + + debug("%s: sector %lx, count %lx, buf %lx\n", + __func__, sector, count, (ulong)buf); + memcpy(buf, (void *)(CONFIG_SPL_LOAD_FIT_ADRESS + sector), count); + return count; +} +#endif + static int spl_ram_load_image(void) { - const struct image_header *header; + struct image_header *header;
- /* - * Get the header. It will point to an address defined by handoff - * which will tell where the image located inside the flash. For - * now, it will temporary fixed to address pointed by U-Boot. - */ - header = (struct image_header *) - (CONFIG_SYS_TEXT_BASE - sizeof(struct image_header)); + header = (struct image_header *)CONFIG_SPL_LOAD_FIT_ADRESS;
- spl_parse_image_header(header); + if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) && + image_get_magic(header) == FDT_MAGIC) { + struct spl_load_info load; + + debug("Found FIT\n"); + load.bl_len = 1; + load.read = spl_ram_load_read; + spl_load_simple_fit(&load, 0, header); + } else { + debug("Legacy image\n"); + /* + * Get the header. It will point to an address defined by + * handoff which will tell where the image located inside + * the flash. For now, it will temporary fixed to address + * pointed by U-Boot. + */ + header = (struct image_header *) + (CONFIG_SYS_TEXT_BASE - sizeof(struct image_header)); + + spl_parse_image_header(header); + }
return 0; }