public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot-Users] [PATCH][RFC] Add common memory fixup function
@ 2007-11-26 20:55 Kumar Gala
  2007-11-26 22:12 ` Vitaly Bordug
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Kumar Gala @ 2007-11-26 20:55 UTC (permalink / raw)
  To: u-boot

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

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2007-11-27 19:11 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-26 20:55 [U-Boot-Users] [PATCH][RFC] Add common memory fixup function Kumar Gala
2007-11-26 22:12 ` Vitaly Bordug
2007-11-26 22:23   ` Kumar Gala
2007-11-27  0:15     ` Vitaly Bordug
2007-11-27  8:38   ` Martin Krause
2007-11-27  8:04 ` Martin Krause
2007-11-27  8:13 ` Martin Krause
2007-11-27 19:11   ` Scott Wood

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox