xref: /rk3399_rockchip-uboot/test/rockchip/test-rockchip.c (revision 1a4f6af8bfd44c8ae6e87a81ff125eed47042cc5)
11dc7864bSJoseph Chen /*
21dc7864bSJoseph Chen  * (C) Copyright 2017 Rockchip Electronics Co., Ltd
31dc7864bSJoseph Chen  *
41dc7864bSJoseph Chen  * SPDX-License-Identifier:     GPL-2.0+
51dc7864bSJoseph Chen  */
61dc7864bSJoseph Chen 
71dc7864bSJoseph Chen #include <common.h>
899d14b01SJoseph Chen #include <console.h>
91dc7864bSJoseph Chen #include "test-rockchip.h"
101dc7864bSJoseph Chen 
1199d14b01SJoseph Chen extern struct cmd_group cmd_grp_boot;
1299d14b01SJoseph Chen extern struct cmd_group cmd_grp_download;
1354108d04SKever Yang #ifdef CONFIG_RKIMG_BOOTLOADER
1454108d04SKever Yang extern struct cmd_group cmd_grp_display;
1599d14b01SJoseph Chen extern struct cmd_group cmd_grp_misc;
1654108d04SKever Yang #endif
1799d14b01SJoseph Chen extern struct cmd_group cmd_grp_net;
1899d14b01SJoseph Chen extern struct cmd_group cmd_grp_power;
1999d14b01SJoseph Chen extern struct cmd_group cmd_grp_storage;
201dc7864bSJoseph Chen 
2199d14b01SJoseph Chen enum {
2299d14b01SJoseph Chen 	TEST_SKIP_UNK,
2399d14b01SJoseph Chen 	TEST_SKIP_NORETURN,
2499d14b01SJoseph Chen 	TEST_SKIP_INTERACTIVE,
2599d14b01SJoseph Chen 	TEST_SKIP_NORETURN_INTERACTIVE,
2699d14b01SJoseph Chen 	TEST_SKIP_MAX,
271dc7864bSJoseph Chen };
281dc7864bSJoseph Chen 
2999d14b01SJoseph Chen static const char *cmd_grp_name[] = {
3099d14b01SJoseph Chen 	[TEST_ID_UNK]		= "UNK",
3199d14b01SJoseph Chen 	[TEST_ID_BOOT]		= "BOOT",
3299d14b01SJoseph Chen 	[TEST_ID_DISPLAY]	= "DISPLAY",
3399d14b01SJoseph Chen 	[TEST_ID_DOWNLOAD]	= "DOWNLOAD",
3499d14b01SJoseph Chen 	[TEST_ID_MISC]		= "MISC",
3599d14b01SJoseph Chen 	[TEST_ID_NET]		= "NET",
3699d14b01SJoseph Chen 	[TEST_ID_POWER]		= "POWER",
3799d14b01SJoseph Chen 	[TEST_ID_STORAGE]	= "STORAGE",
3899d14b01SJoseph Chen 	[TEST_ID_USB]		= "USB",
3999d14b01SJoseph Chen 	[TEST_ID_MAX]		= "MAX",
4099d14b01SJoseph Chen };
4199d14b01SJoseph Chen 
4299d14b01SJoseph Chen static const struct cmd_group *cmd_groups[] = {
4399d14b01SJoseph Chen 	&cmd_grp_download,
4499d14b01SJoseph Chen 	&cmd_grp_boot,
4599d14b01SJoseph Chen 	&cmd_grp_storage,
4699d14b01SJoseph Chen 	&cmd_grp_power,
4799d14b01SJoseph Chen 	&cmd_grp_net,
4854108d04SKever Yang #ifdef CONFIG_RKIMG_BOOTLOADER
4954108d04SKever Yang 	&cmd_grp_misc,
5099d14b01SJoseph Chen 	&cmd_grp_display,
5154108d04SKever Yang #endif
5299d14b01SJoseph Chen };
5399d14b01SJoseph Chen 
cmd_groups_help(void)5499d14b01SJoseph Chen static int cmd_groups_help(void)
55336e1992SJoseph Chen {
561e7c429dSJoseph Chen 	int i;
571e7c429dSJoseph Chen 
5899d14b01SJoseph Chen 	printf("* Test Case:\n");
5999d14b01SJoseph Chen 	printf("    -.: normal item\n");
60*3a5e7a93SJoseph Chen 	printf("    -n: noreturn item\n");
6199d14b01SJoseph Chen 	printf("    -i: interactive item\n\n");
621e7c429dSJoseph Chen 
6399d14b01SJoseph Chen 	printf("* ALL:\n");
6499d14b01SJoseph Chen 	printf("    [.] rktest all                         - test all\n");
6599d14b01SJoseph Chen 	printf("    [.] rktest all v1                      - test all, ignore noreturn items\n");
6699d14b01SJoseph Chen 	printf("    [.] rktest all v2                      - test all, ignore interactive items\n");
6799d14b01SJoseph Chen 	printf("    [.] rktest all v3                      - test all, ignore interactive and noreturn items\n");
6899d14b01SJoseph Chen 	printf("    [.] rktest storage			   - test all storage\n");
6999d14b01SJoseph Chen 	printf("    [.] rktest power			   - test all power\n");
7099d14b01SJoseph Chen 	printf("    [.] rktest misc			   - test all misc\n");
7199d14b01SJoseph Chen 	printf("    [.] rktest net			   - test all net\n");
7299d14b01SJoseph Chen 	printf("    [.] rktest display			   - test all display\n");
7399d14b01SJoseph Chen 
7499d14b01SJoseph Chen 	for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) {
7599d14b01SJoseph Chen 		printf("* %s:\n", cmd_grp_name[cmd_groups[i]->id]);
7699d14b01SJoseph Chen 		printf("%s", cmd_groups[i]->help);
77336e1992SJoseph Chen 	}
78336e1992SJoseph Chen 
7999d14b01SJoseph Chen 	return 0;
8099d14b01SJoseph Chen }
8199d14b01SJoseph Chen 
skip_this_cmd(cmd_tbl_t * cp,int skip_mode)8299d14b01SJoseph Chen static int skip_this_cmd(cmd_tbl_t *cp, int skip_mode)
8399d14b01SJoseph Chen {
8499d14b01SJoseph Chen 	bool is_interactive = CMD_FLG_ENABLED(cp, CMD_FLG_INTERACTIVE);
8599d14b01SJoseph Chen 	bool is_noreturn = CMD_FLG_ENABLED(cp, CMD_FLG_NORETURN);
8699d14b01SJoseph Chen 
8799d14b01SJoseph Chen 	switch (skip_mode) {
8899d14b01SJoseph Chen 	case TEST_SKIP_NORETURN:
8999d14b01SJoseph Chen 		return is_noreturn;
9099d14b01SJoseph Chen 	case TEST_SKIP_INTERACTIVE:
9199d14b01SJoseph Chen 		return is_interactive;
9299d14b01SJoseph Chen 	case TEST_SKIP_NORETURN_INTERACTIVE:
9399d14b01SJoseph Chen 		return is_noreturn || is_interactive;
9499d14b01SJoseph Chen 	}
9599d14b01SJoseph Chen 
9699d14b01SJoseph Chen 	return 0;
9799d14b01SJoseph Chen }
do_rockchip_test(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])981dc7864bSJoseph Chen static int do_rockchip_test(cmd_tbl_t *cmdtp, int flag,
991dc7864bSJoseph Chen 			    int argc, char *const argv[])
1001dc7864bSJoseph Chen {
1011dc7864bSJoseph Chen 	ulong ms_start = 0, ms = 0, sec = 0;
10299d14b01SJoseph Chen 	int grp_test_id = TEST_ID_UNK;
10399d14b01SJoseph Chen 	int okay = 0, fail = 0;
10499d14b01SJoseph Chen 	int ret, i, j;
10599d14b01SJoseph Chen 	int skip_mode = 0;
10699d14b01SJoseph Chen 	cmd_tbl_t *cp;
1071dc7864bSJoseph Chen 
10899d14b01SJoseph Chen 	if (argc == 1)
10999d14b01SJoseph Chen 		return cmd_groups_help();
11099d14b01SJoseph Chen 
11199d14b01SJoseph Chen 	/* Drop initial "rktest" arg */
11299d14b01SJoseph Chen 	argc--;
11399d14b01SJoseph Chen 	argv++;
11499d14b01SJoseph Chen 
11599d14b01SJoseph Chen 	if (!strcmp(argv[0], "all")) {
11699d14b01SJoseph Chen 		/* Test all skip_mode: v1, v2, v3... */
11799d14b01SJoseph Chen 		if (argv[1]) {
11899d14b01SJoseph Chen 			if (!strcmp(argv[1], CMD_MODE_V1))
11999d14b01SJoseph Chen 				skip_mode = TEST_SKIP_NORETURN;
12099d14b01SJoseph Chen 			else if (!strcmp(argv[1], CMD_MODE_V2))
12199d14b01SJoseph Chen 				skip_mode = TEST_SKIP_INTERACTIVE;
12299d14b01SJoseph Chen 			else if (!strcmp(argv[1], CMD_MODE_V3))
12399d14b01SJoseph Chen 				skip_mode = TEST_SKIP_NORETURN_INTERACTIVE;
12499d14b01SJoseph Chen 		}
125d0ff3d45SKever Yang 		/* rktest all has no valid parameter */
126d0ff3d45SKever Yang 		argc = 1;
12799d14b01SJoseph Chen 		goto all_test;
1281dc7864bSJoseph Chen 	} else {
12999d14b01SJoseph Chen 		if (!strcmp(argv[0], "storage"))
13099d14b01SJoseph Chen 			grp_test_id = TEST_ID_STORAGE;
13199d14b01SJoseph Chen 		else if (!strcmp(argv[0], "power"))
13299d14b01SJoseph Chen 			grp_test_id = TEST_ID_POWER;
13399d14b01SJoseph Chen 		else if (!strcmp(argv[0], "misc"))
13499d14b01SJoseph Chen 			grp_test_id = TEST_ID_MISC;
13599d14b01SJoseph Chen 		else if (!strcmp(argv[0], "net"))
13699d14b01SJoseph Chen 			grp_test_id = TEST_ID_NET;
13799d14b01SJoseph Chen 		else if (!strcmp(argv[0], "display"))
13899d14b01SJoseph Chen 			grp_test_id = TEST_ID_DISPLAY;
13999d14b01SJoseph Chen 
14099d14b01SJoseph Chen 		if (grp_test_id != TEST_ID_UNK) {
14199d14b01SJoseph Chen 			skip_mode = TEST_SKIP_NORETURN; /* Skip noreturn item */
14299d14b01SJoseph Chen 			goto all_test;
14399d14b01SJoseph Chen 		}
1441dc7864bSJoseph Chen 	}
1451dc7864bSJoseph Chen 
14699d14b01SJoseph Chen /* item_test: */
14799d14b01SJoseph Chen 	for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) {
14899d14b01SJoseph Chen 		cp = find_cmd_tbl(argv[0],
14999d14b01SJoseph Chen 				  cmd_groups[i]->cmd,
15099d14b01SJoseph Chen 				  cmd_groups[i]->cmd_n);
15199d14b01SJoseph Chen 		if (cp) {
15299d14b01SJoseph Chen 			ret = cp->cmd(cmdtp, flag, argc, argv);
15399d14b01SJoseph Chen 			printf("\n### [%s] test done, result: <%s>..\n",
15499d14b01SJoseph Chen 			       cp->name, ret ? "FAILED" : "OKAY");
1551dc7864bSJoseph Chen 
15699d14b01SJoseph Chen 			return ret;
15799d14b01SJoseph Chen 		}
15899d14b01SJoseph Chen 	}
15935573213SJoseph Chen 
16099d14b01SJoseph Chen 	printf("Unknown cmd: rktest %s (Not enabled ?)\n", argv[0]);
16199d14b01SJoseph Chen 	goto finish;
16235573213SJoseph Chen 
16399d14b01SJoseph Chen all_test:
1642a77afceSKever Yang 	lava_info("<LAVA_SIGNAL_STARTRUN u-boot-function 0>\n");
1651dc7864bSJoseph Chen 	ms_start = get_timer(0);
16699d14b01SJoseph Chen 	for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) {
16799d14b01SJoseph Chen 		/*
16899d14b01SJoseph Chen 		 * If 'grp_test_id != TEST_ID_UNK', now is group test, find
16999d14b01SJoseph Chen 		 * the grp cmd.
17099d14b01SJoseph Chen 		 */
17199d14b01SJoseph Chen 		if (grp_test_id != TEST_ID_UNK &&
17299d14b01SJoseph Chen 		    grp_test_id != cmd_groups[i]->id)
17399d14b01SJoseph Chen 			continue;
1741dc7864bSJoseph Chen 
17599d14b01SJoseph Chen 		/* Run all commands in 'this' grp */
17699d14b01SJoseph Chen 		for (j = 0, cp = cmd_groups[i]->cmd;
17799d14b01SJoseph Chen 		     j < cmd_groups[i]->cmd_n;
17899d14b01SJoseph Chen 		     j++, cp++) {
17999d14b01SJoseph Chen 			/* Skip this ignored cmd */
18099d14b01SJoseph Chen 			if (skip_this_cmd(cp, skip_mode)) {
18199d14b01SJoseph Chen 				printf("### Skip  [%s]\n", cp->name);
1822a77afceSKever Yang 				lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=skip>\n", cp->name);
18399d14b01SJoseph Chen 				continue;
18499d14b01SJoseph Chen 			}
18599d14b01SJoseph Chen 
18699d14b01SJoseph Chen 			printf("### Start [%s]\n", cp->name);
18754108d04SKever Yang #ifdef CONFIG_RKIMG_BOOTLOADER
18899d14b01SJoseph Chen 			/* Flush console */
18999d14b01SJoseph Chen 			if (cmd_groups[i]->id == TEST_ID_DOWNLOAD)
19099d14b01SJoseph Chen 				flushc();
19154108d04SKever Yang #endif
19299d14b01SJoseph Chen 			/* Execute command */
19399d14b01SJoseph Chen 			ret = cp->cmd(cmdtp, flag, argc, argv);
1942a77afceSKever Yang 			if (ret) {
1952a77afceSKever Yang 				lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=fail>\n", cp->name);
19699d14b01SJoseph Chen 				fail++;
1972a77afceSKever Yang 			} else {
1982a77afceSKever Yang 				lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=pass>\n", cp->name);
19999d14b01SJoseph Chen 				okay++;
2002a77afceSKever Yang 			}
20199d14b01SJoseph Chen 
20299d14b01SJoseph Chen 			/* Result */
20399d14b01SJoseph Chen 			printf("### Finish, result: <%s>\n\n",
20499d14b01SJoseph Chen 			       ret ? "FAILED" : "PASS");
20599d14b01SJoseph Chen 
20699d14b01SJoseph Chen 			if (ctrlc()) {
20799d14b01SJoseph Chen 				printf("Exit board test by ctrl+c\n");
20899d14b01SJoseph Chen 				break;
20999d14b01SJoseph Chen 			}
21099d14b01SJoseph Chen 		}
21199d14b01SJoseph Chen 	}
21299d14b01SJoseph Chen 
21399d14b01SJoseph Chen 	/* Total time and report */
2141dc7864bSJoseph Chen 	ms = get_timer(ms_start);
2151dc7864bSJoseph Chen 	if (ms >= 1000) {
2161dc7864bSJoseph Chen 		sec = ms / 1000;
2171dc7864bSJoseph Chen 		ms = ms % 1000;
2181dc7864bSJoseph Chen 	}
21999d14b01SJoseph Chen 	printf("[=== SUM: pass: %d; failed: %d; total: %lu.%lus ===]\n\n\n",
22099d14b01SJoseph Chen 	       okay, fail, sec, ms);
2212a77afceSKever Yang /*
2222a77afceSKever Yang  * LAVA result with meansure data
2232a77afceSKever Yang  * lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=dd-write-mean RESULT=pass UNITS=MB/s MEASUREMENT=37.42>");
2242a77afceSKever Yang  */
2252a77afceSKever Yang 	lava_info("<LAVA_SIGNAL_ENDRUN u-boot-function 0>\n");
2262a77afceSKever Yang 	lava_info("<LAVA_TEST_RUNNER>: exiting u-boot-function\n");
22735573213SJoseph Chen 
22899d14b01SJoseph Chen finish:
2291dc7864bSJoseph Chen 	return 0;
2301dc7864bSJoseph Chen }
2311dc7864bSJoseph Chen 
2321dc7864bSJoseph Chen U_BOOT_CMD(
2331dc7864bSJoseph Chen 	rktest, 10, 0, do_rockchip_test,
23499d14b01SJoseph Chen 	"Rockchip board modules test",
23599d14b01SJoseph Chen 	NULL
2361dc7864bSJoseph Chen );
237