1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) 2019 HiSilicon Limited. */
4 #ifndef __HISI_SEC_V2_H
5 #define __HISI_SEC_V2_H
7 #include <linux/list.h>
10 #include "sec_crypto.h"
12 /* Algorithm resource per hardware SEC queue */
17 dma_addr_t c_ivin_dma
;
19 dma_addr_t out_mac_dma
;
22 /* Cipher request of SEC private */
23 struct sec_cipher_req
{
24 struct hisi_acc_hw_sgl
*c_in
;
26 struct hisi_acc_hw_sgl
*c_out
;
29 dma_addr_t c_ivin_dma
;
30 struct skcipher_request
*sk_req
;
37 dma_addr_t out_mac_dma
;
38 struct aead_request
*aead_req
;
41 /* SEC request of Crypto */
43 struct sec_sqe sec_sqe
;
45 struct sec_qp_ctx
*qp_ctx
;
47 struct sec_cipher_req c_req
;
48 struct sec_aead_req aead_req
;
49 struct list_head backlog_head
;
55 /* Status of the SEC request */
61 * struct sec_req_op - Operations for SEC request
62 * @buf_map: DMA map the SGL buffers of the request
63 * @buf_unmap: DMA unmap the SGL buffers of the request
64 * @bd_fill: Fill the SEC queue BD
65 * @bd_send: Send the SEC BD into the hardware queue
66 * @callback: Call back for the request
67 * @process: Main processing logic of Skcipher
70 int (*buf_map
)(struct sec_ctx
*ctx
, struct sec_req
*req
);
71 void (*buf_unmap
)(struct sec_ctx
*ctx
, struct sec_req
*req
);
72 void (*do_transfer
)(struct sec_ctx
*ctx
, struct sec_req
*req
);
73 int (*bd_fill
)(struct sec_ctx
*ctx
, struct sec_req
*req
);
74 int (*bd_send
)(struct sec_ctx
*ctx
, struct sec_req
*req
);
75 void (*callback
)(struct sec_ctx
*ctx
, struct sec_req
*req
, int err
);
76 int (*process
)(struct sec_ctx
*ctx
, struct sec_req
*req
);
79 /* SEC auth context */
86 struct crypto_shash
*hash_tfm
;
89 /* SEC cipher context which cipher's relatives */
90 struct sec_cipher_ctx
{
101 /* SEC queue context which defines queue's relatives */
104 struct sec_req
*req_list
[QM_Q_DEPTH
];
106 struct sec_alg_res res
[QM_Q_DEPTH
];
108 struct mutex req_lock
;
109 struct list_head backlog
;
110 struct hisi_acc_sgl_pool
*c_in_pool
;
111 struct hisi_acc_sgl_pool
*c_out_pool
;
119 /* SEC Crypto TFM context which defines queue and cipher .etc relatives */
121 struct sec_qp_ctx
*qp_ctx
;
123 const struct sec_req_op
*req_op
;
124 struct hisi_qp
**qps
;
126 /* Half queues for encipher, and half for decipher */
129 /* Threshold for fake busy, trigger to return -EBUSY to user */
132 /* Currrent cyclic index to select a queue for encipher */
133 atomic_t enc_qcyclic
;
135 /* Currrent cyclic index to select a queue for decipher */
136 atomic_t dec_qcyclic
;
138 enum sec_alg_type alg_type
;
140 struct sec_cipher_ctx c_ctx
;
141 struct sec_auth_ctx a_ctx
;
150 enum sec_debug_file_index
{
156 struct sec_debug_file
{
157 enum sec_debug_file_index index
;
165 atomic64_t send_busy_cnt
;
166 atomic64_t recv_busy_cnt
;
167 atomic64_t err_bd_cnt
;
168 atomic64_t invalid_req_cnt
;
169 atomic64_t done_flag_cnt
;
174 struct sec_debug_file files
[SEC_DEBUG_FILE_NUM
];
179 struct sec_debug debug
;
184 void sec_destroy_qps(struct hisi_qp
**qps
, int qp_num
);
185 struct hisi_qp
**sec_create_qps(void);
186 int sec_register_to_crypto(void);
187 void sec_unregister_from_crypto(void);