diff mbox

[U-Boot,v6,2/2] common: image-fit: Fix load and entry addresses in FIT image

Message ID 1456789721-27590-3-git-send-email-york.sun@nxp.com
State Accepted
Commit c1913cb7897f77a26791765ef9c3c02b3588f3c1
Delegated to: Tom Rini
Headers show

Commit Message

York Sun Feb. 29, 2016, 11:48 p.m. UTC
FIT image supports more than 32 bits in addresses by using #address-cell
field. Fixing 64-bit support by using this field.

Signed-off-by: York Sun <york.sun@nxp.com>

---

Changes in v6:
  Revert back to use original "ulong" instead of "phys_addr_t"
  Abort getting image addresses if address is too long for "ulong"

Changes in v5:
  Split the common function into another patch.
  Revise commit subject.
  Update commit message as suggested by Simon.
  Updated cover letter with testing report.

Changes in v4:
  Separate ulong to phys_addr_t change to another patch.

Changes in v3:
  Define PRIpa for host and target in common/image-fit.c so printf works
  properly for 32-, 64-bit targets and host tools.

Changes in v2:
  Make a common function for both load and entry addresses.
  Simplify calculation of addresses in a similar way as fdtdec_get_number()
  fdtdec_get_number() is not used, or too many files need to be included
    and/or twisted for host tool
  Continue to use %08llx for print format for load and entry addresses
    because %pa does not always work for host tool (mkimage)

 common/image-fit.c |   22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

Comments

Simon Glass March 7, 2016, 2:39 a.m. UTC | #1
On 29 February 2016 at 16:48, York Sun <york.sun@nxp.com> wrote:
> FIT image supports more than 32 bits in addresses by using #address-cell
> field. Fixing 64-bit support by using this field.
>
> Signed-off-by: York Sun <york.sun@nxp.com>
>
> ---
>
> Changes in v6:
>   Revert back to use original "ulong" instead of "phys_addr_t"
>   Abort getting image addresses if address is too long for "ulong"
>
> Changes in v5:
>   Split the common function into another patch.
>   Revise commit subject.
>   Update commit message as suggested by Simon.
>   Updated cover letter with testing report.
>
> Changes in v4:
>   Separate ulong to phys_addr_t change to another patch.
>
> Changes in v3:
>   Define PRIpa for host and target in common/image-fit.c so printf works
>   properly for 32-, 64-bit targets and host tools.
>
> Changes in v2:
>   Make a common function for both load and entry addresses.
>   Simplify calculation of addresses in a similar way as fdtdec_get_number()
>   fdtdec_get_number() is not used, or too many files need to be included
>     and/or twisted for host tool
>   Continue to use %08llx for print format for load and entry addresses
>     because %pa does not always work for host tool (mkimage)
>
>  common/image-fit.c |   22 +++++++++++++++++-----
>  1 file changed, 17 insertions(+), 5 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>
Tom Rini March 15, 2016, 11:57 a.m. UTC | #2
On Mon, Feb 29, 2016 at 03:48:41PM -0800, York Sun wrote:

> FIT image supports more than 32 bits in addresses by using #address-cell
> field. Fixing 64-bit support by using this field.
> 
> Signed-off-by: York Sun <york.sun@nxp.com>
> Reviewed-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/common/image-fit.c b/common/image-fit.c
index 7ce3e35..b5f7c4c 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -678,16 +678,28 @@  int fit_image_get_comp(const void *fit, int noffset, uint8_t *comp)
 static int fit_image_get_address(const void *fit, int noffset, char *name,
 			  ulong *load)
 {
-	int len;
-	const uint32_t *data;
+	int len, cell_len;
+	const fdt32_t *cell;
+	uint64_t load64 = 0;
 
-	data = fdt_getprop(fit, noffset, name, &len);
-	if (data == NULL) {
+	cell = fdt_getprop(fit, noffset, name, &len);
+	if (cell == NULL) {
 		fit_get_debug(fit, noffset, name, len);
 		return -1;
 	}
 
-	*load = uimage_to_cpu(*data);
+	if (len > sizeof(ulong)) {
+		printf("Unsupported %s address size\n", name);
+		return -1;
+	}
+
+	cell_len = len >> 2;
+	/* Use load64 to avoid compiling warning for 32-bit target */
+	while (cell_len--) {
+		load64 = (load64 << 32) | uimage_to_cpu(*cell);
+		cell++;
+	}
+	*load = (ulong)load64;
 
 	return 0;
 }