[U-Boot] [PATCH v6 2/2] common: image-fit: Fix load and entry addresses in FIT image
York Sun
york.sun at nxp.com
Tue Mar 1 00:48:41 CET 2016
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 at 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(-)
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;
}
--
1.7.9.5
More information about the U-Boot
mailing list