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