// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2014 Google, Inc */ #include #include #include static void do_print_stats(void) { ulong start, size, needed_size, offset, count; printf("iotrace is %sabled\n", iotrace_get_enabled() ? "en" : "dis"); iotrace_get_buffer(&start, &size, &needed_size, &offset, &count); printf("Start: %08lx\n", start); printf("Actual Size: %08lx\n", size); printf("Needed Size: %08lx\n", needed_size); iotrace_get_region(&start, &size); printf("Region: %08lx\n", start); printf("Size: %08lx\n", size); printf("Offset: %08lx\n", offset); printf("Output: %08lx\n", start + offset); printf("Count: %08lx\n", count); printf("CRC32: %08lx\n", (ulong)iotrace_get_checksum()); } static void do_print_trace(void) { ulong start, size, needed_size, offset, count; struct iotrace_record *cur_record; iotrace_get_buffer(&start, &size, &needed_size, &offset, &count); if (!start || !size || !count) return; printf("Timestamp Value Address\n"); cur_record = (struct iotrace_record *)start; for (int i = 0; i < count; i++) { if (cur_record->flags & IOT_WRITE) printf("%08llu: 0x%08lx --> 0x%08llx\n", cur_record->timestamp, cur_record->value, (unsigned long long)cur_record->addr); else printf("%08llu: 0x%08lx <-- 0x%08llx\n", cur_record->timestamp, cur_record->value, (unsigned long long)cur_record->addr); cur_record++; } } static int do_set_buffer(int argc, char *const argv[]) { ulong addr = 0, size = 0; if (argc == 2) { addr = simple_strtoul(*argv++, NULL, 16); size = simple_strtoul(*argv++, NULL, 16); } else if (argc != 0) { return CMD_RET_USAGE; } iotrace_set_buffer(addr, size); return 0; } static int do_set_region(int argc, char *const argv[]) { ulong addr = 0, size = 0; if (argc == 2) { addr = simple_strtoul(*argv++, NULL, 16); size = simple_strtoul(*argv++, NULL, 16); } else if (argc != 0) { return CMD_RET_USAGE; } iotrace_set_region(addr, size); return 0; } int do_iotrace(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { const char *cmd = argc < 2 ? NULL : argv[1]; if (!cmd) return cmd_usage(cmdtp); switch (*cmd) { case 'b': return do_set_buffer(argc - 2, argv + 2); case 'l': return do_set_region(argc - 2, argv + 2); case 'p': iotrace_set_enabled(0); break; case 'r': iotrace_set_enabled(1); break; case 's': do_print_stats(); break; case 'd': do_print_trace(); break; default: return CMD_RET_USAGE; } return 0; } U_BOOT_CMD( iotrace, 4, 1, do_iotrace, "iotrace utility commands", "stats - display iotrace stats\n" "iotrace buffer
- set iotrace buffer\n" "iotrace limit
- set iotrace region limit\n" "iotrace pause - pause tracing\n" "iotrace resume - resume tracing\n" "iotrace dump - dump iotrace buffer" );