From: Vicente Bergas <vicencb@gmail.com>
To: barebox@lists.infradead.org
Cc: Vicente Bergas <vicencb@gmail.com>
Subject: [PATCH 1/2] DeviceTree: add support for initrd in the DT
Date: Sun, 10 Feb 2013 17:58:56 +0100 [thread overview]
Message-ID: <1360515537-1703-2-git-send-email-vicencb@gmail.com> (raw)
In-Reply-To: <1360515537-1703-1-git-send-email-vicencb@gmail.com>
Add the initrd start and end address to the DT, code comes from u-boot.
Signed-off-by: Vicente Bergas <vicencb@gmail.com>
---
arch/arm/lib/armlinux.c | 2 ++
common/oftree.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++
include/of.h | 1 +
3 files changed, 69 insertions(+)
diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c
index 40a63ea..8052ca4 100644
--- a/arch/arm/lib/armlinux.c
+++ b/arch/arm/lib/armlinux.c
@@ -266,6 +266,8 @@ void start_linux(void *adr, int swap, unsigned long initrd_address,
if (oftree) {
printf("booting Linux kernel with devicetree\n");
+ fdt_initrd(oftree, initrd_address,
+ initrd_address+initrd_size, 1);
params = oftree;
} else {
setup_tags(initrd_address, initrd_size, swap);
diff --git a/common/oftree.c b/common/oftree.c
index 0df5209..7c118d2 100644
--- a/common/oftree.c
+++ b/common/oftree.c
@@ -246,6 +246,72 @@ int fdt_get_path_or_create(struct fdt_header *fdt, const char *path)
return nodeoffset;
}
+int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)
+{
+ int nodeoffset;
+ int err, j, total;
+ u32 tmp;
+ const char *path;
+ uint64_t addr, size;
+
+ /* Find the "chosen" node */
+ nodeoffset = fdt_path_offset(fdt, "/chosen");
+
+ /* If there is no "chosen" node in the blob return */
+ if (nodeoffset < 0) {
+ printf("fdt_initrd: %s\n", fdt_strerror(nodeoffset));
+ return nodeoffset;
+ }
+
+ /* just return if initrd_start/end aren't valid */
+ if ((initrd_start == 0) || (initrd_end == 0))
+ return 0;
+
+ total = fdt_num_mem_rsv(fdt);
+
+ /*
+ * Look for an existing entry and update it. If we don't find
+ * the entry, we will j be the next available slot.
+ */
+ for (j = 0; j < total; j++) {
+ err = fdt_get_mem_rsv(fdt, j, &addr, &size);
+ if (addr == initrd_start) {
+ fdt_del_mem_rsv(fdt, j);
+ break;
+ }
+ }
+
+ err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start);
+ if (err < 0) {
+ printf("fdt_initrd: %s\n", fdt_strerror(err));
+ return err;
+ }
+
+ path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL);
+ if (!path || force) {
+ tmp = __cpu_to_be32(initrd_start);
+ err = fdt_setprop(fdt, nodeoffset,
+ "linux,initrd-start", &tmp, sizeof(tmp));
+ if (err < 0) {
+ printf("WARNING: "
+ "could not set linux,initrd-start %s.\n",
+ fdt_strerror(err));
+ return err;
+ }
+ tmp = __cpu_to_be32(initrd_end);
+ err = fdt_setprop(fdt, nodeoffset,
+ "linux,initrd-end", &tmp, sizeof(tmp));
+ if (err < 0) {
+ printf("WARNING: could not set linux,initrd-end %s.\n",
+ fdt_strerror(err));
+
+ return err;
+ }
+ }
+
+ return 0;
+}
+
static int of_fixup_bootargs(struct fdt_header *fdt)
{
int nodeoffset;
diff --git a/include/of.h b/include/of.h
index d3a310f..dcb4c4b 100644
--- a/include/of.h
+++ b/include/of.h
@@ -18,6 +18,7 @@ void do_fixup_by_path(struct fdt_header *fdt, const char *path, const char *prop
void do_fixup_by_path_u32(struct fdt_header *fdt, const char *path, const char *prop,
u32 val, int create);
int fdt_get_path_or_create(struct fdt_header *fdt, const char *path);
+int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force);
#define OF_BAD_ADDR ((u64)-1)
--
1.8.1.3
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2013-02-10 16:59 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-10 16:58 [PATCH 0/2] DeviceTree: add support for initrd in the DT Vicente Bergas
2013-02-10 16:58 ` Vicente Bergas [this message]
2013-02-11 9:55 ` [PATCH 1/2] " Sascha Hauer
2013-02-10 16:58 ` [PATCH 2/2] ArchosG9: boot linux kernel with DT Vicente Bergas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1360515537-1703-2-git-send-email-vicencb@gmail.com \
--to=vicencb@gmail.com \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.