1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
258dae828SGreg Kurz #include <stdio.h>
358dae828SGreg Kurz #include <byteswap.h>
458dae828SGreg Kurz #include "utils.h"
558dae828SGreg Kurz #include "subunit.h"
658dae828SGreg Kurz 
758dae828SGreg Kurz #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
858dae828SGreg Kurz #define cpu_to_be32(x)		bswap_32(x)
958dae828SGreg Kurz #define be32_to_cpu(x)		bswap_32(x)
1058dae828SGreg Kurz #define be16_to_cpup(x)		bswap_16(*x)
1158dae828SGreg Kurz #define cpu_to_be64(x)		bswap_64(x)
1258dae828SGreg Kurz #else
1358dae828SGreg Kurz #define cpu_to_be32(x)		(x)
1458dae828SGreg Kurz #define be32_to_cpu(x)		(x)
1558dae828SGreg Kurz #define be16_to_cpup(x)		(*x)
1658dae828SGreg Kurz #define cpu_to_be64(x)		(x)
1758dae828SGreg Kurz #endif
1858dae828SGreg Kurz 
1958dae828SGreg Kurz #include "vphn.c"
2058dae828SGreg Kurz 
2158dae828SGreg Kurz static struct test {
2258dae828SGreg Kurz 	char *descr;
2358dae828SGreg Kurz 	long input[VPHN_REGISTER_COUNT];
2458dae828SGreg Kurz 	u32 expected[VPHN_ASSOC_BUFSIZE];
2558dae828SGreg Kurz } all_tests[] = {
2658dae828SGreg Kurz 	{
2758dae828SGreg Kurz 		"vphn: no data",
2858dae828SGreg Kurz 		{
2958dae828SGreg Kurz 			0xffffffffffffffff,
3058dae828SGreg Kurz 			0xffffffffffffffff,
3158dae828SGreg Kurz 			0xffffffffffffffff,
3258dae828SGreg Kurz 			0xffffffffffffffff,
3358dae828SGreg Kurz 			0xffffffffffffffff,
3458dae828SGreg Kurz 			0xffffffffffffffff,
3558dae828SGreg Kurz 		},
3658dae828SGreg Kurz 		{
3758dae828SGreg Kurz 			0x00000000
3858dae828SGreg Kurz 		}
3958dae828SGreg Kurz 	},
4058dae828SGreg Kurz 	{
4158dae828SGreg Kurz 		"vphn: 1 x 16-bit value",
4258dae828SGreg Kurz 		{
4358dae828SGreg Kurz 			0x8001ffffffffffff,
4458dae828SGreg Kurz 			0xffffffffffffffff,
4558dae828SGreg Kurz 			0xffffffffffffffff,
4658dae828SGreg Kurz 			0xffffffffffffffff,
4758dae828SGreg Kurz 			0xffffffffffffffff,
4858dae828SGreg Kurz 			0xffffffffffffffff,
4958dae828SGreg Kurz 		},
5058dae828SGreg Kurz 		{
5158dae828SGreg Kurz 			0x00000001,
5258dae828SGreg Kurz 			0x00000001
5358dae828SGreg Kurz 		}
5458dae828SGreg Kurz 	},
5558dae828SGreg Kurz 	{
5658dae828SGreg Kurz 		"vphn: 2 x 16-bit values",
5758dae828SGreg Kurz 		{
5858dae828SGreg Kurz 			0x80018002ffffffff,
5958dae828SGreg Kurz 			0xffffffffffffffff,
6058dae828SGreg Kurz 			0xffffffffffffffff,
6158dae828SGreg Kurz 			0xffffffffffffffff,
6258dae828SGreg Kurz 			0xffffffffffffffff,
6358dae828SGreg Kurz 			0xffffffffffffffff,
6458dae828SGreg Kurz 		},
6558dae828SGreg Kurz 		{
6658dae828SGreg Kurz 			0x00000002,
6758dae828SGreg Kurz 			0x00000001,
6858dae828SGreg Kurz 			0x00000002
6958dae828SGreg Kurz 		}
7058dae828SGreg Kurz 	},
7158dae828SGreg Kurz 	{
7258dae828SGreg Kurz 		"vphn: 3 x 16-bit values",
7358dae828SGreg Kurz 		{
7458dae828SGreg Kurz 			0x800180028003ffff,
7558dae828SGreg Kurz 			0xffffffffffffffff,
7658dae828SGreg Kurz 			0xffffffffffffffff,
7758dae828SGreg Kurz 			0xffffffffffffffff,
7858dae828SGreg Kurz 			0xffffffffffffffff,
7958dae828SGreg Kurz 			0xffffffffffffffff,
8058dae828SGreg Kurz 		},
8158dae828SGreg Kurz 		{
8258dae828SGreg Kurz 			0x00000003,
8358dae828SGreg Kurz 			0x00000001,
8458dae828SGreg Kurz 			0x00000002,
8558dae828SGreg Kurz 			0x00000003
8658dae828SGreg Kurz 		}
8758dae828SGreg Kurz 	},
8858dae828SGreg Kurz 	{
8958dae828SGreg Kurz 		"vphn: 4 x 16-bit values",
9058dae828SGreg Kurz 		{
9158dae828SGreg Kurz 			0x8001800280038004,
9258dae828SGreg Kurz 			0xffffffffffffffff,
9358dae828SGreg Kurz 			0xffffffffffffffff,
9458dae828SGreg Kurz 			0xffffffffffffffff,
9558dae828SGreg Kurz 			0xffffffffffffffff,
9658dae828SGreg Kurz 			0xffffffffffffffff,
9758dae828SGreg Kurz 		},
9858dae828SGreg Kurz 		{
9958dae828SGreg Kurz 			0x00000004,
10058dae828SGreg Kurz 			0x00000001,
10158dae828SGreg Kurz 			0x00000002,
10258dae828SGreg Kurz 			0x00000003,
10358dae828SGreg Kurz 			0x00000004
10458dae828SGreg Kurz 		}
10558dae828SGreg Kurz 	},
10658dae828SGreg Kurz 	{
10758dae828SGreg Kurz 		/* Parsing the next 16-bit value out of the next 64-bit input
10858dae828SGreg Kurz 		 * value.
10958dae828SGreg Kurz 		 */
11058dae828SGreg Kurz 		"vphn: 5 x 16-bit values",
11158dae828SGreg Kurz 		{
11258dae828SGreg Kurz 			0x8001800280038004,
11358dae828SGreg Kurz 			0x8005ffffffffffff,
11458dae828SGreg Kurz 			0xffffffffffffffff,
11558dae828SGreg Kurz 			0xffffffffffffffff,
11658dae828SGreg Kurz 			0xffffffffffffffff,
11758dae828SGreg Kurz 			0xffffffffffffffff,
11858dae828SGreg Kurz 		},
11958dae828SGreg Kurz 		{
12058dae828SGreg Kurz 			0x00000005,
12158dae828SGreg Kurz 			0x00000001,
12258dae828SGreg Kurz 			0x00000002,
12358dae828SGreg Kurz 			0x00000003,
12458dae828SGreg Kurz 			0x00000004,
12558dae828SGreg Kurz 			0x00000005
12658dae828SGreg Kurz 		}
12758dae828SGreg Kurz 	},
12858dae828SGreg Kurz 	{
12958dae828SGreg Kurz 		/* Parse at most 6 x 64-bit input values */
13058dae828SGreg Kurz 		"vphn: 24 x 16-bit values",
13158dae828SGreg Kurz 		{
13258dae828SGreg Kurz 			0x8001800280038004,
13358dae828SGreg Kurz 			0x8005800680078008,
13458dae828SGreg Kurz 			0x8009800a800b800c,
13558dae828SGreg Kurz 			0x800d800e800f8010,
13658dae828SGreg Kurz 			0x8011801280138014,
13758dae828SGreg Kurz 			0x8015801680178018
13858dae828SGreg Kurz 		},
13958dae828SGreg Kurz 		{
14058dae828SGreg Kurz 			0x00000018,
14158dae828SGreg Kurz 			0x00000001,
14258dae828SGreg Kurz 			0x00000002,
14358dae828SGreg Kurz 			0x00000003,
14458dae828SGreg Kurz 			0x00000004,
14558dae828SGreg Kurz 			0x00000005,
14658dae828SGreg Kurz 			0x00000006,
14758dae828SGreg Kurz 			0x00000007,
14858dae828SGreg Kurz 			0x00000008,
14958dae828SGreg Kurz 			0x00000009,
15058dae828SGreg Kurz 			0x0000000a,
15158dae828SGreg Kurz 			0x0000000b,
15258dae828SGreg Kurz 			0x0000000c,
15358dae828SGreg Kurz 			0x0000000d,
15458dae828SGreg Kurz 			0x0000000e,
15558dae828SGreg Kurz 			0x0000000f,
15658dae828SGreg Kurz 			0x00000010,
15758dae828SGreg Kurz 			0x00000011,
15858dae828SGreg Kurz 			0x00000012,
15958dae828SGreg Kurz 			0x00000013,
16058dae828SGreg Kurz 			0x00000014,
16158dae828SGreg Kurz 			0x00000015,
16258dae828SGreg Kurz 			0x00000016,
16358dae828SGreg Kurz 			0x00000017,
16458dae828SGreg Kurz 			0x00000018
16558dae828SGreg Kurz 		}
16658dae828SGreg Kurz 	},
16758dae828SGreg Kurz 	{
16858dae828SGreg Kurz 		"vphn: 1 x 32-bit value",
16958dae828SGreg Kurz 		{
17058dae828SGreg Kurz 			0x00000001ffffffff,
17158dae828SGreg Kurz 			0xffffffffffffffff,
17258dae828SGreg Kurz 			0xffffffffffffffff,
17358dae828SGreg Kurz 			0xffffffffffffffff,
17458dae828SGreg Kurz 			0xffffffffffffffff,
17558dae828SGreg Kurz 			0xffffffffffffffff
17658dae828SGreg Kurz 		},
17758dae828SGreg Kurz 		{
17858dae828SGreg Kurz 			0x00000001,
17958dae828SGreg Kurz 			0x00000001
18058dae828SGreg Kurz 		}
18158dae828SGreg Kurz 	},
18258dae828SGreg Kurz 	{
18358dae828SGreg Kurz 		"vphn: 2 x 32-bit values",
18458dae828SGreg Kurz 		{
18558dae828SGreg Kurz 			0x0000000100000002,
18658dae828SGreg Kurz 			0xffffffffffffffff,
18758dae828SGreg Kurz 			0xffffffffffffffff,
18858dae828SGreg Kurz 			0xffffffffffffffff,
18958dae828SGreg Kurz 			0xffffffffffffffff,
19058dae828SGreg Kurz 			0xffffffffffffffff
19158dae828SGreg Kurz 		},
19258dae828SGreg Kurz 		{
19358dae828SGreg Kurz 			0x00000002,
19458dae828SGreg Kurz 			0x00000001,
19558dae828SGreg Kurz 			0x00000002
19658dae828SGreg Kurz 		}
19758dae828SGreg Kurz 	},
19858dae828SGreg Kurz 	{
19958dae828SGreg Kurz 		/* Parsing the next 32-bit value out of the next 64-bit input
20058dae828SGreg Kurz 		 * value.
20158dae828SGreg Kurz 		 */
20258dae828SGreg Kurz 		"vphn: 3 x 32-bit values",
20358dae828SGreg Kurz 		{
20458dae828SGreg Kurz 			0x0000000100000002,
20558dae828SGreg Kurz 			0x00000003ffffffff,
20658dae828SGreg Kurz 			0xffffffffffffffff,
20758dae828SGreg Kurz 			0xffffffffffffffff,
20858dae828SGreg Kurz 			0xffffffffffffffff,
20958dae828SGreg Kurz 			0xffffffffffffffff
21058dae828SGreg Kurz 		},
21158dae828SGreg Kurz 		{
21258dae828SGreg Kurz 			0x00000003,
21358dae828SGreg Kurz 			0x00000001,
21458dae828SGreg Kurz 			0x00000002,
21558dae828SGreg Kurz 			0x00000003
21658dae828SGreg Kurz 		}
21758dae828SGreg Kurz 	},
21858dae828SGreg Kurz 	{
21958dae828SGreg Kurz 		/* Parse at most 6 x 64-bit input values */
22058dae828SGreg Kurz 		"vphn: 12 x 32-bit values",
22158dae828SGreg Kurz 		{
22258dae828SGreg Kurz 			0x0000000100000002,
22358dae828SGreg Kurz 			0x0000000300000004,
22458dae828SGreg Kurz 			0x0000000500000006,
22558dae828SGreg Kurz 			0x0000000700000008,
22658dae828SGreg Kurz 			0x000000090000000a,
22758dae828SGreg Kurz 			0x0000000b0000000c
22858dae828SGreg Kurz 		},
22958dae828SGreg Kurz 		{
23058dae828SGreg Kurz 			0x0000000c,
23158dae828SGreg Kurz 			0x00000001,
23258dae828SGreg Kurz 			0x00000002,
23358dae828SGreg Kurz 			0x00000003,
23458dae828SGreg Kurz 			0x00000004,
23558dae828SGreg Kurz 			0x00000005,
23658dae828SGreg Kurz 			0x00000006,
23758dae828SGreg Kurz 			0x00000007,
23858dae828SGreg Kurz 			0x00000008,
23958dae828SGreg Kurz 			0x00000009,
24058dae828SGreg Kurz 			0x0000000a,
24158dae828SGreg Kurz 			0x0000000b,
24258dae828SGreg Kurz 			0x0000000c
24358dae828SGreg Kurz 		}
24458dae828SGreg Kurz 	},
24558dae828SGreg Kurz 	{
24658dae828SGreg Kurz 		"vphn: 16-bit value followed by 32-bit value",
24758dae828SGreg Kurz 		{
24858dae828SGreg Kurz 			0x800100000002ffff,
24958dae828SGreg Kurz 			0xffffffffffffffff,
25058dae828SGreg Kurz 			0xffffffffffffffff,
25158dae828SGreg Kurz 			0xffffffffffffffff,
25258dae828SGreg Kurz 			0xffffffffffffffff,
25358dae828SGreg Kurz 			0xffffffffffffffff
25458dae828SGreg Kurz 		},
25558dae828SGreg Kurz 		{
25658dae828SGreg Kurz 			0x00000002,
25758dae828SGreg Kurz 			0x00000001,
25858dae828SGreg Kurz 			0x00000002
25958dae828SGreg Kurz 		}
26058dae828SGreg Kurz 	},
26158dae828SGreg Kurz 	{
26258dae828SGreg Kurz 		"vphn: 32-bit value followed by 16-bit value",
26358dae828SGreg Kurz 		{
26458dae828SGreg Kurz 			0x000000018002ffff,
26558dae828SGreg Kurz 			0xffffffffffffffff,
26658dae828SGreg Kurz 			0xffffffffffffffff,
26758dae828SGreg Kurz 			0xffffffffffffffff,
26858dae828SGreg Kurz 			0xffffffffffffffff,
26958dae828SGreg Kurz 			0xffffffffffffffff
27058dae828SGreg Kurz 		},
27158dae828SGreg Kurz 		{
27258dae828SGreg Kurz 			0x00000002,
27358dae828SGreg Kurz 			0x00000001,
27458dae828SGreg Kurz 			0x00000002
27558dae828SGreg Kurz 		}
27658dae828SGreg Kurz 	},
27758dae828SGreg Kurz 	{
27858dae828SGreg Kurz 		/* Parse a 32-bit value split accross two consecutives 64-bit
27958dae828SGreg Kurz 		 * input values.
28058dae828SGreg Kurz 		 */
28158dae828SGreg Kurz 		"vphn: 16-bit value followed by 2 x 32-bit values",
28258dae828SGreg Kurz 		{
28358dae828SGreg Kurz 			0x8001000000020000,
28458dae828SGreg Kurz 			0x0003ffffffffffff,
28558dae828SGreg Kurz 			0xffffffffffffffff,
28658dae828SGreg Kurz 			0xffffffffffffffff,
28758dae828SGreg Kurz 			0xffffffffffffffff,
28858dae828SGreg Kurz 			0xffffffffffffffff
28958dae828SGreg Kurz 		},
29058dae828SGreg Kurz 		{
29158dae828SGreg Kurz 			0x00000003,
29258dae828SGreg Kurz 			0x00000001,
29358dae828SGreg Kurz 			0x00000002,
29458dae828SGreg Kurz 			0x00000003,
29558dae828SGreg Kurz 			0x00000004,
29658dae828SGreg Kurz 			0x00000005
29758dae828SGreg Kurz 		}
29858dae828SGreg Kurz 	},
29958dae828SGreg Kurz 	{
30058dae828SGreg Kurz 		/* The lower bits in 0x0001ffff don't get mixed up with the
30158dae828SGreg Kurz 		 * 0xffff terminator.
30258dae828SGreg Kurz 		 */
30358dae828SGreg Kurz 		"vphn: 32-bit value has all ones in 16 lower bits",
30458dae828SGreg Kurz 		{
30558dae828SGreg Kurz 			0x0001ffff80028003,
30658dae828SGreg Kurz 			0xffffffffffffffff,
30758dae828SGreg Kurz 			0xffffffffffffffff,
30858dae828SGreg Kurz 			0xffffffffffffffff,
30958dae828SGreg Kurz 			0xffffffffffffffff,
31058dae828SGreg Kurz 			0xffffffffffffffff
31158dae828SGreg Kurz 		},
31258dae828SGreg Kurz 		{
31358dae828SGreg Kurz 			0x00000003,
31458dae828SGreg Kurz 			0x0001ffff,
31558dae828SGreg Kurz 			0x00000002,
31658dae828SGreg Kurz 			0x00000003
31758dae828SGreg Kurz 		}
31858dae828SGreg Kurz 	},
31958dae828SGreg Kurz 	{
32058dae828SGreg Kurz 		/* The following input doesn't follow the specification.
32158dae828SGreg Kurz 		 */
32258dae828SGreg Kurz 		"vphn: last 32-bit value is truncated",
32358dae828SGreg Kurz 		{
32458dae828SGreg Kurz 			0x0000000100000002,
32558dae828SGreg Kurz 			0x0000000300000004,
32658dae828SGreg Kurz 			0x0000000500000006,
32758dae828SGreg Kurz 			0x0000000700000008,
32858dae828SGreg Kurz 			0x000000090000000a,
32958dae828SGreg Kurz 			0x0000000b800c2bad
33058dae828SGreg Kurz 		},
33158dae828SGreg Kurz 		{
33258dae828SGreg Kurz 			0x0000000c,
33358dae828SGreg Kurz 			0x00000001,
33458dae828SGreg Kurz 			0x00000002,
33558dae828SGreg Kurz 			0x00000003,
33658dae828SGreg Kurz 			0x00000004,
33758dae828SGreg Kurz 			0x00000005,
33858dae828SGreg Kurz 			0x00000006,
33958dae828SGreg Kurz 			0x00000007,
34058dae828SGreg Kurz 			0x00000008,
34158dae828SGreg Kurz 			0x00000009,
34258dae828SGreg Kurz 			0x0000000a,
34358dae828SGreg Kurz 			0x0000000b,
34458dae828SGreg Kurz 			0x0000000c
34558dae828SGreg Kurz 		}
34658dae828SGreg Kurz 	},
34758dae828SGreg Kurz 	{
34858dae828SGreg Kurz 		"vphn: garbage after terminator",
34958dae828SGreg Kurz 		{
35058dae828SGreg Kurz 			0xffff2bad2bad2bad,
35158dae828SGreg Kurz 			0x2bad2bad2bad2bad,
35258dae828SGreg Kurz 			0x2bad2bad2bad2bad,
35358dae828SGreg Kurz 			0x2bad2bad2bad2bad,
35458dae828SGreg Kurz 			0x2bad2bad2bad2bad,
35558dae828SGreg Kurz 			0x2bad2bad2bad2bad
35658dae828SGreg Kurz 		},
35758dae828SGreg Kurz 		{
35858dae828SGreg Kurz 			0x00000000
35958dae828SGreg Kurz 		}
36058dae828SGreg Kurz 	},
36158dae828SGreg Kurz 	{
36258dae828SGreg Kurz 		NULL
36358dae828SGreg Kurz 	}
36458dae828SGreg Kurz };
36558dae828SGreg Kurz 
test_one(struct test * test)36658dae828SGreg Kurz static int test_one(struct test *test)
36758dae828SGreg Kurz {
36858dae828SGreg Kurz 	__be32 output[VPHN_ASSOC_BUFSIZE] = { 0 };
36958dae828SGreg Kurz 	int i, len;
37058dae828SGreg Kurz 
37158dae828SGreg Kurz 	vphn_unpack_associativity(test->input, output);
37258dae828SGreg Kurz 
37358dae828SGreg Kurz 	len = be32_to_cpu(output[0]);
37458dae828SGreg Kurz 	if (len != test->expected[0]) {
37558dae828SGreg Kurz 		printf("expected %d elements, got %d\n", test->expected[0],
37658dae828SGreg Kurz 		       len);
37758dae828SGreg Kurz 		return 1;
37858dae828SGreg Kurz 	}
37958dae828SGreg Kurz 
38058dae828SGreg Kurz 	for (i = 1; i < len; i++) {
38158dae828SGreg Kurz 		u32 val = be32_to_cpu(output[i]);
38258dae828SGreg Kurz 		if (val != test->expected[i]) {
38358dae828SGreg Kurz 			printf("element #%d is 0x%x, should be 0x%x\n", i, val,
38458dae828SGreg Kurz 			       test->expected[i]);
38558dae828SGreg Kurz 			return 1;
38658dae828SGreg Kurz 		}
38758dae828SGreg Kurz 	}
38858dae828SGreg Kurz 
38958dae828SGreg Kurz 	return 0;
39058dae828SGreg Kurz }
39158dae828SGreg Kurz 
test_vphn(void)39258dae828SGreg Kurz static int test_vphn(void)
39358dae828SGreg Kurz {
39458dae828SGreg Kurz 	static struct test *test;
39558dae828SGreg Kurz 
39658dae828SGreg Kurz 	for (test = all_tests; test->descr; test++) {
39758dae828SGreg Kurz 		int ret;
39858dae828SGreg Kurz 
39958dae828SGreg Kurz 		ret = test_one(test);
40058dae828SGreg Kurz 		test_finish(test->descr, ret);
40158dae828SGreg Kurz 		if (ret)
40258dae828SGreg Kurz 			return ret;
40358dae828SGreg Kurz 	}
40458dae828SGreg Kurz 
40558dae828SGreg Kurz 	return 0;
40658dae828SGreg Kurz }
40758dae828SGreg Kurz 
main(int argc,char ** argv)40858dae828SGreg Kurz int main(int argc, char **argv)
40958dae828SGreg Kurz {
41058dae828SGreg Kurz 	return test_harness(test_vphn, "test-vphn");
41158dae828SGreg Kurz }
412