1e95faac1STomasz Duszynski /* SPDX-License-Identifier: BSD-3-Clause
2e95faac1STomasz Duszynski * Copyright(c) 2017 Marvell International Ltd.
3e95faac1STomasz Duszynski * Copyright(c) 2017 Semihalf.
4e95faac1STomasz Duszynski * All rights reserved.
5e95faac1STomasz Duszynski */
6e95faac1STomasz Duszynski
7e95faac1STomasz Duszynski #include <string.h>
8e95faac1STomasz Duszynski
9e95faac1STomasz Duszynski #include <rte_common.h>
10e95faac1STomasz Duszynski #include <rte_malloc.h>
11af668035SAkhil Goyal #include <cryptodev_pmd.h>
12e0f89d5eSMichael Shamis #include <rte_security_driver.h>
13e95faac1STomasz Duszynski
14b28f28aeSDharmik Thakkar #include "mrvl_pmd_private.h"
15e95faac1STomasz Duszynski
16e95faac1STomasz Duszynski /**
17e95faac1STomasz Duszynski * Capabilities list to be used in reporting to DPDK.
18e95faac1STomasz Duszynski */
19e95faac1STomasz Duszynski static const struct rte_cryptodev_capabilities
20e95faac1STomasz Duszynski mrvl_crypto_pmd_capabilities[] = {
21e95faac1STomasz Duszynski { /* MD5 HMAC */
22e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
23e95faac1STomasz Duszynski {.sym = {
24e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
25e95faac1STomasz Duszynski {.auth = {
26e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_MD5_HMAC,
27e95faac1STomasz Duszynski .block_size = 64,
28e95faac1STomasz Duszynski .key_size = {
29e95faac1STomasz Duszynski .min = 1,
30e95faac1STomasz Duszynski .max = 64,
31e95faac1STomasz Duszynski .increment = 1
32e95faac1STomasz Duszynski },
33e95faac1STomasz Duszynski .digest_size = {
342c22aa4fSSzymon Sliwa .min = 12,
35e95faac1STomasz Duszynski .max = 16,
362c22aa4fSSzymon Sliwa .increment = 4
37e95faac1STomasz Duszynski },
38e95faac1STomasz Duszynski }, }
39e95faac1STomasz Duszynski }, }
40e95faac1STomasz Duszynski },
41e95faac1STomasz Duszynski { /* MD5 */
42e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
43e95faac1STomasz Duszynski {.sym = {
44e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
45e95faac1STomasz Duszynski {.auth = {
46e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_MD5,
47e95faac1STomasz Duszynski .block_size = 64,
48e95faac1STomasz Duszynski .key_size = {
49e95faac1STomasz Duszynski .min = 0,
50e95faac1STomasz Duszynski .max = 0,
51e95faac1STomasz Duszynski .increment = 0
52e95faac1STomasz Duszynski },
53e95faac1STomasz Duszynski .digest_size = {
542c22aa4fSSzymon Sliwa .min = 12,
55e95faac1STomasz Duszynski .max = 16,
562c22aa4fSSzymon Sliwa .increment = 4
57e95faac1STomasz Duszynski },
58e95faac1STomasz Duszynski }, }
59e95faac1STomasz Duszynski }, }
60e95faac1STomasz Duszynski },
61e95faac1STomasz Duszynski { /* SHA1 HMAC */
62e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
63e95faac1STomasz Duszynski {.sym = {
64e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
65e95faac1STomasz Duszynski {.auth = {
66e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
67e95faac1STomasz Duszynski .block_size = 64,
68e95faac1STomasz Duszynski .key_size = {
69e95faac1STomasz Duszynski .min = 1,
70e95faac1STomasz Duszynski .max = 64,
71e95faac1STomasz Duszynski .increment = 1
72e95faac1STomasz Duszynski },
73e95faac1STomasz Duszynski .digest_size = {
742c22aa4fSSzymon Sliwa .min = 12,
75e95faac1STomasz Duszynski .max = 20,
762c22aa4fSSzymon Sliwa .increment = 4
77e95faac1STomasz Duszynski },
78e95faac1STomasz Duszynski }, }
79e95faac1STomasz Duszynski }, }
80e95faac1STomasz Duszynski },
81e95faac1STomasz Duszynski { /* SHA1 */
82e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
83e95faac1STomasz Duszynski {.sym = {
84e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
85e95faac1STomasz Duszynski {.auth = {
86e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_SHA1,
87e95faac1STomasz Duszynski .block_size = 64,
88e95faac1STomasz Duszynski .key_size = {
89e95faac1STomasz Duszynski .min = 0,
90e95faac1STomasz Duszynski .max = 0,
91e95faac1STomasz Duszynski .increment = 0
92e95faac1STomasz Duszynski },
93e95faac1STomasz Duszynski .digest_size = {
942c22aa4fSSzymon Sliwa .min = 12,
95e95faac1STomasz Duszynski .max = 20,
962c22aa4fSSzymon Sliwa .increment = 4
97e95faac1STomasz Duszynski },
98e95faac1STomasz Duszynski }, }
99e95faac1STomasz Duszynski }, }
100e95faac1STomasz Duszynski },
101a84226fcSTomasz Duszynski {
102a84226fcSTomasz Duszynski /* SHA224 HMAC */
103a84226fcSTomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
104a84226fcSTomasz Duszynski {.sym = {
105a84226fcSTomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
106a84226fcSTomasz Duszynski {.auth = {
107a84226fcSTomasz Duszynski .algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
108a84226fcSTomasz Duszynski .block_size = 64,
109a84226fcSTomasz Duszynski .key_size = {
110a84226fcSTomasz Duszynski .min = 1,
111a84226fcSTomasz Duszynski .max = 64,
112a84226fcSTomasz Duszynski .increment = 1
113a84226fcSTomasz Duszynski },
114a84226fcSTomasz Duszynski .digest_size = {
11562f7513eSMichael Shamis .min = 12,
116a84226fcSTomasz Duszynski .max = 28,
117a84226fcSTomasz Duszynski .increment = 0
118a84226fcSTomasz Duszynski },
119a84226fcSTomasz Duszynski }, }
120a84226fcSTomasz Duszynski }, }
121a84226fcSTomasz Duszynski },
122e95faac1STomasz Duszynski { /* SHA224 */
123e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
124e95faac1STomasz Duszynski {.sym = {
125e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
126e95faac1STomasz Duszynski {.auth = {
127e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_SHA224,
128e95faac1STomasz Duszynski .block_size = 64,
129e95faac1STomasz Duszynski .key_size = {
130e95faac1STomasz Duszynski .min = 0,
131e95faac1STomasz Duszynski .max = 0,
132e95faac1STomasz Duszynski .increment = 0
133e95faac1STomasz Duszynski },
134e95faac1STomasz Duszynski .digest_size = {
1352c22aa4fSSzymon Sliwa .min = 12,
136e95faac1STomasz Duszynski .max = 28,
1372c22aa4fSSzymon Sliwa .increment = 4
138e95faac1STomasz Duszynski },
139e95faac1STomasz Duszynski }, }
140e95faac1STomasz Duszynski }, }
141e95faac1STomasz Duszynski },
142e95faac1STomasz Duszynski { /* SHA256 HMAC */
143e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
144e95faac1STomasz Duszynski {.sym = {
145e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
146e95faac1STomasz Duszynski {.auth = {
147e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
148e95faac1STomasz Duszynski .block_size = 64,
149e95faac1STomasz Duszynski .key_size = {
150e95faac1STomasz Duszynski .min = 1,
151e95faac1STomasz Duszynski .max = 64,
152e95faac1STomasz Duszynski .increment = 1
153e95faac1STomasz Duszynski },
154e95faac1STomasz Duszynski .digest_size = {
1552c22aa4fSSzymon Sliwa .min = 12,
156e95faac1STomasz Duszynski .max = 32,
1572c22aa4fSSzymon Sliwa .increment = 4
158e95faac1STomasz Duszynski },
159e95faac1STomasz Duszynski }, }
160e95faac1STomasz Duszynski }, }
161e95faac1STomasz Duszynski },
162e95faac1STomasz Duszynski { /* SHA256 */
163e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
164e95faac1STomasz Duszynski {.sym = {
165e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
166e95faac1STomasz Duszynski {.auth = {
167e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_SHA256,
168e95faac1STomasz Duszynski .block_size = 64,
169e95faac1STomasz Duszynski .key_size = {
170e95faac1STomasz Duszynski .min = 0,
171e95faac1STomasz Duszynski .max = 0,
172e95faac1STomasz Duszynski .increment = 0
173e95faac1STomasz Duszynski },
174e95faac1STomasz Duszynski .digest_size = {
1752c22aa4fSSzymon Sliwa .min = 12,
176e95faac1STomasz Duszynski .max = 32,
1772c22aa4fSSzymon Sliwa .increment = 4
178e95faac1STomasz Duszynski },
179e95faac1STomasz Duszynski }, }
180e95faac1STomasz Duszynski }, }
181e95faac1STomasz Duszynski },
182e95faac1STomasz Duszynski { /* SHA384 HMAC */
183e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
184e95faac1STomasz Duszynski {.sym = {
185e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
186e95faac1STomasz Duszynski {.auth = {
187e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
188e95faac1STomasz Duszynski .block_size = 128,
189e95faac1STomasz Duszynski .key_size = {
190e95faac1STomasz Duszynski .min = 1,
191e95faac1STomasz Duszynski .max = 128,
192e95faac1STomasz Duszynski .increment = 1
193e95faac1STomasz Duszynski },
194e95faac1STomasz Duszynski .digest_size = {
1952c22aa4fSSzymon Sliwa .min = 12,
196e95faac1STomasz Duszynski .max = 48,
1972c22aa4fSSzymon Sliwa .increment = 4
198e95faac1STomasz Duszynski },
199e95faac1STomasz Duszynski }, }
200e95faac1STomasz Duszynski }, }
201e95faac1STomasz Duszynski },
202e95faac1STomasz Duszynski { /* SHA384 */
203e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
204e95faac1STomasz Duszynski {.sym = {
205e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
206e95faac1STomasz Duszynski {.auth = {
207e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_SHA384,
208e95faac1STomasz Duszynski .block_size = 128,
209e95faac1STomasz Duszynski .key_size = {
210e95faac1STomasz Duszynski .min = 0,
211e95faac1STomasz Duszynski .max = 0,
212e95faac1STomasz Duszynski .increment = 0
213e95faac1STomasz Duszynski },
214e95faac1STomasz Duszynski .digest_size = {
2152c22aa4fSSzymon Sliwa .min = 12,
216e95faac1STomasz Duszynski .max = 48,
2172c22aa4fSSzymon Sliwa .increment = 4
218e95faac1STomasz Duszynski },
219e95faac1STomasz Duszynski }, }
220e95faac1STomasz Duszynski }, }
221e95faac1STomasz Duszynski },
222e95faac1STomasz Duszynski { /* SHA512 HMAC */
223e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
224e95faac1STomasz Duszynski {.sym = {
225e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
226e95faac1STomasz Duszynski {.auth = {
227e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
228e95faac1STomasz Duszynski .block_size = 128,
229e95faac1STomasz Duszynski .key_size = {
230e95faac1STomasz Duszynski .min = 1,
231e95faac1STomasz Duszynski .max = 128,
232e95faac1STomasz Duszynski .increment = 1
233e95faac1STomasz Duszynski },
234e95faac1STomasz Duszynski .digest_size = {
2352c22aa4fSSzymon Sliwa .min = 12,
23662f7513eSMichael Shamis .max = 64,
2372c22aa4fSSzymon Sliwa .increment = 4
238e95faac1STomasz Duszynski },
239e95faac1STomasz Duszynski }, }
240e95faac1STomasz Duszynski }, }
241e95faac1STomasz Duszynski },
242e95faac1STomasz Duszynski { /* SHA512 */
243e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
244e95faac1STomasz Duszynski {.sym = {
245e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
246e95faac1STomasz Duszynski {.auth = {
247e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_SHA512,
248e95faac1STomasz Duszynski .block_size = 128,
249e95faac1STomasz Duszynski .key_size = {
250e95faac1STomasz Duszynski .min = 0,
251e95faac1STomasz Duszynski .max = 0,
252e95faac1STomasz Duszynski .increment = 0
253e95faac1STomasz Duszynski },
254e95faac1STomasz Duszynski .digest_size = {
2552c22aa4fSSzymon Sliwa .min = 12,
25662f7513eSMichael Shamis .max = 64,
257e95faac1STomasz Duszynski .increment = 0
258e95faac1STomasz Duszynski },
259e95faac1STomasz Duszynski }, }
260e95faac1STomasz Duszynski }, }
261e95faac1STomasz Duszynski },
262e95faac1STomasz Duszynski { /* AES CBC */
263e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
264e95faac1STomasz Duszynski {.sym = {
265e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
266e95faac1STomasz Duszynski {.cipher = {
267e95faac1STomasz Duszynski .algo = RTE_CRYPTO_CIPHER_AES_CBC,
268e95faac1STomasz Duszynski .block_size = 16,
269e95faac1STomasz Duszynski .key_size = {
270e95faac1STomasz Duszynski .min = 16,
271e95faac1STomasz Duszynski .max = 32,
272e95faac1STomasz Duszynski .increment = 8
273e95faac1STomasz Duszynski },
274e95faac1STomasz Duszynski .iv_size = {
275e95faac1STomasz Duszynski .min = 16,
276e95faac1STomasz Duszynski .max = 16,
277e95faac1STomasz Duszynski .increment = 0
278e95faac1STomasz Duszynski }
279e95faac1STomasz Duszynski }, }
280e95faac1STomasz Duszynski }, }
281e95faac1STomasz Duszynski },
282e95faac1STomasz Duszynski { /* AES CTR */
283e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
284e95faac1STomasz Duszynski {.sym = {
285e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
286e95faac1STomasz Duszynski {.cipher = {
287e95faac1STomasz Duszynski .algo = RTE_CRYPTO_CIPHER_AES_CTR,
288e95faac1STomasz Duszynski .block_size = 16,
289e95faac1STomasz Duszynski .key_size = {
290e95faac1STomasz Duszynski .min = 16,
291e95faac1STomasz Duszynski .max = 32,
292e95faac1STomasz Duszynski .increment = 8
293e95faac1STomasz Duszynski },
294e95faac1STomasz Duszynski .iv_size = {
295e95faac1STomasz Duszynski .min = 16,
296e95faac1STomasz Duszynski .max = 16,
297e95faac1STomasz Duszynski .increment = 0
298e95faac1STomasz Duszynski }
299e95faac1STomasz Duszynski }, }
300e95faac1STomasz Duszynski }, }
301e95faac1STomasz Duszynski },
302fe103c6dSTomasz Duszynski { /* AES ECB */
303fe103c6dSTomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
304fe103c6dSTomasz Duszynski {.sym = {
305fe103c6dSTomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
306fe103c6dSTomasz Duszynski {.cipher = {
307fe103c6dSTomasz Duszynski .algo = RTE_CRYPTO_CIPHER_AES_ECB,
308fe103c6dSTomasz Duszynski .block_size = 16,
309fe103c6dSTomasz Duszynski .key_size = {
310fe103c6dSTomasz Duszynski .min = 16,
311fe103c6dSTomasz Duszynski .max = 32,
312fe103c6dSTomasz Duszynski .increment = 8
313fe103c6dSTomasz Duszynski },
314fe103c6dSTomasz Duszynski .iv_size = {
315fe103c6dSTomasz Duszynski .min = 0,
316fe103c6dSTomasz Duszynski .max = 0,
317fe103c6dSTomasz Duszynski .increment = 0
318fe103c6dSTomasz Duszynski }
319fe103c6dSTomasz Duszynski }, }
320fe103c6dSTomasz Duszynski }, }
321fe103c6dSTomasz Duszynski },
322e95faac1STomasz Duszynski { /* AES GCM */
323e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
324e95faac1STomasz Duszynski {.sym = {
325e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
326e95faac1STomasz Duszynski {.aead = {
327e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AEAD_AES_GCM,
328e95faac1STomasz Duszynski .block_size = 16,
329e95faac1STomasz Duszynski .key_size = {
330e95faac1STomasz Duszynski .min = 16,
331e95faac1STomasz Duszynski .max = 32,
332e95faac1STomasz Duszynski .increment = 8
333e95faac1STomasz Duszynski },
334e95faac1STomasz Duszynski .digest_size = {
335e95faac1STomasz Duszynski .min = 16,
336e95faac1STomasz Duszynski .max = 16,
337e95faac1STomasz Duszynski .increment = 0
338e95faac1STomasz Duszynski },
339e95faac1STomasz Duszynski .aad_size = {
34062f7513eSMichael Shamis .min = 0,
34162f7513eSMichael Shamis .max = 64,
34262f7513eSMichael Shamis .increment = 1
343e95faac1STomasz Duszynski },
344e95faac1STomasz Duszynski .iv_size = {
345e95faac1STomasz Duszynski .min = 12,
346e95faac1STomasz Duszynski .max = 16,
347e95faac1STomasz Duszynski .increment = 4
348e95faac1STomasz Duszynski }
349e95faac1STomasz Duszynski }, }
350e95faac1STomasz Duszynski }, }
351e95faac1STomasz Duszynski },
352e95faac1STomasz Duszynski { /* AES GMAC (AUTH) */
353e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
354e95faac1STomasz Duszynski {.sym = {
355e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
356e95faac1STomasz Duszynski {.auth = {
357e95faac1STomasz Duszynski .algo = RTE_CRYPTO_AUTH_AES_GMAC,
358e95faac1STomasz Duszynski .block_size = 16,
359e95faac1STomasz Duszynski .key_size = {
360e95faac1STomasz Duszynski .min = 16,
361e95faac1STomasz Duszynski .max = 32,
362e95faac1STomasz Duszynski .increment = 8
363e95faac1STomasz Duszynski },
364e95faac1STomasz Duszynski .digest_size = {
365e95faac1STomasz Duszynski .min = 16,
366e95faac1STomasz Duszynski .max = 16,
367e95faac1STomasz Duszynski .increment = 0
368e95faac1STomasz Duszynski },
369e95faac1STomasz Duszynski .iv_size = {
370e95faac1STomasz Duszynski .min = 8,
371e95faac1STomasz Duszynski .max = 65532,
372e95faac1STomasz Duszynski .increment = 4
373e95faac1STomasz Duszynski }
374e95faac1STomasz Duszynski }, }
375e95faac1STomasz Duszynski }, }
376e95faac1STomasz Duszynski },
377e95faac1STomasz Duszynski { /* 3DES CBC */
378e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
379e95faac1STomasz Duszynski {.sym = {
380e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
381e95faac1STomasz Duszynski {.cipher = {
382e95faac1STomasz Duszynski .algo = RTE_CRYPTO_CIPHER_3DES_CBC,
383e95faac1STomasz Duszynski .block_size = 8,
384e95faac1STomasz Duszynski .key_size = {
385e95faac1STomasz Duszynski .min = 24,
386e95faac1STomasz Duszynski .max = 24,
387e95faac1STomasz Duszynski .increment = 0
388e95faac1STomasz Duszynski },
389e95faac1STomasz Duszynski .iv_size = {
390e95faac1STomasz Duszynski .min = 8,
391e95faac1STomasz Duszynski .max = 8,
392e95faac1STomasz Duszynski .increment = 0
393e95faac1STomasz Duszynski }
394e95faac1STomasz Duszynski }, }
395e95faac1STomasz Duszynski }, }
396e95faac1STomasz Duszynski },
397e95faac1STomasz Duszynski { /* 3DES CTR */
398e95faac1STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
399e95faac1STomasz Duszynski {.sym = {
400e95faac1STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
401e95faac1STomasz Duszynski {.cipher = {
402e95faac1STomasz Duszynski .algo = RTE_CRYPTO_CIPHER_3DES_CTR,
403e95faac1STomasz Duszynski .block_size = 8,
404e95faac1STomasz Duszynski .key_size = {
405e95faac1STomasz Duszynski .min = 24,
406e95faac1STomasz Duszynski .max = 24,
407e95faac1STomasz Duszynski .increment = 0
408e95faac1STomasz Duszynski },
409e95faac1STomasz Duszynski .iv_size = {
410e95faac1STomasz Duszynski .min = 8,
411e95faac1STomasz Duszynski .max = 8,
412e95faac1STomasz Duszynski .increment = 0
413e95faac1STomasz Duszynski }
414e95faac1STomasz Duszynski }, }
415e95faac1STomasz Duszynski }, }
416e95faac1STomasz Duszynski },
417d3f37c22STomasz Duszynski { /* 3DES ECB */
418d3f37c22STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
419d3f37c22STomasz Duszynski {.sym = {
420d3f37c22STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
421d3f37c22STomasz Duszynski {.cipher = {
422d3f37c22STomasz Duszynski .algo = RTE_CRYPTO_CIPHER_3DES_ECB,
423d3f37c22STomasz Duszynski .block_size = 8,
424d3f37c22STomasz Duszynski .key_size = {
425d3f37c22STomasz Duszynski .min = 24,
426d3f37c22STomasz Duszynski .max = 24,
427d3f37c22STomasz Duszynski .increment = 0
428d3f37c22STomasz Duszynski },
429d3f37c22STomasz Duszynski .iv_size = {
430d3f37c22STomasz Duszynski .min = 0,
431d3f37c22STomasz Duszynski .max = 0,
432d3f37c22STomasz Duszynski .increment = 0
433d3f37c22STomasz Duszynski }
434d3f37c22STomasz Duszynski }, }
435d3f37c22STomasz Duszynski }, }
436d3f37c22STomasz Duszynski },
437c1c40743STomasz Duszynski { /* NULL (AUTH) */
438c1c40743STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
439c1c40743STomasz Duszynski {.sym = {
440c1c40743STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
441c1c40743STomasz Duszynski {.auth = {
442c1c40743STomasz Duszynski .algo = RTE_CRYPTO_AUTH_NULL,
443c1c40743STomasz Duszynski .block_size = 1,
444c1c40743STomasz Duszynski .key_size = {
445c1c40743STomasz Duszynski .min = 0,
446c1c40743STomasz Duszynski .max = 0,
447c1c40743STomasz Duszynski .increment = 0
448c1c40743STomasz Duszynski },
449c1c40743STomasz Duszynski .digest_size = {
450c1c40743STomasz Duszynski .min = 0,
451c1c40743STomasz Duszynski .max = 0,
452c1c40743STomasz Duszynski .increment = 0
453c1c40743STomasz Duszynski },
454c1c40743STomasz Duszynski .iv_size = {
455c1c40743STomasz Duszynski .min = 0,
456c1c40743STomasz Duszynski .max = 0,
457c1c40743STomasz Duszynski .increment = 0
458c1c40743STomasz Duszynski }
459c1c40743STomasz Duszynski }, },
460c1c40743STomasz Duszynski }, },
461c1c40743STomasz Duszynski },
462c1c40743STomasz Duszynski { /* NULL (CIPHER) */
463c1c40743STomasz Duszynski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
464c1c40743STomasz Duszynski {.sym = {
465c1c40743STomasz Duszynski .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
466c1c40743STomasz Duszynski {.cipher = {
467c1c40743STomasz Duszynski .algo = RTE_CRYPTO_CIPHER_NULL,
468c1c40743STomasz Duszynski .block_size = 1,
469c1c40743STomasz Duszynski .key_size = {
470c1c40743STomasz Duszynski .min = 0,
471c1c40743STomasz Duszynski .max = 0,
472c1c40743STomasz Duszynski .increment = 0
473c1c40743STomasz Duszynski },
474c1c40743STomasz Duszynski .iv_size = {
475c1c40743STomasz Duszynski .min = 0,
476c1c40743STomasz Duszynski .max = 0,
477c1c40743STomasz Duszynski .increment = 0
478c1c40743STomasz Duszynski }
479c1c40743STomasz Duszynski }, },
480c1c40743STomasz Duszynski }, }
481c1c40743STomasz Duszynski },
482e95faac1STomasz Duszynski
483e95faac1STomasz Duszynski RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
484e95faac1STomasz Duszynski };
485e95faac1STomasz Duszynski
486e95faac1STomasz Duszynski
487e95faac1STomasz Duszynski /**
488e95faac1STomasz Duszynski * Configure device (PMD ops callback).
489e95faac1STomasz Duszynski *
490e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
491e95faac1STomasz Duszynski * @param config Pointer to configuration structure.
492e95faac1STomasz Duszynski * @returns 0. Always.
493e95faac1STomasz Duszynski */
494e95faac1STomasz Duszynski static int
mrvl_crypto_pmd_config(__rte_unused struct rte_cryptodev * dev,__rte_unused struct rte_cryptodev_config * config)495e95faac1STomasz Duszynski mrvl_crypto_pmd_config(__rte_unused struct rte_cryptodev *dev,
496e95faac1STomasz Duszynski __rte_unused struct rte_cryptodev_config *config)
497e95faac1STomasz Duszynski {
498e95faac1STomasz Duszynski return 0;
499e95faac1STomasz Duszynski }
500e95faac1STomasz Duszynski
501e95faac1STomasz Duszynski /**
502e95faac1STomasz Duszynski * Start device (PMD ops callback).
503e95faac1STomasz Duszynski *
504e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
505e95faac1STomasz Duszynski * @returns 0. Always.
506e95faac1STomasz Duszynski */
507e95faac1STomasz Duszynski static int
mrvl_crypto_pmd_start(__rte_unused struct rte_cryptodev * dev)508e95faac1STomasz Duszynski mrvl_crypto_pmd_start(__rte_unused struct rte_cryptodev *dev)
509e95faac1STomasz Duszynski {
510e95faac1STomasz Duszynski return 0;
511e95faac1STomasz Duszynski }
512e95faac1STomasz Duszynski
513e95faac1STomasz Duszynski /**
514e95faac1STomasz Duszynski * Stop device (PMD ops callback).
515e95faac1STomasz Duszynski *
516e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
517e95faac1STomasz Duszynski * @returns 0. Always.
518e95faac1STomasz Duszynski */
519e95faac1STomasz Duszynski static void
mrvl_crypto_pmd_stop(__rte_unused struct rte_cryptodev * dev)520e95faac1STomasz Duszynski mrvl_crypto_pmd_stop(__rte_unused struct rte_cryptodev *dev)
521e95faac1STomasz Duszynski {
522e95faac1STomasz Duszynski }
523e95faac1STomasz Duszynski
524e95faac1STomasz Duszynski /**
525e95faac1STomasz Duszynski * Get device statistics (PMD ops callback).
526e95faac1STomasz Duszynski *
527e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
528e95faac1STomasz Duszynski * @param stats Pointer to statistics structure [out].
529e95faac1STomasz Duszynski */
530e95faac1STomasz Duszynski static void
mrvl_crypto_pmd_stats_get(struct rte_cryptodev * dev,struct rte_cryptodev_stats * stats)531e95faac1STomasz Duszynski mrvl_crypto_pmd_stats_get(struct rte_cryptodev *dev,
532e95faac1STomasz Duszynski struct rte_cryptodev_stats *stats)
533e95faac1STomasz Duszynski {
534e95faac1STomasz Duszynski int qp_id;
535e95faac1STomasz Duszynski
536e95faac1STomasz Duszynski for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
537e95faac1STomasz Duszynski struct mrvl_crypto_qp *qp = dev->data->queue_pairs[qp_id];
538e95faac1STomasz Duszynski
539e95faac1STomasz Duszynski stats->enqueued_count += qp->stats.enqueued_count;
540e95faac1STomasz Duszynski stats->dequeued_count += qp->stats.dequeued_count;
541e95faac1STomasz Duszynski
542e95faac1STomasz Duszynski stats->enqueue_err_count += qp->stats.enqueue_err_count;
543e95faac1STomasz Duszynski stats->dequeue_err_count += qp->stats.dequeue_err_count;
544e95faac1STomasz Duszynski }
545e95faac1STomasz Duszynski }
546e95faac1STomasz Duszynski
547e95faac1STomasz Duszynski /**
548e95faac1STomasz Duszynski * Reset device statistics (PMD ops callback).
549e95faac1STomasz Duszynski *
550e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
551e95faac1STomasz Duszynski */
552e95faac1STomasz Duszynski static void
mrvl_crypto_pmd_stats_reset(struct rte_cryptodev * dev)553e95faac1STomasz Duszynski mrvl_crypto_pmd_stats_reset(struct rte_cryptodev *dev)
554e95faac1STomasz Duszynski {
555e95faac1STomasz Duszynski int qp_id;
556e95faac1STomasz Duszynski
557e95faac1STomasz Duszynski for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
558e95faac1STomasz Duszynski struct mrvl_crypto_qp *qp = dev->data->queue_pairs[qp_id];
559e95faac1STomasz Duszynski
560e95faac1STomasz Duszynski memset(&qp->stats, 0, sizeof(qp->stats));
561e95faac1STomasz Duszynski }
562e95faac1STomasz Duszynski }
563e95faac1STomasz Duszynski
564e95faac1STomasz Duszynski /**
565e95faac1STomasz Duszynski * Get device info (PMD ops callback).
566e95faac1STomasz Duszynski *
567e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
568e95faac1STomasz Duszynski * @param dev_info Pointer to the device info structure [out].
569e95faac1STomasz Duszynski */
570e95faac1STomasz Duszynski static void
mrvl_crypto_pmd_info_get(struct rte_cryptodev * dev,struct rte_cryptodev_info * dev_info)571e95faac1STomasz Duszynski mrvl_crypto_pmd_info_get(struct rte_cryptodev *dev,
572e95faac1STomasz Duszynski struct rte_cryptodev_info *dev_info)
573e95faac1STomasz Duszynski {
574e95faac1STomasz Duszynski struct mrvl_crypto_private *internals = dev->data->dev_private;
575e95faac1STomasz Duszynski
576e95faac1STomasz Duszynski if (dev_info != NULL) {
577e95faac1STomasz Duszynski dev_info->driver_id = dev->driver_id;
578e95faac1STomasz Duszynski dev_info->feature_flags = dev->feature_flags;
579e95faac1STomasz Duszynski dev_info->capabilities = mrvl_crypto_pmd_capabilities;
580e95faac1STomasz Duszynski dev_info->max_nb_queue_pairs = internals->max_nb_qpairs;
581e95faac1STomasz Duszynski dev_info->sym.max_nb_sessions = internals->max_nb_sessions;
582e95faac1STomasz Duszynski }
583e95faac1STomasz Duszynski }
584e95faac1STomasz Duszynski
585e95faac1STomasz Duszynski /**
586e95faac1STomasz Duszynski * Release queue pair (PMD ops callback).
587e95faac1STomasz Duszynski *
588e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
589e95faac1STomasz Duszynski * @param qp_id ID of Queue Pair to release.
590e95faac1STomasz Duszynski * @returns 0. Always.
591e95faac1STomasz Duszynski */
592e95faac1STomasz Duszynski static int
mrvl_crypto_pmd_qp_release(struct rte_cryptodev * dev,uint16_t qp_id)593e95faac1STomasz Duszynski mrvl_crypto_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
594e95faac1STomasz Duszynski {
595e95faac1STomasz Duszynski struct mrvl_crypto_qp *qp =
596e95faac1STomasz Duszynski (struct mrvl_crypto_qp *)dev->data->queue_pairs[qp_id];
597e95faac1STomasz Duszynski
598e95faac1STomasz Duszynski if (dev->data->queue_pairs[qp_id] != NULL) {
599e95faac1STomasz Duszynski sam_cio_flush(qp->cio);
600e95faac1STomasz Duszynski sam_cio_deinit(qp->cio);
601e95faac1STomasz Duszynski rte_free(dev->data->queue_pairs[qp_id]);
602e95faac1STomasz Duszynski dev->data->queue_pairs[qp_id] = NULL;
603e95faac1STomasz Duszynski }
604e95faac1STomasz Duszynski
605e95faac1STomasz Duszynski return 0;
606e95faac1STomasz Duszynski }
607e95faac1STomasz Duszynski
608e95faac1STomasz Duszynski /**
609e95faac1STomasz Duszynski * Close device (PMD ops callback).
610e95faac1STomasz Duszynski *
611e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
612e95faac1STomasz Duszynski * @returns 0. Always.
613e95faac1STomasz Duszynski */
614e95faac1STomasz Duszynski static int
mrvl_crypto_pmd_close(struct rte_cryptodev * dev)615e95faac1STomasz Duszynski mrvl_crypto_pmd_close(struct rte_cryptodev *dev)
616e95faac1STomasz Duszynski {
617e95faac1STomasz Duszynski int qp_id;
618e95faac1STomasz Duszynski
619e95faac1STomasz Duszynski for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++)
620e95faac1STomasz Duszynski mrvl_crypto_pmd_qp_release(dev, qp_id);
621e95faac1STomasz Duszynski
622e95faac1STomasz Duszynski return 0;
623e95faac1STomasz Duszynski }
624e95faac1STomasz Duszynski
625e95faac1STomasz Duszynski /**
626e95faac1STomasz Duszynski * Setup a queue pair (PMD ops callback).
627e95faac1STomasz Duszynski *
628e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
629e95faac1STomasz Duszynski * @param qp_id ID of the Queue Pair.
630e95faac1STomasz Duszynski * @param qp_conf Queue pair configuration (nb of descriptors).
631e95faac1STomasz Duszynski * @param socket_id NUMA socket to allocate memory on.
632e95faac1STomasz Duszynski * @returns 0 upon success, negative value otherwise.
633e95faac1STomasz Duszynski */
634e95faac1STomasz Duszynski static int
mrvl_crypto_pmd_qp_setup(struct rte_cryptodev * dev,uint16_t qp_id,const struct rte_cryptodev_qp_conf * qp_conf,int socket_id)635e95faac1STomasz Duszynski mrvl_crypto_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
636e95faac1STomasz Duszynski const struct rte_cryptodev_qp_conf *qp_conf,
637725d2a7fSFan Zhang int socket_id)
638e95faac1STomasz Duszynski {
639e95faac1STomasz Duszynski struct mrvl_crypto_qp *qp = NULL;
640e95faac1STomasz Duszynski char match[RTE_CRYPTODEV_NAME_MAX_LEN];
641e95faac1STomasz Duszynski unsigned int n;
642e95faac1STomasz Duszynski
643e95faac1STomasz Duszynski /* Allocate the queue pair data structure. */
644e95faac1STomasz Duszynski qp = rte_zmalloc_socket("MRVL Crypto PMD Queue Pair", sizeof(*qp),
645e95faac1STomasz Duszynski RTE_CACHE_LINE_SIZE, socket_id);
646e95faac1STomasz Duszynski if (qp == NULL)
647e95faac1STomasz Duszynski return -ENOMEM;
648e95faac1STomasz Duszynski
649e95faac1STomasz Duszynski /* Free old qp prior setup if needed. */
650e95faac1STomasz Duszynski if (dev->data->queue_pairs[qp_id] != NULL)
651e95faac1STomasz Duszynski mrvl_crypto_pmd_qp_release(dev, qp_id);
652e95faac1STomasz Duszynski
653e95faac1STomasz Duszynski do { /* Error handling block */
654e95faac1STomasz Duszynski
655e95faac1STomasz Duszynski /*
656e95faac1STomasz Duszynski * This extra check is necessary due to a bug in
657e95faac1STomasz Duszynski * crypto library.
658e95faac1STomasz Duszynski */
659e95faac1STomasz Duszynski int num = sam_get_num_inst();
660e95faac1STomasz Duszynski if (num == 0) {
661a05a450fSTomasz Duszynski MRVL_LOG(ERR, "No crypto engines detected!");
662e95faac1STomasz Duszynski return -1;
663e95faac1STomasz Duszynski }
664e95faac1STomasz Duszynski
665e95faac1STomasz Duszynski /*
666c9e9ca7dSMichael Shamis * In case just one engine is enabled mapping will look as
667c9e9ca7dSMichael Shamis * follows:
668c9e9ca7dSMichael Shamis * qp: 0 1 2 3
669c9e9ca7dSMichael Shamis * cio-x:y: cio-0:0, cio-0:1, cio-0:2, cio-0:3
670c9e9ca7dSMichael Shamis *
671e95faac1STomasz Duszynski * In case two crypto engines are enabled qps will
672e95faac1STomasz Duszynski * be evenly spread among them. Even and odd qps will
673e95faac1STomasz Duszynski * be handled by cio-0 and cio-1 respectively. qp-cio mapping
674e95faac1STomasz Duszynski * will look as follows:
675e95faac1STomasz Duszynski *
676e95faac1STomasz Duszynski * qp: 0 1 2 3
677e95faac1STomasz Duszynski * cio-x:y: cio-0:0, cio-1:0, cio-0:1, cio-1:1
678e95faac1STomasz Duszynski *
679e95faac1STomasz Duszynski * qp: 4 5 6 7
680e95faac1STomasz Duszynski * cio-x:y: cio-0:2, cio-1:2, cio-0:3, cio-1:3
681e95faac1STomasz Duszynski *
682c9e9ca7dSMichael Shamis * In case of three crypto engines are enabled qps will
683c9e9ca7dSMichael Shamis * be mapped as following:
684c9e9ca7dSMichael Shamis *
685e95faac1STomasz Duszynski * qp: 0 1 2 3
686c9e9ca7dSMichael Shamis * cio-x:y: cio-0:0, cio-1:0, cio-2:0, cio-0:1
687c9e9ca7dSMichael Shamis *
688c9e9ca7dSMichael Shamis * qp: 4 5 6 7
689c9e9ca7dSMichael Shamis * cio-x:y: cio-1:1, cio-2:1, cio-0:2, cio-1:2
690c9e9ca7dSMichael Shamis *
691c9e9ca7dSMichael Shamis * qp: 8 9 10 11
692c9e9ca7dSMichael Shamis * cio-x:y: cio-2:2, cio-0:3, cio-1:3, cio-2:3
693e95faac1STomasz Duszynski */
694e95faac1STomasz Duszynski n = snprintf(match, sizeof(match), "cio-%u:%u",
695e95faac1STomasz Duszynski qp_id % num, qp_id / num);
696e95faac1STomasz Duszynski
697e95faac1STomasz Duszynski if (n >= sizeof(match))
698e95faac1STomasz Duszynski break;
699e95faac1STomasz Duszynski
700e95faac1STomasz Duszynski qp->cio_params.match = match;
701e95faac1STomasz Duszynski qp->cio_params.size = qp_conf->nb_descriptors;
702e95faac1STomasz Duszynski
703e95faac1STomasz Duszynski if (sam_cio_init(&qp->cio_params, &qp->cio) < 0)
704e95faac1STomasz Duszynski break;
705e95faac1STomasz Duszynski
706725d2a7fSFan Zhang qp->sess_mp = qp_conf->mp_session;
707e95faac1STomasz Duszynski
708e95faac1STomasz Duszynski memset(&qp->stats, 0, sizeof(qp->stats));
709e95faac1STomasz Duszynski dev->data->queue_pairs[qp_id] = qp;
710e95faac1STomasz Duszynski return 0;
711e95faac1STomasz Duszynski } while (0);
712e95faac1STomasz Duszynski
713e95faac1STomasz Duszynski rte_free(qp);
714e95faac1STomasz Duszynski return -1;
715e95faac1STomasz Duszynski }
716e95faac1STomasz Duszynski
717e95faac1STomasz Duszynski /** Returns the size of the session structure (PMD ops callback).
718e95faac1STomasz Duszynski *
719e95faac1STomasz Duszynski * @param dev Pointer to the device structure [Unused].
720e95faac1STomasz Duszynski * @returns Size of Marvell crypto session.
721e95faac1STomasz Duszynski */
722e95faac1STomasz Duszynski static unsigned
mrvl_crypto_pmd_sym_session_get_size(__rte_unused struct rte_cryptodev * dev)723012c5076SPablo de Lara mrvl_crypto_pmd_sym_session_get_size(__rte_unused struct rte_cryptodev *dev)
724e95faac1STomasz Duszynski {
725e95faac1STomasz Duszynski return sizeof(struct mrvl_crypto_session);
726e95faac1STomasz Duszynski }
727e95faac1STomasz Duszynski
728e95faac1STomasz Duszynski /** Configure the session from a crypto xform chain (PMD ops callback).
729e95faac1STomasz Duszynski *
730e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
73190ea7e6dSThierry Herbelot * @param xform Pointer to the crypto configuration structure.
732e95faac1STomasz Duszynski * @param sess Pointer to the empty session structure.
733e95faac1STomasz Duszynski * @returns 0 upon success, negative value otherwise.
734e95faac1STomasz Duszynski */
735e95faac1STomasz Duszynski static int
mrvl_crypto_pmd_sym_session_configure(__rte_unused struct rte_cryptodev * dev,struct rte_crypto_sym_xform * xform,struct rte_cryptodev_sym_session * sess)736012c5076SPablo de Lara mrvl_crypto_pmd_sym_session_configure(__rte_unused struct rte_cryptodev *dev,
737e95faac1STomasz Duszynski struct rte_crypto_sym_xform *xform,
738bdce2564SAkhil Goyal struct rte_cryptodev_sym_session *sess)
739e95faac1STomasz Duszynski {
740e95faac1STomasz Duszynski struct mrvl_crypto_session *mrvl_sess;
741e95faac1STomasz Duszynski void *sess_private_data;
742e95faac1STomasz Duszynski int ret;
743e95faac1STomasz Duszynski
744e95faac1STomasz Duszynski if (sess == NULL) {
745a05a450fSTomasz Duszynski MRVL_LOG(ERR, "Invalid session struct!");
746e95faac1STomasz Duszynski return -EINVAL;
747e95faac1STomasz Duszynski }
748e95faac1STomasz Duszynski
749bdce2564SAkhil Goyal sess_private_data = sess->driver_priv_data;
750186b14d6SFan Zhang memset(sess_private_data, 0, sizeof(struct mrvl_crypto_session));
751186b14d6SFan Zhang
752e95faac1STomasz Duszynski ret = mrvl_crypto_set_session_parameters(sess_private_data, xform);
753e95faac1STomasz Duszynski if (ret != 0) {
754a05a450fSTomasz Duszynski MRVL_LOG(ERR, "Failed to configure session parameters!");
755e95faac1STomasz Duszynski return ret;
756e95faac1STomasz Duszynski }
757e95faac1STomasz Duszynski
758e95faac1STomasz Duszynski
759e95faac1STomasz Duszynski mrvl_sess = (struct mrvl_crypto_session *)sess_private_data;
760e95faac1STomasz Duszynski if (sam_session_create(&mrvl_sess->sam_sess_params,
761e95faac1STomasz Duszynski &mrvl_sess->sam_sess) < 0) {
762a05a450fSTomasz Duszynski MRVL_LOG(DEBUG, "Failed to create session!");
763e95faac1STomasz Duszynski return -EIO;
764e95faac1STomasz Duszynski }
765e95faac1STomasz Duszynski
766186b14d6SFan Zhang /* free the keys memory allocated for session creation */
767186b14d6SFan Zhang free(mrvl_sess->sam_sess_params.cipher_key);
768186b14d6SFan Zhang free(mrvl_sess->sam_sess_params.auth_key);
769186b14d6SFan Zhang
770e95faac1STomasz Duszynski return 0;
771e95faac1STomasz Duszynski }
772e95faac1STomasz Duszynski
773e95faac1STomasz Duszynski /**
774e95faac1STomasz Duszynski * Clear the memory of session so it doesn't leave key material behind.
775e95faac1STomasz Duszynski *
776e95faac1STomasz Duszynski * @param dev Pointer to the device structure.
777e95faac1STomasz Duszynski * @returns 0. Always.
778e95faac1STomasz Duszynski */
779e95faac1STomasz Duszynski static void
mrvl_crypto_pmd_sym_session_clear(struct rte_cryptodev * dev __rte_unused,struct rte_cryptodev_sym_session * sess)780*7244858bSAkhil Goyal mrvl_crypto_pmd_sym_session_clear(struct rte_cryptodev *dev __rte_unused,
781e95faac1STomasz Duszynski struct rte_cryptodev_sym_session *sess)
782e95faac1STomasz Duszynski {
783e95faac1STomasz Duszynski
784*7244858bSAkhil Goyal void *sess_priv = sess->driver_priv_data;
785e95faac1STomasz Duszynski
786e95faac1STomasz Duszynski /* Zero out the whole structure */
787e95faac1STomasz Duszynski if (sess_priv) {
788e95faac1STomasz Duszynski struct mrvl_crypto_session *mrvl_sess =
789e95faac1STomasz Duszynski (struct mrvl_crypto_session *)sess_priv;
790e95faac1STomasz Duszynski
791e95faac1STomasz Duszynski if (mrvl_sess->sam_sess &&
792e95faac1STomasz Duszynski sam_session_destroy(mrvl_sess->sam_sess) < 0) {
793a05a450fSTomasz Duszynski MRVL_LOG(ERR, "Error while destroying session!");
794e95faac1STomasz Duszynski }
795e95faac1STomasz Duszynski }
796e95faac1STomasz Duszynski }
797e95faac1STomasz Duszynski
798e95faac1STomasz Duszynski /**
799e95faac1STomasz Duszynski * PMD handlers for crypto ops.
800e95faac1STomasz Duszynski */
801e95faac1STomasz Duszynski static struct rte_cryptodev_ops mrvl_crypto_pmd_ops = {
802e95faac1STomasz Duszynski .dev_configure = mrvl_crypto_pmd_config,
803e95faac1STomasz Duszynski .dev_start = mrvl_crypto_pmd_start,
804e95faac1STomasz Duszynski .dev_stop = mrvl_crypto_pmd_stop,
805e95faac1STomasz Duszynski .dev_close = mrvl_crypto_pmd_close,
806e95faac1STomasz Duszynski
807e95faac1STomasz Duszynski .dev_infos_get = mrvl_crypto_pmd_info_get,
808e95faac1STomasz Duszynski
809e95faac1STomasz Duszynski .stats_get = mrvl_crypto_pmd_stats_get,
810e95faac1STomasz Duszynski .stats_reset = mrvl_crypto_pmd_stats_reset,
811e95faac1STomasz Duszynski
812e95faac1STomasz Duszynski .queue_pair_setup = mrvl_crypto_pmd_qp_setup,
813e95faac1STomasz Duszynski .queue_pair_release = mrvl_crypto_pmd_qp_release,
814e95faac1STomasz Duszynski
815012c5076SPablo de Lara .sym_session_get_size = mrvl_crypto_pmd_sym_session_get_size,
816012c5076SPablo de Lara .sym_session_configure = mrvl_crypto_pmd_sym_session_configure,
817012c5076SPablo de Lara .sym_session_clear = mrvl_crypto_pmd_sym_session_clear
818e95faac1STomasz Duszynski };
819e95faac1STomasz Duszynski
820e95faac1STomasz Duszynski struct rte_cryptodev_ops *rte_mrvl_crypto_pmd_ops = &mrvl_crypto_pmd_ops;
821e0f89d5eSMichael Shamis
822e0f89d5eSMichael Shamis /* IPSEC full offloading */
823e0f89d5eSMichael Shamis
824e0f89d5eSMichael Shamis /** Configure the session from a crypto xform chain (PMD ops callback).
825e0f89d5eSMichael Shamis *
826e0f89d5eSMichael Shamis * @param dev Pointer to the device structure.
827e0f89d5eSMichael Shamis * @param conf Pointer to the security session configuration structure.
828e0f89d5eSMichael Shamis * @param sess Pointer to the empty session structure.
829e0f89d5eSMichael Shamis * @param mempool Pointer to memory pool.
830e0f89d5eSMichael Shamis * @returns 0 upon success, negative value otherwise.
831e0f89d5eSMichael Shamis */
832e0f89d5eSMichael Shamis static int
mrvl_crypto_pmd_security_session_create(__rte_unused void * dev,struct rte_security_session_conf * conf,struct rte_security_session * sess)833e0f89d5eSMichael Shamis mrvl_crypto_pmd_security_session_create(__rte_unused void *dev,
834e0f89d5eSMichael Shamis struct rte_security_session_conf *conf,
8353f3fc330SAkhil Goyal struct rte_security_session *sess)
836e0f89d5eSMichael Shamis {
837e0f89d5eSMichael Shamis struct mrvl_crypto_session *mrvl_sess;
8383f3fc330SAkhil Goyal void *sess_private_data = SECURITY_GET_SESS_PRIV(sess);
839e0f89d5eSMichael Shamis int ret;
840e0f89d5eSMichael Shamis
841e0f89d5eSMichael Shamis if (sess == NULL) {
842e0f89d5eSMichael Shamis MRVL_LOG(ERR, "Invalid session struct.");
843e0f89d5eSMichael Shamis return -EINVAL;
844e0f89d5eSMichael Shamis }
845e0f89d5eSMichael Shamis
846e0f89d5eSMichael Shamis switch (conf->protocol) {
847e0f89d5eSMichael Shamis case RTE_SECURITY_PROTOCOL_IPSEC:
848e0f89d5eSMichael Shamis mrvl_sess = (struct mrvl_crypto_session *)sess_private_data;
849e0f89d5eSMichael Shamis
850e0f89d5eSMichael Shamis struct rte_security_ipsec_xform *ipsec_xform = &conf->ipsec;
851e0f89d5eSMichael Shamis struct rte_crypto_sym_xform *crypto_xform = conf->crypto_xform;
852e0f89d5eSMichael Shamis
853e0f89d5eSMichael Shamis ret = mrvl_ipsec_set_session_parameters(mrvl_sess,
854e0f89d5eSMichael Shamis ipsec_xform,
855e0f89d5eSMichael Shamis crypto_xform);
856e0f89d5eSMichael Shamis if (ret != 0) {
857e0f89d5eSMichael Shamis MRVL_LOG(ERR, "Failed to configure session parameters.");
858e0f89d5eSMichael Shamis
859e0f89d5eSMichael Shamis return ret;
860e0f89d5eSMichael Shamis }
861e0f89d5eSMichael Shamis
862e0f89d5eSMichael Shamis if (mrvl_sess->sam_sess_params.cipher_mode == SAM_CIPHER_GCM) {
863e0f89d5eSMichael Shamis /* Nonce is must for all counter modes */
864e0f89d5eSMichael Shamis mrvl_sess->sam_sess_params.cipher_iv =
865e0f89d5eSMichael Shamis (uint8_t *)&(conf->ipsec.salt);
866e0f89d5eSMichael Shamis }
867e0f89d5eSMichael Shamis
868e0f89d5eSMichael Shamis ret = sam_session_create(&mrvl_sess->sam_sess_params,
869e0f89d5eSMichael Shamis &mrvl_sess->sam_sess);
870e0f89d5eSMichael Shamis if (ret < 0) {
871e0f89d5eSMichael Shamis MRVL_LOG(ERR, "PMD: failed to create IPSEC session.");
872e0f89d5eSMichael Shamis return ret;
873e0f89d5eSMichael Shamis }
874e0f89d5eSMichael Shamis break;
875e0f89d5eSMichael Shamis case RTE_SECURITY_PROTOCOL_MACSEC:
876e0f89d5eSMichael Shamis return -ENOTSUP;
877e0f89d5eSMichael Shamis default:
878e0f89d5eSMichael Shamis return -EINVAL;
879e0f89d5eSMichael Shamis }
880e0f89d5eSMichael Shamis
881e0f89d5eSMichael Shamis return ret;
882e0f89d5eSMichael Shamis }
883e0f89d5eSMichael Shamis
884e0f89d5eSMichael Shamis /** Clear the memory of session so it doesn't leave key material behind */
885e0f89d5eSMichael Shamis static int
mrvl_crypto_pmd_security_session_destroy(void * dev __rte_unused,struct rte_security_session * sess)886e0f89d5eSMichael Shamis mrvl_crypto_pmd_security_session_destroy(void *dev __rte_unused,
887e0f89d5eSMichael Shamis struct rte_security_session *sess)
888e0f89d5eSMichael Shamis {
8893f3fc330SAkhil Goyal void *sess_priv = SECURITY_GET_SESS_PRIV(sess);
890e0f89d5eSMichael Shamis
891e0f89d5eSMichael Shamis /* Zero out the whole structure */
892e0f89d5eSMichael Shamis if (sess_priv) {
893e0f89d5eSMichael Shamis struct mrvl_crypto_session *mrvl_sess =
894e0f89d5eSMichael Shamis (struct mrvl_crypto_session *)sess_priv;
895e0f89d5eSMichael Shamis
896e0f89d5eSMichael Shamis if (mrvl_sess->sam_sess &&
897e0f89d5eSMichael Shamis sam_session_destroy(mrvl_sess->sam_sess) < 0) {
898e0f89d5eSMichael Shamis MRVL_LOG(ERR, "Error while destroying session!");
899e0f89d5eSMichael Shamis }
900e0f89d5eSMichael Shamis
901e0f89d5eSMichael Shamis rte_free(mrvl_sess->sam_sess_params.cipher_key);
902e0f89d5eSMichael Shamis rte_free(mrvl_sess->sam_sess_params.auth_key);
903e0f89d5eSMichael Shamis rte_free(mrvl_sess->sam_sess_params.cipher_iv);
904e0f89d5eSMichael Shamis memset(sess, 0, sizeof(struct rte_security_session));
905e0f89d5eSMichael Shamis }
906e0f89d5eSMichael Shamis return 0;
907e0f89d5eSMichael Shamis }
908e0f89d5eSMichael Shamis
90966837861SAkhil Goyal static unsigned int
mrvl_crypto_pmd_security_session_get_size(void * device __rte_unused)910*7244858bSAkhil Goyal mrvl_crypto_pmd_security_session_get_size(void *device __rte_unused)
91166837861SAkhil Goyal {
91266837861SAkhil Goyal return sizeof(struct mrvl_crypto_session);
91366837861SAkhil Goyal }
91466837861SAkhil Goyal
915e0f89d5eSMichael Shamis static const
916e0f89d5eSMichael Shamis struct rte_security_capability mrvl_crypto_pmd_sec_security_cap[] = {
917e0f89d5eSMichael Shamis { /* IPsec Lookaside Protocol offload ESP Tunnel Egress */
918e0f89d5eSMichael Shamis .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
919e0f89d5eSMichael Shamis .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
920e0f89d5eSMichael Shamis .ipsec = {
921e0f89d5eSMichael Shamis .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
922e0f89d5eSMichael Shamis .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
923e0f89d5eSMichael Shamis .direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS,
924e0f89d5eSMichael Shamis .options = { 0 },
925e0f89d5eSMichael Shamis .replay_win_sz_max = 128
926e0f89d5eSMichael Shamis },
927e0f89d5eSMichael Shamis .crypto_capabilities = mrvl_crypto_pmd_capabilities
928e0f89d5eSMichael Shamis },
929e0f89d5eSMichael Shamis { /* IPsec Lookaside Protocol offload ESP Tunnel Ingress */
930e0f89d5eSMichael Shamis .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
931e0f89d5eSMichael Shamis .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
932e0f89d5eSMichael Shamis .ipsec = {
933e0f89d5eSMichael Shamis .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
934e0f89d5eSMichael Shamis .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
935e0f89d5eSMichael Shamis .direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS,
936e0f89d5eSMichael Shamis .options = { 0 },
937e0f89d5eSMichael Shamis .replay_win_sz_max = 128
938e0f89d5eSMichael Shamis },
939e0f89d5eSMichael Shamis .crypto_capabilities = mrvl_crypto_pmd_capabilities
940e0f89d5eSMichael Shamis },
941e0f89d5eSMichael Shamis { /* IPsec Lookaside Protocol offload ESP Transport Egress */
942e0f89d5eSMichael Shamis .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
943e0f89d5eSMichael Shamis .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
944e0f89d5eSMichael Shamis .ipsec = {
945e0f89d5eSMichael Shamis .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
946e0f89d5eSMichael Shamis .mode = RTE_SECURITY_IPSEC_SA_MODE_TRANSPORT,
947e0f89d5eSMichael Shamis .direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS,
948e0f89d5eSMichael Shamis .options = { 0 },
949e0f89d5eSMichael Shamis .replay_win_sz_max = 128
950e0f89d5eSMichael Shamis },
951e0f89d5eSMichael Shamis .crypto_capabilities = mrvl_crypto_pmd_capabilities
952e0f89d5eSMichael Shamis },
953e0f89d5eSMichael Shamis { /* IPsec Lookaside Protocol offload ESP Transport Ingress */
954e0f89d5eSMichael Shamis .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
955e0f89d5eSMichael Shamis .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
956e0f89d5eSMichael Shamis .ipsec = {
957e0f89d5eSMichael Shamis .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
958e0f89d5eSMichael Shamis .mode = RTE_SECURITY_IPSEC_SA_MODE_TRANSPORT,
959e0f89d5eSMichael Shamis .direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS,
960e0f89d5eSMichael Shamis .options = { 0 },
961e0f89d5eSMichael Shamis .replay_win_sz_max = 128
962e0f89d5eSMichael Shamis },
963e0f89d5eSMichael Shamis .crypto_capabilities = mrvl_crypto_pmd_capabilities
964e0f89d5eSMichael Shamis },
965e0f89d5eSMichael Shamis {
966e0f89d5eSMichael Shamis .action = RTE_SECURITY_ACTION_TYPE_NONE
967e0f89d5eSMichael Shamis }
968e0f89d5eSMichael Shamis };
969e0f89d5eSMichael Shamis
970e0f89d5eSMichael Shamis static const struct rte_security_capability *
mrvl_crypto_pmd_security_capabilities_get(void * device __rte_unused)971e0f89d5eSMichael Shamis mrvl_crypto_pmd_security_capabilities_get(void *device __rte_unused)
972e0f89d5eSMichael Shamis {
973e0f89d5eSMichael Shamis return mrvl_crypto_pmd_sec_security_cap;
974e0f89d5eSMichael Shamis }
975e0f89d5eSMichael Shamis
976e0f89d5eSMichael Shamis struct rte_security_ops mrvl_sec_security_pmd_ops = {
977e0f89d5eSMichael Shamis .session_create = mrvl_crypto_pmd_security_session_create,
978e0f89d5eSMichael Shamis .session_update = NULL,
97966837861SAkhil Goyal .session_get_size = mrvl_crypto_pmd_security_session_get_size,
980e0f89d5eSMichael Shamis .session_stats_get = NULL,
981e0f89d5eSMichael Shamis .session_destroy = mrvl_crypto_pmd_security_session_destroy,
982e0f89d5eSMichael Shamis .set_pkt_metadata = NULL,
983e0f89d5eSMichael Shamis .capabilities_get = mrvl_crypto_pmd_security_capabilities_get
984e0f89d5eSMichael Shamis };
985e0f89d5eSMichael Shamis
986e0f89d5eSMichael Shamis struct rte_security_ops *rte_mrvl_security_pmd_ops = &mrvl_sec_security_pmd_ops;
987