crypto/ccp: support CPU based MD5 and SHA2 family
[dpdk.git] / drivers / crypto / ccp / ccp_pmd_ops.c
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
3  */
4
5 #include <string.h>
6
7 #include <rte_common.h>
8 #include <rte_cryptodev_pmd.h>
9 #include <rte_malloc.h>
10
11 #include "ccp_pmd_private.h"
12 #include "ccp_dev.h"
13 #include "ccp_crypto.h"
14
15 static const struct rte_cryptodev_capabilities ccp_pmd_capabilities[] = {
16 #ifdef RTE_LIBRTE_PMD_CCP_CPU_AUTH
17         {       /* MD5 HMAC */
18                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
19                 {.sym = {
20                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
21                         {.auth = {
22                                  .algo = RTE_CRYPTO_AUTH_MD5_HMAC,
23                                  .block_size = 64,
24                                  .key_size = {
25                                          .min = 1,
26                                          .max = 64,
27                                          .increment = 1
28                                  },
29                                  .digest_size = {
30                                          .min = 16,
31                                          .max = 16,
32                                          .increment = 0
33                                  },
34                                  .aad_size = { 0 }
35                         }, }
36                 }, }
37         },
38 #endif
39         {       /* SHA1 */
40                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
41                 {.sym = {
42                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
43                         {.auth = {
44                                  .algo = RTE_CRYPTO_AUTH_SHA1,
45                                  .block_size = 64,
46                                  .key_size = {
47                                          .min = 0,
48                                          .max = 0,
49                                          .increment = 0
50                                  },
51                                  .digest_size = {
52                                          .min = 20,
53                                          .max = 20,
54                                          .increment = 0
55                                  },
56                                  .aad_size = { 0 }
57                          }, }
58                 }, }
59         },
60         {       /* SHA1 HMAC */
61                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
62                 {.sym = {
63                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
64                         {.auth = {
65                                  .algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
66                                  .block_size = 64,
67                                  .key_size = {
68                                          .min = 1,
69                                          .max = 64,
70                                          .increment = 1
71                                  },
72                                  .digest_size = {
73                                          .min = 20,
74                                          .max = 20,
75                                          .increment = 0
76                                  },
77                                  .aad_size = { 0 }
78                          }, }
79                 }, }
80         },
81         {       /* SHA224 */
82                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
83                 {.sym = {
84                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
85                         {.auth = {
86                                  .algo = RTE_CRYPTO_AUTH_SHA224,
87                                  .block_size = 64,
88                                  .key_size = {
89                                          .min = 0,
90                                          .max = 0,
91                                          .increment = 0
92                                  },
93                                  .digest_size = {
94                                          .min = 28,
95                                          .max = 28,
96                                          .increment = 0
97                                  },
98                                  .aad_size = { 0 }
99                          }, }
100                 }, }
101         },
102         {       /* SHA224 HMAC */
103                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
104                 {.sym = {
105                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
106                         {.auth = {
107                                  .algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
108                                  .block_size = 64,
109                                  .key_size = {
110                                          .min = 1,
111                                          .max = 64,
112                                          .increment = 1
113                                  },
114                                  .digest_size = {
115                                          .min = 28,
116                                          .max = 28,
117                                          .increment = 0
118                                  },
119                                  .aad_size = { 0 }
120                          }, }
121                 }, }
122         },
123         {       /* SHA3-224 */
124                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
125                 {.sym = {
126                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
127                         {.auth = {
128                                  .algo = RTE_CRYPTO_AUTH_SHA3_224,
129                                  .block_size = 144,
130                                  .key_size = {
131                                          .min = 0,
132                                          .max = 0,
133                                          .increment = 0
134                                  },
135                                  .digest_size = {
136                                          .min = 28,
137                                          .max = 28,
138                                          .increment = 0
139                                  },
140                                  .aad_size = { 0 }
141                          }, }
142                 }, }
143         },
144         {       /* SHA3-224  HMAC*/
145                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
146                 {.sym = {
147                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
148                         {.auth = {
149                                  .algo = RTE_CRYPTO_AUTH_SHA3_224_HMAC,
150                                  .block_size = 144,
151                                  .key_size = {
152                                          .min = 1,
153                                          .max = 144,
154                                          .increment = 1
155                                  },
156                                  .digest_size = {
157                                          .min = 28,
158                                          .max = 28,
159                                          .increment = 0
160                                  },
161                                  .aad_size = { 0 }
162                          }, }
163                 }, }
164         },
165         {       /* SHA256 */
166                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
167                 {.sym = {
168                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
169                         {.auth = {
170                                  .algo = RTE_CRYPTO_AUTH_SHA256,
171                                  .block_size = 64,
172                                  .key_size = {
173                                          .min = 0,
174                                          .max = 0,
175                                          .increment = 0
176                                  },
177                                  .digest_size = {
178                                          .min = 32,
179                                          .max = 32,
180                                          .increment = 0
181                                  },
182                                  .aad_size = { 0 }
183                          }, }
184                 }, }
185         },
186         {       /* SHA256 HMAC */
187                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
188                 {.sym = {
189                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
190                         {.auth = {
191                                  .algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
192                                  .block_size = 64,
193                                  .key_size = {
194                                          .min = 1,
195                                          .max = 64,
196                                          .increment = 1
197                                  },
198                                  .digest_size = {
199                                          .min = 32,
200                                          .max = 32,
201                                          .increment = 0
202                                  },
203                                  .aad_size = { 0 }
204                          }, }
205                 }, }
206         },
207         {       /* SHA3-256 */
208                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
209                 {.sym = {
210                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
211                         {.auth = {
212                                  .algo = RTE_CRYPTO_AUTH_SHA3_256,
213                                  .block_size = 136,
214                                  .key_size = {
215                                          .min = 0,
216                                          .max = 0,
217                                          .increment = 0
218                                  },
219                                  .digest_size = {
220                                          .min = 32,
221                                          .max = 32,
222                                          .increment = 0
223                                  },
224                                  .aad_size = { 0 }
225                          }, }
226                 }, }
227         },
228         {       /* SHA3-256-HMAC */
229                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
230                 {.sym = {
231                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
232                         {.auth = {
233                                  .algo = RTE_CRYPTO_AUTH_SHA3_256_HMAC,
234                                  .block_size = 136,
235                                  .key_size = {
236                                          .min = 1,
237                                          .max = 136,
238                                          .increment = 1
239                                  },
240                                  .digest_size = {
241                                          .min = 32,
242                                          .max = 32,
243                                          .increment = 0
244                                  },
245                                  .aad_size = { 0 }
246                          }, }
247                 }, }
248         },
249         {       /* SHA384 */
250                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
251                 {.sym = {
252                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
253                         {.auth = {
254                                  .algo = RTE_CRYPTO_AUTH_SHA384,
255                                  .block_size = 128,
256                                  .key_size = {
257                                          .min = 0,
258                                          .max = 0,
259                                          .increment = 0
260                                  },
261                                  .digest_size = {
262                                          .min = 48,
263                                          .max = 48,
264                                          .increment = 0
265                                  },
266                                  .aad_size = { 0 }
267                          }, }
268                 }, }
269         },
270         {       /* SHA384 HMAC */
271                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
272                 {.sym = {
273                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
274                         {.auth = {
275                                  .algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
276                                  .block_size = 128,
277                                  .key_size = {
278                                          .min = 1,
279                                          .max = 128,
280                                          .increment = 1
281                                  },
282                                  .digest_size = {
283                                          .min = 48,
284                                          .max = 48,
285                                          .increment = 0
286                                  },
287                                  .aad_size = { 0 }
288                          }, }
289                 }, }
290         },
291         {       /* SHA3-384 */
292                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
293                 {.sym = {
294                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
295                         {.auth = {
296                                  .algo = RTE_CRYPTO_AUTH_SHA3_384,
297                                  .block_size = 104,
298                                  .key_size = {
299                                          .min = 0,
300                                          .max = 0,
301                                          .increment = 0
302                                  },
303                                  .digest_size = {
304                                          .min = 48,
305                                          .max = 48,
306                                          .increment = 0
307                                  },
308                                  .aad_size = { 0 }
309                          }, }
310                 }, }
311         },
312         {       /* SHA3-384-HMAC */
313                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
314                 {.sym = {
315                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
316                         {.auth = {
317                                  .algo = RTE_CRYPTO_AUTH_SHA3_384_HMAC,
318                                  .block_size = 104,
319                                  .key_size = {
320                                          .min = 1,
321                                          .max = 104,
322                                          .increment = 1
323                                  },
324                                  .digest_size = {
325                                          .min = 48,
326                                          .max = 48,
327                                          .increment = 0
328                                  },
329                                  .aad_size = { 0 }
330                          }, }
331                 }, }
332         },
333         {       /* SHA512  */
334                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
335                 {.sym = {
336                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
337                         {.auth = {
338                                  .algo = RTE_CRYPTO_AUTH_SHA512,
339                                  .block_size = 128,
340                                  .key_size = {
341                                          .min = 0,
342                                          .max = 0,
343                                          .increment = 0
344                                  },
345                                  .digest_size = {
346                                          .min = 64,
347                                          .max = 64,
348                                          .increment = 0
349                                  },
350                                  .aad_size = { 0 }
351                          }, }
352                 }, }
353         },
354         {       /* SHA512 HMAC */
355                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
356                 {.sym = {
357                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
358                         {.auth = {
359                                  .algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
360                                  .block_size = 128,
361                                  .key_size = {
362                                          .min = 1,
363                                          .max = 128,
364                                          .increment = 1
365                                  },
366                                  .digest_size = {
367                                          .min = 64,
368                                          .max = 64,
369                                          .increment = 0
370                                  },
371                                  .aad_size = { 0 }
372                          }, }
373                 }, }
374         },
375         {       /* SHA3-512  */
376                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
377                 {.sym = {
378                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
379                         {.auth = {
380                                  .algo = RTE_CRYPTO_AUTH_SHA3_512,
381                                  .block_size = 72,
382                                  .key_size = {
383                                          .min = 0,
384                                          .max = 0,
385                                          .increment = 0
386                                  },
387                                  .digest_size = {
388                                          .min = 64,
389                                          .max = 64,
390                                          .increment = 0
391                                  },
392                                  .aad_size = { 0 }
393                          }, }
394                 }, }
395         },
396         {       /* SHA3-512-HMAC  */
397                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
398                 {.sym = {
399                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
400                         {.auth = {
401                                  .algo = RTE_CRYPTO_AUTH_SHA3_512_HMAC,
402                                  .block_size = 72,
403                                  .key_size = {
404                                          .min = 1,
405                                          .max = 72,
406                                          .increment = 1
407                                  },
408                                  .digest_size = {
409                                          .min = 64,
410                                          .max = 64,
411                                          .increment = 0
412                                  },
413                                  .aad_size = { 0 }
414                         }, }
415                 }, }
416         },
417         {       /*AES-CMAC */
418                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
419                 {.sym = {
420                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
421                         {.auth = {
422                                  .algo = RTE_CRYPTO_AUTH_AES_CMAC,
423                                  .block_size = 16,
424                                  .key_size = {
425                                          .min = 16,
426                                          .max = 32,
427                                          .increment = 8
428                                  },
429                                  .digest_size = {
430                                          .min = 16,
431                                          .max = 16,
432                                          .increment = 0
433                                  },
434                         }, }
435                 }, }
436         },
437         {       /* AES ECB */
438                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
439                 {.sym = {
440                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
441                         {.cipher = {
442                                 .algo = RTE_CRYPTO_CIPHER_AES_ECB,
443                                 .block_size = 16,
444                                 .key_size = {
445                                    .min = 16,
446                                    .max = 32,
447                                    .increment = 8
448                                 },
449                                 .iv_size = {
450                                    .min = 0,
451                                    .max = 0,
452                                    .increment = 0
453                                 }
454                         }, }
455                 }, }
456         },
457         {       /* AES CBC */
458                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
459                 {.sym = {
460                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
461                         {.cipher = {
462                                 .algo = RTE_CRYPTO_CIPHER_AES_CBC,
463                                 .block_size = 16,
464                                 .key_size = {
465                                         .min = 16,
466                                         .max = 32,
467                                         .increment = 8
468                                 },
469                                 .iv_size = {
470                                         .min = 16,
471                                         .max = 16,
472                                         .increment = 0
473                                 }
474                         }, }
475                 }, }
476         },
477         {       /* AES CTR */
478                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
479                 {.sym = {
480                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
481                         {.cipher = {
482                                 .algo = RTE_CRYPTO_CIPHER_AES_CTR,
483                                 .block_size = 16,
484                                 .key_size = {
485                                         .min = 16,
486                                         .max = 32,
487                                         .increment = 8
488                                 },
489                                 .iv_size = {
490                                         .min = 16,
491                                         .max = 16,
492                                         .increment = 0
493                                 }
494                         }, }
495                 }, }
496         },
497         {       /* 3DES CBC */
498                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
499                 {.sym = {
500                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
501                         {.cipher = {
502                                 .algo = RTE_CRYPTO_CIPHER_3DES_CBC,
503                                 .block_size = 8,
504                                 .key_size = {
505                                         .min = 16,
506                                         .max = 24,
507                                         .increment = 8
508                                 },
509                                 .iv_size = {
510                                         .min = 8,
511                                         .max = 8,
512                                         .increment = 0
513                                 }
514                         }, }
515                 }, }
516         },
517         {       /* AES GCM */
518                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
519                 {.sym = {
520                         .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
521                         {.aead = {
522                                  .algo = RTE_CRYPTO_AEAD_AES_GCM,
523                                  .block_size = 16,
524                                  .key_size = {
525                                          .min = 16,
526                                          .max = 32,
527                                          .increment = 8
528                                  },
529                                  .digest_size = {
530                                          .min = 16,
531                                          .max = 16,
532                                          .increment = 0
533                                  },
534                                  .aad_size = {
535                                          .min = 0,
536                                          .max = 65535,
537                                          .increment = 1
538                                  },
539                                  .iv_size = {
540                                          .min = 12,
541                                          .max = 16,
542                                          .increment = 4
543                                  },
544                         }, }
545                 }, }
546         },
547         RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
548 };
549
550 static int
551 ccp_pmd_config(struct rte_cryptodev *dev __rte_unused,
552                struct rte_cryptodev_config *config __rte_unused)
553 {
554         return 0;
555 }
556
557 static int
558 ccp_pmd_start(struct rte_cryptodev *dev)
559 {
560         return ccp_dev_start(dev);
561 }
562
563 static void
564 ccp_pmd_stop(struct rte_cryptodev *dev __rte_unused)
565 {
566
567 }
568
569 static int
570 ccp_pmd_close(struct rte_cryptodev *dev __rte_unused)
571 {
572         return 0;
573 }
574
575 static void
576 ccp_pmd_stats_get(struct rte_cryptodev *dev,
577                   struct rte_cryptodev_stats *stats)
578 {
579         int qp_id;
580
581         for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
582                 struct ccp_qp *qp = dev->data->queue_pairs[qp_id];
583
584                 stats->enqueued_count += qp->qp_stats.enqueued_count;
585                 stats->dequeued_count += qp->qp_stats.dequeued_count;
586
587                 stats->enqueue_err_count += qp->qp_stats.enqueue_err_count;
588                 stats->dequeue_err_count += qp->qp_stats.dequeue_err_count;
589         }
590
591 }
592
593 static void
594 ccp_pmd_stats_reset(struct rte_cryptodev *dev)
595 {
596         int qp_id;
597
598         for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
599                 struct ccp_qp *qp = dev->data->queue_pairs[qp_id];
600
601                 memset(&qp->qp_stats, 0, sizeof(qp->qp_stats));
602         }
603 }
604
605 static void
606 ccp_pmd_info_get(struct rte_cryptodev *dev,
607                  struct rte_cryptodev_info *dev_info)
608 {
609         struct ccp_private *internals = dev->data->dev_private;
610
611         if (dev_info != NULL) {
612                 dev_info->driver_id = dev->driver_id;
613                 dev_info->feature_flags = dev->feature_flags;
614                 dev_info->capabilities = ccp_pmd_capabilities;
615                 dev_info->max_nb_queue_pairs = internals->max_nb_qpairs;
616                 dev_info->sym.max_nb_sessions = internals->max_nb_sessions;
617         }
618 }
619
620 static int
621 ccp_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
622 {
623         struct ccp_qp *qp;
624
625         if (dev->data->queue_pairs[qp_id] != NULL) {
626                 qp = (struct ccp_qp *)dev->data->queue_pairs[qp_id];
627                 rte_ring_free(qp->processed_pkts);
628                 rte_mempool_free(qp->batch_mp);
629                 rte_free(qp);
630                 dev->data->queue_pairs[qp_id] = NULL;
631         }
632         return 0;
633 }
634
635 static int
636 ccp_pmd_qp_set_unique_name(struct rte_cryptodev *dev,
637                 struct ccp_qp *qp)
638 {
639         unsigned int n = snprintf(qp->name, sizeof(qp->name),
640                         "ccp_pmd_%u_qp_%u",
641                         dev->data->dev_id, qp->id);
642
643         if (n > sizeof(qp->name))
644                 return -1;
645
646         return 0;
647 }
648
649 static struct rte_ring *
650 ccp_pmd_qp_create_batch_info_ring(struct ccp_qp *qp,
651                                   unsigned int ring_size, int socket_id)
652 {
653         struct rte_ring *r;
654
655         r = rte_ring_lookup(qp->name);
656         if (r) {
657                 if (r->size >= ring_size) {
658                         CCP_LOG_INFO(
659                                 "Reusing ring %s for processed packets",
660                                 qp->name);
661                         return r;
662                 }
663                 CCP_LOG_INFO(
664                         "Unable to reuse ring %s for processed packets",
665                          qp->name);
666                 return NULL;
667         }
668
669         return rte_ring_create(qp->name, ring_size, socket_id,
670                         RING_F_SP_ENQ | RING_F_SC_DEQ);
671 }
672
673 static int
674 ccp_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
675                  const struct rte_cryptodev_qp_conf *qp_conf,
676                  int socket_id, struct rte_mempool *session_pool)
677 {
678         struct ccp_private *internals = dev->data->dev_private;
679         struct ccp_qp *qp;
680         int retval = 0;
681
682         if (qp_id >= internals->max_nb_qpairs) {
683                 CCP_LOG_ERR("Invalid qp_id %u, should be less than %u",
684                             qp_id, internals->max_nb_qpairs);
685                 return (-EINVAL);
686         }
687
688         /* Free memory prior to re-allocation if needed. */
689         if (dev->data->queue_pairs[qp_id] != NULL)
690                 ccp_pmd_qp_release(dev, qp_id);
691
692         /* Allocate the queue pair data structure. */
693         qp = rte_zmalloc_socket("CCP Crypto PMD Queue Pair", sizeof(*qp),
694                                         RTE_CACHE_LINE_SIZE, socket_id);
695         if (qp == NULL) {
696                 CCP_LOG_ERR("Failed to allocate queue pair memory");
697                 return (-ENOMEM);
698         }
699
700         qp->dev = dev;
701         qp->id = qp_id;
702         dev->data->queue_pairs[qp_id] = qp;
703
704         retval = ccp_pmd_qp_set_unique_name(dev, qp);
705         if (retval) {
706                 CCP_LOG_ERR("Failed to create unique name for ccp qp");
707                 goto qp_setup_cleanup;
708         }
709
710         qp->processed_pkts = ccp_pmd_qp_create_batch_info_ring(qp,
711                         qp_conf->nb_descriptors, socket_id);
712         if (qp->processed_pkts == NULL) {
713                 CCP_LOG_ERR("Failed to create batch info ring");
714                 goto qp_setup_cleanup;
715         }
716
717         qp->sess_mp = session_pool;
718
719         /* mempool for batch info */
720         qp->batch_mp = rte_mempool_create(
721                                 qp->name,
722                                 qp_conf->nb_descriptors,
723                                 sizeof(struct ccp_batch_info),
724                                 RTE_CACHE_LINE_SIZE,
725                                 0, NULL, NULL, NULL, NULL,
726                                 SOCKET_ID_ANY, 0);
727         if (qp->batch_mp == NULL)
728                 goto qp_setup_cleanup;
729         memset(&qp->qp_stats, 0, sizeof(qp->qp_stats));
730         return 0;
731
732 qp_setup_cleanup:
733         dev->data->queue_pairs[qp_id] = NULL;
734         if (qp)
735                 rte_free(qp);
736         return -1;
737 }
738
739 static int
740 ccp_pmd_qp_start(struct rte_cryptodev *dev __rte_unused,
741                  uint16_t queue_pair_id __rte_unused)
742 {
743         return -ENOTSUP;
744 }
745
746 static int
747 ccp_pmd_qp_stop(struct rte_cryptodev *dev __rte_unused,
748                 uint16_t queue_pair_id __rte_unused)
749 {
750         return -ENOTSUP;
751 }
752
753 static uint32_t
754 ccp_pmd_qp_count(struct rte_cryptodev *dev)
755 {
756         return dev->data->nb_queue_pairs;
757 }
758
759 static unsigned
760 ccp_pmd_session_get_size(struct rte_cryptodev *dev __rte_unused)
761 {
762         return sizeof(struct ccp_session);
763 }
764
765 static int
766 ccp_pmd_session_configure(struct rte_cryptodev *dev,
767                           struct rte_crypto_sym_xform *xform,
768                           struct rte_cryptodev_sym_session *sess,
769                           struct rte_mempool *mempool)
770 {
771         int ret;
772         void *sess_private_data;
773
774         if (unlikely(sess == NULL || xform == NULL)) {
775                 CCP_LOG_ERR("Invalid session struct or xform");
776                 return -ENOMEM;
777         }
778
779         if (rte_mempool_get(mempool, &sess_private_data)) {
780                 CCP_LOG_ERR("Couldn't get object from session mempool");
781                 return -ENOMEM;
782         }
783         ret = ccp_set_session_parameters(sess_private_data, xform);
784         if (ret != 0) {
785                 CCP_LOG_ERR("failed configure session parameters");
786
787                 /* Return session to mempool */
788                 rte_mempool_put(mempool, sess_private_data);
789                 return ret;
790         }
791         set_session_private_data(sess, dev->driver_id,
792                                  sess_private_data);
793
794         return 0;
795 }
796
797 static void
798 ccp_pmd_session_clear(struct rte_cryptodev *dev,
799                       struct rte_cryptodev_sym_session *sess)
800 {
801         uint8_t index = dev->driver_id;
802         void *sess_priv = get_session_private_data(sess, index);
803
804         if (sess_priv) {
805                 struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
806
807                 rte_mempool_put(sess_mp, sess_priv);
808                 memset(sess_priv, 0, sizeof(struct ccp_session));
809                 set_session_private_data(sess, index, NULL);
810         }
811 }
812
813 struct rte_cryptodev_ops ccp_ops = {
814                 .dev_configure          = ccp_pmd_config,
815                 .dev_start              = ccp_pmd_start,
816                 .dev_stop               = ccp_pmd_stop,
817                 .dev_close              = ccp_pmd_close,
818
819                 .stats_get              = ccp_pmd_stats_get,
820                 .stats_reset            = ccp_pmd_stats_reset,
821
822                 .dev_infos_get          = ccp_pmd_info_get,
823
824                 .queue_pair_setup       = ccp_pmd_qp_setup,
825                 .queue_pair_release     = ccp_pmd_qp_release,
826                 .queue_pair_start       = ccp_pmd_qp_start,
827                 .queue_pair_stop        = ccp_pmd_qp_stop,
828                 .queue_pair_count       = ccp_pmd_qp_count,
829
830                 .session_get_size       = ccp_pmd_session_get_size,
831                 .session_configure      = ccp_pmd_session_configure,
832                 .session_clear          = ccp_pmd_session_clear,
833 };
834
835 struct rte_cryptodev_ops *ccp_pmd_ops = &ccp_ops;