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; 13*54108d04SKever Yang #ifdef CONFIG_RKIMG_BOOTLOADER 14*54108d04SKever Yang extern struct cmd_group cmd_grp_display; 1599d14b01SJoseph Chen extern struct cmd_group cmd_grp_misc; 16*54108d04SKever 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, 48*54108d04SKever Yang #ifdef CONFIG_RKIMG_BOOTLOADER 49*54108d04SKever Yang &cmd_grp_misc, 5099d14b01SJoseph Chen &cmd_grp_display, 51*54108d04SKever Yang #endif 5299d14b01SJoseph Chen }; 5399d14b01SJoseph Chen 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"); 6099d14b01SJoseph Chen printf(" -n: noturen 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 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 } 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 } 12599d14b01SJoseph Chen goto all_test; 1261dc7864bSJoseph Chen } else { 12799d14b01SJoseph Chen if (!strcmp(argv[0], "storage")) 12899d14b01SJoseph Chen grp_test_id = TEST_ID_STORAGE; 12999d14b01SJoseph Chen else if (!strcmp(argv[0], "power")) 13099d14b01SJoseph Chen grp_test_id = TEST_ID_POWER; 13199d14b01SJoseph Chen else if (!strcmp(argv[0], "misc")) 13299d14b01SJoseph Chen grp_test_id = TEST_ID_MISC; 13399d14b01SJoseph Chen else if (!strcmp(argv[0], "net")) 13499d14b01SJoseph Chen grp_test_id = TEST_ID_NET; 13599d14b01SJoseph Chen else if (!strcmp(argv[0], "display")) 13699d14b01SJoseph Chen grp_test_id = TEST_ID_DISPLAY; 13799d14b01SJoseph Chen 13899d14b01SJoseph Chen if (grp_test_id != TEST_ID_UNK) { 13999d14b01SJoseph Chen skip_mode = TEST_SKIP_NORETURN; /* Skip noreturn item */ 14099d14b01SJoseph Chen goto all_test; 14199d14b01SJoseph Chen } 1421dc7864bSJoseph Chen } 1431dc7864bSJoseph Chen 14499d14b01SJoseph Chen /* item_test: */ 14599d14b01SJoseph Chen for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) { 14699d14b01SJoseph Chen cp = find_cmd_tbl(argv[0], 14799d14b01SJoseph Chen cmd_groups[i]->cmd, 14899d14b01SJoseph Chen cmd_groups[i]->cmd_n); 14999d14b01SJoseph Chen if (cp) { 15099d14b01SJoseph Chen ret = cp->cmd(cmdtp, flag, argc, argv); 15199d14b01SJoseph Chen printf("\n### [%s] test done, result: <%s>..\n", 15299d14b01SJoseph Chen cp->name, ret ? "FAILED" : "OKAY"); 1531dc7864bSJoseph Chen 15499d14b01SJoseph Chen return ret; 15599d14b01SJoseph Chen } 15699d14b01SJoseph Chen } 15735573213SJoseph Chen 15899d14b01SJoseph Chen printf("Unknown cmd: rktest %s (Not enabled ?)\n", argv[0]); 15999d14b01SJoseph Chen goto finish; 16035573213SJoseph Chen 16199d14b01SJoseph Chen all_test: 1622a77afceSKever Yang lava_info("<LAVA_SIGNAL_STARTRUN u-boot-function 0>\n"); 1631dc7864bSJoseph Chen ms_start = get_timer(0); 16499d14b01SJoseph Chen for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) { 16599d14b01SJoseph Chen /* 16699d14b01SJoseph Chen * If 'grp_test_id != TEST_ID_UNK', now is group test, find 16799d14b01SJoseph Chen * the grp cmd. 16899d14b01SJoseph Chen */ 16999d14b01SJoseph Chen if (grp_test_id != TEST_ID_UNK && 17099d14b01SJoseph Chen grp_test_id != cmd_groups[i]->id) 17199d14b01SJoseph Chen continue; 1721dc7864bSJoseph Chen 17399d14b01SJoseph Chen /* Run all commands in 'this' grp */ 17499d14b01SJoseph Chen for (j = 0, cp = cmd_groups[i]->cmd; 17599d14b01SJoseph Chen j < cmd_groups[i]->cmd_n; 17699d14b01SJoseph Chen j++, cp++) { 17799d14b01SJoseph Chen /* Skip this ignored cmd */ 17899d14b01SJoseph Chen if (skip_this_cmd(cp, skip_mode)) { 17999d14b01SJoseph Chen printf("### Skip [%s]\n", cp->name); 1802a77afceSKever Yang lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=skip>\n", cp->name); 18199d14b01SJoseph Chen continue; 18299d14b01SJoseph Chen } 18399d14b01SJoseph Chen 18499d14b01SJoseph Chen printf("### Start [%s]\n", cp->name); 185*54108d04SKever Yang #ifdef CONFIG_RKIMG_BOOTLOADER 18699d14b01SJoseph Chen /* Flush console */ 18799d14b01SJoseph Chen if (cmd_groups[i]->id == TEST_ID_DOWNLOAD) 18899d14b01SJoseph Chen flushc(); 189*54108d04SKever Yang #endif 19099d14b01SJoseph Chen /* Execute command */ 19199d14b01SJoseph Chen ret = cp->cmd(cmdtp, flag, argc, argv); 1922a77afceSKever Yang if (ret) { 1932a77afceSKever Yang lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=fail>\n", cp->name); 19499d14b01SJoseph Chen fail++; 1952a77afceSKever Yang } else { 1962a77afceSKever Yang lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=pass>\n", cp->name); 19799d14b01SJoseph Chen okay++; 1982a77afceSKever Yang } 19999d14b01SJoseph Chen 20099d14b01SJoseph Chen /* Result */ 20199d14b01SJoseph Chen printf("### Finish, result: <%s>\n\n", 20299d14b01SJoseph Chen ret ? "FAILED" : "PASS"); 20399d14b01SJoseph Chen 20499d14b01SJoseph Chen if (ctrlc()) { 20599d14b01SJoseph Chen printf("Exit board test by ctrl+c\n"); 20699d14b01SJoseph Chen break; 20799d14b01SJoseph Chen } 20899d14b01SJoseph Chen } 20999d14b01SJoseph Chen } 21099d14b01SJoseph Chen 21199d14b01SJoseph Chen /* Total time and report */ 2121dc7864bSJoseph Chen ms = get_timer(ms_start); 2131dc7864bSJoseph Chen if (ms >= 1000) { 2141dc7864bSJoseph Chen sec = ms / 1000; 2151dc7864bSJoseph Chen ms = ms % 1000; 2161dc7864bSJoseph Chen } 21799d14b01SJoseph Chen printf("[=== SUM: pass: %d; failed: %d; total: %lu.%lus ===]\n\n\n", 21899d14b01SJoseph Chen okay, fail, sec, ms); 2192a77afceSKever Yang /* 2202a77afceSKever Yang * LAVA result with meansure data 2212a77afceSKever Yang * lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=dd-write-mean RESULT=pass UNITS=MB/s MEASUREMENT=37.42>"); 2222a77afceSKever Yang */ 2232a77afceSKever Yang lava_info("<LAVA_SIGNAL_ENDRUN u-boot-function 0>\n"); 2242a77afceSKever Yang lava_info("<LAVA_TEST_RUNNER>: exiting u-boot-function\n"); 22535573213SJoseph Chen 22699d14b01SJoseph Chen finish: 2271dc7864bSJoseph Chen return 0; 2281dc7864bSJoseph Chen } 2291dc7864bSJoseph Chen 2301dc7864bSJoseph Chen U_BOOT_CMD( 2311dc7864bSJoseph Chen rktest, 10, 0, do_rockchip_test, 23299d14b01SJoseph Chen "Rockchip board modules test", 23399d14b01SJoseph Chen NULL 2341dc7864bSJoseph Chen ); 235