summaryrefslogtreecommitdiffstats
path: root/lib/crc/arm64/crc64.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/crc/arm64/crc64.h')
-rw-r--r--lib/crc/arm64/crc64.h28
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);
+}