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 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 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 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