iotrace.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (c) 2014 Google, Inc
  4. */
  5. #include <common.h>
  6. #include <command.h>
  7. #include <iotrace.h>
  8. static void do_print_stats(void)
  9. {
  10. ulong start, size, offset, count;
  11. printf("iotrace is %sabled\n", iotrace_get_enabled() ? "en" : "dis");
  12. iotrace_get_buffer(&start, &size, &offset, &count);
  13. printf("Start: %08lx\n", start);
  14. printf("Size: %08lx\n", size);
  15. iotrace_get_region(&start, &size);
  16. printf("Region: %08lx\n", start);
  17. printf("Size: %08lx\n", size);
  18. printf("Offset: %08lx\n", offset);
  19. printf("Output: %08lx\n", start + offset);
  20. printf("Count: %08lx\n", count);
  21. printf("CRC32: %08lx\n", (ulong)iotrace_get_checksum());
  22. }
  23. static void do_print_trace(void)
  24. {
  25. ulong start, size, offset, count;
  26. struct iotrace_record *cur_record;
  27. iotrace_get_buffer(&start, &size, &offset, &count);
  28. if (!start || !size || !count)
  29. return;
  30. printf("Timestamp Value Address\n");
  31. cur_record = (struct iotrace_record *)start;
  32. for (int i = 0; i < count; i++) {
  33. if (cur_record->flags & IOT_WRITE)
  34. printf("%08llu: 0x%08lx --> 0x%08llx\n",
  35. cur_record->timestamp,
  36. cur_record->value,
  37. (unsigned long long)cur_record->addr);
  38. else
  39. printf("%08llu: 0x%08lx <-- 0x%08llx\n",
  40. cur_record->timestamp,
  41. cur_record->value,
  42. (unsigned long long)cur_record->addr);
  43. cur_record++;
  44. }
  45. }
  46. static int do_set_buffer(int argc, char * const argv[])
  47. {
  48. ulong addr = 0, size = 0;
  49. if (argc == 2) {
  50. addr = simple_strtoul(*argv++, NULL, 16);
  51. size = simple_strtoul(*argv++, NULL, 16);
  52. } else if (argc != 0) {
  53. return CMD_RET_USAGE;
  54. }
  55. iotrace_set_buffer(addr, size);
  56. return 0;
  57. }
  58. static int do_set_region(int argc, char * const argv[])
  59. {
  60. ulong addr = 0, size = 0;
  61. if (argc == 2) {
  62. addr = simple_strtoul(*argv++, NULL, 16);
  63. size = simple_strtoul(*argv++, NULL, 16);
  64. } else if (argc != 0) {
  65. return CMD_RET_USAGE;
  66. }
  67. iotrace_set_region(addr, size);
  68. return 0;
  69. }
  70. int do_iotrace(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  71. {
  72. const char *cmd = argc < 2 ? NULL : argv[1];
  73. if (!cmd)
  74. return cmd_usage(cmdtp);
  75. switch (*cmd) {
  76. case 'b':
  77. return do_set_buffer(argc - 2, argv + 2);
  78. case 'l':
  79. return do_set_region(argc - 2, argv + 2);
  80. case 'p':
  81. iotrace_set_enabled(0);
  82. break;
  83. case 'r':
  84. iotrace_set_enabled(1);
  85. break;
  86. case 's':
  87. do_print_stats();
  88. break;
  89. case 'd':
  90. do_print_trace();
  91. break;
  92. default:
  93. return CMD_RET_USAGE;
  94. }
  95. return 0;
  96. }
  97. U_BOOT_CMD(
  98. iotrace, 4, 1, do_iotrace,
  99. "iotrace utility commands",
  100. "stats - display iotrace stats\n"
  101. "iotrace buffer <address> <size> - set iotrace buffer\n"
  102. "iotrace limit <address> <size> - set iotrace region limit\n"
  103. "iotrace pause - pause tracing\n"
  104. "iotrace resume - resume tracing\n"
  105. "iotrace dump - dump iotrace buffer"
  106. );