Skip to content
Snippets Groups Projects
Commit 4ee85df9 authored by André Przywara's avatar André Przywara Committed by Simon Glass
Browse files

cmd: fdt: allow standalone "fdt move"


At the moment every subcommand of "fdt", except "addr" itself, requires
the DT address to be set first. We explicitly check for that before even
comparing against the subcommands' string.
This early bailout also affects the "move" subcommand, even though that
does not require or rely on a previous call to "fdt addr". In fact it
even sets the FDT address to the target of the move command, so is a
perfect beginning for a sequence of fdt commands.

Move the check for a previously set FDT address to after we handle the
"move" command also, so we don't need a dummy call to "fdt addr" first,
before being able to move the devicetree.

This skips one pointless "fdt addr" call in scripts which aim to alter
the control DT, but need to copy it to a safe location first (for
instance to $fdt_addr_r).

Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
parent 64597346
No related branches found
No related tags found
No related merge requests found
...@@ -208,19 +208,11 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) ...@@ -208,19 +208,11 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
} }
return CMD_RET_SUCCESS; return CMD_RET_SUCCESS;
}
if (!working_fdt) {
puts("No FDT memory address configured. Please configure\n"
"the FDT address via \"fdt addr <address>\" command.\n"
"Aborting!\n");
return CMD_RET_FAILURE;
}
/* /*
* Move the working_fdt * Move the working_fdt
*/ */
if (strncmp(argv[1], "mo", 2) == 0) { } else if (strncmp(argv[1], "mo", 2) == 0) {
struct fdt_header *newaddr; struct fdt_header *newaddr;
int len; int len;
int err; int err;
...@@ -263,9 +255,20 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) ...@@ -263,9 +255,20 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
return 1; return 1;
} }
set_working_fdt_addr(map_to_sysmem(newaddr)); set_working_fdt_addr(map_to_sysmem(newaddr));
return CMD_RET_SUCCESS;
}
if (!working_fdt) {
puts("No FDT memory address configured. Please configure\n"
"the FDT address via \"fdt addr <address>\" command.\n"
"Aborting!\n");
return CMD_RET_FAILURE;
}
#ifdef CONFIG_OF_SYSTEM_SETUP #ifdef CONFIG_OF_SYSTEM_SETUP
/* Call the board-specific fixup routine */ /* Call the board-specific fixup routine */
} else if (strncmp(argv[1], "sys", 3) == 0) { if (strncmp(argv[1], "sys", 3) == 0) {
int err = ft_system_setup(working_fdt, gd->bd); int err = ft_system_setup(working_fdt, gd->bd);
if (err) { if (err) {
...@@ -273,11 +276,14 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) ...@@ -273,11 +276,14 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
fdt_strerror(err)); fdt_strerror(err));
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
} }
return CMD_RET_SUCCESS;
}
#endif #endif
/* /*
* Make a new node * Make a new node
*/ */
} else if (strncmp(argv[1], "mk", 2) == 0) { if (strncmp(argv[1], "mk", 2) == 0) {
char *pathp; /* path */ char *pathp; /* path */
char *nodep; /* new node to add */ char *nodep; /* new node to add */
int nodeoffset; /* node offset from libfdt */ int nodeoffset; /* node offset from libfdt */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment