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 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 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 } 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