1*b11ed7d6SAlex Kiernan // SPDX-License-Identifier: GPL-2.0+
2*b11ed7d6SAlex Kiernan
3*b11ed7d6SAlex Kiernan #include <common.h>
4*b11ed7d6SAlex Kiernan #include <command.h>
5*b11ed7d6SAlex Kiernan #include <bootcount.h>
6*b11ed7d6SAlex Kiernan
do_bootcount_print(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])7*b11ed7d6SAlex Kiernan static int do_bootcount_print(cmd_tbl_t *cmdtp, int flag, int argc,
8*b11ed7d6SAlex Kiernan char * const argv[])
9*b11ed7d6SAlex Kiernan {
10*b11ed7d6SAlex Kiernan printf("%lu\n", bootcount_load());
11*b11ed7d6SAlex Kiernan return CMD_RET_SUCCESS;
12*b11ed7d6SAlex Kiernan }
13*b11ed7d6SAlex Kiernan
do_bootcount_reset(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])14*b11ed7d6SAlex Kiernan static int do_bootcount_reset(cmd_tbl_t *cmdtp, int flag, int argc,
15*b11ed7d6SAlex Kiernan char * const argv[])
16*b11ed7d6SAlex Kiernan {
17*b11ed7d6SAlex Kiernan /*
18*b11ed7d6SAlex Kiernan * note that we're explicitly not resetting the environment
19*b11ed7d6SAlex Kiernan * variable, so you still have the old bootcounter available
20*b11ed7d6SAlex Kiernan */
21*b11ed7d6SAlex Kiernan bootcount_store(0);
22*b11ed7d6SAlex Kiernan return CMD_RET_SUCCESS;
23*b11ed7d6SAlex Kiernan }
24*b11ed7d6SAlex Kiernan
25*b11ed7d6SAlex Kiernan static cmd_tbl_t bootcount_sub[] = {
26*b11ed7d6SAlex Kiernan U_BOOT_CMD_MKENT(print, 1, 1, do_bootcount_print, "", ""),
27*b11ed7d6SAlex Kiernan U_BOOT_CMD_MKENT(reset, 1, 1, do_bootcount_reset, "", ""),
28*b11ed7d6SAlex Kiernan };
29*b11ed7d6SAlex Kiernan
do_bootcount(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])30*b11ed7d6SAlex Kiernan static int do_bootcount(cmd_tbl_t *cmdtp, int flag, int argc,
31*b11ed7d6SAlex Kiernan char * const argv[])
32*b11ed7d6SAlex Kiernan {
33*b11ed7d6SAlex Kiernan cmd_tbl_t *cp;
34*b11ed7d6SAlex Kiernan
35*b11ed7d6SAlex Kiernan if (argc < 2)
36*b11ed7d6SAlex Kiernan return CMD_RET_USAGE;
37*b11ed7d6SAlex Kiernan
38*b11ed7d6SAlex Kiernan /* drop initial "bootcount" arg */
39*b11ed7d6SAlex Kiernan argc--;
40*b11ed7d6SAlex Kiernan argv++;
41*b11ed7d6SAlex Kiernan
42*b11ed7d6SAlex Kiernan cp = find_cmd_tbl(argv[0], bootcount_sub, ARRAY_SIZE(bootcount_sub));
43*b11ed7d6SAlex Kiernan if (cp)
44*b11ed7d6SAlex Kiernan return cp->cmd(cmdtp, flag, argc, argv);
45*b11ed7d6SAlex Kiernan
46*b11ed7d6SAlex Kiernan return CMD_RET_USAGE;
47*b11ed7d6SAlex Kiernan }
48*b11ed7d6SAlex Kiernan
49*b11ed7d6SAlex Kiernan #if CONFIG_IS_ENABLED(SYS_LONGHELP)
50*b11ed7d6SAlex Kiernan static char bootcount_help_text[] =
51*b11ed7d6SAlex Kiernan "print - print current bootcounter\n"
52*b11ed7d6SAlex Kiernan "reset - reset the bootcounter"
53*b11ed7d6SAlex Kiernan ;
54*b11ed7d6SAlex Kiernan #endif
55*b11ed7d6SAlex Kiernan
56*b11ed7d6SAlex Kiernan U_BOOT_CMD(bootcount, 2, 1, do_bootcount,
57*b11ed7d6SAlex Kiernan "bootcount",
58*b11ed7d6SAlex Kiernan #if CONFIG_IS_ENABLED(SYS_LONGHELP)
59*b11ed7d6SAlex Kiernan bootcount_help_text
60*b11ed7d6SAlex Kiernan #endif
61*b11ed7d6SAlex Kiernan );
62