]>
Commit | Line | Data |
---|---|---|
7d11965d AB |
1 | /* |
2 | * linux/lib/raid6/neon.c - RAID6 syndrome calculation using ARM NEON intrinsics | |
3 | * | |
4 | * Copyright (C) 2013 Linaro Ltd <[email protected]> | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License version 2 as | |
8 | * published by the Free Software Foundation. | |
9 | */ | |
10 | ||
11 | #include <linux/raid/pq.h> | |
12 | ||
13 | #ifdef __KERNEL__ | |
14 | #include <asm/neon.h> | |
15 | #else | |
16 | #define kernel_neon_begin() | |
17 | #define kernel_neon_end() | |
18 | #define cpu_has_neon() (1) | |
19 | #endif | |
20 | ||
21 | /* | |
22 | * There are 2 reasons these wrappers are kept in a separate compilation unit | |
23 | * from the actual implementations in neonN.c (generated from neon.uc by | |
24 | * unroll.awk): | |
25 | * - the actual implementations use NEON intrinsics, and the GCC support header | |
26 | * (arm_neon.h) is not fully compatible (type wise) with the kernel; | |
27 | * - the neonN.c files are compiled with -mfpu=neon and optimization enabled, | |
28 | * and we have to make sure that we never use *any* NEON/VFP instructions | |
29 | * outside a kernel_neon_begin()/kernel_neon_end() pair. | |
30 | */ | |
31 | ||
32 | #define RAID6_NEON_WRAPPER(_n) \ | |
33 | static void raid6_neon ## _n ## _gen_syndrome(int disks, \ | |
34 | size_t bytes, void **ptrs) \ | |
35 | { \ | |
36 | void raid6_neon ## _n ## _gen_syndrome_real(int, \ | |
37 | unsigned long, void**); \ | |
38 | kernel_neon_begin(); \ | |
39 | raid6_neon ## _n ## _gen_syndrome_real(disks, \ | |
40 | (unsigned long)bytes, ptrs); \ | |
41 | kernel_neon_end(); \ | |
42 | } \ | |
43 | struct raid6_calls const raid6_neonx ## _n = { \ | |
44 | raid6_neon ## _n ## _gen_syndrome, \ | |
fe5cbc6e | 45 | NULL, /* XOR not yet implemented */ \ |
7d11965d AB |
46 | raid6_have_neon, \ |
47 | "neonx" #_n, \ | |
48 | 0 \ | |
49 | } | |
50 | ||
51 | static int raid6_have_neon(void) | |
52 | { | |
53 | return cpu_has_neon(); | |
54 | } | |
55 | ||
56 | RAID6_NEON_WRAPPER(1); | |
57 | RAID6_NEON_WRAPPER(2); | |
58 | RAID6_NEON_WRAPPER(4); | |
59 | RAID6_NEON_WRAPPER(8); |