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