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