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