]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
If a regions is reserved in the fdt, then it should not be used. Add
authorGrant Likely <grant.likely at linaro.org>
Fri, 13 Jul 2012 08:22:41 +0000 (13:52 +0530)
committerJagan <jaganna@xilinx.com>
Fri, 13 Jul 2012 08:22:41 +0000 (13:52 +0530)
the memreserve regions to the lmb so that u-boot doesn't use them to
store the initrd.

Signed-off-by: Grant Likely <grant.likely at linaro.org>
arch/arm/lib/bootm.c
arch/powerpc/lib/bootm.c
common/cmd_bootm.c
common/image.c
include/image.h

index aba13f4e86f7b1b102668c5cdc4a033e5365b6db..802e833a2ed584fe1365dacd4a033665eeb2f5d7 100644 (file)
@@ -187,6 +187,8 @@ static int bootm_linux_fdt(int machid, bootm_headers_t *images)
 
        kernel_entry = (void (*)(int, int, void *))images->ep;
 
+       boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
+
        rd_len = images->rd_end - images->rd_start;
        ret = boot_ramdisk_high(lmb, images->rd_start, rd_len,
                                initrd_start, initrd_end);
index 180ee30049c520f179e5f98c90d7b3d126385e9f..474431301bb47d32d2c991f791da59966de5b02d 100644 (file)
@@ -234,6 +234,10 @@ static int boot_body_linux(bootm_headers_t *images)
 
        int ret;
 
+#if defined(CONFIG_OF_LIBFDT)
+       boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
+#endif
+
        /* allocate space and init command line */
        ret = boot_cmdline_linux(images);
        if (ret)
index 8a0a99e2d33b229d7c840d65f79c26dbb2c11f27..87298528d8050f216b71c629d1842630eab836ab 100644 (file)
@@ -547,6 +547,8 @@ int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
 #if defined(CONFIG_OF_LIBFDT)
                case BOOTM_STATE_FDT:
                {
+                       boot_fdt_add_mem_rsv_regions(&images.lmb,
+                                                    images.ft_addr);
                        ret = boot_relocate_fdt(&images.lmb,
                                &images.ft_addr, &images.ft_len);
                        break;
index 127eda2699fcc7f709cf2fbafb83a275cb461efb..d783808d288eca9389c41da4e4c1c6852bcc2b72 100644 (file)
@@ -1185,6 +1185,34 @@ static int fit_check_fdt (const void *fit, int fdt_noffset, int verify)
 #define CONFIG_SYS_FDT_PAD 0x3000
 #endif
 
+#if defined(CONFIG_OF_LIBFDT)
+/**
+ * boot_fdt_add_mem_rsv_regions - Mark the memreserve 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.
+ */
+void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob)
+{
+       uint64_t addr, size;
+       int i, total;
+
+       if (fdt_check_header (fdt_blob) != 0)
+               return;
+
+       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_relocate_fdt - relocate flat device tree
  * @lmb: pointer to lmb handle, will be used for memory mgmt
@@ -1202,7 +1230,6 @@ static int fit_check_fdt (const void *fit, int fdt_noffset, int verify)
  *      0 - success
  *      1 - failure
  */
-#if defined(CONFIG_OF_LIBFDT)
 int boot_relocate_fdt (struct lmb *lmb, char **of_flat_tree, ulong *of_size)
 {
        void    *fdt_blob = *of_flat_tree;
index b77cb7912a8812b142b2040bad5369a774de128d..43e6ab671eb9ff7c8f3aa607e2601efffd4d0bf3 100644 (file)
@@ -336,6 +336,7 @@ int boot_get_ramdisk (int argc, char * const argv[], bootm_headers_t *images,
 #ifdef CONFIG_OF_LIBFDT
 int boot_get_fdt (int flag, int argc, char * const argv[], bootm_headers_t *images,
                char **of_flat_tree, ulong *of_size);
+void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob);
 int boot_relocate_fdt (struct lmb *lmb, char **of_flat_tree, ulong *of_size);
 #endif