cryptodev: add APIs to assist PMD initialisation
Adds new PMD assist functions which are bus independent for driver to create and destroy new device instances. Also includes function to parse parameters which can be passed to driver on device initialisation. Signed-off-by: Declan Doherty <declan.doherty@intel.com> Acked-by: Fiona Trahe <fiona.trahe@intel.com> Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
This commit is contained in:
parent
0ef45a9ae8
commit
9e6edea418
@ -81,6 +81,13 @@ New Features
|
||||
* Support for Flow API
|
||||
* Support for Tx and Rx descriptor status functions
|
||||
|
||||
* **Add bus agnostic functions to cryptodev for PMD initialisation**
|
||||
|
||||
Adds new PMD assist functions ``rte_cryptodev_pmd_parse_input_args()``,
|
||||
``rte_cryptodev_pmd_create()`` and ``rte_cryptodev_pmd_destroy()`` which
|
||||
are bus independent for driver to manage creation and destruction of new
|
||||
device instances.
|
||||
|
||||
* **Updated QAT crypto PMD.**
|
||||
|
||||
Performance enhancements:
|
||||
|
@ -59,10 +59,10 @@ extern const char **rte_cyptodev_names;
|
||||
RTE_FMT("%s() line %u: " RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
|
||||
__func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__,)))
|
||||
|
||||
#define CDEV_PMD_LOG_ERR(dev, ...) \
|
||||
RTE_LOG(ERR, CRYPTODEV, \
|
||||
RTE_FMT("[%s] %s() line %u: " RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
|
||||
dev, __func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__,)))
|
||||
#define CDEV_LOG_INFO(...) \
|
||||
RTE_LOG(INFO, CRYPTODEV, \
|
||||
RTE_FMT(RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
|
||||
RTE_FMT_TAIL(__VA_ARGS__,)))
|
||||
|
||||
#ifdef RTE_LIBRTE_CRYPTODEV_DEBUG
|
||||
#define CDEV_LOG_DEBUG(...) \
|
||||
|
@ -36,6 +36,172 @@
|
||||
#include "rte_cryptodev_pci.h"
|
||||
#include "rte_cryptodev_pmd.h"
|
||||
|
||||
/**
|
||||
* Parse name from argument
|
||||
*/
|
||||
static int
|
||||
rte_cryptodev_pmd_parse_name_arg(const char *key __rte_unused,
|
||||
const char *value, void *extra_args)
|
||||
{
|
||||
struct rte_cryptodev_pmd_init_params *params = extra_args;
|
||||
int n;
|
||||
|
||||
n = snprintf(params->name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s", value);
|
||||
if (n >= RTE_CRYPTODEV_NAME_MAX_LEN)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse unsigned integer from argument
|
||||
*/
|
||||
static int
|
||||
rte_cryptodev_pmd_parse_uint_arg(const char *key __rte_unused,
|
||||
const char *value, void *extra_args)
|
||||
{
|
||||
int i;
|
||||
char *end;
|
||||
errno = 0;
|
||||
|
||||
i = strtol(value, &end, 10);
|
||||
if (*end != 0 || errno != 0 || i < 0)
|
||||
return -EINVAL;
|
||||
|
||||
*((uint32_t *)extra_args) = i;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rte_cryptodev_pmd_parse_input_args(
|
||||
struct rte_cryptodev_pmd_init_params *params,
|
||||
const char *args)
|
||||
{
|
||||
struct rte_kvargs *kvlist = NULL;
|
||||
int ret = 0;
|
||||
|
||||
if (params == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
if (args) {
|
||||
kvlist = rte_kvargs_parse(args, cryptodev_pmd_valid_params);
|
||||
if (kvlist == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
ret = rte_kvargs_process(kvlist,
|
||||
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_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_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_PMD_NAME_ARG,
|
||||
&rte_cryptodev_pmd_parse_name_arg,
|
||||
params);
|
||||
if (ret < 0)
|
||||
goto free_kvlist;
|
||||
}
|
||||
|
||||
free_kvlist:
|
||||
rte_kvargs_free(kvlist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if (params->name[0] != '\0') {
|
||||
CDEV_LOG_INFO("[%s] User specified device name = %s\n",
|
||||
device->driver->name, params->name);
|
||||
name = params->name;
|
||||
}
|
||||
|
||||
CDEV_LOG_INFO("[%s] - Creating cryptodev %s\n",
|
||||
device->driver->name, 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);
|
||||
|
||||
/* 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 device private",
|
||||
params->private_data_size,
|
||||
RTE_CACHE_LINE_SIZE,
|
||||
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);
|
||||
|
||||
rte_cryptodev_pmd_release_device(cryptodev);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
cryptodev->device = device;
|
||||
|
||||
/* initialise user call-back tail queue */
|
||||
TAILQ_INIT(&(cryptodev->link_intr_cbs));
|
||||
|
||||
return cryptodev;
|
||||
}
|
||||
|
||||
int
|
||||
rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev)
|
||||
{
|
||||
int retval;
|
||||
|
||||
CDEV_LOG_INFO("[%s] Closing crypto device %s",
|
||||
cryptodev->device->driver->name,
|
||||
cryptodev->device->name);
|
||||
|
||||
/* free crypto device */
|
||||
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;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse name from argument
|
||||
*/
|
||||
|
@ -56,6 +56,35 @@ extern "C" {
|
||||
#include "rte_crypto.h"
|
||||
#include "rte_cryptodev.h"
|
||||
|
||||
|
||||
#define RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS 8
|
||||
#define RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS 2048
|
||||
|
||||
#define RTE_CRYPTODEV_PMD_NAME_ARG ("name")
|
||||
#define RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG ("max_nb_queue_pairs")
|
||||
#define RTE_CRYPTODEV_PMD_MAX_NB_SESS_ARG ("max_nb_sessions")
|
||||
#define RTE_CRYPTODEV_PMD_SOCKET_ID_ARG ("socket_id")
|
||||
|
||||
|
||||
static const char * const cryptodev_pmd_valid_params[] = {
|
||||
RTE_CRYPTODEV_PMD_NAME_ARG,
|
||||
RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG,
|
||||
RTE_CRYPTODEV_PMD_MAX_NB_SESS_ARG,
|
||||
RTE_CRYPTODEV_PMD_SOCKET_ID_ARG
|
||||
};
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* Initialisation parameters for crypto devices
|
||||
*/
|
||||
struct rte_cryptodev_pmd_init_params {
|
||||
char name[RTE_CRYPTODEV_NAME_MAX_LEN];
|
||||
size_t private_data_size;
|
||||
int socket_id;
|
||||
unsigned int max_nb_queue_pairs;
|
||||
unsigned int max_nb_sessions;
|
||||
};
|
||||
|
||||
/** Global structure used for maintaining state of allocated crypto devices */
|
||||
struct rte_cryptodev_global {
|
||||
struct rte_cryptodev *devs; /**< Device information array */
|
||||
@ -392,6 +421,63 @@ rte_cryptodev_pmd_allocate(const char *name, int socket_id);
|
||||
extern int
|
||||
rte_cryptodev_pmd_release_device(struct rte_cryptodev *cryptodev);
|
||||
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* PMD assist function to parse initialisation arguments for crypto driver
|
||||
* when creating a new crypto PMD device instance.
|
||||
*
|
||||
* PMD driver should set default values for that PMD before calling function,
|
||||
* these default values will be over-written with successfully parsed values
|
||||
* from args string.
|
||||
*
|
||||
* @param params parsed PMD initialisation parameters
|
||||
* @param args input argument string to parse
|
||||
*
|
||||
* @return
|
||||
* - 0 on success
|
||||
* - errno on failure
|
||||
*/
|
||||
int
|
||||
rte_cryptodev_pmd_parse_input_args(
|
||||
struct rte_cryptodev_pmd_init_params *params,
|
||||
const char *args);
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* PMD assist function to provide boiler plate code for crypto driver to create
|
||||
* and allocate resources for a new crypto PMD device instance.
|
||||
*
|
||||
* @param name crypto device name.
|
||||
* @param device base device instance
|
||||
* @param params PMD initialisation parameters
|
||||
*
|
||||
* @return
|
||||
* - crypto device instance on success
|
||||
* - NULL on creation failure
|
||||
*/
|
||||
struct rte_cryptodev *
|
||||
rte_cryptodev_pmd_create(const char *name,
|
||||
struct rte_device *device,
|
||||
struct rte_cryptodev_pmd_init_params *params);
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* PMD assist function to provide boiler plate code for crypto driver to
|
||||
* destroy and free resources associated with a crypto PMD device instance.
|
||||
*
|
||||
* @param cryptodev crypto device handle.
|
||||
*
|
||||
* @return
|
||||
* - 0 on success
|
||||
* - errno on failure
|
||||
*/
|
||||
int
|
||||
rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev);
|
||||
|
||||
/**
|
||||
* Executes all the user application registered callbacks for the specific
|
||||
* device.
|
||||
|
@ -84,5 +84,8 @@ DPDK_17.11 {
|
||||
global:
|
||||
|
||||
rte_cryptodev_name_get;
|
||||
rte_cryptodev_pmd_create;
|
||||
rte_cryptodev_pmd_destroy;
|
||||
rte_cryptodev_pmd_parse_input_args;
|
||||
|
||||
} DPDK_17.08;
|
||||
|
Loading…
x
Reference in New Issue
Block a user