xref: /rk3399_rockchip-uboot/drivers/rkflash/rkflash_debug.c (revision c84f0ed80a3fa9a7c470bbcb6747b763280506fa)
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>
9*c84f0ed8SJon Lin #include <hexdump.h>
10ad309a88SDingqiang Lin 
11ad309a88SDingqiang Lin #include "rkflash_debug.h"
12ad309a88SDingqiang Lin #include "rkflash_blk.h"
136096696bSDingqiang Lin #include "boot_rkimg.h"
14ad309a88SDingqiang Lin 
15*c84f0ed8SJon Lin static unsigned int rkflash_debug;
16*c84f0ed8SJon Lin 
17*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_dio(const char *fmt, ...)
18ad309a88SDingqiang Lin {
19*c84f0ed8SJon Lin 	int nret = 0;
20*c84f0ed8SJon Lin #if PRINT_SWI_CON_IO
21*c84f0ed8SJon Lin 	if (rkflash_debug & PRINT_BIT_CON_IO)  {
22*c84f0ed8SJon Lin 		va_list args;
23ad309a88SDingqiang Lin 
24*c84f0ed8SJon Lin 		if (!fmt)
25*c84f0ed8SJon Lin 			return nret;
26ad309a88SDingqiang Lin 
27*c84f0ed8SJon Lin 		va_start(args, fmt);
28*c84f0ed8SJon Lin 		nret = vprintf(fmt, args);
29*c84f0ed8SJon Lin 		va_end(args);
30ad309a88SDingqiang Lin 	}
31*c84f0ed8SJon Lin #endif
32*c84f0ed8SJon Lin 	return nret;
33ad309a88SDingqiang Lin }
34*c84f0ed8SJon Lin 
35*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_bio(const char *fmt, ...)
36*c84f0ed8SJon Lin {
37*c84f0ed8SJon Lin 	int nret = 0;
38*c84f0ed8SJon Lin #if PRINT_SWI_BLK_IO
39*c84f0ed8SJon Lin 	if (rkflash_debug & PRINT_BIT_BLK_IO)  {
40*c84f0ed8SJon Lin 		va_list args;
41*c84f0ed8SJon Lin 
42*c84f0ed8SJon Lin 		if (!fmt)
43*c84f0ed8SJon Lin 			return nret;
44*c84f0ed8SJon Lin 
45*c84f0ed8SJon Lin 		va_start(args, fmt);
46*c84f0ed8SJon Lin 		nret = vprintf(fmt, args);
47*c84f0ed8SJon Lin 		va_end(args);
48*c84f0ed8SJon Lin 	}
49*c84f0ed8SJon Lin #endif
50*c84f0ed8SJon Lin 	return nret;
51*c84f0ed8SJon Lin }
52*c84f0ed8SJon Lin 
53*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_info(const char *fmt, ...)
54*c84f0ed8SJon Lin {
55*c84f0ed8SJon Lin 	int nret = 0;
56*c84f0ed8SJon Lin #if PRINT_SWI_INFO
57*c84f0ed8SJon Lin 	va_list args;
58*c84f0ed8SJon Lin 
59*c84f0ed8SJon Lin 	if (!fmt)
60*c84f0ed8SJon Lin 		return nret;
61*c84f0ed8SJon Lin 
62*c84f0ed8SJon Lin 	va_start(args, fmt);
63*c84f0ed8SJon Lin 	nret = vprintf(fmt, args);
64*c84f0ed8SJon Lin 	va_end(args);
65*c84f0ed8SJon Lin #endif
66*c84f0ed8SJon Lin 	return nret;
67*c84f0ed8SJon Lin }
68*c84f0ed8SJon Lin 
69*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_error(const char *fmt, ...)
70*c84f0ed8SJon Lin {
71*c84f0ed8SJon Lin 	int nret = 0;
72*c84f0ed8SJon Lin #if PRINT_SWI_ERROR
73*c84f0ed8SJon Lin 	va_list args;
74*c84f0ed8SJon Lin 
75*c84f0ed8SJon Lin 	if (!fmt)
76*c84f0ed8SJon Lin 		return nret;
77*c84f0ed8SJon Lin 
78*c84f0ed8SJon Lin 	va_start(args, fmt);
79*c84f0ed8SJon Lin 	nret = vprintf(fmt, args);
80*c84f0ed8SJon Lin 	va_end(args);
81*c84f0ed8SJon Lin #endif
82*c84f0ed8SJon Lin 	return nret;
83*c84f0ed8SJon Lin }
84*c84f0ed8SJon Lin 
85*c84f0ed8SJon Lin void rkflash_print_hex(const char *s, const void *buf, int w, size_t len)
86*c84f0ed8SJon Lin {
87*c84f0ed8SJon Lin #if PRINT_SWI_ERROR
88*c84f0ed8SJon Lin 	print_hex_dump(s, DUMP_PREFIX_OFFSET, 4, w,
89*c84f0ed8SJon Lin 		       buf, (len) * w, 0);
90*c84f0ed8SJon Lin #endif
91ad309a88SDingqiang Lin }
92ad309a88SDingqiang Lin 
93ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN)
94ad309a88SDingqiang Lin #define max_test_sector 64
95ba0501acSDingqiang Lin static u8 pwrite[max_test_sector * 512];
96ba0501acSDingqiang Lin static u8 pread[max_test_sector * 512];
97ba0501acSDingqiang Lin static u32 *pwrite32;
98ad309a88SDingqiang Lin void blk_stress_test(struct udevice *udev)
99ad309a88SDingqiang Lin {
1006096696bSDingqiang Lin 	struct blk_desc *block_dev = rockchip_get_bootdev();
101ad309a88SDingqiang Lin 	u16 i, j, loop = 0;
1025238e9abSJon Lin 	u32 test_end_lba, test_begin_lba;
1036096696bSDingqiang Lin 	u32 test_lba;
104ad309a88SDingqiang Lin 	u16 test_sec_count = 1;
105ad309a88SDingqiang Lin 	u16 print_flag;
106ad309a88SDingqiang Lin 
1076096696bSDingqiang Lin 	if (!block_dev) {
108ad309a88SDingqiang Lin 		printf("device unknown\n");
109ad309a88SDingqiang Lin 		return;
110ad309a88SDingqiang Lin 	}
111ad309a88SDingqiang Lin 
1126096696bSDingqiang Lin 	if (block_dev->if_type == IF_TYPE_SPINOR)
1135238e9abSJon Lin 		test_begin_lba = 0x4000;
1146096696bSDingqiang Lin 	else
1155238e9abSJon Lin 		test_begin_lba = 0x8000;
1166096696bSDingqiang Lin 
1176096696bSDingqiang Lin 	test_end_lba = block_dev->lba;
118ad309a88SDingqiang Lin 	pwrite32 = (u32 *)pwrite;
119ad309a88SDingqiang Lin 	for (i = 0; i < (max_test_sector * 512); i++)
120ad309a88SDingqiang Lin 		pwrite[i] = i;
1215238e9abSJon Lin 	for (loop = 0; loop < 100; loop++) {
1225238e9abSJon Lin 		test_lba = test_begin_lba;
123ad309a88SDingqiang Lin 		printf("---------Test loop = %d---------\n", loop);
124ad309a88SDingqiang Lin 		printf("---------Test ftl write---------\n");
125ad309a88SDingqiang Lin 		test_sec_count = 1;
126ad309a88SDingqiang Lin 		printf("test_end_lba = %x\n", test_end_lba);
127ad309a88SDingqiang Lin 		printf("test_lba = %x\n", test_lba);
1286096696bSDingqiang Lin 		for (; (test_lba + test_sec_count) < test_end_lba;) {
129ad309a88SDingqiang Lin 			pwrite32[0] = test_lba;
130ad309a88SDingqiang Lin 			blk_dwrite(block_dev, test_lba, test_sec_count, pwrite);
131ad309a88SDingqiang Lin 			blk_dread(block_dev, test_lba, test_sec_count, pread);
132ad309a88SDingqiang Lin 			for (j = 0; j < test_sec_count * 512; j++) {
133ad309a88SDingqiang Lin 				if (pwrite[j] != pread[j]) {
1345238e9abSJon Lin 					printf("rkflash stress test fail\n");
135ad309a88SDingqiang Lin 					rkflash_print_hex("w:",
136ad309a88SDingqiang Lin 							  pwrite,
137ad309a88SDingqiang Lin 							  4,
138ad309a88SDingqiang Lin 							  test_sec_count * 128);
139ad309a88SDingqiang Lin 					rkflash_print_hex("r:",
140ad309a88SDingqiang Lin 							  pread,
141ad309a88SDingqiang Lin 							  4,
142ad309a88SDingqiang Lin 							  test_sec_count * 128);
143ad309a88SDingqiang Lin 					printf("r=%x, n=%x, w=%x, r=%x\n",
144ad309a88SDingqiang Lin 					       test_lba,
145ad309a88SDingqiang Lin 					       j,
146ad309a88SDingqiang Lin 					       pwrite[j],
147ad309a88SDingqiang Lin 					       pread[j]);
148ad309a88SDingqiang Lin 					while (1)
149ad309a88SDingqiang Lin 						;
150ad309a88SDingqiang Lin 				}
151ad309a88SDingqiang Lin 			}
152ad309a88SDingqiang Lin 			print_flag = test_lba & 0x1FF;
153ad309a88SDingqiang Lin 			if (print_flag < test_sec_count)
154ad309a88SDingqiang Lin 				printf("test_lba = %x\n", test_lba);
155ad309a88SDingqiang Lin 			test_lba += test_sec_count;
156ad309a88SDingqiang Lin 			test_sec_count++;
157ad309a88SDingqiang Lin 			if (test_sec_count > max_test_sector)
158ad309a88SDingqiang Lin 				test_sec_count = 1;
159ad309a88SDingqiang Lin 		}
160ad309a88SDingqiang Lin 		printf("---------Test ftl check---------\n");
161ad309a88SDingqiang Lin 
1625238e9abSJon Lin 		test_lba = test_begin_lba;
163ad309a88SDingqiang Lin 		test_sec_count = 1;
1646096696bSDingqiang Lin 		for (; (test_lba + test_sec_count) < test_end_lba;) {
165ad309a88SDingqiang Lin 			pwrite32[0] = test_lba;
166ad309a88SDingqiang Lin 			blk_dread(block_dev, test_lba, test_sec_count, pread);
167ad309a88SDingqiang Lin 			print_flag = test_lba & 0x7FF;
168ad309a88SDingqiang Lin 			if (print_flag < test_sec_count)
169ad309a88SDingqiang Lin 				printf("test_lba = %x\n", test_lba);
170ad309a88SDingqiang Lin 
171ad309a88SDingqiang Lin 			for (j = 0; j < test_sec_count * 512; j++) {
172ad309a88SDingqiang Lin 				if (pwrite[j] != pread[j]) {
1735238e9abSJon Lin 					printf("rkflash stress test fail\n");
174ad309a88SDingqiang Lin 					printf("r=%x, n=%x, w=%x, r=%x\n",
175ad309a88SDingqiang Lin 					       test_lba,
176ad309a88SDingqiang Lin 					       j,
177ad309a88SDingqiang Lin 					       pwrite[j],
178ad309a88SDingqiang Lin 					       pread[j]);
1795238e9abSJon Lin 					while (1)
1805238e9abSJon Lin 						;
181ad309a88SDingqiang Lin 				}
182ad309a88SDingqiang Lin 			}
183ad309a88SDingqiang Lin 			test_lba += test_sec_count;
184ad309a88SDingqiang Lin 			test_sec_count++;
185ad309a88SDingqiang Lin 			if (test_sec_count > max_test_sector)
186ad309a88SDingqiang Lin 				test_sec_count = 1;
187ad309a88SDingqiang Lin 		}
188ad309a88SDingqiang Lin 	}
189ad309a88SDingqiang Lin 	printf("---------Test end---------\n");
190ad309a88SDingqiang Lin 	/* while(1); */
191ad309a88SDingqiang Lin }
192ad309a88SDingqiang Lin #endif
193ad309a88SDingqiang Lin 
194ad309a88SDingqiang Lin void rkflash_test(struct udevice *udev)
195ad309a88SDingqiang Lin {
196ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN)
197ad309a88SDingqiang Lin 	blk_stress_test(udev);
198ad309a88SDingqiang Lin #endif
199ad309a88SDingqiang Lin }
200ad309a88SDingqiang Lin 
201