diff options
| author | Kumar Gala <galak@kernel.crashing.org> | 2007-11-26 14:57:45 -0600 | 
|---|---|---|
| committer | Gerald Van Baren <vanbaren@cideas.com> | 2007-12-07 20:51:25 -0500 | 
| commit | 3c9272813fad84c691d0e4989bb18a3ffebdebfc (patch) | |
| tree | b591d18edcce79a7e9c656d3ed8884f6735b30a0 | |
| parent | 9c9109e7fcf7ac2ca19c95b8ac54b8d1c773b157 (diff) | |
| download | olio-uboot-2014.01-3c9272813fad84c691d0e4989bb18a3ffebdebfc.tar.xz olio-uboot-2014.01-3c9272813fad84c691d0e4989bb18a3ffebdebfc.zip | |
Add common memory fixup function
Add the function fdt_fixup_memory() to fixup the /memory node of the fdt
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
| -rw-r--r-- | common/fdt_support.c | 78 | ||||
| -rw-r--r-- | include/fdt_support.h | 1 | 
2 files changed, 79 insertions, 0 deletions
| diff --git a/common/fdt_support.c b/common/fdt_support.c index 69f4dd552..808ec7069 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -438,6 +438,84 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,  	do_fixup_by_compat(fdt, compat, prop, &val, 4, create);  } +int fdt_fixup_memory(void *blob, u64 start, u64 size) +{ +	int err, nodeoffset, len = 0; +	u8 tmp[16]; +	const u32 *addrcell, *sizecell; + +	err = fdt_check_header(blob); +	if (err < 0) { +		printf("%s: %s\n", __FUNCTION__, fdt_strerror(err)); +		return err; +	} + +	/* update, or add and update /memory node */ +	nodeoffset = fdt_path_offset(blob, "/memory"); +	if (nodeoffset < 0) { +		nodeoffset = fdt_add_subnode(blob, 0, "memory"); +		if (nodeoffset < 0) +			printf("WARNING: could not create /memory: %s.\n", +					fdt_strerror(nodeoffset)); +		return nodeoffset; +	} +	err = fdt_setprop(blob, nodeoffset, "device_type", "memory", +			sizeof("memory")); +	if (err < 0) { +		printf("WARNING: could not set %s %s.\n", "device_type", +				fdt_strerror(err)); +		return err; +	} + +	addrcell = fdt_getprop(blob, 0, "#address-cells", NULL); +	/* use shifts and mask to ensure endianness */ +	if ((addrcell) && (*addrcell == 2)) { +		tmp[0] = (start >> 56) & 0xff; +		tmp[1] = (start >> 48) & 0xff; +		tmp[2] = (start >> 40) & 0xff; +		tmp[3] = (start >> 32) & 0xff; +		tmp[4] = (start >> 24) & 0xff; +		tmp[5] = (start >> 16) & 0xff; +		tmp[6] = (start >>  8) & 0xff; +		tmp[7] = (start      ) & 0xff; +		len = 8; +	} else { +		tmp[0] = (start >> 24) & 0xff; +		tmp[1] = (start >> 16) & 0xff; +		tmp[2] = (start >>  8) & 0xff; +		tmp[3] = (start      ) & 0xff; +		len = 4; +	} + +	sizecell = fdt_getprop(blob, 0, "#size-cells", NULL); +	/* use shifts and mask to ensure endianness */ +	if ((sizecell) && (*sizecell == 2)) { +		tmp[0+len] = (size >> 56) & 0xff; +		tmp[1+len] = (size >> 48) & 0xff; +		tmp[2+len] = (size >> 40) & 0xff; +		tmp[3+len] = (size >> 32) & 0xff; +		tmp[4+len] = (size >> 24) & 0xff; +		tmp[5+len] = (size >> 16) & 0xff; +		tmp[6+len] = (size >>  8) & 0xff; +		tmp[7+len] = (size      ) & 0xff; +		len += 8; +	} else { +		tmp[0+len] = (size >> 24) & 0xff; +		tmp[1+len] = (size >> 16) & 0xff; +		tmp[2+len] = (size >>  8) & 0xff; +		tmp[3+len] = (size      ) & 0xff; +		len += 4; +	} + +	err = fdt_setprop(blob, nodeoffset, "reg", tmp, len); +	if (err < 0) { +		printf("WARNING: could not set %s %s.\n", +				"reg", fdt_strerror(err)); +		return err; +	} +	return 0; +} +  void fdt_fixup_ethernet(void *fdt, bd_t *bd)  {  	int node; diff --git a/include/fdt_support.h b/include/fdt_support.h index 8f781d440..3d6c1a841 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -44,6 +44,7 @@ void do_fixup_by_compat(void *fdt, const char *compat,  			const char *prop, const void *val, int len, int create);  void do_fixup_by_compat_u32(void *fdt, const char *compat,  			    const char *prop, u32 val, int create); +int fdt_fixup_memory(void *blob, u64 start, u64 size);  void fdt_fixup_ethernet(void *fdt, bd_t *bd);  #ifdef CONFIG_OF_HAS_UBOOT_ENV |