/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_SCORE_CHECKSUM_H
#define _ASM_SCORE_CHECKSUM_H

#include <linux/in6.h>
#include <linux/uaccess.h>

/*
 * computes the checksum of a memory block at buff, length len,
 * and adds in "sum" (32-bit)
 *
 * returns a 32-bit number suitable for feeding into itself
 * or csum_tcpudp_magic
 *
 * this function must be called with even lengths, except
 * for the last fragment, which may be odd
 *
 * it's best to have buff aligned on a 32-bit boundary
 */
unsigned int csum_partial(const void *buff, int len, __wsum sum);
unsigned int csum_partial_copy_from_user(const char *src, char *dst, int len,
					unsigned int sum, int *csum_err);
unsigned int csum_partial_copy(const char *src, char *dst,
					int len, unsigned int sum);

/*
 * this is a new version of the above that records errors it finds in *errp,
 * but continues and zeros the rest of the buffer.
 */

/*
 * Copy and checksum to user
 */
#define HAVE_CSUM_COPY_USER
static inline
__wsum csum_and_copy_to_user(const void *src, void __user *dst, int len,
			__wsum sum, int *err_ptr)
{
	sum = csum_partial(src, len, sum);
	if (copy_to_user(dst, src, len)) {
		*err_ptr = -EFAULT;
		return (__force __wsum) -1; /* invalid checksum */
	}
	return sum;
}


#define csum_partial_copy_nocheck csum_partial_copy
/*
 *	Fold a partial checksum without adding pseudo headers
 */

static inline __sum16 csum_fold(__wsum sum)
{
	/* the while loop is unnecessary really, it's always enough with two
	   iterations */
	__asm__ __volatile__(
		".set volatile\n\t"
		".set\tr1\n\t"
		"slli\tr1,%0, 16\n\t"
		"add\t%0,%0, r1\n\t"
		"cmp.c\tr1, %0\n\t"
		"srli\t%0, %0, 16\n\t"
		"bleu\t1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:ldi\tr30, 0xffff\n\t"
		"xor\t%0, %0, r30\n\t"
		"slli\t%0, %0, 16\n\t"
		"srli\t%0, %0, 16\n\t"
		".set\tnor1\n\t"
		".set optimize\n\t"
		: "=r" (sum)
		: "0" (sum));
	return sum;
}

/*
 *	This is a version of ip_compute_csum() optimized for IP headers,
 *	which always checksum on 4 octet boundaries.
 *
 *	By Jorge Cwik <jorge@laser.satlink.net>, adapted for linux by
 *	Arnt Gulbrandsen.
 */
static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
{
	unsigned int sum;
	unsigned long dummy;

	__asm__ __volatile__(
		".set volatile\n\t"
		".set\tnor1\n\t"
		"lw\t%0, [%1]\n\t"
		"subri\t%2, %2, 4\n\t"
		"slli\t%2, %2, 2\n\t"
		"lw\t%3, [%1, 4]\n\t"
		"add\t%2, %2, %1\n\t"
		"add\t%0, %0, %3\n\t"
		"cmp.c\t%3, %0\n\t"
		"lw\t%3, [%1, 8]\n\t"
		"bleu\t1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:\n\t"
		"add\t%0, %0, %3\n\t"
		"cmp.c\t%3, %0\n\t"
		"lw\t%3, [%1, 12]\n\t"
		"bleu\t1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:add\t%0, %0, %3\n\t"
		"cmp.c\t%3, %0\n\t"
		"bleu\t1f\n\t"
		"addi\t%0, 0x1\n"

		"1:\tlw\t%3, [%1, 16]\n\t"
		"addi\t%1, 4\n\t"
		"add\t%0, %0, %3\n\t"
		"cmp.c\t%3, %0\n\t"
		"bleu\t2f\n\t"
		"addi\t%0, 0x1\n"
		"2:cmp.c\t%2, %1\n\t"
		"bne\t1b\n\t"

		".set\tr1\n\t"
		".set optimize\n\t"
		: "=&r" (sum), "=&r" (iph), "=&r" (ihl), "=&r" (dummy)
		: "1" (iph), "2" (ihl));

	return csum_fold(sum);
}

static inline __wsum
csum_tcpudp_nofold(__be32 saddr, __be32 daddr, __u32 len,
		   __u8 proto, __wsum sum)
{
	unsigned long tmp = (len + proto) << 8;
	__asm__ __volatile__(
		".set volatile\n\t"
		"add\t%0, %0, %2\n\t"
		"cmp.c\t%2, %0\n\t"
		"bleu\t1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:\n\t"
		"add\t%0, %0, %3\n\t"
		"cmp.c\t%3, %0\n\t"
		"bleu\t1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:\n\t"
		"add\t%0, %0, %4\n\t"
		"cmp.c\t%4, %0\n\t"
		"bleu\t1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:\n\t"
		".set optimize\n\t"
		: "=r" (sum)
		: "0" (daddr), "r"(saddr),
		"r" (tmp),
		"r" (sum));
	return sum;
}

/*
 * computes the checksum of the TCP/UDP pseudo-header
 * returns a 16-bit checksum, already complemented
 */
static inline __sum16
csum_tcpudp_magic(__be32 saddr, __be32 daddr, __u32 len,
		  __u8 proto, __wsum sum)
{
	return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
}

/*
 * this routine is used for miscellaneous IP-like checksums, mainly
 * in icmp.c
 */

static inline unsigned short ip_compute_csum(const void *buff, int len)
{
	return csum_fold(csum_partial(buff, len, 0));
}

#define _HAVE_ARCH_IPV6_CSUM
static inline __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
				      const struct in6_addr *daddr,
				      __u32 len, __u8 proto, __wsum sum)
{
	__asm__ __volatile__(
		".set\tvolatile\t\t\t# csum_ipv6_magic\n\t"
		"add\t%0, %0, %5\t\t\t# proto (long in network byte order)\n\t"
		"cmp.c\t%5, %0\n\t"
		"bleu 1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:add\t%0, %0, %6\t\t\t# csum\n\t"
		"cmp.c\t%6, %0\n\t"
		"lw\t%1, [%2, 0]\t\t\t# four words source address\n\t"
		"bleu 1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:add\t%0, %0, %1\n\t"
		"cmp.c\t%1, %0\n\t"
		"1:lw\t%1, [%2, 4]\n\t"
		"bleu 1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:add\t%0, %0, %1\n\t"
		"cmp.c\t%1, %0\n\t"
		"lw\t%1, [%2,8]\n\t"
		"bleu 1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:add\t%0, %0, %1\n\t"
		"cmp.c\t%1, %0\n\t"
		"lw\t%1, [%2, 12]\n\t"
		"bleu 1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:add\t%0, %0,%1\n\t"
		"cmp.c\t%1, %0\n\t"
		"lw\t%1, [%3, 0]\n\t"
		"bleu 1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:add\t%0, %0, %1\n\t"
		"cmp.c\t%1, %0\n\t"
		"lw\t%1, [%3, 4]\n\t"
		"bleu 1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:add\t%0, %0, %1\n\t"
		"cmp.c\t%1, %0\n\t"
		"lw\t%1, [%3, 8]\n\t"
		"bleu 1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:add\t%0, %0, %1\n\t"
		"cmp.c\t%1, %0\n\t"
		"lw\t%1, [%3, 12]\n\t"
		"bleu 1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:add\t%0, %0, %1\n\t"
		"cmp.c\t%1, %0\n\t"
		"bleu 1f\n\t"
		"addi\t%0, 0x1\n\t"
		"1:\n\t"
		".set\toptimize"
		: "=r" (sum), "=r" (proto)
		: "r" (saddr), "r" (daddr),
		  "0" (htonl(len)), "1" (htonl(proto)), "r" (sum));

	return csum_fold(sum);
}
#endif /* _ASM_SCORE_CHECKSUM_H */
