diff options
-rw-r--r-- | cmd/fdt.c | 24 | ||||
-rw-r--r-- | lib/libfdt/fdt_overlay.c | 14 |
2 files changed, 31 insertions, 7 deletions
@@ -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 c45e8b25fb..1dac8fd483 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, |