xref: /rk3399_rockchip-uboot/drivers/rkflash/rkflash_debug.c (revision 5238e9ab5b0a38c2da2bfd25bbde2e5d41e85f56)
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>
8ad309a88SDingqiang Lin 
9ad309a88SDingqiang Lin #include "rkflash_debug.h"
10ad309a88SDingqiang Lin #include "rkflash_blk.h"
116096696bSDingqiang Lin #include "boot_rkimg.h"
12ad309a88SDingqiang Lin 
13ad309a88SDingqiang Lin void rkflash_print_hex(char *s, void *buf, u32 width, u32 len)
14ad309a88SDingqiang Lin {
15ad309a88SDingqiang Lin 	u32 i, j;
16ad309a88SDingqiang Lin 	char *p8 = (char *)buf;
17ad309a88SDingqiang Lin 	short *p16 = (short *)buf;
18ad309a88SDingqiang Lin 	u32 *p32 = (u32 *)buf;
19ad309a88SDingqiang Lin 
20ad309a88SDingqiang Lin 	j = 0;
21ad309a88SDingqiang Lin 	for (i = 0; i < len; i++) {
22ad309a88SDingqiang Lin 		if (j == 0)
23ad309a88SDingqiang Lin 			printf("%s 0x%x:", s, i * width);
24ad309a88SDingqiang Lin 
25ad309a88SDingqiang Lin 		if (width == 4)
26ad309a88SDingqiang Lin 			printf("%x ", p32[i]);
27ad309a88SDingqiang Lin 		else if (width == 2)
28ad309a88SDingqiang Lin 			printf("%x ", p16[i]);
29ad309a88SDingqiang Lin 		else
30ad309a88SDingqiang Lin 			printf("%02x ", p8[i]);
31ad309a88SDingqiang Lin 		if (++j >= 16) {
32ad309a88SDingqiang Lin 			j = 0;
33ad309a88SDingqiang Lin 			printf("\n");
34ad309a88SDingqiang Lin 		}
35ad309a88SDingqiang Lin 	}
36ad309a88SDingqiang Lin 	printf("\n");
37ad309a88SDingqiang Lin }
38ad309a88SDingqiang Lin 
39ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN)
40ad309a88SDingqiang Lin #define max_test_sector 64
41ba0501acSDingqiang Lin static u8 pwrite[max_test_sector * 512];
42ba0501acSDingqiang Lin static u8 pread[max_test_sector * 512];
43ba0501acSDingqiang Lin static u32 *pwrite32;
44ad309a88SDingqiang Lin void blk_stress_test(struct udevice *udev)
45ad309a88SDingqiang Lin {
466096696bSDingqiang Lin 	struct blk_desc *block_dev = rockchip_get_bootdev();
47ad309a88SDingqiang Lin 	u16 i, j, loop = 0;
48*5238e9abSJon Lin 	u32 test_end_lba, test_begin_lba;
496096696bSDingqiang Lin 	u32 test_lba;
50ad309a88SDingqiang Lin 	u16 test_sec_count = 1;
51ad309a88SDingqiang Lin 	u16 print_flag;
52ad309a88SDingqiang Lin 
536096696bSDingqiang Lin 	if (!block_dev) {
54ad309a88SDingqiang Lin 		printf("device unknown\n");
55ad309a88SDingqiang Lin 		return;
56ad309a88SDingqiang Lin 	}
57ad309a88SDingqiang Lin 
586096696bSDingqiang Lin 	if (block_dev->if_type == IF_TYPE_SPINOR)
59*5238e9abSJon Lin 		test_begin_lba = 0x4000;
606096696bSDingqiang Lin 	else
61*5238e9abSJon Lin 		test_begin_lba = 0x8000;
626096696bSDingqiang Lin 
636096696bSDingqiang Lin 	test_end_lba = block_dev->lba;
64ad309a88SDingqiang Lin 	pwrite32 = (u32 *)pwrite;
65ad309a88SDingqiang Lin 	for (i = 0; i < (max_test_sector * 512); i++)
66ad309a88SDingqiang Lin 		pwrite[i] = i;
67*5238e9abSJon Lin 	for (loop = 0; loop < 100; loop++) {
68*5238e9abSJon Lin 		test_lba = test_begin_lba;
69ad309a88SDingqiang Lin 		printf("---------Test loop = %d---------\n", loop);
70ad309a88SDingqiang Lin 		printf("---------Test ftl write---------\n");
71ad309a88SDingqiang Lin 		test_sec_count = 1;
72ad309a88SDingqiang Lin 		printf("test_end_lba = %x\n", test_end_lba);
73ad309a88SDingqiang Lin 		printf("test_lba = %x\n", test_lba);
746096696bSDingqiang Lin 		for (; (test_lba + test_sec_count) < test_end_lba;) {
75ad309a88SDingqiang Lin 			pwrite32[0] = test_lba;
76ad309a88SDingqiang Lin 			blk_dwrite(block_dev, test_lba, test_sec_count, pwrite);
77ad309a88SDingqiang Lin 			blk_dread(block_dev, test_lba, test_sec_count, pread);
78ad309a88SDingqiang Lin 			for (j = 0; j < test_sec_count * 512; j++) {
79ad309a88SDingqiang Lin 				if (pwrite[j] != pread[j]) {
80*5238e9abSJon Lin 					printf("rkflash stress test fail\n");
81ad309a88SDingqiang Lin 					rkflash_print_hex("w:",
82ad309a88SDingqiang Lin 							  pwrite,
83ad309a88SDingqiang Lin 							  4,
84ad309a88SDingqiang Lin 							  test_sec_count * 128);
85ad309a88SDingqiang Lin 					rkflash_print_hex("r:",
86ad309a88SDingqiang Lin 							  pread,
87ad309a88SDingqiang Lin 							  4,
88ad309a88SDingqiang Lin 							  test_sec_count * 128);
89ad309a88SDingqiang Lin 					printf("r=%x, n=%x, w=%x, r=%x\n",
90ad309a88SDingqiang Lin 					       test_lba,
91ad309a88SDingqiang Lin 					       j,
92ad309a88SDingqiang Lin 					       pwrite[j],
93ad309a88SDingqiang Lin 					       pread[j]);
94ad309a88SDingqiang Lin 					while (1)
95ad309a88SDingqiang Lin 						;
96ad309a88SDingqiang Lin 				}
97ad309a88SDingqiang Lin 			}
98ad309a88SDingqiang Lin 			print_flag = test_lba & 0x1FF;
99ad309a88SDingqiang Lin 			if (print_flag < test_sec_count)
100ad309a88SDingqiang Lin 				printf("test_lba = %x\n", test_lba);
101ad309a88SDingqiang Lin 			test_lba += test_sec_count;
102ad309a88SDingqiang Lin 			test_sec_count++;
103ad309a88SDingqiang Lin 			if (test_sec_count > max_test_sector)
104ad309a88SDingqiang Lin 				test_sec_count = 1;
105ad309a88SDingqiang Lin 		}
106ad309a88SDingqiang Lin 		printf("---------Test ftl check---------\n");
107ad309a88SDingqiang Lin 
108*5238e9abSJon Lin 		test_lba = test_begin_lba;
109ad309a88SDingqiang Lin 		test_sec_count = 1;
1106096696bSDingqiang Lin 		for (; (test_lba + test_sec_count) < test_end_lba;) {
111ad309a88SDingqiang Lin 			pwrite32[0] = test_lba;
112ad309a88SDingqiang Lin 			blk_dread(block_dev, test_lba, test_sec_count, pread);
113ad309a88SDingqiang Lin 			print_flag = test_lba & 0x7FF;
114ad309a88SDingqiang Lin 			if (print_flag < test_sec_count)
115ad309a88SDingqiang Lin 				printf("test_lba = %x\n", test_lba);
116ad309a88SDingqiang Lin 
117ad309a88SDingqiang Lin 			for (j = 0; j < test_sec_count * 512; j++) {
118ad309a88SDingqiang Lin 				if (pwrite[j] != pread[j]) {
119*5238e9abSJon Lin 					printf("rkflash stress test fail\n");
120ad309a88SDingqiang Lin 					printf("r=%x, n=%x, w=%x, r=%x\n",
121ad309a88SDingqiang Lin 					       test_lba,
122ad309a88SDingqiang Lin 					       j,
123ad309a88SDingqiang Lin 					       pwrite[j],
124ad309a88SDingqiang Lin 					       pread[j]);
125*5238e9abSJon Lin 					while (1)
126*5238e9abSJon Lin 						;
127ad309a88SDingqiang Lin 				}
128ad309a88SDingqiang Lin 			}
129ad309a88SDingqiang Lin 			test_lba += test_sec_count;
130ad309a88SDingqiang Lin 			test_sec_count++;
131ad309a88SDingqiang Lin 			if (test_sec_count > max_test_sector)
132ad309a88SDingqiang Lin 				test_sec_count = 1;
133ad309a88SDingqiang Lin 		}
134ad309a88SDingqiang Lin 	}
135ad309a88SDingqiang Lin 	printf("---------Test end---------\n");
136ad309a88SDingqiang Lin 	/* while(1); */
137ad309a88SDingqiang Lin }
138ad309a88SDingqiang Lin #endif
139ad309a88SDingqiang Lin 
140ad309a88SDingqiang Lin void rkflash_test(struct udevice *udev)
141ad309a88SDingqiang Lin {
142ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN)
143ad309a88SDingqiang Lin 	blk_stress_test(udev);
144ad309a88SDingqiang Lin #endif
145ad309a88SDingqiang Lin }
146ad309a88SDingqiang Lin 
147