diff options
Diffstat (limited to 'lib/librte_cryptodev/rte_cryptodev_pmd.c')
-rw-r--r-- | lib/librte_cryptodev/rte_cryptodev_pmd.c | 212 |
1 files changed, 82 insertions, 130 deletions
diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.c b/lib/librte_cryptodev/rte_cryptodev_pmd.c index a57faadc..b4eeb448 100644 --- a/lib/librte_cryptodev/rte_cryptodev_pmd.c +++ b/lib/librte_cryptodev/rte_cryptodev_pmd.c @@ -32,84 +32,48 @@ #include <rte_malloc.h> -#include "rte_cryptodev_vdev.h" -#include "rte_cryptodev_pci.h" #include "rte_cryptodev_pmd.h" /** * Parse name from argument */ static int -rte_cryptodev_vdev_parse_name_arg(const char *key __rte_unused, +rte_cryptodev_pmd_parse_name_arg(const char *key __rte_unused, const char *value, void *extra_args) { - struct rte_crypto_vdev_init_params *params = extra_args; + struct rte_cryptodev_pmd_init_params *params = extra_args; + int n; - if (strlen(value) >= RTE_CRYPTODEV_NAME_MAX_LEN - 1) { - CDEV_LOG_ERR("Invalid name %s, should be less than " - "%u bytes", value, - RTE_CRYPTODEV_NAME_MAX_LEN - 1); - return -1; - } - - strncpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN); + n = snprintf(params->name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s", value); + if (n >= RTE_CRYPTODEV_NAME_MAX_LEN) + return -EINVAL; return 0; } /** - * Parse integer from argument + * Parse unsigned integer from argument */ static int -rte_cryptodev_vdev_parse_integer_arg(const char *key __rte_unused, +rte_cryptodev_pmd_parse_uint_arg(const char *key __rte_unused, const char *value, void *extra_args) { - int *i = extra_args; + int i; + char *end; + errno = 0; - *i = atoi(value); - if (*i < 0) { - CDEV_LOG_ERR("Argument has to be positive."); - return -1; - } + i = strtol(value, &end, 10); + if (*end != 0 || errno != 0 || i < 0) + return -EINVAL; + *((uint32_t *)extra_args) = i; return 0; } -struct rte_cryptodev * -rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size, - int socket_id, struct rte_vdev_device *vdev) -{ - struct rte_cryptodev *cryptodev; - - /* allocate device structure */ - cryptodev = rte_cryptodev_pmd_allocate(name, socket_id); - if (cryptodev == NULL) - return NULL; - - /* allocate private device structure */ - if (rte_eal_process_type() == RTE_PROC_PRIMARY) { - cryptodev->data->dev_private = - rte_zmalloc_socket("cryptodev device private", - dev_private_size, - RTE_CACHE_LINE_SIZE, - socket_id); - - if (cryptodev->data->dev_private == NULL) - rte_panic("Cannot allocate memzone for private device" - " data"); - } - - cryptodev->device = &vdev->device; - - /* initialise user call-back tail queue */ - TAILQ_INIT(&(cryptodev->link_intr_cbs)); - - return cryptodev; -} - int -rte_cryptodev_vdev_parse_init_params(struct rte_crypto_vdev_init_params *params, - const char *input_args) +rte_cryptodev_pmd_parse_input_args( + struct rte_cryptodev_pmd_init_params *params, + const char *args) { struct rte_kvargs *kvlist = NULL; int ret = 0; @@ -117,35 +81,36 @@ rte_cryptodev_vdev_parse_init_params(struct rte_crypto_vdev_init_params *params, if (params == NULL) return -EINVAL; - if (input_args) { - kvlist = rte_kvargs_parse(input_args, - cryptodev_vdev_valid_params); + if (args) { + kvlist = rte_kvargs_parse(args, cryptodev_pmd_valid_params); if (kvlist == NULL) - return -1; + return -EINVAL; ret = rte_kvargs_process(kvlist, - RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG, - &rte_cryptodev_vdev_parse_integer_arg, - ¶ms->max_nb_queue_pairs); + RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG, + &rte_cryptodev_pmd_parse_uint_arg, + ¶ms->max_nb_queue_pairs); if (ret < 0) goto free_kvlist; ret = rte_kvargs_process(kvlist, - RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG, - &rte_cryptodev_vdev_parse_integer_arg, - ¶ms->max_nb_sessions); + RTE_CRYPTODEV_PMD_MAX_NB_SESS_ARG, + &rte_cryptodev_pmd_parse_uint_arg, + ¶ms->max_nb_sessions); if (ret < 0) goto free_kvlist; - ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_SOCKET_ID, - &rte_cryptodev_vdev_parse_integer_arg, - ¶ms->socket_id); + ret = rte_kvargs_process(kvlist, + RTE_CRYPTODEV_PMD_SOCKET_ID_ARG, + &rte_cryptodev_pmd_parse_uint_arg, + ¶ms->socket_id); if (ret < 0) goto free_kvlist; - ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_NAME, - &rte_cryptodev_vdev_parse_name_arg, - params); + ret = rte_kvargs_process(kvlist, + RTE_CRYPTODEV_PMD_NAME_ARG, + &rte_cryptodev_pmd_parse_name_arg, + params); if (ret < 0) goto free_kvlist; } @@ -155,93 +120,80 @@ free_kvlist: return ret; } -int -rte_cryptodev_pci_generic_probe(struct rte_pci_device *pci_dev, - size_t private_data_size, - cryptodev_pci_init_t dev_init) +struct rte_cryptodev * +rte_cryptodev_pmd_create(const char *name, + struct rte_device *device, + struct rte_cryptodev_pmd_init_params *params) { struct rte_cryptodev *cryptodev; - char cryptodev_name[RTE_CRYPTODEV_NAME_MAX_LEN]; + if (params->name[0] != '\0') { + CDEV_LOG_INFO("[%s] User specified device name = %s\n", + device->driver->name, params->name); + name = params->name; + } - int retval; + CDEV_LOG_INFO("[%s] - Creating cryptodev %s\n", + device->driver->name, name); - rte_pci_device_name(&pci_dev->addr, cryptodev_name, - sizeof(cryptodev_name)); + CDEV_LOG_INFO("[%s] - Initialisation parameters - name: %s," + "socket id: %d, max queue pairs: %u, max sessions: %u", + device->driver->name, name, + params->socket_id, params->max_nb_queue_pairs, + params->max_nb_sessions); - cryptodev = rte_cryptodev_pmd_allocate(cryptodev_name, rte_socket_id()); - if (cryptodev == NULL) - return -ENOMEM; + /* allocate device structure */ + cryptodev = rte_cryptodev_pmd_allocate(name, params->socket_id); + if (cryptodev == NULL) { + CDEV_LOG_ERR("[%s] Failed to allocate crypto device for %s", + device->driver->name, name); + return NULL; + } + /* allocate private device structure */ if (rte_eal_process_type() == RTE_PROC_PRIMARY) { cryptodev->data->dev_private = - rte_zmalloc_socket( - "cryptodev private structure", - private_data_size, + rte_zmalloc_socket("cryptodev device private", + params->private_data_size, RTE_CACHE_LINE_SIZE, - rte_socket_id()); + params->socket_id); + + if (cryptodev->data->dev_private == NULL) { + CDEV_LOG_ERR("[%s] Cannot allocate memory for " + "cryptodev %s private data", + device->driver->name, name); - if (cryptodev->data->dev_private == NULL) - rte_panic("Cannot allocate memzone for private " - "device data"); + rte_cryptodev_pmd_release_device(cryptodev); + return NULL; + } } - cryptodev->device = &pci_dev->device; + cryptodev->device = device; - /* init user callbacks */ + /* initialise user call-back tail queue */ TAILQ_INIT(&(cryptodev->link_intr_cbs)); - /* Invoke PMD device initialization function */ - RTE_FUNC_PTR_OR_ERR_RET(*dev_init, -EINVAL); - retval = dev_init(cryptodev); - if (retval == 0) - return 0; - - CDEV_LOG_ERR("driver %s: crypto_dev_init(vendor_id=0x%x device_id=0x%x)" - " failed", pci_dev->device.driver->name, - (unsigned int) pci_dev->id.vendor_id, - (unsigned int) pci_dev->id.device_id); - - if (rte_eal_process_type() == RTE_PROC_PRIMARY) - rte_free(cryptodev->data->dev_private); - - /* free crypto device */ - rte_cryptodev_pmd_release_device(cryptodev); - - return -ENXIO; + return cryptodev; } int -rte_cryptodev_pci_generic_remove(struct rte_pci_device *pci_dev, - cryptodev_pci_uninit_t dev_uninit) +rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev) { - struct rte_cryptodev *cryptodev; - char cryptodev_name[RTE_CRYPTODEV_NAME_MAX_LEN]; - int ret; - - if (pci_dev == NULL) - return -EINVAL; - - rte_pci_device_name(&pci_dev->addr, cryptodev_name, - sizeof(cryptodev_name)); - - cryptodev = rte_cryptodev_pmd_get_named_dev(cryptodev_name); - if (cryptodev == NULL) - return -ENODEV; + int retval; - /* Invoke PMD device uninit function */ - if (dev_uninit) { - ret = dev_uninit(cryptodev); - if (ret) - return ret; - } + CDEV_LOG_INFO("[%s] Closing crypto device %s", + cryptodev->device->driver->name, + cryptodev->device->name); /* free crypto device */ - rte_cryptodev_pmd_release_device(cryptodev); + retval = rte_cryptodev_pmd_release_device(cryptodev); + if (retval) + return retval; if (rte_eal_process_type() == RTE_PROC_PRIMARY) rte_free(cryptodev->data->dev_private); + cryptodev->device = NULL; cryptodev->data = NULL; |