1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * SHA-256 (RISC-V accelerated) 4 * 5 * Copyright (C) 2022 VRULL GmbH 6 * Author: Heiko Stuebner <heiko.stuebner@vrull.eu> 7 * 8 * Copyright (C) 2023 SiFive, Inc. 9 * Author: Jerry Shih <jerry.shih@sifive.com> 10 */ 11 12 #include <asm/simd.h> 13 #include <asm/vector.h> 14 #include <crypto/internal/sha2.h> 15 #include <crypto/internal/simd.h> 16 #include <linux/kernel.h> 17 #include <linux/module.h> 18 19 asmlinkage void sha256_transform_zvknha_or_zvknhb_zvkb( 20 u32 state[SHA256_STATE_WORDS], const u8 *data, size_t nblocks); 21 22 static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_extensions); 23 24 void sha256_blocks_arch(u32 state[SHA256_STATE_WORDS], 25 const u8 *data, size_t nblocks) 26 { 27 if (static_branch_likely(&have_extensions) && crypto_simd_usable()) { 28 kernel_vector_begin(); 29 sha256_transform_zvknha_or_zvknhb_zvkb(state, data, nblocks); 30 kernel_vector_end(); 31 } else { 32 sha256_blocks_generic(state, data, nblocks); 33 } 34 } 35 EXPORT_SYMBOL(sha256_blocks_arch); 36 37 bool sha256_is_arch_optimized(void) 38 { 39 return static_key_enabled(&have_extensions); 40 } 41 EXPORT_SYMBOL(sha256_is_arch_optimized); 42 43 static int __init riscv64_sha256_mod_init(void) 44 { 45 /* Both zvknha and zvknhb provide the SHA-256 instructions. */ 46 if ((riscv_isa_extension_available(NULL, ZVKNHA) || 47 riscv_isa_extension_available(NULL, ZVKNHB)) && 48 riscv_isa_extension_available(NULL, ZVKB) && 49 riscv_vector_vlen() >= 128) 50 static_branch_enable(&have_extensions); 51 return 0; 52 } 53 arch_initcall(riscv64_sha256_mod_init); 54 55 static void __exit riscv64_sha256_mod_exit(void) 56 { 57 } 58 module_exit(riscv64_sha256_mod_exit); 59 60 MODULE_DESCRIPTION("SHA-256 (RISC-V accelerated)"); 61 MODULE_AUTHOR("Heiko Stuebner <heiko.stuebner@vrull.eu>"); 62 MODULE_LICENSE("GPL"); 63