diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/fdt_support.c | 66 | 
1 files changed, 34 insertions, 32 deletions
| diff --git a/common/fdt_support.c b/common/fdt_support.c index 1f0d8f5fe..a3f7442c3 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -21,6 +21,34 @@   */  DECLARE_GLOBAL_DATA_PTR; +/* + * Get cells len in bytes + *     if #NNNN-cells property is 2 then len is 8 + *     otherwise len is 4 + */ +static int get_cells_len(void *blob, char *nr_cells_name) +{ +	const fdt32_t *cell; + +	cell = fdt_getprop(blob, 0, nr_cells_name, NULL); +	if (cell && fdt32_to_cpu(*cell) == 2) +		return 8; + +	return 4; +} + +/* + * Write a 4 or 8 byte big endian cell + */ +static void write_cell(u8 *addr, u64 val, int size) +{ +	int shift = (size - 1) * 8; +	while (size-- > 0) { +		*addr++ = (val >> shift) & 0xff; +		shift -= 8; +	} +} +  /**   * fdt_getprop_u32_default - Find a node and return it's property or a default   * @@ -131,9 +159,9 @@ static int fdt_fixup_stdout(void *fdt, int chosenoff)  int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)  { -	int   nodeoffset; +	int   nodeoffset, addr_cell_len;  	int   err, j, total; -	fdt32_t  tmp; +	fdt64_t  tmp;  	const char *path;  	uint64_t addr, size; @@ -170,9 +198,11 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)  		return err;  	} +	addr_cell_len = get_cells_len(fdt, "#address-cells"); +  	path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL);  	if ((path == NULL) || force) { -		tmp = cpu_to_fdt32(initrd_start); +		write_cell((u8 *)&tmp, initrd_start, addr_cell_len);  		err = fdt_setprop(fdt, nodeoffset,  			"linux,initrd-start", &tmp, sizeof(tmp));  		if (err < 0) { @@ -181,7 +211,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)  				fdt_strerror(err));  			return err;  		} -		tmp = cpu_to_fdt32(initrd_end); +		write_cell((u8 *)&tmp, initrd_end, addr_cell_len);  		err = fdt_setprop(fdt, nodeoffset,  			"linux,initrd-end", &tmp, sizeof(tmp));  		if (err < 0) { @@ -343,34 +373,6 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,  	do_fixup_by_compat(fdt, compat, prop, &tmp, 4, create);  } -/* - * Get cells len in bytes - *     if #NNNN-cells property is 2 then len is 8 - *     otherwise len is 4 - */ -static int get_cells_len(void *blob, char *nr_cells_name) -{ -	const fdt32_t *cell; - -	cell = fdt_getprop(blob, 0, nr_cells_name, NULL); -	if (cell && fdt32_to_cpu(*cell) == 2) -		return 8; - -	return 4; -} - -/* - * Write a 4 or 8 byte big endian cell - */ -static void write_cell(u8 *addr, u64 val, int size) -{ -	int shift = (size - 1) * 8; -	while (size-- > 0) { -		*addr++ = (val >> shift) & 0xff; -		shift -= 8; -	} -} -  #ifdef CONFIG_NR_DRAM_BANKS  #define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS  #else |