xref: /linux/lib/crc/arm64/crc64.h (revision d142ab35ee0b7f9e84115fe3e4c3de4a9ac35f5e)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * CRC64 using ARM64 PMULL instructions
4  */
5 
6 #include <linux/cpufeature.h>
7 #include <asm/simd.h>
8 #include <linux/minmax.h>
9 #include <linux/sizes.h>
10 
11 u64 crc64_nvme_arm64_c(u64 crc, const u8 *p, size_t len);
12 
13 #define crc64_be_arch crc64_be_generic
14 
crc64_nvme_arch(u64 crc,const u8 * p,size_t len)15 static inline u64 crc64_nvme_arch(u64 crc, const u8 *p, size_t len)
16 {
17 	if (len >= 128 && cpu_have_named_feature(PMULL) &&
18 	    likely(may_use_simd())) {
19 		size_t chunk = len & ~15;
20 
21 		scoped_ksimd()
22 			crc = crc64_nvme_arm64_c(crc, p, chunk);
23 
24 		p += chunk;
25 		len &= 15;
26 	}
27 	return crc64_nvme_generic(crc, p, len);
28 }
29