diff options
| -rw-r--r-- | common/fdt_support.c | 39 | ||||
| -rw-r--r-- | include/fdt_support.h | 1 | ||||
| -rw-r--r-- | lib_ppc/bootm.c | 32 | 
3 files changed, 44 insertions, 28 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; +} diff --git a/include/fdt_support.h b/include/fdt_support.h index f14ab68ff..aa0fc5801 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -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 */ diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c index b86169a93..300e00a2d 100644 --- a/lib_ppc/bootm.c +++ b/lib_ppc/bootm.c @@ -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); |