1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Shared crypto simd helpers 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _CRYPTO_INTERNAL_SIMD_H 7*4882a593Smuzhiyun #define _CRYPTO_INTERNAL_SIMD_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/percpu.h> 10*4882a593Smuzhiyun #include <linux/types.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* skcipher support */ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun struct simd_skcipher_alg; 15*4882a593Smuzhiyun struct skcipher_alg; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun struct simd_skcipher_alg *simd_skcipher_create_compat(const char *algname, 18*4882a593Smuzhiyun const char *drvname, 19*4882a593Smuzhiyun const char *basename); 20*4882a593Smuzhiyun struct simd_skcipher_alg *simd_skcipher_create(const char *algname, 21*4882a593Smuzhiyun const char *basename); 22*4882a593Smuzhiyun void simd_skcipher_free(struct simd_skcipher_alg *alg); 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun int simd_register_skciphers_compat(struct skcipher_alg *algs, int count, 25*4882a593Smuzhiyun struct simd_skcipher_alg **simd_algs); 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun void simd_unregister_skciphers(struct skcipher_alg *algs, int count, 28*4882a593Smuzhiyun struct simd_skcipher_alg **simd_algs); 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* AEAD support */ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun struct simd_aead_alg; 33*4882a593Smuzhiyun struct aead_alg; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct simd_aead_alg *simd_aead_create_compat(const char *algname, 36*4882a593Smuzhiyun const char *drvname, 37*4882a593Smuzhiyun const char *basename); 38*4882a593Smuzhiyun struct simd_aead_alg *simd_aead_create(const char *algname, 39*4882a593Smuzhiyun const char *basename); 40*4882a593Smuzhiyun void simd_aead_free(struct simd_aead_alg *alg); 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun int simd_register_aeads_compat(struct aead_alg *algs, int count, 43*4882a593Smuzhiyun struct simd_aead_alg **simd_algs); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun void simd_unregister_aeads(struct aead_alg *algs, int count, 46*4882a593Smuzhiyun struct simd_aead_alg **simd_algs); 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* 49*4882a593Smuzhiyun * crypto_simd_usable() - is it allowed at this time to use SIMD instructions or 50*4882a593Smuzhiyun * access the SIMD register file? 51*4882a593Smuzhiyun * 52*4882a593Smuzhiyun * This delegates to may_use_simd(), except that this also returns false if SIMD 53*4882a593Smuzhiyun * in crypto code has been temporarily disabled on this CPU by the crypto 54*4882a593Smuzhiyun * self-tests, in order to test the no-SIMD fallback code. This override is 55*4882a593Smuzhiyun * currently limited to configurations where the extra self-tests are enabled, 56*4882a593Smuzhiyun * because it might be a bit too invasive to be part of the regular self-tests. 57*4882a593Smuzhiyun * 58*4882a593Smuzhiyun * This is a macro so that <asm/simd.h>, which some architectures don't have, 59*4882a593Smuzhiyun * doesn't have to be included directly here. 60*4882a593Smuzhiyun */ 61*4882a593Smuzhiyun #ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS 62*4882a593Smuzhiyun DECLARE_PER_CPU(bool, crypto_simd_disabled_for_test); 63*4882a593Smuzhiyun #define crypto_simd_usable() \ 64*4882a593Smuzhiyun (may_use_simd() && !this_cpu_read(crypto_simd_disabled_for_test)) 65*4882a593Smuzhiyun #else 66*4882a593Smuzhiyun #define crypto_simd_usable() may_use_simd() 67*4882a593Smuzhiyun #endif 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #endif /* _CRYPTO_INTERNAL_SIMD_H */ 70