1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * CRC-T10DIF using [V]PCLMULQDQ instructions
4 *
5 * Copyright 2024 Google LLC
6 */
7
8 #include "crc-pclmul-template.h"
9
10 static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_pclmulqdq);
11
12 DECLARE_CRC_PCLMUL_FUNCS(crc16_msb, u16);
13
crc_t10dif_arch(u16 crc,const u8 * p,size_t len)14 static inline u16 crc_t10dif_arch(u16 crc, const u8 *p, size_t len)
15 {
16 CRC_PCLMUL(crc, p, len, crc16_msb, crc16_msb_0x8bb7_consts,
17 have_pclmulqdq);
18 return crc_t10dif_generic(crc, p, len);
19 }
20
21 #define crc_t10dif_mod_init_arch crc_t10dif_mod_init_arch
crc_t10dif_mod_init_arch(void)22 static inline void crc_t10dif_mod_init_arch(void)
23 {
24 if (boot_cpu_has(X86_FEATURE_PCLMULQDQ)) {
25 static_branch_enable(&have_pclmulqdq);
26 if (have_vpclmul()) {
27 if (have_avx512())
28 static_call_update(crc16_msb_pclmul,
29 crc16_msb_vpclmul_avx512);
30 else
31 static_call_update(crc16_msb_pclmul,
32 crc16_msb_vpclmul_avx2);
33 }
34 }
35 }
36