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 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