xref: /rk3399_rockchip-uboot/test/rockchip/test-storage.c (revision 54108d04ceddfbc7c026ac102fdf29d44f72a8f4)
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