xref: /OK3568_Linux_fs/kernel/arch/csky/include/asm/checksum.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef __ASM_CSKY_CHECKSUM_H
5*4882a593Smuzhiyun #define __ASM_CSKY_CHECKSUM_H
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/in6.h>
8*4882a593Smuzhiyun #include <asm/byteorder.h>
9*4882a593Smuzhiyun 
csum_fold(__wsum csum)10*4882a593Smuzhiyun static inline __sum16 csum_fold(__wsum csum)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun 	u32 tmp;
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun 	asm volatile(
15*4882a593Smuzhiyun 	"mov	%1, %0\n"
16*4882a593Smuzhiyun 	"rori	%0, 16\n"
17*4882a593Smuzhiyun 	"addu	%0, %1\n"
18*4882a593Smuzhiyun 	"lsri	%0, 16\n"
19*4882a593Smuzhiyun 	: "=r"(csum), "=r"(tmp)
20*4882a593Smuzhiyun 	: "0"(csum));
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	return (__force __sum16) ~csum;
23*4882a593Smuzhiyun }
24*4882a593Smuzhiyun #define csum_fold csum_fold
25*4882a593Smuzhiyun 
csum_tcpudp_nofold(__be32 saddr,__be32 daddr,unsigned short len,unsigned short proto,__wsum sum)26*4882a593Smuzhiyun static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
27*4882a593Smuzhiyun 		unsigned short len, unsigned short proto, __wsum sum)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	asm volatile(
30*4882a593Smuzhiyun 	"clrc\n"
31*4882a593Smuzhiyun 	"addc    %0, %1\n"
32*4882a593Smuzhiyun 	"addc    %0, %2\n"
33*4882a593Smuzhiyun 	"addc    %0, %3\n"
34*4882a593Smuzhiyun 	"inct    %0\n"
35*4882a593Smuzhiyun 	: "=r"(sum)
36*4882a593Smuzhiyun 	: "r"((__force u32)saddr), "r"((__force u32)daddr),
37*4882a593Smuzhiyun #ifdef __BIG_ENDIAN
38*4882a593Smuzhiyun 	"r"(proto + len),
39*4882a593Smuzhiyun #else
40*4882a593Smuzhiyun 	"r"((proto + len) << 8),
41*4882a593Smuzhiyun #endif
42*4882a593Smuzhiyun 	"0" ((__force unsigned long)sum)
43*4882a593Smuzhiyun 	: "cc");
44*4882a593Smuzhiyun 	return sum;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun #define csum_tcpudp_nofold csum_tcpudp_nofold
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #include <asm-generic/checksum.h>
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #endif /* __ASM_CSKY_CHECKSUM_H */
51