summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorYe Li <ye.li@nxp.com>2019-02-19 00:03:04 -0800
committerYe Li <ye.li@nxp.com>2019-02-19 00:03:04 -0800
commit7ea7a16fd892558098fb8cbea134ac275d1220d3 (patch)
tree87c1533abe607f2588b106c81095d9b1538bf786 /common
parent7f753d1b5950015b11be58aa937e5c14b9f26d7a (diff)
MLK-20945-4 imx8: Update container parser for RAW NOR SPL
Since FSPI is assigned to M4 partition, A core only can read it from its memory-map address. So we have to enable SPL NOR which won't access flexspi driver. Update SPL container parser for the RAW NOR support. Signed-off-by: Ye Li <ye.li@nxp.com>
Diffstat (limited to 'common')
-rw-r--r--common/spl/spl_nor.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
index b6ce46f2e9..4929963395 100644
--- a/common/spl/spl_nor.c
+++ b/common/spl/spl_nor.c
@@ -16,6 +16,18 @@ static ulong spl_nor_fit_read(struct spl_load_info *load, ulong sector,
return count;
}
+unsigned long __weak spl_nor_get_uboot_base(void)
+{
+ return CONFIG_SYS_UBOOT_BASE;
+}
+
+#ifdef CONFIG_PARSE_CONTAINER
+int __weak nor_load_image_parse_container(struct spl_image_info *spl_image,
+ unsigned long offset)
+{
+ return -EINVAL;
+}
+#else
static int nor_load_legacy(struct spl_image_info *spl_image)
{
int ret;
@@ -25,16 +37,17 @@ static int nor_load_legacy(struct spl_image_info *spl_image)
* defined location in SDRAM
*/
ret = spl_parse_image_header(spl_image,
- (const struct image_header *)CONFIG_SYS_UBOOT_BASE);
+ (const struct image_header *)spl_nor_get_uboot_base());
if (ret)
return ret;
memcpy((void *)(unsigned long)spl_image->load_addr,
- (void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)),
+ (void *)(spl_nor_get_uboot_base() + sizeof(struct image_header)),
spl_image->size);
return 0;
}
+#endif
static int spl_nor_load_image(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev)
@@ -83,7 +96,7 @@ static int spl_nor_load_image(struct spl_image_info *spl_image,
header = (struct image_header *)(CONFIG_SYS_TEXT_BASE -
sizeof(struct image_header));
- memcpy((void *)header, (void *)CONFIG_SYS_UBOOT_BASE, 0x40);
+ memcpy((void *)header, (void *)spl_nor_get_uboot_base(), 0x40);
if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
image_get_magic(header) == FDT_MAGIC) {
@@ -96,10 +109,15 @@ static int spl_nor_load_image(struct spl_image_info *spl_image,
load.bl_len = 1;
load.read = spl_nor_fit_read;
ret = spl_load_simple_fit(spl_image, &load,
- CONFIG_SYS_UBOOT_BASE,
+ spl_nor_get_uboot_base(),
(void *)header);
} else {
+#ifdef CONFIG_PARSE_CONTAINER
+ ret = nor_load_image_parse_container(spl_image,
+ spl_nor_get_uboot_base());
+#else
ret = nor_load_legacy(spl_image);
+#endif
}
return ret;