xref: /dpdk/examples/ip_pipeline/cryptodev.c (revision bd9b67a1092ef17a5f6cb49c91c687329718a5dc)
1*bd9b67a1SFan Zhang /* SPDX-License-Identifier: BSD-3-Clause
2*bd9b67a1SFan Zhang  * Copyright(c) 2018 Intel Corporation
3*bd9b67a1SFan Zhang  */
4*bd9b67a1SFan Zhang 
5*bd9b67a1SFan Zhang #include <stdlib.h>
6*bd9b67a1SFan Zhang #include <stdio.h>
7*bd9b67a1SFan Zhang 
8*bd9b67a1SFan Zhang #include <rte_cryptodev.h>
9*bd9b67a1SFan Zhang #include <rte_cryptodev_pmd.h>
10*bd9b67a1SFan Zhang #include <rte_string_fns.h>
11*bd9b67a1SFan Zhang 
12*bd9b67a1SFan Zhang #include "cryptodev.h"
13*bd9b67a1SFan Zhang 
14*bd9b67a1SFan Zhang static struct cryptodev_list cryptodev_list;
15*bd9b67a1SFan Zhang 
16*bd9b67a1SFan Zhang int
17*bd9b67a1SFan Zhang cryptodev_init(void)
18*bd9b67a1SFan Zhang {
19*bd9b67a1SFan Zhang 	TAILQ_INIT(&cryptodev_list);
20*bd9b67a1SFan Zhang 
21*bd9b67a1SFan Zhang 	return 0;
22*bd9b67a1SFan Zhang }
23*bd9b67a1SFan Zhang 
24*bd9b67a1SFan Zhang struct cryptodev *
25*bd9b67a1SFan Zhang cryptodev_find(const char *name)
26*bd9b67a1SFan Zhang {
27*bd9b67a1SFan Zhang 	struct cryptodev *cryptodev;
28*bd9b67a1SFan Zhang 
29*bd9b67a1SFan Zhang 	if (name == NULL)
30*bd9b67a1SFan Zhang 		return NULL;
31*bd9b67a1SFan Zhang 
32*bd9b67a1SFan Zhang 	TAILQ_FOREACH(cryptodev, &cryptodev_list, node)
33*bd9b67a1SFan Zhang 		if (strcmp(cryptodev->name, name) == 0)
34*bd9b67a1SFan Zhang 			return cryptodev;
35*bd9b67a1SFan Zhang 
36*bd9b67a1SFan Zhang 	return NULL;
37*bd9b67a1SFan Zhang }
38*bd9b67a1SFan Zhang 
39*bd9b67a1SFan Zhang struct cryptodev *
40*bd9b67a1SFan Zhang cryptodev_next(struct cryptodev *cryptodev)
41*bd9b67a1SFan Zhang {
42*bd9b67a1SFan Zhang 	return (cryptodev == NULL) ?
43*bd9b67a1SFan Zhang 			TAILQ_FIRST(&cryptodev_list) :
44*bd9b67a1SFan Zhang 			TAILQ_NEXT(cryptodev, node);
45*bd9b67a1SFan Zhang }
46*bd9b67a1SFan Zhang 
47*bd9b67a1SFan Zhang struct cryptodev *
48*bd9b67a1SFan Zhang cryptodev_create(const char *name, struct cryptodev_params *params)
49*bd9b67a1SFan Zhang {
50*bd9b67a1SFan Zhang 	struct rte_cryptodev_info dev_info;
51*bd9b67a1SFan Zhang 	struct rte_cryptodev_config dev_conf;
52*bd9b67a1SFan Zhang 	struct rte_cryptodev_qp_conf queue_conf;
53*bd9b67a1SFan Zhang 	struct cryptodev *cryptodev;
54*bd9b67a1SFan Zhang 	uint32_t dev_id, i;
55*bd9b67a1SFan Zhang 	uint32_t socket_id;
56*bd9b67a1SFan Zhang 	int status;
57*bd9b67a1SFan Zhang 
58*bd9b67a1SFan Zhang 	/* Check input params */
59*bd9b67a1SFan Zhang 	if ((name == NULL) ||
60*bd9b67a1SFan Zhang 		cryptodev_find(name) ||
61*bd9b67a1SFan Zhang 		(params->n_queues == 0) ||
62*bd9b67a1SFan Zhang 		(params->queue_size == 0))
63*bd9b67a1SFan Zhang 		return NULL;
64*bd9b67a1SFan Zhang 
65*bd9b67a1SFan Zhang 	if (params->dev_name) {
66*bd9b67a1SFan Zhang 		status = rte_cryptodev_get_dev_id(params->dev_name);
67*bd9b67a1SFan Zhang 		if (status == -1)
68*bd9b67a1SFan Zhang 			return NULL;
69*bd9b67a1SFan Zhang 
70*bd9b67a1SFan Zhang 		dev_id = (uint32_t)status;
71*bd9b67a1SFan Zhang 	} else {
72*bd9b67a1SFan Zhang 		if (rte_cryptodev_pmd_is_valid_dev(params->dev_id) == 0)
73*bd9b67a1SFan Zhang 			return NULL;
74*bd9b67a1SFan Zhang 
75*bd9b67a1SFan Zhang 		dev_id = params->dev_id;
76*bd9b67a1SFan Zhang 	}
77*bd9b67a1SFan Zhang 
78*bd9b67a1SFan Zhang 	socket_id = rte_cryptodev_socket_id(dev_id);
79*bd9b67a1SFan Zhang 	rte_cryptodev_info_get(dev_id, &dev_info);
80*bd9b67a1SFan Zhang 
81*bd9b67a1SFan Zhang 	if (dev_info.max_nb_queue_pairs < params->n_queues)
82*bd9b67a1SFan Zhang 		return NULL;
83*bd9b67a1SFan Zhang 	if (dev_info.feature_flags & RTE_CRYPTODEV_FF_HW_ACCELERATED)
84*bd9b67a1SFan Zhang 		return NULL;
85*bd9b67a1SFan Zhang 
86*bd9b67a1SFan Zhang 	dev_conf.socket_id = socket_id;
87*bd9b67a1SFan Zhang 	dev_conf.nb_queue_pairs = params->n_queues;
88*bd9b67a1SFan Zhang 
89*bd9b67a1SFan Zhang 	status = rte_cryptodev_configure(dev_id, &dev_conf);
90*bd9b67a1SFan Zhang 	if (status < 0)
91*bd9b67a1SFan Zhang 		return NULL;
92*bd9b67a1SFan Zhang 
93*bd9b67a1SFan Zhang 	queue_conf.nb_descriptors = params->queue_size;
94*bd9b67a1SFan Zhang 	for (i = 0; i < params->n_queues; i++) {
95*bd9b67a1SFan Zhang 		status = rte_cryptodev_queue_pair_setup(dev_id, i,
96*bd9b67a1SFan Zhang 				&queue_conf, socket_id, NULL);
97*bd9b67a1SFan Zhang 		if (status < 0)
98*bd9b67a1SFan Zhang 			return NULL;
99*bd9b67a1SFan Zhang 	}
100*bd9b67a1SFan Zhang 
101*bd9b67a1SFan Zhang 	if (rte_cryptodev_start(dev_id) < 0)
102*bd9b67a1SFan Zhang 		return NULL;
103*bd9b67a1SFan Zhang 
104*bd9b67a1SFan Zhang 	cryptodev = calloc(1, sizeof(struct cryptodev));
105*bd9b67a1SFan Zhang 	if (cryptodev == NULL) {
106*bd9b67a1SFan Zhang 		rte_cryptodev_stop(dev_id);
107*bd9b67a1SFan Zhang 		return NULL;
108*bd9b67a1SFan Zhang 	}
109*bd9b67a1SFan Zhang 
110*bd9b67a1SFan Zhang 	strlcpy(cryptodev->name, name, sizeof(cryptodev->name));
111*bd9b67a1SFan Zhang 	cryptodev->dev_id = dev_id;
112*bd9b67a1SFan Zhang 	cryptodev->n_queues = params->n_queues;
113*bd9b67a1SFan Zhang 
114*bd9b67a1SFan Zhang 	TAILQ_INSERT_TAIL(&cryptodev_list, cryptodev, node);
115*bd9b67a1SFan Zhang 
116*bd9b67a1SFan Zhang 	return cryptodev;
117*bd9b67a1SFan Zhang }
118