xref: /linux/lib/crypto/arm64/sm3.h (revision 370c3883195566ee3e7d79e0146c3d735a406573)
1*9f69f52bSEric Biggers /* SPDX-License-Identifier: GPL-2.0-or-later */
2*9f69f52bSEric Biggers /*
3*9f69f52bSEric Biggers  * SM3 optimized for ARM64
4*9f69f52bSEric Biggers  *
5*9f69f52bSEric Biggers  * Copyright 2026 Google LLC
6*9f69f52bSEric Biggers  */
7*9f69f52bSEric Biggers #include <asm/simd.h>
8*9f69f52bSEric Biggers #include <linux/cpufeature.h>
9*9f69f52bSEric Biggers 
10*9f69f52bSEric Biggers static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
11*9f69f52bSEric Biggers static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_ce);
12*9f69f52bSEric Biggers 
13*9f69f52bSEric Biggers asmlinkage void sm3_neon_transform(struct sm3_block_state *state,
14*9f69f52bSEric Biggers 				   const u8 *data, size_t nblocks);
15*9f69f52bSEric Biggers asmlinkage void sm3_ce_transform(struct sm3_block_state *state,
16*9f69f52bSEric Biggers 				 const u8 *data, size_t nblocks);
17*9f69f52bSEric Biggers 
18*9f69f52bSEric Biggers static void sm3_blocks(struct sm3_block_state *state,
19*9f69f52bSEric Biggers 		       const u8 *data, size_t nblocks)
20*9f69f52bSEric Biggers {
21*9f69f52bSEric Biggers 	if (static_branch_likely(&have_neon) && likely(may_use_simd())) {
22*9f69f52bSEric Biggers 		scoped_ksimd() {
23*9f69f52bSEric Biggers 			if (static_branch_likely(&have_ce))
24*9f69f52bSEric Biggers 				sm3_ce_transform(state, data, nblocks);
25*9f69f52bSEric Biggers 			else
26*9f69f52bSEric Biggers 				sm3_neon_transform(state, data, nblocks);
27*9f69f52bSEric Biggers 		}
28*9f69f52bSEric Biggers 	} else {
29*9f69f52bSEric Biggers 		sm3_blocks_generic(state, data, nblocks);
30*9f69f52bSEric Biggers 	}
31*9f69f52bSEric Biggers }
32*9f69f52bSEric Biggers 
33*9f69f52bSEric Biggers #define sm3_mod_init_arch sm3_mod_init_arch
34*9f69f52bSEric Biggers static void sm3_mod_init_arch(void)
35*9f69f52bSEric Biggers {
36*9f69f52bSEric Biggers 	if (cpu_have_named_feature(ASIMD)) {
37*9f69f52bSEric Biggers 		static_branch_enable(&have_neon);
38*9f69f52bSEric Biggers 		if (cpu_have_named_feature(SM3))
39*9f69f52bSEric Biggers 			static_branch_enable(&have_ce);
40*9f69f52bSEric Biggers 	}
41*9f69f52bSEric Biggers }
42