1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * LoongArch SIMD XOR operations
4  *
5  * Copyright (C) 2023 WANG Xuerui <git@xen0n.name>
6  */
7 
8 #include <linux/export.h>
9 #include <linux/sched.h>
10 #include <asm/fpu.h>
11 #include <asm/xor_simd.h>
12 #include "xor_simd.h"
13 
14 #define MAKE_XOR_GLUE_2(flavor)							\
15 void xor_##flavor##_2(unsigned long bytes, unsigned long *p1,			\
16 		      unsigned long *p2)					\
17 {										\
18 	kernel_fpu_begin();							\
19 	__xor_##flavor##_2(bytes, p1, p2);					\
20 	kernel_fpu_end();							\
21 }										\
22 EXPORT_SYMBOL_GPL(xor_##flavor##_2)
23 
24 #define MAKE_XOR_GLUE_3(flavor)							\
25 void xor_##flavor##_3(unsigned long bytes, unsigned long *p1,			\
26 		      unsigned long *p2, unsigned long *p3)			\
27 {										\
28 	kernel_fpu_begin();							\
29 	__xor_##flavor##_3(bytes, p1, p2, p3);					\
30 	kernel_fpu_end();							\
31 }										\
32 EXPORT_SYMBOL_GPL(xor_##flavor##_3)
33 
34 #define MAKE_XOR_GLUE_4(flavor)							\
35 void xor_##flavor##_4(unsigned long bytes, unsigned long *p1,			\
36 		      unsigned long *p2, unsigned long *p3,			\
37 		      unsigned long *p4)					\
38 {										\
39 	kernel_fpu_begin();							\
40 	__xor_##flavor##_4(bytes, p1, p2, p3, p4);				\
41 	kernel_fpu_end();							\
42 }										\
43 EXPORT_SYMBOL_GPL(xor_##flavor##_4)
44 
45 #define MAKE_XOR_GLUE_5(flavor)							\
46 void xor_##flavor##_5(unsigned long bytes, unsigned long *p1,			\
47 		      unsigned long *p2, unsigned long *p3,			\
48 		      unsigned long *p4, unsigned long *p5)			\
49 {										\
50 	kernel_fpu_begin();							\
51 	__xor_##flavor##_5(bytes, p1, p2, p3, p4, p5);				\
52 	kernel_fpu_end();							\
53 }										\
54 EXPORT_SYMBOL_GPL(xor_##flavor##_5)
55 
56 #define MAKE_XOR_GLUES(flavor)		\
57 	MAKE_XOR_GLUE_2(flavor);	\
58 	MAKE_XOR_GLUE_3(flavor);	\
59 	MAKE_XOR_GLUE_4(flavor);	\
60 	MAKE_XOR_GLUE_5(flavor)
61 
62 #ifdef CONFIG_CPU_HAS_LSX
63 MAKE_XOR_GLUES(lsx);
64 #endif
65 
66 #ifdef CONFIG_CPU_HAS_LASX
67 MAKE_XOR_GLUES(lasx);
68 #endif
69