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