xref: /linux/lib/crypto/x86/sm3.h (revision aec2f682d47c54ef434b2d440992626d80b1ebdc)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * SM3 optimized for x86_64
4  *
5  * Copyright 2026 Google LLC
6  */
7 #include <asm/fpu/api.h>
8 #include <linux/static_call.h>
9 
10 asmlinkage void sm3_transform_avx(struct sm3_block_state *state,
11 				  const u8 *data, size_t nblocks);
12 
13 static void sm3_blocks_avx(struct sm3_block_state *state,
14 			   const u8 *data, size_t nblocks)
15 {
16 	if (likely(irq_fpu_usable())) {
17 		kernel_fpu_begin();
18 		sm3_transform_avx(state, data, nblocks);
19 		kernel_fpu_end();
20 	} else {
21 		sm3_blocks_generic(state, data, nblocks);
22 	}
23 }
24 
25 DEFINE_STATIC_CALL(sm3_blocks_x86, sm3_blocks_generic);
26 
27 static void sm3_blocks(struct sm3_block_state *state,
28 		       const u8 *data, size_t nblocks)
29 {
30 	static_call(sm3_blocks_x86)(state, data, nblocks);
31 }
32 
33 #define sm3_mod_init_arch sm3_mod_init_arch
34 static void sm3_mod_init_arch(void)
35 {
36 	if (boot_cpu_has(X86_FEATURE_AVX) && boot_cpu_has(X86_FEATURE_BMI2) &&
37 	    cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL))
38 		static_call_update(sm3_blocks_x86, sm3_blocks_avx);
39 }
40