Hi Simon,

On 13/08/2019 11:33, Simon Glass wrote:
Hi Jean-Jacques,

On Mon, 5 Aug 2019 at 03:44, Jean-Jacques Hiblot <jjhib...@ti.com> wrote:
If the node describing an overlay does not specify a load address, it will
be loaded at the address previously used.
Fixing it by allocating a temporary 64kB region that will be used as a
default load address.
How did you come to decide on 64KB? Might this be too large or too small?

It seemed big enough to me to accommodate a DTB overlay.

There is no easy way to know how big the buffer must be without reading it first because it can be compressed.


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

---

Changes in v4:
- make sure that the temp buffer is freed in all cases

Changes in v3: None
Changes in v2: None

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

diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index ab47da5094..977074cd99 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -8,8 +8,9 @@
  #include <errno.h>
  #include <fpga.h>
  #include <image.h>
-#include <linux/libfdt.h>
+#include <malloc.h>
  #include <spl.h>
+#include <linux/libfdt.h>

  #ifndef CONFIG_SYS_BOOTM_LEN
  #define CONFIG_SYS_BOOTM_LEN   (64 << 20)
@@ -302,33 +303,50 @@ static int spl_fit_append_fdt(struct spl_image_info 
*spl_image,
         spl_image->fdt_addr = (void *)image_info.load_addr;
  #if !CONFIG_IS_ENABLED(FIT_IMAGE_TINY)
         if (CONFIG_IS_ENABLED(LOAD_FIT_APPLY_OVERLAY)) {
+               void *tmpbuffer;
+               /*
+                * allocate 64KB of memory. This will be used to store the DT
+                * overlay before it is applied. It may not be used depending on
+                * how the overlay is stored, so don't fail yet if the
+                * allocation failed.
+                */
+               tmpbuffer = malloc(64 * 1024);
+               if (!tmpbuffer)
+                       debug("%s: unable to allocate space for overlays\n",
+                             __func__);
Can you adjust this to only allocate buf when you find it is needed?
could be done.

+
                 for (; ; index++) {
                         node = spl_fit_get_image_node(fit, images, 
FIT_FDT_PROP,
                                                       index);
                         if (node < 0) {
                                 debug("%s: No additional FDT node\n", 
__func__);
-                               return 0;
+                               break;
                         }

+                       image_info.load_addr = (ulong)tmpbuffer;
map_to_sysmem() or this won't work on sandbox.
ok

                         ret = spl_load_fit_image(info, sector, fit, 
base_offset,
                                                  node, &image_info);
                         if (ret < 0)
-                               return ret;
+                               break;

                         /* Make room in FDT for changes from the overlay */
                         ret = fdt_increase_size(spl_image->fdt_addr,
                                                 image_info.size);
                         if (ret < 0)
-                               return ret;
+                               break;

                         ret = fdt_overlay_apply_verbose(spl_image->fdt_addr,
                                                         (void 
*)image_info.load_addr);
map_sysmem()

                         if (ret)
-                               return ret;
+                               break;

                         debug("%s: DT overlay %s applied\n", __func__,
                               fit_get_name(fit, node, NULL));
                 }
+               if (tmpbuffer)
+                       free(tmpbuffer);
+               if (ret)
+                       return ret;
         }
         /* Try to make space, so we can inject details on the loadables */
         ret = fdt_shrink_to_minimum(spl_image->fdt_addr, 8192);
--
2.17.1

Regads,
Simon

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

Reply via email to