1bd9b67a1SFan Zhang /* SPDX-License-Identifier: BSD-3-Clause
2bd9b67a1SFan Zhang * Copyright(c) 2018 Intel Corporation
3bd9b67a1SFan Zhang */
4bd9b67a1SFan Zhang
5bd9b67a1SFan Zhang #include <stdlib.h>
6bd9b67a1SFan Zhang #include <stdio.h>
7bd9b67a1SFan Zhang
8bd9b67a1SFan Zhang #include <rte_cryptodev.h>
9bd9b67a1SFan Zhang #include <rte_string_fns.h>
10bd9b67a1SFan Zhang
11bd9b67a1SFan Zhang #include "cryptodev.h"
12bd9b67a1SFan Zhang
13261bbff7SFan Zhang #define PIPELINE_CRYPTO_SESSION_CACHE_SIZE 128
14261bbff7SFan Zhang
15bd9b67a1SFan Zhang static struct cryptodev_list cryptodev_list;
16bd9b67a1SFan Zhang
17bd9b67a1SFan Zhang int
cryptodev_init(void)18bd9b67a1SFan Zhang cryptodev_init(void)
19bd9b67a1SFan Zhang {
20bd9b67a1SFan Zhang TAILQ_INIT(&cryptodev_list);
21bd9b67a1SFan Zhang
22bd9b67a1SFan Zhang return 0;
23bd9b67a1SFan Zhang }
24bd9b67a1SFan Zhang
25bd9b67a1SFan Zhang struct cryptodev *
cryptodev_find(const char * name)26bd9b67a1SFan Zhang cryptodev_find(const char *name)
27bd9b67a1SFan Zhang {
28bd9b67a1SFan Zhang struct cryptodev *cryptodev;
29bd9b67a1SFan Zhang
30bd9b67a1SFan Zhang if (name == NULL)
31bd9b67a1SFan Zhang return NULL;
32bd9b67a1SFan Zhang
33bd9b67a1SFan Zhang TAILQ_FOREACH(cryptodev, &cryptodev_list, node)
34bd9b67a1SFan Zhang if (strcmp(cryptodev->name, name) == 0)
35bd9b67a1SFan Zhang return cryptodev;
36bd9b67a1SFan Zhang
37bd9b67a1SFan Zhang return NULL;
38bd9b67a1SFan Zhang }
39bd9b67a1SFan Zhang
40bd9b67a1SFan Zhang struct cryptodev *
cryptodev_next(struct cryptodev * cryptodev)41bd9b67a1SFan Zhang cryptodev_next(struct cryptodev *cryptodev)
42bd9b67a1SFan Zhang {
43bd9b67a1SFan Zhang return (cryptodev == NULL) ?
44bd9b67a1SFan Zhang TAILQ_FIRST(&cryptodev_list) :
45bd9b67a1SFan Zhang TAILQ_NEXT(cryptodev, node);
46bd9b67a1SFan Zhang }
47bd9b67a1SFan Zhang
48bd9b67a1SFan Zhang struct cryptodev *
cryptodev_create(const char * name,struct cryptodev_params * params)49bd9b67a1SFan Zhang cryptodev_create(const char *name, struct cryptodev_params *params)
50bd9b67a1SFan Zhang {
51bd9b67a1SFan Zhang struct rte_cryptodev_info dev_info;
52bd9b67a1SFan Zhang struct rte_cryptodev_config dev_conf;
53bd9b67a1SFan Zhang struct rte_cryptodev_qp_conf queue_conf;
54bd9b67a1SFan Zhang struct cryptodev *cryptodev;
55bd9b67a1SFan Zhang uint32_t dev_id, i;
56bd9b67a1SFan Zhang uint32_t socket_id;
57261bbff7SFan Zhang uint32_t cache_size;
58261bbff7SFan Zhang char mp_name[NAME_SIZE];
59bd9b67a1SFan Zhang int status;
60bd9b67a1SFan Zhang
61bd9b67a1SFan Zhang /* Check input params */
62bd9b67a1SFan Zhang if ((name == NULL) ||
63bd9b67a1SFan Zhang cryptodev_find(name) ||
64bd9b67a1SFan Zhang (params->n_queues == 0) ||
65261bbff7SFan Zhang (params->queue_size == 0) ||
66261bbff7SFan Zhang (params->session_pool_size == 0))
67bd9b67a1SFan Zhang return NULL;
68bd9b67a1SFan Zhang
69bd9b67a1SFan Zhang if (params->dev_name) {
70bd9b67a1SFan Zhang status = rte_cryptodev_get_dev_id(params->dev_name);
71bd9b67a1SFan Zhang if (status == -1)
72bd9b67a1SFan Zhang return NULL;
73bd9b67a1SFan Zhang
74bd9b67a1SFan Zhang dev_id = (uint32_t)status;
75bd9b67a1SFan Zhang } else {
76*e74abd48SAkhil Goyal if (rte_cryptodev_is_valid_dev(params->dev_id) == 0)
77bd9b67a1SFan Zhang return NULL;
78bd9b67a1SFan Zhang
79bd9b67a1SFan Zhang dev_id = params->dev_id;
80bd9b67a1SFan Zhang }
81bd9b67a1SFan Zhang
82261bbff7SFan Zhang cache_size = (params->session_pool_size / 2 <
83261bbff7SFan Zhang PIPELINE_CRYPTO_SESSION_CACHE_SIZE) ?
84261bbff7SFan Zhang (params->session_pool_size / 2) :
85261bbff7SFan Zhang PIPELINE_CRYPTO_SESSION_CACHE_SIZE;
86261bbff7SFan Zhang
87bd9b67a1SFan Zhang socket_id = rte_cryptodev_socket_id(dev_id);
88bd9b67a1SFan Zhang rte_cryptodev_info_get(dev_id, &dev_info);
89bd9b67a1SFan Zhang
90bd9b67a1SFan Zhang if (dev_info.max_nb_queue_pairs < params->n_queues)
91bd9b67a1SFan Zhang return NULL;
92bd9b67a1SFan Zhang
93bd9b67a1SFan Zhang dev_conf.socket_id = socket_id;
94bd9b67a1SFan Zhang dev_conf.nb_queue_pairs = params->n_queues;
95c9030ae3SAnoob Joseph dev_conf.ff_disable = 0;
96bd9b67a1SFan Zhang
97bd9b67a1SFan Zhang status = rte_cryptodev_configure(dev_id, &dev_conf);
98bd9b67a1SFan Zhang if (status < 0)
99bd9b67a1SFan Zhang return NULL;
100bd9b67a1SFan Zhang
101bd9b67a1SFan Zhang queue_conf.nb_descriptors = params->queue_size;
102bd9b67a1SFan Zhang for (i = 0; i < params->n_queues; i++) {
103bd9b67a1SFan Zhang status = rte_cryptodev_queue_pair_setup(dev_id, i,
104725d2a7fSFan Zhang &queue_conf, socket_id);
105bd9b67a1SFan Zhang if (status < 0)
106bd9b67a1SFan Zhang return NULL;
107bd9b67a1SFan Zhang }
108bd9b67a1SFan Zhang
109bd9b67a1SFan Zhang if (rte_cryptodev_start(dev_id) < 0)
110bd9b67a1SFan Zhang return NULL;
111bd9b67a1SFan Zhang
112bd9b67a1SFan Zhang cryptodev = calloc(1, sizeof(struct cryptodev));
113bd9b67a1SFan Zhang if (cryptodev == NULL) {
114bd9b67a1SFan Zhang rte_cryptodev_stop(dev_id);
115bd9b67a1SFan Zhang return NULL;
116bd9b67a1SFan Zhang }
117bd9b67a1SFan Zhang
118bd9b67a1SFan Zhang strlcpy(cryptodev->name, name, sizeof(cryptodev->name));
119bd9b67a1SFan Zhang cryptodev->dev_id = dev_id;
120bd9b67a1SFan Zhang cryptodev->n_queues = params->n_queues;
121bd9b67a1SFan Zhang
122261bbff7SFan Zhang snprintf(mp_name, NAME_SIZE, "%s_mp%u", name, dev_id);
123261bbff7SFan Zhang cryptodev->mp_create = rte_cryptodev_sym_session_pool_create(
124261bbff7SFan Zhang mp_name,
125261bbff7SFan Zhang params->session_pool_size,
126261bbff7SFan Zhang 0,
127261bbff7SFan Zhang cache_size,
128261bbff7SFan Zhang 0,
129261bbff7SFan Zhang socket_id);
130261bbff7SFan Zhang if (!cryptodev->mp_create)
131261bbff7SFan Zhang goto error_exit;
132261bbff7SFan Zhang
133261bbff7SFan Zhang snprintf(mp_name, NAME_SIZE, "%s_mp_priv%u", name, dev_id);
134261bbff7SFan Zhang cryptodev->mp_init = rte_mempool_create(
135261bbff7SFan Zhang NULL,
136261bbff7SFan Zhang params->session_pool_size,
137261bbff7SFan Zhang rte_cryptodev_sym_get_private_session_size(dev_id),
138261bbff7SFan Zhang cache_size,
139261bbff7SFan Zhang 0,
140261bbff7SFan Zhang NULL,
141261bbff7SFan Zhang NULL,
142261bbff7SFan Zhang NULL,
143261bbff7SFan Zhang NULL,
144261bbff7SFan Zhang socket_id,
145261bbff7SFan Zhang 0);
146261bbff7SFan Zhang if (!cryptodev->mp_init)
147261bbff7SFan Zhang goto error_exit;
148261bbff7SFan Zhang
149bd9b67a1SFan Zhang TAILQ_INSERT_TAIL(&cryptodev_list, cryptodev, node);
150bd9b67a1SFan Zhang
151bd9b67a1SFan Zhang return cryptodev;
152261bbff7SFan Zhang
153261bbff7SFan Zhang error_exit:
154261bbff7SFan Zhang rte_mempool_free(cryptodev->mp_create);
155261bbff7SFan Zhang rte_mempool_free(cryptodev->mp_init);
156261bbff7SFan Zhang
157261bbff7SFan Zhang free(cryptodev);
158261bbff7SFan Zhang
159261bbff7SFan Zhang return NULL;
160bd9b67a1SFan Zhang }
161