snow3g: add driver for SNOW 3G library
[dpdk.git] / lib / librte_cryptodev / rte_cryptodev.h
index aab8cff..53cca22 100644 (file)
@@ -48,6 +48,7 @@
 extern "C" {
 #endif
 
+#include "rte_kvargs.h"
 #include "rte_crypto.h"
 #include "rte_dev.h"
 
@@ -57,15 +58,17 @@ extern "C" {
 /**< AES-NI Multi buffer PMD device name */
 #define CRYPTODEV_NAME_QAT_SYM_PMD     ("cryptodev_qat_sym_pmd")
 /**< Intel QAT Symmetric Crypto PMD device name */
+#define CRYPTODEV_NAME_SNOW3G_PMD      ("cryptodev_snow3g_pmd")
+/**< SNOW 3G PMD device name */
 
 /** Crypto device type */
 enum rte_cryptodev_type {
        RTE_CRYPTODEV_NULL_PMD = 1,     /**< Null crypto PMD */
        RTE_CRYPTODEV_AESNI_MB_PMD,     /**< AES-NI multi buffer PMD */
        RTE_CRYPTODEV_QAT_SYM_PMD,      /**< QAT PMD Symmetric Crypto */
+       RTE_CRYPTODEV_SNOW3G_PMD,       /**< SNOW 3G PMD */
 };
 
-
 extern const char **rte_cyptodev_names;
 
 /* Logging Macros */
@@ -148,6 +151,121 @@ struct rte_cryptodev_stats {
        /**< Total error count on operations dequeued */
 };
 
+#define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS  8
+#define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS     2048
+
+/**
+ * @internal
+ * Initialisation parameters for virtual crypto devices
+ */
+struct rte_crypto_vdev_init_params {
+       unsigned max_nb_queue_pairs;
+       unsigned max_nb_sessions;
+       uint8_t socket_id;
+};
+
+#define RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG               ("max_nb_queue_pairs")
+#define RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG             ("max_nb_sessions")
+#define RTE_CRYPTODEV_VDEV_SOCKET_ID                   ("socket_id")
+
+static const char *cryptodev_vdev_valid_params[] = {
+       RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG,
+       RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG,
+       RTE_CRYPTODEV_VDEV_SOCKET_ID
+};
+
+static inline uint8_t
+number_of_sockets(void)
+{
+       int sockets = 0;
+       int i;
+       const struct rte_memseg *ms = rte_eal_get_physmem_layout();
+
+       for (i = 0; ((i < RTE_MAX_MEMSEG) && (ms[i].addr != NULL)); i++) {
+               if (sockets < ms[i].socket_id)
+                       sockets = ms[i].socket_id;
+       }
+
+       /* Number of sockets = maximum socket_id + 1 */
+       return ++sockets;
+}
+
+/** Parse integer from integer argument */
+static inline int
+__rte_cryptodev_parse_integer_arg(const char *key __rte_unused,
+               const char *value, void *extra_args)
+{
+       int *i = (int *) extra_args;
+
+       *i = atoi(value);
+       if (*i < 0) {
+               CDEV_LOG_ERR("Argument has to be positive.");
+               return -1;
+       }
+
+       return 0;
+}
+
+/**
+ * Parse virtual device initialisation parameters input arguments
+ * @internal
+ *
+ * @params     params          Initialisation parameters with defaults set.
+ * @params     input_args      Command line arguments
+ *
+ * @return
+ * 0 on successful parse
+ * <0 on failure to parse
+ */
+static inline int
+rte_cryptodev_parse_vdev_init_params(struct rte_crypto_vdev_init_params *params,
+               const char *input_args)
+{
+       struct rte_kvargs *kvlist;
+       int ret;
+
+       if (params == NULL)
+               return -EINVAL;
+
+       if (input_args) {
+               kvlist = rte_kvargs_parse(input_args,
+                               cryptodev_vdev_valid_params);
+               if (kvlist == NULL)
+                       return -1;
+
+               ret = rte_kvargs_process(kvlist,
+                                       RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG,
+                                       &__rte_cryptodev_parse_integer_arg,
+                                       &params->max_nb_queue_pairs);
+               if (ret < 0)
+                       goto free_kvlist;
+
+               ret = rte_kvargs_process(kvlist,
+                                       RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG,
+                                       &__rte_cryptodev_parse_integer_arg,
+                                       &params->max_nb_sessions);
+               if (ret < 0)
+                       goto free_kvlist;
+
+               ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_SOCKET_ID,
+                                       &__rte_cryptodev_parse_integer_arg,
+                                       &params->socket_id);
+               if (ret < 0)
+                       goto free_kvlist;
+
+               if (params->socket_id >= number_of_sockets()) {
+                       CDEV_LOG_ERR("Invalid socket id specified to create "
+                               "the virtual crypto device on");
+                       goto free_kvlist;
+               }
+       }
+
+       return 0;
+
+free_kvlist:
+       rte_kvargs_free(kvlist);
+       return ret;
+}
 
 /**
  * Create a virtual crypto device