]> git.ipfire.org Git - thirdparty/linux.git/blob - drivers/crypto/hisilicon/sec2/sec.h
x86/fpu/xstate: Restore supervisor states for signal return
[thirdparty/linux.git] / drivers / crypto / hisilicon / sec2 / sec.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) 2019 HiSilicon Limited. */
3
4 #ifndef __HISI_SEC_V2_H
5 #define __HISI_SEC_V2_H
6
7 #include <linux/list.h>
8
9 #include "../qm.h"
10 #include "sec_crypto.h"
11
12 /* Algorithm resource per hardware SEC queue */
13 struct sec_alg_res {
14 u8 *pbuf;
15 dma_addr_t pbuf_dma;
16 u8 *c_ivin;
17 dma_addr_t c_ivin_dma;
18 u8 *out_mac;
19 dma_addr_t out_mac_dma;
20 };
21
22 /* Cipher request of SEC private */
23 struct sec_cipher_req {
24 struct hisi_acc_hw_sgl *c_in;
25 dma_addr_t c_in_dma;
26 struct hisi_acc_hw_sgl *c_out;
27 dma_addr_t c_out_dma;
28 u8 *c_ivin;
29 dma_addr_t c_ivin_dma;
30 struct skcipher_request *sk_req;
31 u32 c_len;
32 bool encrypt;
33 };
34
35 struct sec_aead_req {
36 u8 *out_mac;
37 dma_addr_t out_mac_dma;
38 struct aead_request *aead_req;
39 };
40
41 /* SEC request of Crypto */
42 struct sec_req {
43 struct sec_sqe sec_sqe;
44 struct sec_ctx *ctx;
45 struct sec_qp_ctx *qp_ctx;
46
47 struct sec_cipher_req c_req;
48 struct sec_aead_req aead_req;
49
50 int err_type;
51 int req_id;
52
53 /* Status of the SEC request */
54 bool fake_busy;
55 bool use_pbuf;
56 };
57
58 /**
59 * struct sec_req_op - Operations for SEC request
60 * @buf_map: DMA map the SGL buffers of the request
61 * @buf_unmap: DMA unmap the SGL buffers of the request
62 * @bd_fill: Fill the SEC queue BD
63 * @bd_send: Send the SEC BD into the hardware queue
64 * @callback: Call back for the request
65 * @process: Main processing logic of Skcipher
66 */
67 struct sec_req_op {
68 int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req);
69 void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req);
70 void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req);
71 int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req);
72 int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req);
73 void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err);
74 int (*process)(struct sec_ctx *ctx, struct sec_req *req);
75 };
76
77 /* SEC auth context */
78 struct sec_auth_ctx {
79 dma_addr_t a_key_dma;
80 u8 *a_key;
81 u8 a_key_len;
82 u8 mac_len;
83 u8 a_alg;
84 struct crypto_shash *hash_tfm;
85 };
86
87 /* SEC cipher context which cipher's relatives */
88 struct sec_cipher_ctx {
89 u8 *c_key;
90 dma_addr_t c_key_dma;
91 sector_t iv_offset;
92 u32 c_gran_size;
93 u32 ivsize;
94 u8 c_mode;
95 u8 c_alg;
96 u8 c_key_len;
97 };
98
99 /* SEC queue context which defines queue's relatives */
100 struct sec_qp_ctx {
101 struct hisi_qp *qp;
102 struct sec_req *req_list[QM_Q_DEPTH];
103 struct idr req_idr;
104 struct sec_alg_res res[QM_Q_DEPTH];
105 struct sec_ctx *ctx;
106 struct mutex req_lock;
107 struct hisi_acc_sgl_pool *c_in_pool;
108 struct hisi_acc_sgl_pool *c_out_pool;
109 atomic_t pending_reqs;
110 };
111
112 enum sec_alg_type {
113 SEC_SKCIPHER,
114 SEC_AEAD
115 };
116
117 /* SEC Crypto TFM context which defines queue and cipher .etc relatives */
118 struct sec_ctx {
119 struct sec_qp_ctx *qp_ctx;
120 struct sec_dev *sec;
121 const struct sec_req_op *req_op;
122 struct hisi_qp **qps;
123
124 /* Half queues for encipher, and half for decipher */
125 u32 hlf_q_num;
126
127 /* Threshold for fake busy, trigger to return -EBUSY to user */
128 u32 fake_req_limit;
129
130 /* Currrent cyclic index to select a queue for encipher */
131 atomic_t enc_qcyclic;
132
133 /* Currrent cyclic index to select a queue for decipher */
134 atomic_t dec_qcyclic;
135
136 enum sec_alg_type alg_type;
137 bool pbuf_supported;
138 struct sec_cipher_ctx c_ctx;
139 struct sec_auth_ctx a_ctx;
140 };
141
142 enum sec_endian {
143 SEC_LE = 0,
144 SEC_32BE,
145 SEC_64BE
146 };
147
148 enum sec_debug_file_index {
149 SEC_CURRENT_QM,
150 SEC_CLEAR_ENABLE,
151 SEC_DEBUG_FILE_NUM,
152 };
153
154 struct sec_debug_file {
155 enum sec_debug_file_index index;
156 spinlock_t lock;
157 struct hisi_qm *qm;
158 };
159
160 struct sec_dfx {
161 atomic64_t send_cnt;
162 atomic64_t recv_cnt;
163 };
164
165 struct sec_debug {
166 struct sec_dfx dfx;
167 struct sec_debug_file files[SEC_DEBUG_FILE_NUM];
168 };
169
170 struct sec_dev {
171 struct hisi_qm qm;
172 struct sec_debug debug;
173 u32 ctx_q_num;
174 bool iommu_used;
175 u32 num_vfs;
176 unsigned long status;
177 };
178
179 void sec_destroy_qps(struct hisi_qp **qps, int qp_num);
180 struct hisi_qp **sec_create_qps(void);
181 int sec_register_to_crypto(void);
182 void sec_unregister_from_crypto(void);
183 #endif