]> git.sur5r.net Git - u-boot/blobdiff - common/image.c
Merge branch 'master' of git://git.denx.de/u-boot-arm
[u-boot] / common / image.c
index c86b86fbe70f4316d95e0c5e74dff31b9ce7f527..e542a5736710ec94ef547158211c0365bc2372e3 100644 (file)
@@ -454,6 +454,22 @@ phys_size_t getenv_bootm_size(void)
 #endif
 }
 
+phys_size_t getenv_bootm_mapsize(void)
+{
+       phys_size_t tmp;
+       char *s = getenv ("bootm_mapsize");
+       if (s) {
+               tmp = (phys_size_t)simple_strtoull (s, NULL, 16);
+               return tmp;
+       }
+
+#if defined(CONFIG_SYS_BOOTMAPSZ)
+       return CONFIG_SYS_BOOTMAPSZ;
+#else
+       return getenv_bootm_size();
+#endif
+}
+
 void memmove_wd (void *to, void *from, size_t len, ulong chunksz)
 {
        if (to == from)
@@ -1169,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
@@ -1186,7 +1230,6 @@ static int fit_check_fdt (const void *fit, int fdt_noffset, int verify)
  *      0 - success
  *      1 - failure
  */
-#if defined(CONFIG_SYS_BOOTMAPSZ)
 int boot_relocate_fdt (struct lmb *lmb, char **of_flat_tree, ulong *of_size)
 {
        void    *fdt_blob = *of_flat_tree;
@@ -1207,7 +1250,7 @@ int boot_relocate_fdt (struct lmb *lmb, char **of_flat_tree, ulong *of_size)
        /* Pad the FDT by a specified amount */
        of_len = *of_size + CONFIG_SYS_FDT_PAD;
        of_start = (void *)(unsigned long)lmb_alloc_base(lmb, of_len, 0x1000,
-                       CONFIG_SYS_BOOTMAPSZ + getenv_bootm_low());
+                       getenv_bootm_mapsize() + getenv_bootm_low());
 
        if (of_start == 0) {
                puts("device tree - allocation error\n");
@@ -1236,7 +1279,7 @@ int boot_relocate_fdt (struct lmb *lmb, char **of_flat_tree, ulong *of_size)
 error:
        return 1;
 }
-#endif /* CONFIG_SYS_BOOTMAPSZ */
+#endif /* CONFIG_OF_LIBFDT */
 
 /**
  * boot_get_fdt - main fdt handling routine
@@ -1581,7 +1624,7 @@ int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
        char *s;
 
        cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
-                                    CONFIG_SYS_BOOTMAPSZ + getenv_bootm_low());
+                               getenv_bootm_mapsize() + getenv_bootm_low());
 
        if (cmdline == NULL)
                return -1;
@@ -1617,7 +1660,7 @@ int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
 int boot_get_kbd (struct lmb *lmb, bd_t **kbd)
 {
        *kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf,
-                                    CONFIG_SYS_BOOTMAPSZ + getenv_bootm_low());
+                               getenv_bootm_mapsize() + getenv_bootm_low());
        if (*kbd == NULL)
                return -1;