aboutsummaryrefslogtreecommitdiff
path: root/common/fdt_support.c
diff options
context:
space:
mode:
authorKumar Gala <galak@kernel.crashing.org>2008-08-15 08:24:42 -0500
committerWolfgang Denk <wd@denx.de>2008-08-26 23:43:36 +0200
commit3082d2348c8e13342f5fdd10e9b3f7408062dbf9 (patch)
treea856dae8fd63dd52dd0270c6ad65d4b72882afc0 /common/fdt_support.c
parent396f635b8ff3ccbc38d75d5eda98444c6466810a (diff)
fdt: refactor fdt resize code
Move the fdt resizing code out of ppc specific boot code and into common fdt support code. Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'common/fdt_support.c')
-rw-r--r--common/fdt_support.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/common/fdt_support.c b/common/fdt_support.c
index 405b9dbda..c0ca9e060 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -531,3 +531,42 @@ void fdt_fixup_crypto_node(void *blob, int sec_rev)
fdt_strerror(err));
}
#endif /* defined(CONFIG_MPC83XX) || defined(CONFIG_MPC85xx) */
+
+/* Resize the fdt to its actual size + a bit of padding */
+int fdt_resize(void *blob)
+{
+ int i;
+ uint64_t addr, size;
+ int total, ret;
+ uint actualsize;
+
+ if (!blob)
+ return 0;
+
+ total = fdt_num_mem_rsv(blob);
+ for (i = 0; i < total; i++) {
+ fdt_get_mem_rsv(blob, i, &addr, &size);
+ if (addr == (uint64_t)(u32)blob) {
+ fdt_del_mem_rsv(blob, i);
+ break;
+ }
+ }
+
+ /* Calculate the actual size of the fdt */
+ actualsize = fdt_off_dt_strings(blob) +
+ fdt_size_dt_strings(blob);
+
+ /* Make it so the fdt ends on a page boundary */
+ actualsize = ALIGN(actualsize, 0x1000);
+ actualsize = actualsize - ((uint)blob & 0xfff);
+
+ /* Change the fdt header to reflect the correct size */
+ fdt_set_totalsize(blob, actualsize);
+
+ /* Add the new reservation */
+ ret = fdt_add_mem_rsv(blob, (uint)blob, actualsize);
+ if (ret < 0)
+ return ret;
+
+ return actualsize;
+}