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