[Skiboot] [PATCH v10 03/17] core/fdt: Allow to specify FDT blob

Gavin Shan gwshan at linux.vnet.ibm.com
Tue May 3 15:04:28 AEST 2016


The FDT memory block is allocated by skiboot and passed to kernel
after the device tree is flattenned. In order to transfer device
tree changes for PCI hotplug in subsequent patches, new OPAL API
will be introduced to retrieve the sub-tree behind the specified
(PCI slot) node. The FDT blob is allocated by kernel in that case.

This adds parameters for various functions in core/fdt.c allowing
to specify the memory block for the FDT blob, which is allocated
by skiboot or kernel.

Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
---
 core/fdt.c | 48 +++++++++++++++++++++++++-----------------------
 1 file changed, 25 insertions(+), 23 deletions(-)

diff --git a/core/fdt.c b/core/fdt.c
index 6d3446e..a9392b1 100644
--- a/core/fdt.c
+++ b/core/fdt.c
@@ -27,7 +27,6 @@
 #include <ccan/str/str.h>
 
 static int fdt_error;
-static void *fdt;
 
 #undef DEBUG_FDT
 
@@ -44,12 +43,12 @@ static void __save_err(int err, const char *str)
 
 #define save_err(...) __save_err(__VA_ARGS__, #__VA_ARGS__)
 
-static void dt_property_cell(const char *name, u32 cell)
+static void dt_property_cell(void *fdt, const char *name, u32 cell)
 {
 	save_err(fdt_property_cell(fdt, name, cell));
 }
 
-static void dt_begin_node(const struct dt_node *dn)
+static void dt_begin_node(void *fdt, const struct dt_node *dn)
 {
 	save_err(fdt_begin_node(fdt, dn->name));
 
@@ -57,23 +56,23 @@ static void dt_begin_node(const struct dt_node *dn)
 	 * We add both the new style "phandle" and the legacy
 	 * "linux,phandle" properties
 	 */
-	dt_property_cell("linux,phandle", dn->phandle);
-	dt_property_cell("phandle", dn->phandle);
+	dt_property_cell(fdt, "linux,phandle", dn->phandle);
+	dt_property_cell(fdt, "phandle", dn->phandle);
 }
 
-static void dt_property(const struct dt_property *p)
+static void dt_property(void *fdt, const struct dt_property *p)
 {
 	save_err(fdt_property(fdt, p->name, p->prop, p->len));
 }
 
-static void dt_end_node(void)
+static void dt_end_node(void *fdt)
 {
 	save_err(fdt_end_node(fdt));
 }
 
-static void dump_fdt(void)
-{
 #ifdef DEBUG_FDT
+static void dump_fdt(void *fdt)
+{
 	int i, off, depth, err;
 
 	printf("Device tree %u@%p\n", fdt_totalsize(fdt), fdt);
@@ -110,10 +109,10 @@ static void dump_fdt(void)
 		}
 		printf("name: %s [%u]\n", name, off);
 	}
-#endif
 }
+#endif
 
-static void flatten_dt_properties(const struct dt_node *dn)
+static void flatten_dt_properties(void *fdt, const struct dt_node *dn)
 {
 	const struct dt_property *p;
 
@@ -123,26 +122,26 @@ static void flatten_dt_properties(const struct dt_node *dn)
 #ifdef DEBUG_FDT
 		printf("FDT: prop: %s size: %ld\n", p->name, p->len);
 #endif
-		dt_property(p);
+		dt_property(fdt, p);
 	}
 }
 
-static void flatten_dt_node(const struct dt_node *root)
+static void flatten_dt_node(void *fdt, const struct dt_node *root)
 {
 	const struct dt_node *i;
 
 #ifdef DEBUG_FDT
 	printf("FDT: node: %s\n", root->name);
 #endif
-	flatten_dt_properties(root);
+	flatten_dt_properties(fdt, root);
 	list_for_each(&root->children, i, list) {
-		dt_begin_node(i);
-		flatten_dt_node(i);
-		dt_end_node();
+		dt_begin_node(fdt, i);
+		flatten_dt_node(fdt, i);
+		dt_end_node(fdt);
 	}
 }
 
-static void create_dtb_reservemap(const struct dt_node *root)
+static void create_dtb_reservemap(void *fdt, const struct dt_node *root)
 {
 	uint64_t base, size;
 	const uint64_t *ranges;
@@ -166,6 +165,7 @@ static void create_dtb_reservemap(const struct dt_node *root)
 
 void *create_dtb(const struct dt_node *root)
 {
+	void *fdt = NULL;
 	size_t len = DEVICE_TREE_MAX_SIZE;
 	uint32_t old_last_phandle = last_phandle;
 
@@ -182,16 +182,16 @@ void *create_dtb(const struct dt_node *root)
 
 		fdt_create(fdt, len);
 
-		create_dtb_reservemap(root);
+		create_dtb_reservemap(fdt, root);
 
 		/* Open root node */
-		dt_begin_node(root);
+		dt_begin_node(fdt, root);
 
 		/* Unflatten our live tree */
-		flatten_dt_node(root);
+		flatten_dt_node(fdt, root);
 
 		/* Close root node */
-		dt_end_node();
+		dt_end_node(fdt);
 
 		save_err(fdt_finish(fdt));
 
@@ -201,7 +201,9 @@ void *create_dtb(const struct dt_node *root)
 		len *= 2;
 	} while (fdt_error == -FDT_ERR_NOSPACE);
 
-	dump_fdt();
+#ifdef DEBUG_FDT
+	dump_fdt(fdt);
+#endif
 
 	if (fdt_error) {
 		prerror("dtb: error %s\n", fdt_strerror(fdt_error));
-- 
2.1.0



More information about the Skiboot mailing list