xref: /linux/lib/raid6/rvv.h (revision 07025b51c1149951d64804c73014499bb3564dca)
16093faafSChunyan Zhang /* SPDX-License-Identifier: GPL-2.0-or-later */
26093faafSChunyan Zhang /*
36093faafSChunyan Zhang  * Copyright 2024 Institute of Software, CAS.
46093faafSChunyan Zhang  *
56093faafSChunyan Zhang  * raid6/rvv.h
66093faafSChunyan Zhang  *
76093faafSChunyan Zhang  * Definitions for RISC-V RAID-6 code
86093faafSChunyan Zhang  */
96093faafSChunyan Zhang 
10*3c58d7a5SChunyan Zhang #ifdef __KERNEL__
11*3c58d7a5SChunyan Zhang #include <asm/vector.h>
12*3c58d7a5SChunyan Zhang #else
13*3c58d7a5SChunyan Zhang #define kernel_vector_begin()
14*3c58d7a5SChunyan Zhang #define kernel_vector_end()
15*3c58d7a5SChunyan Zhang #include <sys/auxv.h>
16*3c58d7a5SChunyan Zhang #include <asm/hwcap.h>
17*3c58d7a5SChunyan Zhang #define has_vector() (getauxval(AT_HWCAP) & COMPAT_HWCAP_ISA_V)
18*3c58d7a5SChunyan Zhang #endif
19*3c58d7a5SChunyan Zhang 
20*3c58d7a5SChunyan Zhang #include <linux/raid/pq.h>
21*3c58d7a5SChunyan Zhang 
rvv_has_vector(void)22*3c58d7a5SChunyan Zhang static int rvv_has_vector(void)
23*3c58d7a5SChunyan Zhang {
24*3c58d7a5SChunyan Zhang 	return has_vector();
25*3c58d7a5SChunyan Zhang }
26*3c58d7a5SChunyan Zhang 
276093faafSChunyan Zhang #define RAID6_RVV_WRAPPER(_n)						\
286093faafSChunyan Zhang 	static void raid6_rvv ## _n ## _gen_syndrome(int disks,		\
296093faafSChunyan Zhang 					size_t bytes, void **ptrs)	\
306093faafSChunyan Zhang 	{								\
316093faafSChunyan Zhang 		void raid6_rvv ## _n  ## _gen_syndrome_real(int d,	\
326093faafSChunyan Zhang 					unsigned long b, void **p);	\
336093faafSChunyan Zhang 		kernel_vector_begin();					\
346093faafSChunyan Zhang 		raid6_rvv ## _n ## _gen_syndrome_real(disks,		\
356093faafSChunyan Zhang 				(unsigned long)bytes, ptrs);		\
366093faafSChunyan Zhang 		kernel_vector_end();					\
376093faafSChunyan Zhang 	}								\
386093faafSChunyan Zhang 	static void raid6_rvv ## _n ## _xor_syndrome(int disks,		\
396093faafSChunyan Zhang 					int start, int stop,		\
406093faafSChunyan Zhang 					size_t bytes, void **ptrs)	\
416093faafSChunyan Zhang 	{								\
426093faafSChunyan Zhang 		void raid6_rvv ## _n  ## _xor_syndrome_real(int d,	\
436093faafSChunyan Zhang 					int s1, int s2,			\
446093faafSChunyan Zhang 					unsigned long b, void **p);	\
456093faafSChunyan Zhang 		kernel_vector_begin();					\
466093faafSChunyan Zhang 		raid6_rvv ## _n ## _xor_syndrome_real(disks,		\
476093faafSChunyan Zhang 			start, stop, (unsigned long)bytes, ptrs);	\
486093faafSChunyan Zhang 		kernel_vector_end();					\
496093faafSChunyan Zhang 	}								\
506093faafSChunyan Zhang 	struct raid6_calls const raid6_rvvx ## _n = {			\
516093faafSChunyan Zhang 		raid6_rvv ## _n ## _gen_syndrome,			\
526093faafSChunyan Zhang 		raid6_rvv ## _n ## _xor_syndrome,			\
536093faafSChunyan Zhang 		rvv_has_vector,						\
546093faafSChunyan Zhang 		"rvvx" #_n,						\
556093faafSChunyan Zhang 		0							\
566093faafSChunyan Zhang 	}
57