1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2014 Google, Inc
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <command.h>
9*4882a593Smuzhiyun #include <iotrace.h>
10*4882a593Smuzhiyun
do_print_stats(void)11*4882a593Smuzhiyun static void do_print_stats(void)
12*4882a593Smuzhiyun {
13*4882a593Smuzhiyun ulong start, size, offset, count;
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun printf("iotrace is %sabled\n", iotrace_get_enabled() ? "en" : "dis");
16*4882a593Smuzhiyun iotrace_get_buffer(&start, &size, &offset, &count);
17*4882a593Smuzhiyun printf("Start: %08lx\n", start);
18*4882a593Smuzhiyun printf("Size: %08lx\n", size);
19*4882a593Smuzhiyun printf("Offset: %08lx\n", offset);
20*4882a593Smuzhiyun printf("Output: %08lx\n", start + offset);
21*4882a593Smuzhiyun printf("Count: %08lx\n", count);
22*4882a593Smuzhiyun printf("CRC32: %08lx\n", (ulong)iotrace_get_checksum());
23*4882a593Smuzhiyun }
24*4882a593Smuzhiyun
do_set_buffer(int argc,char * const argv[])25*4882a593Smuzhiyun static int do_set_buffer(int argc, char * const argv[])
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun ulong addr = 0, size = 0;
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun if (argc == 2) {
30*4882a593Smuzhiyun addr = simple_strtoul(*argv++, NULL, 16);
31*4882a593Smuzhiyun size = simple_strtoul(*argv++, NULL, 16);
32*4882a593Smuzhiyun } else if (argc != 0) {
33*4882a593Smuzhiyun return CMD_RET_USAGE;
34*4882a593Smuzhiyun }
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun iotrace_set_buffer(addr, size);
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun return 0;
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun
do_iotrace(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])41*4882a593Smuzhiyun int do_iotrace(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun const char *cmd = argc < 2 ? NULL : argv[1];
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun if (!cmd)
46*4882a593Smuzhiyun return cmd_usage(cmdtp);
47*4882a593Smuzhiyun switch (*cmd) {
48*4882a593Smuzhiyun case 'b':
49*4882a593Smuzhiyun return do_set_buffer(argc - 2, argv + 2);
50*4882a593Smuzhiyun case 'p':
51*4882a593Smuzhiyun iotrace_set_enabled(0);
52*4882a593Smuzhiyun break;
53*4882a593Smuzhiyun case 'r':
54*4882a593Smuzhiyun iotrace_set_enabled(1);
55*4882a593Smuzhiyun break;
56*4882a593Smuzhiyun case 's':
57*4882a593Smuzhiyun do_print_stats();
58*4882a593Smuzhiyun break;
59*4882a593Smuzhiyun default:
60*4882a593Smuzhiyun return CMD_RET_USAGE;
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun return 0;
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun U_BOOT_CMD(
67*4882a593Smuzhiyun iotrace, 4, 1, do_iotrace,
68*4882a593Smuzhiyun "iotrace utility commands",
69*4882a593Smuzhiyun "stats - display iotrace stats\n"
70*4882a593Smuzhiyun "iotrace buffer <address> <size> - set iotrace buffer\n"
71*4882a593Smuzhiyun "iotrace pause - pause tracing\n"
72*4882a593Smuzhiyun "iotrace resume - resume tracing"
73*4882a593Smuzhiyun );
74