To allow for dynamic allocation of the area where the image will be loaded,
adapt spl_load_fit_image() to be able to get the size of the image without
doing to the actual load.

Signed-off-by: Jean-Jacques Hiblot <jjhib...@ti.com>
---

 common/spl/spl_fit.c | 26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index db436268cb..90bf458ee8 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -164,12 +164,15 @@ static int get_aligned_image_size(struct spl_load_info 
*info, int data_size,
  *             If the FIT node does not contain a "load" (address) property,
  *             the image gets loaded to the address pointed to by the
  *             load_addr member in this struct.
+ * @no_load:   If true, the data is not loaded from the medium. Used to get
+ *             the size of the data in the case of a dynamic allocation of
+ *             the memory.
  *
  * Return:     0 on success or a negative error number.
  */
 static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
                              void *fit, ulong base_offset, int node,
-                             struct spl_image_info *image_info)
+                             struct spl_image_info *image_info, bool no_load)
 {
        int offset;
        size_t length;
@@ -216,7 +219,20 @@ static int spl_load_fit_image(struct spl_load_info *info, 
ulong sector,
 
                load_ptr = (load_addr + align_len) & ~align_len;
                length = len;
+       } else {
+               /* Embedded data */
+               if (fit_image_get_data(fit, node, &data, &length)) {
+                       puts("Cannot get image data/size\n");
+                       return -ENOENT;
+               }
+       }
 
+       if (no_load && image_info) {
+               image_info->size = length;
+               return 0;
+       }
+
+       if (external_data) {
                overhead = get_aligned_image_overhead(info, offset);
                nr_sectors = get_aligned_image_size(info, length, offset);
 
@@ -293,7 +309,7 @@ static int spl_fit_append_fdt(struct spl_image_info 
*spl_image,
         */
        image_info.load_addr = spl_image->load_addr + spl_image->size;
        ret = spl_load_fit_image(info, sector, fit, base_offset, node,
-                                &image_info);
+                                &image_info, false);
 
        if (ret < 0)
                return ret;
@@ -401,7 +417,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
        if (node >= 0) {
                /* Load the image and set up the spl_image structure */
                ret = spl_load_fit_image(info, sector, fit, base_offset, node,
-                                        spl_image);
+                                        spl_image, false);
                if (ret) {
                        printf("%s: Cannot load the FPGA: %i\n", __func__, ret);
                        return ret;
@@ -453,7 +469,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
 
        /* Load the image and set up the spl_image structure */
        ret = spl_load_fit_image(info, sector, fit, base_offset, node,
-                                spl_image);
+                                spl_image, false);
        if (ret)
                return ret;
 
@@ -485,7 +501,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
                        break;
 
                ret = spl_load_fit_image(info, sector, fit, base_offset, node,
-                                        &image_info);
+                                        &image_info, false);
                if (ret < 0)
                        continue;
 
-- 
2.17.1

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

Reply via email to