1
2
3
4#ifndef __HISI_SEC_V2_H
5#define __HISI_SEC_V2_H
6
7#include "../qm.h"
8#include "sec_crypto.h"
9
10
11struct sec_alg_res {
12 u8 *pbuf;
13 dma_addr_t pbuf_dma;
14 u8 *c_ivin;
15 dma_addr_t c_ivin_dma;
16 u8 *a_ivin;
17 dma_addr_t a_ivin_dma;
18 u8 *out_mac;
19 dma_addr_t out_mac_dma;
20};
21
22
23struct sec_cipher_req {
24 struct hisi_acc_hw_sgl *c_out;
25 dma_addr_t c_out_dma;
26 u8 *c_ivin;
27 dma_addr_t c_ivin_dma;
28 struct skcipher_request *sk_req;
29 u32 c_len;
30 bool encrypt;
31};
32
33struct sec_aead_req {
34 u8 *out_mac;
35 dma_addr_t out_mac_dma;
36 u8 *a_ivin;
37 dma_addr_t a_ivin_dma;
38 struct aead_request *aead_req;
39};
40
41
42struct sec_req {
43 union {
44 struct sec_sqe sec_sqe;
45 struct sec_sqe3 sec_sqe3;
46 };
47 struct sec_ctx *ctx;
48 struct sec_qp_ctx *qp_ctx;
49
50
51
52
53 struct hisi_acc_hw_sgl *in;
54 dma_addr_t in_dma;
55 struct sec_cipher_req c_req;
56 struct sec_aead_req aead_req;
57 struct list_head backlog_head;
58
59 int err_type;
60 int req_id;
61 u32 flag;
62
63
64 bool fake_busy;
65 bool use_pbuf;
66};
67
68
69
70
71
72
73
74
75
76
77struct sec_req_op {
78 int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req);
79 void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req);
80 void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req);
81 int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req);
82 int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req);
83 void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err);
84 int (*process)(struct sec_ctx *ctx, struct sec_req *req);
85};
86
87
88struct sec_auth_ctx {
89 dma_addr_t a_key_dma;
90 u8 *a_key;
91 u8 a_key_len;
92 u8 mac_len;
93 u8 a_alg;
94 bool fallback;
95 struct crypto_shash *hash_tfm;
96 struct crypto_aead *fallback_aead_tfm;
97};
98
99
100struct sec_cipher_ctx {
101 u8 *c_key;
102 dma_addr_t c_key_dma;
103 sector_t iv_offset;
104 u32 c_gran_size;
105 u32 ivsize;
106 u8 c_mode;
107 u8 c_alg;
108 u8 c_key_len;
109
110
111 bool fallback;
112 struct crypto_sync_skcipher *fbtfm;
113};
114
115
116struct sec_qp_ctx {
117 struct hisi_qp *qp;
118 struct sec_req *req_list[QM_Q_DEPTH];
119 struct idr req_idr;
120 struct sec_alg_res res[QM_Q_DEPTH];
121 struct sec_ctx *ctx;
122 struct mutex req_lock;
123 struct list_head backlog;
124 struct hisi_acc_sgl_pool *c_in_pool;
125 struct hisi_acc_sgl_pool *c_out_pool;
126};
127
128enum sec_alg_type {
129 SEC_SKCIPHER,
130 SEC_AEAD
131};
132
133
134struct sec_ctx {
135 struct sec_qp_ctx *qp_ctx;
136 struct sec_dev *sec;
137 const struct sec_req_op *req_op;
138 struct hisi_qp **qps;
139
140
141 u32 hlf_q_num;
142
143
144 u32 fake_req_limit;
145
146
147 atomic_t enc_qcyclic;
148
149
150 atomic_t dec_qcyclic;
151
152 enum sec_alg_type alg_type;
153 bool pbuf_supported;
154 struct sec_cipher_ctx c_ctx;
155 struct sec_auth_ctx a_ctx;
156 u8 type_supported;
157 struct device *dev;
158};
159
160
161enum sec_debug_file_index {
162 SEC_CLEAR_ENABLE,
163 SEC_DEBUG_FILE_NUM,
164};
165
166struct sec_debug_file {
167 enum sec_debug_file_index index;
168 spinlock_t lock;
169 struct hisi_qm *qm;
170};
171
172struct sec_dfx {
173 atomic64_t send_cnt;
174 atomic64_t recv_cnt;
175 atomic64_t send_busy_cnt;
176 atomic64_t recv_busy_cnt;
177 atomic64_t err_bd_cnt;
178 atomic64_t invalid_req_cnt;
179 atomic64_t done_flag_cnt;
180};
181
182struct sec_debug {
183 struct sec_dfx dfx;
184 struct sec_debug_file files[SEC_DEBUG_FILE_NUM];
185};
186
187struct sec_dev {
188 struct hisi_qm qm;
189 struct sec_debug debug;
190 u32 ctx_q_num;
191 bool iommu_used;
192};
193
194void sec_destroy_qps(struct hisi_qp **qps, int qp_num);
195struct hisi_qp **sec_create_qps(void);
196int sec_register_to_crypto(struct hisi_qm *qm);
197void sec_unregister_from_crypto(struct hisi_qm *qm);
198#endif
199