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 ms_start = get_timer(0); 159 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 continue; 177 } 178 179 printf("### Start [%s]\n", cp->name); 180 181 /* Flush console */ 182 if (cmd_groups[i]->id == TEST_ID_DOWNLOAD) 183 flushc(); 184 185 /* Execute command */ 186 ret = cp->cmd(cmdtp, flag, argc, argv); 187 if (ret) 188 fail++; 189 else 190 okay++; 191 192 /* Result */ 193 printf("### Finish, result: <%s>\n\n", 194 ret ? "FAILED" : "PASS"); 195 196 if (ctrlc()) { 197 printf("Exit board test by ctrl+c\n"); 198 break; 199 } 200 } 201 } 202 203 /* Total time and report */ 204 ms = get_timer(ms_start); 205 if (ms >= 1000) { 206 sec = ms / 1000; 207 ms = ms % 1000; 208 } 209 210 printf("[=== SUM: pass: %d; failed: %d; total: %lu.%lus ===]\n\n\n", 211 okay, fail, sec, ms); 212 213 finish: 214 return 0; 215 } 216 217 U_BOOT_CMD( 218 rktest, 10, 0, do_rockchip_test, 219 "Rockchip board modules test", 220 NULL 221 ); 222