]> git.sur5r.net Git - u-boot/commitdiff
Respect memreserve regions specified in the device tree
authorGrant Likely <grant.likely@linaro.org>
Mon, 28 Mar 2011 09:59:01 +0000 (09:59 +0000)
committerGerald Van Baren <gvb@unssw.com>
Tue, 26 Apr 2011 01:11:21 +0000 (21:11 -0400)
If a regions is reserved in the fdt, then it should not be used.  Add
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@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 6be22c474a4c0365c24ad23fcf3ebe52acb2a6c2..e01787dcb77f6eac861295ac59aa34645020d830 100644 (file)
@@ -239,6 +239,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 a23e465696cdcf983ad401793469d7d738056997..1966da48ca49ea1a250b429b1a11a6d76bac2e5d 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 5ce4b1bd24e32ddee909cc9b94c60536a9ff041c..e542a5736710ec94ef547158211c0365bc2372e3 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 8c405573147bad27bb2232bdb98c4c73e93774a0..c31e862d32252da2bb2356e0f8e6d3f32af0344a 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