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 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 * 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 * 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 * 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 if (cryptodev->mp_create) 155261bbff7SFan Zhang rte_mempool_free(cryptodev->mp_create); 156261bbff7SFan Zhang if (cryptodev->mp_init) 157261bbff7SFan Zhang rte_mempool_free(cryptodev->mp_init); 158261bbff7SFan Zhang 159261bbff7SFan Zhang free(cryptodev); 160261bbff7SFan Zhang 161261bbff7SFan Zhang return NULL; 162bd9b67a1SFan Zhang } 163