fdt: parse "reserved-memory" for memory reservation
authorSimon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
Mon, 14 Jan 2019 21:38:17 +0000 (22:38 +0100)
committerTom Rini <trini@konsulko.com>
Wed, 16 Jan 2019 21:37:03 +0000 (16:37 -0500)
boot_fdt_add_mem_rsv_regions() adds reserved memory sections to an lmb
struct. Currently, it only parses regions described by /memreserve/
entries.

Extend this to the more commonly used scheme of the "reserved-memory"
node.

Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/image-fdt.c
lib/Makefile

index 8ee5a13..5988808 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <common.h>
 #include <fdt_support.h>
+#include <fdtdec.h>
 #include <errno.h>
 #include <image.h>
 #include <linux/libfdt.h>
@@ -67,30 +68,66 @@ 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)
+{
+       int ret;
+
+       ret = lmb_reserve(lmb, addr, size);
+       if (!ret) {
+               debug("   reserving fdt memory region: addr=%llx size=%llx\n",
+                     (unsigned long long)addr, (unsigned long long)size);
+       } else {
+               puts("ERROR: reserving fdt memory region failed ");
+               printf("(addr=%llx size=%llx)\n",
+                      (unsigned long long)addr, (unsigned long long)size);
+       }
+}
+
 /**
- * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable
+ * boot_fdt_add_mem_rsv_regions - Mark the memreserve and reserved-memory
+ * sections as unusable
  * @lmb: pointer to lmb handle, will be used for memory mgmt
  * @fdt_blob: pointer to fdt blob base address
  *
- * Adds the memreserve regions in the dtb to the lmb block.  Adding the
- * memreserve regions prevents u-boot from using them to store the initrd
- * or the fdt blob.
+ * Adds the and reserved-memorymemreserve regions in the dtb to the lmb block.
+ * Adding the memreserve regions prevents u-boot from using them to store the
+ * initrd or the fdt blob.
  */
 void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob)
 {
        uint64_t addr, size;
-       int i, total;
+       int i, total, ret;
+       int nodeoffset, subnode;
+       struct fdt_resource res;
 
        if (fdt_check_header(fdt_blob) != 0)
                return;
 
+       /* process memreserve sections */
        total = fdt_num_mem_rsv(fdt_blob);
        for (i = 0; i < total; i++) {
                if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0)
                        continue;
-               printf("   reserving fdt memory region: addr=%llx size=%llx\n",
-                      (unsigned long long)addr, (unsigned long long)size);
-               lmb_reserve(lmb, addr, size);
+               boot_fdt_reserve_region(lmb, addr, size);
+       }
+
+       /* process reserved-memory */
+       nodeoffset = fdt_subnode_offset(fdt_blob, 0, "reserved-memory");
+       if (nodeoffset >= 0) {
+               subnode = fdt_first_subnode(fdt_blob, nodeoffset);
+               while (subnode >= 0) {
+                       /* check if this subnode has a reg property */
+                       ret = fdt_get_resource(fdt_blob, subnode, "reg", 0,
+                                              &res);
+                       if (!ret) {
+                               addr = res.start;
+                               size = res.end - res.start + 1;
+                               boot_fdt_reserve_region(lmb, addr, size);
+                       }
+
+                       subnode = fdt_next_subnode(fdt_blob, subnode);
+               }
        }
 }
 
index f06d631..f5de4a8 100644 (file)
@@ -30,6 +30,7 @@ obj-y += crc7.o
 obj-y += crc8.o
 obj-y += crc16.o
 obj-$(CONFIG_ERRNO_STR) += errno_str.o
+obj-$(CONFIG_OF_LIBFDT) += fdtdec.o
 obj-$(CONFIG_FIT) += fdtdec_common.o
 obj-$(CONFIG_TEST_FDTDEC) += fdtdec_test.o
 obj-$(CONFIG_GZIP_COMPRESSED) += gzip.o