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