GNU Linux-libre 5.4.274-gnu1
[releases.git] / arch / arm64 / include / asm / checksum.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2016 ARM Ltd.
4  */
5 #ifndef __ASM_CHECKSUM_H
6 #define __ASM_CHECKSUM_H
7
8 #include <linux/types.h>
9
10 static inline __sum16 csum_fold(__wsum csum)
11 {
12         u32 sum = (__force u32)csum;
13         sum += (sum >> 16) | (sum << 16);
14         return ~(__force __sum16)(sum >> 16);
15 }
16 #define csum_fold csum_fold
17
18 static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
19 {
20         __uint128_t tmp;
21         u64 sum;
22         int n = ihl; /* we want it signed */
23
24         tmp = *(const __uint128_t *)iph;
25         iph += 16;
26         n -= 4;
27         tmp += ((tmp >> 64) | (tmp << 64));
28         sum = tmp >> 64;
29         do {
30                 sum += *(const u32 *)iph;
31                 iph += 4;
32         } while (--n > 0);
33
34         sum += ((sum >> 32) | (sum << 32));
35         return csum_fold((__force u32)(sum >> 32));
36 }
37 #define ip_fast_csum ip_fast_csum
38
39 #include <asm-generic/checksum.h>
40
41 #endif  /* __ASM_CHECKSUM_H */