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
sm3_blocks_avx(struct sm3_block_state * state,const u8 * data,size_t nblocks)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
sm3_blocks(struct sm3_block_state * state,const u8 * data,size_t nblocks)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
sm3_mod_init_arch(void)34 static void sm3_mod_init_arch(void)
35 {
36 if (boot_cpu_has(X86_FEATURE_AVX) && boot_cpu_has(X86_FEATURE_BMI2))
37 static_call_update(sm3_blocks_x86, sm3_blocks_avx);
38 }
39