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