Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | // SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2012, Google Inc. All rights reserved. */ #include <bootstage.h> #include <command.h> #include <env.h> #include <vsprintf.h> #include <linux/string.h> static int do_bootstage_report(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { bootstage_report(); return 0; } #if IS_ENABLED(CONFIG_BOOTSTAGE_STASH) static int get_base_size(int argc, char *const argv[], ulong *basep, ulong *sizep) { char *endp; *basep = CONFIG_BOOTSTAGE_STASH_ADDR; *sizep = CONFIG_BOOTSTAGE_STASH_SIZE; if (argc < 2) return 0; *basep = hextoul(argv[1], &endp); if (*argv[1] == 0 || *endp != 0) return -1; if (argc == 2) return 0; *sizep = hextoul(argv[2], &endp); if (*argv[2] == 0 || *endp != 0) return -1; return 0; } static int do_bootstage_stash(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { ulong base, size; int ret; if (get_base_size(argc, argv, &base, &size)) return CMD_RET_USAGE; if (base == -1UL) { printf("No bootstage stash area defined\n"); return 1; } if (0 == strcmp(argv[0], "stash")) ret = bootstage_stash((void *)base, size); else ret = bootstage_unstash((void *)base, size); if (ret) return 1; return 0; } #endif static int __maybe_unused do_bootstage_save(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { env_set_hex("bootstage_count", bootstage_get_rec_count()); return 0; } static int __maybe_unused do_bootstage_restore(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { ulong count = env_get_hex("bootstage_count", 0); if (count) bootstage_set_rec_count(count); return 0; } static struct cmd_tbl cmd_bootstage_sub[] = { U_BOOT_CMD_MKENT(report, 2, 1, do_bootstage_report, "", ""), #if IS_ENABLED(CONFIG_BOOTSTAGE_SAVE) U_BOOT_CMD_MKENT(save, 1, 0, do_bootstage_save, "", ""), U_BOOT_CMD_MKENT(restore, 1, 0, do_bootstage_restore, "", ""), #endif #if IS_ENABLED(CONFIG_BOOTSTAGE_STASH) U_BOOT_CMD_MKENT(stash, 4, 0, do_bootstage_stash, "", ""), U_BOOT_CMD_MKENT(unstash, 4, 0, do_bootstage_stash, "", ""), #endif }; /* * Process a bootstage sub-command */ static int do_boostage(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct cmd_tbl *c; /* Strip off leading 'bootstage' command argument */ argc--; argv++; c = find_cmd_tbl(argv[0], cmd_bootstage_sub, ARRAY_SIZE(cmd_bootstage_sub)); if (c) return c->cmd(cmdtp, flag, argc, argv); else return CMD_RET_USAGE; } U_BOOT_CMD(bootstage, 4, 1, do_boostage, "Boot stage command", " - check boot progress and timing\n" "report - Print a report\n" #if IS_ENABLED(CONFIG_BOOTSTAGE_SAVE) "save - Save record count to $bootstage_count\n" "restore - Restore record count from $bootstage_count\n" #endif #if IS_ENABLED(CONFIG_BOOTSTAGE_STASH) "stash [<start> [<size>]] - Stash data into memory\n" "unstash [<start> [<size>]] - Unstash data from memory\n" #endif ); |