[U-Boot-Users] [PATCH][RFC] Add common memory fixup function

Martin Krause Martin.Krause at tqs.de
Tue Nov 27 09:13:06 CET 2007


Kumar Gala wrote on Monday, November 26, 2007 9:56 PM:
> diff --git a/common/fdt_support.c b/common/fdt_support.c
> index c67bb3d..e6de10f 100644
> --- a/common/fdt_support.c
> +++ b/common/fdt_support.c
> @@ -441,6 +441,66 @@ 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 i, 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);
> +	if ((addrcell) && (*addrcell == 2)) {
> +		for (i = 0; i <= 7; i++)
> +			tmp[i] = (start >> ((7 - i) * 8)) & 0xff;
> +		len = 8;
> +	} else {
> +		for (i = 0; i <= 3; i++)
> +			tmp[i] = (start >> ((3 - i) * 8)) & 0xff;
> +		len = 4;
> +	}

Could this perhaps lead to endianess issues under some special 
circumstances?

Best Regards,
Martin Krause




More information about the U-Boot mailing list