xref: /rk3399_rockchip-uboot/drivers/rkflash/rkflash_debug.c (revision ad309a883b81622573c8021d60b4eb676f57d5c2)
1*ad309a88SDingqiang Lin /*
2*ad309a88SDingqiang Lin  * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
3*ad309a88SDingqiang Lin  *
4*ad309a88SDingqiang Lin  * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
5*ad309a88SDingqiang Lin  */
6*ad309a88SDingqiang Lin 
7*ad309a88SDingqiang Lin #include <blk.h>
8*ad309a88SDingqiang Lin 
9*ad309a88SDingqiang Lin #include "rkflash_debug.h"
10*ad309a88SDingqiang Lin #include "rkflash_blk.h"
11*ad309a88SDingqiang Lin 
12*ad309a88SDingqiang Lin void rkflash_print_hex(char *s, void *buf, u32 width, u32 len)
13*ad309a88SDingqiang Lin {
14*ad309a88SDingqiang Lin 	u32 i, j;
15*ad309a88SDingqiang Lin 	char *p8 = (char *)buf;
16*ad309a88SDingqiang Lin 	short *p16 = (short *)buf;
17*ad309a88SDingqiang Lin 	u32 *p32 = (u32 *)buf;
18*ad309a88SDingqiang Lin 
19*ad309a88SDingqiang Lin 	j = 0;
20*ad309a88SDingqiang Lin 	for (i = 0; i < len; i++) {
21*ad309a88SDingqiang Lin 		if (j == 0)
22*ad309a88SDingqiang Lin 			printf("%s 0x%x:", s, i * width);
23*ad309a88SDingqiang Lin 
24*ad309a88SDingqiang Lin 		if (width == 4)
25*ad309a88SDingqiang Lin 			printf("%x ", p32[i]);
26*ad309a88SDingqiang Lin 		else if (width == 2)
27*ad309a88SDingqiang Lin 			printf("%x ", p16[i]);
28*ad309a88SDingqiang Lin 		else
29*ad309a88SDingqiang Lin 			printf("%02x ", p8[i]);
30*ad309a88SDingqiang Lin 		if (++j >= 16) {
31*ad309a88SDingqiang Lin 			j = 0;
32*ad309a88SDingqiang Lin 			printf("\n");
33*ad309a88SDingqiang Lin 		}
34*ad309a88SDingqiang Lin 	}
35*ad309a88SDingqiang Lin 	printf("\n");
36*ad309a88SDingqiang Lin }
37*ad309a88SDingqiang Lin 
38*ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN)
39*ad309a88SDingqiang Lin #define max_test_sector 64
40*ad309a88SDingqiang Lin u8 pwrite[max_test_sector * 512];
41*ad309a88SDingqiang Lin u8 pread[max_test_sector * 512];
42*ad309a88SDingqiang Lin u32 *pwrite32;
43*ad309a88SDingqiang Lin void blk_stress_test(struct udevice *udev)
44*ad309a88SDingqiang Lin {
45*ad309a88SDingqiang Lin 	struct blk_desc *block_dev = dev_get_uclass_platdata(udev);
46*ad309a88SDingqiang Lin 	struct rkflash_info *priv = dev_get_priv(udev->parent);
47*ad309a88SDingqiang Lin 	u16 i, j, loop = 0;
48*ad309a88SDingqiang Lin 	u32 test_end_lba;
49*ad309a88SDingqiang Lin 	u32 test_lba = 0;
50*ad309a88SDingqiang Lin 	u16 test_sec_count = 1;
51*ad309a88SDingqiang Lin 	u16 print_flag;
52*ad309a88SDingqiang Lin 
53*ad309a88SDingqiang Lin 	if (!priv || !block_dev) {
54*ad309a88SDingqiang Lin 		printf("device unknown\n");
55*ad309a88SDingqiang Lin 		return;
56*ad309a88SDingqiang Lin 	}
57*ad309a88SDingqiang Lin 
58*ad309a88SDingqiang Lin 	test_end_lba = priv->density;
59*ad309a88SDingqiang Lin 	pwrite32 = (u32 *)pwrite;
60*ad309a88SDingqiang Lin 	for (i = 0; i < (max_test_sector * 512); i++)
61*ad309a88SDingqiang Lin 		pwrite[i] = i;
62*ad309a88SDingqiang Lin 	for (loop = 0; loop < 10; loop++) {
63*ad309a88SDingqiang Lin 		printf("---------Test loop = %d---------\n", loop);
64*ad309a88SDingqiang Lin 		printf("---------Test ftl write---------\n");
65*ad309a88SDingqiang Lin 		test_sec_count = 1;
66*ad309a88SDingqiang Lin 		printf("test_end_lba = %x\n", test_end_lba);
67*ad309a88SDingqiang Lin 		printf("test_lba = %x\n", test_lba);
68*ad309a88SDingqiang Lin 		for (test_lba = 0;
69*ad309a88SDingqiang Lin 		     (test_lba + test_sec_count) < test_end_lba;) {
70*ad309a88SDingqiang Lin 			pwrite32[0] = test_lba;
71*ad309a88SDingqiang Lin 			blk_dwrite(block_dev, test_lba, test_sec_count, pwrite);
72*ad309a88SDingqiang Lin 			blk_dread(block_dev, test_lba, test_sec_count, pread);
73*ad309a88SDingqiang Lin 			for (j = 0; j < test_sec_count * 512; j++) {
74*ad309a88SDingqiang Lin 				if (pwrite[j] != pread[j]) {
75*ad309a88SDingqiang Lin 					rkflash_print_hex("w:",
76*ad309a88SDingqiang Lin 							  pwrite,
77*ad309a88SDingqiang Lin 							  4,
78*ad309a88SDingqiang Lin 							  test_sec_count * 128);
79*ad309a88SDingqiang Lin 					rkflash_print_hex("r:",
80*ad309a88SDingqiang Lin 							  pread,
81*ad309a88SDingqiang Lin 							  4,
82*ad309a88SDingqiang Lin 							  test_sec_count * 128);
83*ad309a88SDingqiang Lin 					printf("r=%x, n=%x, w=%x, r=%x\n",
84*ad309a88SDingqiang Lin 					       test_lba,
85*ad309a88SDingqiang Lin 					       j,
86*ad309a88SDingqiang Lin 					       pwrite[j],
87*ad309a88SDingqiang Lin 					       pread[j]);
88*ad309a88SDingqiang Lin 					while (1)
89*ad309a88SDingqiang Lin 						;
90*ad309a88SDingqiang Lin 					break;
91*ad309a88SDingqiang Lin 				}
92*ad309a88SDingqiang Lin 			}
93*ad309a88SDingqiang Lin 			print_flag = test_lba & 0x1FF;
94*ad309a88SDingqiang Lin 			if (print_flag < test_sec_count)
95*ad309a88SDingqiang Lin 				printf("test_lba = %x\n", test_lba);
96*ad309a88SDingqiang Lin 			test_lba += test_sec_count;
97*ad309a88SDingqiang Lin 			test_sec_count++;
98*ad309a88SDingqiang Lin 			if (test_sec_count > max_test_sector)
99*ad309a88SDingqiang Lin 				test_sec_count = 1;
100*ad309a88SDingqiang Lin 		}
101*ad309a88SDingqiang Lin 		printf("---------Test ftl check---------\n");
102*ad309a88SDingqiang Lin 
103*ad309a88SDingqiang Lin 		test_sec_count = 1;
104*ad309a88SDingqiang Lin 		for (test_lba = 0;
105*ad309a88SDingqiang Lin 		     (test_lba + test_sec_count) < test_end_lba;) {
106*ad309a88SDingqiang Lin 			pwrite32[0] = test_lba;
107*ad309a88SDingqiang Lin 			blk_dread(block_dev, test_lba, test_sec_count, pread);
108*ad309a88SDingqiang Lin 			print_flag = test_lba & 0x7FF;
109*ad309a88SDingqiang Lin 			if (print_flag < test_sec_count)
110*ad309a88SDingqiang Lin 				printf("test_lba = %x\n", test_lba);
111*ad309a88SDingqiang Lin 
112*ad309a88SDingqiang Lin 			for (j = 0; j < test_sec_count * 512; j++) {
113*ad309a88SDingqiang Lin 				if (pwrite[j] != pread[j]) {
114*ad309a88SDingqiang Lin 					printf("r=%x, n=%x, w=%x, r=%x\n",
115*ad309a88SDingqiang Lin 					       test_lba,
116*ad309a88SDingqiang Lin 					       j,
117*ad309a88SDingqiang Lin 					       pwrite[j],
118*ad309a88SDingqiang Lin 					       pread[j]);
119*ad309a88SDingqiang Lin 					/* while(1); */
120*ad309a88SDingqiang Lin 					break;
121*ad309a88SDingqiang Lin 				}
122*ad309a88SDingqiang Lin 			}
123*ad309a88SDingqiang Lin 			test_lba += test_sec_count;
124*ad309a88SDingqiang Lin 			test_sec_count++;
125*ad309a88SDingqiang Lin 			if (test_sec_count > max_test_sector)
126*ad309a88SDingqiang Lin 				test_sec_count = 1;
127*ad309a88SDingqiang Lin 		}
128*ad309a88SDingqiang Lin 	}
129*ad309a88SDingqiang Lin 	printf("---------Test end---------\n");
130*ad309a88SDingqiang Lin 	/* while(1); */
131*ad309a88SDingqiang Lin }
132*ad309a88SDingqiang Lin #endif
133*ad309a88SDingqiang Lin 
134*ad309a88SDingqiang Lin void rkflash_test(struct udevice *udev)
135*ad309a88SDingqiang Lin {
136*ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN)
137*ad309a88SDingqiang Lin 	blk_stress_test(udev);
138*ad309a88SDingqiang Lin #endif
139*ad309a88SDingqiang Lin }
140*ad309a88SDingqiang Lin 
141