xref: /rk3399_rockchip-uboot/cmd/ddr_tool/memtester/tests.c (revision f9a1c31d51021ad79fb5d72e074600eeeeee80f8)
1*f9a1c31dSWesley Yao /* SPDX-License-Identifier: GPL-2.0 */
2*f9a1c31dSWesley Yao /*
3*f9a1c31dSWesley Yao  * Very simple but very effective user-space memory tester.
4*f9a1c31dSWesley Yao  * Originally by Simon Kirby <sim@stormix.com> <sim@neato.org>
5*f9a1c31dSWesley Yao  * Version 2 by Charles Cazabon <charlesc-memtester@pyropus.ca>
6*f9a1c31dSWesley Yao  * Version 3 not publicly released.
7*f9a1c31dSWesley Yao  * Version 4 rewrite:
8*f9a1c31dSWesley Yao  * Copyright (C) 2004-2012 Charles Cazabon <charlesc-memtester@pyropus.ca>
9*f9a1c31dSWesley Yao  * Licensed under the terms of the GNU General Public License version 2 (only).
10*f9a1c31dSWesley Yao  * See the file COPYING for details.
11*f9a1c31dSWesley Yao  *
12*f9a1c31dSWesley Yao  * This file contains the functions for the actual tests, called from the
13*f9a1c31dSWesley Yao  * main routine in memtester.c.  See other comments in that file.
14*f9a1c31dSWesley Yao  *
15*f9a1c31dSWesley Yao  */
16*f9a1c31dSWesley Yao 
17*f9a1c31dSWesley Yao #include "memtester.h"
18*f9a1c31dSWesley Yao #include "sizes.h"
19*f9a1c31dSWesley Yao #include "types.h"
20*f9a1c31dSWesley Yao #include "../io_map.h"
21*f9a1c31dSWesley Yao 
22*f9a1c31dSWesley Yao union {
23*f9a1c31dSWesley Yao 	unsigned char bytes[UL_LEN / 8];
24*f9a1c31dSWesley Yao 	u32 val;
25*f9a1c31dSWesley Yao } mword8;
26*f9a1c31dSWesley Yao 
27*f9a1c31dSWesley Yao union {
28*f9a1c31dSWesley Yao 	unsigned short u16s[UL_LEN / 16];
29*f9a1c31dSWesley Yao 	u32 val;
30*f9a1c31dSWesley Yao } mword16;
31*f9a1c31dSWesley Yao 
32*f9a1c31dSWesley Yao char progress[] = "-\\|/";
33*f9a1c31dSWesley Yao #define PROGRESSLEN 4
34*f9a1c31dSWesley Yao #define PROGRESSOFTEN 2500
35*f9a1c31dSWesley Yao #define ONE 0x00000001L
36*f9a1c31dSWesley Yao 
37*f9a1c31dSWesley Yao #define fflush(n)
38*f9a1c31dSWesley Yao 
39*f9a1c31dSWesley Yao /* Function definitions. */
compare_regions(u32v * bufa,u32v * bufb,size_t count)40*f9a1c31dSWesley Yao int compare_regions(u32v *bufa, u32v *bufb, size_t count)
41*f9a1c31dSWesley Yao {
42*f9a1c31dSWesley Yao 	int r = 0;
43*f9a1c31dSWesley Yao 	size_t i;
44*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
45*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
46*f9a1c31dSWesley Yao 	off_t physaddr;
47*f9a1c31dSWesley Yao 
48*f9a1c31dSWesley Yao 	for (i = 0; i < count; i++, p1++, p2++) {
49*f9a1c31dSWesley Yao 		if (*p1 != *p2) {
50*f9a1c31dSWesley Yao 			if (use_phys) {
51*f9a1c31dSWesley Yao 				physaddr = physaddrbase + (i * sizeof(u32v));
52*f9a1c31dSWesley Yao 				fprintf(stderr,
53*f9a1c31dSWesley Yao 					"FAILURE: 0x%08lx != 0x%08lx at physical address "
54*f9a1c31dSWesley Yao 					"0x%08lx.\n",
55*f9a1c31dSWesley Yao 					(ul)*p1, (ul)*p2, physaddr);
56*f9a1c31dSWesley Yao 			} else {
57*f9a1c31dSWesley Yao 				fprintf(stderr,
58*f9a1c31dSWesley Yao 					"FAILURE: 0x%08lx != 0x%08lx at offset 0x%08lx.\n",
59*f9a1c31dSWesley Yao 					(ul)*p1, (ul)*p2,
60*f9a1c31dSWesley Yao 					(ul)(i * sizeof(u32v)));
61*f9a1c31dSWesley Yao 			}
62*f9a1c31dSWesley Yao 			/* printf("Skipping to next test..."); */
63*f9a1c31dSWesley Yao 			r = -1;
64*f9a1c31dSWesley Yao 		}
65*f9a1c31dSWesley Yao 	}
66*f9a1c31dSWesley Yao 	return r;
67*f9a1c31dSWesley Yao }
68*f9a1c31dSWesley Yao 
test_stuck_address(u32v * bufa,size_t count)69*f9a1c31dSWesley Yao int test_stuck_address(u32v *bufa, size_t count)
70*f9a1c31dSWesley Yao {
71*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
72*f9a1c31dSWesley Yao 	unsigned int j;
73*f9a1c31dSWesley Yao 	size_t i;
74*f9a1c31dSWesley Yao 	off_t physaddr;
75*f9a1c31dSWesley Yao 
76*f9a1c31dSWesley Yao 	printf("           ");
77*f9a1c31dSWesley Yao 	fflush(stdout);
78*f9a1c31dSWesley Yao 	for (j = 0; j < 16; j++) {
79*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
80*f9a1c31dSWesley Yao 		p1 = (u32v *)bufa;
81*f9a1c31dSWesley Yao 		printf("setting %3u", j);
82*f9a1c31dSWesley Yao 		fflush(stdout);
83*f9a1c31dSWesley Yao 		for (i = 0; i < count; i++) {
84*f9a1c31dSWesley Yao 			*p1 = ((j + i) % 2) == 0 ? (u32)(ul)p1 : ~((u32)(ul)p1);
85*f9a1c31dSWesley Yao 			*p1++;
86*f9a1c31dSWesley Yao 		}
87*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
88*f9a1c31dSWesley Yao 		printf("testing %3u", j);
89*f9a1c31dSWesley Yao 		fflush(stdout);
90*f9a1c31dSWesley Yao 		p1 = (u32v *)bufa;
91*f9a1c31dSWesley Yao 		for (i = 0; i < count; i++, p1++) {
92*f9a1c31dSWesley Yao 			if (*p1 != (((j + i) % 2) == 0 ?
93*f9a1c31dSWesley Yao 				    (u32)(ul)p1 : ~((u32)(ul)p1))) {
94*f9a1c31dSWesley Yao 				if (use_phys) {
95*f9a1c31dSWesley Yao 					physaddr =
96*f9a1c31dSWesley Yao 					    physaddrbase + (i * sizeof(u32v));
97*f9a1c31dSWesley Yao 					fprintf(stderr,
98*f9a1c31dSWesley Yao 						"FAILURE: possible bad address line at physical "
99*f9a1c31dSWesley Yao 						"address 0x%08lx.\n", physaddr);
100*f9a1c31dSWesley Yao 				} else {
101*f9a1c31dSWesley Yao 					fprintf(stderr,
102*f9a1c31dSWesley Yao 						"FAILURE: possible bad address line at offset "
103*f9a1c31dSWesley Yao 						"0x%08lx.\n",
104*f9a1c31dSWesley Yao 						(ul)(i * sizeof(u32v)));
105*f9a1c31dSWesley Yao 				}
106*f9a1c31dSWesley Yao 				printf("Skipping to next test...\n");
107*f9a1c31dSWesley Yao 				fflush(stdout);
108*f9a1c31dSWesley Yao 				return -1;
109*f9a1c31dSWesley Yao 			}
110*f9a1c31dSWesley Yao 		}
111*f9a1c31dSWesley Yao 	}
112*f9a1c31dSWesley Yao 	printf("\b\b\b\b\b\b\b\b\b\b\b           \b\b\b\b\b\b\b\b\b\b\b");
113*f9a1c31dSWesley Yao 	fflush(stdout);
114*f9a1c31dSWesley Yao 	return 0;
115*f9a1c31dSWesley Yao }
116*f9a1c31dSWesley Yao 
test_random_value(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)117*f9a1c31dSWesley Yao int test_random_value(u32v *bufa, u32v *bufb, size_t count,
118*f9a1c31dSWesley Yao 		      ul fix_bit, ul fix_level)
119*f9a1c31dSWesley Yao {
120*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
121*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
122*f9a1c31dSWesley Yao 	ul j = 0;
123*f9a1c31dSWesley Yao 	size_t i;
124*f9a1c31dSWesley Yao 
125*f9a1c31dSWesley Yao 	putc(' ');
126*f9a1c31dSWesley Yao 	fflush(stdout);
127*f9a1c31dSWesley Yao 	for (i = 0; i < count; i++) {
128*f9a1c31dSWesley Yao 		*p1++ = *p2++ = rand_ul();
129*f9a1c31dSWesley Yao 		if (!(i % PROGRESSOFTEN)) {
130*f9a1c31dSWesley Yao 			putc('\b');
131*f9a1c31dSWesley Yao 			putc(progress[++j % PROGRESSLEN]);
132*f9a1c31dSWesley Yao 			fflush(stdout);
133*f9a1c31dSWesley Yao 		}
134*f9a1c31dSWesley Yao 	}
135*f9a1c31dSWesley Yao 	printf("\b \b");
136*f9a1c31dSWesley Yao 	fflush(stdout);
137*f9a1c31dSWesley Yao 	return compare_regions(bufa, bufb, count);
138*f9a1c31dSWesley Yao }
139*f9a1c31dSWesley Yao 
test_xor_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)140*f9a1c31dSWesley Yao int test_xor_comparison(u32v *bufa, u32v *bufb, size_t count,
141*f9a1c31dSWesley Yao 			ul fix_bit, ul fix_level)
142*f9a1c31dSWesley Yao 
143*f9a1c31dSWesley Yao {
144*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
145*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
146*f9a1c31dSWesley Yao 	size_t i;
147*f9a1c31dSWesley Yao 	u32 q = rand_ul();
148*f9a1c31dSWesley Yao 
149*f9a1c31dSWesley Yao 	for (i = 0; i < count; i++) {
150*f9a1c31dSWesley Yao 		*p1++ ^= q;
151*f9a1c31dSWesley Yao 		*p2++ ^= q;
152*f9a1c31dSWesley Yao 	}
153*f9a1c31dSWesley Yao 	return compare_regions(bufa, bufb, count);
154*f9a1c31dSWesley Yao }
155*f9a1c31dSWesley Yao 
test_sub_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)156*f9a1c31dSWesley Yao int test_sub_comparison(u32v *bufa, u32v *bufb, size_t count,
157*f9a1c31dSWesley Yao 			ul fix_bit, ul fix_level)
158*f9a1c31dSWesley Yao {
159*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
160*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
161*f9a1c31dSWesley Yao 	size_t i;
162*f9a1c31dSWesley Yao 	u32 q = rand_ul();
163*f9a1c31dSWesley Yao 
164*f9a1c31dSWesley Yao 	for (i = 0; i < count; i++) {
165*f9a1c31dSWesley Yao 		*p1++ -= q;
166*f9a1c31dSWesley Yao 		*p2++ -= q;
167*f9a1c31dSWesley Yao 	}
168*f9a1c31dSWesley Yao 	return compare_regions(bufa, bufb, count);
169*f9a1c31dSWesley Yao }
170*f9a1c31dSWesley Yao 
test_mul_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)171*f9a1c31dSWesley Yao int test_mul_comparison(u32v *bufa, u32v *bufb, size_t count,
172*f9a1c31dSWesley Yao 			ul fix_bit, ul fix_level)
173*f9a1c31dSWesley Yao {
174*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
175*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
176*f9a1c31dSWesley Yao 	size_t i;
177*f9a1c31dSWesley Yao 	u32 q = rand_ul();
178*f9a1c31dSWesley Yao 
179*f9a1c31dSWesley Yao 	for (i = 0; i < count; i++) {
180*f9a1c31dSWesley Yao 		*p1++ *= q;
181*f9a1c31dSWesley Yao 		*p2++ *= q;
182*f9a1c31dSWesley Yao 	}
183*f9a1c31dSWesley Yao 	return compare_regions(bufa, bufb, count);
184*f9a1c31dSWesley Yao }
185*f9a1c31dSWesley Yao 
test_div_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)186*f9a1c31dSWesley Yao int test_div_comparison(u32v *bufa, u32v *bufb, size_t count,
187*f9a1c31dSWesley Yao 			ul fix_bit, ul fix_level)
188*f9a1c31dSWesley Yao {
189*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
190*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
191*f9a1c31dSWesley Yao 	size_t i;
192*f9a1c31dSWesley Yao 	u32 q = rand_ul();
193*f9a1c31dSWesley Yao 
194*f9a1c31dSWesley Yao 	for (i = 0; i < count; i++) {
195*f9a1c31dSWesley Yao 		if (!q)
196*f9a1c31dSWesley Yao 			q++;
197*f9a1c31dSWesley Yao 		*p1++ /= q;
198*f9a1c31dSWesley Yao 		*p2++ /= q;
199*f9a1c31dSWesley Yao 	}
200*f9a1c31dSWesley Yao 	return compare_regions(bufa, bufb, count);
201*f9a1c31dSWesley Yao }
202*f9a1c31dSWesley Yao 
test_or_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)203*f9a1c31dSWesley Yao int test_or_comparison(u32v *bufa, u32v *bufb, size_t count,
204*f9a1c31dSWesley Yao 		       ul fix_bit, ul fix_level)
205*f9a1c31dSWesley Yao {
206*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
207*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
208*f9a1c31dSWesley Yao 	size_t i;
209*f9a1c31dSWesley Yao 	u32 q = rand_ul();
210*f9a1c31dSWesley Yao 
211*f9a1c31dSWesley Yao 	for (i = 0; i < count; i++) {
212*f9a1c31dSWesley Yao 		*p1++ |= q;
213*f9a1c31dSWesley Yao 		*p2++ |= q;
214*f9a1c31dSWesley Yao 	}
215*f9a1c31dSWesley Yao 	return compare_regions(bufa, bufb, count);
216*f9a1c31dSWesley Yao }
217*f9a1c31dSWesley Yao 
test_and_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)218*f9a1c31dSWesley Yao int test_and_comparison(u32v *bufa, u32v *bufb, size_t count,
219*f9a1c31dSWesley Yao 			ul fix_bit, ul fix_level)
220*f9a1c31dSWesley Yao {
221*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
222*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
223*f9a1c31dSWesley Yao 	size_t i;
224*f9a1c31dSWesley Yao 	u32 q = rand_ul();
225*f9a1c31dSWesley Yao 
226*f9a1c31dSWesley Yao 	for (i = 0; i < count; i++) {
227*f9a1c31dSWesley Yao 		*p1++ &= q;
228*f9a1c31dSWesley Yao 		*p2++ &= q;
229*f9a1c31dSWesley Yao 	}
230*f9a1c31dSWesley Yao 	return compare_regions(bufa, bufb, count);
231*f9a1c31dSWesley Yao }
232*f9a1c31dSWesley Yao 
test_seqinc_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)233*f9a1c31dSWesley Yao int test_seqinc_comparison(u32v *bufa, u32v *bufb, size_t count,
234*f9a1c31dSWesley Yao 			   ul fix_bit, ul fix_level)
235*f9a1c31dSWesley Yao {
236*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
237*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
238*f9a1c31dSWesley Yao 	size_t i;
239*f9a1c31dSWesley Yao 	u32 q = rand_ul();
240*f9a1c31dSWesley Yao 
241*f9a1c31dSWesley Yao 	for (i = 0; i < count; i++)
242*f9a1c31dSWesley Yao 		*p1++ = *p2++ = (i + q);
243*f9a1c31dSWesley Yao 	return compare_regions(bufa, bufb, count);
244*f9a1c31dSWesley Yao }
245*f9a1c31dSWesley Yao 
test_solidbits_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)246*f9a1c31dSWesley Yao int test_solidbits_comparison(u32v *bufa, u32v *bufb, size_t count,
247*f9a1c31dSWesley Yao 			      ul fix_bit, ul fix_level)
248*f9a1c31dSWesley Yao {
249*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
250*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
251*f9a1c31dSWesley Yao 	unsigned int j;
252*f9a1c31dSWesley Yao 	u32 q;
253*f9a1c31dSWesley Yao 	u32 data[4];
254*f9a1c31dSWesley Yao 	size_t i;
255*f9a1c31dSWesley Yao 
256*f9a1c31dSWesley Yao 	printf("           ");
257*f9a1c31dSWesley Yao 	fflush(stdout);
258*f9a1c31dSWesley Yao 	for (j = 0; j < 64; j++) {
259*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
260*f9a1c31dSWesley Yao 		q = (j % 2) == 0 ? UL_ONEBITS : 0;
261*f9a1c31dSWesley Yao 		if (fix_level)
262*f9a1c31dSWesley Yao 			q |= fix_bit;
263*f9a1c31dSWesley Yao 		else
264*f9a1c31dSWesley Yao 			q &= ~fix_bit;
265*f9a1c31dSWesley Yao 		data[0] = data[2] = q;
266*f9a1c31dSWesley Yao 		data[1] = data[3] = ~q;
267*f9a1c31dSWesley Yao 		data_cpu_2_io(data, sizeof(data));
268*f9a1c31dSWesley Yao 		printf("setting %3u", j);
269*f9a1c31dSWesley Yao 		fflush(stdout);
270*f9a1c31dSWesley Yao 		p1 = (u32v *)bufa;
271*f9a1c31dSWesley Yao 		p2 = (u32v *)bufb;
272*f9a1c31dSWesley Yao 		for (i = 0; i < count; i++)
273*f9a1c31dSWesley Yao 			*p1++ = *p2++ = data[i & 3];
274*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
275*f9a1c31dSWesley Yao 		printf("testing %3u", j);
276*f9a1c31dSWesley Yao 		fflush(stdout);
277*f9a1c31dSWesley Yao 		if (compare_regions(bufa, bufb, count))
278*f9a1c31dSWesley Yao 			return -1;
279*f9a1c31dSWesley Yao 	}
280*f9a1c31dSWesley Yao 	printf("\b\b\b\b\b\b\b\b\b\b\b           \b\b\b\b\b\b\b\b\b\b\b");
281*f9a1c31dSWesley Yao 	fflush(stdout);
282*f9a1c31dSWesley Yao 	return 0;
283*f9a1c31dSWesley Yao }
284*f9a1c31dSWesley Yao 
test_checkerboard_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)285*f9a1c31dSWesley Yao int test_checkerboard_comparison(u32v *bufa, u32v *bufb, size_t count,
286*f9a1c31dSWesley Yao 				 ul fix_bit, ul fix_level)
287*f9a1c31dSWesley Yao {
288*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
289*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
290*f9a1c31dSWesley Yao 	unsigned int j;
291*f9a1c31dSWesley Yao 	u32 q;
292*f9a1c31dSWesley Yao 	u32 data[4];
293*f9a1c31dSWesley Yao 	size_t i;
294*f9a1c31dSWesley Yao 
295*f9a1c31dSWesley Yao 	printf("           ");
296*f9a1c31dSWesley Yao 	fflush(stdout);
297*f9a1c31dSWesley Yao 	for (j = 0; j < 64; j++) {
298*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
299*f9a1c31dSWesley Yao 		q = (j % 2) == 0 ? CHECKERBOARD1 : CHECKERBOARD2;
300*f9a1c31dSWesley Yao 		if (fix_level)
301*f9a1c31dSWesley Yao 			q |= fix_bit;
302*f9a1c31dSWesley Yao 		else
303*f9a1c31dSWesley Yao 			q &= ~fix_bit;
304*f9a1c31dSWesley Yao 
305*f9a1c31dSWesley Yao 		data[0] = data[2] = q;
306*f9a1c31dSWesley Yao 		data[1] = data[3] = ~q;
307*f9a1c31dSWesley Yao 		data_cpu_2_io(data, sizeof(data));
308*f9a1c31dSWesley Yao 		printf("setting %3u", j);
309*f9a1c31dSWesley Yao 		fflush(stdout);
310*f9a1c31dSWesley Yao 		p1 = (u32v *)bufa;
311*f9a1c31dSWesley Yao 		p2 = (u32v *)bufb;
312*f9a1c31dSWesley Yao 		for (i = 0; i < count; i++)
313*f9a1c31dSWesley Yao 			*p1++ = *p2++ = data[i & 3];
314*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
315*f9a1c31dSWesley Yao 		printf("testing %3u", j);
316*f9a1c31dSWesley Yao 		fflush(stdout);
317*f9a1c31dSWesley Yao 		if (compare_regions(bufa, bufb, count))
318*f9a1c31dSWesley Yao 			return -1;
319*f9a1c31dSWesley Yao 	}
320*f9a1c31dSWesley Yao 	printf("\b\b\b\b\b\b\b\b\b\b\b           \b\b\b\b\b\b\b\b\b\b\b");
321*f9a1c31dSWesley Yao 	fflush(stdout);
322*f9a1c31dSWesley Yao 	return 0;
323*f9a1c31dSWesley Yao }
324*f9a1c31dSWesley Yao 
test_blockseq_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)325*f9a1c31dSWesley Yao int test_blockseq_comparison(u32v *bufa, u32v *bufb, size_t count,
326*f9a1c31dSWesley Yao 			     ul fix_bit, ul fix_level)
327*f9a1c31dSWesley Yao {
328*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
329*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
330*f9a1c31dSWesley Yao 	unsigned int j;
331*f9a1c31dSWesley Yao 	u32 data[4];
332*f9a1c31dSWesley Yao 	u32 q;
333*f9a1c31dSWesley Yao 	size_t i;
334*f9a1c31dSWesley Yao 
335*f9a1c31dSWesley Yao 	printf("           ");
336*f9a1c31dSWesley Yao 	fflush(stdout);
337*f9a1c31dSWesley Yao 	for (j = 0; j < 256; j++) {
338*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
339*f9a1c31dSWesley Yao 		p1 = (u32v *)bufa;
340*f9a1c31dSWesley Yao 		p2 = (u32v *)bufb;
341*f9a1c31dSWesley Yao 		printf("setting %3u", j);
342*f9a1c31dSWesley Yao 		fflush(stdout);
343*f9a1c31dSWesley Yao 		q = (u32)UL_BYTE(j);
344*f9a1c31dSWesley Yao 		if (fix_level)
345*f9a1c31dSWesley Yao 			q |= fix_bit;
346*f9a1c31dSWesley Yao 		else
347*f9a1c31dSWesley Yao 			q &= ~fix_bit;
348*f9a1c31dSWesley Yao 
349*f9a1c31dSWesley Yao 		data[0] = q;
350*f9a1c31dSWesley Yao 		data[1] = q;
351*f9a1c31dSWesley Yao 		data[2] = q;
352*f9a1c31dSWesley Yao 		data[3] = q;
353*f9a1c31dSWesley Yao 
354*f9a1c31dSWesley Yao 		data_cpu_2_io(data, sizeof(data));
355*f9a1c31dSWesley Yao 
356*f9a1c31dSWesley Yao 		for (i = 0; i < count; i++)
357*f9a1c31dSWesley Yao 			*p1++ = *p2++ = data[i & 3];
358*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
359*f9a1c31dSWesley Yao 		printf("testing %3u", j);
360*f9a1c31dSWesley Yao 		fflush(stdout);
361*f9a1c31dSWesley Yao 		if (compare_regions(bufa, bufb, count))
362*f9a1c31dSWesley Yao 			return -1;
363*f9a1c31dSWesley Yao 	}
364*f9a1c31dSWesley Yao 	printf("\b\b\b\b\b\b\b\b\b\b\b           \b\b\b\b\b\b\b\b\b\b\b");
365*f9a1c31dSWesley Yao 	fflush(stdout);
366*f9a1c31dSWesley Yao 	return 0;
367*f9a1c31dSWesley Yao }
368*f9a1c31dSWesley Yao 
test_walkbits0_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)369*f9a1c31dSWesley Yao int test_walkbits0_comparison(u32v *bufa, u32v *bufb, size_t count,
370*f9a1c31dSWesley Yao 			      ul fix_bit, ul fix_level)
371*f9a1c31dSWesley Yao {
372*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
373*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
374*f9a1c31dSWesley Yao 	unsigned int j;
375*f9a1c31dSWesley Yao 	u32 data[4];
376*f9a1c31dSWesley Yao 	u32 q;
377*f9a1c31dSWesley Yao 	size_t i;
378*f9a1c31dSWesley Yao 
379*f9a1c31dSWesley Yao 	printf("           ");
380*f9a1c31dSWesley Yao 	fflush(stdout);
381*f9a1c31dSWesley Yao 	for (j = 0; j < UL_LEN * 2; j++) {
382*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
383*f9a1c31dSWesley Yao 		p1 = (u32v *)bufa;
384*f9a1c31dSWesley Yao 		p2 = (u32v *)bufb;
385*f9a1c31dSWesley Yao 		printf("setting %3u", j);
386*f9a1c31dSWesley Yao 		fflush(stdout);
387*f9a1c31dSWesley Yao 		if (j < UL_LEN)
388*f9a1c31dSWesley Yao 			q = ONE << j;
389*f9a1c31dSWesley Yao 		else
390*f9a1c31dSWesley Yao 			q = ONE << (UL_LEN * 2 - j - 1);
391*f9a1c31dSWesley Yao 
392*f9a1c31dSWesley Yao 		if (fix_level)
393*f9a1c31dSWesley Yao 			q |= fix_bit;
394*f9a1c31dSWesley Yao 		else
395*f9a1c31dSWesley Yao 			q &= ~fix_bit;
396*f9a1c31dSWesley Yao 
397*f9a1c31dSWesley Yao 		data[0] = q;
398*f9a1c31dSWesley Yao 		data[1] = q;
399*f9a1c31dSWesley Yao 		data[2] = q;
400*f9a1c31dSWesley Yao 		data[3] = q;
401*f9a1c31dSWesley Yao 		data_cpu_2_io(data, sizeof(data));
402*f9a1c31dSWesley Yao 
403*f9a1c31dSWesley Yao 		for (i = 0; i < count; i++) {
404*f9a1c31dSWesley Yao 				*p1++ = *p2++ = data[i & 3];
405*f9a1c31dSWesley Yao 		}
406*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
407*f9a1c31dSWesley Yao 		printf("testing %3u", j);
408*f9a1c31dSWesley Yao 		fflush(stdout);
409*f9a1c31dSWesley Yao 		if (compare_regions(bufa, bufb, count))
410*f9a1c31dSWesley Yao 			return -1;
411*f9a1c31dSWesley Yao 	}
412*f9a1c31dSWesley Yao 	printf("\b\b\b\b\b\b\b\b\b\b\b           \b\b\b\b\b\b\b\b\b\b\b");
413*f9a1c31dSWesley Yao 	fflush(stdout);
414*f9a1c31dSWesley Yao 	return 0;
415*f9a1c31dSWesley Yao }
416*f9a1c31dSWesley Yao 
test_walkbits1_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)417*f9a1c31dSWesley Yao int test_walkbits1_comparison(u32v *bufa, u32v *bufb, size_t count,
418*f9a1c31dSWesley Yao 			      ul fix_bit, ul fix_level)
419*f9a1c31dSWesley Yao {
420*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
421*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
422*f9a1c31dSWesley Yao 	unsigned int j;
423*f9a1c31dSWesley Yao 	u32 data[4];
424*f9a1c31dSWesley Yao 	u32 q;
425*f9a1c31dSWesley Yao 	size_t i;
426*f9a1c31dSWesley Yao 
427*f9a1c31dSWesley Yao 	printf("           ");
428*f9a1c31dSWesley Yao 	fflush(stdout);
429*f9a1c31dSWesley Yao 	for (j = 0; j < UL_LEN * 2; j++) {
430*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
431*f9a1c31dSWesley Yao 		p1 = (u32v *)bufa;
432*f9a1c31dSWesley Yao 		p2 = (u32v *)bufb;
433*f9a1c31dSWesley Yao 		printf("setting %3u", j);
434*f9a1c31dSWesley Yao 		fflush(stdout);
435*f9a1c31dSWesley Yao 		if (j < UL_LEN)
436*f9a1c31dSWesley Yao 			q = UL_ONEBITS ^ (ONE << j);
437*f9a1c31dSWesley Yao 		else
438*f9a1c31dSWesley Yao 			q = UL_ONEBITS ^ (ONE << (UL_LEN * 2 - j - 1));
439*f9a1c31dSWesley Yao 		if (fix_level)
440*f9a1c31dSWesley Yao 			q |= fix_bit;
441*f9a1c31dSWesley Yao 		else
442*f9a1c31dSWesley Yao 			q &= ~fix_bit;
443*f9a1c31dSWesley Yao 
444*f9a1c31dSWesley Yao 		data[0] = q;
445*f9a1c31dSWesley Yao 		data[1] = q;
446*f9a1c31dSWesley Yao 		data[2] = q;
447*f9a1c31dSWesley Yao 		data[3] = q;
448*f9a1c31dSWesley Yao 		data_cpu_2_io(data, sizeof(data));
449*f9a1c31dSWesley Yao 
450*f9a1c31dSWesley Yao 		for (i = 0; i < count; i++) {
451*f9a1c31dSWesley Yao 				*p1++ = *p2++ = data[i & 3];
452*f9a1c31dSWesley Yao 		}
453*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
454*f9a1c31dSWesley Yao 		printf("testing %3u", j);
455*f9a1c31dSWesley Yao 		fflush(stdout);
456*f9a1c31dSWesley Yao 		if (compare_regions(bufa, bufb, count))
457*f9a1c31dSWesley Yao 			return -1;
458*f9a1c31dSWesley Yao 	}
459*f9a1c31dSWesley Yao 	printf("\b\b\b\b\b\b\b\b\b\b\b           \b\b\b\b\b\b\b\b\b\b\b");
460*f9a1c31dSWesley Yao 	fflush(stdout);
461*f9a1c31dSWesley Yao 	return 0;
462*f9a1c31dSWesley Yao }
463*f9a1c31dSWesley Yao 
test_bitspread_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)464*f9a1c31dSWesley Yao int test_bitspread_comparison(u32v *bufa, u32v *bufb, size_t count,
465*f9a1c31dSWesley Yao 			      ul fix_bit, ul fix_level)
466*f9a1c31dSWesley Yao {
467*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
468*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
469*f9a1c31dSWesley Yao 	unsigned int j;
470*f9a1c31dSWesley Yao 	u32 data[4];
471*f9a1c31dSWesley Yao 	size_t i;
472*f9a1c31dSWesley Yao 
473*f9a1c31dSWesley Yao 	printf("           ");
474*f9a1c31dSWesley Yao 	fflush(stdout);
475*f9a1c31dSWesley Yao 	for (j = 0; j < UL_LEN * 2; j++) {
476*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
477*f9a1c31dSWesley Yao 		p1 = (u32v *)bufa;
478*f9a1c31dSWesley Yao 		p2 = (u32v *)bufb;
479*f9a1c31dSWesley Yao 		printf("setting %3u", j);
480*f9a1c31dSWesley Yao 		fflush(stdout);
481*f9a1c31dSWesley Yao 		if (j < UL_LEN) {
482*f9a1c31dSWesley Yao 			data[0] = (ONE << j) | (ONE << (j + 2));
483*f9a1c31dSWesley Yao 			data[1] = UL_ONEBITS ^ ((ONE << j) | (ONE << (j + 2)));
484*f9a1c31dSWesley Yao 		} else {
485*f9a1c31dSWesley Yao 			data[0] = (ONE << (UL_LEN * 2 - 1 - j)) |
486*f9a1c31dSWesley Yao 				  (ONE << (UL_LEN * 2 + 1 - j));
487*f9a1c31dSWesley Yao 			data[1] = UL_ONEBITS ^ (ONE << (UL_LEN * 2 - 1 - j)
488*f9a1c31dSWesley Yao 						| (ONE << (UL_LEN * 2 + 1 - j)));
489*f9a1c31dSWesley Yao 		}
490*f9a1c31dSWesley Yao 		if (fix_level) {
491*f9a1c31dSWesley Yao 			data[0] |= fix_bit;
492*f9a1c31dSWesley Yao 			data[1] |= fix_bit;
493*f9a1c31dSWesley Yao 		} else {
494*f9a1c31dSWesley Yao 			data[0] &= ~fix_bit;
495*f9a1c31dSWesley Yao 			data[1] &= ~fix_bit;
496*f9a1c31dSWesley Yao 		}
497*f9a1c31dSWesley Yao 		data[2] = data[0];
498*f9a1c31dSWesley Yao 		data[3] = data[1];
499*f9a1c31dSWesley Yao 		data_cpu_2_io(data, sizeof(data));
500*f9a1c31dSWesley Yao 
501*f9a1c31dSWesley Yao 		for (i = 0; i < count; i++) {
502*f9a1c31dSWesley Yao 			*p1++ = *p2++ = data[i & 3];
503*f9a1c31dSWesley Yao 		}
504*f9a1c31dSWesley Yao 		printf("\b\b\b\b\b\b\b\b\b\b\b");
505*f9a1c31dSWesley Yao 		printf("testing %3u", j);
506*f9a1c31dSWesley Yao 		fflush(stdout);
507*f9a1c31dSWesley Yao 		if (compare_regions(bufa, bufb, count))
508*f9a1c31dSWesley Yao 			return -1;
509*f9a1c31dSWesley Yao 	}
510*f9a1c31dSWesley Yao 	printf("\b\b\b\b\b\b\b\b\b\b\b           \b\b\b\b\b\b\b\b\b\b\b");
511*f9a1c31dSWesley Yao 	fflush(stdout);
512*f9a1c31dSWesley Yao 	return 0;
513*f9a1c31dSWesley Yao }
514*f9a1c31dSWesley Yao 
test_bitflip_comparison(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)515*f9a1c31dSWesley Yao int test_bitflip_comparison(u32v *bufa, u32v *bufb, size_t count,
516*f9a1c31dSWesley Yao 			    ul fix_bit, ul fix_level)
517*f9a1c31dSWesley Yao {
518*f9a1c31dSWesley Yao 	u32v *p1 = bufa;
519*f9a1c31dSWesley Yao 	u32v *p2 = bufb;
520*f9a1c31dSWesley Yao 	unsigned int j, k;
521*f9a1c31dSWesley Yao 	u32 q;
522*f9a1c31dSWesley Yao 	u32 data[4];
523*f9a1c31dSWesley Yao 	size_t i;
524*f9a1c31dSWesley Yao 
525*f9a1c31dSWesley Yao 	printf("           ");
526*f9a1c31dSWesley Yao 	fflush(stdout);
527*f9a1c31dSWesley Yao 	for (k = 0; k < UL_LEN; k++) {
528*f9a1c31dSWesley Yao 		q = ONE << k;
529*f9a1c31dSWesley Yao 		for (j = 0; j < 8; j++) {
530*f9a1c31dSWesley Yao 			printf("\b\b\b\b\b\b\b\b\b\b\b");
531*f9a1c31dSWesley Yao 			q = ~q;
532*f9a1c31dSWesley Yao 			printf("setting %3u", k * 8 + j);
533*f9a1c31dSWesley Yao 			fflush(stdout);
534*f9a1c31dSWesley Yao 			if (fix_level)
535*f9a1c31dSWesley Yao 				q |= fix_bit;
536*f9a1c31dSWesley Yao 			else
537*f9a1c31dSWesley Yao 				q &= ~fix_bit;
538*f9a1c31dSWesley Yao 
539*f9a1c31dSWesley Yao 			data[0] = data[2] = q;
540*f9a1c31dSWesley Yao 			data[1] = data[3] = ~q;
541*f9a1c31dSWesley Yao 			data_cpu_2_io(data, sizeof(data));
542*f9a1c31dSWesley Yao 			p1 = (u32v *)bufa;
543*f9a1c31dSWesley Yao 			p2 = (u32v *)bufb;
544*f9a1c31dSWesley Yao 			for (i = 0; i < count; i++)
545*f9a1c31dSWesley Yao 				*p1++ = *p2++ = data[i & 3];
546*f9a1c31dSWesley Yao 			printf("\b\b\b\b\b\b\b\b\b\b\b");
547*f9a1c31dSWesley Yao 			printf("testing %3u", k * 8 + j);
548*f9a1c31dSWesley Yao 			fflush(stdout);
549*f9a1c31dSWesley Yao 			if (compare_regions(bufa, bufb, count))
550*f9a1c31dSWesley Yao 				return -1;
551*f9a1c31dSWesley Yao 		}
552*f9a1c31dSWesley Yao 	}
553*f9a1c31dSWesley Yao 	printf("\b\b\b\b\b\b\b\b\b\b\b           \b\b\b\b\b\b\b\b\b\b\b");
554*f9a1c31dSWesley Yao 	fflush(stdout);
555*f9a1c31dSWesley Yao 	return 0;
556*f9a1c31dSWesley Yao }
557*f9a1c31dSWesley Yao 
558*f9a1c31dSWesley Yao #ifdef TEST_NARROW_WRITES
test_8bit_wide_random(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)559*f9a1c31dSWesley Yao int test_8bit_wide_random(u32v *bufa, u32v *bufb, size_t count,
560*f9a1c31dSWesley Yao 			  ul fix_bit, ul fix_level)
561*f9a1c31dSWesley Yao {
562*f9a1c31dSWesley Yao 	u8v *p1, *t;
563*f9a1c31dSWesley Yao 	u32v *p2;
564*f9a1c31dSWesley Yao 	int attempt;
565*f9a1c31dSWesley Yao 	unsigned int b, j = 0;
566*f9a1c31dSWesley Yao 	size_t i;
567*f9a1c31dSWesley Yao 
568*f9a1c31dSWesley Yao 	putc(' ');
569*f9a1c31dSWesley Yao 	fflush(stdout);
570*f9a1c31dSWesley Yao 	for (attempt = 0; attempt < 2; attempt++) {
571*f9a1c31dSWesley Yao 		if (attempt & 1) {
572*f9a1c31dSWesley Yao 			p1 = (u8v *)bufa;
573*f9a1c31dSWesley Yao 			p2 = bufb;
574*f9a1c31dSWesley Yao 		} else {
575*f9a1c31dSWesley Yao 			p1 = (u8v *)bufb;
576*f9a1c31dSWesley Yao 			p2 = bufa;
577*f9a1c31dSWesley Yao 		}
578*f9a1c31dSWesley Yao 		for (i = 0; i < count; i++) {
579*f9a1c31dSWesley Yao 			t = mword8.bytes;
580*f9a1c31dSWesley Yao 			*p2++ = mword8.val = rand_ul();
581*f9a1c31dSWesley Yao 			for (b = 0; b < UL_LEN / 8; b++)
582*f9a1c31dSWesley Yao 				*p1++ = *t++;
583*f9a1c31dSWesley Yao 			if (!(i % PROGRESSOFTEN)) {
584*f9a1c31dSWesley Yao 				putc('\b');
585*f9a1c31dSWesley Yao 				putc(progress[++j % PROGRESSLEN]);
586*f9a1c31dSWesley Yao 				fflush(stdout);
587*f9a1c31dSWesley Yao 			}
588*f9a1c31dSWesley Yao 		}
589*f9a1c31dSWesley Yao 		if (compare_regions(bufa, bufb, count))
590*f9a1c31dSWesley Yao 			return -1;
591*f9a1c31dSWesley Yao 	}
592*f9a1c31dSWesley Yao 	printf("\b \b");
593*f9a1c31dSWesley Yao 	fflush(stdout);
594*f9a1c31dSWesley Yao 	return 0;
595*f9a1c31dSWesley Yao }
596*f9a1c31dSWesley Yao 
test_16bit_wide_random(u32v * bufa,u32v * bufb,size_t count,ul fix_bit,ul fix_level)597*f9a1c31dSWesley Yao int test_16bit_wide_random(u32v *bufa, u32v *bufb, size_t count,
598*f9a1c31dSWesley Yao 			   ul fix_bit, ul fix_level)
599*f9a1c31dSWesley Yao {
600*f9a1c31dSWesley Yao 	u16v *p1, *t;
601*f9a1c31dSWesley Yao 	u32v *p2;
602*f9a1c31dSWesley Yao 	int attempt;
603*f9a1c31dSWesley Yao 	unsigned int b, j = 0;
604*f9a1c31dSWesley Yao 	size_t i;
605*f9a1c31dSWesley Yao 
606*f9a1c31dSWesley Yao 	putc(' ');
607*f9a1c31dSWesley Yao 	fflush(stdout);
608*f9a1c31dSWesley Yao 	for (attempt = 0; attempt < 2; attempt++) {
609*f9a1c31dSWesley Yao 		if (attempt & 1) {
610*f9a1c31dSWesley Yao 			p1 = (u16v *)bufa;
611*f9a1c31dSWesley Yao 			p2 = bufb;
612*f9a1c31dSWesley Yao 		} else {
613*f9a1c31dSWesley Yao 			p1 = (u16v *)bufb;
614*f9a1c31dSWesley Yao 			p2 = bufa;
615*f9a1c31dSWesley Yao 		}
616*f9a1c31dSWesley Yao 		for (i = 0; i < count; i++) {
617*f9a1c31dSWesley Yao 			t = mword16.u16s;
618*f9a1c31dSWesley Yao 			*p2++ = mword16.val = rand_ul();
619*f9a1c31dSWesley Yao 			for (b = 0; b < UL_LEN / 16; b++)
620*f9a1c31dSWesley Yao 				*p1++ = *t++;
621*f9a1c31dSWesley Yao 			if (!(i % PROGRESSOFTEN)) {
622*f9a1c31dSWesley Yao 				putc('\b');
623*f9a1c31dSWesley Yao 				putc(progress[++j % PROGRESSLEN]);
624*f9a1c31dSWesley Yao 				fflush(stdout);
625*f9a1c31dSWesley Yao 			}
626*f9a1c31dSWesley Yao 		}
627*f9a1c31dSWesley Yao 		if (compare_regions(bufa, bufb, count))
628*f9a1c31dSWesley Yao 			return -1;
629*f9a1c31dSWesley Yao 	}
630*f9a1c31dSWesley Yao 	printf("\b \b");
631*f9a1c31dSWesley Yao 	fflush(stdout);
632*f9a1c31dSWesley Yao 	return 0;
633*f9a1c31dSWesley Yao }
634*f9a1c31dSWesley Yao #endif
635