Save the no-map information present in reserve-memory node to allow
correct handling when the MMU is configured in board to avoid
speculative access.

Signed-off-by: Patrick Delaunay <patrick.delau...@st.com>
---

 common/image-fdt.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/common/image-fdt.c b/common/image-fdt.c
index f13eefb061..85346c9672 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -74,18 +74,20 @@ static const image_header_t *image_get_fdt(ulong fdt_addr)
 #endif
 
 static void boot_fdt_reserve_region(struct lmb *lmb, uint64_t addr,
-                                   uint64_t size)
+                                   uint64_t size, enum lmb_flags flags)
 {
        long ret;
 
-       ret = lmb_reserve(lmb, addr, size);
+       ret = lmb_reserve_flags(lmb, addr, size, flags);
        if (ret >= 0) {
-               debug("   reserving fdt memory region: addr=%llx size=%llx\n",
-                     (unsigned long long)addr, (unsigned long long)size);
+               debug("   reserving fdt memory region: addr=%llx size=%llx 
flags=%x\n",
+                     (unsigned long long)addr,
+                     (unsigned long long)size, flags);
        } else {
                puts("ERROR: reserving fdt memory region failed ");
-               printf("(addr=%llx size=%llx)\n",
-                      (unsigned long long)addr, (unsigned long long)size);
+               printf("(addr=%llx size=%llx flags=%x)\n",
+                      (unsigned long long)addr,
+                      (unsigned long long)size, flags);
        }
 }
 
@@ -105,6 +107,7 @@ void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void 
*fdt_blob)
        int i, total, ret;
        int nodeoffset, subnode;
        struct fdt_resource res;
+       enum lmb_flags flags;
 
        if (fdt_check_header(fdt_blob) != 0)
                return;
@@ -114,7 +117,7 @@ void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void 
*fdt_blob)
        for (i = 0; i < total; i++) {
                if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0)
                        continue;
-               boot_fdt_reserve_region(lmb, addr, size);
+               boot_fdt_reserve_region(lmb, addr, size, LMB_NONE);
        }
 
        /* process reserved-memory */
@@ -126,9 +129,13 @@ void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void 
*fdt_blob)
                        ret = fdt_get_resource(fdt_blob, subnode, "reg", 0,
                                               &res);
                        if (!ret && fdtdec_get_is_enabled(fdt_blob, subnode)) {
+                               flags = LMB_NONE;
+                               if (fdtdec_get_bool(fdt_blob, subnode,
+                                                   "no-map"))
+                                       flags = LMB_NOMAP;
                                addr = res.start;
                                size = res.end - res.start + 1;
-                               boot_fdt_reserve_region(lmb, addr, size);
+                               boot_fdt_reserve_region(lmb, addr, size, flags);
                        }
 
                        subnode = fdt_next_subnode(fdt_blob, subnode);
-- 
2.17.1

Reply via email to