crypto: riscv/sha256 - Add simd block function

Add CRYPTO_ARCH_HAVE_LIB_SHA256_SIMD and a SIMD block function
so that the caller can decide whether to use SIMD.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Herbert Xu 2025-05-02 13:31:05 +08:00
parent adcb9e32e5
commit 491d6024f2
2 changed files with 10 additions and 4 deletions

View File

@ -12,4 +12,5 @@ config CRYPTO_SHA256_RISCV64
depends on 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO depends on 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO
default CRYPTO_LIB_SHA256 default CRYPTO_LIB_SHA256
select CRYPTO_ARCH_HAVE_LIB_SHA256 select CRYPTO_ARCH_HAVE_LIB_SHA256
select CRYPTO_ARCH_HAVE_LIB_SHA256_SIMD
select CRYPTO_LIB_SHA256_GENERIC select CRYPTO_LIB_SHA256_GENERIC

View File

@ -9,10 +9,8 @@
* Author: Jerry Shih <jerry.shih@sifive.com> * Author: Jerry Shih <jerry.shih@sifive.com>
*/ */
#include <asm/simd.h>
#include <asm/vector.h> #include <asm/vector.h>
#include <crypto/internal/sha2.h> #include <crypto/internal/sha2.h>
#include <crypto/internal/simd.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
@ -21,10 +19,10 @@ asmlinkage void sha256_transform_zvknha_or_zvknhb_zvkb(
static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_extensions); static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_extensions);
void sha256_blocks_arch(u32 state[SHA256_STATE_WORDS], void sha256_blocks_simd(u32 state[SHA256_STATE_WORDS],
const u8 *data, size_t nblocks) const u8 *data, size_t nblocks)
{ {
if (static_branch_likely(&have_extensions) && crypto_simd_usable()) { if (static_branch_likely(&have_extensions)) {
kernel_vector_begin(); kernel_vector_begin();
sha256_transform_zvknha_or_zvknhb_zvkb(state, data, nblocks); sha256_transform_zvknha_or_zvknhb_zvkb(state, data, nblocks);
kernel_vector_end(); kernel_vector_end();
@ -32,6 +30,13 @@ void sha256_blocks_arch(u32 state[SHA256_STATE_WORDS],
sha256_blocks_generic(state, data, nblocks); sha256_blocks_generic(state, data, nblocks);
} }
} }
EXPORT_SYMBOL_GPL(sha256_blocks_simd);
void sha256_blocks_arch(u32 state[SHA256_STATE_WORDS],
const u8 *data, size_t nblocks)
{
sha256_blocks_generic(state, data, nblocks);
}
EXPORT_SYMBOL_GPL(sha256_blocks_arch); EXPORT_SYMBOL_GPL(sha256_blocks_arch);
bool sha256_is_arch_optimized(void) bool sha256_is_arch_optimized(void)