All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew F. Davis <afd@ti.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 04/17] SPL: FIT: factor out spl_load_fit_image()
Date: Fri, 3 Mar 2017 10:56:21 -0600	[thread overview]
Message-ID: <b64921f2-548c-f385-8680-7b3a48faaf30@ti.com> (raw)
In-Reply-To: <1488335129-12363-5-git-send-email-andre.przywara@arm.com>

On 02/28/2017 08:25 PM, Andre Przywara wrote:
> At the moment we load two images from a FIT image: the actual U-Boot
> image and the DTB. Both times we have very similar code to deal with
> alignment requirement the media we load from imposes upon us.
> Factor out this code into a new function, which we just call twice.
> 
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> ---

Acked-by: Andrew F. Davis <afd@ti.com>

+Franklin,

This patch, and #12 look like something you would be interested in for
your 66AK2G0x work.

Andrew

>  common/spl/spl_fit.c | 129 +++++++++++++++++++++++----------------------------
>  1 file changed, 57 insertions(+), 72 deletions(-)
> 
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index 572a5db..ad5ba15 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -18,7 +18,7 @@ static ulong fdt_getprop_u32(const void *fdt, int node, const char *prop)
>  
>  	cell = fdt_getprop(fdt, node, prop, &len);
>  	if (len != sizeof(*cell))
> -		return -1U;
> +		return -1UL;
>  	return fdt32_to_cpu(*cell);
>  }
>  
> @@ -139,19 +139,63 @@ static int get_aligned_image_size(struct spl_load_info *info, int data_size,
>  	return (data_size + info->bl_len - 1) / info->bl_len;
>  }
>  
> +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;
> +	size_t length;
> +	ulong load_addr, load_ptr, entry;
> +	void *src;
> +	ulong overhead;
> +	int nr_sectors;
> +	int align_len = ARCH_DMA_MINALIGN - 1;
> +
> +	offset = fdt_getprop_u32(fit, node, "data-offset") + base_offset;
> +	length = fdt_getprop_u32(fit, node, "data-size");
> +	load_addr = fdt_getprop_u32(fit, node, "load");
> +	if (load_addr == -1UL && image_info)
> +		load_addr = image_info->load_addr;
> +	load_ptr = (load_addr + align_len) & ~align_len;
> +	entry = fdt_getprop_u32(fit, node, "entry");
> +
> +	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("image: dst=%lx, offset=%lx, size=%lx\n", load_ptr, offset,
> +	      (unsigned long)length);
> +
> +	src = (void *)load_ptr + overhead;
> +#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
> +	board_fit_image_post_process(&src, &length);
> +#endif
> +
> +	memcpy((void*)load_addr, src, length);
> +
> +	if (image_info) {
> +		image_info->load_addr = load_addr;
> +		image_info->size = length;
> +		if (entry == -1UL)
> +			image_info->entry_point = load_addr;
> +		else
> +			image_info->entry_point = entry;
> +	}
> +
> +	return 0;
> +}
> +
>  int spl_load_simple_fit(struct spl_image_info *spl_image,
>  			struct spl_load_info *info, ulong sector, void *fit)
>  {
>  	int sectors;
> -	ulong size, load;
> +	ulong size;
>  	unsigned long count;
> +	struct spl_image_info image_info;
>  	int node, images;
> -	void *load_ptr;
> -	int fdt_offset, fdt_len;
> -	int data_offset, data_size;
>  	int base_offset, align_len = ARCH_DMA_MINALIGN - 1;
> -	int src_sector;
> -	void *dst, *src;
>  
>  	/*
>  	 * Figure out where the external images start. This is the base for the
> @@ -203,82 +247,23 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
>  		return -1;
>  	}
>  
> -	/* Get its information and set up the spl_image structure */
> -	data_offset = fdt_getprop_u32(fit, node, "data-offset");
> -	data_size = fdt_getprop_u32(fit, node, "data-size");
> -	load = fdt_getprop_u32(fit, node, "load");
> -	debug("data_offset=%x, data_size=%x\n", data_offset, data_size);
> -	spl_image->load_addr = load;
> -	spl_image->entry_point = load;
> +	/* Load the image and set up the spl_image structure */
> +	spl_load_fit_image(info, sector, fit, base_offset, node, spl_image);
>  	spl_image->os = IH_OS_U_BOOT;
>  
> -	/*
> -	 * Work out where to place the image. We read it so that the first
> -	 * byte will be at 'load'. This may mean we need to load it starting
> -	 * before then, since we can only read whole blocks.
> -	 */
> -	data_offset += base_offset;
> -	sectors = get_aligned_image_size(info, data_size, data_offset);
> -	load_ptr = (void *)load;
> -	debug("U-Boot size %x, data %p\n", data_size, load_ptr);
> -	dst = load_ptr;
> -
> -	/* Read the image */
> -	src_sector = sector + get_aligned_image_offset(info, data_offset);
> -	debug("Aligned image read: dst=%p, src_sector=%x, sectors=%x\n",
> -	      dst, src_sector, sectors);
> -	count = info->read(info, src_sector, sectors, dst);
> -	if (count != sectors)
> -		return -EIO;
> -	debug("image: dst=%p, data_offset=%x, size=%x\n", dst, data_offset,
> -	      data_size);
> -	src = dst + get_aligned_image_overhead(info, data_offset);
> -
> -#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
> -	board_fit_image_post_process((void **)&src, (size_t *)&data_size);
> -#endif
> -
> -	memcpy(dst, src, data_size);
> -
>  	/* Figure out which device tree the board wants to use */
>  	node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP, 0);
>  	if (node < 0) {
>  		debug("%s: cannot find FDT node\n", __func__);
>  		return node;
>  	}
> -	fdt_offset = fdt_getprop_u32(fit, node, "data-offset");
> -	fdt_len = fdt_getprop_u32(fit, node, "data-size");
> -
> -	/*
> -	 * Read the device tree and place it after the image. There may be
> -	 * some extra data before it since we can only read entire blocks.
> -	 * And also align the destination address to ARCH_DMA_MINALIGN.
> -	 */
> -	dst = (void *)((load + data_size + align_len) & ~align_len);
> -	fdt_offset += base_offset;
> -	sectors = get_aligned_image_size(info, fdt_len, fdt_offset);
> -	src_sector = sector + get_aligned_image_offset(info, fdt_offset);
> -	count = info->read(info, src_sector, sectors, dst);
> -	debug("Aligned fdt read: dst %p, src_sector = %x, sectors %x\n",
> -	      dst, src_sector, sectors);
> -	if (count != sectors)
> -		return -EIO;
>  
>  	/*
> -	 * Copy the device tree so that it starts immediately after the image.
> -	 * After this we will have the U-Boot image and its device tree ready
> -	 * for us to start.
> +	 * Read the device tree and place it after the image.
> +	 * Align the destination address to ARCH_DMA_MINALIGN.
>  	 */
> -	debug("fdt: dst=%p, data_offset=%x, size=%x\n", dst, fdt_offset,
> -	      fdt_len);
> -	src = dst + get_aligned_image_overhead(info, fdt_offset);
> -	dst = load_ptr + data_size;
> -
> -#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
> -	board_fit_image_post_process((void **)&src, (size_t *)&fdt_len);
> -#endif
> -
> -	memcpy(dst, src, fdt_len);
> +	image_info.load_addr = spl_image->load_addr + spl_image->size;
> +	spl_load_fit_image(info, sector, fit, base_offset, node, &image_info);
>  
>  	return 0;
>  }
> 

  reply	other threads:[~2017-03-03 16:56 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-01  2:25 [U-Boot] [PATCH 00/17] SPL: extend FIT loading support Andre Przywara
2017-03-01  2:25 ` [U-Boot] [PATCH 01/17] armv8: spl: Call spl_relocate_stack_gd for ARMv8 Andre Przywara
2017-03-01  2:25 ` [U-Boot] [PATCH 02/17] SPL: FIT: refactor FDT loading Andre Przywara
2017-03-03  4:53   ` Simon Glass
2017-03-03 11:09     ` Andre Przywara
2017-03-08 21:01       ` Simon Glass
2017-03-14 10:52   ` Lokesh Vutla
2017-03-01  2:25 ` [U-Boot] [PATCH 03/17] SPL: FIT: rework U-Boot image loading Andre Przywara
2017-03-03  4:53   ` Simon Glass
2017-03-14 10:53   ` Lokesh Vutla
2017-03-01  2:25 ` [U-Boot] [PATCH 04/17] SPL: FIT: factor out spl_load_fit_image() Andre Przywara
2017-03-03 16:56   ` Andrew F. Davis [this message]
2017-03-03 19:03     ` Franklin S Cooper Jr
2017-03-08 21:00   ` Simon Glass
2017-03-14 10:53   ` Lokesh Vutla
2017-03-01  2:25 ` [U-Boot] [PATCH 05/17] SPL: FIT: allow loading multiple images Andre Przywara
2017-03-08 21:00   ` Simon Glass
2017-03-27  1:19     ` André Przywara
2017-04-01  4:22       ` Simon Glass
2017-03-14 10:53   ` Lokesh Vutla
2017-03-01  2:25 ` [U-Boot] [PATCH 06/17] tools: mksunxiboot: allow larger SPL binaries Andre Przywara
2017-03-08 21:01   ` Simon Glass
2017-03-29 14:43   ` [U-Boot] [linux-sunxi] " Olliver Schinagl
2017-03-29 14:54     ` Andre Przywara
2017-03-01  2:25 ` [U-Boot] [PATCH 07/17] armv8: SPL: only compile GIC code if needed Andre Przywara
2017-03-08 21:01   ` Simon Glass
2017-03-01  2:25 ` [U-Boot] [PATCH 08/17] armv8: fsl: move ccn504 code into FSL Makefile Andre Przywara
2017-03-08 21:01   ` Simon Glass
2017-03-27  1:18     ` André Przywara
2017-03-01  2:25 ` [U-Boot] [PATCH 09/17] sunxi: A64: move SPL stack to end of SRAM A2 Andre Przywara
2017-03-08 21:01   ` Simon Glass
2017-03-01  2:25 ` [U-Boot] [PATCH 10/17] sunxi: SPL: store RAM size in gd Andre Przywara
2017-03-08 21:01   ` Simon Glass
2017-03-01  2:25 ` [U-Boot] [PATCH 11/17] sunxi: SPL: add FIT config selector for Pine64 boards Andre Przywara
2017-03-01  3:03   ` [U-Boot] [linux-sunxi] " Icenowy Zheng
2017-03-03  0:47     ` André Przywara
2017-03-08 21:01   ` [U-Boot] " Simon Glass
2017-03-01  2:25 ` [U-Boot] [PATCH 12/17] Makefile: add rules to generate SPL FIT images Andre Przywara
2017-03-03 16:58   ` Andrew F. Davis
2017-03-08 21:01   ` Simon Glass
2017-03-01  2:25 ` [U-Boot] [PATCH 13/17] sunxi: A64: Pine64: introduce FIT generator script Andre Przywara
2017-03-08 21:01   ` Simon Glass
2017-03-01  2:25 ` [U-Boot] [PATCH 14/17] sunxi: Pine64: defconfig: enable SPL FIT support Andre Przywara
2017-03-01 15:51   ` Maxime Ripard
2017-03-01  2:25 ` [U-Boot] [PATCH 15/17] sunxi: OrangePi-PC2: " Andre Przywara
2017-03-08 21:01   ` Simon Glass
2017-03-01  2:25 ` [U-Boot] [PATCH 16/17] sunxi: Store the device tree name in the SPL header Andre Przywara
2017-03-08 21:01   ` Simon Glass
2017-03-27  1:18     ` André Przywara
2017-04-01  4:22       ` Simon Glass
2017-03-01  2:25 ` [U-Boot] [PATCH 17/17] sunxi: use SPL header DT name for FIT board matching Andre Przywara
2017-03-08 21:01   ` Simon Glass
2017-03-06 11:24 ` [U-Boot] [PATCH 00/17] SPL: extend FIT loading support Kever Yang
2017-03-14 11:03 ` Dr. Philipp Tomsich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b64921f2-548c-f385-8680-7b3a48faaf30@ti.com \
    --to=afd@ti.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.