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