Add FIT data-position & data-offset property support for bootm,
which are already supported in SPL.

Signed-off-by: Kelvin Cheung <keguang.zh...@gmail.com>
---

 common/image-fit.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 78 insertions(+), 4 deletions(-)

diff --git a/common/image-fit.c b/common/image-fit.c
index 5b93dce..f21db4b 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -359,11 +359,14 @@ void fit_image_print(const void *fit, int image_noffset, 
const char *p)
 {
        char *desc;
        uint8_t type, arch, os, comp;
-       size_t size;
+       size_t size = 0;
        ulong load, entry;
        const void *data;
        int noffset;
        int ndepth;
+       bool external_data = false;
+       int offset;
+       int len;
        int ret;
 
        /* Mandatory properties */
@@ -391,7 +394,27 @@ void fit_image_print(const void *fit, int image_noffset, 
const char *p)
        fit_image_get_comp(fit, image_noffset, &comp);
        printf("%s  Compression:  %s\n", p, genimg_get_comp_name(comp));
 
-       ret = fit_image_get_data(fit, image_noffset, &data, &size);
+       if (!fit_image_get_data_position(fit, image_noffset, &offset)) {
+               external_data = true;
+       } else if (!fit_image_get_data_offset(fit, image_noffset, &offset)) {
+               external_data = true;
+               /*
+                * For FIT with external data, figure out where
+                * the external images start. This is the base
+                * for the data-offset properties in each image.
+                */
+               size = (fdt_totalsize(fit) + 3) & ~3;
+               offset += size;
+       }
+
+       if (external_data) {
+               printf("%s  External Data\n", p);
+               ret = fit_image_get_data_size(fit, image_noffset, &len);
+               data = fit + offset;
+               size = len;
+       } else {
+               ret = fit_image_get_data(fit, image_noffset, &data, &size);
+       }
 
 #ifndef USE_HOSTCC
        printf("%s  Data Start:   ", p);
@@ -1151,9 +1174,35 @@ int fit_image_verify(const void *fit, int image_noffset)
        size_t          size;
        int             noffset = 0;
        char            *err_msg = "";
+       bool external_data = false;
+       int offset;
+       int len;
+       int ret;
 
        /* Get image data and data length */
-       if (fit_image_get_data(fit, image_noffset, &data, &size)) {
+       if (!fit_image_get_data_position(fit, image_noffset, &offset)) {
+               external_data = true;
+       } else if (!fit_image_get_data_offset(fit, image_noffset, &offset)) {
+               external_data = true;
+               /*
+                * For FIT with external data, figure out where
+                * the external images start. This is the base
+                * for the data-offset properties in each image.
+                */
+               size = (fdt_totalsize(fit) + 3) & ~3;
+               offset += size;
+       }
+
+       if (external_data) {
+               debug("External Data\n");
+               ret = fit_image_get_data_size(fit, image_noffset, &len);
+               data = fit + offset;
+               size = len;
+       } else {
+               ret = fit_image_get_data(fit, image_noffset, &data, &size);
+       }
+
+       if (ret) {
                err_msg = "Can't get image data/size";
                printf("error!\n%s for '%s' hash node in '%s' image node\n",
                       err_msg, fit_get_name(fit, noffset, NULL),
@@ -1750,6 +1799,9 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
        uint8_t os_arch;
 #endif
        const char *prop_name;
+       bool external_data = false;
+       int offset;
+       int data_len;
        int ret;
 
        fit = map_sysmem(addr, 0);
@@ -1875,7 +1927,29 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
        bootstage_mark(bootstage_id + BOOTSTAGE_SUB_CHECK_ALL_OK);
 
        /* get image data address and length */
-       if (fit_image_get_data(fit, noffset, &buf, &size)) {
+       if (!fit_image_get_data_position(fit, noffset, &offset)) {
+               external_data = true;
+       } else if (!fit_image_get_data_offset(fit, noffset, &offset)) {
+               external_data = true;
+               /*
+                * For FIT with external data, figure out where
+                * the external images start. This is the base
+                * for the data-offset properties in each image.
+                */
+               size = (fdt_totalsize(fit) + 3) & ~3;
+               offset += size;
+       }
+
+       if (external_data) {
+               debug("External Data\n");
+               ret = fit_image_get_data_size(fit, noffset, &data_len);
+               buf = fit + offset;
+               size = data_len;
+       } else {
+               ret = fit_image_get_data(fit, noffset, &buf, &size);
+       }
+
+       if (ret) {
                printf("Could not find %s subimage data!\n", prop_name);
                bootstage_error(bootstage_id + BOOTSTAGE_SUB_GET_DATA);
                return -ENOENT;
-- 
1.9.1

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

Reply via email to