diff options
Diffstat (limited to 'lib/crc/arm64/crc64.h')
| -rw-r--r-- | lib/crc/arm64/crc64.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/crc/arm64/crc64.h b/lib/crc/arm64/crc64.h new file mode 100644 index 000000000..c7a69e1f3 --- /dev/null +++ b/lib/crc/arm64/crc64.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * CRC64 using ARM64 PMULL instructions + */ + +#include <linux/cpufeature.h> +#include <asm/simd.h> +#include <linux/minmax.h> +#include <linux/sizes.h> + +u64 crc64_nvme_neon(u64 crc, const u8 *p, size_t len); + +#define crc64_be_arch crc64_be_generic + +static inline u64 crc64_nvme_arch(u64 crc, const u8 *p, size_t len) +{ + if (len >= 128 && cpu_have_named_feature(PMULL) && + likely(may_use_simd())) { + size_t chunk = len & ~15; + + scoped_ksimd() + crc = crc64_nvme_neon(crc, p, chunk); + + p += chunk; + len &= 15; + } + return crc64_nvme_generic(crc, p, len); +} |
