bootstage.c 2.0 KB

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