|
@@ -802,6 +802,30 @@ void __init unflatten_device_tree(void)
|
|
|
of_alias_scan(early_init_dt_alloc_memory_arch);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * unflatten_and_copy_device_tree - copy and create tree of device_nodes from flat blob
|
|
|
+ *
|
|
|
+ * Copies and unflattens the device-tree passed by the firmware, creating the
|
|
|
+ * tree of struct device_node. It also fills the "name" and "type"
|
|
|
+ * pointers of the nodes so the normal device-tree walking functions
|
|
|
+ * can be used. This should only be used when the FDT memory has not been
|
|
|
+ * reserved such is the case when the FDT is built-in to the kernel init
|
|
|
+ * section. If the FDT memory is reserved already then unflatten_device_tree
|
|
|
+ * should be used instead.
|
|
|
+ */
|
|
|
+void __init unflatten_and_copy_device_tree(void)
|
|
|
+{
|
|
|
+ int size = __be32_to_cpu(initial_boot_params->totalsize);
|
|
|
+ void *dt = early_init_dt_alloc_memory_arch(size,
|
|
|
+ __alignof__(struct boot_param_header));
|
|
|
+
|
|
|
+ if (dt) {
|
|
|
+ memcpy(dt, initial_boot_params, size);
|
|
|
+ initial_boot_params = dt;
|
|
|
+ }
|
|
|
+ unflatten_device_tree();
|
|
|
+}
|
|
|
+
|
|
|
#endif /* CONFIG_OF_EARLY_FLATTREE */
|
|
|
|
|
|
/* Feed entire flattened device tree into the random pool */
|