On Sun, Sep 6, 2020 at 4:51 AM Simon Glass <s...@chromium.org> wrote: > > Add subcommands to zboot. At present there is only one called 'start' > which does the whole boot. It is the default command so is optional. > > Change the 's' string variable to const while we are here. > Signed-off-by: Simon Glass <s...@chromium.org> > Reviewed-by: Wolfgang Wallner <wolfgang.wall...@br-automation.com> > --- > > Changes in v3: > - Add a comment about complete_zboot() > - Move command help into the patch for each command > - Reduce maxargs to 6 > > Changes in v2: > - Fix comment about argv[0] in do_zboot_parent() > > arch/x86/lib/zimage.c | 66 +++++++++++++++++++++++++++++++++++++++---- > 1 file changed, 61 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c > index 8651dea93b3..f037bd5dc56 100644 > --- a/arch/x86/lib/zimage.c > +++ b/arch/x86/lib/zimage.c > @@ -63,6 +63,12 @@ struct zboot_state { > ulong load_address; > } state; > > +enum { > + ZBOOT_STATE_START = BIT(0), > + > + ZBOOT_STATE_COUNT = 1, > +}; > + > static void build_command_line(char *command_line, int auto_boot) > { > char *env_command_line; > @@ -328,10 +334,11 @@ int setup_zimage(struct boot_params *setup_base, char > *cmd_line, int auto_boot, > return 0; > } > > -int do_zboot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) > +static int do_zboot_start(struct cmd_tbl *cmdtp, int flag, int argc, > + char *const argv[]) > { > struct boot_params *base_ptr; > - char *s; > + const char *s; > > memset(&state, '\0', sizeof(state)); > if (argc >= 2) { > @@ -373,9 +380,54 @@ int do_zboot(struct cmd_tbl *cmdtp, int flag, int argc, > char *const argv[]) > return boot_linux_kernel((ulong)base_ptr, state.load_address, false); > } > > -U_BOOT_CMD( > - zboot, 5, 0, do_zboot, > - "Boot bzImage", > +/* Note: This defines the complete_zboot() function */ > +U_BOOT_SUBCMDS(zboot, > + U_BOOT_CMD_MKENT(start, 8, 1, do_zboot_start, "", ""),
This should be 6, 1, > +) > + > +int do_zboot_states(struct cmd_tbl *cmdtp, int flag, int argc, > + char *const argv[], int state_mask) > +{ > + int i; > + > + for (i = 0; i < ZBOOT_STATE_COUNT; i++) { > + struct cmd_tbl *cmd = &zboot_subcmds[i]; > + int mask = 1 << i; > + int ret; > + > + if (mask & state_mask) { > + ret = cmd->cmd(cmd, flag, argc, argv); > + if (ret) > + return ret; > + } > + } > + > + return 0; > +} > + > +int do_zboot_parent(struct cmd_tbl *cmdtp, int flag, int argc, > + char *const argv[], int *repeatable) > +{ > + /* determine if we have a sub command */ > + if (argc > 1) { > + char *endp; > + > + simple_strtoul(argv[1], &endp, 16); > + /* > + * endp pointing to nul means that argv[1] was just a valid > + * number, so pass it along to the normal processing > + */ > + if (*endp) > + return do_zboot(cmdtp, flag, argc, argv, repeatable); > + } > + > + do_zboot_states(cmdtp, flag, argc, argv, ZBOOT_STATE_START); > + > + return CMD_RET_FAILURE; > +} > + > +U_BOOT_CMDREP_COMPLETE( > + zboot, 6, do_zboot_parent, "Boot bzImage", > "[addr] [size] [initrd addr] [initrd size]\n" > " addr - The optional starting address of the bzimage.\n" > " If not set it defaults to the environment\n" > @@ -384,4 +436,8 @@ U_BOOT_CMD( > " zero.\n" > " initrd addr - The address of the initrd image to use, if > any.\n" > " initrd size - The size of the initrd image to use, if any.\n" > + "\n" > + "Sub-commands to do part of the zboot sequence:\n" > + "\tstart [addr [arg ...]] - specify arguments\n", > + complete_zboot > ); > -- Reviewed-by: Bin Meng <bmeng...@gmail.com>