[U-Boot] [PATCH v2 4/5] spl: fit: Support both external and embedded data
Simon Glass
sjg at chromium.org
Sun Aug 13 21:35:28 UTC 2017
Hi York,
On 7 August 2017 at 17:16, York Sun <york.sun at nxp.com> wrote:
> SPL supports U-Boot image in FIT format which has data outside of
> FIT structure. This adds support for embedded data for normal FIT
> images.
>
> Signed-off-by: York Sun <york.sun at nxp.com>
>
> ---
>
> Changes in v2:
> Rebase on top of "SPL: FIT: factor out spl_load_fit_image()" by Andre Przywara
>
> common/spl/spl_fit.c | 52 +++++++++++++++++++++++++++++++++-------------------
> 1 file changed, 33 insertions(+), 19 deletions(-)
>
There is some docs here:
doc/uImage.FIT/source_file_format.txt
I feel that what you have here should be documented in some way,
associated with SPL. Any ideas?
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index 23f85d2..0de4f40 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -128,13 +128,15 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
> void *fit, ulong base_offset, int node,
> struct spl_image_info *image_info)
> {
> - ulong offset;
> + int offset;
> size_t length;
> + int len;
> ulong load_addr, load_ptr;
> void *src;
> ulong overhead;
> int nr_sectors;
> int align_len = ARCH_DMA_MINALIGN - 1;
> + const void *data;
> #if defined(CONFIG_SPL_OS_BOOT) && defined(CONFIG_SPL_GZIP)
> uint8_t image_comp, type;
>
> @@ -149,28 +151,40 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
> debug("%s ", genimg_get_type_name(type));
> #endif
>
> - offset = fdt_getprop_u32(fit, node, "data-offset");
> - if (offset == FDT_ERROR)
> - return -ENOENT;
> - offset += base_offset;
> - length = fdt_getprop_u32(fit, node, "data-size");
> - if (length == FDT_ERROR)
> - return -ENOENT;
> - load_addr = fdt_getprop_u32(fit, node, "load");
> - if (load_addr == FDT_ERROR && image_info)
> + if (fit_image_get_load(fit, node, &load_addr))
> load_addr = image_info->load_addr;
> - load_ptr = (load_addr + align_len) & ~align_len;
>
> - overhead = get_aligned_image_overhead(info, offset);
> - nr_sectors = get_aligned_image_size(info, length, offset);
> + if (!fit_image_get_data_offset(fit, node, &offset)) {
> + /* External data */
> + offset += base_offset;
> + if (fit_image_get_data_size(fit, node, &len))
> + return -ENOENT;
>
> - if (info->read(info, sector + get_aligned_image_offset(info, offset),
> - nr_sectors, (void*)load_ptr) != nr_sectors)
> - return -EIO;
> - debug("image dst=%lx, offset=%lx, size=%lx\n", load_ptr, offset,
> - (unsigned long)length);
> + load_ptr = (load_addr + align_len) & ~align_len;
> + length = len;
> +
> + overhead = get_aligned_image_overhead(info, offset);
> + nr_sectors = get_aligned_image_size(info, length, offset);
> +
> + if (info->read(info,
> + sector + get_aligned_image_offset(info, offset),
> + nr_sectors, (void *)load_ptr) != nr_sectors)
> + return -EIO;
> +
> + debug("External data: dst=%lx, offset=%x, size=%lx\n",
> + load_ptr, offset, (unsigned long)length);
> + src = (void *)load_ptr + overhead;
> + } else {
> + /* Embedded data */
> + if (fit_image_get_data(fit, node, &data, &length)) {
> + puts("Cannot get image data/size\n");
> + return -ENOENT;
> + }
> + debug("Embedded data: dst=%lx, size=%lx\n", load_addr,
> + (unsigned long)length);
> + src = (void *)data;
> + }
>
> - src = (void *)load_ptr + overhead;
> #ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
> board_fit_image_post_process(&src, &length);
> #endif
> --
> 2.7.4
>
Regards,
Simon
More information about the U-Boot
mailing list