diff options
author | Kumar Gala <galak@kernel.crashing.org> | 2008-08-15 08:24:42 -0500 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2008-08-26 23:43:36 +0200 |
commit | 3082d2348c8e13342f5fdd10e9b3f7408062dbf9 (patch) | |
tree | a856dae8fd63dd52dd0270c6ad65d4b72882afc0 /common/fdt_support.c | |
parent | 396f635b8ff3ccbc38d75d5eda98444c6466810a (diff) | |
download | u-boot-3082d2348c8e13342f5fdd10e9b3f7408062dbf9.tar.gz u-boot-3082d2348c8e13342f5fdd10e9b3f7408062dbf9.tar.bz2 u-boot-3082d2348c8e13342f5fdd10e9b3f7408062dbf9.zip |
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.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/common/fdt_support.c b/common/fdt_support.c index 405b9dbda9..c0ca9e0600 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; +} |