199d14b01SJoseph Chen /* 299d14b01SJoseph Chen * (C) Copyright 2019 Rockchip Electronics Co., Ltd 399d14b01SJoseph Chen * 499d14b01SJoseph Chen * SPDX-License-Identifier: GPL-2.0+ 599d14b01SJoseph Chen */ 699d14b01SJoseph Chen 799d14b01SJoseph Chen #include <common.h> 899d14b01SJoseph Chen #include <boot_rkimg.h> 999d14b01SJoseph Chen #include <cli.h> 1099d14b01SJoseph Chen #include <dm.h> 1199d14b01SJoseph Chen #include <environment.h> 1299d14b01SJoseph Chen #include <malloc.h> 1399d14b01SJoseph Chen #include <misc.h> 1499d14b01SJoseph Chen #include <sysmem.h> 1599d14b01SJoseph Chen #include <linux/ctype.h> 1699d14b01SJoseph Chen #include <asm/arch/vendor.h> 1799d14b01SJoseph Chen #include "test-rockchip.h" 1899d14b01SJoseph Chen 1999d14b01SJoseph Chen #define DEFAULT_STORAGE_RW_PART "userdata" 20*e80ec83dSKever Yang enum if_type blk_get_type_by_name(char* devtype) 21*e80ec83dSKever Yang { 22*e80ec83dSKever Yang int type = -1; 2399d14b01SJoseph Chen 24*e80ec83dSKever Yang if (!strcmp(devtype, "mmc")) 25*e80ec83dSKever Yang type = IF_TYPE_MMC; 26*e80ec83dSKever Yang else if (!strcmp(devtype, "rknand")) 27*e80ec83dSKever Yang type = IF_TYPE_RKNAND; 28*e80ec83dSKever Yang else if (!strcmp(devtype, "spinand")) 29*e80ec83dSKever Yang type = IF_TYPE_SPINAND; 30*e80ec83dSKever Yang else if (!strcmp(devtype, "spinor")) 31*e80ec83dSKever Yang type = IF_TYPE_SPINOR; 32*e80ec83dSKever Yang else if (!strcmp(devtype, "ramdisk")) 33*e80ec83dSKever Yang type = IF_TYPE_RAMDISK; 34*e80ec83dSKever Yang else if (!strcmp(devtype, "mtd")) 35*e80ec83dSKever Yang type = IF_TYPE_MTD; 36*e80ec83dSKever Yang else if (!strcmp(devtype, "usb")) 37*e80ec83dSKever Yang type = IF_TYPE_USB; 38*e80ec83dSKever Yang 39*e80ec83dSKever Yang return type; 40*e80ec83dSKever Yang } 41*e80ec83dSKever Yang 42*e80ec83dSKever Yang #if defined(CONFIG_MMC) || defined(CONFIG_RKNAND) || defined(CONFIG_BLK) || defined(CONFIG_USB_HOST) 4399d14b01SJoseph Chen static int do_test_storage(cmd_tbl_t *cmdtp, int flag, 4499d14b01SJoseph Chen int argc, char *const argv[], 4599d14b01SJoseph Chen const char *devtype, 4699d14b01SJoseph Chen const char *devnum, 4799d14b01SJoseph Chen const char *label) 4899d14b01SJoseph Chen { 4999d14b01SJoseph Chen struct blk_desc *dev_desc; 50474718ffSJoseph Chen disk_partition_t part; 5199d14b01SJoseph Chen u32 blocks, round, sector; 5299d14b01SJoseph Chen char *w_buf, *r_buf; 5399d14b01SJoseph Chen char cmd[64]; 5499d14b01SJoseph Chen int i, ret; 5599d14b01SJoseph Chen ulong ts; 5699d14b01SJoseph Chen 57*e80ec83dSKever Yang /* 1. Switch to device type/num */ 58*e80ec83dSKever Yang if (devtype && !strcmp(devtype, "usb")) { 59*e80ec83dSKever Yang if (run_command("usb start", 0)) { 60*e80ec83dSKever Yang printf("Switch to %s%s failed\n", devtype, devnum); 61*e80ec83dSKever Yang ret = -ENODEV; 62*e80ec83dSKever Yang goto err1; 63*e80ec83dSKever Yang } 64*e80ec83dSKever Yang } else if (devtype) { 65*e80ec83dSKever Yang snprintf(cmd, sizeof(cmd), "%s dev %s", devtype, devnum); 66*e80ec83dSKever Yang if (run_command(cmd, 0)) { 67*e80ec83dSKever Yang printf("Switch to %s%s failed\n", devtype, devnum); 68*e80ec83dSKever Yang ret = -ENODEV; 69*e80ec83dSKever Yang goto err1; 70*e80ec83dSKever Yang } 71*e80ec83dSKever Yang } 72*e80ec83dSKever Yang if (!devtype) { 73*e80ec83dSKever Yang /* For blk test only */ 7499d14b01SJoseph Chen dev_desc = rockchip_get_bootdev(); 75*e80ec83dSKever Yang } else { 76*e80ec83dSKever Yang int if_type; 77*e80ec83dSKever Yang int num = simple_strtoul(devnum, NULL, 10); 78*e80ec83dSKever Yang if_type = blk_get_type_by_name((char *)devtype); 79*e80ec83dSKever Yang dev_desc = blk_get_devnum_by_type(if_type, num); 80*e80ec83dSKever Yang } 8199d14b01SJoseph Chen if (!dev_desc) { 82443feaabSJoseph Chen ut_err("%s: failed to get blk desc\n", label); 8399d14b01SJoseph Chen return -ENODEV; 8499d14b01SJoseph Chen } 8599d14b01SJoseph Chen 86*e80ec83dSKever Yang /* 2. Get test partition */ 8799d14b01SJoseph Chen if (part_get_info_by_name(dev_desc, 8899d14b01SJoseph Chen DEFAULT_STORAGE_RW_PART, &part) < 0) { 89443feaabSJoseph Chen ut_err("%s: failed to find %s partition\n", label, 90443feaabSJoseph Chen DEFAULT_STORAGE_RW_PART); 9199d14b01SJoseph Chen return -EINVAL; 9299d14b01SJoseph Chen } 9399d14b01SJoseph Chen 9499d14b01SJoseph Chen /* 32MB */ 9599d14b01SJoseph Chen sector = part.start; 9699d14b01SJoseph Chen blocks = part.size > 0x10000 ? 0x10000 : part.size; 9799d14b01SJoseph Chen round = 4; 9899d14b01SJoseph Chen 9999d14b01SJoseph Chen /* Round up */ 10099d14b01SJoseph Chen if (blocks % 2) 10199d14b01SJoseph Chen blocks += 1; 10299d14b01SJoseph Chen 10399d14b01SJoseph Chen printf("%s RW sectors on %s 0x%08x - 0x%08x(size: %ld MiB) for %d round\n\n", 104474718ffSJoseph Chen label, DEFAULT_STORAGE_RW_PART, 10599d14b01SJoseph Chen sector, sector + blocks, 10699d14b01SJoseph Chen (blocks * dev_desc->blksz) >> 20, round); 10799d14b01SJoseph Chen 10899d14b01SJoseph Chen 10999d14b01SJoseph Chen /* 3. Prepare memory */ 11099d14b01SJoseph Chen w_buf = sysmem_alloc_by_name("storage_w", blocks * dev_desc->blksz); 11199d14b01SJoseph Chen if (!w_buf) { 112443feaabSJoseph Chen ut_err("%s: no sysmem for w_buf\n", label); 11399d14b01SJoseph Chen ret = -ENOMEM; 11499d14b01SJoseph Chen goto err1; 11599d14b01SJoseph Chen } 11699d14b01SJoseph Chen 11799d14b01SJoseph Chen r_buf = sysmem_alloc_by_name("storage_r", blocks * dev_desc->blksz); 11899d14b01SJoseph Chen if (!r_buf) { 119443feaabSJoseph Chen ut_err("%s: no sysmem for r_buf\n", label); 12099d14b01SJoseph Chen ret = -ENOMEM; 12199d14b01SJoseph Chen goto err2; 12299d14b01SJoseph Chen } 12399d14b01SJoseph Chen 12499d14b01SJoseph Chen for (i = 0; i < blocks * dev_desc->blksz; i++) { 12599d14b01SJoseph Chen w_buf[i] = i; 12699d14b01SJoseph Chen r_buf[i] = 0; 12799d14b01SJoseph Chen } 12899d14b01SJoseph Chen 12999d14b01SJoseph Chen /* 4. Write test */ 13099d14b01SJoseph Chen ts = get_timer(0); 13199d14b01SJoseph Chen if (devtype) { 13299d14b01SJoseph Chen snprintf(cmd, sizeof(cmd), "%s write 0x%x 0x%x 0x%x", 13399d14b01SJoseph Chen devtype, (u32)(ulong)w_buf, sector, blocks); 13499d14b01SJoseph Chen for (i = 0; i < round; i++) { 13599d14b01SJoseph Chen if (run_command(cmd, 0)) { 136443feaabSJoseph Chen ut_err("%s: failed to write @%d round\n", label, i); 13799d14b01SJoseph Chen ret = -EIO; 13899d14b01SJoseph Chen goto err3; 13999d14b01SJoseph Chen } 14099d14b01SJoseph Chen } 14199d14b01SJoseph Chen } else { 14299d14b01SJoseph Chen for (i = 0; i < round; i++) { 14399d14b01SJoseph Chen ret = blk_dwrite(dev_desc, sector, blocks, w_buf); 14499d14b01SJoseph Chen if (ret != blocks) { 145443feaabSJoseph Chen ut_err("%s: failed to write @%d round\n", label, i); 14699d14b01SJoseph Chen ret = -EIO; 14799d14b01SJoseph Chen goto err3; 14899d14b01SJoseph Chen } 14999d14b01SJoseph Chen } 15099d14b01SJoseph Chen } 15199d14b01SJoseph Chen 15299d14b01SJoseph Chen ts = get_timer(0) - ts; 15399d14b01SJoseph Chen printf("\n%s write: size %dMB, used %ldms, speed %ldMB/s\n", 15499d14b01SJoseph Chen label, blocks * round / 2048, ts, (blocks * round >> 1) / ts); 15599d14b01SJoseph Chen 15699d14b01SJoseph Chen /* 5. Read test */ 15799d14b01SJoseph Chen ts = get_timer(0); 15899d14b01SJoseph Chen if (devtype) { 15999d14b01SJoseph Chen snprintf(cmd, sizeof(cmd), "%s read 0x%x 0x%x 0x%x", 16099d14b01SJoseph Chen devtype, (u32)(ulong)r_buf, sector, blocks); 16199d14b01SJoseph Chen 16299d14b01SJoseph Chen for (i = 0; i < round; i++) { 16399d14b01SJoseph Chen if (run_command(cmd, 0)) { 164443feaabSJoseph Chen ut_err("%s: failed to read @%d round\n", label, i); 16599d14b01SJoseph Chen ret = -EIO; 16699d14b01SJoseph Chen goto err3; 16799d14b01SJoseph Chen } 16899d14b01SJoseph Chen } 16999d14b01SJoseph Chen } else { 17099d14b01SJoseph Chen for (i = 0; i < round; i++) { 17199d14b01SJoseph Chen ret = blk_dread(dev_desc, sector, blocks, r_buf); 17299d14b01SJoseph Chen if (ret != blocks) { 173443feaabSJoseph Chen ut_err("%s: failed to read @%d round\n", label, i); 17499d14b01SJoseph Chen ret = -EIO; 17599d14b01SJoseph Chen goto err3; 17699d14b01SJoseph Chen } 17799d14b01SJoseph Chen } 17899d14b01SJoseph Chen } 17999d14b01SJoseph Chen 18099d14b01SJoseph Chen ts = get_timer(0) - ts; 18199d14b01SJoseph Chen printf("\n%s read: size %dMB, used %ldms, speed %ldMB/s\n", 18299d14b01SJoseph Chen label, blocks * round / 2048, ts, (blocks * round >> 1) / ts); 18399d14b01SJoseph Chen 18499d14b01SJoseph Chen /* 6. Verify the context */ 18599d14b01SJoseph Chen for (i = 0; i < blocks * dev_desc->blksz; i++) { 18699d14b01SJoseph Chen if (w_buf[i] != r_buf[i]) { 187443feaabSJoseph Chen ut_err("%s: context compare error\n", label); 18899d14b01SJoseph Chen ret = -EINVAL; 18999d14b01SJoseph Chen goto err3; 19099d14b01SJoseph Chen } 19199d14b01SJoseph Chen } 19299d14b01SJoseph Chen 19399d14b01SJoseph Chen /* 7. Switch back to default system devnum */ 19499d14b01SJoseph Chen if (devtype && !strcmp(devtype, "mmc") && 19599d14b01SJoseph Chen strcmp(devnum, env_get("devnum"))) { 19699d14b01SJoseph Chen ret = run_command(cmd, 0); 19799d14b01SJoseph Chen if (ret) { 198443feaabSJoseph Chen ut_err("%s: failed to switch to mmc1\n", label); 19999d14b01SJoseph Chen ret = -ENODEV; 20099d14b01SJoseph Chen goto err3; 20199d14b01SJoseph Chen } 20299d14b01SJoseph Chen } 20399d14b01SJoseph Chen 20499d14b01SJoseph Chen ret = 0; 20599d14b01SJoseph Chen err3: 20699d14b01SJoseph Chen sysmem_free((phys_addr_t)r_buf); 20799d14b01SJoseph Chen err2: 20899d14b01SJoseph Chen sysmem_free((phys_addr_t)w_buf); 20999d14b01SJoseph Chen err1: 21099d14b01SJoseph Chen 21199d14b01SJoseph Chen return ret; 21299d14b01SJoseph Chen } 21399d14b01SJoseph Chen 21499d14b01SJoseph Chen #ifdef CONFIG_MMC 21599d14b01SJoseph Chen static int do_test_emmc(cmd_tbl_t *cmdtp, int flag, 21699d14b01SJoseph Chen int argc, char *const argv[]) 21799d14b01SJoseph Chen { 21899d14b01SJoseph Chen return do_test_storage(cmdtp, flag, argc, argv, "mmc", "0", "MMC0"); 21999d14b01SJoseph Chen } 22099d14b01SJoseph Chen 22199d14b01SJoseph Chen static int do_test_sdmmc(cmd_tbl_t *cmdtp, int flag, 22299d14b01SJoseph Chen int argc, char *const argv[]) 22399d14b01SJoseph Chen { 22499d14b01SJoseph Chen return do_test_storage(cmdtp, flag, argc, argv, "mmc", "1", "MMC1"); 22599d14b01SJoseph Chen } 22699d14b01SJoseph Chen #endif 22799d14b01SJoseph Chen 22899d14b01SJoseph Chen #ifdef CONFIG_RKNAND 22999d14b01SJoseph Chen static int do_test_rknand(cmd_tbl_t *cmdtp, int flag, 23099d14b01SJoseph Chen int argc, char *const argv[]) 23199d14b01SJoseph Chen { 23299d14b01SJoseph Chen return do_test_storage(cmdtp, flag, argc, argv, "rknand", "0", "RKNAND0"); 23399d14b01SJoseph Chen } 23499d14b01SJoseph Chen #endif 23599d14b01SJoseph Chen 23699d14b01SJoseph Chen static int do_test_blk(cmd_tbl_t *cmdtp, int flag, 23799d14b01SJoseph Chen int argc, char *const argv[]) 23899d14b01SJoseph Chen { 23999d14b01SJoseph Chen return do_test_storage(cmdtp, flag, argc, argv, NULL, NULL, "BLK"); 24099d14b01SJoseph Chen } 24199d14b01SJoseph Chen #endif/* defined(CONFIG_MMC) || defined(CONFIG_RKNAND) || defined(CONFIG_BLK) */ 24299d14b01SJoseph Chen 24399d14b01SJoseph Chen #if defined(CONFIG_OPTEE_CLIENT) && defined(CONFIG_MMC) 24499d14b01SJoseph Chen static int do_test_secure_storage(cmd_tbl_t *cmdtp, int flag, 24599d14b01SJoseph Chen int argc, char *const argv[]) 24699d14b01SJoseph Chen { 24799d14b01SJoseph Chen return run_command("mmc testsecurestorage", 0); 24899d14b01SJoseph Chen } 24999d14b01SJoseph Chen #endif 25099d14b01SJoseph Chen 25199d14b01SJoseph Chen #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) && \ 25299d14b01SJoseph Chen !defined(CONFIG_SPL_BUILD) 25399d14b01SJoseph Chen static int do_test_env(cmd_tbl_t *cmdtp, int flag, 25499d14b01SJoseph Chen int argc, char *const argv[]) 25599d14b01SJoseph Chen { 25699d14b01SJoseph Chen int ret; 25799d14b01SJoseph Chen 25899d14b01SJoseph Chen ret = env_save(); 259443feaabSJoseph Chen if (ret) { 260443feaabSJoseph Chen ut_err("env: failed to save, ret=%d\n", ret); 26199d14b01SJoseph Chen return ret; 262443feaabSJoseph Chen } 26399d14b01SJoseph Chen 26499d14b01SJoseph Chen return env_load(); 26599d14b01SJoseph Chen } 26699d14b01SJoseph Chen #endif 26799d14b01SJoseph Chen 26899d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 26999d14b01SJoseph Chen static int do_test_vendor(cmd_tbl_t *cmdtp, int flag, 27099d14b01SJoseph Chen int argc, char *const argv[]) 27199d14b01SJoseph Chen { 27299d14b01SJoseph Chen return vendor_storage_test(); 27399d14b01SJoseph Chen } 27499d14b01SJoseph Chen #endif 27599d14b01SJoseph Chen 27699d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_EFUSE 27799d14b01SJoseph Chen static int do_test_efuse(cmd_tbl_t *cmdtp, int flag, 27899d14b01SJoseph Chen int argc, char *const argv[]) 27999d14b01SJoseph Chen { 28099d14b01SJoseph Chen struct udevice *dev; 28199d14b01SJoseph Chen u8 fuses[128] = {0}; 28299d14b01SJoseph Chen int ret; 28399d14b01SJoseph Chen 28499d14b01SJoseph Chen ret = uclass_get_device(UCLASS_MISC, 0, &dev); 28599d14b01SJoseph Chen if (ret) { 286443feaabSJoseph Chen ut_err("efuse: failed to get device, ret=%d\n", ret); 28799d14b01SJoseph Chen return 0; 28899d14b01SJoseph Chen } 28999d14b01SJoseph Chen 29099d14b01SJoseph Chen ret = misc_read(dev, 0, &fuses, sizeof(fuses)); 29199d14b01SJoseph Chen if (ret) { 292443feaabSJoseph Chen ut_err("efuse: failed to read, ret=%d\n", ret); 29399d14b01SJoseph Chen return 0; 29499d14b01SJoseph Chen } 29599d14b01SJoseph Chen 29699d14b01SJoseph Chen printf("Efuse-content:\n"); 29799d14b01SJoseph Chen print_buffer(0, fuses, 1, 128, 16); 29899d14b01SJoseph Chen 29999d14b01SJoseph Chen return 0; 30099d14b01SJoseph Chen } 30199d14b01SJoseph Chen #endif 30299d14b01SJoseph Chen 30399d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_OTP 30499d14b01SJoseph Chen static int do_test_otp(cmd_tbl_t *cmdtp, int flag, 30599d14b01SJoseph Chen int argc, char *const argv[]) 30699d14b01SJoseph Chen { 30799d14b01SJoseph Chen struct udevice *dev; 30899d14b01SJoseph Chen u8 otps[64] = {0}; 30999d14b01SJoseph Chen int ret; 31099d14b01SJoseph Chen 31199d14b01SJoseph Chen /* retrieve the device */ 31299d14b01SJoseph Chen ret = uclass_get_device_by_driver(UCLASS_MISC, 0, &dev); 31399d14b01SJoseph Chen if (ret) { 314443feaabSJoseph Chen ut_err("otp: failed to get device, ret=%d\n", ret); 31599d14b01SJoseph Chen return 0; 31699d14b01SJoseph Chen } 31799d14b01SJoseph Chen 31899d14b01SJoseph Chen ret = misc_read(dev, 0, &otps, sizeof(otps)); 31999d14b01SJoseph Chen if (ret) { 320443feaabSJoseph Chen ut_err("otp: failed to read, ret=%d\n", ret); 32199d14b01SJoseph Chen return 0; 32299d14b01SJoseph Chen } 32399d14b01SJoseph Chen 32499d14b01SJoseph Chen printf("Otp-content:\n"); 32599d14b01SJoseph Chen print_buffer(0, otps, 1, 64, 16); 32699d14b01SJoseph Chen 32799d14b01SJoseph Chen return 0; 32899d14b01SJoseph Chen } 32999d14b01SJoseph Chen #endif 33099d14b01SJoseph Chen 33199d14b01SJoseph Chen #ifdef CONFIG_PARTITIONS 33299d14b01SJoseph Chen static int do_test_part(cmd_tbl_t *cmdtp, int flag, 33399d14b01SJoseph Chen int argc, char *const argv[]) 33499d14b01SJoseph Chen { 33599d14b01SJoseph Chen return run_command("part list ${devtype} ${devnum}", 0); 33699d14b01SJoseph Chen } 33799d14b01SJoseph Chen #endif 33899d14b01SJoseph Chen 339*e80ec83dSKever Yang #ifdef CONFIG_USB_HOST 340*e80ec83dSKever Yang static int do_test_usb(cmd_tbl_t *cmdtp, int flag, 341*e80ec83dSKever Yang int argc, char *const argv[]) 342*e80ec83dSKever Yang { 343*e80ec83dSKever Yang run_command("usb start", 0); 344*e80ec83dSKever Yang return do_test_storage(cmdtp, flag, argc, argv, "usb", "0", "usb0"); 345*e80ec83dSKever Yang } 346*e80ec83dSKever Yang #endif 347*e80ec83dSKever Yang 34899d14b01SJoseph Chen static cmd_tbl_t sub_cmd[] = { 34999d14b01SJoseph Chen #ifdef CONFIG_BLK 35099d14b01SJoseph Chen UNIT_CMD_DEFINE(blk, 0), 35199d14b01SJoseph Chen #endif 35299d14b01SJoseph Chen #ifdef CONFIG_MMC 35399d14b01SJoseph Chen UNIT_CMD_DEFINE(emmc, 0), 35499d14b01SJoseph Chen #endif 35599d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_EFUSE 35699d14b01SJoseph Chen UNIT_CMD_DEFINE(efuse, 0), 35799d14b01SJoseph Chen #endif 35899d14b01SJoseph Chen #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) && \ 35999d14b01SJoseph Chen !defined(CONFIG_SPL_BUILD) 36099d14b01SJoseph Chen UNIT_CMD_DEFINE(env, 0), 36199d14b01SJoseph Chen #endif 36299d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_OTP 36399d14b01SJoseph Chen UNIT_CMD_DEFINE(otp, 0), 36499d14b01SJoseph Chen #endif 36599d14b01SJoseph Chen #ifdef CONFIG_RKNAND 36699d14b01SJoseph Chen UNIT_CMD_DEFINE(rknand, 0), 36799d14b01SJoseph Chen #endif 36899d14b01SJoseph Chen #if defined(CONFIG_OPTEE_CLIENT) && defined(CONFIG_MMC) 36999d14b01SJoseph Chen UNIT_CMD_DEFINE(secure_storage, 0), 37099d14b01SJoseph Chen #endif 37199d14b01SJoseph Chen #ifdef CONFIG_PARTITIONS 37299d14b01SJoseph Chen UNIT_CMD_DEFINE(part, 0), 37399d14b01SJoseph Chen #endif 374*e80ec83dSKever Yang #ifdef CONFIG_USB_HOST 375*e80ec83dSKever Yang UNIT_CMD_DEFINE(usb, 0), 376*e80ec83dSKever Yang #endif 37799d14b01SJoseph Chen #ifdef CONFIG_MMC 37899d14b01SJoseph Chen UNIT_CMD_DEFINE(sdmmc, 0), 37999d14b01SJoseph Chen #endif 38099d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 38199d14b01SJoseph Chen UNIT_CMD_DEFINE(vendor, 0), 38299d14b01SJoseph Chen #endif 38399d14b01SJoseph Chen }; 38499d14b01SJoseph Chen 38599d14b01SJoseph Chen static char sub_cmd_help[] = 38699d14b01SJoseph Chen #ifdef CONFIG_BLK 38799d14b01SJoseph Chen " [.] rktest blk - test blk layer read/write\n" 38899d14b01SJoseph Chen #endif 38999d14b01SJoseph Chen #ifdef CONFIG_MMC 390474718ffSJoseph Chen " [.] rktest emmc - test emmc read/write speed\n" 39199d14b01SJoseph Chen " [.] rktest sdmmc - test sd card and fat fs read/write\n" 39299d14b01SJoseph Chen #endif 39399d14b01SJoseph Chen #ifdef CONFIG_RKNAND 394474718ffSJoseph Chen " [.] rktest rknand - test rknand read/write speed\n" 39599d14b01SJoseph Chen #endif 39699d14b01SJoseph Chen #if defined(CONFIG_OPTEE_CLIENT) && defined(CONFIG_MMC) 39799d14b01SJoseph Chen " [.] rktest secure_storage - test secure storage\n" 39899d14b01SJoseph Chen #endif 39999d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 40099d14b01SJoseph Chen " [.] rktest vendor - test vendor storage read/write\n" 40199d14b01SJoseph Chen #endif 40299d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_EFUSE 40399d14b01SJoseph Chen " [.] rktest efuse - test efuse, dump content\n" 40499d14b01SJoseph Chen #endif 40599d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_OTP 40699d14b01SJoseph Chen " [.] rktest otp - test otp, dump content\n" 40799d14b01SJoseph Chen #endif 40899d14b01SJoseph Chen #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) && \ 40999d14b01SJoseph Chen !defined(CONFIG_SPL_BUILD) 41099d14b01SJoseph Chen " [.] rktest env - test save env to storage\n" 41199d14b01SJoseph Chen #endif 41299d14b01SJoseph Chen #ifdef CONFIG_PARTITIONS 41399d14b01SJoseph Chen " [.] rktest part - test part list\n" 41499d14b01SJoseph Chen #endif 415*e80ec83dSKever Yang #ifdef CONFIG_USB_HOST 416*e80ec83dSKever Yang " [.] rktest usb - test usb disk\n" 417*e80ec83dSKever Yang #endif 41899d14b01SJoseph Chen ; 41999d14b01SJoseph Chen 42099d14b01SJoseph Chen const struct cmd_group cmd_grp_storage = { 42199d14b01SJoseph Chen .id = TEST_ID_STORAGE, 42299d14b01SJoseph Chen .help = sub_cmd_help, 42399d14b01SJoseph Chen .cmd = sub_cmd, 42499d14b01SJoseph Chen .cmd_n = ARRAY_SIZE(sub_cmd), 42599d14b01SJoseph Chen }; 426