1
2
3
4
5
6
7
8#include <linux/dma-mapping.h>
9
10#ifndef _CRYPTO_OCS_HCU_H
11#define _CRYPTO_OCS_HCU_H
12
13#define OCS_HCU_DMA_BIT_MASK DMA_BIT_MASK(32)
14
15#define OCS_HCU_HW_KEY_LEN 64
16
17struct ocs_hcu_dma_list;
18
19enum ocs_hcu_algo {
20 OCS_HCU_ALGO_SHA256 = 2,
21 OCS_HCU_ALGO_SHA224 = 3,
22 OCS_HCU_ALGO_SHA384 = 4,
23 OCS_HCU_ALGO_SHA512 = 5,
24 OCS_HCU_ALGO_SM3 = 6,
25};
26
27
28
29
30
31
32
33
34
35
36
37struct ocs_hcu_dev {
38 struct list_head list;
39 struct device *dev;
40 void __iomem *io_base;
41 struct crypto_engine *engine;
42 int irq;
43 struct completion irq_done;
44 bool irq_err;
45};
46
47
48
49
50
51
52
53
54
55struct ocs_hcu_idata {
56 u32 msg_len_lo;
57 u32 msg_len_hi;
58 u8 digest[SHA512_DIGEST_SIZE];
59};
60
61
62
63
64
65
66struct ocs_hcu_hash_ctx {
67 enum ocs_hcu_algo algo;
68 struct ocs_hcu_idata idata;
69};
70
71irqreturn_t ocs_hcu_irq_handler(int irq, void *dev_id);
72
73struct ocs_hcu_dma_list *ocs_hcu_dma_list_alloc(struct ocs_hcu_dev *hcu_dev,
74 int max_nents);
75
76void ocs_hcu_dma_list_free(struct ocs_hcu_dev *hcu_dev,
77 struct ocs_hcu_dma_list *dma_list);
78
79int ocs_hcu_dma_list_add_tail(struct ocs_hcu_dev *hcu_dev,
80 struct ocs_hcu_dma_list *dma_list,
81 dma_addr_t addr, u32 len);
82
83int ocs_hcu_hash_init(struct ocs_hcu_hash_ctx *ctx, enum ocs_hcu_algo algo);
84
85int ocs_hcu_hash_update(struct ocs_hcu_dev *hcu_dev,
86 struct ocs_hcu_hash_ctx *ctx,
87 const struct ocs_hcu_dma_list *dma_list);
88
89int ocs_hcu_hash_finup(struct ocs_hcu_dev *hcu_dev,
90 const struct ocs_hcu_hash_ctx *ctx,
91 const struct ocs_hcu_dma_list *dma_list,
92 u8 *dgst, size_t dgst_len);
93
94int ocs_hcu_hash_final(struct ocs_hcu_dev *hcu_dev,
95 const struct ocs_hcu_hash_ctx *ctx, u8 *dgst,
96 size_t dgst_len);
97
98int ocs_hcu_digest(struct ocs_hcu_dev *hcu_dev, enum ocs_hcu_algo algo,
99 void *data, size_t data_len, u8 *dgst, size_t dgst_len);
100
101int ocs_hcu_hmac(struct ocs_hcu_dev *hcu_dev, enum ocs_hcu_algo algo,
102 const u8 *key, size_t key_len,
103 const struct ocs_hcu_dma_list *dma_list,
104 u8 *dgst, size_t dgst_len);
105
106#endif
107