xref: /rk3399_rockchip-uboot/test/rockchip/test-rockchip.c (revision 90a8d4436c3a92cdad55cacda5a86e5b739628d5)
1 /*
2  * (C) Copyright 2017 Rockchip Electronics Co., Ltd
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <console.h>
9 #include "test-rockchip.h"
10 
11 extern struct cmd_group cmd_grp_boot;
12 extern struct cmd_group cmd_grp_display;
13 extern struct cmd_group cmd_grp_download;
14 extern struct cmd_group cmd_grp_misc;
15 extern struct cmd_group cmd_grp_net;
16 extern struct cmd_group cmd_grp_power;
17 extern struct cmd_group cmd_grp_storage;
18 
19 enum {
20 	TEST_SKIP_UNK,
21 	TEST_SKIP_NORETURN,
22 	TEST_SKIP_INTERACTIVE,
23 	TEST_SKIP_NORETURN_INTERACTIVE,
24 	TEST_SKIP_MAX,
25 };
26 
27 static const char *cmd_grp_name[] = {
28 	[TEST_ID_UNK]		= "UNK",
29 	[TEST_ID_BOOT]		= "BOOT",
30 	[TEST_ID_DISPLAY]	= "DISPLAY",
31 	[TEST_ID_DOWNLOAD]	= "DOWNLOAD",
32 	[TEST_ID_MISC]		= "MISC",
33 	[TEST_ID_NET]		= "NET",
34 	[TEST_ID_POWER]		= "POWER",
35 	[TEST_ID_STORAGE]	= "STORAGE",
36 	[TEST_ID_USB]		= "USB",
37 	[TEST_ID_MAX]		= "MAX",
38 };
39 
40 static const struct cmd_group *cmd_groups[] = {
41 	&cmd_grp_download,
42 	&cmd_grp_boot,
43 	&cmd_grp_storage,
44 	&cmd_grp_power,
45 	&cmd_grp_misc,
46 	&cmd_grp_net,
47 	&cmd_grp_display,
48 };
49 
50 static int cmd_groups_help(void)
51 {
52 	int i;
53 
54 	printf("* Test Case:\n");
55 	printf("    -.: normal item\n");
56 	printf("    -n: noturen item\n");
57 	printf("    -i: interactive item\n\n");
58 
59 	printf("* ALL:\n");
60 	printf("    [.] rktest all                         - test all\n");
61 	printf("    [.] rktest all v1                      - test all, ignore noreturn items\n");
62 	printf("    [.] rktest all v2                      - test all, ignore interactive items\n");
63 	printf("    [.] rktest all v3                      - test all, ignore interactive and noreturn items\n");
64 	printf("    [.] rktest storage			   - test all storage\n");
65 	printf("    [.] rktest power			   - test all power\n");
66 	printf("    [.] rktest misc			   - test all misc\n");
67 	printf("    [.] rktest net			   - test all net\n");
68 	printf("    [.] rktest display			   - test all display\n");
69 
70 	for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) {
71 		printf("* %s:\n", cmd_grp_name[cmd_groups[i]->id]);
72 		printf("%s", cmd_groups[i]->help);
73 	}
74 
75 	return 0;
76 }
77 
78 static int skip_this_cmd(cmd_tbl_t *cp, int skip_mode)
79 {
80 	bool is_interactive = CMD_FLG_ENABLED(cp, CMD_FLG_INTERACTIVE);
81 	bool is_noreturn = CMD_FLG_ENABLED(cp, CMD_FLG_NORETURN);
82 
83 	switch (skip_mode) {
84 	case TEST_SKIP_NORETURN:
85 		return is_noreturn;
86 	case TEST_SKIP_INTERACTIVE:
87 		return is_interactive;
88 	case TEST_SKIP_NORETURN_INTERACTIVE:
89 		return is_noreturn || is_interactive;
90 	}
91 
92 	return 0;
93 }
94 static int do_rockchip_test(cmd_tbl_t *cmdtp, int flag,
95 			    int argc, char *const argv[])
96 {
97 	ulong ms_start = 0, ms = 0, sec = 0;
98 	int grp_test_id = TEST_ID_UNK;
99 	int okay = 0, fail = 0;
100 	int ret, i, j;
101 	int skip_mode = 0;
102 	cmd_tbl_t *cp;
103 
104 	if (argc == 1)
105 		return cmd_groups_help();
106 
107 	/* Drop initial "rktest" arg */
108 	argc--;
109 	argv++;
110 
111 	if (!strcmp(argv[0], "all")) {
112 		/* Test all skip_mode: v1, v2, v3... */
113 		if (argv[1]) {
114 			if (!strcmp(argv[1], CMD_MODE_V1))
115 				skip_mode = TEST_SKIP_NORETURN;
116 			else if (!strcmp(argv[1], CMD_MODE_V2))
117 				skip_mode = TEST_SKIP_INTERACTIVE;
118 			else if (!strcmp(argv[1], CMD_MODE_V3))
119 				skip_mode = TEST_SKIP_NORETURN_INTERACTIVE;
120 		}
121 		goto all_test;
122 	} else {
123 		if (!strcmp(argv[0], "storage"))
124 			grp_test_id = TEST_ID_STORAGE;
125 		else if (!strcmp(argv[0], "power"))
126 			grp_test_id = TEST_ID_POWER;
127 		else if (!strcmp(argv[0], "misc"))
128 			grp_test_id = TEST_ID_MISC;
129 		else if (!strcmp(argv[0], "net"))
130 			grp_test_id = TEST_ID_NET;
131 		else if (!strcmp(argv[0], "display"))
132 			grp_test_id = TEST_ID_DISPLAY;
133 
134 		if (grp_test_id != TEST_ID_UNK) {
135 			skip_mode = TEST_SKIP_NORETURN; /* Skip noreturn item */
136 			goto all_test;
137 		}
138 	}
139 
140 /* item_test: */
141 	for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) {
142 		cp = find_cmd_tbl(argv[0],
143 				  cmd_groups[i]->cmd,
144 				  cmd_groups[i]->cmd_n);
145 		if (cp) {
146 			ret = cp->cmd(cmdtp, flag, argc, argv);
147 			printf("\n### [%s] test done, result: <%s>..\n",
148 			       cp->name, ret ? "FAILED" : "OKAY");
149 
150 			return ret;
151 		}
152 	}
153 
154 	printf("Unknown cmd: rktest %s (Not enabled ?)\n", argv[0]);
155 	goto finish;
156 
157 all_test:
158 	lava_info("<LAVA_SIGNAL_STARTRUN u-boot-function 0>\n");
159 	ms_start = get_timer(0);
160 	for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) {
161 		/*
162 		 * If 'grp_test_id != TEST_ID_UNK', now is group test, find
163 		 * the grp cmd.
164 		 */
165 		if (grp_test_id != TEST_ID_UNK &&
166 		    grp_test_id != cmd_groups[i]->id)
167 			continue;
168 
169 		/* Run all commands in 'this' grp */
170 		for (j = 0, cp = cmd_groups[i]->cmd;
171 		     j < cmd_groups[i]->cmd_n;
172 		     j++, cp++) {
173 			/* Skip this ignored cmd */
174 			if (skip_this_cmd(cp, skip_mode)) {
175 				printf("### Skip  [%s]\n", cp->name);
176 				lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=skip>\n", cp->name);
177 				continue;
178 			}
179 
180 			printf("### Start [%s]\n", cp->name);
181 
182 			/* Flush console */
183 			if (cmd_groups[i]->id == TEST_ID_DOWNLOAD)
184 				flushc();
185 
186 			/* Execute command */
187 			ret = cp->cmd(cmdtp, flag, argc, argv);
188 			if (ret) {
189 				lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=fail>\n", cp->name);
190 				fail++;
191 			} else {
192 				lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=pass>\n", cp->name);
193 				okay++;
194 			}
195 
196 			/* Result */
197 			printf("### Finish, result: <%s>\n\n",
198 			       ret ? "FAILED" : "PASS");
199 
200 			if (ctrlc()) {
201 				printf("Exit board test by ctrl+c\n");
202 				break;
203 			}
204 		}
205 	}
206 
207 	/* Total time and report */
208 	ms = get_timer(ms_start);
209 	if (ms >= 1000) {
210 		sec = ms / 1000;
211 		ms = ms % 1000;
212 	}
213 	printf("[=== SUM: pass: %d; failed: %d; total: %lu.%lus ===]\n\n\n",
214 	       okay, fail, sec, ms);
215 /*
216  * LAVA result with meansure data
217  * lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=dd-write-mean RESULT=pass UNITS=MB/s MEASUREMENT=37.42>");
218  */
219 	lava_info("<LAVA_SIGNAL_ENDRUN u-boot-function 0>\n");
220 	lava_info("<LAVA_TEST_RUNNER>: exiting u-boot-function\n");
221 
222 finish:
223 	return 0;
224 }
225 
226 U_BOOT_CMD(
227 	rktest, 10, 0, do_rockchip_test,
228 	"Rockchip board modules test",
229 	NULL
230 );
231