1*b886d83cSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
213c520b2SGayatri Kammela /*
313c520b2SGayatri Kammela * Copyright (C) 2016 Intel Corporation
413c520b2SGayatri Kammela *
513c520b2SGayatri Kammela * Author: Gayatri Kammela <gayatri.kammela@intel.com>
613c520b2SGayatri Kammela * Author: Megha Dey <megha.dey@linux.intel.com>
713c520b2SGayatri Kammela */
813c520b2SGayatri Kammela
913c520b2SGayatri Kammela #ifdef CONFIG_AS_AVX512
1013c520b2SGayatri Kammela
1113c520b2SGayatri Kammela #include <linux/raid/pq.h>
1213c520b2SGayatri Kammela #include "x86.h"
1313c520b2SGayatri Kammela
raid6_has_avx512(void)1413c520b2SGayatri Kammela static int raid6_has_avx512(void)
1513c520b2SGayatri Kammela {
1613c520b2SGayatri Kammela return boot_cpu_has(X86_FEATURE_AVX2) &&
1713c520b2SGayatri Kammela boot_cpu_has(X86_FEATURE_AVX) &&
1813c520b2SGayatri Kammela boot_cpu_has(X86_FEATURE_AVX512F) &&
1913c520b2SGayatri Kammela boot_cpu_has(X86_FEATURE_AVX512BW) &&
2013c520b2SGayatri Kammela boot_cpu_has(X86_FEATURE_AVX512VL) &&
2113c520b2SGayatri Kammela boot_cpu_has(X86_FEATURE_AVX512DQ);
2213c520b2SGayatri Kammela }
2313c520b2SGayatri Kammela
raid6_2data_recov_avx512(int disks,size_t bytes,int faila,int failb,void ** ptrs)2413c520b2SGayatri Kammela static void raid6_2data_recov_avx512(int disks, size_t bytes, int faila,
2513c520b2SGayatri Kammela int failb, void **ptrs)
2613c520b2SGayatri Kammela {
2713c520b2SGayatri Kammela u8 *p, *q, *dp, *dq;
2813c520b2SGayatri Kammela const u8 *pbmul; /* P multiplier table for B data */
2913c520b2SGayatri Kammela const u8 *qmul; /* Q multiplier table (for both) */
3013c520b2SGayatri Kammela const u8 x0f = 0x0f;
3113c520b2SGayatri Kammela
3213c520b2SGayatri Kammela p = (u8 *)ptrs[disks-2];
3313c520b2SGayatri Kammela q = (u8 *)ptrs[disks-1];
3413c520b2SGayatri Kammela
3513c520b2SGayatri Kammela /*
3613c520b2SGayatri Kammela * Compute syndrome with zero for the missing data pages
3713c520b2SGayatri Kammela * Use the dead data pages as temporary storage for
3813c520b2SGayatri Kammela * delta p and delta q
3913c520b2SGayatri Kammela */
4013c520b2SGayatri Kammela
4113c520b2SGayatri Kammela dp = (u8 *)ptrs[faila];
4213c520b2SGayatri Kammela ptrs[faila] = (void *)raid6_empty_zero_page;
4313c520b2SGayatri Kammela ptrs[disks-2] = dp;
4413c520b2SGayatri Kammela dq = (u8 *)ptrs[failb];
4513c520b2SGayatri Kammela ptrs[failb] = (void *)raid6_empty_zero_page;
4613c520b2SGayatri Kammela ptrs[disks-1] = dq;
4713c520b2SGayatri Kammela
4813c520b2SGayatri Kammela raid6_call.gen_syndrome(disks, bytes, ptrs);
4913c520b2SGayatri Kammela
5013c520b2SGayatri Kammela /* Restore pointer table */
5113c520b2SGayatri Kammela ptrs[faila] = dp;
5213c520b2SGayatri Kammela ptrs[failb] = dq;
5313c520b2SGayatri Kammela ptrs[disks-2] = p;
5413c520b2SGayatri Kammela ptrs[disks-1] = q;
5513c520b2SGayatri Kammela
5613c520b2SGayatri Kammela /* Now, pick the proper data tables */
5713c520b2SGayatri Kammela pbmul = raid6_vgfmul[raid6_gfexi[failb-faila]];
5813c520b2SGayatri Kammela qmul = raid6_vgfmul[raid6_gfinv[raid6_gfexp[faila] ^
5913c520b2SGayatri Kammela raid6_gfexp[failb]]];
6013c520b2SGayatri Kammela
6113c520b2SGayatri Kammela kernel_fpu_begin();
6213c520b2SGayatri Kammela
6313c520b2SGayatri Kammela /* zmm0 = x0f[16] */
6413c520b2SGayatri Kammela asm volatile("vpbroadcastb %0, %%zmm7" : : "m" (x0f));
6513c520b2SGayatri Kammela
6613c520b2SGayatri Kammela while (bytes) {
6713c520b2SGayatri Kammela #ifdef CONFIG_X86_64
6813c520b2SGayatri Kammela asm volatile("vmovdqa64 %0, %%zmm1\n\t"
6913c520b2SGayatri Kammela "vmovdqa64 %1, %%zmm9\n\t"
7013c520b2SGayatri Kammela "vmovdqa64 %2, %%zmm0\n\t"
7113c520b2SGayatri Kammela "vmovdqa64 %3, %%zmm8\n\t"
7213c520b2SGayatri Kammela "vpxorq %4, %%zmm1, %%zmm1\n\t"
7313c520b2SGayatri Kammela "vpxorq %5, %%zmm9, %%zmm9\n\t"
7413c520b2SGayatri Kammela "vpxorq %6, %%zmm0, %%zmm0\n\t"
7513c520b2SGayatri Kammela "vpxorq %7, %%zmm8, %%zmm8"
7613c520b2SGayatri Kammela :
7713c520b2SGayatri Kammela : "m" (q[0]), "m" (q[64]), "m" (p[0]),
7813c520b2SGayatri Kammela "m" (p[64]), "m" (dq[0]), "m" (dq[64]),
7913c520b2SGayatri Kammela "m" (dp[0]), "m" (dp[64]));
8013c520b2SGayatri Kammela
8113c520b2SGayatri Kammela /*
8213c520b2SGayatri Kammela * 1 = dq[0] ^ q[0]
8313c520b2SGayatri Kammela * 9 = dq[64] ^ q[64]
8413c520b2SGayatri Kammela * 0 = dp[0] ^ p[0]
8513c520b2SGayatri Kammela * 8 = dp[64] ^ p[64]
8613c520b2SGayatri Kammela */
8713c520b2SGayatri Kammela
8813c520b2SGayatri Kammela asm volatile("vbroadcasti64x2 %0, %%zmm4\n\t"
8913c520b2SGayatri Kammela "vbroadcasti64x2 %1, %%zmm5"
9013c520b2SGayatri Kammela :
9113c520b2SGayatri Kammela : "m" (qmul[0]), "m" (qmul[16]));
9213c520b2SGayatri Kammela
9313c520b2SGayatri Kammela asm volatile("vpsraw $4, %%zmm1, %%zmm3\n\t"
9413c520b2SGayatri Kammela "vpsraw $4, %%zmm9, %%zmm12\n\t"
9513c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm1, %%zmm1\n\t"
9613c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm9, %%zmm9\n\t"
9713c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm3, %%zmm3\n\t"
9813c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm12, %%zmm12\n\t"
9913c520b2SGayatri Kammela "vpshufb %%zmm9, %%zmm4, %%zmm14\n\t"
10013c520b2SGayatri Kammela "vpshufb %%zmm1, %%zmm4, %%zmm4\n\t"
10113c520b2SGayatri Kammela "vpshufb %%zmm12, %%zmm5, %%zmm15\n\t"
10213c520b2SGayatri Kammela "vpshufb %%zmm3, %%zmm5, %%zmm5\n\t"
10313c520b2SGayatri Kammela "vpxorq %%zmm14, %%zmm15, %%zmm15\n\t"
10413c520b2SGayatri Kammela "vpxorq %%zmm4, %%zmm5, %%zmm5"
10513c520b2SGayatri Kammela :
10613c520b2SGayatri Kammela : );
10713c520b2SGayatri Kammela
10813c520b2SGayatri Kammela /*
10913c520b2SGayatri Kammela * 5 = qx[0]
11013c520b2SGayatri Kammela * 15 = qx[64]
11113c520b2SGayatri Kammela */
11213c520b2SGayatri Kammela
11313c520b2SGayatri Kammela asm volatile("vbroadcasti64x2 %0, %%zmm4\n\t"
11413c520b2SGayatri Kammela "vbroadcasti64x2 %1, %%zmm1\n\t"
11513c520b2SGayatri Kammela "vpsraw $4, %%zmm0, %%zmm2\n\t"
11613c520b2SGayatri Kammela "vpsraw $4, %%zmm8, %%zmm6\n\t"
11713c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm0, %%zmm3\n\t"
11813c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm8, %%zmm14\n\t"
11913c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm2, %%zmm2\n\t"
12013c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm6, %%zmm6\n\t"
12113c520b2SGayatri Kammela "vpshufb %%zmm14, %%zmm4, %%zmm12\n\t"
12213c520b2SGayatri Kammela "vpshufb %%zmm3, %%zmm4, %%zmm4\n\t"
12313c520b2SGayatri Kammela "vpshufb %%zmm6, %%zmm1, %%zmm13\n\t"
12413c520b2SGayatri Kammela "vpshufb %%zmm2, %%zmm1, %%zmm1\n\t"
12513c520b2SGayatri Kammela "vpxorq %%zmm4, %%zmm1, %%zmm1\n\t"
12613c520b2SGayatri Kammela "vpxorq %%zmm12, %%zmm13, %%zmm13"
12713c520b2SGayatri Kammela :
12813c520b2SGayatri Kammela : "m" (pbmul[0]), "m" (pbmul[16]));
12913c520b2SGayatri Kammela
13013c520b2SGayatri Kammela /*
13113c520b2SGayatri Kammela * 1 = pbmul[px[0]]
13213c520b2SGayatri Kammela * 13 = pbmul[px[64]]
13313c520b2SGayatri Kammela */
13413c520b2SGayatri Kammela asm volatile("vpxorq %%zmm5, %%zmm1, %%zmm1\n\t"
13513c520b2SGayatri Kammela "vpxorq %%zmm15, %%zmm13, %%zmm13"
13613c520b2SGayatri Kammela :
13713c520b2SGayatri Kammela : );
13813c520b2SGayatri Kammela
13913c520b2SGayatri Kammela /*
14013c520b2SGayatri Kammela * 1 = db = DQ
14113c520b2SGayatri Kammela * 13 = db[64] = DQ[64]
14213c520b2SGayatri Kammela */
14313c520b2SGayatri Kammela asm volatile("vmovdqa64 %%zmm1, %0\n\t"
14413c520b2SGayatri Kammela "vmovdqa64 %%zmm13,%1\n\t"
14513c520b2SGayatri Kammela "vpxorq %%zmm1, %%zmm0, %%zmm0\n\t"
14613c520b2SGayatri Kammela "vpxorq %%zmm13, %%zmm8, %%zmm8"
14713c520b2SGayatri Kammela :
14813c520b2SGayatri Kammela : "m" (dq[0]), "m" (dq[64]));
14913c520b2SGayatri Kammela
15013c520b2SGayatri Kammela asm volatile("vmovdqa64 %%zmm0, %0\n\t"
15113c520b2SGayatri Kammela "vmovdqa64 %%zmm8, %1"
15213c520b2SGayatri Kammela :
15313c520b2SGayatri Kammela : "m" (dp[0]), "m" (dp[64]));
15413c520b2SGayatri Kammela
15513c520b2SGayatri Kammela bytes -= 128;
15613c520b2SGayatri Kammela p += 128;
15713c520b2SGayatri Kammela q += 128;
15813c520b2SGayatri Kammela dp += 128;
15913c520b2SGayatri Kammela dq += 128;
16013c520b2SGayatri Kammela #else
16113c520b2SGayatri Kammela asm volatile("vmovdqa64 %0, %%zmm1\n\t"
16213c520b2SGayatri Kammela "vmovdqa64 %1, %%zmm0\n\t"
16313c520b2SGayatri Kammela "vpxorq %2, %%zmm1, %%zmm1\n\t"
16413c520b2SGayatri Kammela "vpxorq %3, %%zmm0, %%zmm0"
16513c520b2SGayatri Kammela :
16613c520b2SGayatri Kammela : "m" (*q), "m" (*p), "m"(*dq), "m" (*dp));
16713c520b2SGayatri Kammela
16813c520b2SGayatri Kammela /* 1 = dq ^ q; 0 = dp ^ p */
16913c520b2SGayatri Kammela
17013c520b2SGayatri Kammela asm volatile("vbroadcasti64x2 %0, %%zmm4\n\t"
17113c520b2SGayatri Kammela "vbroadcasti64x2 %1, %%zmm5"
17213c520b2SGayatri Kammela :
17313c520b2SGayatri Kammela : "m" (qmul[0]), "m" (qmul[16]));
17413c520b2SGayatri Kammela
17513c520b2SGayatri Kammela /*
17613c520b2SGayatri Kammela * 1 = dq ^ q
17713c520b2SGayatri Kammela * 3 = dq ^ p >> 4
17813c520b2SGayatri Kammela */
17913c520b2SGayatri Kammela asm volatile("vpsraw $4, %%zmm1, %%zmm3\n\t"
18013c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm1, %%zmm1\n\t"
18113c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm3, %%zmm3\n\t"
18213c520b2SGayatri Kammela "vpshufb %%zmm1, %%zmm4, %%zmm4\n\t"
18313c520b2SGayatri Kammela "vpshufb %%zmm3, %%zmm5, %%zmm5\n\t"
18413c520b2SGayatri Kammela "vpxorq %%zmm4, %%zmm5, %%zmm5"
18513c520b2SGayatri Kammela :
18613c520b2SGayatri Kammela : );
18713c520b2SGayatri Kammela
18813c520b2SGayatri Kammela /* 5 = qx */
18913c520b2SGayatri Kammela
19013c520b2SGayatri Kammela asm volatile("vbroadcasti64x2 %0, %%zmm4\n\t"
19113c520b2SGayatri Kammela "vbroadcasti64x2 %1, %%zmm1"
19213c520b2SGayatri Kammela :
19313c520b2SGayatri Kammela : "m" (pbmul[0]), "m" (pbmul[16]));
19413c520b2SGayatri Kammela
19513c520b2SGayatri Kammela asm volatile("vpsraw $4, %%zmm0, %%zmm2\n\t"
19613c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm0, %%zmm3\n\t"
19713c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm2, %%zmm2\n\t"
19813c520b2SGayatri Kammela "vpshufb %%zmm3, %%zmm4, %%zmm4\n\t"
19913c520b2SGayatri Kammela "vpshufb %%zmm2, %%zmm1, %%zmm1\n\t"
20013c520b2SGayatri Kammela "vpxorq %%zmm4, %%zmm1, %%zmm1"
20113c520b2SGayatri Kammela :
20213c520b2SGayatri Kammela : );
20313c520b2SGayatri Kammela
20413c520b2SGayatri Kammela /* 1 = pbmul[px] */
20513c520b2SGayatri Kammela asm volatile("vpxorq %%zmm5, %%zmm1, %%zmm1\n\t"
20613c520b2SGayatri Kammela /* 1 = db = DQ */
20713c520b2SGayatri Kammela "vmovdqa64 %%zmm1, %0\n\t"
20813c520b2SGayatri Kammela :
20913c520b2SGayatri Kammela : "m" (dq[0]));
21013c520b2SGayatri Kammela
21113c520b2SGayatri Kammela asm volatile("vpxorq %%zmm1, %%zmm0, %%zmm0\n\t"
21213c520b2SGayatri Kammela "vmovdqa64 %%zmm0, %0"
21313c520b2SGayatri Kammela :
21413c520b2SGayatri Kammela : "m" (dp[0]));
21513c520b2SGayatri Kammela
21613c520b2SGayatri Kammela bytes -= 64;
21713c520b2SGayatri Kammela p += 64;
21813c520b2SGayatri Kammela q += 64;
21913c520b2SGayatri Kammela dp += 64;
22013c520b2SGayatri Kammela dq += 64;
22113c520b2SGayatri Kammela #endif
22213c520b2SGayatri Kammela }
22313c520b2SGayatri Kammela
22413c520b2SGayatri Kammela kernel_fpu_end();
22513c520b2SGayatri Kammela }
22613c520b2SGayatri Kammela
raid6_datap_recov_avx512(int disks,size_t bytes,int faila,void ** ptrs)22713c520b2SGayatri Kammela static void raid6_datap_recov_avx512(int disks, size_t bytes, int faila,
22813c520b2SGayatri Kammela void **ptrs)
22913c520b2SGayatri Kammela {
23013c520b2SGayatri Kammela u8 *p, *q, *dq;
23113c520b2SGayatri Kammela const u8 *qmul; /* Q multiplier table */
23213c520b2SGayatri Kammela const u8 x0f = 0x0f;
23313c520b2SGayatri Kammela
23413c520b2SGayatri Kammela p = (u8 *)ptrs[disks-2];
23513c520b2SGayatri Kammela q = (u8 *)ptrs[disks-1];
23613c520b2SGayatri Kammela
23713c520b2SGayatri Kammela /*
23813c520b2SGayatri Kammela * Compute syndrome with zero for the missing data page
23913c520b2SGayatri Kammela * Use the dead data page as temporary storage for delta q
24013c520b2SGayatri Kammela */
24113c520b2SGayatri Kammela
24213c520b2SGayatri Kammela dq = (u8 *)ptrs[faila];
24313c520b2SGayatri Kammela ptrs[faila] = (void *)raid6_empty_zero_page;
24413c520b2SGayatri Kammela ptrs[disks-1] = dq;
24513c520b2SGayatri Kammela
24613c520b2SGayatri Kammela raid6_call.gen_syndrome(disks, bytes, ptrs);
24713c520b2SGayatri Kammela
24813c520b2SGayatri Kammela /* Restore pointer table */
24913c520b2SGayatri Kammela ptrs[faila] = dq;
25013c520b2SGayatri Kammela ptrs[disks-1] = q;
25113c520b2SGayatri Kammela
25213c520b2SGayatri Kammela /* Now, pick the proper data tables */
25313c520b2SGayatri Kammela qmul = raid6_vgfmul[raid6_gfinv[raid6_gfexp[faila]]];
25413c520b2SGayatri Kammela
25513c520b2SGayatri Kammela kernel_fpu_begin();
25613c520b2SGayatri Kammela
25713c520b2SGayatri Kammela asm volatile("vpbroadcastb %0, %%zmm7" : : "m" (x0f));
25813c520b2SGayatri Kammela
25913c520b2SGayatri Kammela while (bytes) {
26013c520b2SGayatri Kammela #ifdef CONFIG_X86_64
26113c520b2SGayatri Kammela asm volatile("vmovdqa64 %0, %%zmm3\n\t"
26213c520b2SGayatri Kammela "vmovdqa64 %1, %%zmm8\n\t"
26313c520b2SGayatri Kammela "vpxorq %2, %%zmm3, %%zmm3\n\t"
26413c520b2SGayatri Kammela "vpxorq %3, %%zmm8, %%zmm8"
26513c520b2SGayatri Kammela :
26613c520b2SGayatri Kammela : "m" (dq[0]), "m" (dq[64]), "m" (q[0]),
26713c520b2SGayatri Kammela "m" (q[64]));
26813c520b2SGayatri Kammela
26913c520b2SGayatri Kammela /*
27013c520b2SGayatri Kammela * 3 = q[0] ^ dq[0]
27113c520b2SGayatri Kammela * 8 = q[64] ^ dq[64]
27213c520b2SGayatri Kammela */
27313c520b2SGayatri Kammela asm volatile("vbroadcasti64x2 %0, %%zmm0\n\t"
27413c520b2SGayatri Kammela "vmovapd %%zmm0, %%zmm13\n\t"
27513c520b2SGayatri Kammela "vbroadcasti64x2 %1, %%zmm1\n\t"
27613c520b2SGayatri Kammela "vmovapd %%zmm1, %%zmm14"
27713c520b2SGayatri Kammela :
27813c520b2SGayatri Kammela : "m" (qmul[0]), "m" (qmul[16]));
27913c520b2SGayatri Kammela
28013c520b2SGayatri Kammela asm volatile("vpsraw $4, %%zmm3, %%zmm6\n\t"
28113c520b2SGayatri Kammela "vpsraw $4, %%zmm8, %%zmm12\n\t"
28213c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm3, %%zmm3\n\t"
28313c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm8, %%zmm8\n\t"
28413c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm6, %%zmm6\n\t"
28513c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm12, %%zmm12\n\t"
28613c520b2SGayatri Kammela "vpshufb %%zmm3, %%zmm0, %%zmm0\n\t"
28713c520b2SGayatri Kammela "vpshufb %%zmm8, %%zmm13, %%zmm13\n\t"
28813c520b2SGayatri Kammela "vpshufb %%zmm6, %%zmm1, %%zmm1\n\t"
28913c520b2SGayatri Kammela "vpshufb %%zmm12, %%zmm14, %%zmm14\n\t"
29013c520b2SGayatri Kammela "vpxorq %%zmm0, %%zmm1, %%zmm1\n\t"
29113c520b2SGayatri Kammela "vpxorq %%zmm13, %%zmm14, %%zmm14"
29213c520b2SGayatri Kammela :
29313c520b2SGayatri Kammela : );
29413c520b2SGayatri Kammela
29513c520b2SGayatri Kammela /*
29613c520b2SGayatri Kammela * 1 = qmul[q[0] ^ dq[0]]
29713c520b2SGayatri Kammela * 14 = qmul[q[64] ^ dq[64]]
29813c520b2SGayatri Kammela */
29913c520b2SGayatri Kammela asm volatile("vmovdqa64 %0, %%zmm2\n\t"
30013c520b2SGayatri Kammela "vmovdqa64 %1, %%zmm12\n\t"
30113c520b2SGayatri Kammela "vpxorq %%zmm1, %%zmm2, %%zmm2\n\t"
30213c520b2SGayatri Kammela "vpxorq %%zmm14, %%zmm12, %%zmm12"
30313c520b2SGayatri Kammela :
30413c520b2SGayatri Kammela : "m" (p[0]), "m" (p[64]));
30513c520b2SGayatri Kammela
30613c520b2SGayatri Kammela /*
30713c520b2SGayatri Kammela * 2 = p[0] ^ qmul[q[0] ^ dq[0]]
30813c520b2SGayatri Kammela * 12 = p[64] ^ qmul[q[64] ^ dq[64]]
30913c520b2SGayatri Kammela */
31013c520b2SGayatri Kammela
31113c520b2SGayatri Kammela asm volatile("vmovdqa64 %%zmm1, %0\n\t"
31213c520b2SGayatri Kammela "vmovdqa64 %%zmm14, %1\n\t"
31313c520b2SGayatri Kammela "vmovdqa64 %%zmm2, %2\n\t"
31413c520b2SGayatri Kammela "vmovdqa64 %%zmm12,%3"
31513c520b2SGayatri Kammela :
31613c520b2SGayatri Kammela : "m" (dq[0]), "m" (dq[64]), "m" (p[0]),
31713c520b2SGayatri Kammela "m" (p[64]));
31813c520b2SGayatri Kammela
31913c520b2SGayatri Kammela bytes -= 128;
32013c520b2SGayatri Kammela p += 128;
32113c520b2SGayatri Kammela q += 128;
32213c520b2SGayatri Kammela dq += 128;
32313c520b2SGayatri Kammela #else
32413c520b2SGayatri Kammela asm volatile("vmovdqa64 %0, %%zmm3\n\t"
32513c520b2SGayatri Kammela "vpxorq %1, %%zmm3, %%zmm3"
32613c520b2SGayatri Kammela :
32713c520b2SGayatri Kammela : "m" (dq[0]), "m" (q[0]));
32813c520b2SGayatri Kammela
32913c520b2SGayatri Kammela /* 3 = q ^ dq */
33013c520b2SGayatri Kammela
33113c520b2SGayatri Kammela asm volatile("vbroadcasti64x2 %0, %%zmm0\n\t"
33213c520b2SGayatri Kammela "vbroadcasti64x2 %1, %%zmm1"
33313c520b2SGayatri Kammela :
33413c520b2SGayatri Kammela : "m" (qmul[0]), "m" (qmul[16]));
33513c520b2SGayatri Kammela
33613c520b2SGayatri Kammela asm volatile("vpsraw $4, %%zmm3, %%zmm6\n\t"
33713c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm3, %%zmm3\n\t"
33813c520b2SGayatri Kammela "vpandq %%zmm7, %%zmm6, %%zmm6\n\t"
33913c520b2SGayatri Kammela "vpshufb %%zmm3, %%zmm0, %%zmm0\n\t"
34013c520b2SGayatri Kammela "vpshufb %%zmm6, %%zmm1, %%zmm1\n\t"
34113c520b2SGayatri Kammela "vpxorq %%zmm0, %%zmm1, %%zmm1"
34213c520b2SGayatri Kammela :
34313c520b2SGayatri Kammela : );
34413c520b2SGayatri Kammela
34513c520b2SGayatri Kammela /* 1 = qmul[q ^ dq] */
34613c520b2SGayatri Kammela
34713c520b2SGayatri Kammela asm volatile("vmovdqa64 %0, %%zmm2\n\t"
34813c520b2SGayatri Kammela "vpxorq %%zmm1, %%zmm2, %%zmm2"
34913c520b2SGayatri Kammela :
35013c520b2SGayatri Kammela : "m" (p[0]));
35113c520b2SGayatri Kammela
35213c520b2SGayatri Kammela /* 2 = p ^ qmul[q ^ dq] */
35313c520b2SGayatri Kammela
35413c520b2SGayatri Kammela asm volatile("vmovdqa64 %%zmm1, %0\n\t"
35513c520b2SGayatri Kammela "vmovdqa64 %%zmm2, %1"
35613c520b2SGayatri Kammela :
35713c520b2SGayatri Kammela : "m" (dq[0]), "m" (p[0]));
35813c520b2SGayatri Kammela
35913c520b2SGayatri Kammela bytes -= 64;
36013c520b2SGayatri Kammela p += 64;
36113c520b2SGayatri Kammela q += 64;
36213c520b2SGayatri Kammela dq += 64;
36313c520b2SGayatri Kammela #endif
36413c520b2SGayatri Kammela }
36513c520b2SGayatri Kammela
36613c520b2SGayatri Kammela kernel_fpu_end();
36713c520b2SGayatri Kammela }
36813c520b2SGayatri Kammela
36913c520b2SGayatri Kammela const struct raid6_recov_calls raid6_recov_avx512 = {
37013c520b2SGayatri Kammela .data2 = raid6_2data_recov_avx512,
37113c520b2SGayatri Kammela .datap = raid6_datap_recov_avx512,
37213c520b2SGayatri Kammela .valid = raid6_has_avx512,
37313c520b2SGayatri Kammela #ifdef CONFIG_X86_64
37413c520b2SGayatri Kammela .name = "avx512x2",
37513c520b2SGayatri Kammela #else
37613c520b2SGayatri Kammela .name = "avx512x1",
37713c520b2SGayatri Kammela #endif
37813c520b2SGayatri Kammela .priority = 3,
37913c520b2SGayatri Kammela };
38013c520b2SGayatri Kammela
38113c520b2SGayatri Kammela #else
38213c520b2SGayatri Kammela #warning "your version of binutils lacks AVX512 support"
38313c520b2SGayatri Kammela #endif
384