[PATCH v4 2/2] rpi: pass the bootloader node through to the OS devicetree

Gregor Herburger <[email protected]>
Newsgroups org.u-boot-project.lists.u-boot
Message-ID <[email protected]>
The Raspberry Pi has the "tryboot" feature where it can boot from a
different partition enabling failsafe A/B updates. After boot the
firmware adds some properties in /chosen/bootloader, e.g. partition.

Copy the complete /chosen/bootloader node with all its properties to the
OS device tree.

Signed-off-by: Gregor Herburger <[email protected]>
Tested-by: Peter Robinson <[email protected]>
---
 board/raspberrypi/rpi/rpi.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
index 8354fec833cc..ba8a2c1ba4cf 100644
--- a/board/raspberrypi/rpi/rpi.c
+++ b/board/raspberrypi/rpi/rpi.c
@@ -594,6 +594,39 @@ int board_fdt_blob_setup(void **fdtp)
 	return 0;
 }
 
+int copy_node_all_properties(void *dst, void *src, const char *path, const char *node)
+{
+	int src_parent, dst_parent;
+	int src_node, dst_node;
+	int prop;
+	int len;
+
+	src_parent = fdt_path_offset(src, path);
+	dst_parent = fdt_path_offset(dst, path);
+	if (src_parent < 0 || dst_parent < 0)
+		return -1;
+
+	src_node = fdt_subnode_offset(src, src_parent, node);
+	if (src_node < 0)
+		return -1;
+
+	dst_node = fdt_find_or_add_subnode(dst, dst_parent, node);
+	if (dst_node < 0)
+		return -1;
+
+	fdt_for_each_property_offset(prop, src, src_node) {
+		const char *name;
+		const void *value = fdt_getprop_by_offset(src, prop, &name, &len);
+
+		if (!value || !name)
+			continue;
+
+		fdt_setprop(dst, dst_node, name, value, len);
+	}
+
+	return 0;
+}
+
 int copy_property(void *dst, void *src, char *path, char *property)
 {
 	int dst_offset, src_offset;
@@ -656,6 +689,9 @@ void  update_fdt_from_fw(void *fdt, void *fw_fdt)
 
 	/* copy uart clk as provided by the firmware */
 	copy_property(fdt, fw_fdt, "/clocks/clk-uart", "clock-frequency");
+
+	/* Copy the bootloader node */
+	copy_node_all_properties(fdt, fw_fdt, "/chosen", "bootloader");
 }
 
 int ft_board_setup(void *blob, struct bd_info *bd)

-- 
2.47.3
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.