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