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