xref: /dpdk/examples/ip_pipeline/cryptodev.c (revision 06c047b680615678bb8773faaec53156ade94770)
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