
Guys,
Here's my cut at a more generic version of Martin's patch that respects #ac and #sc.
Let me know what you think and if you have any comments. I'll add the board bits in a complete patch if this looks ok.
- k
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; + } + + sizecell = fdt_getprop(blob, 0, "#size-cells", NULL); + if ((sizecell) && (*sizecell == 2)) { + for (i = 0; i <= 7; i++) + tmp[i+len] = (size >> ((7 - i) * 8)) & 0xff; + len += 8; + } else { + for (i = 0; i <= 3; i++) + tmp[i+len] = (size >> ((3 - i) * 8)) & 0xff; + len += 4; + } + + err = fdt_setprop(fdt, 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