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