11dc7864bSJoseph Chen /* 21dc7864bSJoseph Chen * (C) Copyright 2017 Rockchip Electronics Co., Ltd 31dc7864bSJoseph Chen * 41dc7864bSJoseph Chen * SPDX-License-Identifier: GPL-2.0+ 51dc7864bSJoseph Chen */ 61dc7864bSJoseph Chen 71dc7864bSJoseph Chen #include <common.h> 81dc7864bSJoseph Chen #include <command.h> 91dc7864bSJoseph Chen #include "test-rockchip.h" 101dc7864bSJoseph Chen 111dc7864bSJoseph Chen typedef struct board_module { 121dc7864bSJoseph Chen char *name; 13*1e7c429dSJoseph Chen char *desc; 141dc7864bSJoseph Chen int (*test)(int argc, char * const argv[]); 151dc7864bSJoseph Chen } board_module_t; 161dc7864bSJoseph Chen 171dc7864bSJoseph Chen static board_module_t g_board_modules[] = { 18dbe1e39cSJoseph Chen #if defined(CONFIG_IRQ) 19*1e7c429dSJoseph Chen { 20*1e7c429dSJoseph Chen .name = "timer", 21*1e7c429dSJoseph Chen .desc = "test timer and interrupt", 22*1e7c429dSJoseph Chen .test = board_timer_test 23*1e7c429dSJoseph Chen }, 24dbe1e39cSJoseph Chen #endif 25*1e7c429dSJoseph Chen { 26*1e7c429dSJoseph Chen .name = "brom", 27*1e7c429dSJoseph Chen .desc = "enter bootrom download mode", 28*1e7c429dSJoseph Chen .test = board_brom_dnl_test 29*1e7c429dSJoseph Chen }, 30b40c07fcSJoseph Chen 31b40c07fcSJoseph Chen #if defined(CONFIG_DM_KEY) 32*1e7c429dSJoseph Chen { 33*1e7c429dSJoseph Chen .name = "key", 34*1e7c429dSJoseph Chen .desc = "test board keys", 35*1e7c429dSJoseph Chen .test = board_key_test 36*1e7c429dSJoseph Chen }, 37b40c07fcSJoseph Chen #endif 38b40c07fcSJoseph Chen #if defined(CONFIG_MMC) 39*1e7c429dSJoseph Chen { 40*1e7c429dSJoseph Chen .name = "emmc", 41*1e7c429dSJoseph Chen .desc = "test emmc read/write speed", 42*1e7c429dSJoseph Chen .test = board_emmc_test 43*1e7c429dSJoseph Chen }, 44b40c07fcSJoseph Chen #endif 45b40c07fcSJoseph Chen #if defined(CONFIG_RKNAND) 46*1e7c429dSJoseph Chen { 47*1e7c429dSJoseph Chen .name = "rknand", 48*1e7c429dSJoseph Chen .desc = "test rknand read/write speed", 49*1e7c429dSJoseph Chen .test = board_rknand_test 50*1e7c429dSJoseph Chen }, 51*1e7c429dSJoseph Chen #endif 52*1e7c429dSJoseph Chen 53*1e7c429dSJoseph Chen #if defined(CONFIG_DM_REGULATOR) 54*1e7c429dSJoseph Chen { 55*1e7c429dSJoseph Chen .name = "regulator", 56*1e7c429dSJoseph Chen .desc = "test regulator volatge set and show regulator status", 57*1e7c429dSJoseph Chen .test = board_regulator_test 58*1e7c429dSJoseph Chen }, 59b40c07fcSJoseph Chen #endif 60e630a69bSDavid Wu #if defined(CONFIG_GMAC_ROCKCHIP) 61*1e7c429dSJoseph Chen { 62*1e7c429dSJoseph Chen .name = "eth", 63*1e7c429dSJoseph Chen .desc = "test ethernet", 64*1e7c429dSJoseph Chen .test = board_eth_test 65*1e7c429dSJoseph Chen }, 66e630a69bSDavid Wu #endif 6708af5e36SZhangbin Tong #if defined(CONFIG_RK_IR) 68*1e7c429dSJoseph Chen { 69*1e7c429dSJoseph Chen .name = "ir", 70*1e7c429dSJoseph Chen .desc = "test pwm ir remoter for box product", 71*1e7c429dSJoseph Chen .test = board_ir_test 72*1e7c429dSJoseph Chen }, 7308af5e36SZhangbin Tong #endif 7444e08075SJoseph Chen #if defined(CONFIG_ROCKCHIP_VENDOR_PARTITION) 75*1e7c429dSJoseph Chen { 76*1e7c429dSJoseph Chen .name = "vendor", 77*1e7c429dSJoseph Chen .desc = "test vendor storage partition read/write", 78*1e7c429dSJoseph Chen .test = board_vendor_storage_test 79*1e7c429dSJoseph Chen }, 8044e08075SJoseph Chen #endif 811dc7864bSJoseph Chen }; 821dc7864bSJoseph Chen 83336e1992SJoseph Chen static void help(void) 84336e1992SJoseph Chen { 85*1e7c429dSJoseph Chen int i; 86*1e7c429dSJoseph Chen 87*1e7c429dSJoseph Chen printf("Command: rktest [module] [args...]\n" 88b40c07fcSJoseph Chen " - module: timer|key|emmc|rknand|regulator|eth|ir|brom|vendor\n" 89*1e7c429dSJoseph Chen " - args: depends on module, try 'rktest [module]' for test or more help\n\n"); 90*1e7c429dSJoseph Chen 91*1e7c429dSJoseph Chen printf(" - Enabled modules:\n"); 92*1e7c429dSJoseph Chen for (i = 0; i < ARRAY_SIZE(g_board_modules); i++) 93*1e7c429dSJoseph Chen printf(" - %10s%s %s\n", 94*1e7c429dSJoseph Chen g_board_modules[i].name, 95*1e7c429dSJoseph Chen g_board_modules[i].desc ? ":" : "", 96*1e7c429dSJoseph Chen g_board_modules[i].desc ? g_board_modules[i].desc : ""); 97336e1992SJoseph Chen } 98336e1992SJoseph Chen 991dc7864bSJoseph Chen static int do_rockchip_test(cmd_tbl_t *cmdtp, int flag, 1001dc7864bSJoseph Chen int argc, char * const argv[]) 1011dc7864bSJoseph Chen { 1021dc7864bSJoseph Chen ulong ms_start = 0, ms = 0, sec = 0; 1031dc7864bSJoseph Chen board_module_t *module = NULL; 1041dc7864bSJoseph Chen char *module_name = NULL; 1051dc7864bSJoseph Chen int index = 0, err = 0; 10635573213SJoseph Chen bool found = false; 1071dc7864bSJoseph Chen 1081dc7864bSJoseph Chen if (argc >= 2) { 1091dc7864bSJoseph Chen module_name = argv[1]; 1101dc7864bSJoseph Chen } else { 111336e1992SJoseph Chen help(); 1121dc7864bSJoseph Chen return 0; 1131dc7864bSJoseph Chen } 1141dc7864bSJoseph Chen 1151dc7864bSJoseph Chen if (!module_name) 1161dc7864bSJoseph Chen return 0; 1171dc7864bSJoseph Chen 1181dc7864bSJoseph Chen for (index = 0; index < ARRAY_SIZE(g_board_modules); index++) { 1191dc7864bSJoseph Chen module = &g_board_modules[index]; 1201dc7864bSJoseph Chen if (module && !strcmp(module->name, module_name)) { 12135573213SJoseph Chen found = true; 12235573213SJoseph Chen 12335573213SJoseph Chen printf("***********************************************************\n"); 12435573213SJoseph Chen printf("Rockchip Board Module [%s] Test start.\n", module_name); 12535573213SJoseph Chen printf("***********************************************************\n"); 12635573213SJoseph Chen 1271dc7864bSJoseph Chen ms_start = get_timer(0); 1281dc7864bSJoseph Chen 1291dc7864bSJoseph Chen err = module->test(argc, argv); 1301dc7864bSJoseph Chen 1311dc7864bSJoseph Chen ms = get_timer(ms_start); 1321dc7864bSJoseph Chen if (ms >= 1000) { 1331dc7864bSJoseph Chen sec = ms / 1000; 1341dc7864bSJoseph Chen ms = ms % 1000; 1351dc7864bSJoseph Chen } 1361dc7864bSJoseph Chen 1371dc7864bSJoseph Chen printf("-----------------------------------------------------------\n"); 1381dc7864bSJoseph Chen printf("Rockchip Board Module [%s] Test end <%s>.. Total: %lu.%lus\n", 1391dc7864bSJoseph Chen module->name, err ? "FAILED" : "PASS", sec, ms); 1401dc7864bSJoseph Chen printf("-----------------------------------------------------------\n\n\n"); 14135573213SJoseph Chen } 14235573213SJoseph Chen } 14335573213SJoseph Chen 14435573213SJoseph Chen if (!found) 14535573213SJoseph Chen printf("Rockchip Board Module [%s] is not support !\n", 14635573213SJoseph Chen module_name); 1471dc7864bSJoseph Chen 1481dc7864bSJoseph Chen return 0; 1491dc7864bSJoseph Chen } 1501dc7864bSJoseph Chen 1511dc7864bSJoseph Chen U_BOOT_CMD( 1521dc7864bSJoseph Chen rktest, 10, 0, do_rockchip_test, 1531dc7864bSJoseph Chen "Rockchip Board Module Test", 1541dc7864bSJoseph Chen "" 1551dc7864bSJoseph Chen ); 156