summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorPeng Fan <peng.fan@nxp.com>2018-05-17 15:13:24 +0800
committerYe Li <ye.li@nxp.com>2018-05-23 04:15:58 -0700
commit288c8eedb0e187985d33debd701c88f58abb1083 (patch)
tree7cd0d213e11045c7ed2d8fbe4610a93770a4112b /common
parent168b25bee5d525cbf0cb4792012c7f7efa8710df (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.c65
1 files changed, 52 insertions, 13 deletions
diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
index 1ef8ac8b89..b6ce46f2e9 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);