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_cryptodev_pmd.h> 10bd9b67a1SFan Zhang #include <rte_string_fns.h> 11bd9b67a1SFan Zhang 12bd9b67a1SFan Zhang #include "cryptodev.h" 13bd9b67a1SFan Zhang 14*261bbff7SFan Zhang #define PIPELINE_CRYPTO_SESSION_CACHE_SIZE 128 15*261bbff7SFan Zhang 16bd9b67a1SFan Zhang static struct cryptodev_list cryptodev_list; 17bd9b67a1SFan Zhang 18bd9b67a1SFan Zhang int 19bd9b67a1SFan Zhang cryptodev_init(void) 20bd9b67a1SFan Zhang { 21bd9b67a1SFan Zhang TAILQ_INIT(&cryptodev_list); 22bd9b67a1SFan Zhang 23bd9b67a1SFan Zhang return 0; 24bd9b67a1SFan Zhang } 25bd9b67a1SFan Zhang 26bd9b67a1SFan Zhang struct cryptodev * 27bd9b67a1SFan Zhang cryptodev_find(const char *name) 28bd9b67a1SFan Zhang { 29bd9b67a1SFan Zhang struct cryptodev *cryptodev; 30bd9b67a1SFan Zhang 31bd9b67a1SFan Zhang if (name == NULL) 32bd9b67a1SFan Zhang return NULL; 33bd9b67a1SFan Zhang 34bd9b67a1SFan Zhang TAILQ_FOREACH(cryptodev, &cryptodev_list, node) 35bd9b67a1SFan Zhang if (strcmp(cryptodev->name, name) == 0) 36bd9b67a1SFan Zhang return cryptodev; 37bd9b67a1SFan Zhang 38bd9b67a1SFan Zhang return NULL; 39bd9b67a1SFan Zhang } 40bd9b67a1SFan Zhang 41bd9b67a1SFan Zhang struct cryptodev * 42bd9b67a1SFan Zhang cryptodev_next(struct cryptodev *cryptodev) 43bd9b67a1SFan Zhang { 44bd9b67a1SFan Zhang return (cryptodev == NULL) ? 45bd9b67a1SFan Zhang TAILQ_FIRST(&cryptodev_list) : 46bd9b67a1SFan Zhang TAILQ_NEXT(cryptodev, node); 47bd9b67a1SFan Zhang } 48bd9b67a1SFan Zhang 49bd9b67a1SFan Zhang struct cryptodev * 50bd9b67a1SFan Zhang cryptodev_create(const char *name, struct cryptodev_params *params) 51bd9b67a1SFan Zhang { 52bd9b67a1SFan Zhang struct rte_cryptodev_info dev_info; 53bd9b67a1SFan Zhang struct rte_cryptodev_config dev_conf; 54bd9b67a1SFan Zhang struct rte_cryptodev_qp_conf queue_conf; 55bd9b67a1SFan Zhang struct cryptodev *cryptodev; 56bd9b67a1SFan Zhang uint32_t dev_id, i; 57bd9b67a1SFan Zhang uint32_t socket_id; 58*261bbff7SFan Zhang uint32_t cache_size; 59*261bbff7SFan Zhang char mp_name[NAME_SIZE]; 60bd9b67a1SFan Zhang int status; 61bd9b67a1SFan Zhang 62bd9b67a1SFan Zhang /* Check input params */ 63bd9b67a1SFan Zhang if ((name == NULL) || 64bd9b67a1SFan Zhang cryptodev_find(name) || 65bd9b67a1SFan Zhang (params->n_queues == 0) || 66*261bbff7SFan Zhang (params->queue_size == 0) || 67*261bbff7SFan Zhang (params->session_pool_size == 0)) 68bd9b67a1SFan Zhang return NULL; 69bd9b67a1SFan Zhang 70bd9b67a1SFan Zhang if (params->dev_name) { 71bd9b67a1SFan Zhang status = rte_cryptodev_get_dev_id(params->dev_name); 72bd9b67a1SFan Zhang if (status == -1) 73bd9b67a1SFan Zhang return NULL; 74bd9b67a1SFan Zhang 75bd9b67a1SFan Zhang dev_id = (uint32_t)status; 76bd9b67a1SFan Zhang } else { 77bd9b67a1SFan Zhang if (rte_cryptodev_pmd_is_valid_dev(params->dev_id) == 0) 78bd9b67a1SFan Zhang return NULL; 79bd9b67a1SFan Zhang 80bd9b67a1SFan Zhang dev_id = params->dev_id; 81bd9b67a1SFan Zhang } 82bd9b67a1SFan Zhang 83*261bbff7SFan Zhang cache_size = (params->session_pool_size / 2 < 84*261bbff7SFan Zhang PIPELINE_CRYPTO_SESSION_CACHE_SIZE) ? 85*261bbff7SFan Zhang (params->session_pool_size / 2) : 86*261bbff7SFan Zhang PIPELINE_CRYPTO_SESSION_CACHE_SIZE; 87*261bbff7SFan Zhang 88bd9b67a1SFan Zhang socket_id = rte_cryptodev_socket_id(dev_id); 89bd9b67a1SFan Zhang rte_cryptodev_info_get(dev_id, &dev_info); 90bd9b67a1SFan Zhang 91bd9b67a1SFan Zhang if (dev_info.max_nb_queue_pairs < params->n_queues) 92bd9b67a1SFan Zhang return NULL; 93bd9b67a1SFan Zhang if (dev_info.feature_flags & RTE_CRYPTODEV_FF_HW_ACCELERATED) 94bd9b67a1SFan Zhang return NULL; 95bd9b67a1SFan Zhang 96bd9b67a1SFan Zhang dev_conf.socket_id = socket_id; 97bd9b67a1SFan Zhang dev_conf.nb_queue_pairs = params->n_queues; 98bd9b67a1SFan Zhang 99bd9b67a1SFan Zhang status = rte_cryptodev_configure(dev_id, &dev_conf); 100bd9b67a1SFan Zhang if (status < 0) 101bd9b67a1SFan Zhang return NULL; 102bd9b67a1SFan Zhang 103bd9b67a1SFan Zhang queue_conf.nb_descriptors = params->queue_size; 104bd9b67a1SFan Zhang for (i = 0; i < params->n_queues; i++) { 105bd9b67a1SFan Zhang status = rte_cryptodev_queue_pair_setup(dev_id, i, 106725d2a7fSFan Zhang &queue_conf, socket_id); 107bd9b67a1SFan Zhang if (status < 0) 108bd9b67a1SFan Zhang return NULL; 109bd9b67a1SFan Zhang } 110bd9b67a1SFan Zhang 111bd9b67a1SFan Zhang if (rte_cryptodev_start(dev_id) < 0) 112bd9b67a1SFan Zhang return NULL; 113bd9b67a1SFan Zhang 114bd9b67a1SFan Zhang cryptodev = calloc(1, sizeof(struct cryptodev)); 115bd9b67a1SFan Zhang if (cryptodev == NULL) { 116bd9b67a1SFan Zhang rte_cryptodev_stop(dev_id); 117bd9b67a1SFan Zhang return NULL; 118bd9b67a1SFan Zhang } 119bd9b67a1SFan Zhang 120bd9b67a1SFan Zhang strlcpy(cryptodev->name, name, sizeof(cryptodev->name)); 121bd9b67a1SFan Zhang cryptodev->dev_id = dev_id; 122bd9b67a1SFan Zhang cryptodev->n_queues = params->n_queues; 123bd9b67a1SFan Zhang 124*261bbff7SFan Zhang snprintf(mp_name, NAME_SIZE, "%s_mp%u", name, dev_id); 125*261bbff7SFan Zhang cryptodev->mp_create = rte_cryptodev_sym_session_pool_create( 126*261bbff7SFan Zhang mp_name, 127*261bbff7SFan Zhang params->session_pool_size, 128*261bbff7SFan Zhang 0, 129*261bbff7SFan Zhang cache_size, 130*261bbff7SFan Zhang 0, 131*261bbff7SFan Zhang socket_id); 132*261bbff7SFan Zhang if (!cryptodev->mp_create) 133*261bbff7SFan Zhang goto error_exit; 134*261bbff7SFan Zhang 135*261bbff7SFan Zhang snprintf(mp_name, NAME_SIZE, "%s_mp_priv%u", name, dev_id); 136*261bbff7SFan Zhang cryptodev->mp_init = rte_mempool_create( 137*261bbff7SFan Zhang NULL, 138*261bbff7SFan Zhang params->session_pool_size, 139*261bbff7SFan Zhang rte_cryptodev_sym_get_private_session_size(dev_id), 140*261bbff7SFan Zhang cache_size, 141*261bbff7SFan Zhang 0, 142*261bbff7SFan Zhang NULL, 143*261bbff7SFan Zhang NULL, 144*261bbff7SFan Zhang NULL, 145*261bbff7SFan Zhang NULL, 146*261bbff7SFan Zhang socket_id, 147*261bbff7SFan Zhang 0); 148*261bbff7SFan Zhang if (!cryptodev->mp_init) 149*261bbff7SFan Zhang goto error_exit; 150*261bbff7SFan Zhang 151bd9b67a1SFan Zhang TAILQ_INSERT_TAIL(&cryptodev_list, cryptodev, node); 152bd9b67a1SFan Zhang 153bd9b67a1SFan Zhang return cryptodev; 154*261bbff7SFan Zhang 155*261bbff7SFan Zhang error_exit: 156*261bbff7SFan Zhang if (cryptodev->mp_create) 157*261bbff7SFan Zhang rte_mempool_free(cryptodev->mp_create); 158*261bbff7SFan Zhang if (cryptodev->mp_init) 159*261bbff7SFan Zhang rte_mempool_free(cryptodev->mp_init); 160*261bbff7SFan Zhang 161*261bbff7SFan Zhang free(cryptodev); 162*261bbff7SFan Zhang 163*261bbff7SFan Zhang return NULL; 164bd9b67a1SFan Zhang } 165