1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * CRC-T10DIF using PCLMULQDQ instructions
5 * Copyright 2024 Google LLC
8 #include <asm/cpufeatures.h>
10 #include <crypto/internal/simd.h>
11 #include <linux/crc-t10dif.h>
12 #include <linux/module.h>
14 static DEFINE_STATIC_KEY_FALSE(have_pclmulqdq
);
16 asmlinkage u16
crc_t10dif_pcl(u16 init_crc
, const u8
*buf
, size_t len
);
18 u16
crc_t10dif_arch(u16 crc
, const u8
*p
, size_t len
)
21 static_key_enabled(&have_pclmulqdq
) && crypto_simd_usable()) {
23 crc
= crc_t10dif_pcl(crc
, p
, len
);
27 return crc_t10dif_generic(crc
, p
, len
);
29 EXPORT_SYMBOL(crc_t10dif_arch
);
31 static int __init
crc_t10dif_x86_init(void)
33 if (boot_cpu_has(X86_FEATURE_PCLMULQDQ
))
34 static_branch_enable(&have_pclmulqdq
);
37 arch_initcall(crc_t10dif_x86_init
);
39 static void __exit
crc_t10dif_x86_exit(void)
42 module_exit(crc_t10dif_x86_exit
);
44 bool crc_t10dif_is_optimized(void)
46 return static_key_enabled(&have_pclmulqdq
);
48 EXPORT_SYMBOL(crc_t10dif_is_optimized
);
50 MODULE_DESCRIPTION("CRC-T10DIF using PCLMULQDQ instructions");
51 MODULE_LICENSE("GPL");