xref: /linux/lib/crypto/riscv/sha256.h (revision bf52d93865bde68896d20f2ce6c2f76d96cd678e)
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