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 goto all_test; 126 } else { 127 if (!strcmp(argv[0], "storage")) 128 grp_test_id = TEST_ID_STORAGE; 129 else if (!strcmp(argv[0], "power")) 130 grp_test_id = TEST_ID_POWER; 131 else if (!strcmp(argv[0], "misc")) 132 grp_test_id = TEST_ID_MISC; 133 else if (!strcmp(argv[0], "net")) 134 grp_test_id = TEST_ID_NET; 135 else if (!strcmp(argv[0], "display")) 136 grp_test_id = TEST_ID_DISPLAY; 137 138 if (grp_test_id != TEST_ID_UNK) { 139 skip_mode = TEST_SKIP_NORETURN; /* Skip noreturn item */ 140 goto all_test; 141 } 142 } 143 144 /* item_test: */ 145 for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) { 146 cp = find_cmd_tbl(argv[0], 147 cmd_groups[i]->cmd, 148 cmd_groups[i]->cmd_n); 149 if (cp) { 150 ret = cp->cmd(cmdtp, flag, argc, argv); 151 printf("\n### [%s] test done, result: <%s>..\n", 152 cp->name, ret ? "FAILED" : "OKAY"); 153 154 return ret; 155 } 156 } 157 158 printf("Unknown cmd: rktest %s (Not enabled ?)\n", argv[0]); 159 goto finish; 160 161 all_test: 162 lava_info("<LAVA_SIGNAL_STARTRUN u-boot-function 0>\n"); 163 ms_start = get_timer(0); 164 for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) { 165 /* 166 * If 'grp_test_id != TEST_ID_UNK', now is group test, find 167 * the grp cmd. 168 */ 169 if (grp_test_id != TEST_ID_UNK && 170 grp_test_id != cmd_groups[i]->id) 171 continue; 172 173 /* Run all commands in 'this' grp */ 174 for (j = 0, cp = cmd_groups[i]->cmd; 175 j < cmd_groups[i]->cmd_n; 176 j++, cp++) { 177 /* Skip this ignored cmd */ 178 if (skip_this_cmd(cp, skip_mode)) { 179 printf("### Skip [%s]\n", cp->name); 180 lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=skip>\n", cp->name); 181 continue; 182 } 183 184 printf("### Start [%s]\n", cp->name); 185 #ifdef CONFIG_RKIMG_BOOTLOADER 186 /* Flush console */ 187 if (cmd_groups[i]->id == TEST_ID_DOWNLOAD) 188 flushc(); 189 #endif 190 /* Execute command */ 191 ret = cp->cmd(cmdtp, flag, argc, argv); 192 if (ret) { 193 lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=fail>\n", cp->name); 194 fail++; 195 } else { 196 lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=pass>\n", cp->name); 197 okay++; 198 } 199 200 /* Result */ 201 printf("### Finish, result: <%s>\n\n", 202 ret ? "FAILED" : "PASS"); 203 204 if (ctrlc()) { 205 printf("Exit board test by ctrl+c\n"); 206 break; 207 } 208 } 209 } 210 211 /* Total time and report */ 212 ms = get_timer(ms_start); 213 if (ms >= 1000) { 214 sec = ms / 1000; 215 ms = ms % 1000; 216 } 217 printf("[=== SUM: pass: %d; failed: %d; total: %lu.%lus ===]\n\n\n", 218 okay, fail, sec, ms); 219 /* 220 * LAVA result with meansure data 221 * lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=dd-write-mean RESULT=pass UNITS=MB/s MEASUREMENT=37.42>"); 222 */ 223 lava_info("<LAVA_SIGNAL_ENDRUN u-boot-function 0>\n"); 224 lava_info("<LAVA_TEST_RUNNER>: exiting u-boot-function\n"); 225 226 finish: 227 return 0; 228 } 229 230 U_BOOT_CMD( 231 rktest, 10, 0, do_rockchip_test, 232 "Rockchip board modules test", 233 NULL 234 ); 235