sha512.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * SHA-512 and SHA-384 using the RISC-V vector crypto extensions
  4. *
  5. * Copyright (C) 2023 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. #include <asm/simd.h>
  12. #include <asm/vector.h>
  13. static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_extensions);
  14. asmlinkage void sha512_transform_zvknhb_zvkb(struct sha512_block_state *state,
  15. const u8 *data, size_t nblocks);
  16. static void sha512_blocks(struct sha512_block_state *state,
  17. const u8 *data, size_t nblocks)
  18. {
  19. if (static_branch_likely(&have_extensions) && likely(may_use_simd())) {
  20. kernel_vector_begin();
  21. sha512_transform_zvknhb_zvkb(state, data, nblocks);
  22. kernel_vector_end();
  23. } else {
  24. sha512_blocks_generic(state, data, nblocks);
  25. }
  26. }
  27. #define sha512_mod_init_arch sha512_mod_init_arch
  28. static void sha512_mod_init_arch(void)
  29. {
  30. if (riscv_isa_extension_available(NULL, ZVKNHB) &&
  31. riscv_isa_extension_available(NULL, ZVKB) &&
  32. riscv_vector_vlen() >= 128)
  33. static_branch_enable(&have_extensions);
  34. }