diff options
author | York Sun <york.sun@nxp.com> | 2016-02-29 15:48:41 -0800 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2016-03-14 19:18:41 -0400 |
commit | c1913cb7897f77a26791765ef9c3c02b3588f3c1 (patch) | |
tree | 32275b55c9c32600ea3848cf5a083278093cc5bc /common | |
parent | 6004765d14b81210cabc6b0ed807bc0a9f12cdab (diff) |
common: image-fit: Fix load and entry addresses in FIT image
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>
Diffstat (limited to 'common')
-rw-r--r-- | common/image-fit.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/common/image-fit.c b/common/image-fit.c index 9e275692ec7..25f8a1183d5 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; } |