1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * SHA-1 optimized for ARM64
4  *
5  * Copyright 2025 Google LLC
6  */
7 #include <asm/neon.h>
8 #include <asm/simd.h>
9 #include <linux/cpufeature.h>
10 
11 static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_ce);
12 
13 asmlinkage size_t __sha1_ce_transform(struct sha1_block_state *state,
14 				      const u8 *data, size_t nblocks);
15 
sha1_blocks(struct sha1_block_state * state,const u8 * data,size_t nblocks)16 static void sha1_blocks(struct sha1_block_state *state,
17 			const u8 *data, size_t nblocks)
18 {
19 	if (static_branch_likely(&have_ce) && likely(may_use_simd())) {
20 		do {
21 			size_t rem;
22 
23 			kernel_neon_begin();
24 			rem = __sha1_ce_transform(state, data, nblocks);
25 			kernel_neon_end();
26 			data += (nblocks - rem) * SHA1_BLOCK_SIZE;
27 			nblocks = rem;
28 		} while (nblocks);
29 	} else {
30 		sha1_blocks_generic(state, data, nblocks);
31 	}
32 }
33 
34 #define sha1_mod_init_arch sha1_mod_init_arch
sha1_mod_init_arch(void)35 static inline void sha1_mod_init_arch(void)
36 {
37 	if (cpu_have_named_feature(SHA1))
38 		static_branch_enable(&have_ce);
39 }
40