xref: /linux/lib/crypto/arm/nh.h (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*29e39a11SEric Biggers /* SPDX-License-Identifier: GPL-2.0 */
2*29e39a11SEric Biggers /*
3*29e39a11SEric Biggers  * ARM32 accelerated implementation of NH
4*29e39a11SEric Biggers  *
5*29e39a11SEric Biggers  * Copyright 2018 Google LLC
6*29e39a11SEric Biggers  */
7*29e39a11SEric Biggers 
8*29e39a11SEric Biggers #include <asm/neon.h>
9*29e39a11SEric Biggers #include <asm/simd.h>
10*29e39a11SEric Biggers 
11*29e39a11SEric Biggers static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
12*29e39a11SEric Biggers 
13*29e39a11SEric Biggers asmlinkage void nh_neon(const u32 *key, const u8 *message, size_t message_len,
14*29e39a11SEric Biggers 			__le64 hash[NH_NUM_PASSES]);
15*29e39a11SEric Biggers 
16*29e39a11SEric Biggers static bool nh_arch(const u32 *key, const u8 *message, size_t message_len,
17*29e39a11SEric Biggers 		    __le64 hash[NH_NUM_PASSES])
18*29e39a11SEric Biggers {
19*29e39a11SEric Biggers 	if (static_branch_likely(&have_neon) && message_len >= 64 &&
20*29e39a11SEric Biggers 	    may_use_simd()) {
21*29e39a11SEric Biggers 		scoped_ksimd()
22*29e39a11SEric Biggers 			nh_neon(key, message, message_len, hash);
23*29e39a11SEric Biggers 		return true;
24*29e39a11SEric Biggers 	}
25*29e39a11SEric Biggers 	return false;
26*29e39a11SEric Biggers }
27*29e39a11SEric Biggers 
28*29e39a11SEric Biggers #define nh_mod_init_arch nh_mod_init_arch
29*29e39a11SEric Biggers static void nh_mod_init_arch(void)
30*29e39a11SEric Biggers {
31*29e39a11SEric Biggers 	if (elf_hwcap & HWCAP_NEON)
32*29e39a11SEric Biggers 		static_branch_enable(&have_neon);
33*29e39a11SEric Biggers }
34