xref: /OK3568_Linux_fs/u-boot/test/rockchip/test-storage.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:     GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #ifdef CONFIG_DM_RAMDISK
9*4882a593Smuzhiyun #include <boot_rkimg.h>
10*4882a593Smuzhiyun #endif
11*4882a593Smuzhiyun #include <cli.h>
12*4882a593Smuzhiyun #include <dm.h>
13*4882a593Smuzhiyun #include <environment.h>
14*4882a593Smuzhiyun #include <malloc.h>
15*4882a593Smuzhiyun #include <misc.h>
16*4882a593Smuzhiyun #ifdef CONFIG_RKIMG_BOOTLOADER
17*4882a593Smuzhiyun #include <sysmem.h>
18*4882a593Smuzhiyun #endif
19*4882a593Smuzhiyun #include <linux/ctype.h>
20*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION
21*4882a593Smuzhiyun #include <asm/arch/vendor.h>
22*4882a593Smuzhiyun #endif
23*4882a593Smuzhiyun #include "test-rockchip.h"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define DEFAULT_STORAGE_RW_PART		"userdata"
blk_get_type_by_name_and_num(char * devtype,int devnum)26*4882a593Smuzhiyun static enum if_type blk_get_type_by_name_and_num(char *devtype, int devnum)
27*4882a593Smuzhiyun {
28*4882a593Smuzhiyun 	int type = -1;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	if (!strcmp(devtype, "mmc"))
31*4882a593Smuzhiyun 		type = IF_TYPE_MMC;
32*4882a593Smuzhiyun #if defined(CONFIG_RKNAND) || defined(CONFIG_RKNANDC_NAND)
33*4882a593Smuzhiyun 	else if (!strcmp(devtype, "rknand"))
34*4882a593Smuzhiyun 		type = IF_TYPE_RKNAND;
35*4882a593Smuzhiyun #endif
36*4882a593Smuzhiyun #ifdef CONFIG_RKSFC_NAND
37*4882a593Smuzhiyun 	else if (!strcmp(devtype, "rksfc") && devnum == 0)
38*4882a593Smuzhiyun 		type = IF_TYPE_SPINAND;
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun #ifdef CONFIG_RKSFC_NOR
41*4882a593Smuzhiyun 	else if (!strcmp(devtype, "rksfc") && devnum == 1)
42*4882a593Smuzhiyun 		type = IF_TYPE_SPINOR;
43*4882a593Smuzhiyun #endif
44*4882a593Smuzhiyun #ifdef CONFIG_DM_RAMDISK
45*4882a593Smuzhiyun 	else if (!strcmp(devtype, "ramdisk"))
46*4882a593Smuzhiyun 		type = IF_TYPE_RAMDISK;
47*4882a593Smuzhiyun #endif
48*4882a593Smuzhiyun #ifdef CONFIG_MTD_BLK
49*4882a593Smuzhiyun 	else if (!strcmp(devtype, "mtd"))
50*4882a593Smuzhiyun 		type = IF_TYPE_MTD;
51*4882a593Smuzhiyun #endif
52*4882a593Smuzhiyun #ifdef CONFIG_SCSI
53*4882a593Smuzhiyun 	else if (!strcmp(devtype, "scsi"))
54*4882a593Smuzhiyun 		type = IF_TYPE_SCSI;
55*4882a593Smuzhiyun #endif
56*4882a593Smuzhiyun 	else if (!strcmp(devtype, "usb"))
57*4882a593Smuzhiyun 		type = IF_TYPE_USB;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	return type;
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #if defined(CONFIG_MMC) ||\
63*4882a593Smuzhiyun 	defined(CONFIG_RKNAND) ||\
64*4882a593Smuzhiyun 	defined(CONFIG_DM_RAMDISK) ||\
65*4882a593Smuzhiyun 	defined(CONFIG_USB_HOST) ||\
66*4882a593Smuzhiyun 	defined(CONFIG_RKNANDC_NAND) ||\
67*4882a593Smuzhiyun 	defined(CONFIG_RKSFC_NAND) ||\
68*4882a593Smuzhiyun 	defined(CONFIG_RKSFC_NOR)
do_test_storage(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[],const char * devtype,const char * devnum,const char * label)69*4882a593Smuzhiyun static int do_test_storage(cmd_tbl_t *cmdtp, int flag,
70*4882a593Smuzhiyun 			   int argc, char *const argv[],
71*4882a593Smuzhiyun 			   const char *devtype,
72*4882a593Smuzhiyun 			   const char *devnum,
73*4882a593Smuzhiyun 			   const char *label)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun 	struct blk_desc *dev_desc;
76*4882a593Smuzhiyun 	disk_partition_t part;
77*4882a593Smuzhiyun 	u32 blocks, round, sector;
78*4882a593Smuzhiyun 	char *w_buf, *r_buf;
79*4882a593Smuzhiyun 	char cmd[64];
80*4882a593Smuzhiyun 	int i, ret;
81*4882a593Smuzhiyun 	ulong ts;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	/* 1. Switch to device type/num */
84*4882a593Smuzhiyun 	if (devtype && !strcmp(devtype, "usb")) {
85*4882a593Smuzhiyun 		if (run_command("usb start", 0)) {
86*4882a593Smuzhiyun 			printf("Switch to %s%s failed\n", devtype, devnum);
87*4882a593Smuzhiyun 			ret = -ENODEV;
88*4882a593Smuzhiyun 			goto err1;
89*4882a593Smuzhiyun 		}
90*4882a593Smuzhiyun 	} else if (devtype) {
91*4882a593Smuzhiyun 		snprintf(cmd, sizeof(cmd), "%s dev %s", devtype, devnum);
92*4882a593Smuzhiyun 		if (run_command(cmd, 0)) {
93*4882a593Smuzhiyun 			printf("Switch to %s%s failed\n", devtype, devnum);
94*4882a593Smuzhiyun 			ret = -ENODEV;
95*4882a593Smuzhiyun 			goto err1;
96*4882a593Smuzhiyun 		}
97*4882a593Smuzhiyun 	}
98*4882a593Smuzhiyun 	if (!devtype) {
99*4882a593Smuzhiyun 		/* For blk test only */
100*4882a593Smuzhiyun #ifdef CONFIG_DM_RAMDISK
101*4882a593Smuzhiyun 		dev_desc = rockchip_get_bootdev();
102*4882a593Smuzhiyun #else
103*4882a593Smuzhiyun 		printf("%s Not support devtype!\n", __func__);
104*4882a593Smuzhiyun 		return -EINVAL;
105*4882a593Smuzhiyun #endif
106*4882a593Smuzhiyun 	} else {
107*4882a593Smuzhiyun 		int if_type;
108*4882a593Smuzhiyun 		int num = simple_strtoul(devnum, NULL, 10);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun 		if_type = blk_get_type_by_name_and_num((char *)devtype, num);
111*4882a593Smuzhiyun 		dev_desc = blk_get_devnum_by_type(if_type, num);
112*4882a593Smuzhiyun 	}
113*4882a593Smuzhiyun 	if (!dev_desc) {
114*4882a593Smuzhiyun 		ut_err("%s: failed to get blk desc\n", label);
115*4882a593Smuzhiyun 		return -ENODEV;
116*4882a593Smuzhiyun 	}
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	/* 2. Get test partition */
119*4882a593Smuzhiyun 	if (part_get_info_by_name(dev_desc,
120*4882a593Smuzhiyun 				  DEFAULT_STORAGE_RW_PART, &part) < 0) {
121*4882a593Smuzhiyun 		ut_err("%s: failed to find %s partition\n", label,
122*4882a593Smuzhiyun 		       DEFAULT_STORAGE_RW_PART);
123*4882a593Smuzhiyun 		return -EINVAL;
124*4882a593Smuzhiyun 	}
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun 	/* 32MB */
127*4882a593Smuzhiyun 	sector = part.start;
128*4882a593Smuzhiyun 	if (part.start + part.size > dev_desc->lba)
129*4882a593Smuzhiyun 		part.size = dev_desc->lba - part.start;
130*4882a593Smuzhiyun 	blocks = part.size > 0x10000 ? 0x10000 : part.size;
131*4882a593Smuzhiyun 	round  = 4;
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	/* Round up */
134*4882a593Smuzhiyun 	if (blocks % 2)
135*4882a593Smuzhiyun 		blocks += 1;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	printf("%s RW sectors on %s 0x%08x - 0x%08x(size: %ld MiB) for %d round\n\n",
138*4882a593Smuzhiyun 	       label, DEFAULT_STORAGE_RW_PART,
139*4882a593Smuzhiyun 	       sector, sector + blocks,
140*4882a593Smuzhiyun 	       (blocks * dev_desc->blksz) >> 20, round);
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	/* 3. Prepare memory */
143*4882a593Smuzhiyun #ifdef CONFIG_RKIMG_BOOTLOADER
144*4882a593Smuzhiyun 	w_buf = sysmem_alloc_by_name("storage_w", blocks * dev_desc->blksz);
145*4882a593Smuzhiyun #else
146*4882a593Smuzhiyun 	w_buf = memalign(CONFIG_SYS_CACHELINE_SIZE, blocks * dev_desc->blksz);
147*4882a593Smuzhiyun #endif
148*4882a593Smuzhiyun 	if (!w_buf) {
149*4882a593Smuzhiyun 		ut_err("%s: no sysmem for w_buf\n", label);
150*4882a593Smuzhiyun 		ret = -ENOMEM;
151*4882a593Smuzhiyun 		goto err1;
152*4882a593Smuzhiyun 	}
153*4882a593Smuzhiyun #ifdef CONFIG_RKIMG_BOOTLOADER
154*4882a593Smuzhiyun 	r_buf = sysmem_alloc_by_name("storage_r", blocks * dev_desc->blksz);
155*4882a593Smuzhiyun #else
156*4882a593Smuzhiyun 	r_buf = memalign(CONFIG_SYS_CACHELINE_SIZE, blocks * dev_desc->blksz);
157*4882a593Smuzhiyun #endif
158*4882a593Smuzhiyun 	if (!r_buf) {
159*4882a593Smuzhiyun 		ut_err("%s: no sysmem for r_buf\n", label);
160*4882a593Smuzhiyun 		ret = -ENOMEM;
161*4882a593Smuzhiyun 		goto err2;
162*4882a593Smuzhiyun 	}
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	for (i = 0; i < blocks * dev_desc->blksz; i++) {
165*4882a593Smuzhiyun 		w_buf[i] = i;
166*4882a593Smuzhiyun 		r_buf[i] = 0;
167*4882a593Smuzhiyun 	}
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	/* 4. Write test */
170*4882a593Smuzhiyun 	ts = get_timer(0);
171*4882a593Smuzhiyun 	if (devtype) {
172*4882a593Smuzhiyun 		snprintf(cmd, sizeof(cmd), "%s write 0x%x 0x%x 0x%x",
173*4882a593Smuzhiyun 			 devtype, (u32)(ulong)w_buf, sector, blocks);
174*4882a593Smuzhiyun 		for (i = 0; i < round; i++) {
175*4882a593Smuzhiyun 			if (run_command(cmd, 0)) {
176*4882a593Smuzhiyun 				ut_err("%s: failed to write @%d round\n", label, i);
177*4882a593Smuzhiyun 				ret = -EIO;
178*4882a593Smuzhiyun 				goto err3;
179*4882a593Smuzhiyun 			}
180*4882a593Smuzhiyun 		}
181*4882a593Smuzhiyun 	} else {
182*4882a593Smuzhiyun 		for (i = 0; i < round; i++) {
183*4882a593Smuzhiyun 			ret = blk_dwrite(dev_desc, sector, blocks, w_buf);
184*4882a593Smuzhiyun 			if (ret != blocks) {
185*4882a593Smuzhiyun 				ut_err("%s: failed to write @%d round\n", label, i);
186*4882a593Smuzhiyun 				ret = -EIO;
187*4882a593Smuzhiyun 				goto err3;
188*4882a593Smuzhiyun 			}
189*4882a593Smuzhiyun 		}
190*4882a593Smuzhiyun 	}
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	ts = get_timer(0) - ts;
193*4882a593Smuzhiyun 	printf("\n%s write: size %dMB, used %ldms, speed %ldMB/s\n",
194*4882a593Smuzhiyun 	       label, blocks * round / 2048, ts, (blocks * round >> 1) / ts);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	/* 5. Read test */
197*4882a593Smuzhiyun 	ts = get_timer(0);
198*4882a593Smuzhiyun 	if (devtype) {
199*4882a593Smuzhiyun 		snprintf(cmd, sizeof(cmd), "%s read 0x%x 0x%x 0x%x",
200*4882a593Smuzhiyun 			 devtype, (u32)(ulong)r_buf, sector, blocks);
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 		for (i = 0; i < round; i++) {
203*4882a593Smuzhiyun 			if (run_command(cmd, 0)) {
204*4882a593Smuzhiyun 				ut_err("%s: failed to read @%d round\n", label, i);
205*4882a593Smuzhiyun 				ret = -EIO;
206*4882a593Smuzhiyun 				goto err3;
207*4882a593Smuzhiyun 			}
208*4882a593Smuzhiyun 		}
209*4882a593Smuzhiyun 	} else {
210*4882a593Smuzhiyun 		for (i = 0; i < round; i++) {
211*4882a593Smuzhiyun 			ret = blk_dread(dev_desc, sector, blocks, r_buf);
212*4882a593Smuzhiyun 			if (ret != blocks) {
213*4882a593Smuzhiyun 				ut_err("%s: failed to read @%d round\n", label, i);
214*4882a593Smuzhiyun 				ret = -EIO;
215*4882a593Smuzhiyun 				goto err3;
216*4882a593Smuzhiyun 			}
217*4882a593Smuzhiyun 		}
218*4882a593Smuzhiyun 	}
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	ts = get_timer(0) - ts;
221*4882a593Smuzhiyun 	printf("\n%s read: size %dMB, used %ldms, speed %ldMB/s\n",
222*4882a593Smuzhiyun 	       label, blocks * round / 2048, ts, (blocks * round >> 1) / ts);
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	/* 6. Verify the context */
225*4882a593Smuzhiyun 	for (i = 0; i < blocks * dev_desc->blksz; i++) {
226*4882a593Smuzhiyun 		if (w_buf[i] != r_buf[i]) {
227*4882a593Smuzhiyun 			ut_err("%s: context compare error\n", label);
228*4882a593Smuzhiyun 			ret = -EINVAL;
229*4882a593Smuzhiyun 			goto err3;
230*4882a593Smuzhiyun 		}
231*4882a593Smuzhiyun 	}
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	/* 7. Switch back to default system devnum */
234*4882a593Smuzhiyun 	if (devtype && !strcmp(devtype, "mmc") && env_get("devnum") &&
235*4882a593Smuzhiyun 	    strcmp(devnum, env_get("devnum"))) {
236*4882a593Smuzhiyun 		ret = run_command(cmd, 0);
237*4882a593Smuzhiyun 		if (ret) {
238*4882a593Smuzhiyun 			ut_err("%s: failed to switch to mmc1\n", label);
239*4882a593Smuzhiyun 			ret = -ENODEV;
240*4882a593Smuzhiyun 			goto err3;
241*4882a593Smuzhiyun 		}
242*4882a593Smuzhiyun 	}
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	ret = 0;
245*4882a593Smuzhiyun err3:
246*4882a593Smuzhiyun #ifdef CONFIG_RKIMG_BOOTLOADER
247*4882a593Smuzhiyun 	sysmem_free((phys_addr_t)r_buf);
248*4882a593Smuzhiyun err2:
249*4882a593Smuzhiyun 	sysmem_free((phys_addr_t)w_buf);
250*4882a593Smuzhiyun #else
251*4882a593Smuzhiyun 	free(r_buf);
252*4882a593Smuzhiyun err2:
253*4882a593Smuzhiyun 	free(w_buf);
254*4882a593Smuzhiyun #endif
255*4882a593Smuzhiyun err1:
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	return ret;
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun #ifdef CONFIG_MMC
do_test_emmc(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])261*4882a593Smuzhiyun static int do_test_emmc(cmd_tbl_t *cmdtp, int flag,
262*4882a593Smuzhiyun 			int argc, char *const argv[])
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun 	return do_test_storage(cmdtp, flag, argc, argv, "mmc", "0", "MMC0");
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun 
do_test_sdmmc(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])267*4882a593Smuzhiyun static int do_test_sdmmc(cmd_tbl_t *cmdtp, int flag,
268*4882a593Smuzhiyun 			 int argc, char *const argv[])
269*4882a593Smuzhiyun {
270*4882a593Smuzhiyun 	return do_test_storage(cmdtp, flag, argc, argv, "mmc", "1", "MMC1");
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun #endif
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun #if defined(CONFIG_RKNAND) || defined(CONFIG_RKNANDC_NAND)
do_test_rknand(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])275*4882a593Smuzhiyun static int do_test_rknand(cmd_tbl_t *cmdtp, int flag,
276*4882a593Smuzhiyun 			  int argc, char *const argv[])
277*4882a593Smuzhiyun {
278*4882a593Smuzhiyun 	return do_test_storage(cmdtp, flag, argc, argv, "rknand", "0", "RKNAND0");
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun #endif
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun #ifdef CONFIG_RKSFC_NAND
do_test_rkflash_spinand(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])283*4882a593Smuzhiyun static int do_test_rkflash_spinand(cmd_tbl_t *cmdtp, int flag,
284*4882a593Smuzhiyun 				   int argc, char *const argv[])
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun 	return do_test_storage(cmdtp, flag, argc, argv, "rksfc", "0", "RKSFC0");
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun #endif
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun #ifdef CONFIG_RKSFC_NOR
do_test_rkflash_spinor(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])291*4882a593Smuzhiyun static int do_test_rkflash_spinor(cmd_tbl_t *cmdtp, int flag,
292*4882a593Smuzhiyun 				  int argc, char *const argv[])
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun 	return do_test_storage(cmdtp, flag, argc, argv, "rksfc", "1", "RKSFC1");
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun #endif
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun #ifdef CONFIG_DM_RAMDISK
do_test_blk(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])299*4882a593Smuzhiyun static int do_test_blk(cmd_tbl_t *cmdtp, int flag,
300*4882a593Smuzhiyun 		       int argc, char *const argv[])
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun 	return do_test_storage(cmdtp, flag, argc, argv, NULL, NULL, "BLK");
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun #endif
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun #ifdef CONFIG_SCSI
do_test_scsi(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])307*4882a593Smuzhiyun static int do_test_scsi(cmd_tbl_t *cmdtp, int flag,
308*4882a593Smuzhiyun 			int argc, char *const argv[])
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun 	return do_test_storage(cmdtp, flag, argc, argv, "scsi", "0", "BLK");
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun #endif
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun #endif/* defined(CONFIG_MMC) ||\
315*4882a593Smuzhiyun        * defined(CONFIG_RKNAND) ||\
316*4882a593Smuzhiyun        * defined(CONFIG_DM_RAMDISK) ||\
317*4882a593Smuzhiyun        * defined(CONFIG_USB_HOST) ||\
318*4882a593Smuzhiyun        * defined(CONFIG_RKNANDC_NAND) ||\
319*4882a593Smuzhiyun        * defined(CONFIG_RKSFC_NAND) ||\
320*4882a593Smuzhiyun        * defined(CONFIG_RKSFC_NOR)
321*4882a593Smuzhiyun        */
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun #if defined(CONFIG_OPTEE_CLIENT) && defined(CONFIG_MMC)
do_test_secure_storage(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])324*4882a593Smuzhiyun static int do_test_secure_storage(cmd_tbl_t *cmdtp, int flag,
325*4882a593Smuzhiyun 				  int argc, char *const argv[])
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun 	return run_command("mmc testsecurestorage", 0);
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun #endif
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) && \
332*4882a593Smuzhiyun 	!defined(CONFIG_SPL_BUILD)
do_test_env(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])333*4882a593Smuzhiyun static int do_test_env(cmd_tbl_t *cmdtp, int flag,
334*4882a593Smuzhiyun 		       int argc, char *const argv[])
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun 	int ret;
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	ret = env_save();
339*4882a593Smuzhiyun 	if (ret) {
340*4882a593Smuzhiyun 		ut_err("env: failed to save, ret=%d\n", ret);
341*4882a593Smuzhiyun 		return ret;
342*4882a593Smuzhiyun 	}
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 	return env_load();
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun #endif
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION
do_test_vendor(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])349*4882a593Smuzhiyun static int do_test_vendor(cmd_tbl_t *cmdtp, int flag,
350*4882a593Smuzhiyun 			  int argc, char *const argv[])
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun 	return vendor_storage_test();
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun #endif
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_EFUSE
do_test_efuse(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])357*4882a593Smuzhiyun static int do_test_efuse(cmd_tbl_t *cmdtp, int flag,
358*4882a593Smuzhiyun 			 int argc, char *const argv[])
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun 	struct udevice *dev;
361*4882a593Smuzhiyun 	u8 fuses[128] = {0};
362*4882a593Smuzhiyun 	int ret;
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	ret = uclass_get_device(UCLASS_MISC, 0, &dev);
365*4882a593Smuzhiyun 	if (ret) {
366*4882a593Smuzhiyun 		ut_err("efuse: failed to get device, ret=%d\n", ret);
367*4882a593Smuzhiyun 		return 0;
368*4882a593Smuzhiyun 	}
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 	ret = misc_read(dev, 0, &fuses, sizeof(fuses));
371*4882a593Smuzhiyun 	if (ret) {
372*4882a593Smuzhiyun 		ut_err("efuse: failed to read, ret=%d\n", ret);
373*4882a593Smuzhiyun 		return 0;
374*4882a593Smuzhiyun 	}
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	printf("Efuse-content:\n");
377*4882a593Smuzhiyun 	print_buffer(0, fuses, 1, 128, 16);
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 	return 0;
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun #endif
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_OTP
do_test_otp(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])384*4882a593Smuzhiyun static int do_test_otp(cmd_tbl_t *cmdtp, int flag,
385*4882a593Smuzhiyun 		       int argc, char *const argv[])
386*4882a593Smuzhiyun {
387*4882a593Smuzhiyun 	struct udevice *dev;
388*4882a593Smuzhiyun 	u8 otps[64] = {0};
389*4882a593Smuzhiyun 	int ret;
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	/* retrieve the device */
392*4882a593Smuzhiyun 	ret = uclass_get_device_by_driver(UCLASS_MISC, 0, &dev);
393*4882a593Smuzhiyun 	if (ret) {
394*4882a593Smuzhiyun 		ut_err("otp: failed to get device, ret=%d\n", ret);
395*4882a593Smuzhiyun 		return 0;
396*4882a593Smuzhiyun 	}
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	ret = misc_read(dev, 0, &otps, sizeof(otps));
399*4882a593Smuzhiyun 	if (ret) {
400*4882a593Smuzhiyun 		ut_err("otp: failed to read, ret=%d\n", ret);
401*4882a593Smuzhiyun 		return 0;
402*4882a593Smuzhiyun 	}
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	printf("Otp-content:\n");
405*4882a593Smuzhiyun 	print_buffer(0, otps, 1, 64, 16);
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun 	return 0;
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun #endif
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun #ifdef CONFIG_PARTITIONS
do_test_part(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])412*4882a593Smuzhiyun static int do_test_part(cmd_tbl_t *cmdtp, int flag,
413*4882a593Smuzhiyun 			int argc, char *const argv[])
414*4882a593Smuzhiyun {
415*4882a593Smuzhiyun 	return run_command("part list ${devtype} ${devnum}", 0);
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun #endif
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun #ifdef CONFIG_USB_HOST
do_test_usb(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])420*4882a593Smuzhiyun static int do_test_usb(cmd_tbl_t *cmdtp, int flag,
421*4882a593Smuzhiyun 		       int argc, char *const argv[])
422*4882a593Smuzhiyun {
423*4882a593Smuzhiyun 	run_command("usb start", 0);
424*4882a593Smuzhiyun 	return do_test_storage(cmdtp, flag, argc, argv, "usb", "0", "usb0");
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun #endif
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun static cmd_tbl_t sub_cmd[] = {
429*4882a593Smuzhiyun #ifdef CONFIG_DM_RAMDISK
430*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(blk, 0),
431*4882a593Smuzhiyun #endif
432*4882a593Smuzhiyun #ifdef CONFIG_MMC
433*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(emmc, 0),
434*4882a593Smuzhiyun #endif
435*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_EFUSE
436*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(efuse, 0),
437*4882a593Smuzhiyun #endif
438*4882a593Smuzhiyun #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) && \
439*4882a593Smuzhiyun 	!defined(CONFIG_SPL_BUILD)
440*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(env, 0),
441*4882a593Smuzhiyun #endif
442*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_OTP
443*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(otp, 0),
444*4882a593Smuzhiyun #endif
445*4882a593Smuzhiyun #if defined(CONFIG_RKNAND) || defined(CONFIG_RKNANDC_NAND)
446*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(rknand, 0),
447*4882a593Smuzhiyun #endif
448*4882a593Smuzhiyun #ifdef CONFIG_RKSFC_NAND
449*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(rkflash_spinand, 0),
450*4882a593Smuzhiyun #endif
451*4882a593Smuzhiyun #ifdef CONFIG_RKSFC_NOR
452*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(rkflash_spinor, 0),
453*4882a593Smuzhiyun #endif
454*4882a593Smuzhiyun #if defined(CONFIG_OPTEE_CLIENT) && defined(CONFIG_MMC)
455*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(secure_storage, 0),
456*4882a593Smuzhiyun #endif
457*4882a593Smuzhiyun #ifdef CONFIG_PARTITIONS
458*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(part, 0),
459*4882a593Smuzhiyun #endif
460*4882a593Smuzhiyun #ifdef CONFIG_USB_HOST
461*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(usb, 0),
462*4882a593Smuzhiyun #endif
463*4882a593Smuzhiyun #ifdef CONFIG_MMC
464*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(sdmmc, 0),
465*4882a593Smuzhiyun #endif
466*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION
467*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(vendor, 0),
468*4882a593Smuzhiyun #endif
469*4882a593Smuzhiyun #ifdef CONFIG_SCSI
470*4882a593Smuzhiyun 	UNIT_CMD_DEFINE(scsi, 0),
471*4882a593Smuzhiyun #endif
472*4882a593Smuzhiyun };
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun static char sub_cmd_help[] =
475*4882a593Smuzhiyun #ifdef CONFIG_DM_RAMDISK
476*4882a593Smuzhiyun "    [.] rktest blk                         - test blk layer read/write\n"
477*4882a593Smuzhiyun #endif
478*4882a593Smuzhiyun #ifdef CONFIG_MMC
479*4882a593Smuzhiyun "    [.] rktest emmc                        - test emmc read/write speed\n"
480*4882a593Smuzhiyun "    [.] rktest sdmmc                       - test sd card and fat fs read/write\n"
481*4882a593Smuzhiyun #endif
482*4882a593Smuzhiyun #if defined(CONFIG_RKNAND) || defined(CONFIG_RKNANDC_NAND)
483*4882a593Smuzhiyun "    [.] rktest rknand                      - test rknand read/write speed\n"
484*4882a593Smuzhiyun #endif
485*4882a593Smuzhiyun #ifdef CONFIG_RKSFC_NAND
486*4882a593Smuzhiyun "    [.] rktest rkflash_spinand             - test RKFLASH DM driver spinand read/write speed\n"
487*4882a593Smuzhiyun #endif
488*4882a593Smuzhiyun #ifdef CONFIG_RKSFC_NOR
489*4882a593Smuzhiyun "    [.] rktest rkflash_spinor              - test RKFLASH DM driver read/write speed\n"
490*4882a593Smuzhiyun #endif
491*4882a593Smuzhiyun #if defined(CONFIG_OPTEE_CLIENT) && defined(CONFIG_MMC)
492*4882a593Smuzhiyun "    [.] rktest secure_storage              - test secure storage\n"
493*4882a593Smuzhiyun #endif
494*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION
495*4882a593Smuzhiyun "    [.] rktest vendor                      - test vendor storage read/write\n"
496*4882a593Smuzhiyun #endif
497*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_EFUSE
498*4882a593Smuzhiyun "    [.] rktest efuse                       - test efuse, dump content\n"
499*4882a593Smuzhiyun #endif
500*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_OTP
501*4882a593Smuzhiyun "    [.] rktest otp                         - test otp, dump content\n"
502*4882a593Smuzhiyun #endif
503*4882a593Smuzhiyun #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) && \
504*4882a593Smuzhiyun 	!defined(CONFIG_SPL_BUILD)
505*4882a593Smuzhiyun "    [.] rktest env                         - test save env to storage\n"
506*4882a593Smuzhiyun #endif
507*4882a593Smuzhiyun #ifdef CONFIG_PARTITIONS
508*4882a593Smuzhiyun "    [.] rktest part                        - test part list\n"
509*4882a593Smuzhiyun #endif
510*4882a593Smuzhiyun #ifdef CONFIG_USB_HOST
511*4882a593Smuzhiyun "    [.] rktest usb                         - test usb disk\n"
512*4882a593Smuzhiyun #endif
513*4882a593Smuzhiyun #ifdef CONFIG_SCSI
514*4882a593Smuzhiyun "    [.] rktest scsi                        - test sata disk\n"
515*4882a593Smuzhiyun #endif
516*4882a593Smuzhiyun ;
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun const struct cmd_group cmd_grp_storage = {
519*4882a593Smuzhiyun 	.id	= TEST_ID_STORAGE,
520*4882a593Smuzhiyun 	.help	= sub_cmd_help,
521*4882a593Smuzhiyun 	.cmd	= sub_cmd,
522*4882a593Smuzhiyun 	.cmd_n	= ARRAY_SIZE(sub_cmd),
523*4882a593Smuzhiyun };
524