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> 8bc18ede0SKever Yang #ifdef CONFIG_DM_RAMDISK 999d14b01SJoseph Chen #include <boot_rkimg.h> 10bc18ede0SKever Yang #endif 1199d14b01SJoseph Chen #include <cli.h> 1299d14b01SJoseph Chen #include <dm.h> 1399d14b01SJoseph Chen #include <environment.h> 1499d14b01SJoseph Chen #include <malloc.h> 1599d14b01SJoseph Chen #include <misc.h> 16*54108d04SKever Yang #ifdef CONFIG_RKIMG_BOOTLOADER 1799d14b01SJoseph Chen #include <sysmem.h> 18*54108d04SKever Yang #endif 1999d14b01SJoseph Chen #include <linux/ctype.h> 20bc18ede0SKever Yang #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 2199d14b01SJoseph Chen #include <asm/arch/vendor.h> 22bc18ede0SKever Yang #endif 2399d14b01SJoseph Chen #include "test-rockchip.h" 2499d14b01SJoseph Chen 2599d14b01SJoseph Chen #define DEFAULT_STORAGE_RW_PART "userdata" 26e80ec83dSKever Yang enum if_type blk_get_type_by_name(char* devtype) 27e80ec83dSKever Yang { 28e80ec83dSKever Yang int type = -1; 2999d14b01SJoseph Chen 30e80ec83dSKever Yang if (!strcmp(devtype, "mmc")) 31e80ec83dSKever Yang type = IF_TYPE_MMC; 32bc18ede0SKever Yang #ifdef CONFIG_RKNAND 33e80ec83dSKever Yang else if (!strcmp(devtype, "rknand")) 34e80ec83dSKever Yang type = IF_TYPE_RKNAND; 35bc18ede0SKever Yang #endif 36bc18ede0SKever Yang #ifdef CONFIG_RKSFC_NAND 37e80ec83dSKever Yang else if (!strcmp(devtype, "spinand")) 38e80ec83dSKever Yang type = IF_TYPE_SPINAND; 39bc18ede0SKever Yang #endif 40bc18ede0SKever Yang #ifdef CONFIG_RKSFC_NOR 41e80ec83dSKever Yang else if (!strcmp(devtype, "spinor")) 42e80ec83dSKever Yang type = IF_TYPE_SPINOR; 43bc18ede0SKever Yang #endif 44bc18ede0SKever Yang #ifdef CONFIG_DM_RAMDISK 45e80ec83dSKever Yang else if (!strcmp(devtype, "ramdisk")) 46e80ec83dSKever Yang type = IF_TYPE_RAMDISK; 47bc18ede0SKever Yang #endif 48bc18ede0SKever Yang #ifdef CONFIG_MTD_BLK 49e80ec83dSKever Yang else if (!strcmp(devtype, "mtd")) 50e80ec83dSKever Yang type = IF_TYPE_MTD; 51bc18ede0SKever Yang #endif 52e80ec83dSKever Yang else if (!strcmp(devtype, "usb")) 53e80ec83dSKever Yang type = IF_TYPE_USB; 54e80ec83dSKever Yang 55e80ec83dSKever Yang return type; 56e80ec83dSKever Yang } 57e80ec83dSKever Yang 58bc18ede0SKever Yang #if defined(CONFIG_MMC) || defined(CONFIG_RKNAND) || defined(CONFIG_DM_RAMDISK) || defined(CONFIG_USB_HOST) 5999d14b01SJoseph Chen static int do_test_storage(cmd_tbl_t *cmdtp, int flag, 6099d14b01SJoseph Chen int argc, char *const argv[], 6199d14b01SJoseph Chen const char *devtype, 6299d14b01SJoseph Chen const char *devnum, 6399d14b01SJoseph Chen const char *label) 6499d14b01SJoseph Chen { 6599d14b01SJoseph Chen struct blk_desc *dev_desc; 66474718ffSJoseph Chen disk_partition_t part; 6799d14b01SJoseph Chen u32 blocks, round, sector; 6899d14b01SJoseph Chen char *w_buf, *r_buf; 6999d14b01SJoseph Chen char cmd[64]; 7099d14b01SJoseph Chen int i, ret; 7199d14b01SJoseph Chen ulong ts; 7299d14b01SJoseph Chen 73e80ec83dSKever Yang /* 1. Switch to device type/num */ 74e80ec83dSKever Yang if (devtype && !strcmp(devtype, "usb")) { 75e80ec83dSKever Yang if (run_command("usb start", 0)) { 76e80ec83dSKever Yang printf("Switch to %s%s failed\n", devtype, devnum); 77e80ec83dSKever Yang ret = -ENODEV; 78e80ec83dSKever Yang goto err1; 79e80ec83dSKever Yang } 80e80ec83dSKever Yang } else if (devtype) { 81e80ec83dSKever Yang snprintf(cmd, sizeof(cmd), "%s dev %s", devtype, devnum); 82e80ec83dSKever Yang if (run_command(cmd, 0)) { 83e80ec83dSKever Yang printf("Switch to %s%s failed\n", devtype, devnum); 84e80ec83dSKever Yang ret = -ENODEV; 85e80ec83dSKever Yang goto err1; 86e80ec83dSKever Yang } 87e80ec83dSKever Yang } 88e80ec83dSKever Yang if (!devtype) { 89e80ec83dSKever Yang /* For blk test only */ 90bc18ede0SKever Yang #ifdef CONFIG_DM_RAMDISK 9199d14b01SJoseph Chen dev_desc = rockchip_get_bootdev(); 92bc18ede0SKever Yang #else 93bc18ede0SKever Yang printf("%s Not support devtype!\n", __func__); 94bc18ede0SKever Yang return -EINVAL; 95bc18ede0SKever Yang #endif 96e80ec83dSKever Yang } else { 97e80ec83dSKever Yang int if_type; 98e80ec83dSKever Yang int num = simple_strtoul(devnum, NULL, 10); 99e80ec83dSKever Yang if_type = blk_get_type_by_name((char *)devtype); 100e80ec83dSKever Yang dev_desc = blk_get_devnum_by_type(if_type, num); 101e80ec83dSKever Yang } 10299d14b01SJoseph Chen if (!dev_desc) { 103443feaabSJoseph Chen ut_err("%s: failed to get blk desc\n", label); 10499d14b01SJoseph Chen return -ENODEV; 10599d14b01SJoseph Chen } 10699d14b01SJoseph Chen 107e80ec83dSKever Yang /* 2. Get test partition */ 10899d14b01SJoseph Chen if (part_get_info_by_name(dev_desc, 10999d14b01SJoseph Chen DEFAULT_STORAGE_RW_PART, &part) < 0) { 110443feaabSJoseph Chen ut_err("%s: failed to find %s partition\n", label, 111443feaabSJoseph Chen DEFAULT_STORAGE_RW_PART); 11299d14b01SJoseph Chen return -EINVAL; 11399d14b01SJoseph Chen } 11499d14b01SJoseph Chen 11599d14b01SJoseph Chen /* 32MB */ 11699d14b01SJoseph Chen sector = part.start; 11799d14b01SJoseph Chen blocks = part.size > 0x10000 ? 0x10000 : part.size; 11899d14b01SJoseph Chen round = 4; 11999d14b01SJoseph Chen 12099d14b01SJoseph Chen /* Round up */ 12199d14b01SJoseph Chen if (blocks % 2) 12299d14b01SJoseph Chen blocks += 1; 12399d14b01SJoseph Chen 12499d14b01SJoseph Chen printf("%s RW sectors on %s 0x%08x - 0x%08x(size: %ld MiB) for %d round\n\n", 125474718ffSJoseph Chen label, DEFAULT_STORAGE_RW_PART, 12699d14b01SJoseph Chen sector, sector + blocks, 12799d14b01SJoseph Chen (blocks * dev_desc->blksz) >> 20, round); 12899d14b01SJoseph Chen 12999d14b01SJoseph Chen 13099d14b01SJoseph Chen /* 3. Prepare memory */ 131*54108d04SKever Yang #ifdef CONFIG_RKIMG_BOOTLOADER 13299d14b01SJoseph Chen w_buf = sysmem_alloc_by_name("storage_w", blocks * dev_desc->blksz); 133*54108d04SKever Yang #else 134*54108d04SKever Yang w_buf = memalign(CONFIG_SYS_CACHELINE_SIZE, blocks * dev_desc->blksz); 135*54108d04SKever Yang #endif 13699d14b01SJoseph Chen if (!w_buf) { 137443feaabSJoseph Chen ut_err("%s: no sysmem for w_buf\n", label); 13899d14b01SJoseph Chen ret = -ENOMEM; 13999d14b01SJoseph Chen goto err1; 14099d14b01SJoseph Chen } 141*54108d04SKever Yang #ifdef CONFIG_RKIMG_BOOTLOADER 14299d14b01SJoseph Chen r_buf = sysmem_alloc_by_name("storage_r", blocks * dev_desc->blksz); 143*54108d04SKever Yang #else 144*54108d04SKever Yang r_buf = memalign(CONFIG_SYS_CACHELINE_SIZE, blocks * dev_desc->blksz); 145*54108d04SKever Yang #endif 14699d14b01SJoseph Chen if (!r_buf) { 147443feaabSJoseph Chen ut_err("%s: no sysmem for r_buf\n", label); 14899d14b01SJoseph Chen ret = -ENOMEM; 14999d14b01SJoseph Chen goto err2; 15099d14b01SJoseph Chen } 15199d14b01SJoseph Chen 15299d14b01SJoseph Chen for (i = 0; i < blocks * dev_desc->blksz; i++) { 15399d14b01SJoseph Chen w_buf[i] = i; 15499d14b01SJoseph Chen r_buf[i] = 0; 15599d14b01SJoseph Chen } 15699d14b01SJoseph Chen 15799d14b01SJoseph Chen /* 4. Write test */ 15899d14b01SJoseph Chen ts = get_timer(0); 15999d14b01SJoseph Chen if (devtype) { 16099d14b01SJoseph Chen snprintf(cmd, sizeof(cmd), "%s write 0x%x 0x%x 0x%x", 16199d14b01SJoseph Chen devtype, (u32)(ulong)w_buf, sector, blocks); 16299d14b01SJoseph Chen for (i = 0; i < round; i++) { 16399d14b01SJoseph Chen if (run_command(cmd, 0)) { 164443feaabSJoseph Chen ut_err("%s: failed to write @%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_dwrite(dev_desc, sector, blocks, w_buf); 17299d14b01SJoseph Chen if (ret != blocks) { 173443feaabSJoseph Chen ut_err("%s: failed to write @%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 write: size %dMB, used %ldms, speed %ldMB/s\n", 18299d14b01SJoseph Chen label, blocks * round / 2048, ts, (blocks * round >> 1) / ts); 18399d14b01SJoseph Chen 18499d14b01SJoseph Chen /* 5. Read test */ 18599d14b01SJoseph Chen ts = get_timer(0); 18699d14b01SJoseph Chen if (devtype) { 18799d14b01SJoseph Chen snprintf(cmd, sizeof(cmd), "%s read 0x%x 0x%x 0x%x", 18899d14b01SJoseph Chen devtype, (u32)(ulong)r_buf, sector, blocks); 18999d14b01SJoseph Chen 19099d14b01SJoseph Chen for (i = 0; i < round; i++) { 19199d14b01SJoseph Chen if (run_command(cmd, 0)) { 192443feaabSJoseph Chen ut_err("%s: failed to read @%d round\n", label, i); 19399d14b01SJoseph Chen ret = -EIO; 19499d14b01SJoseph Chen goto err3; 19599d14b01SJoseph Chen } 19699d14b01SJoseph Chen } 19799d14b01SJoseph Chen } else { 19899d14b01SJoseph Chen for (i = 0; i < round; i++) { 19999d14b01SJoseph Chen ret = blk_dread(dev_desc, sector, blocks, r_buf); 20099d14b01SJoseph Chen if (ret != blocks) { 201443feaabSJoseph Chen ut_err("%s: failed to read @%d round\n", label, i); 20299d14b01SJoseph Chen ret = -EIO; 20399d14b01SJoseph Chen goto err3; 20499d14b01SJoseph Chen } 20599d14b01SJoseph Chen } 20699d14b01SJoseph Chen } 20799d14b01SJoseph Chen 20899d14b01SJoseph Chen ts = get_timer(0) - ts; 20999d14b01SJoseph Chen printf("\n%s read: size %dMB, used %ldms, speed %ldMB/s\n", 21099d14b01SJoseph Chen label, blocks * round / 2048, ts, (blocks * round >> 1) / ts); 21199d14b01SJoseph Chen 21299d14b01SJoseph Chen /* 6. Verify the context */ 21399d14b01SJoseph Chen for (i = 0; i < blocks * dev_desc->blksz; i++) { 21499d14b01SJoseph Chen if (w_buf[i] != r_buf[i]) { 215443feaabSJoseph Chen ut_err("%s: context compare error\n", label); 21699d14b01SJoseph Chen ret = -EINVAL; 21799d14b01SJoseph Chen goto err3; 21899d14b01SJoseph Chen } 21999d14b01SJoseph Chen } 22099d14b01SJoseph Chen 22199d14b01SJoseph Chen /* 7. Switch back to default system devnum */ 22299d14b01SJoseph Chen if (devtype && !strcmp(devtype, "mmc") && 22399d14b01SJoseph Chen strcmp(devnum, env_get("devnum"))) { 22499d14b01SJoseph Chen ret = run_command(cmd, 0); 22599d14b01SJoseph Chen if (ret) { 226443feaabSJoseph Chen ut_err("%s: failed to switch to mmc1\n", label); 22799d14b01SJoseph Chen ret = -ENODEV; 22899d14b01SJoseph Chen goto err3; 22999d14b01SJoseph Chen } 23099d14b01SJoseph Chen } 23199d14b01SJoseph Chen 23299d14b01SJoseph Chen ret = 0; 23399d14b01SJoseph Chen err3: 234*54108d04SKever Yang #ifdef CONFIG_RKIMG_BOOTLOADER 23599d14b01SJoseph Chen sysmem_free((phys_addr_t)r_buf); 23699d14b01SJoseph Chen err2: 23799d14b01SJoseph Chen sysmem_free((phys_addr_t)w_buf); 238*54108d04SKever Yang #else 239*54108d04SKever Yang free((phys_addr_t)r_buf); 240*54108d04SKever Yang err2: 241*54108d04SKever Yang free((phys_addr_t)w_buf); 242*54108d04SKever Yang #endif 24399d14b01SJoseph Chen err1: 24499d14b01SJoseph Chen 24599d14b01SJoseph Chen return ret; 24699d14b01SJoseph Chen } 24799d14b01SJoseph Chen 24899d14b01SJoseph Chen #ifdef CONFIG_MMC 24999d14b01SJoseph Chen static int do_test_emmc(cmd_tbl_t *cmdtp, int flag, 25099d14b01SJoseph Chen int argc, char *const argv[]) 25199d14b01SJoseph Chen { 25299d14b01SJoseph Chen return do_test_storage(cmdtp, flag, argc, argv, "mmc", "0", "MMC0"); 25399d14b01SJoseph Chen } 25499d14b01SJoseph Chen 25599d14b01SJoseph Chen static int do_test_sdmmc(cmd_tbl_t *cmdtp, int flag, 25699d14b01SJoseph Chen int argc, char *const argv[]) 25799d14b01SJoseph Chen { 25899d14b01SJoseph Chen return do_test_storage(cmdtp, flag, argc, argv, "mmc", "1", "MMC1"); 25999d14b01SJoseph Chen } 26099d14b01SJoseph Chen #endif 26199d14b01SJoseph Chen 26299d14b01SJoseph Chen #ifdef CONFIG_RKNAND 26399d14b01SJoseph Chen static int do_test_rknand(cmd_tbl_t *cmdtp, int flag, 26499d14b01SJoseph Chen int argc, char *const argv[]) 26599d14b01SJoseph Chen { 26699d14b01SJoseph Chen return do_test_storage(cmdtp, flag, argc, argv, "rknand", "0", "RKNAND0"); 26799d14b01SJoseph Chen } 26899d14b01SJoseph Chen #endif 26999d14b01SJoseph Chen 270bc18ede0SKever Yang #ifdef CONFIG_DM_RAMDISK 27199d14b01SJoseph Chen static int do_test_blk(cmd_tbl_t *cmdtp, int flag, 27299d14b01SJoseph Chen int argc, char *const argv[]) 27399d14b01SJoseph Chen { 27499d14b01SJoseph Chen return do_test_storage(cmdtp, flag, argc, argv, NULL, NULL, "BLK"); 27599d14b01SJoseph Chen } 276bc18ede0SKever Yang #endif 277bc18ede0SKever Yang #endif/* defined(CONFIG_MMC) || defined(CONFIG_RKNAND) || defined(CONFIG_DM_RAMDISK) */ 27899d14b01SJoseph Chen 27999d14b01SJoseph Chen #if defined(CONFIG_OPTEE_CLIENT) && defined(CONFIG_MMC) 28099d14b01SJoseph Chen static int do_test_secure_storage(cmd_tbl_t *cmdtp, int flag, 28199d14b01SJoseph Chen int argc, char *const argv[]) 28299d14b01SJoseph Chen { 28399d14b01SJoseph Chen return run_command("mmc testsecurestorage", 0); 28499d14b01SJoseph Chen } 28599d14b01SJoseph Chen #endif 28699d14b01SJoseph Chen 28799d14b01SJoseph Chen #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) && \ 28899d14b01SJoseph Chen !defined(CONFIG_SPL_BUILD) 28999d14b01SJoseph Chen static int do_test_env(cmd_tbl_t *cmdtp, int flag, 29099d14b01SJoseph Chen int argc, char *const argv[]) 29199d14b01SJoseph Chen { 29299d14b01SJoseph Chen int ret; 29399d14b01SJoseph Chen 29499d14b01SJoseph Chen ret = env_save(); 295443feaabSJoseph Chen if (ret) { 296443feaabSJoseph Chen ut_err("env: failed to save, ret=%d\n", ret); 29799d14b01SJoseph Chen return ret; 298443feaabSJoseph Chen } 29999d14b01SJoseph Chen 30099d14b01SJoseph Chen return env_load(); 30199d14b01SJoseph Chen } 30299d14b01SJoseph Chen #endif 30399d14b01SJoseph Chen 30499d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 30599d14b01SJoseph Chen static int do_test_vendor(cmd_tbl_t *cmdtp, int flag, 30699d14b01SJoseph Chen int argc, char *const argv[]) 30799d14b01SJoseph Chen { 30899d14b01SJoseph Chen return vendor_storage_test(); 30999d14b01SJoseph Chen } 31099d14b01SJoseph Chen #endif 31199d14b01SJoseph Chen 31299d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_EFUSE 31399d14b01SJoseph Chen static int do_test_efuse(cmd_tbl_t *cmdtp, int flag, 31499d14b01SJoseph Chen int argc, char *const argv[]) 31599d14b01SJoseph Chen { 31699d14b01SJoseph Chen struct udevice *dev; 31799d14b01SJoseph Chen u8 fuses[128] = {0}; 31899d14b01SJoseph Chen int ret; 31999d14b01SJoseph Chen 32099d14b01SJoseph Chen ret = uclass_get_device(UCLASS_MISC, 0, &dev); 32199d14b01SJoseph Chen if (ret) { 322443feaabSJoseph Chen ut_err("efuse: failed to get device, ret=%d\n", ret); 32399d14b01SJoseph Chen return 0; 32499d14b01SJoseph Chen } 32599d14b01SJoseph Chen 32699d14b01SJoseph Chen ret = misc_read(dev, 0, &fuses, sizeof(fuses)); 32799d14b01SJoseph Chen if (ret) { 328443feaabSJoseph Chen ut_err("efuse: failed to read, ret=%d\n", ret); 32999d14b01SJoseph Chen return 0; 33099d14b01SJoseph Chen } 33199d14b01SJoseph Chen 33299d14b01SJoseph Chen printf("Efuse-content:\n"); 33399d14b01SJoseph Chen print_buffer(0, fuses, 1, 128, 16); 33499d14b01SJoseph Chen 33599d14b01SJoseph Chen return 0; 33699d14b01SJoseph Chen } 33799d14b01SJoseph Chen #endif 33899d14b01SJoseph Chen 33999d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_OTP 34099d14b01SJoseph Chen static int do_test_otp(cmd_tbl_t *cmdtp, int flag, 34199d14b01SJoseph Chen int argc, char *const argv[]) 34299d14b01SJoseph Chen { 34399d14b01SJoseph Chen struct udevice *dev; 34499d14b01SJoseph Chen u8 otps[64] = {0}; 34599d14b01SJoseph Chen int ret; 34699d14b01SJoseph Chen 34799d14b01SJoseph Chen /* retrieve the device */ 34899d14b01SJoseph Chen ret = uclass_get_device_by_driver(UCLASS_MISC, 0, &dev); 34999d14b01SJoseph Chen if (ret) { 350443feaabSJoseph Chen ut_err("otp: failed to get device, ret=%d\n", ret); 35199d14b01SJoseph Chen return 0; 35299d14b01SJoseph Chen } 35399d14b01SJoseph Chen 35499d14b01SJoseph Chen ret = misc_read(dev, 0, &otps, sizeof(otps)); 35599d14b01SJoseph Chen if (ret) { 356443feaabSJoseph Chen ut_err("otp: failed to read, ret=%d\n", ret); 35799d14b01SJoseph Chen return 0; 35899d14b01SJoseph Chen } 35999d14b01SJoseph Chen 36099d14b01SJoseph Chen printf("Otp-content:\n"); 36199d14b01SJoseph Chen print_buffer(0, otps, 1, 64, 16); 36299d14b01SJoseph Chen 36399d14b01SJoseph Chen return 0; 36499d14b01SJoseph Chen } 36599d14b01SJoseph Chen #endif 36699d14b01SJoseph Chen 36799d14b01SJoseph Chen #ifdef CONFIG_PARTITIONS 36899d14b01SJoseph Chen static int do_test_part(cmd_tbl_t *cmdtp, int flag, 36999d14b01SJoseph Chen int argc, char *const argv[]) 37099d14b01SJoseph Chen { 37199d14b01SJoseph Chen return run_command("part list ${devtype} ${devnum}", 0); 37299d14b01SJoseph Chen } 37399d14b01SJoseph Chen #endif 37499d14b01SJoseph Chen 375e80ec83dSKever Yang #ifdef CONFIG_USB_HOST 376e80ec83dSKever Yang static int do_test_usb(cmd_tbl_t *cmdtp, int flag, 377e80ec83dSKever Yang int argc, char *const argv[]) 378e80ec83dSKever Yang { 379e80ec83dSKever Yang run_command("usb start", 0); 380e80ec83dSKever Yang return do_test_storage(cmdtp, flag, argc, argv, "usb", "0", "usb0"); 381e80ec83dSKever Yang } 382e80ec83dSKever Yang #endif 383e80ec83dSKever Yang 38499d14b01SJoseph Chen static cmd_tbl_t sub_cmd[] = { 385bc18ede0SKever Yang #ifdef CONFIG_DM_RAMDISK 38699d14b01SJoseph Chen UNIT_CMD_DEFINE(blk, 0), 38799d14b01SJoseph Chen #endif 38899d14b01SJoseph Chen #ifdef CONFIG_MMC 38999d14b01SJoseph Chen UNIT_CMD_DEFINE(emmc, 0), 39099d14b01SJoseph Chen #endif 39199d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_EFUSE 39299d14b01SJoseph Chen UNIT_CMD_DEFINE(efuse, 0), 39399d14b01SJoseph Chen #endif 39499d14b01SJoseph Chen #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) && \ 39599d14b01SJoseph Chen !defined(CONFIG_SPL_BUILD) 39699d14b01SJoseph Chen UNIT_CMD_DEFINE(env, 0), 39799d14b01SJoseph Chen #endif 39899d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_OTP 39999d14b01SJoseph Chen UNIT_CMD_DEFINE(otp, 0), 40099d14b01SJoseph Chen #endif 40199d14b01SJoseph Chen #ifdef CONFIG_RKNAND 40299d14b01SJoseph Chen UNIT_CMD_DEFINE(rknand, 0), 40399d14b01SJoseph Chen #endif 40499d14b01SJoseph Chen #if defined(CONFIG_OPTEE_CLIENT) && defined(CONFIG_MMC) 40599d14b01SJoseph Chen UNIT_CMD_DEFINE(secure_storage, 0), 40699d14b01SJoseph Chen #endif 40799d14b01SJoseph Chen #ifdef CONFIG_PARTITIONS 40899d14b01SJoseph Chen UNIT_CMD_DEFINE(part, 0), 40999d14b01SJoseph Chen #endif 410e80ec83dSKever Yang #ifdef CONFIG_USB_HOST 411e80ec83dSKever Yang UNIT_CMD_DEFINE(usb, 0), 412e80ec83dSKever Yang #endif 41399d14b01SJoseph Chen #ifdef CONFIG_MMC 41499d14b01SJoseph Chen UNIT_CMD_DEFINE(sdmmc, 0), 41599d14b01SJoseph Chen #endif 41699d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 41799d14b01SJoseph Chen UNIT_CMD_DEFINE(vendor, 0), 41899d14b01SJoseph Chen #endif 41999d14b01SJoseph Chen }; 42099d14b01SJoseph Chen 42199d14b01SJoseph Chen static char sub_cmd_help[] = 422bc18ede0SKever Yang #ifdef CONFIG_DM_RAMDISK 42399d14b01SJoseph Chen " [.] rktest blk - test blk layer read/write\n" 42499d14b01SJoseph Chen #endif 42599d14b01SJoseph Chen #ifdef CONFIG_MMC 426474718ffSJoseph Chen " [.] rktest emmc - test emmc read/write speed\n" 42799d14b01SJoseph Chen " [.] rktest sdmmc - test sd card and fat fs read/write\n" 42899d14b01SJoseph Chen #endif 42999d14b01SJoseph Chen #ifdef CONFIG_RKNAND 430474718ffSJoseph Chen " [.] rktest rknand - test rknand read/write speed\n" 43199d14b01SJoseph Chen #endif 43299d14b01SJoseph Chen #if defined(CONFIG_OPTEE_CLIENT) && defined(CONFIG_MMC) 43399d14b01SJoseph Chen " [.] rktest secure_storage - test secure storage\n" 43499d14b01SJoseph Chen #endif 43599d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 43699d14b01SJoseph Chen " [.] rktest vendor - test vendor storage read/write\n" 43799d14b01SJoseph Chen #endif 43899d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_EFUSE 43999d14b01SJoseph Chen " [.] rktest efuse - test efuse, dump content\n" 44099d14b01SJoseph Chen #endif 44199d14b01SJoseph Chen #ifdef CONFIG_ROCKCHIP_OTP 44299d14b01SJoseph Chen " [.] rktest otp - test otp, dump content\n" 44399d14b01SJoseph Chen #endif 44499d14b01SJoseph Chen #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) && \ 44599d14b01SJoseph Chen !defined(CONFIG_SPL_BUILD) 44699d14b01SJoseph Chen " [.] rktest env - test save env to storage\n" 44799d14b01SJoseph Chen #endif 44899d14b01SJoseph Chen #ifdef CONFIG_PARTITIONS 44999d14b01SJoseph Chen " [.] rktest part - test part list\n" 45099d14b01SJoseph Chen #endif 451e80ec83dSKever Yang #ifdef CONFIG_USB_HOST 452e80ec83dSKever Yang " [.] rktest usb - test usb disk\n" 453e80ec83dSKever Yang #endif 45499d14b01SJoseph Chen ; 45599d14b01SJoseph Chen 45699d14b01SJoseph Chen const struct cmd_group cmd_grp_storage = { 45799d14b01SJoseph Chen .id = TEST_ID_STORAGE, 45899d14b01SJoseph Chen .help = sub_cmd_help, 45999d14b01SJoseph Chen .cmd = sub_cmd, 46099d14b01SJoseph Chen .cmd_n = ARRAY_SIZE(sub_cmd), 46199d14b01SJoseph Chen }; 462