|
@@ -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;
|