sha256.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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. #include <asm/simd.h>
  12. #include <asm/vector.h>
  13. static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_extensions);
  14. asmlinkage void
  15. sha256_transform_zvknha_or_zvknhb_zvkb(struct sha256_block_state *state,
  16. const u8 *data, size_t nblocks);
  17. static void sha256_blocks(struct sha256_block_state *state,
  18. const u8 *data, size_t nblocks)
  19. {
  20. if (static_branch_likely(&have_extensions) && likely(may_use_simd())) {
  21. kernel_vector_begin();
  22. sha256_transform_zvknha_or_zvknhb_zvkb(state, data, nblocks);
  23. kernel_vector_end();
  24. } else {
  25. sha256_blocks_generic(state, data, nblocks);
  26. }
  27. }
  28. #define sha256_mod_init_arch sha256_mod_init_arch
  29. static void sha256_mod_init_arch(void)
  30. {
  31. /* Both zvknha and zvknhb provide the SHA-256 instructions. */
  32. if ((riscv_isa_extension_available(NULL, ZVKNHA) ||
  33. riscv_isa_extension_available(NULL, ZVKNHB)) &&
  34. riscv_isa_extension_available(NULL, ZVKB) &&
  35. riscv_vector_vlen() >= 128)
  36. static_branch_enable(&have_extensions);
  37. }