xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/powerpc/vphn/test-vphn.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun #include <stdio.h>
3*4882a593Smuzhiyun #include <byteswap.h>
4*4882a593Smuzhiyun #include "utils.h"
5*4882a593Smuzhiyun #include "subunit.h"
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
8*4882a593Smuzhiyun #define cpu_to_be32(x)		bswap_32(x)
9*4882a593Smuzhiyun #define be32_to_cpu(x)		bswap_32(x)
10*4882a593Smuzhiyun #define be16_to_cpup(x)		bswap_16(*x)
11*4882a593Smuzhiyun #define cpu_to_be64(x)		bswap_64(x)
12*4882a593Smuzhiyun #else
13*4882a593Smuzhiyun #define cpu_to_be32(x)		(x)
14*4882a593Smuzhiyun #define be32_to_cpu(x)		(x)
15*4882a593Smuzhiyun #define be16_to_cpup(x)		(*x)
16*4882a593Smuzhiyun #define cpu_to_be64(x)		(x)
17*4882a593Smuzhiyun #endif
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include "vphn.c"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun static struct test {
22*4882a593Smuzhiyun 	char *descr;
23*4882a593Smuzhiyun 	long input[VPHN_REGISTER_COUNT];
24*4882a593Smuzhiyun 	u32 expected[VPHN_ASSOC_BUFSIZE];
25*4882a593Smuzhiyun } all_tests[] = {
26*4882a593Smuzhiyun 	{
27*4882a593Smuzhiyun 		"vphn: no data",
28*4882a593Smuzhiyun 		{
29*4882a593Smuzhiyun 			0xffffffffffffffff,
30*4882a593Smuzhiyun 			0xffffffffffffffff,
31*4882a593Smuzhiyun 			0xffffffffffffffff,
32*4882a593Smuzhiyun 			0xffffffffffffffff,
33*4882a593Smuzhiyun 			0xffffffffffffffff,
34*4882a593Smuzhiyun 			0xffffffffffffffff,
35*4882a593Smuzhiyun 		},
36*4882a593Smuzhiyun 		{
37*4882a593Smuzhiyun 			0x00000000
38*4882a593Smuzhiyun 		}
39*4882a593Smuzhiyun 	},
40*4882a593Smuzhiyun 	{
41*4882a593Smuzhiyun 		"vphn: 1 x 16-bit value",
42*4882a593Smuzhiyun 		{
43*4882a593Smuzhiyun 			0x8001ffffffffffff,
44*4882a593Smuzhiyun 			0xffffffffffffffff,
45*4882a593Smuzhiyun 			0xffffffffffffffff,
46*4882a593Smuzhiyun 			0xffffffffffffffff,
47*4882a593Smuzhiyun 			0xffffffffffffffff,
48*4882a593Smuzhiyun 			0xffffffffffffffff,
49*4882a593Smuzhiyun 		},
50*4882a593Smuzhiyun 		{
51*4882a593Smuzhiyun 			0x00000001,
52*4882a593Smuzhiyun 			0x00000001
53*4882a593Smuzhiyun 		}
54*4882a593Smuzhiyun 	},
55*4882a593Smuzhiyun 	{
56*4882a593Smuzhiyun 		"vphn: 2 x 16-bit values",
57*4882a593Smuzhiyun 		{
58*4882a593Smuzhiyun 			0x80018002ffffffff,
59*4882a593Smuzhiyun 			0xffffffffffffffff,
60*4882a593Smuzhiyun 			0xffffffffffffffff,
61*4882a593Smuzhiyun 			0xffffffffffffffff,
62*4882a593Smuzhiyun 			0xffffffffffffffff,
63*4882a593Smuzhiyun 			0xffffffffffffffff,
64*4882a593Smuzhiyun 		},
65*4882a593Smuzhiyun 		{
66*4882a593Smuzhiyun 			0x00000002,
67*4882a593Smuzhiyun 			0x00000001,
68*4882a593Smuzhiyun 			0x00000002
69*4882a593Smuzhiyun 		}
70*4882a593Smuzhiyun 	},
71*4882a593Smuzhiyun 	{
72*4882a593Smuzhiyun 		"vphn: 3 x 16-bit values",
73*4882a593Smuzhiyun 		{
74*4882a593Smuzhiyun 			0x800180028003ffff,
75*4882a593Smuzhiyun 			0xffffffffffffffff,
76*4882a593Smuzhiyun 			0xffffffffffffffff,
77*4882a593Smuzhiyun 			0xffffffffffffffff,
78*4882a593Smuzhiyun 			0xffffffffffffffff,
79*4882a593Smuzhiyun 			0xffffffffffffffff,
80*4882a593Smuzhiyun 		},
81*4882a593Smuzhiyun 		{
82*4882a593Smuzhiyun 			0x00000003,
83*4882a593Smuzhiyun 			0x00000001,
84*4882a593Smuzhiyun 			0x00000002,
85*4882a593Smuzhiyun 			0x00000003
86*4882a593Smuzhiyun 		}
87*4882a593Smuzhiyun 	},
88*4882a593Smuzhiyun 	{
89*4882a593Smuzhiyun 		"vphn: 4 x 16-bit values",
90*4882a593Smuzhiyun 		{
91*4882a593Smuzhiyun 			0x8001800280038004,
92*4882a593Smuzhiyun 			0xffffffffffffffff,
93*4882a593Smuzhiyun 			0xffffffffffffffff,
94*4882a593Smuzhiyun 			0xffffffffffffffff,
95*4882a593Smuzhiyun 			0xffffffffffffffff,
96*4882a593Smuzhiyun 			0xffffffffffffffff,
97*4882a593Smuzhiyun 		},
98*4882a593Smuzhiyun 		{
99*4882a593Smuzhiyun 			0x00000004,
100*4882a593Smuzhiyun 			0x00000001,
101*4882a593Smuzhiyun 			0x00000002,
102*4882a593Smuzhiyun 			0x00000003,
103*4882a593Smuzhiyun 			0x00000004
104*4882a593Smuzhiyun 		}
105*4882a593Smuzhiyun 	},
106*4882a593Smuzhiyun 	{
107*4882a593Smuzhiyun 		/* Parsing the next 16-bit value out of the next 64-bit input
108*4882a593Smuzhiyun 		 * value.
109*4882a593Smuzhiyun 		 */
110*4882a593Smuzhiyun 		"vphn: 5 x 16-bit values",
111*4882a593Smuzhiyun 		{
112*4882a593Smuzhiyun 			0x8001800280038004,
113*4882a593Smuzhiyun 			0x8005ffffffffffff,
114*4882a593Smuzhiyun 			0xffffffffffffffff,
115*4882a593Smuzhiyun 			0xffffffffffffffff,
116*4882a593Smuzhiyun 			0xffffffffffffffff,
117*4882a593Smuzhiyun 			0xffffffffffffffff,
118*4882a593Smuzhiyun 		},
119*4882a593Smuzhiyun 		{
120*4882a593Smuzhiyun 			0x00000005,
121*4882a593Smuzhiyun 			0x00000001,
122*4882a593Smuzhiyun 			0x00000002,
123*4882a593Smuzhiyun 			0x00000003,
124*4882a593Smuzhiyun 			0x00000004,
125*4882a593Smuzhiyun 			0x00000005
126*4882a593Smuzhiyun 		}
127*4882a593Smuzhiyun 	},
128*4882a593Smuzhiyun 	{
129*4882a593Smuzhiyun 		/* Parse at most 6 x 64-bit input values */
130*4882a593Smuzhiyun 		"vphn: 24 x 16-bit values",
131*4882a593Smuzhiyun 		{
132*4882a593Smuzhiyun 			0x8001800280038004,
133*4882a593Smuzhiyun 			0x8005800680078008,
134*4882a593Smuzhiyun 			0x8009800a800b800c,
135*4882a593Smuzhiyun 			0x800d800e800f8010,
136*4882a593Smuzhiyun 			0x8011801280138014,
137*4882a593Smuzhiyun 			0x8015801680178018
138*4882a593Smuzhiyun 		},
139*4882a593Smuzhiyun 		{
140*4882a593Smuzhiyun 			0x00000018,
141*4882a593Smuzhiyun 			0x00000001,
142*4882a593Smuzhiyun 			0x00000002,
143*4882a593Smuzhiyun 			0x00000003,
144*4882a593Smuzhiyun 			0x00000004,
145*4882a593Smuzhiyun 			0x00000005,
146*4882a593Smuzhiyun 			0x00000006,
147*4882a593Smuzhiyun 			0x00000007,
148*4882a593Smuzhiyun 			0x00000008,
149*4882a593Smuzhiyun 			0x00000009,
150*4882a593Smuzhiyun 			0x0000000a,
151*4882a593Smuzhiyun 			0x0000000b,
152*4882a593Smuzhiyun 			0x0000000c,
153*4882a593Smuzhiyun 			0x0000000d,
154*4882a593Smuzhiyun 			0x0000000e,
155*4882a593Smuzhiyun 			0x0000000f,
156*4882a593Smuzhiyun 			0x00000010,
157*4882a593Smuzhiyun 			0x00000011,
158*4882a593Smuzhiyun 			0x00000012,
159*4882a593Smuzhiyun 			0x00000013,
160*4882a593Smuzhiyun 			0x00000014,
161*4882a593Smuzhiyun 			0x00000015,
162*4882a593Smuzhiyun 			0x00000016,
163*4882a593Smuzhiyun 			0x00000017,
164*4882a593Smuzhiyun 			0x00000018
165*4882a593Smuzhiyun 		}
166*4882a593Smuzhiyun 	},
167*4882a593Smuzhiyun 	{
168*4882a593Smuzhiyun 		"vphn: 1 x 32-bit value",
169*4882a593Smuzhiyun 		{
170*4882a593Smuzhiyun 			0x00000001ffffffff,
171*4882a593Smuzhiyun 			0xffffffffffffffff,
172*4882a593Smuzhiyun 			0xffffffffffffffff,
173*4882a593Smuzhiyun 			0xffffffffffffffff,
174*4882a593Smuzhiyun 			0xffffffffffffffff,
175*4882a593Smuzhiyun 			0xffffffffffffffff
176*4882a593Smuzhiyun 		},
177*4882a593Smuzhiyun 		{
178*4882a593Smuzhiyun 			0x00000001,
179*4882a593Smuzhiyun 			0x00000001
180*4882a593Smuzhiyun 		}
181*4882a593Smuzhiyun 	},
182*4882a593Smuzhiyun 	{
183*4882a593Smuzhiyun 		"vphn: 2 x 32-bit values",
184*4882a593Smuzhiyun 		{
185*4882a593Smuzhiyun 			0x0000000100000002,
186*4882a593Smuzhiyun 			0xffffffffffffffff,
187*4882a593Smuzhiyun 			0xffffffffffffffff,
188*4882a593Smuzhiyun 			0xffffffffffffffff,
189*4882a593Smuzhiyun 			0xffffffffffffffff,
190*4882a593Smuzhiyun 			0xffffffffffffffff
191*4882a593Smuzhiyun 		},
192*4882a593Smuzhiyun 		{
193*4882a593Smuzhiyun 			0x00000002,
194*4882a593Smuzhiyun 			0x00000001,
195*4882a593Smuzhiyun 			0x00000002
196*4882a593Smuzhiyun 		}
197*4882a593Smuzhiyun 	},
198*4882a593Smuzhiyun 	{
199*4882a593Smuzhiyun 		/* Parsing the next 32-bit value out of the next 64-bit input
200*4882a593Smuzhiyun 		 * value.
201*4882a593Smuzhiyun 		 */
202*4882a593Smuzhiyun 		"vphn: 3 x 32-bit values",
203*4882a593Smuzhiyun 		{
204*4882a593Smuzhiyun 			0x0000000100000002,
205*4882a593Smuzhiyun 			0x00000003ffffffff,
206*4882a593Smuzhiyun 			0xffffffffffffffff,
207*4882a593Smuzhiyun 			0xffffffffffffffff,
208*4882a593Smuzhiyun 			0xffffffffffffffff,
209*4882a593Smuzhiyun 			0xffffffffffffffff
210*4882a593Smuzhiyun 		},
211*4882a593Smuzhiyun 		{
212*4882a593Smuzhiyun 			0x00000003,
213*4882a593Smuzhiyun 			0x00000001,
214*4882a593Smuzhiyun 			0x00000002,
215*4882a593Smuzhiyun 			0x00000003
216*4882a593Smuzhiyun 		}
217*4882a593Smuzhiyun 	},
218*4882a593Smuzhiyun 	{
219*4882a593Smuzhiyun 		/* Parse at most 6 x 64-bit input values */
220*4882a593Smuzhiyun 		"vphn: 12 x 32-bit values",
221*4882a593Smuzhiyun 		{
222*4882a593Smuzhiyun 			0x0000000100000002,
223*4882a593Smuzhiyun 			0x0000000300000004,
224*4882a593Smuzhiyun 			0x0000000500000006,
225*4882a593Smuzhiyun 			0x0000000700000008,
226*4882a593Smuzhiyun 			0x000000090000000a,
227*4882a593Smuzhiyun 			0x0000000b0000000c
228*4882a593Smuzhiyun 		},
229*4882a593Smuzhiyun 		{
230*4882a593Smuzhiyun 			0x0000000c,
231*4882a593Smuzhiyun 			0x00000001,
232*4882a593Smuzhiyun 			0x00000002,
233*4882a593Smuzhiyun 			0x00000003,
234*4882a593Smuzhiyun 			0x00000004,
235*4882a593Smuzhiyun 			0x00000005,
236*4882a593Smuzhiyun 			0x00000006,
237*4882a593Smuzhiyun 			0x00000007,
238*4882a593Smuzhiyun 			0x00000008,
239*4882a593Smuzhiyun 			0x00000009,
240*4882a593Smuzhiyun 			0x0000000a,
241*4882a593Smuzhiyun 			0x0000000b,
242*4882a593Smuzhiyun 			0x0000000c
243*4882a593Smuzhiyun 		}
244*4882a593Smuzhiyun 	},
245*4882a593Smuzhiyun 	{
246*4882a593Smuzhiyun 		"vphn: 16-bit value followed by 32-bit value",
247*4882a593Smuzhiyun 		{
248*4882a593Smuzhiyun 			0x800100000002ffff,
249*4882a593Smuzhiyun 			0xffffffffffffffff,
250*4882a593Smuzhiyun 			0xffffffffffffffff,
251*4882a593Smuzhiyun 			0xffffffffffffffff,
252*4882a593Smuzhiyun 			0xffffffffffffffff,
253*4882a593Smuzhiyun 			0xffffffffffffffff
254*4882a593Smuzhiyun 		},
255*4882a593Smuzhiyun 		{
256*4882a593Smuzhiyun 			0x00000002,
257*4882a593Smuzhiyun 			0x00000001,
258*4882a593Smuzhiyun 			0x00000002
259*4882a593Smuzhiyun 		}
260*4882a593Smuzhiyun 	},
261*4882a593Smuzhiyun 	{
262*4882a593Smuzhiyun 		"vphn: 32-bit value followed by 16-bit value",
263*4882a593Smuzhiyun 		{
264*4882a593Smuzhiyun 			0x000000018002ffff,
265*4882a593Smuzhiyun 			0xffffffffffffffff,
266*4882a593Smuzhiyun 			0xffffffffffffffff,
267*4882a593Smuzhiyun 			0xffffffffffffffff,
268*4882a593Smuzhiyun 			0xffffffffffffffff,
269*4882a593Smuzhiyun 			0xffffffffffffffff
270*4882a593Smuzhiyun 		},
271*4882a593Smuzhiyun 		{
272*4882a593Smuzhiyun 			0x00000002,
273*4882a593Smuzhiyun 			0x00000001,
274*4882a593Smuzhiyun 			0x00000002
275*4882a593Smuzhiyun 		}
276*4882a593Smuzhiyun 	},
277*4882a593Smuzhiyun 	{
278*4882a593Smuzhiyun 		/* Parse a 32-bit value split accross two consecutives 64-bit
279*4882a593Smuzhiyun 		 * input values.
280*4882a593Smuzhiyun 		 */
281*4882a593Smuzhiyun 		"vphn: 16-bit value followed by 2 x 32-bit values",
282*4882a593Smuzhiyun 		{
283*4882a593Smuzhiyun 			0x8001000000020000,
284*4882a593Smuzhiyun 			0x0003ffffffffffff,
285*4882a593Smuzhiyun 			0xffffffffffffffff,
286*4882a593Smuzhiyun 			0xffffffffffffffff,
287*4882a593Smuzhiyun 			0xffffffffffffffff,
288*4882a593Smuzhiyun 			0xffffffffffffffff
289*4882a593Smuzhiyun 		},
290*4882a593Smuzhiyun 		{
291*4882a593Smuzhiyun 			0x00000003,
292*4882a593Smuzhiyun 			0x00000001,
293*4882a593Smuzhiyun 			0x00000002,
294*4882a593Smuzhiyun 			0x00000003,
295*4882a593Smuzhiyun 			0x00000004,
296*4882a593Smuzhiyun 			0x00000005
297*4882a593Smuzhiyun 		}
298*4882a593Smuzhiyun 	},
299*4882a593Smuzhiyun 	{
300*4882a593Smuzhiyun 		/* The lower bits in 0x0001ffff don't get mixed up with the
301*4882a593Smuzhiyun 		 * 0xffff terminator.
302*4882a593Smuzhiyun 		 */
303*4882a593Smuzhiyun 		"vphn: 32-bit value has all ones in 16 lower bits",
304*4882a593Smuzhiyun 		{
305*4882a593Smuzhiyun 			0x0001ffff80028003,
306*4882a593Smuzhiyun 			0xffffffffffffffff,
307*4882a593Smuzhiyun 			0xffffffffffffffff,
308*4882a593Smuzhiyun 			0xffffffffffffffff,
309*4882a593Smuzhiyun 			0xffffffffffffffff,
310*4882a593Smuzhiyun 			0xffffffffffffffff
311*4882a593Smuzhiyun 		},
312*4882a593Smuzhiyun 		{
313*4882a593Smuzhiyun 			0x00000003,
314*4882a593Smuzhiyun 			0x0001ffff,
315*4882a593Smuzhiyun 			0x00000002,
316*4882a593Smuzhiyun 			0x00000003
317*4882a593Smuzhiyun 		}
318*4882a593Smuzhiyun 	},
319*4882a593Smuzhiyun 	{
320*4882a593Smuzhiyun 		/* The following input doesn't follow the specification.
321*4882a593Smuzhiyun 		 */
322*4882a593Smuzhiyun 		"vphn: last 32-bit value is truncated",
323*4882a593Smuzhiyun 		{
324*4882a593Smuzhiyun 			0x0000000100000002,
325*4882a593Smuzhiyun 			0x0000000300000004,
326*4882a593Smuzhiyun 			0x0000000500000006,
327*4882a593Smuzhiyun 			0x0000000700000008,
328*4882a593Smuzhiyun 			0x000000090000000a,
329*4882a593Smuzhiyun 			0x0000000b800c2bad
330*4882a593Smuzhiyun 		},
331*4882a593Smuzhiyun 		{
332*4882a593Smuzhiyun 			0x0000000c,
333*4882a593Smuzhiyun 			0x00000001,
334*4882a593Smuzhiyun 			0x00000002,
335*4882a593Smuzhiyun 			0x00000003,
336*4882a593Smuzhiyun 			0x00000004,
337*4882a593Smuzhiyun 			0x00000005,
338*4882a593Smuzhiyun 			0x00000006,
339*4882a593Smuzhiyun 			0x00000007,
340*4882a593Smuzhiyun 			0x00000008,
341*4882a593Smuzhiyun 			0x00000009,
342*4882a593Smuzhiyun 			0x0000000a,
343*4882a593Smuzhiyun 			0x0000000b,
344*4882a593Smuzhiyun 			0x0000000c
345*4882a593Smuzhiyun 		}
346*4882a593Smuzhiyun 	},
347*4882a593Smuzhiyun 	{
348*4882a593Smuzhiyun 		"vphn: garbage after terminator",
349*4882a593Smuzhiyun 		{
350*4882a593Smuzhiyun 			0xffff2bad2bad2bad,
351*4882a593Smuzhiyun 			0x2bad2bad2bad2bad,
352*4882a593Smuzhiyun 			0x2bad2bad2bad2bad,
353*4882a593Smuzhiyun 			0x2bad2bad2bad2bad,
354*4882a593Smuzhiyun 			0x2bad2bad2bad2bad,
355*4882a593Smuzhiyun 			0x2bad2bad2bad2bad
356*4882a593Smuzhiyun 		},
357*4882a593Smuzhiyun 		{
358*4882a593Smuzhiyun 			0x00000000
359*4882a593Smuzhiyun 		}
360*4882a593Smuzhiyun 	},
361*4882a593Smuzhiyun 	{
362*4882a593Smuzhiyun 		NULL
363*4882a593Smuzhiyun 	}
364*4882a593Smuzhiyun };
365*4882a593Smuzhiyun 
test_one(struct test * test)366*4882a593Smuzhiyun static int test_one(struct test *test)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun 	__be32 output[VPHN_ASSOC_BUFSIZE] = { 0 };
369*4882a593Smuzhiyun 	int i, len;
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	vphn_unpack_associativity(test->input, output);
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	len = be32_to_cpu(output[0]);
374*4882a593Smuzhiyun 	if (len != test->expected[0]) {
375*4882a593Smuzhiyun 		printf("expected %d elements, got %d\n", test->expected[0],
376*4882a593Smuzhiyun 		       len);
377*4882a593Smuzhiyun 		return 1;
378*4882a593Smuzhiyun 	}
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun 	for (i = 1; i < len; i++) {
381*4882a593Smuzhiyun 		u32 val = be32_to_cpu(output[i]);
382*4882a593Smuzhiyun 		if (val != test->expected[i]) {
383*4882a593Smuzhiyun 			printf("element #%d is 0x%x, should be 0x%x\n", i, val,
384*4882a593Smuzhiyun 			       test->expected[i]);
385*4882a593Smuzhiyun 			return 1;
386*4882a593Smuzhiyun 		}
387*4882a593Smuzhiyun 	}
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 	return 0;
390*4882a593Smuzhiyun }
391*4882a593Smuzhiyun 
test_vphn(void)392*4882a593Smuzhiyun static int test_vphn(void)
393*4882a593Smuzhiyun {
394*4882a593Smuzhiyun 	static struct test *test;
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun 	for (test = all_tests; test->descr; test++) {
397*4882a593Smuzhiyun 		int ret;
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 		ret = test_one(test);
400*4882a593Smuzhiyun 		test_finish(test->descr, ret);
401*4882a593Smuzhiyun 		if (ret)
402*4882a593Smuzhiyun 			return ret;
403*4882a593Smuzhiyun 	}
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	return 0;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun 
main(int argc,char ** argv)408*4882a593Smuzhiyun int main(int argc, char **argv)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun 	return test_harness(test_vphn, "test-vphn");
411*4882a593Smuzhiyun }
412