xref: /linux/lib/raid6/rvv.h (revision f4922b69165735e81752ee47d174f873e989a449)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright 2024 Institute of Software, CAS.
4  *
5  * raid6/rvv.h
6  *
7  * Definitions for RISC-V RAID-6 code
8  */
9 
10 #ifdef __KERNEL__
11 #include <asm/vector.h>
12 #else
13 #define kernel_vector_begin()
14 #define kernel_vector_end()
15 #include <sys/auxv.h>
16 #include <asm/hwcap.h>
17 #define has_vector() (getauxval(AT_HWCAP) & COMPAT_HWCAP_ISA_V)
18 #endif
19 
20 #include <linux/raid/pq.h>
21 
22 static int rvv_has_vector(void)
23 {
24 	return has_vector();
25 }
26 
27 #define RAID6_RVV_WRAPPER(_n)						\
28 	static void raid6_rvv ## _n ## _gen_syndrome(int disks,		\
29 					size_t bytes, void **ptrs)	\
30 	{								\
31 		void raid6_rvv ## _n  ## _gen_syndrome_real(int d,	\
32 					unsigned long b, void **p);	\
33 		kernel_vector_begin();					\
34 		raid6_rvv ## _n ## _gen_syndrome_real(disks,		\
35 				(unsigned long)bytes, ptrs);		\
36 		kernel_vector_end();					\
37 	}								\
38 	static void raid6_rvv ## _n ## _xor_syndrome(int disks,		\
39 					int start, int stop,		\
40 					size_t bytes, void **ptrs)	\
41 	{								\
42 		void raid6_rvv ## _n  ## _xor_syndrome_real(int d,	\
43 					int s1, int s2,			\
44 					unsigned long b, void **p);	\
45 		kernel_vector_begin();					\
46 		raid6_rvv ## _n ## _xor_syndrome_real(disks,		\
47 			start, stop, (unsigned long)bytes, ptrs);	\
48 		kernel_vector_end();					\
49 	}								\
50 	struct raid6_calls const raid6_rvvx ## _n = {			\
51 		raid6_rvv ## _n ## _gen_syndrome,			\
52 		raid6_rvv ## _n ## _xor_syndrome,			\
53 		rvv_has_vector,						\
54 		"rvvx" #_n,						\
55 		0							\
56 	}
57