android13/u-boot/test/rockchip/test-rockchip.c

237 lines
5.9 KiB
C

/*
* (C) Copyright 2017 Rockchip Electronics Co., Ltd
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <console.h>
#include "test-rockchip.h"
extern struct cmd_group cmd_grp_boot;
extern struct cmd_group cmd_grp_download;
#ifdef CONFIG_RKIMG_BOOTLOADER
extern struct cmd_group cmd_grp_display;
extern struct cmd_group cmd_grp_misc;
#endif
extern struct cmd_group cmd_grp_net;
extern struct cmd_group cmd_grp_power;
extern struct cmd_group cmd_grp_storage;
enum {
TEST_SKIP_UNK,
TEST_SKIP_NORETURN,
TEST_SKIP_INTERACTIVE,
TEST_SKIP_NORETURN_INTERACTIVE,
TEST_SKIP_MAX,
};
static const char *cmd_grp_name[] = {
[TEST_ID_UNK] = "UNK",
[TEST_ID_BOOT] = "BOOT",
[TEST_ID_DISPLAY] = "DISPLAY",
[TEST_ID_DOWNLOAD] = "DOWNLOAD",
[TEST_ID_MISC] = "MISC",
[TEST_ID_NET] = "NET",
[TEST_ID_POWER] = "POWER",
[TEST_ID_STORAGE] = "STORAGE",
[TEST_ID_USB] = "USB",
[TEST_ID_MAX] = "MAX",
};
static const struct cmd_group *cmd_groups[] = {
&cmd_grp_download,
&cmd_grp_boot,
&cmd_grp_storage,
&cmd_grp_power,
&cmd_grp_net,
#ifdef CONFIG_RKIMG_BOOTLOADER
&cmd_grp_misc,
&cmd_grp_display,
#endif
};
static int cmd_groups_help(void)
{
int i;
printf("* Test Case:\n");
printf(" -.: normal item\n");
printf(" -n: noreturn item\n");
printf(" -i: interactive item\n\n");
printf("* ALL:\n");
printf(" [.] rktest all - test all\n");
printf(" [.] rktest all v1 - test all, ignore noreturn items\n");
printf(" [.] rktest all v2 - test all, ignore interactive items\n");
printf(" [.] rktest all v3 - test all, ignore interactive and noreturn items\n");
printf(" [.] rktest storage - test all storage\n");
printf(" [.] rktest power - test all power\n");
printf(" [.] rktest misc - test all misc\n");
printf(" [.] rktest net - test all net\n");
printf(" [.] rktest display - test all display\n");
for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) {
printf("* %s:\n", cmd_grp_name[cmd_groups[i]->id]);
printf("%s", cmd_groups[i]->help);
}
return 0;
}
static int skip_this_cmd(cmd_tbl_t *cp, int skip_mode)
{
bool is_interactive = CMD_FLG_ENABLED(cp, CMD_FLG_INTERACTIVE);
bool is_noreturn = CMD_FLG_ENABLED(cp, CMD_FLG_NORETURN);
switch (skip_mode) {
case TEST_SKIP_NORETURN:
return is_noreturn;
case TEST_SKIP_INTERACTIVE:
return is_interactive;
case TEST_SKIP_NORETURN_INTERACTIVE:
return is_noreturn || is_interactive;
}
return 0;
}
static int do_rockchip_test(cmd_tbl_t *cmdtp, int flag,
int argc, char *const argv[])
{
ulong ms_start = 0, ms = 0, sec = 0;
int grp_test_id = TEST_ID_UNK;
int okay = 0, fail = 0;
int ret, i, j;
int skip_mode = 0;
cmd_tbl_t *cp;
if (argc == 1)
return cmd_groups_help();
/* Drop initial "rktest" arg */
argc--;
argv++;
if (!strcmp(argv[0], "all")) {
/* Test all skip_mode: v1, v2, v3... */
if (argv[1]) {
if (!strcmp(argv[1], CMD_MODE_V1))
skip_mode = TEST_SKIP_NORETURN;
else if (!strcmp(argv[1], CMD_MODE_V2))
skip_mode = TEST_SKIP_INTERACTIVE;
else if (!strcmp(argv[1], CMD_MODE_V3))
skip_mode = TEST_SKIP_NORETURN_INTERACTIVE;
}
/* rktest all has no valid parameter */
argc = 1;
goto all_test;
} else {
if (!strcmp(argv[0], "storage"))
grp_test_id = TEST_ID_STORAGE;
else if (!strcmp(argv[0], "power"))
grp_test_id = TEST_ID_POWER;
else if (!strcmp(argv[0], "misc"))
grp_test_id = TEST_ID_MISC;
else if (!strcmp(argv[0], "net"))
grp_test_id = TEST_ID_NET;
else if (!strcmp(argv[0], "display"))
grp_test_id = TEST_ID_DISPLAY;
if (grp_test_id != TEST_ID_UNK) {
skip_mode = TEST_SKIP_NORETURN; /* Skip noreturn item */
goto all_test;
}
}
/* item_test: */
for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) {
cp = find_cmd_tbl(argv[0],
cmd_groups[i]->cmd,
cmd_groups[i]->cmd_n);
if (cp) {
ret = cp->cmd(cmdtp, flag, argc, argv);
printf("\n### [%s] test done, result: <%s>..\n",
cp->name, ret ? "FAILED" : "OKAY");
return ret;
}
}
printf("Unknown cmd: rktest %s (Not enabled ?)\n", argv[0]);
goto finish;
all_test:
lava_info("<LAVA_SIGNAL_STARTRUN u-boot-function 0>\n");
ms_start = get_timer(0);
for (i = 0; i < ARRAY_SIZE(cmd_groups); i++) {
/*
* If 'grp_test_id != TEST_ID_UNK', now is group test, find
* the grp cmd.
*/
if (grp_test_id != TEST_ID_UNK &&
grp_test_id != cmd_groups[i]->id)
continue;
/* Run all commands in 'this' grp */
for (j = 0, cp = cmd_groups[i]->cmd;
j < cmd_groups[i]->cmd_n;
j++, cp++) {
/* Skip this ignored cmd */
if (skip_this_cmd(cp, skip_mode)) {
printf("### Skip [%s]\n", cp->name);
lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=skip>\n", cp->name);
continue;
}
printf("### Start [%s]\n", cp->name);
#ifdef CONFIG_RKIMG_BOOTLOADER
/* Flush console */
if (cmd_groups[i]->id == TEST_ID_DOWNLOAD)
flushc();
#endif
/* Execute command */
ret = cp->cmd(cmdtp, flag, argc, argv);
if (ret) {
lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=fail>\n", cp->name);
fail++;
} else {
lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=pass>\n", cp->name);
okay++;
}
/* Result */
printf("### Finish, result: <%s>\n\n",
ret ? "FAILED" : "PASS");
if (ctrlc()) {
printf("Exit board test by ctrl+c\n");
break;
}
}
}
/* Total time and report */
ms = get_timer(ms_start);
if (ms >= 1000) {
sec = ms / 1000;
ms = ms % 1000;
}
printf("[=== SUM: pass: %d; failed: %d; total: %lu.%lus ===]\n\n\n",
okay, fail, sec, ms);
/*
* LAVA result with meansure data
* lava_info("<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=dd-write-mean RESULT=pass UNITS=MB/s MEASUREMENT=37.42>");
*/
lava_info("<LAVA_SIGNAL_ENDRUN u-boot-function 0>\n");
lava_info("<LAVA_TEST_RUNNER>: exiting u-boot-function\n");
finish:
return 0;
}
U_BOOT_CMD(
rktest, 10, 0, do_rockchip_test,
"Rockchip board modules test",
NULL
);