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_download; 13 #ifdef CONFIG_RKIMG_BOOTLOADER 14 extern struct cmd_group cmd_grp_display; 15 extern struct cmd_group cmd_grp_misc; 16 #endif 17 extern struct cmd_group cmd_grp_net; 18 extern struct cmd_group cmd_grp_power; 19 extern struct cmd_group cmd_grp_storage; 20 21 enum { 22 TEST_SKIP_UNK, 23 TEST_SKIP_NORETURN, 24 TEST_SKIP_INTERACTIVE, 25 TEST_SKIP_NORETURN_INTERACTIVE, 26 TEST_SKIP_MAX, 27 }; 28 29 static const char *cmd_grp_name[] = { 30 [TEST_ID_UNK] = "UNK", 31 [TEST_ID_BOOT] = "BOOT", 32 [TEST_ID_DISPLAY] = "DISPLAY", 33 [TEST_ID_DOWNLOAD] = "DOWNLOAD", 34 [TEST_ID_MISC] = "MISC", 35 [TEST_ID_NET] = "NET", 36 [TEST_ID_POWER] = "POWER", 37 [TEST_ID_STORAGE] = "STORAGE", 38 [TEST_ID_USB] = "USB", 39 [TEST_ID_MAX] = "MAX", 40 }; 41 42 static const struct cmd_group *cmd_groups[] = { 43 &cmd_grp_download, 44 &cmd_grp_boot, 45 &cmd_grp_storage, 46 &cmd_grp_power, 47 &cmd_grp_net, 48 #ifdef CONFIG_RKIMG_BOOTLOADER 49 &cmd_grp_misc, 50 &cmd_grp_display, 51 #endif 52 }; 53 54 static int cmd_groups_help(void) 55 { 56 int i; 57 58 printf("* Test Case:\n"); 59 printf(" -.: normal item\n"); 60 printf(" -n: noturen item\n"); 61 printf(" -i: interactive item\n\n"); 62 63 printf("* ALL:\n"); 64 printf(" [.] rktest all - test all\n"); 65 printf(" [.] rktest all v1 - test all, ignore noreturn items\n"); 66 printf(" [.] rktest all v2 - test all, ignore interactive items\n"); 67 printf(" [.] rktest all v3 - test all, ignore interactive and noreturn items\n"); 68 printf(" [.] rktest storage - test all storage\n"); 69 printf(" [.] rktest power - test all power\n"); 70 printf(" [.] rktest misc - test all misc\n"); 71 printf(" [.] rktest net - test all net\n"); 72 printf(" [.] rktest display - test all display\n"); 73 74 for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) { 75 printf("* %s:\n", cmd_grp_name[cmd_groups[i]->id]); 76 printf("%s", cmd_groups[i]->help); 77 } 78 79 return 0; 80 } 81 82 static int skip_this_cmd(cmd_tbl_t *cp, int skip_mode) 83 { 84 bool is_interactive = CMD_FLG_ENABLED(cp, CMD_FLG_INTERACTIVE); 85 bool is_noreturn = CMD_FLG_ENABLED(cp, CMD_FLG_NORETURN); 86 87 switch (skip_mode) { 88 case TEST_SKIP_NORETURN: 89 return is_noreturn; 90 case TEST_SKIP_INTERACTIVE: 91 return is_interactive; 92 case TEST_SKIP_NORETURN_INTERACTIVE: 93 return is_noreturn || is_interactive; 94 } 95 96 return 0; 97 } 98 static int do_rockchip_test(cmd_tbl_t *cmdtp, int flag, 99 int argc, char *const argv[]) 100 { 101 ulong ms_start = 0, ms = 0, sec = 0; 102 int grp_test_id = TEST_ID_UNK; 103 int okay = 0, fail = 0; 104 int ret, i, j; 105 int skip_mode = 0; 106 cmd_tbl_t *cp; 107 108 if (argc == 1) 109 return cmd_groups_help(); 110 111 /* Drop initial "rktest" arg */ 112 argc--; 113 argv++; 114 115 if (!strcmp(argv[0], "all")) { 116 /* Test all skip_mode: v1, v2, v3... */ 117 if (argv[1]) { 118 if (!strcmp(argv[1], CMD_MODE_V1)) 119 skip_mode = TEST_SKIP_NORETURN; 120 else if (!strcmp(argv[1], CMD_MODE_V2)) 121 skip_mode = TEST_SKIP_INTERACTIVE; 122 else if (!strcmp(argv[1], CMD_MODE_V3)) 123 skip_mode = TEST_SKIP_NORETURN_INTERACTIVE; 124 } 125 /* rktest all has no valid parameter */ 126 argc = 1; 127 goto all_test; 128 } else { 129 if (!strcmp(argv[0], "storage")) 130 grp_test_id = TEST_ID_STORAGE; 131 else if (!strcmp(argv[0], "power")) 132 grp_test_id = TEST_ID_POWER; 133 else if (!strcmp(argv[0], "misc")) 134 grp_test_id = TEST_ID_MISC; 135 else if (!strcmp(argv[0], "net")) 136 grp_test_id = TEST_ID_NET; 137 else if (!strcmp(argv[0], "display")) 138 grp_test_id = TEST_ID_DISPLAY; 139 140 if (grp_test_id != TEST_ID_UNK) { 141 skip_mode = TEST_SKIP_NORETURN; /* Skip noreturn item */ 142 goto all_test; 143 } 144 } 145 146 /* item_test: */ 147 for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) { 148 cp = find_cmd_tbl(argv[0], 149 cmd_groups[i]->cmd, 150 cmd_groups[i]->cmd_n); 151 if (cp) { 152 ret = cp->cmd(cmdtp, flag, argc, argv); 153 printf("\n### [%s] test done, result: <%s>..\n", 154 cp->name, ret ? "FAILED" : "OKAY"); 155 156 return ret; 157 } 158 } 159 160 printf("Unknown cmd: rktest %s (Not enabled ?)\n", argv[0]); 161 goto finish; 162 163 all_test: 164 lava_info("<LAVA_SIGNAL_STARTRUN u-boot-function 0>\n"); 165 ms_start = get_timer(0); 166 for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) { 167 /* 168 * If 'grp_test_id != TEST_ID_UNK', now is group test, find 169 * the grp cmd. 170 */ 171 if (grp_test_id != TEST_ID_UNK && 172 grp_test_id != cmd_groups[i]->id) 173 continue; 174 175 /* Run all commands in 'this' grp */ 176 for (j = 0, cp = cmd_groups[i]->cmd; 177 j < cmd_groups[i]->cmd_n; 178 j++, cp++) { 179 /* Skip this ignored cmd */ 180 if (skip_this_cmd(cp, skip_mode)) { 181 printf("### Skip [%s]\n", cp->name); 182 lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=skip>\n", cp->name); 183 continue; 184 } 185 186 printf("### Start [%s]\n", cp->name); 187 #ifdef CONFIG_RKIMG_BOOTLOADER 188 /* Flush console */ 189 if (cmd_groups[i]->id == TEST_ID_DOWNLOAD) 190 flushc(); 191 #endif 192 /* Execute command */ 193 ret = cp->cmd(cmdtp, flag, argc, argv); 194 if (ret) { 195 lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=fail>\n", cp->name); 196 fail++; 197 } else { 198 lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=pass>\n", cp->name); 199 okay++; 200 } 201 202 /* Result */ 203 printf("### Finish, result: <%s>\n\n", 204 ret ? "FAILED" : "PASS"); 205 206 if (ctrlc()) { 207 printf("Exit board test by ctrl+c\n"); 208 break; 209 } 210 } 211 } 212 213 /* Total time and report */ 214 ms = get_timer(ms_start); 215 if (ms >= 1000) { 216 sec = ms / 1000; 217 ms = ms % 1000; 218 } 219 printf("[=== SUM: pass: %d; failed: %d; total: %lu.%lus ===]\n\n\n", 220 okay, fail, sec, ms); 221 /* 222 * LAVA result with meansure data 223 * lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=dd-write-mean RESULT=pass UNITS=MB/s MEASUREMENT=37.42>"); 224 */ 225 lava_info("<LAVA_SIGNAL_ENDRUN u-boot-function 0>\n"); 226 lava_info("<LAVA_TEST_RUNNER>: exiting u-boot-function\n"); 227 228 finish: 229 return 0; 230 } 231 232 U_BOOT_CMD( 233 rktest, 10, 0, do_rockchip_test, 234 "Rockchip board modules test", 235 NULL 236 ); 237