From 6ecd820f99177b4002f0518fbe5858b6a3032202 Mon Sep 17 00:00:00 2001 From: York Sun Date: Tue, 26 Jun 2018 10:10:03 -0700 Subject: [PATCH] spl: nor: Add FIT support Add support of loading FIT image from NOR flash. Signed-off-by: York Sun --- common/spl/spl_nor.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c index bb6194fafd..b919fffb30 100644 --- a/common/spl/spl_nor.c +++ b/common/spl/spl_nor.c @@ -6,10 +6,25 @@ #include #include +#ifdef CONFIG_SPL_LOAD_FIT +static ulong spl_nor_load_read(struct spl_load_info *load, ulong sector, + ulong count, void *buf) +{ + debug("%s: sector %lx, count %lx, buf %p\n", + __func__, sector, count, buf); + memcpy(buf, (void *)sector, count); + + return count; +} +#endif + static int spl_nor_load_image(struct spl_image_info *spl_image, struct spl_boot_device *bootdev) { int ret; + __maybe_unused const struct image_header *header; + __maybe_unused struct spl_load_info load; + /* * Loading of the payload to SDRAM is done with skipping of * the mkimage header in this SPL NOR driver @@ -18,14 +33,24 @@ static int spl_nor_load_image(struct spl_image_info *spl_image, #ifdef CONFIG_SPL_OS_BOOT if (!spl_start_uboot()) { - const struct image_header *header; - /* * Load Linux from its location in NOR flash to its defined * location in SDRAM */ header = (const struct image_header *)CONFIG_SYS_OS_BASE; +#ifdef CONFIG_SPL_LOAD_FIT + if (image_get_magic(header) == FDT_MAGIC) { + debug("Found FIT\n"); + load.bl_len = 1; + load.read = spl_nor_load_read; + ret = spl_load_simple_fit(spl_image, &load, + CONFIG_SYS_OS_BASE, + (void *)header); + + return ret; + } +#endif if (image_get_os(header) == IH_OS_LINUX) { /* happy - was a Linux */ @@ -53,6 +78,19 @@ static int spl_nor_load_image(struct spl_image_info *spl_image, * Load real U-Boot from its location in NOR flash to its * defined location in SDRAM */ +#ifdef CONFIG_SPL_LOAD_FIT + header = (const struct image_header *)CONFIG_SYS_UBOOT_BASE; + if (image_get_magic(header) == FDT_MAGIC) { + debug("Found FIT format U-Boot\n"); + load.bl_len = 1; + load.read = spl_nor_load_read; + ret = spl_load_simple_fit(spl_image, &load, + CONFIG_SYS_UBOOT_BASE, + (void *)header); + + return ret; + } +#endif ret = spl_parse_image_header(spl_image, (const struct image_header *)CONFIG_SYS_UBOOT_BASE); if (ret) -- 2.39.5