xref: /linux/lib/raid6/mktables.c (revision a1c613ae4c322ddd58d5a8539dbfba2a0380a8c0)
1d6910058SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2f5e70d0fSDavid Woodhouse /* -*- linux-c -*- ------------------------------------------------------- *
3f5e70d0fSDavid Woodhouse  *
4f5e70d0fSDavid Woodhouse  *   Copyright 2002-2007 H. Peter Anvin - All Rights Reserved
5f5e70d0fSDavid Woodhouse  *
6f5e70d0fSDavid Woodhouse  * ----------------------------------------------------------------------- */
7f5e70d0fSDavid Woodhouse 
8f5e70d0fSDavid Woodhouse /*
9f5e70d0fSDavid Woodhouse  * mktables.c
10f5e70d0fSDavid Woodhouse  *
11f5e70d0fSDavid Woodhouse  * Make RAID-6 tables.  This is a host user space program to be run at
12f5e70d0fSDavid Woodhouse  * compile time.
13f5e70d0fSDavid Woodhouse  */
14f5e70d0fSDavid Woodhouse 
15f5e70d0fSDavid Woodhouse #include <stdio.h>
16f5e70d0fSDavid Woodhouse #include <string.h>
17f5e70d0fSDavid Woodhouse #include <inttypes.h>
18f5e70d0fSDavid Woodhouse #include <stdlib.h>
19f5e70d0fSDavid Woodhouse #include <time.h>
20f5e70d0fSDavid Woodhouse 
gfmul(uint8_t a,uint8_t b)21f5e70d0fSDavid Woodhouse static uint8_t gfmul(uint8_t a, uint8_t b)
22f5e70d0fSDavid Woodhouse {
23f5e70d0fSDavid Woodhouse 	uint8_t v = 0;
24f5e70d0fSDavid Woodhouse 
25f5e70d0fSDavid Woodhouse 	while (b) {
26f5e70d0fSDavid Woodhouse 		if (b & 1)
27f5e70d0fSDavid Woodhouse 			v ^= a;
28f5e70d0fSDavid Woodhouse 		a = (a << 1) ^ (a & 0x80 ? 0x1d : 0);
29f5e70d0fSDavid Woodhouse 		b >>= 1;
30f5e70d0fSDavid Woodhouse 	}
31f5e70d0fSDavid Woodhouse 
32f5e70d0fSDavid Woodhouse 	return v;
33f5e70d0fSDavid Woodhouse }
34f5e70d0fSDavid Woodhouse 
gfpow(uint8_t a,int b)35f5e70d0fSDavid Woodhouse static uint8_t gfpow(uint8_t a, int b)
36f5e70d0fSDavid Woodhouse {
37f5e70d0fSDavid Woodhouse 	uint8_t v = 1;
38f5e70d0fSDavid Woodhouse 
39f5e70d0fSDavid Woodhouse 	b %= 255;
40f5e70d0fSDavid Woodhouse 	if (b < 0)
41f5e70d0fSDavid Woodhouse 		b += 255;
42f5e70d0fSDavid Woodhouse 
43f5e70d0fSDavid Woodhouse 	while (b) {
44f5e70d0fSDavid Woodhouse 		if (b & 1)
45f5e70d0fSDavid Woodhouse 			v = gfmul(v, a);
46f5e70d0fSDavid Woodhouse 		a = gfmul(a, a);
47f5e70d0fSDavid Woodhouse 		b >>= 1;
48f5e70d0fSDavid Woodhouse 	}
49f5e70d0fSDavid Woodhouse 
50f5e70d0fSDavid Woodhouse 	return v;
51f5e70d0fSDavid Woodhouse }
52f5e70d0fSDavid Woodhouse 
main(int argc,char * argv[])53f5e70d0fSDavid Woodhouse int main(int argc, char *argv[])
54f5e70d0fSDavid Woodhouse {
55f5e70d0fSDavid Woodhouse 	int i, j, k;
56f5e70d0fSDavid Woodhouse 	uint8_t v;
57f5e70d0fSDavid Woodhouse 	uint8_t exptbl[256], invtbl[256];
58f5e70d0fSDavid Woodhouse 
59*9dd6e1daSWANG Xuerui 	printf("#ifdef __KERNEL__\n");
60daaa5f7cSPaul Gortmaker 	printf("#include <linux/export.h>\n");
61*9dd6e1daSWANG Xuerui 	printf("#endif\n");
625e5ac01cSZhengyuan Liu 	printf("#include <linux/raid/pq.h>\n");
63f5e70d0fSDavid Woodhouse 
64f5e70d0fSDavid Woodhouse 	/* Compute multiplication table */
65f5e70d0fSDavid Woodhouse 	printf("\nconst u8  __attribute__((aligned(256)))\n"
66f5e70d0fSDavid Woodhouse 		"raid6_gfmul[256][256] =\n"
67f5e70d0fSDavid Woodhouse 		"{\n");
68f5e70d0fSDavid Woodhouse 	for (i = 0; i < 256; i++) {
69f5e70d0fSDavid Woodhouse 		printf("\t{\n");
70f5e70d0fSDavid Woodhouse 		for (j = 0; j < 256; j += 8) {
71f5e70d0fSDavid Woodhouse 			printf("\t\t");
72f5e70d0fSDavid Woodhouse 			for (k = 0; k < 8; k++)
73f5e70d0fSDavid Woodhouse 				printf("0x%02x,%c", gfmul(i, j + k),
74f5e70d0fSDavid Woodhouse 				       (k == 7) ? '\n' : ' ');
75f5e70d0fSDavid Woodhouse 		}
76f5e70d0fSDavid Woodhouse 		printf("\t},\n");
77f5e70d0fSDavid Woodhouse 	}
78f5e70d0fSDavid Woodhouse 	printf("};\n");
79f5e70d0fSDavid Woodhouse 	printf("#ifdef __KERNEL__\n");
80f5e70d0fSDavid Woodhouse 	printf("EXPORT_SYMBOL(raid6_gfmul);\n");
81f5e70d0fSDavid Woodhouse 	printf("#endif\n");
82f5e70d0fSDavid Woodhouse 
83048a8b8cSJim Kukunas 	/* Compute vector multiplication table */
84048a8b8cSJim Kukunas 	printf("\nconst u8  __attribute__((aligned(256)))\n"
85048a8b8cSJim Kukunas 		"raid6_vgfmul[256][32] =\n"
86048a8b8cSJim Kukunas 		"{\n");
87048a8b8cSJim Kukunas 	for (i = 0; i < 256; i++) {
88048a8b8cSJim Kukunas 		printf("\t{\n");
89048a8b8cSJim Kukunas 		for (j = 0; j < 16; j += 8) {
90048a8b8cSJim Kukunas 			printf("\t\t");
91048a8b8cSJim Kukunas 			for (k = 0; k < 8; k++)
92048a8b8cSJim Kukunas 				printf("0x%02x,%c", gfmul(i, j + k),
93048a8b8cSJim Kukunas 				       (k == 7) ? '\n' : ' ');
94048a8b8cSJim Kukunas 		}
95048a8b8cSJim Kukunas 		for (j = 0; j < 16; j += 8) {
96048a8b8cSJim Kukunas 			printf("\t\t");
97048a8b8cSJim Kukunas 			for (k = 0; k < 8; k++)
98048a8b8cSJim Kukunas 				printf("0x%02x,%c", gfmul(i, (j + k) << 4),
99048a8b8cSJim Kukunas 				       (k == 7) ? '\n' : ' ');
100048a8b8cSJim Kukunas 		}
101048a8b8cSJim Kukunas 		printf("\t},\n");
102048a8b8cSJim Kukunas 	}
103048a8b8cSJim Kukunas 	printf("};\n");
104048a8b8cSJim Kukunas 	printf("#ifdef __KERNEL__\n");
105048a8b8cSJim Kukunas 	printf("EXPORT_SYMBOL(raid6_vgfmul);\n");
106048a8b8cSJim Kukunas 	printf("#endif\n");
107048a8b8cSJim Kukunas 
108f5e70d0fSDavid Woodhouse 	/* Compute power-of-2 table (exponent) */
109f5e70d0fSDavid Woodhouse 	v = 1;
110f5e70d0fSDavid Woodhouse 	printf("\nconst u8 __attribute__((aligned(256)))\n"
111f5e70d0fSDavid Woodhouse 	       "raid6_gfexp[256] =\n" "{\n");
112f5e70d0fSDavid Woodhouse 	for (i = 0; i < 256; i += 8) {
113f5e70d0fSDavid Woodhouse 		printf("\t");
114f5e70d0fSDavid Woodhouse 		for (j = 0; j < 8; j++) {
115f5e70d0fSDavid Woodhouse 			exptbl[i + j] = v;
116f5e70d0fSDavid Woodhouse 			printf("0x%02x,%c", v, (j == 7) ? '\n' : ' ');
117f5e70d0fSDavid Woodhouse 			v = gfmul(v, 2);
118f5e70d0fSDavid Woodhouse 			if (v == 1)
119f5e70d0fSDavid Woodhouse 				v = 0;	/* For entry 255, not a real entry */
120f5e70d0fSDavid Woodhouse 		}
121f5e70d0fSDavid Woodhouse 	}
122f5e70d0fSDavid Woodhouse 	printf("};\n");
123f5e70d0fSDavid Woodhouse 	printf("#ifdef __KERNEL__\n");
124f5e70d0fSDavid Woodhouse 	printf("EXPORT_SYMBOL(raid6_gfexp);\n");
125f5e70d0fSDavid Woodhouse 	printf("#endif\n");
126f5e70d0fSDavid Woodhouse 
127b5dceda1SAnup Patel 	/* Compute log-of-2 table */
128b5dceda1SAnup Patel 	printf("\nconst u8 __attribute__((aligned(256)))\n"
129b5dceda1SAnup Patel 	       "raid6_gflog[256] =\n" "{\n");
130b5dceda1SAnup Patel 	for (i = 0; i < 256; i += 8) {
131b5dceda1SAnup Patel 		printf("\t");
132b5dceda1SAnup Patel 		for (j = 0; j < 8; j++) {
133b5dceda1SAnup Patel 			v = 255;
134b5dceda1SAnup Patel 			for (k = 0; k < 256; k++)
135b5dceda1SAnup Patel 				if (exptbl[k] == (i + j)) {
136b5dceda1SAnup Patel 					v = k;
137b5dceda1SAnup Patel 					break;
138b5dceda1SAnup Patel 				}
139b5dceda1SAnup Patel 			printf("0x%02x,%c", v, (j == 7) ? '\n' : ' ');
140b5dceda1SAnup Patel 		}
141b5dceda1SAnup Patel 	}
142b5dceda1SAnup Patel 	printf("};\n");
143b5dceda1SAnup Patel 	printf("#ifdef __KERNEL__\n");
144b5dceda1SAnup Patel 	printf("EXPORT_SYMBOL(raid6_gflog);\n");
145b5dceda1SAnup Patel 	printf("#endif\n");
146b5dceda1SAnup Patel 
147f5e70d0fSDavid Woodhouse 	/* Compute inverse table x^-1 == x^254 */
148f5e70d0fSDavid Woodhouse 	printf("\nconst u8 __attribute__((aligned(256)))\n"
149f5e70d0fSDavid Woodhouse 	       "raid6_gfinv[256] =\n" "{\n");
150f5e70d0fSDavid Woodhouse 	for (i = 0; i < 256; i += 8) {
151f5e70d0fSDavid Woodhouse 		printf("\t");
152f5e70d0fSDavid Woodhouse 		for (j = 0; j < 8; j++) {
153f5e70d0fSDavid Woodhouse 			invtbl[i + j] = v = gfpow(i + j, 254);
154f5e70d0fSDavid Woodhouse 			printf("0x%02x,%c", v, (j == 7) ? '\n' : ' ');
155f5e70d0fSDavid Woodhouse 		}
156f5e70d0fSDavid Woodhouse 	}
157f5e70d0fSDavid Woodhouse 	printf("};\n");
158f5e70d0fSDavid Woodhouse 	printf("#ifdef __KERNEL__\n");
159f5e70d0fSDavid Woodhouse 	printf("EXPORT_SYMBOL(raid6_gfinv);\n");
160f5e70d0fSDavid Woodhouse 	printf("#endif\n");
161f5e70d0fSDavid Woodhouse 
162f5e70d0fSDavid Woodhouse 	/* Compute inv(2^x + 1) (exponent-xor-inverse) table */
163f5e70d0fSDavid Woodhouse 	printf("\nconst u8 __attribute__((aligned(256)))\n"
164f5e70d0fSDavid Woodhouse 	       "raid6_gfexi[256] =\n" "{\n");
165f5e70d0fSDavid Woodhouse 	for (i = 0; i < 256; i += 8) {
166f5e70d0fSDavid Woodhouse 		printf("\t");
167f5e70d0fSDavid Woodhouse 		for (j = 0; j < 8; j++)
168f5e70d0fSDavid Woodhouse 			printf("0x%02x,%c", invtbl[exptbl[i + j] ^ 1],
169f5e70d0fSDavid Woodhouse 			       (j == 7) ? '\n' : ' ');
170f5e70d0fSDavid Woodhouse 	}
171f5e70d0fSDavid Woodhouse 	printf("};\n");
172f5e70d0fSDavid Woodhouse 	printf("#ifdef __KERNEL__\n");
173f5e70d0fSDavid Woodhouse 	printf("EXPORT_SYMBOL(raid6_gfexi);\n");
174f5e70d0fSDavid Woodhouse 	printf("#endif\n");
175f5e70d0fSDavid Woodhouse 
176f5e70d0fSDavid Woodhouse 	return 0;
177f5e70d0fSDavid Woodhouse }
178