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