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
10static 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
26static 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 */
51