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....@nxp.com>

---

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 2d29e88..69cf598 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,
                          phys_addr_t *load)
 {
-       int len;
-       const uint32_t *data;
+       int len, cell_len;
+       const fdt32_t *cell;
+       unsigned long long 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(phys_addr_t)) {
+               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 = (phys_addr_t)load64;
 
        return 0;
 }
-- 
1.7.9.5

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to