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/vector.h> 13 #include <crypto/internal/sha2.h> 14 #include <linux/kernel.h> 15 #include <linux/module.h> 16 17 asmlinkage void sha256_transform_zvknha_or_zvknhb_zvkb( 18 u32 state[SHA256_STATE_WORDS], const u8 *data, size_t nblocks); 19 20 static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_extensions); 21 22 void sha256_blocks_simd(u32 state[SHA256_STATE_WORDS], 23 const u8 *data, size_t nblocks) 24 { 25 if (static_branch_likely(&have_extensions)) { 26 kernel_vector_begin(); 27 sha256_transform_zvknha_or_zvknhb_zvkb(state, data, nblocks); 28 kernel_vector_end(); 29 } else { 30 sha256_blocks_generic(state, data, nblocks); 31 } 32 } 33 EXPORT_SYMBOL_GPL(sha256_blocks_simd); 34 35 void sha256_blocks_arch(u32 state[SHA256_STATE_WORDS], 36 const u8 *data, size_t nblocks) 37 { 38 sha256_blocks_generic(state, data, nblocks); 39 } 40 EXPORT_SYMBOL_GPL(sha256_blocks_arch); 41 42 bool sha256_is_arch_optimized(void) 43 { 44 return static_key_enabled(&have_extensions); 45 } 46 EXPORT_SYMBOL_GPL(sha256_is_arch_optimized); 47 48 static int __init riscv64_sha256_mod_init(void) 49 { 50 /* Both zvknha and zvknhb provide the SHA-256 instructions. */ 51 if ((riscv_isa_extension_available(NULL, ZVKNHA) || 52 riscv_isa_extension_available(NULL, ZVKNHB)) && 53 riscv_isa_extension_available(NULL, ZVKB) && 54 riscv_vector_vlen() >= 128) 55 static_branch_enable(&have_extensions); 56 return 0; 57 } 58 subsys_initcall(riscv64_sha256_mod_init); 59 60 static void __exit riscv64_sha256_mod_exit(void) 61 { 62 } 63 module_exit(riscv64_sha256_mod_exit); 64 65 MODULE_DESCRIPTION("SHA-256 (RISC-V accelerated)"); 66 MODULE_AUTHOR("Heiko Stuebner <heiko.stuebner@vrull.eu>"); 67 MODULE_LICENSE("GPL"); 68