diff options
author | York Sun <york.sun@nxp.com> | 2018-06-26 10:10:03 -0700 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2018-07-19 16:20:13 -0400 |
commit | 6ecd820f99177b4002f0518fbe5858b6a3032202 (patch) | |
tree | dbe447c054e225ab76cf9a2bacc297a87ff527e2 /common/spl | |
parent | eee45b4f545902a9089f68331c925898da813ac0 (diff) | |
download | u-boot-6ecd820f99177b4002f0518fbe5858b6a3032202.tar.gz u-boot-6ecd820f99177b4002f0518fbe5858b6a3032202.tar.xz u-boot-6ecd820f99177b4002f0518fbe5858b6a3032202.zip |
spl: nor: Add FIT support
Add support of loading FIT image from NOR flash.
Signed-off-by: York Sun <york.sun@nxp.com>
Diffstat (limited to 'common/spl')
-rw-r--r-- | common/spl/spl_nor.c | 42 |
1 files 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 <common.h> #include <spl.h> +#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) |