[U-Boot-Users] [FDT][PATCH 3/4] Add common memory fixup function
Kumar Gala
galak at kernel.crashing.org
Wed Nov 28 00:45:16 CET 2007
Add the function fdt_fixup_memory() to fixup the /memory node of the fdt
Signed-off-by: Kumar Gala <galak at kernel.crashing.org>
---
in git.kernel.org:/pub/scm/boot/u-boot/galak/u-boot.git libfdt_testing
common/fdt_support.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++
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 69f4dd5..70e63ec 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] = (start >> 56) & 0xff;
+ tmp[1+len] = (start >> 48) & 0xff;
+ tmp[2+len] = (start >> 40) & 0xff;
+ tmp[3+len] = (start >> 32) & 0xff;
+ tmp[4+len] = (start >> 24) & 0xff;
+ tmp[5+len] = (start >> 16) & 0xff;
+ tmp[6+len] = (start >> 8) & 0xff;
+ tmp[7+len] = (start ) & 0xff;
+ len += 8;
+ } else {
+ tmp[0+len] = (start >> 24) & 0xff;
+ tmp[1+len] = (start >> 16) & 0xff;
+ tmp[2+len] = (start >> 8) & 0xff;
+ tmp[3+len] = (start ) & 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 8f781d4..3d6c1a8 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
--
1.5.3.4
More information about the U-Boot
mailing list