[PATCH v3 07/17] x86: zboot: Set up a sub-command structure
Bin Meng
bmeng.cn at gmail.com
Tue Sep 22 08:22:46 CEST 2020
On Sun, Sep 6, 2020 at 4:51 AM Simon Glass <sjg at 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 <sjg at chromium.org>
> Reviewed-by: Wolfgang Wallner <wolfgang.wallner at 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.cn at gmail.com>
More information about the U-Boot
mailing list