summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2013-03-03 14:04:57 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2013-03-06 11:41:29 +0100
commit6d6edfcf53be19efa040b3a6fcb7583ce1fca573 (patch)
tree0a3fc1ea02aec09c2459c5787f0731db06e8d6d9
parent0ba9a2347a747ae307e072030fc47fd684971249 (diff)
downloadbarebox-6d6edfcf53be19efa040b3a6fcb7583ce1fca573.tar.gz
barebox-6d6edfcf53be19efa040b3a6fcb7583ce1fca573.tar.xz
bootm: Pass unflattened devicetree to handlers
This makes it possible to modify the tree in the handlers. This is necessary because the initrd addresses are only known inside the handlers, but not to the generic bootm code. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--arch/arm/lib/bootm.c8
-rw-r--r--arch/ppc/Kconfig1
-rw-r--r--arch/ppc/lib/ppclinux.c8
-rw-r--r--commands/bootm.c24
-rw-r--r--include/boot.h1
5 files changed, 21 insertions, 21 deletions
diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
index 2a7d0f58f2..00c49086c6 100644
--- a/arch/arm/lib/bootm.c
+++ b/arch/arm/lib/bootm.c
@@ -169,16 +169,12 @@ static int do_bootz_linux_fdt(int fd, struct image_data *data)
}
if (IS_BUILTIN(CONFIG_OFTREE)) {
- struct device_node *node;
-
- node = of_unflatten_dtb(NULL, oftree);
- if (!node) {
+ data->of_root_node = of_unflatten_dtb(NULL, oftree);
+ if (!data->of_root_node) {
pr_err("unable to unflatten devicetree\n");
ret = -EINVAL;
goto err_free;
}
-
- data->oftree = of_get_fixed_tree(node);
} else {
data->oftree = oftree;
}
diff --git a/arch/ppc/Kconfig b/arch/ppc/Kconfig
index d12406522e..db269dd971 100644
--- a/arch/ppc/Kconfig
+++ b/arch/ppc/Kconfig
@@ -4,6 +4,7 @@ config PPC
select HAS_KALLSYMS
select HAS_MODULES
select HAVE_CONFIGURABLE_MEMORY_LAYOUT
+ select OFTREE
default y
choice
diff --git a/arch/ppc/lib/ppclinux.c b/arch/ppc/lib/ppclinux.c
index 95dc83bfe5..ef69eadfb7 100644
--- a/arch/ppc/lib/ppclinux.c
+++ b/arch/ppc/lib/ppclinux.c
@@ -18,6 +18,14 @@ static int do_bootm_linux(struct image_data *data)
if (!data->os_res)
return -EINVAL;
+ data->oftree = of_get_fixed_tree(data->of_root_node);
+ if (!data->oftree) {
+ pr_err("bootm: No devicetree given.\n");
+ return -EINVAL;
+ }
+
+ fdt_add_reserve_map(data->oftree);
+
kernel = (void *)(data->os_address + data->os_entry);
/*
diff --git a/commands/bootm.c b/commands/bootm.c
index 65a75e20ba..ea5a35b52a 100644
--- a/commands/bootm.c
+++ b/commands/bootm.c
@@ -138,9 +138,8 @@ static int bootm_open_initrd_uimage(struct image_data *data)
static int bootm_open_oftree(struct image_data *data, const char *oftree, int num)
{
enum filetype ft;
- struct fdt_header *fdt, *fixfdt;
+ struct fdt_header *fdt;
size_t size;
- struct device_node *node;
printf("Loading devicetree from '%s'\n", oftree);
@@ -188,23 +187,14 @@ static int bootm_open_oftree(struct image_data *data, const char *oftree, int nu
file_type_to_string(ft));
}
- node = of_unflatten_dtb(NULL, fdt);
- if (!node) {
+ data->of_root_node = of_unflatten_dtb(NULL, fdt);
+ if (!data->of_root_node) {
pr_err("unable to unflatten devicetree\n");
return -EINVAL;
}
- if (bootm_verbose(data) > 1)
- of_print_nodes(node, 0);
-
- fixfdt = of_get_fixed_tree(node);
- if (!fixfdt)
- return -EINVAL;
-
free(fdt);
- data->oftree = fixfdt;
-
return 0;
}
#endif
@@ -408,10 +398,14 @@ static int do_bootm(int argc, char *argv[])
if (ret)
goto err_out;
} else {
- data.oftree = of_get_fixed_tree(NULL);
- if (bootm_verbose(&data) && data.oftree)
+ data.of_root_node = of_get_root_node();
+ if (bootm_verbose(&data) && data.of_root_node)
printf("using internal devicetree\n");
}
+
+
+ if (bootm_verbose(&data) > 1 && data.of_root_node)
+ of_print_nodes(data.of_root_node, 0);
#endif
if (data.os_address == UIMAGE_SOME_ADDRESS)
data.os_address = UIMAGE_INVALID_ADDRESS;
diff --git a/include/boot.h b/include/boot.h
index 3ce0de125b..971a40390a 100644
--- a/include/boot.h
+++ b/include/boot.h
@@ -41,6 +41,7 @@ struct image_data {
unsigned long initrd_address;
+ struct device_node *of_root_node;
struct fdt_header *oftree;
int verify;