diff mbox

[U-Boot,v2,4/5] spl: fit: Support both external and embedded data

Message ID 1502147786-8269-5-git-send-email-york.sun@nxp.com
State Superseded
Delegated to: York Sun
Headers show

Commit Message

York Sun Aug. 7, 2017, 11:16 p.m. UTC
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@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(-)

Comments

Tom Rini Aug. 10, 2017, 12:44 a.m. UTC | #1
On Mon, Aug 07, 2017 at 04:16:25PM -0700, York Sun 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@nxp.com>
> 

Reviewed-by: Tom Rini <trini@konsulko.com>
Simon Glass Aug. 13, 2017, 9:35 p.m. UTC | #2
Hi York,

On 7 August 2017 at 17:16, York Sun <york.sun@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@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
York Sun Aug. 14, 2017, 4:48 p.m. UTC | #3
On 08/13/2017 02:35 PM, Simon Glass wrote:
> Hi York,
> 
> On 7 August 2017 at 17:16, York Sun <york.sun@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@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?

Yes. That's my plan. I have been waiting for Andre to comment on the 
priority of "kervel" vs "firmware". I believe it makes sense to favor 
"kernel" when falcon boot is enabled. The U-Boot image shouldn't contain 
"kernel" node in falcon boot scenario. Or it can be changed to 
"standalone" as Andre did for U-Boot image (to favor "loadables").

York
diff mbox

Patch

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