diff options
author | Grant Likely <grant.likely@linaro.org> | 2011-03-28 09:59:01 +0000 |
---|---|---|
committer | Gerald Van Baren <gvb@unssw.com> | 2011-04-25 21:11:21 -0400 |
commit | 55b0a39314562087143f439ecae57379b97db9aa (patch) | |
tree | d3879cdbabfd2386a30a261819e3d5d9b4c0c326 /common | |
parent | ce6b27a874fe30e7126ae93c060277770ee85ced (diff) |
Respect memreserve regions specified in the device tree
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>
Diffstat (limited to 'common')
-rw-r--r-- | common/cmd_bootm.c | 2 | ||||
-rw-r--r-- | common/image.c | 29 |
2 files changed, 30 insertions, 1 deletions
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index a23e465696c..1966da48ca4 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -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; diff --git a/common/image.c b/common/image.c index 5ce4b1bd24e..e542a573671 100644 --- a/common/image.c +++ b/common/image.c @@ -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; |