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