cryptodev: add APIs to assist PMD initialisation
authorDeclan Doherty <declan.doherty@intel.com>
Wed, 25 Oct 2017 12:00:34 +0000 (13:00 +0100)
committerPablo de Lara <pablo.de.lara.guarch@intel.com>
Wed, 25 Oct 2017 16:11:01 +0000 (18:11 +0200)
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>
doc/guides/rel_notes/release_17_11.rst
lib/librte_cryptodev/rte_cryptodev.h
lib/librte_cryptodev/rte_cryptodev_pmd.c
lib/librte_cryptodev/rte_cryptodev_pmd.h
lib/librte_cryptodev/rte_cryptodev_version.map

index 3298ef5..b265c2e 100644 (file)
@@ -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:
index b74bbdd..9037534 100644 (file)
@@ -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(...) \
index ec6eeff..50b3035 100644 (file)
 #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,
+                               &params->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,
+                               &params->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,
+                               &params->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
  */
index ba074e1..744405e 100644 (file)
@@ -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.
index 919b6cc..a0ea7bf 100644 (file)
@@ -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;