]> git.droids-corp.org - dpdk.git/commitdiff
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 3298ef56646fa21a38c6c264293d0d0b4d009723..b265c2ead9ceaf5a6827fa9e208b7f2d5d26c336 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 b74bbdd25c82069e72a33b7a96988ceab5c10305..9037534f902a2cec5bb7f4a9bb07d0969439c721 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 ec6eeffa10bc29c630774283ff78f8dadbb76b8c..50b3035c6e55890e0a353956d1ab3575dd73ad49 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 ba074e1993713c404778e1286457496d1a85bc04..744405e2f5edd1286b70ee7a8040e396460a21af 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 919b6cc7bb1b08ea34c432d94673c5570b058ea8..a0ea7bf68bbcd9a5a8036e66e6e749aa86f8a0b0 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;