diff mbox

[U-Boot,v4,12/13] cmd: fdt: add fdt overlay application subcommand

Message ID 20160705082646.25044-13-maxime.ripard@free-electrons.com
State Accepted
Commit e6628ad7b99b285b25147366c68a7b956e362878
Delegated to: Tom Rini
Headers show

Commit Message

Maxime Ripard July 5, 2016, 8:26 a.m. UTC
The device tree overlays are a good way to deal with user-modifyable
boards or boards with some kind of an expansion mechanism where we can
easily plug new board in (like the BBB or the raspberry pi).

However, so far, the usual mechanism to deal with it was to have in Linux
some driver detecting the expansion boards plugged in and then request
these overlays using the firmware interface.

That works in most cases, but in some cases, you might want to have the
overlays applied before the userspace comes in. Either because the new
board requires some kind of an early initialization, or because your root
filesystem is accessed through that expansion board.

The easiest solution in such a case is to simply have the component before
Linux applying that overlay, removing all these drawbacks.

Reviewed-by: Stefan Agner <stefan@agner.ch>
Acked-by: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
Acked-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
---
 cmd/fdt.c                | 24 ++++++++++++++++++++++++
 lib/libfdt/fdt_overlay.c | 14 +++++++-------
 2 files changed, 31 insertions(+), 7 deletions(-)

Comments

Tom Rini Aug. 21, 2016, 3:08 p.m. UTC | #1
On Tue, Jul 05, 2016 at 10:26:45AM +0200, Maxime Ripard wrote:

> The device tree overlays are a good way to deal with user-modifyable
> boards or boards with some kind of an expansion mechanism where we can
> easily plug new board in (like the BBB or the raspberry pi).
> 
> However, so far, the usual mechanism to deal with it was to have in Linux
> some driver detecting the expansion boards plugged in and then request
> these overlays using the firmware interface.
> 
> That works in most cases, but in some cases, you might want to have the
> overlays applied before the userspace comes in. Either because the new
> board requires some kind of an early initialization, or because your root
> filesystem is accessed through that expansion board.
> 
> The easiest solution in such a case is to simply have the component before
> Linux applying that overlay, removing all these drawbacks.
> 
> Reviewed-by: Stefan Agner <stefan@agner.ch>
> Acked-by: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
> Acked-by: Simon Glass <sjg@chromium.org>
> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/cmd/fdt.c b/cmd/fdt.c
index 0f5923e75a41..58af7727ba08 100644
--- a/cmd/fdt.c
+++ b/cmd/fdt.c
@@ -639,6 +639,27 @@  static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #endif
 
 	}
+#ifdef CONFIG_OF_LIBFDT_OVERLAY
+	/* apply an overlay */
+	else if (strncmp(argv[1], "ap", 2) == 0) {
+		unsigned long addr;
+		struct fdt_header *blob;
+
+		if (argc != 3)
+			return CMD_RET_USAGE;
+
+		if (!working_fdt)
+			return CMD_RET_FAILURE;
+
+		addr = simple_strtoul(argv[2], NULL, 16);
+		blob = map_sysmem(addr, 0);
+		if (!fdt_valid(&blob))
+			return CMD_RET_FAILURE;
+
+		if (fdt_overlay_apply(working_fdt, blob))
+			return CMD_RET_FAILURE;
+	}
+#endif
 	/* resize the fdt */
 	else if (strncmp(argv[1], "re", 2) == 0) {
 		fdt_shrink_to_minimum(working_fdt);
@@ -1025,6 +1046,9 @@  static int fdt_print(const char *pathp, char *prop, int depth)
 #ifdef CONFIG_SYS_LONGHELP
 static char fdt_help_text[] =
 	"addr [-c]  <addr> [<length>]   - Set the [control] fdt location to <addr>\n"
+#ifdef CONFIG_OF_LIBFDT_OVERLAY
+	"fdt apply <addr>                    - Apply overlay to the DT\n"
+#endif
 #ifdef CONFIG_OF_BOARD_SETUP
 	"fdt boardsetup                      - Do board-specific set up\n"
 #endif
diff --git a/lib/libfdt/fdt_overlay.c b/lib/libfdt/fdt_overlay.c
index c45e8b25fb06..1dac8fd48343 100644
--- a/lib/libfdt/fdt_overlay.c
+++ b/lib/libfdt/fdt_overlay.c
@@ -142,10 +142,10 @@  static int overlay_update_local_node_references(void *fdto,
 		adj_val += delta;
 		adj_val = cpu_to_fdt32(adj_val);
 
-		ret = fdt_setprop_inplace_namelen_by_index(fdto, tree_node,
-							   name, strlen(name),
-							   index, &adj_val,
-							   sizeof(adj_val));
+		ret = fdt_setprop_inplace_namelen_partial(fdto, tree_node,
+							  name, strlen(name),
+							  index, &adj_val,
+							  sizeof(adj_val));
 		if (ret)
 			return ret;
 	}
@@ -220,9 +220,9 @@  static int overlay_fixup_one_phandle(void *fdt, void *fdto,
 		return fixup_off;
 
 	phandle = cpu_to_fdt32(phandle);
-	return fdt_setprop_inplace_namelen_by_index(fdto, fixup_off,
-						    name, name_len, index,
-						    &phandle, sizeof(phandle));
+	return fdt_setprop_inplace_namelen_partial(fdto, fixup_off,
+						   name, name_len, index,
+						   &phandle, sizeof(phandle));
 };
 
 static int overlay_fixup_phandle(void *fdt, void *fdto, int symbols_off,