diff options
author | Peng Fan <peng.fan@nxp.com> | 2018-05-17 15:13:24 +0800 |
---|---|---|
committer | Ye Li <ye.li@nxp.com> | 2018-05-23 04:15:58 -0700 |
commit | 288c8eedb0e187985d33debd701c88f58abb1083 (patch) | |
tree | 7cd0d213e11045c7ed2d8fbe4610a93770a4112b /common | |
parent | 168b25bee5d525cbf0cb4792012c7f7efa8710df (diff) |
MLK-18333-1 spl: nor: add fit image support
Extend spl_nor to support FIT image loading.
CONFIG_SYS_UBOOT_BASE is the Uboot location in NOR memmap address.
Signed-off-by: Peng Fan <peng.fan@nxp.com>
(cherry picked from commit 60e943cd1a7c248eccc8892073efdada588a208d)
Diffstat (limited to 'common')
-rw-r--r-- | common/spl/spl_nor.c | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c index 1ef8ac8b89b..b6ce46f2e9d 100644 --- a/common/spl/spl_nor.c +++ b/common/spl/spl_nor.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2012 Stefan Roese <sr@denx.de> + * Copyright 2018 NXP * * SPDX-License-Identifier: GPL-2.0+ */ @@ -7,9 +8,39 @@ #include <common.h> #include <spl.h> +static ulong spl_nor_fit_read(struct spl_load_info *load, ulong sector, + ulong count, void *buf) +{ + memcpy(buf, (void *)sector, count); + + return count; +} + +static int nor_load_legacy(struct spl_image_info *spl_image) +{ + int ret; + + /* + * Load real U-Boot from its location in NOR flash to its + * defined location in SDRAM + */ + ret = spl_parse_image_header(spl_image, + (const struct image_header *)CONFIG_SYS_UBOOT_BASE); + if (ret) + return ret; + + memcpy((void *)(unsigned long)spl_image->load_addr, + (void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)), + spl_image->size); + + return 0; +} + static int spl_nor_load_image(struct spl_image_info *spl_image, struct spl_boot_device *bootdev) { + const struct image_header *header; + int ret; /* * Loading of the payload to SDRAM is done with skipping of @@ -19,7 +50,6 @@ 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 @@ -50,19 +80,28 @@ static int spl_nor_load_image(struct spl_image_info *spl_image, } #endif - /* - * Load real U-Boot from its location in NOR flash to its - * defined location in SDRAM - */ - ret = spl_parse_image_header(spl_image, - (const struct image_header *)CONFIG_SYS_UBOOT_BASE); - if (ret) - return ret; + header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - + sizeof(struct image_header)); - memcpy((void *)(unsigned long)spl_image->load_addr, - (void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)), - spl_image->size); + memcpy((void *)header, (void *)CONFIG_SYS_UBOOT_BASE, 0x40); - return 0; + if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) && + image_get_magic(header) == FDT_MAGIC) { + struct spl_load_info load; + + debug("Found FIT\n"); + load.dev = NULL; + load.priv = NULL; + load.filename = NULL; + load.bl_len = 1; + load.read = spl_nor_fit_read; + ret = spl_load_simple_fit(spl_image, &load, + CONFIG_SYS_UBOOT_BASE, + (void *)header); + } else { + ret = nor_load_legacy(spl_image); + } + + return ret; } SPL_LOAD_IMAGE_METHOD("NOR", 0, BOOT_DEVICE_NOR, spl_nor_load_image); |