]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/crypto/cavium/nitrox/nitrox_req.h
crypto: cavium/nitrox - fix a DMA pool free failure
[mirror_ubuntu-bionic-kernel.git] / drivers / crypto / cavium / nitrox / nitrox_req.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
14fa93cd
SJ
2#ifndef __NITROX_REQ_H
3#define __NITROX_REQ_H
4
5#include <linux/dma-mapping.h>
6#include <crypto/aes.h>
7
8#include "nitrox_dev.h"
9
10/**
11 * struct gphdr - General purpose Header
12 * @param0: first parameter.
13 * @param1: second parameter.
14 * @param2: third parameter.
15 * @param3: fourth parameter.
16 *
17 * Params tell the iv and enc/dec data offsets.
18 */
19struct gphdr {
20 __be16 param0;
21 __be16 param1;
22 __be16 param2;
23 __be16 param3;
24};
25
26/**
27 * struct se_req_ctrl - SE request information.
28 * @arg: Minor number of the opcode
29 * @ctxc: Context control.
30 * @unca: Uncertainity enabled.
31 * @info: Additional information for SE cores.
32 * @ctxl: Context length in bytes.
33 * @uddl: User defined data length
34 */
35union se_req_ctrl {
36 u64 value;
37 struct {
38 u64 raz : 22;
39 u64 arg : 8;
40 u64 ctxc : 2;
41 u64 unca : 1;
42 u64 info : 3;
43 u64 unc : 8;
44 u64 ctxl : 12;
45 u64 uddl : 8;
46 } s;
47};
48
49struct nitrox_sglist {
50 u16 len;
51 u16 raz0;
52 u32 raz1;
53 dma_addr_t dma;
54};
55
56#define MAX_IV_LEN 16
57
58/**
59 * struct se_crypto_request - SE crypto request structure.
60 * @opcode: Request opcode (enc/dec)
61 * @flags: flags from crypto subsystem
62 * @ctx_handle: Crypto context handle.
63 * @gph: GP Header
64 * @ctrl: Request Information.
65 * @in: Input sglist
66 * @out: Output sglist
67 */
68struct se_crypto_request {
69 u8 opcode;
70 gfp_t gfp;
71 u32 flags;
72 u64 ctx_handle;
73
74 struct gphdr gph;
75 union se_req_ctrl ctrl;
76
77 u8 iv[MAX_IV_LEN];
78 u16 ivsize;
79
80 struct scatterlist *src;
81 struct scatterlist *dst;
82};
83
84/* Crypto opcodes */
85#define FLEXI_CRYPTO_ENCRYPT_HMAC 0x33
86#define ENCRYPT 0
87#define DECRYPT 1
88
89/* IV from context */
90#define IV_FROM_CTX 0
91/* IV from Input data */
92#define IV_FROM_DPTR 1
93
94/**
95 * cipher opcodes for firmware
96 */
97enum flexi_cipher {
98 CIPHER_NULL = 0,
99 CIPHER_3DES_CBC,
100 CIPHER_3DES_ECB,
101 CIPHER_AES_CBC,
102 CIPHER_AES_ECB,
103 CIPHER_AES_CFB,
104 CIPHER_AES_CTR,
105 CIPHER_AES_GCM,
106 CIPHER_AES_XTS,
107 CIPHER_AES_CCM,
108 CIPHER_AES_CBC_CTS,
109 CIPHER_AES_ECB_CTS,
110 CIPHER_INVALID
111};
112
113/**
114 * struct crypto_keys - Crypto keys
115 * @key: Encryption key or KEY1 for AES-XTS
116 * @iv: Encryption IV or Tweak for AES-XTS
117 */
118struct crypto_keys {
119 union {
120 u8 key[AES_MAX_KEY_SIZE];
121 u8 key1[AES_MAX_KEY_SIZE];
122 } u;
123 u8 iv[AES_BLOCK_SIZE];
124};
125
126/**
127 * struct auth_keys - Authentication keys
128 * @ipad: IPAD or KEY2 for AES-XTS
129 * @opad: OPAD or AUTH KEY if auth_input_type = 1
130 */
131struct auth_keys {
132 union {
133 u8 ipad[64];
134 u8 key2[64];
135 } u;
136 u8 opad[64];
137};
138
139/**
140 * struct flexi_crypto_context - Crypto context
141 * @cipher_type: Encryption cipher type
142 * @aes_keylen: AES key length
143 * @iv_source: Encryption IV source
144 * @hash_type: Authentication type
145 * @auth_input_type: Authentication input type
146 * 1 - Authentication IV and KEY, microcode calculates OPAD/IPAD
147 * 0 - Authentication OPAD/IPAD
148 * @mac_len: mac length
149 * @crypto: Crypto keys
150 * @auth: Authentication keys
151 */
152struct flexi_crypto_context {
153 union {
154 __be64 flags;
155 struct {
156#if defined(__BIG_ENDIAN_BITFIELD)
157 u64 cipher_type : 4;
158 u64 reserved_59 : 1;
159 u64 aes_keylen : 2;
160 u64 iv_source : 1;
161 u64 hash_type : 4;
162 u64 reserved_49_51 : 3;
163 u64 auth_input_type: 1;
164 u64 mac_len : 8;
165 u64 reserved_0_39 : 40;
166#else
167 u64 reserved_0_39 : 40;
168 u64 mac_len : 8;
169 u64 auth_input_type: 1;
170 u64 reserved_49_51 : 3;
171 u64 hash_type : 4;
172 u64 iv_source : 1;
173 u64 aes_keylen : 2;
174 u64 reserved_59 : 1;
175 u64 cipher_type : 4;
176#endif
177 } w0;
178 };
179
180 struct crypto_keys crypto;
181 struct auth_keys auth;
182};
183
6111327e
WW
184struct crypto_ctx_hdr {
185 struct dma_pool *pool;
186 dma_addr_t dma;
187 void *vaddr;
188};
189
14fa93cd
SJ
190struct nitrox_crypto_ctx {
191 struct nitrox_device *ndev;
192 union {
193 u64 ctx_handle;
194 struct flexi_crypto_context *fctx;
195 } u;
6111327e 196 struct crypto_ctx_hdr *chdr;
14fa93cd
SJ
197};
198
199struct nitrox_kcrypt_request {
200 struct se_crypto_request creq;
201 struct nitrox_crypto_ctx *nctx;
202 struct skcipher_request *skreq;
203};
204
205/**
206 * struct pkt_instr_hdr - Packet Instruction Header
207 * @g: Gather used
208 * When [G] is set and [GSZ] != 0, the instruction is
209 * indirect gather instruction.
210 * When [G] is set and [GSZ] = 0, the instruction is
211 * direct gather instruction.
212 * @gsz: Number of pointers in the indirect gather list
213 * @ihi: When set hardware duplicates the 1st 8 bytes of pkt_instr_hdr
214 * and adds them to the packet after the pkt_instr_hdr but before any UDD
215 * @ssz: Not used by the input hardware. But can become slc_store_int[SSZ]
216 * when [IHI] is set.
217 * @fsz: The number of front data bytes directly included in the
218 * PCIe instruction.
219 * @tlen: The length of the input packet in bytes, include:
220 * - 16B pkt_hdr
221 * - Inline context bytes if any,
222 * - UDD if any,
223 * - packet payload bytes
224 */
225union pkt_instr_hdr {
226 u64 value;
227 struct {
228#if defined(__BIG_ENDIAN_BITFIELD)
229 u64 raz_48_63 : 16;
230 u64 g : 1;
231 u64 gsz : 7;
232 u64 ihi : 1;
233 u64 ssz : 7;
234 u64 raz_30_31 : 2;
235 u64 fsz : 6;
236 u64 raz_16_23 : 8;
237 u64 tlen : 16;
238#else
239 u64 tlen : 16;
240 u64 raz_16_23 : 8;
241 u64 fsz : 6;
242 u64 raz_30_31 : 2;
243 u64 ssz : 7;
244 u64 ihi : 1;
245 u64 gsz : 7;
246 u64 g : 1;
247 u64 raz_48_63 : 16;
248#endif
249 } s;
250};
251
252/**
253 * struct pkt_hdr - Packet Input Header
254 * @opcode: Request opcode (Major)
255 * @arg: Request opcode (Minor)
256 * @ctxc: Context control.
257 * @unca: When set [UNC] is the uncertainty count for an input packet.
258 * The hardware uses uncertainty counts to predict
259 * output buffer use and avoid deadlock.
260 * @info: Not used by input hardware. Available for use
261 * during SE processing.
262 * @destport: The expected destination port/ring/channel for the packet.
263 * @unc: Uncertainty count for an input packet.
264 * @grp: SE group that will process the input packet.
265 * @ctxl: Context Length in 64-bit words.
266 * @uddl: User-defined data (UDD) length in bytes.
267 * @ctxp: Context pointer. CTXP<63,2:0> must be zero in all cases.
268 */
269union pkt_hdr {
270 u64 value[2];
271 struct {
272#if defined(__BIG_ENDIAN_BITFIELD)
273 u64 opcode : 8;
274 u64 arg : 8;
275 u64 ctxc : 2;
276 u64 unca : 1;
277 u64 raz_44 : 1;
278 u64 info : 3;
279 u64 destport : 9;
280 u64 unc : 8;
281 u64 raz_19_23 : 5;
282 u64 grp : 3;
283 u64 raz_15 : 1;
284 u64 ctxl : 7;
285 u64 uddl : 8;
286#else
287 u64 uddl : 8;
288 u64 ctxl : 7;
289 u64 raz_15 : 1;
290 u64 grp : 3;
291 u64 raz_19_23 : 5;
292 u64 unc : 8;
293 u64 destport : 9;
294 u64 info : 3;
295 u64 raz_44 : 1;
296 u64 unca : 1;
297 u64 ctxc : 2;
298 u64 arg : 8;
299 u64 opcode : 8;
300#endif
301 __be64 ctxp;
302 } s;
303};
304
305/**
306 * struct slc_store_info - Solicited Paceket Output Store Information.
307 * @ssz: The number of scatterlist pointers for the solicited output port
308 * packet.
309 * @rptr: The result pointer for the solicited output port packet.
310 * If [SSZ]=0, [RPTR] must point directly to a buffer on the remote
311 * host that is large enough to hold the entire output packet.
312 * If [SSZ]!=0, [RPTR] must point to an array of ([SSZ]+3)/4
313 * sglist components at [RPTR] on the remote host.
314 */
315union slc_store_info {
316 u64 value[2];
317 struct {
318#if defined(__BIG_ENDIAN_BITFIELD)
319 u64 raz_39_63 : 25;
320 u64 ssz : 7;
321 u64 raz_0_31 : 32;
322#else
323 u64 raz_0_31 : 32;
324 u64 ssz : 7;
325 u64 raz_39_63 : 25;
326#endif
327 __be64 rptr;
328 } s;
329};
330
331/**
332 * struct nps_pkt_instr - NPS Packet Instruction of SE cores.
333 * @dptr0 : Input pointer points to buffer in remote host.
334 * @ih: Packet Instruction Header (8 bytes)
335 * @irh: Packet Input Header (16 bytes)
336 * @slc: Solicited Packet Output Store Information (16 bytes)
337 * @fdata: Front data
338 *
339 * 64-Byte Instruction Format
340 */
341struct nps_pkt_instr {
342 __be64 dptr0;
343 union pkt_instr_hdr ih;
344 union pkt_hdr irh;
345 union slc_store_info slc;
346 u64 fdata[2];
347};
348
349/**
350 * struct ctx_hdr - Book keeping data about the crypto context
351 * @pool: Pool used to allocate crypto context
352 * @dma: Base DMA address of the cypto context
353 * @ctx_dma: Actual usable crypto context for NITROX
354 */
355struct ctx_hdr {
356 struct dma_pool *pool;
357 dma_addr_t dma;
358 dma_addr_t ctx_dma;
359};
360
361/*
362 * struct sglist_component - SG list component format
363 * @len0: The number of bytes at [PTR0] on the remote host.
364 * @len1: The number of bytes at [PTR1] on the remote host.
365 * @len2: The number of bytes at [PTR2] on the remote host.
366 * @len3: The number of bytes at [PTR3] on the remote host.
367 * @dma0: First pointer point to buffer in remote host.
368 * @dma1: Second pointer point to buffer in remote host.
369 * @dma2: Third pointer point to buffer in remote host.
370 * @dma3: Fourth pointer point to buffer in remote host.
371 */
372struct nitrox_sgcomp {
373 __be16 len[4];
374 __be64 dma[4];
375};
376
377/*
378 * strutct nitrox_sgtable - SG list information
379 * @map_cnt: Number of buffers mapped
380 * @nr_comp: Number of sglist components
381 * @total_bytes: Total bytes in sglist.
382 * @len: Total sglist components length.
383 * @dma: DMA address of sglist component.
384 * @dir: DMA direction.
385 * @buf: crypto request buffer.
386 * @sglist: SG list of input/output buffers.
387 * @sgcomp: sglist component for NITROX.
388 */
389struct nitrox_sgtable {
390 u8 map_bufs_cnt;
391 u8 nr_sgcomp;
392 u16 total_bytes;
393 u32 len;
394 dma_addr_t dma;
395 enum dma_data_direction dir;
396
397 struct scatterlist *buf;
398 struct nitrox_sglist *sglist;
399 struct nitrox_sgcomp *sgcomp;
400};
401
402/* Response Header Length */
403#define ORH_HLEN 8
404/* Completion bytes Length */
405#define COMP_HLEN 8
406
407struct resp_hdr {
408 u64 orh;
409 dma_addr_t orh_dma;
410 u64 completion;
411 dma_addr_t completion_dma;
412};
413
414typedef void (*completion_t)(struct skcipher_request *skreq, int err);
415
416/**
417 * struct nitrox_softreq - Represents the NIROX Request.
418 * @response: response list entry
419 * @backlog: Backlog list entry
420 * @ndev: Device used to submit the request
421 * @cmdq: Command queue for submission
422 * @resp: Response headers
423 * @instr: 64B instruction
424 * @in: SG table for input
425 * @out SG table for output
426 * @tstamp: Request submitted time in jiffies
427 * @callback: callback after request completion/timeout
428 * @cb_arg: callback argument
429 */
430struct nitrox_softreq {
431 struct list_head response;
432 struct list_head backlog;
433
434 u32 flags;
435 gfp_t gfp;
436 atomic_t status;
437 bool inplace;
438
439 struct nitrox_device *ndev;
440 struct nitrox_cmdq *cmdq;
441
442 struct nps_pkt_instr instr;
443 struct resp_hdr resp;
444 struct nitrox_sgtable in;
445 struct nitrox_sgtable out;
446
447 unsigned long tstamp;
448
449 completion_t callback;
450 struct skcipher_request *skreq;
451};
452
453#endif /* __NITROX_REQ_H */