From 288c8eedb0e187985d33debd701c88f58abb1083 Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Thu, 17 May 2018 15:13:24 +0800 Subject: [PATCH] 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 (cherry picked from commit 60e943cd1a7c248eccc8892073efdada588a208d) --- common/spl/spl_nor.c | 65 +++++++++++++++++++++++++++++++++++--------- 1 file 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 + * Copyright 2018 NXP * * SPDX-License-Identifier: GPL-2.0+ */ @@ -7,9 +8,39 @@ #include #include +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);