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>
master
Kumar Gala 16 years ago committed by Wolfgang Denk
parent 396f635b8f
commit 3082d2348c
  1. 39
      common/fdt_support.c
  2. 1
      include/fdt_support.h
  3. 32
      lib_ppc/bootm.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;
}

@ -69,6 +69,7 @@ void ft_pci_setup(void *blob, bd_t *bd);
#endif
void set_working_fdt_addr(void *addr);
int fdt_resize(void *blob);
#endif /* ifdef CONFIG_OF_LIBFDT */
#endif /* ifndef __FDT_SUPPORT_H */

@ -162,38 +162,14 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
/* Fixup the fdt memreserve now that we know how big it is */
if (of_flat_tree) {
int j;
uint64_t addr, size;
int total = fdt_num_mem_rsv(of_flat_tree);
uint actualsize;
for (j = 0; j < total; j++) {
fdt_get_mem_rsv(of_flat_tree, j, &addr, &size);
if (addr == (uint64_t)(u32)of_flat_tree) {
fdt_del_mem_rsv(of_flat_tree, j);
break;
}
}
/* Delete the old LMB reservation */
lmb_free(lmb, (phys_addr_t)(u32)of_flat_tree,
(phys_size_t)fdt_totalsize(of_flat_tree));
/* Calculate the actual size of the fdt */
actualsize = fdt_off_dt_strings(of_flat_tree) +
fdt_size_dt_strings(of_flat_tree);
/* Make it so the fdt ends on a page boundary */
actualsize = ALIGN(actualsize, 0x1000);
actualsize = actualsize - ((uint)of_flat_tree & 0xfff);
/* Change the fdt header to reflect the correct size */
fdt_set_totalsize(of_flat_tree, actualsize);
of_size = actualsize;
/* Add the new reservation */
ret = fdt_add_mem_rsv(of_flat_tree, (uint)of_flat_tree,
of_size);
ret = fdt_resize(of_flat_tree);
if (ret < 0)
goto error;
of_size = ret;
/* Create a new LMB reservation */
lmb_reserve(lmb, (ulong)of_flat_tree, of_size);

Loading…
Cancel
Save