forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
kernel/arch/arm64/crypto/sha512-ce-glue.c
....@@ -13,6 +13,7 @@
1313 #include <asm/simd.h>
1414 #include <asm/unaligned.h>
1515 #include <crypto/internal/hash.h>
16
+#include <crypto/internal/simd.h>
1617 #include <crypto/sha.h>
1718 #include <crypto/sha512_base.h>
1819 #include <linux/cpufeature.h>
....@@ -25,57 +26,58 @@
2526 MODULE_ALIAS_CRYPTO("sha384");
2627 MODULE_ALIAS_CRYPTO("sha512");
2728
28
-asmlinkage void sha512_ce_transform(struct sha512_state *sst, u8 const *src,
29
- int blocks);
29
+asmlinkage int sha512_ce_transform(struct sha512_state *sst, u8 const *src,
30
+ int blocks);
3031
3132 asmlinkage void sha512_block_data_order(u64 *digest, u8 const *src, int blocks);
33
+
34
+static void __sha512_ce_transform(struct sha512_state *sst, u8 const *src,
35
+ int blocks)
36
+{
37
+ while (blocks) {
38
+ int rem;
39
+
40
+ kernel_neon_begin();
41
+ rem = sha512_ce_transform(sst, src, blocks);
42
+ kernel_neon_end();
43
+ src += (blocks - rem) * SHA512_BLOCK_SIZE;
44
+ blocks = rem;
45
+ }
46
+}
47
+
48
+static void __sha512_block_data_order(struct sha512_state *sst, u8 const *src,
49
+ int blocks)
50
+{
51
+ sha512_block_data_order(sst->state, src, blocks);
52
+}
3253
3354 static int sha512_ce_update(struct shash_desc *desc, const u8 *data,
3455 unsigned int len)
3556 {
36
- if (!may_use_simd())
37
- return sha512_base_do_update(desc, data, len,
38
- (sha512_block_fn *)sha512_block_data_order);
57
+ sha512_block_fn *fn = crypto_simd_usable() ? __sha512_ce_transform
58
+ : __sha512_block_data_order;
3959
40
- kernel_neon_begin();
41
- sha512_base_do_update(desc, data, len,
42
- (sha512_block_fn *)sha512_ce_transform);
43
- kernel_neon_end();
44
-
60
+ sha512_base_do_update(desc, data, len, fn);
4561 return 0;
4662 }
4763
4864 static int sha512_ce_finup(struct shash_desc *desc, const u8 *data,
4965 unsigned int len, u8 *out)
5066 {
51
- if (!may_use_simd()) {
52
- if (len)
53
- sha512_base_do_update(desc, data, len,
54
- (sha512_block_fn *)sha512_block_data_order);
55
- sha512_base_do_finalize(desc,
56
- (sha512_block_fn *)sha512_block_data_order);
57
- return sha512_base_finish(desc, out);
58
- }
67
+ sha512_block_fn *fn = crypto_simd_usable() ? __sha512_ce_transform
68
+ : __sha512_block_data_order;
5969
60
- kernel_neon_begin();
61
- sha512_base_do_update(desc, data, len,
62
- (sha512_block_fn *)sha512_ce_transform);
63
- sha512_base_do_finalize(desc, (sha512_block_fn *)sha512_ce_transform);
64
- kernel_neon_end();
70
+ sha512_base_do_update(desc, data, len, fn);
71
+ sha512_base_do_finalize(desc, fn);
6572 return sha512_base_finish(desc, out);
6673 }
6774
6875 static int sha512_ce_final(struct shash_desc *desc, u8 *out)
6976 {
70
- if (!may_use_simd()) {
71
- sha512_base_do_finalize(desc,
72
- (sha512_block_fn *)sha512_block_data_order);
73
- return sha512_base_finish(desc, out);
74
- }
77
+ sha512_block_fn *fn = crypto_simd_usable() ? __sha512_ce_transform
78
+ : __sha512_block_data_order;
7579
76
- kernel_neon_begin();
77
- sha512_base_do_finalize(desc, (sha512_block_fn *)sha512_ce_transform);
78
- kernel_neon_end();
80
+ sha512_base_do_finalize(desc, fn);
7981 return sha512_base_finish(desc, out);
8082 }
8183