9
0
Fork 0

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>
This commit is contained in:
Sascha Hauer 2013-03-03 14:04:57 +01:00
parent 0ba9a2347a
commit 6d6edfcf53
5 changed files with 21 additions and 21 deletions

View File

@ -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;
}

View File

@ -4,6 +4,7 @@ config PPC
select HAS_KALLSYMS
select HAS_MODULES
select HAVE_CONFIGURABLE_MEMORY_LAYOUT
select OFTREE
default y
choice

View File

@ -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);
/*

View File

@ -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;

View File

@ -41,6 +41,7 @@ struct image_data {
unsigned long initrd_address;
struct device_node *of_root_node;
struct fdt_header *oftree;
int verify;