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