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