cryptodev: store device pointer in virtual devices
[dpdk.git] / lib / librte_cryptodev / rte_cryptodev.c
index 0ac23ed..2b2f0fe 100644 (file)
@@ -233,28 +233,12 @@ rte_crypto_auth_operation_strings[] = {
                [RTE_CRYPTO_AUTH_OP_GENERATE]   = "generate"
 };
 
-static 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 int
 parse_integer_arg(const char *key __rte_unused,
                const char *value, void *extra_args)
 {
-       int *i = (int *) extra_args;
+       int *i = extra_args;
 
        *i = atoi(value);
        if (*i < 0) {
@@ -325,12 +309,6 @@ rte_cryptodev_parse_vdev_init_params(struct rte_crypto_vdev_init_params *params,
                                        params);
                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;
-               }
        }
 
 free_kvlist:
@@ -439,7 +417,7 @@ rte_cryptodev_get_feature_name(uint64_t flag)
 int
 rte_cryptodev_create_vdev(const char *name, const char *args)
 {
-       return rte_eal_vdev_init(name, args);
+       return rte_vdev_init(name, args);
 }
 
 struct rte_cryptodev *
@@ -673,7 +651,7 @@ rte_cryptodev_pmd_release_device(struct rte_cryptodev *cryptodev)
 
 struct rte_cryptodev *
 rte_cryptodev_pmd_virtual_dev_init(const char *name, size_t dev_private_size,
-               int socket_id)
+               int socket_id, struct rte_vdev_device *vdev)
 {
        struct rte_cryptodev *cryptodev;
 
@@ -695,6 +673,8 @@ rte_cryptodev_pmd_virtual_dev_init(const char *name, size_t dev_private_size,
                                        " data");
        }
 
+       cryptodev->device = &vdev->device;
+
        /* initialise user call-back tail queue */
        TAILQ_INIT(&(cryptodev->link_intr_cbs));
 
@@ -716,7 +696,7 @@ rte_cryptodev_pci_probe(struct rte_pci_driver *pci_drv,
        if (cryptodrv == NULL)
                return -ENODEV;
 
-       rte_eal_pci_device_name(&pci_dev->addr, cryptodev_name,
+       rte_pci_device_name(&pci_dev->addr, cryptodev_name,
                        sizeof(cryptodev_name));
 
        cryptodev = rte_cryptodev_pmd_allocate(cryptodev_name, rte_socket_id());
@@ -772,7 +752,7 @@ rte_cryptodev_pci_remove(struct rte_pci_device *pci_dev)
        if (pci_dev == NULL)
                return -EINVAL;
 
-       rte_eal_pci_device_name(&pci_dev->addr, cryptodev_name,
+       rte_pci_device_name(&pci_dev->addr, cryptodev_name,
                        sizeof(cryptodev_name));
 
        cryptodev = rte_cryptodev_pmd_get_named_dev(cryptodev_name);
@@ -957,6 +937,8 @@ rte_cryptodev_configure(uint8_t dev_id, struct rte_cryptodev_config *config)
                return -EBUSY;
        }
 
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_configure, -ENOTSUP);
+
        /* Setup new number of queue pairs and reconfigure device. */
        diag = rte_cryptodev_queue_pairs_config(dev, config->nb_queue_pairs,
                        config->socket_id);
@@ -967,10 +949,14 @@ rte_cryptodev_configure(uint8_t dev_id, struct rte_cryptodev_config *config)
        }
 
        /* Setup Session mempool for device */
-       return rte_cryptodev_sym_session_pool_create(dev,
+       diag = rte_cryptodev_sym_session_pool_create(dev,
                        config->session_mp.nb_objs,
                        config->session_mp.cache_size,
                        config->socket_id);
+       if (diag != 0)
+               return diag;
+
+       return (*dev->dev_ops->dev_configure)(dev, config);
 }
 
 
@@ -1377,7 +1363,7 @@ rte_cryptodev_sym_session_create(uint8_t dev_id,
                return NULL;
        }
 
-       sess = (struct rte_cryptodev_sym_session *)_sess;
+       sess = _sess;
 
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->session_configure, NULL);
        if (dev->dev_ops->session_configure(dev, xform, sess->_private) ==
@@ -1393,6 +1379,53 @@ rte_cryptodev_sym_session_create(uint8_t dev_id,
        return sess;
 }
 
+int
+rte_cryptodev_queue_pair_attach_sym_session(uint16_t qp_id,
+               struct rte_cryptodev_sym_session *sess)
+{
+       struct rte_cryptodev *dev;
+
+       if (!rte_cryptodev_pmd_is_valid_dev(sess->dev_id)) {
+               CDEV_LOG_ERR("Invalid dev_id=%d", sess->dev_id);
+               return -EINVAL;
+       }
+
+       dev = &rte_crypto_devices[sess->dev_id];
+
+       /* The API is optional, not returning error if driver do not suuport */
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->qp_attach_session, 0);
+       if (dev->dev_ops->qp_attach_session(dev, qp_id, sess->_private)) {
+               CDEV_LOG_ERR("dev_id %d failed to attach qp: %d with session",
+                               sess->dev_id, qp_id);
+               return -EPERM;
+       }
+
+       return 0;
+}
+
+int
+rte_cryptodev_queue_pair_detach_sym_session(uint16_t qp_id,
+               struct rte_cryptodev_sym_session *sess)
+{
+       struct rte_cryptodev *dev;
+
+       if (!rte_cryptodev_pmd_is_valid_dev(sess->dev_id)) {
+               CDEV_LOG_ERR("Invalid dev_id=%d", sess->dev_id);
+               return -EINVAL;
+       }
+
+       dev = &rte_crypto_devices[sess->dev_id];
+
+       /* The API is optional, not returning error if driver do not suuport */
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->qp_detach_session, 0);
+       if (dev->dev_ops->qp_detach_session(dev, qp_id, sess->_private)) {
+               CDEV_LOG_ERR("dev_id %d failed to detach qp: %d from session",
+                               sess->dev_id, qp_id);
+               return -EPERM;
+       }
+
+       return 0;
+}
 struct rte_cryptodev_sym_session *
 rte_cryptodev_sym_session_free(uint8_t dev_id,
                struct rte_cryptodev_sym_session *sess)