xref: /openbmc/u-boot/cmd/bootstage.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
22e192b24SSimon Glass /*
32e192b24SSimon Glass  * Copyright (c) 2012, Google Inc. All rights reserved.
42e192b24SSimon Glass  */
52e192b24SSimon Glass 
62e192b24SSimon Glass #include <common.h>
72e192b24SSimon Glass 
do_bootstage_report(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])82e192b24SSimon Glass static int do_bootstage_report(cmd_tbl_t *cmdtp, int flag, int argc,
92e192b24SSimon Glass 			       char * const argv[])
102e192b24SSimon Glass {
112e192b24SSimon Glass 	bootstage_report();
122e192b24SSimon Glass 
132e192b24SSimon Glass 	return 0;
142e192b24SSimon Glass }
152e192b24SSimon Glass 
get_base_size(int argc,char * const argv[],ulong * basep,ulong * sizep)162e192b24SSimon Glass static int get_base_size(int argc, char * const argv[], ulong *basep,
172e192b24SSimon Glass 			 ulong *sizep)
182e192b24SSimon Glass {
192e192b24SSimon Glass 	char *endp;
202e192b24SSimon Glass 
212e192b24SSimon Glass 	*basep = CONFIG_BOOTSTAGE_STASH_ADDR;
222e192b24SSimon Glass 	*sizep = CONFIG_BOOTSTAGE_STASH_SIZE;
232e192b24SSimon Glass 	if (argc < 2)
242e192b24SSimon Glass 		return 0;
252e192b24SSimon Glass 	*basep = simple_strtoul(argv[1], &endp, 16);
262e192b24SSimon Glass 	if (*argv[1] == 0 || *endp != 0)
272e192b24SSimon Glass 		return -1;
282e192b24SSimon Glass 	if (argc == 2)
292e192b24SSimon Glass 		return 0;
302e192b24SSimon Glass 	*sizep = simple_strtoul(argv[2], &endp, 16);
312e192b24SSimon Glass 	if (*argv[2] == 0 || *endp != 0)
322e192b24SSimon Glass 		return -1;
332e192b24SSimon Glass 
342e192b24SSimon Glass 	return 0;
352e192b24SSimon Glass }
362e192b24SSimon Glass 
do_bootstage_stash(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])372e192b24SSimon Glass static int do_bootstage_stash(cmd_tbl_t *cmdtp, int flag, int argc,
382e192b24SSimon Glass 			      char * const argv[])
392e192b24SSimon Glass {
402e192b24SSimon Glass 	ulong base, size;
412e192b24SSimon Glass 	int ret;
422e192b24SSimon Glass 
432e192b24SSimon Glass 	if (get_base_size(argc, argv, &base, &size))
442e192b24SSimon Glass 		return CMD_RET_USAGE;
452e192b24SSimon Glass 	if (base == -1UL) {
462e192b24SSimon Glass 		printf("No bootstage stash area defined\n");
472e192b24SSimon Glass 		return 1;
482e192b24SSimon Glass 	}
492e192b24SSimon Glass 
502e192b24SSimon Glass 	if (0 == strcmp(argv[0], "stash"))
512e192b24SSimon Glass 		ret = bootstage_stash((void *)base, size);
522e192b24SSimon Glass 	else
532e192b24SSimon Glass 		ret = bootstage_unstash((void *)base, size);
542e192b24SSimon Glass 	if (ret)
552e192b24SSimon Glass 		return 1;
562e192b24SSimon Glass 
572e192b24SSimon Glass 	return 0;
582e192b24SSimon Glass }
592e192b24SSimon Glass 
602e192b24SSimon Glass static cmd_tbl_t cmd_bootstage_sub[] = {
612e192b24SSimon Glass 	U_BOOT_CMD_MKENT(report, 2, 1, do_bootstage_report, "", ""),
622e192b24SSimon Glass 	U_BOOT_CMD_MKENT(stash, 4, 0, do_bootstage_stash, "", ""),
632e192b24SSimon Glass 	U_BOOT_CMD_MKENT(unstash, 4, 0, do_bootstage_stash, "", ""),
642e192b24SSimon Glass };
652e192b24SSimon Glass 
662e192b24SSimon Glass /*
672e192b24SSimon Glass  * Process a bootstage sub-command
682e192b24SSimon Glass  */
do_boostage(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])692e192b24SSimon Glass static int do_boostage(cmd_tbl_t *cmdtp, int flag, int argc,
702e192b24SSimon Glass 		       char * const argv[])
712e192b24SSimon Glass {
722e192b24SSimon Glass 	cmd_tbl_t *c;
732e192b24SSimon Glass 
742e192b24SSimon Glass 	/* Strip off leading 'bootstage' command argument */
752e192b24SSimon Glass 	argc--;
762e192b24SSimon Glass 	argv++;
772e192b24SSimon Glass 
782e192b24SSimon Glass 	c = find_cmd_tbl(argv[0], cmd_bootstage_sub,
792e192b24SSimon Glass 			 ARRAY_SIZE(cmd_bootstage_sub));
802e192b24SSimon Glass 
812e192b24SSimon Glass 	if (c)
822e192b24SSimon Glass 		return c->cmd(cmdtp, flag, argc, argv);
832e192b24SSimon Glass 	else
842e192b24SSimon Glass 		return CMD_RET_USAGE;
852e192b24SSimon Glass }
862e192b24SSimon Glass 
872e192b24SSimon Glass 
882e192b24SSimon Glass U_BOOT_CMD(bootstage, 4, 1, do_boostage,
892e192b24SSimon Glass 	"Boot stage command",
902e192b24SSimon Glass 	" - check boot progress and timing\n"
912e192b24SSimon Glass 	"report                      - Print a report\n"
922e192b24SSimon Glass 	"stash [<start> [<size>]]    - Stash data into memory\n"
932e192b24SSimon Glass 	"unstash [<start> [<size>]]  - Unstash data from memory"
942e192b24SSimon Glass );
95