iotrace.c 2.9 KB

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