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