Commit 1d1bde55 authored by Michal Suchanek's avatar Michal Suchanek Committed by Rob Herring

of: fdt: mark unflattened tree as detached

The tree returned from of_fdt_unflatten_tree cannot be attached to the
live tree because it is not marked as detached so mark it as such. The
dt resolver checks the flag and refuses to process the tree otherwise.
Signed-off-by: default avatarMichal Suchanek <hramrach@gmail.com>
Signed-off-by: default avatarRob Herring <robh@kernel.org>
parent 5de3bbc8
...@@ -472,7 +472,8 @@ static int unflatten_dt_nodes(const void *blob, ...@@ -472,7 +472,8 @@ static int unflatten_dt_nodes(const void *blob,
static void *__unflatten_device_tree(const void *blob, static void *__unflatten_device_tree(const void *blob,
struct device_node *dad, struct device_node *dad,
struct device_node **mynodes, struct device_node **mynodes,
void *(*dt_alloc)(u64 size, u64 align)) void *(*dt_alloc)(u64 size, u64 align),
bool detached)
{ {
int size; int size;
void *mem; void *mem;
...@@ -516,6 +517,11 @@ static void *__unflatten_device_tree(const void *blob, ...@@ -516,6 +517,11 @@ static void *__unflatten_device_tree(const void *blob,
pr_warning("End of tree marker overwritten: %08x\n", pr_warning("End of tree marker overwritten: %08x\n",
be32_to_cpup(mem + size)); be32_to_cpup(mem + size));
if (detached) {
of_node_set_flag(*mynodes, OF_DETACHED);
pr_debug("unflattened tree is detached\n");
}
pr_debug(" <- unflatten_device_tree()\n"); pr_debug(" <- unflatten_device_tree()\n");
return mem; return mem;
} }
...@@ -548,7 +554,8 @@ void *of_fdt_unflatten_tree(const unsigned long *blob, ...@@ -548,7 +554,8 @@ void *of_fdt_unflatten_tree(const unsigned long *blob,
void *mem; void *mem;
mutex_lock(&of_fdt_unflatten_mutex); mutex_lock(&of_fdt_unflatten_mutex);
mem = __unflatten_device_tree(blob, dad, mynodes, &kernel_tree_alloc); mem = __unflatten_device_tree(blob, dad, mynodes, &kernel_tree_alloc,
true);
mutex_unlock(&of_fdt_unflatten_mutex); mutex_unlock(&of_fdt_unflatten_mutex);
return mem; return mem;
...@@ -1224,7 +1231,7 @@ bool __init early_init_dt_scan(void *params) ...@@ -1224,7 +1231,7 @@ bool __init early_init_dt_scan(void *params)
void __init unflatten_device_tree(void) void __init unflatten_device_tree(void)
{ {
__unflatten_device_tree(initial_boot_params, NULL, &of_root, __unflatten_device_tree(initial_boot_params, NULL, &of_root,
early_init_dt_alloc_memory_arch); early_init_dt_alloc_memory_arch, false);
/* Get pointer to "/chosen" and "/aliases" nodes for use everywhere */ /* Get pointer to "/chosen" and "/aliases" nodes for use everywhere */
of_alias_scan(early_init_dt_alloc_memory_arch); of_alias_scan(early_init_dt_alloc_memory_arch);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment