xref: /rk3399_rockchip-uboot/drivers/rkflash/rkflash_debug.c (revision 472460eca77c001e1f4efcc0bbfb0a184aef5572)
1ad309a88SDingqiang Lin /*
2ad309a88SDingqiang Lin  * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
3ad309a88SDingqiang Lin  *
4ba0501acSDingqiang Lin  * SPDX-License-Identifier:	GPL-2.0
5ad309a88SDingqiang Lin  */
6ad309a88SDingqiang Lin 
7ad309a88SDingqiang Lin #include <blk.h>
8*c84f0ed8SJon Lin #include <common.h>
9ad309a88SDingqiang Lin 
10ad309a88SDingqiang Lin #include "rkflash_debug.h"
11ad309a88SDingqiang Lin #include "rkflash_blk.h"
126096696bSDingqiang Lin #include "boot_rkimg.h"
13ad309a88SDingqiang Lin 
14*c84f0ed8SJon Lin static unsigned int rkflash_debug;
15*c84f0ed8SJon Lin 
rkflash_print_dio(const char * fmt,...)16*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_dio(const char *fmt, ...)
17ad309a88SDingqiang Lin {
18*c84f0ed8SJon Lin 	int nret = 0;
19*c84f0ed8SJon Lin #if PRINT_SWI_CON_IO
20*c84f0ed8SJon Lin 	if (rkflash_debug & PRINT_BIT_CON_IO)  {
21*c84f0ed8SJon Lin 		va_list args;
22ad309a88SDingqiang Lin 
23*c84f0ed8SJon Lin 		if (!fmt)
24*c84f0ed8SJon Lin 			return nret;
25ad309a88SDingqiang Lin 
26*c84f0ed8SJon Lin 		va_start(args, fmt);
27*c84f0ed8SJon Lin 		nret = vprintf(fmt, args);
28*c84f0ed8SJon Lin 		va_end(args);
29ad309a88SDingqiang Lin 	}
30*c84f0ed8SJon Lin #endif
31*c84f0ed8SJon Lin 	return nret;
32ad309a88SDingqiang Lin }
33*c84f0ed8SJon Lin 
rkflash_print_bio(const char * fmt,...)34*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_bio(const char *fmt, ...)
35*c84f0ed8SJon Lin {
36*c84f0ed8SJon Lin 	int nret = 0;
37*c84f0ed8SJon Lin #if PRINT_SWI_BLK_IO
38*c84f0ed8SJon Lin 	if (rkflash_debug & PRINT_BIT_BLK_IO)  {
39*c84f0ed8SJon Lin 		va_list args;
40*c84f0ed8SJon Lin 
41*c84f0ed8SJon Lin 		if (!fmt)
42*c84f0ed8SJon Lin 			return nret;
43*c84f0ed8SJon Lin 
44*c84f0ed8SJon Lin 		va_start(args, fmt);
45*c84f0ed8SJon Lin 		nret = vprintf(fmt, args);
46*c84f0ed8SJon Lin 		va_end(args);
47*c84f0ed8SJon Lin 	}
48*c84f0ed8SJon Lin #endif
49*c84f0ed8SJon Lin 	return nret;
50*c84f0ed8SJon Lin }
51*c84f0ed8SJon Lin 
rkflash_print_info(const char * fmt,...)52*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_info(const char *fmt, ...)
53*c84f0ed8SJon Lin {
54*c84f0ed8SJon Lin 	int nret = 0;
55*c84f0ed8SJon Lin #if PRINT_SWI_INFO
56*c84f0ed8SJon Lin 	va_list args;
57*c84f0ed8SJon Lin 
58*c84f0ed8SJon Lin 	if (!fmt)
59*c84f0ed8SJon Lin 		return nret;
60*c84f0ed8SJon Lin 
61*c84f0ed8SJon Lin 	va_start(args, fmt);
62*c84f0ed8SJon Lin 	nret = vprintf(fmt, args);
63*c84f0ed8SJon Lin 	va_end(args);
64*c84f0ed8SJon Lin #endif
65*c84f0ed8SJon Lin 	return nret;
66*c84f0ed8SJon Lin }
67*c84f0ed8SJon Lin 
rkflash_print_error(const char * fmt,...)68*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_error(const char *fmt, ...)
69*c84f0ed8SJon Lin {
70*c84f0ed8SJon Lin 	int nret = 0;
71*c84f0ed8SJon Lin #if PRINT_SWI_ERROR
72*c84f0ed8SJon Lin 	va_list args;
73*c84f0ed8SJon Lin 
74*c84f0ed8SJon Lin 	if (!fmt)
75*c84f0ed8SJon Lin 		return nret;
76*c84f0ed8SJon Lin 
77*c84f0ed8SJon Lin 	va_start(args, fmt);
78*c84f0ed8SJon Lin 	nret = vprintf(fmt, args);
79*c84f0ed8SJon Lin 	va_end(args);
80*c84f0ed8SJon Lin #endif
81*c84f0ed8SJon Lin 	return nret;
82*c84f0ed8SJon Lin }
83*c84f0ed8SJon Lin 
rkflash_print_hex(const char * s,const void * buf,int w,size_t len)84*c84f0ed8SJon Lin void rkflash_print_hex(const char *s, const void *buf, int w, size_t len)
85*c84f0ed8SJon Lin {
86ad309a88SDingqiang Lin }
87ad309a88SDingqiang Lin 
88ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN)
89ad309a88SDingqiang Lin #define max_test_sector 64
90ba0501acSDingqiang Lin static u8 pwrite[max_test_sector * 512];
91ba0501acSDingqiang Lin static u8 pread[max_test_sector * 512];
92ba0501acSDingqiang Lin static u32 *pwrite32;
blk_stress_test(struct udevice * udev)93ad309a88SDingqiang Lin void blk_stress_test(struct udevice *udev)
94ad309a88SDingqiang Lin {
956096696bSDingqiang Lin 	struct blk_desc *block_dev = rockchip_get_bootdev();
96ad309a88SDingqiang Lin 	u16 i, j, loop = 0;
975238e9abSJon Lin 	u32 test_end_lba, test_begin_lba;
986096696bSDingqiang Lin 	u32 test_lba;
99ad309a88SDingqiang Lin 	u16 test_sec_count = 1;
100ad309a88SDingqiang Lin 	u16 print_flag;
101ad309a88SDingqiang Lin 
1026096696bSDingqiang Lin 	if (!block_dev) {
103ad309a88SDingqiang Lin 		printf("device unknown\n");
104ad309a88SDingqiang Lin 		return;
105ad309a88SDingqiang Lin 	}
106ad309a88SDingqiang Lin 
1076096696bSDingqiang Lin 	if (block_dev->if_type == IF_TYPE_SPINOR)
1085238e9abSJon Lin 		test_begin_lba = 0x4000;
1096096696bSDingqiang Lin 	else
1105238e9abSJon Lin 		test_begin_lba = 0x8000;
1116096696bSDingqiang Lin 
1126096696bSDingqiang Lin 	test_end_lba = block_dev->lba;
113ad309a88SDingqiang Lin 	pwrite32 = (u32 *)pwrite;
114ad309a88SDingqiang Lin 	for (i = 0; i < (max_test_sector * 512); i++)
115ad309a88SDingqiang Lin 		pwrite[i] = i;
1165238e9abSJon Lin 	for (loop = 0; loop < 100; loop++) {
1175238e9abSJon Lin 		test_lba = test_begin_lba;
118ad309a88SDingqiang Lin 		printf("---------Test loop = %d---------\n", loop);
119ad309a88SDingqiang Lin 		printf("---------Test ftl write---------\n");
120ad309a88SDingqiang Lin 		test_sec_count = 1;
121ad309a88SDingqiang Lin 		printf("test_end_lba = %x\n", test_end_lba);
122ad309a88SDingqiang Lin 		printf("test_lba = %x\n", test_lba);
1236096696bSDingqiang Lin 		for (; (test_lba + test_sec_count) < test_end_lba;) {
124ad309a88SDingqiang Lin 			pwrite32[0] = test_lba;
125ad309a88SDingqiang Lin 			blk_dwrite(block_dev, test_lba, test_sec_count, pwrite);
126ad309a88SDingqiang Lin 			blk_dread(block_dev, test_lba, test_sec_count, pread);
127ad309a88SDingqiang Lin 			for (j = 0; j < test_sec_count * 512; j++) {
128ad309a88SDingqiang Lin 				if (pwrite[j] != pread[j]) {
1295238e9abSJon Lin 					printf("rkflash stress test fail\n");
130ad309a88SDingqiang Lin 					rkflash_print_hex("w:",
131ad309a88SDingqiang Lin 							  pwrite,
132ad309a88SDingqiang Lin 							  4,
133ad309a88SDingqiang Lin 							  test_sec_count * 128);
134ad309a88SDingqiang Lin 					rkflash_print_hex("r:",
135ad309a88SDingqiang Lin 							  pread,
136ad309a88SDingqiang Lin 							  4,
137ad309a88SDingqiang Lin 							  test_sec_count * 128);
138ad309a88SDingqiang Lin 					printf("r=%x, n=%x, w=%x, r=%x\n",
139ad309a88SDingqiang Lin 					       test_lba,
140ad309a88SDingqiang Lin 					       j,
141ad309a88SDingqiang Lin 					       pwrite[j],
142ad309a88SDingqiang Lin 					       pread[j]);
143ad309a88SDingqiang Lin 					while (1)
144ad309a88SDingqiang Lin 						;
145ad309a88SDingqiang Lin 				}
146ad309a88SDingqiang Lin 			}
147ad309a88SDingqiang Lin 			print_flag = test_lba & 0x1FF;
148ad309a88SDingqiang Lin 			if (print_flag < test_sec_count)
149ad309a88SDingqiang Lin 				printf("test_lba = %x\n", test_lba);
150ad309a88SDingqiang Lin 			test_lba += test_sec_count;
151ad309a88SDingqiang Lin 			test_sec_count++;
152ad309a88SDingqiang Lin 			if (test_sec_count > max_test_sector)
153ad309a88SDingqiang Lin 				test_sec_count = 1;
154ad309a88SDingqiang Lin 		}
155ad309a88SDingqiang Lin 		printf("---------Test ftl check---------\n");
156ad309a88SDingqiang Lin 
1575238e9abSJon Lin 		test_lba = test_begin_lba;
158ad309a88SDingqiang Lin 		test_sec_count = 1;
1596096696bSDingqiang Lin 		for (; (test_lba + test_sec_count) < test_end_lba;) {
160ad309a88SDingqiang Lin 			pwrite32[0] = test_lba;
161ad309a88SDingqiang Lin 			blk_dread(block_dev, test_lba, test_sec_count, pread);
162ad309a88SDingqiang Lin 			print_flag = test_lba & 0x7FF;
163ad309a88SDingqiang Lin 			if (print_flag < test_sec_count)
164ad309a88SDingqiang Lin 				printf("test_lba = %x\n", test_lba);
165ad309a88SDingqiang Lin 
166ad309a88SDingqiang Lin 			for (j = 0; j < test_sec_count * 512; j++) {
167ad309a88SDingqiang Lin 				if (pwrite[j] != pread[j]) {
1685238e9abSJon Lin 					printf("rkflash stress test fail\n");
169ad309a88SDingqiang Lin 					printf("r=%x, n=%x, w=%x, r=%x\n",
170ad309a88SDingqiang Lin 					       test_lba,
171ad309a88SDingqiang Lin 					       j,
172ad309a88SDingqiang Lin 					       pwrite[j],
173ad309a88SDingqiang Lin 					       pread[j]);
1745238e9abSJon Lin 					while (1)
1755238e9abSJon Lin 						;
176ad309a88SDingqiang Lin 				}
177ad309a88SDingqiang Lin 			}
178ad309a88SDingqiang Lin 			test_lba += test_sec_count;
179ad309a88SDingqiang Lin 			test_sec_count++;
180ad309a88SDingqiang Lin 			if (test_sec_count > max_test_sector)
181ad309a88SDingqiang Lin 				test_sec_count = 1;
182ad309a88SDingqiang Lin 		}
183ad309a88SDingqiang Lin 	}
184ad309a88SDingqiang Lin 	printf("---------Test end---------\n");
185ad309a88SDingqiang Lin 	/* while(1); */
186ad309a88SDingqiang Lin }
187ad309a88SDingqiang Lin #endif
188ad309a88SDingqiang Lin 
rkflash_test(struct udevice * udev)189ad309a88SDingqiang Lin void rkflash_test(struct udevice *udev)
190ad309a88SDingqiang Lin {
191ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN)
192ad309a88SDingqiang Lin 	blk_stress_test(udev);
193ad309a88SDingqiang Lin #endif
194ad309a88SDingqiang Lin }
195ad309a88SDingqiang Lin 
196