diff options
Diffstat (limited to 'common/fdt_support.c')
| -rw-r--r-- | common/fdt_support.c | 87 | 
1 files changed, 47 insertions, 40 deletions
| diff --git a/common/fdt_support.c b/common/fdt_support.c index 6b9fa0550..812acb401 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -28,7 +28,6 @@  #include <linux/ctype.h>  #include <linux/types.h>  #include <asm/global_data.h> -#include <fdt.h>  #include <libfdt.h>  #include <fdt_support.h>  #include <exports.h> @@ -52,7 +51,7 @@ DECLARE_GLOBAL_DATA_PTR;  u32 fdt_getprop_u32_default(const void *fdt, const char *path,  				const char *prop, const u32 dflt)  { -	const u32 *val; +	const fdt32_t *val;  	int off;  	off = fdt_path_offset(fdt, path); @@ -86,7 +85,7 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,  	if (nodeoff < 0)  		return nodeoff; -	if ((!create) && (fdt_get_property(fdt, nodeoff, prop, 0) == NULL)) +	if ((!create) && (fdt_get_property(fdt, nodeoff, prop, NULL) == NULL))  		return 0; /* create flag not set; so exit quietly */  	return fdt_setprop(fdt, nodeoff, prop, val, len); @@ -150,7 +149,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)  {  	int   nodeoffset;  	int   err, j, total; -	u32   tmp; +	fdt32_t  tmp;  	const char *path;  	uint64_t addr, size; @@ -189,7 +188,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)  	path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL);  	if ((path == NULL) || force) { -		tmp = __cpu_to_be32(initrd_start); +		tmp = cpu_to_fdt32(initrd_start);  		err = fdt_setprop(fdt, nodeoffset,  			"linux,initrd-start", &tmp, sizeof(tmp));  		if (err < 0) { @@ -198,7 +197,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)  				fdt_strerror(err));  			return err;  		} -		tmp = __cpu_to_be32(initrd_end); +		tmp = cpu_to_fdt32(initrd_end);  		err = fdt_setprop(fdt, nodeoffset,  			"linux,initrd-end", &tmp, sizeof(tmp));  		if (err < 0) { @@ -301,8 +300,8 @@ void do_fixup_by_path(void *fdt, const char *path, const char *prop,  void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop,  			  u32 val, int create)  { -	val = cpu_to_fdt32(val); -	do_fixup_by_path(fdt, path, prop, &val, sizeof(val), create); +	fdt32_t tmp = cpu_to_fdt32(val); +	do_fixup_by_path(fdt, path, prop, &tmp, sizeof(tmp), create);  }  void do_fixup_by_prop(void *fdt, @@ -320,7 +319,7 @@ void do_fixup_by_prop(void *fdt,  #endif  	off = fdt_node_offset_by_prop_value(fdt, -1, pname, pval, plen);  	while (off != -FDT_ERR_NOTFOUND) { -		if (create || (fdt_get_property(fdt, off, prop, 0) != NULL)) +		if (create || (fdt_get_property(fdt, off, prop, NULL) != NULL))  			fdt_setprop(fdt, off, prop, val, len);  		off = fdt_node_offset_by_prop_value(fdt, off, pname, pval, plen);  	} @@ -330,8 +329,8 @@ void do_fixup_by_prop_u32(void *fdt,  			  const char *pname, const void *pval, int plen,  			  const char *prop, u32 val, int create)  { -	val = cpu_to_fdt32(val); -	do_fixup_by_prop(fdt, pname, pval, plen, prop, &val, 4, create); +	fdt32_t tmp = cpu_to_fdt32(val); +	do_fixup_by_prop(fdt, pname, pval, plen, prop, &tmp, 4, create);  }  void do_fixup_by_compat(void *fdt, const char *compat, @@ -347,7 +346,7 @@ void do_fixup_by_compat(void *fdt, const char *compat,  #endif  	off = fdt_node_offset_by_compatible(fdt, -1, compat);  	while (off != -FDT_ERR_NOTFOUND) { -		if (create || (fdt_get_property(fdt, off, prop, 0) != NULL)) +		if (create || (fdt_get_property(fdt, off, prop, NULL) != NULL))  			fdt_setprop(fdt, off, prop, val, len);  		off = fdt_node_offset_by_compatible(fdt, off, compat);  	} @@ -356,8 +355,8 @@ void do_fixup_by_compat(void *fdt, const char *compat,  void do_fixup_by_compat_u32(void *fdt, const char *compat,  			    const char *prop, u32 val, int create)  { -	val = cpu_to_fdt32(val); -	do_fixup_by_compat(fdt, compat, prop, &val, 4, create); +	fdt32_t tmp = cpu_to_fdt32(val); +	do_fixup_by_compat(fdt, compat, prop, &tmp, 4, create);  }  /* @@ -367,7 +366,7 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,   */  static int get_cells_len(void *blob, char *nr_cells_name)  { -	const u32 *cell; +	const fdt32_t *cell;  	cell = fdt_getprop(blob, 0, nr_cells_name, NULL);  	if (cell && fdt32_to_cpu(*cell) == 2) @@ -388,13 +387,21 @@ static void write_cell(u8 *addr, u64 val, int size)  	}  } +#define MEMORY_BANKS_MAX 4  int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)  {  	int err, nodeoffset;  	int addr_cell_len, size_cell_len, len; -	u8 tmp[banks * 16]; /* Up to 64-bit address + 64-bit size */ +	u8 tmp[MEMORY_BANKS_MAX * 16]; /* Up to 64-bit address + 64-bit size */  	int bank; +	if (banks > MEMORY_BANKS_MAX) { +		printf("%s: num banks %d exceeds hardcoded limit %d." +		       " Recompile with higher MEMORY_BANKS_MAX?\n", +		       __FUNCTION__, banks, MEMORY_BANKS_MAX); +		return -1; +	} +  	err = fdt_check_header(blob);  	if (err < 0) {  		printf("%s: %s\n", __FUNCTION__, fdt_strerror(err)); @@ -903,11 +910,11 @@ void fdt_del_node_and_alias(void *blob, const char *alias)  }  /* Helper to read a big number; size is in cells (not bytes) */ -static inline u64 of_read_number(const __be32 *cell, int size) +static inline u64 of_read_number(const fdt32_t *cell, int size)  {  	u64 r = 0;  	while (size--) -		r = (r << 32) | be32_to_cpu(*(cell++)); +		r = (r << 32) | fdt32_to_cpu(*(cell++));  	return r;  } @@ -921,7 +928,7 @@ static inline u64 of_read_number(const __be32 *cell, int size)  /* Debug utility */  #ifdef DEBUG -static void of_dump_addr(const char *s, const u32 *addr, int na) +static void of_dump_addr(const char *s, const fdt32_t *addr, int na)  {  	printf("%s", s);  	while(na--) @@ -929,7 +936,7 @@ static void of_dump_addr(const char *s, const u32 *addr, int na)  	printf("\n");  }  #else -static void of_dump_addr(const char *s, const u32 *addr, int na) { } +static void of_dump_addr(const char *s, const fdt32_t *addr, int na) { }  #endif  /* Callbacks for bus specific translators */ @@ -938,21 +945,21 @@ struct of_bus {  	const char	*addresses;  	void		(*count_cells)(void *blob, int parentoffset,  				int *addrc, int *sizec); -	u64		(*map)(u32 *addr, const u32 *range, +	u64		(*map)(fdt32_t *addr, const fdt32_t *range,  				int na, int ns, int pna); -	int		(*translate)(u32 *addr, u64 offset, int na); +	int		(*translate)(fdt32_t *addr, u64 offset, int na);  };  /* Default translator (generic bus) */  static void of_bus_default_count_cells(void *blob, int parentoffset,  					int *addrc, int *sizec)  { -	const u32 *prop; +	const fdt32_t *prop;  	if (addrc) {  		prop = fdt_getprop(blob, parentoffset, "#address-cells", NULL);  		if (prop) -			*addrc = be32_to_cpup((u32 *)prop); +			*addrc = be32_to_cpup(prop);  		else  			*addrc = 2;  	} @@ -960,13 +967,13 @@ static void of_bus_default_count_cells(void *blob, int parentoffset,  	if (sizec) {  		prop = fdt_getprop(blob, parentoffset, "#size-cells", NULL);  		if (prop) -			*sizec = be32_to_cpup((u32 *)prop); +			*sizec = be32_to_cpup(prop);  		else  			*sizec = 1;  	}  } -static u64 of_bus_default_map(u32 *addr, const u32 *range, +static u64 of_bus_default_map(fdt32_t *addr, const fdt32_t *range,  		int na, int ns, int pna)  {  	u64 cp, s, da; @@ -983,14 +990,14 @@ static u64 of_bus_default_map(u32 *addr, const u32 *range,  	return da - cp;  } -static int of_bus_default_translate(u32 *addr, u64 offset, int na) +static int of_bus_default_translate(fdt32_t *addr, u64 offset, int na)  {  	u64 a = of_read_number(addr, na);  	memset(addr, 0, na * 4);  	a += offset;  	if (na > 1) -		addr[na - 2] = a >> 32; -	addr[na - 1] = a & 0xffffffffu; +		addr[na - 2] = cpu_to_fdt32(a >> 32); +	addr[na - 1] = cpu_to_fdt32(a & 0xffffffffu);  	return 0;  } @@ -1008,10 +1015,10 @@ static struct of_bus of_busses[] = {  };  static int of_translate_one(void * blob, int parent, struct of_bus *bus, -			    struct of_bus *pbus, u32 *addr, +			    struct of_bus *pbus, fdt32_t *addr,  			    int na, int ns, int pna, const char *rprop)  { -	const u32 *ranges; +	const fdt32_t *ranges;  	int rlen;  	int rone;  	u64 offset = OF_BAD_ADDR; @@ -1028,7 +1035,7 @@ static int of_translate_one(void * blob, int parent, struct of_bus *bus,  	 * to translate addresses that aren't supposed to be translated in  	 * the first place. --BenH.  	 */ -	ranges = (u32 *)fdt_getprop(blob, parent, rprop, &rlen); +	ranges = fdt_getprop(blob, parent, rprop, &rlen);  	if (ranges == NULL || rlen == 0) {  		offset = of_read_number(addr, na);  		memset(addr, 0, pna * 4); @@ -1070,12 +1077,12 @@ static int of_translate_one(void * blob, int parent, struct of_bus *bus,   * that can be mapped to a cpu physical address). This is not really specified   * that way, but this is traditionally the way IBM at least do things   */ -u64 __of_translate_address(void *blob, int node_offset, const u32 *in_addr, -			   const char *rprop) +static u64 __of_translate_address(void *blob, int node_offset, const fdt32_t *in_addr, +				  const char *rprop)  {  	int parent;  	struct of_bus *bus, *pbus; -	u32 addr[OF_MAX_ADDR_CELLS]; +	fdt32_t addr[OF_MAX_ADDR_CELLS];  	int na, ns, pna, pns;  	u64 result = OF_BAD_ADDR; @@ -1143,7 +1150,7 @@ u64 __of_translate_address(void *blob, int node_offset, const u32 *in_addr,  	return result;  } -u64 fdt_translate_address(void *blob, int node_offset, const u32 *in_addr) +u64 fdt_translate_address(void *blob, int node_offset, const fdt32_t *in_addr)  {  	return __of_translate_address(blob, node_offset, in_addr, "ranges");  } @@ -1162,7 +1169,7 @@ int fdt_node_offset_by_compat_reg(void *blob, const char *compat,  {  	int len, off = fdt_node_offset_by_compatible(blob, -1, compat);  	while (off != -FDT_ERR_NOTFOUND) { -		u32 *reg = (u32 *)fdt_getprop(blob, off, "reg", &len); +		const fdt32_t *reg = fdt_getprop(blob, off, "reg", &len);  		if (reg) {  			if (compat_off == fdt_translate_address(blob, off, reg))  				return off; @@ -1356,7 +1363,7 @@ err_size:  int fdt_verify_alias_address(void *fdt, int anode, const char *alias, u64 addr)  {  	const char *path; -	const u32 *reg; +	const fdt32_t *reg;  	int node, len;  	u64 dt_addr; @@ -1398,11 +1405,11 @@ u64 fdt_get_base_address(void *fdt, int node)  {  	int size;  	u32 naddr; -	const u32 *prop; +	const fdt32_t *prop;  	prop = fdt_getprop(fdt, node, "#address-cells", &size);  	if (prop && size == 4) -		naddr = *prop; +		naddr = be32_to_cpup(prop);  	else  		naddr = 2; |