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>
This commit is contained in:
parent
396f635b8f
commit
3082d2348c
|
@ -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…
Reference in New Issue