bootstage.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (c) 2012, Google Inc. All rights reserved.
  4. */
  5. #include <common.h>
  6. #include <bootstage.h>
  7. #include <command.h>
  8. static int do_bootstage_report(struct cmd_tbl *cmdtp, int flag, int argc,
  9. char *const argv[])
  10. {
  11. bootstage_report();
  12. return 0;
  13. }
  14. static int get_base_size(int argc, char *const argv[], ulong *basep,
  15. ulong *sizep)
  16. {
  17. char *endp;
  18. *basep = CONFIG_BOOTSTAGE_STASH_ADDR;
  19. *sizep = CONFIG_BOOTSTAGE_STASH_SIZE;
  20. if (argc < 2)
  21. return 0;
  22. *basep = hextoul(argv[1], &endp);
  23. if (*argv[1] == 0 || *endp != 0)
  24. return -1;
  25. if (argc == 2)
  26. return 0;
  27. *sizep = hextoul(argv[2], &endp);
  28. if (*argv[2] == 0 || *endp != 0)
  29. return -1;
  30. return 0;
  31. }
  32. static int do_bootstage_stash(struct cmd_tbl *cmdtp, int flag, int argc,
  33. char *const argv[])
  34. {
  35. ulong base, size;
  36. int ret;
  37. if (get_base_size(argc, argv, &base, &size))
  38. return CMD_RET_USAGE;
  39. if (base == -1UL) {
  40. printf("No bootstage stash area defined\n");
  41. return 1;
  42. }
  43. if (0 == strcmp(argv[0], "stash"))
  44. ret = bootstage_stash((void *)base, size);
  45. else
  46. ret = bootstage_unstash((void *)base, size);
  47. if (ret)
  48. return 1;
  49. return 0;
  50. }
  51. static struct cmd_tbl cmd_bootstage_sub[] = {
  52. U_BOOT_CMD_MKENT(report, 2, 1, do_bootstage_report, "", ""),
  53. U_BOOT_CMD_MKENT(stash, 4, 0, do_bootstage_stash, "", ""),
  54. U_BOOT_CMD_MKENT(unstash, 4, 0, do_bootstage_stash, "", ""),
  55. };
  56. /*
  57. * Process a bootstage sub-command
  58. */
  59. static int do_boostage(struct cmd_tbl *cmdtp, int flag, int argc,
  60. char *const argv[])
  61. {
  62. struct cmd_tbl *c;
  63. /* Strip off leading 'bootstage' command argument */
  64. argc--;
  65. argv++;
  66. c = find_cmd_tbl(argv[0], cmd_bootstage_sub,
  67. ARRAY_SIZE(cmd_bootstage_sub));
  68. if (c)
  69. return c->cmd(cmdtp, flag, argc, argv);
  70. else
  71. return CMD_RET_USAGE;
  72. }
  73. U_BOOT_CMD(bootstage, 4, 1, do_boostage,
  74. "Boot stage command",
  75. " - check boot progress and timing\n"
  76. "report - Print a report\n"
  77. "stash [<start> [<size>]] - Stash data into memory\n"
  78. "unstash [<start> [<size>]] - Unstash data from memory"
  79. );