Add crypto device operations for zsda devices.

Signed-off-by: Hanxiao Li <li.hanx...@zte.com.cn>
---
 drivers/crypto/zsda/zsda_sym_pmd.c | 94 ++++++++++++++++++++++++++++--
 1 file changed, 89 insertions(+), 5 deletions(-)

diff --git a/drivers/crypto/zsda/zsda_sym_pmd.c 
b/drivers/crypto/zsda/zsda_sym_pmd.c
index 0f4bf41958..22c8d482fb 100644
--- a/drivers/crypto/zsda/zsda_sym_pmd.c
+++ b/drivers/crypto/zsda/zsda_sym_pmd.c
@@ -8,13 +8,95 @@
 
 uint8_t zsda_sym_driver_id;
 
+static int
+zsda_sym_dev_config(__rte_unused struct rte_cryptodev *dev,
+                   __rte_unused struct rte_cryptodev_config *config)
+{
+       return ZSDA_SUCCESS;
+}
+
+static int
+zsda_sym_dev_start(struct rte_cryptodev *dev)
+{
+       struct zsda_sym_dev_private *sym_dev = dev->data->dev_private;
+       int ret;
+
+       ret = zsda_queue_start(sym_dev->zsda_pci_dev->pci_dev);
+
+       return ret;
+}
+
+static void
+zsda_sym_dev_stop(struct rte_cryptodev *dev)
+{
+       struct zsda_sym_dev_private *sym_dev = dev->data->dev_private;
+
+       zsda_queue_stop(sym_dev->zsda_pci_dev->pci_dev);
+}
+
+static int
+zsda_sym_qp_release(struct rte_cryptodev *dev, uint16_t queue_pair_id)
+{
+       return zsda_queue_pair_release(
+               (struct zsda_qp **)&(dev->data->queue_pairs[queue_pair_id]));
+}
+
+static int
+zsda_sym_dev_close(struct rte_cryptodev *dev)
+{
+       int ret = ZSDA_SUCCESS;
+       uint16_t i;
+
+       for (i = 0; i < dev->data->nb_queue_pairs; i++)
+               ret |= zsda_sym_qp_release(dev, i);
+
+       return ret;
+}
+
+static uint16_t
+zsda_sym_max_nb_qps(void)
+{
+       uint16_t encrypt = zsda_nb_qps.encrypt;
+       uint16_t decrypt = zsda_nb_qps.decrypt;
+       uint16_t hash = zsda_nb_qps.hash;
+       uint16_t min = 0;
+
+       if ((encrypt == MAX_QPS_ON_FUNCTION) ||
+               (decrypt == MAX_QPS_ON_FUNCTION) ||
+           (hash == MAX_QPS_ON_FUNCTION))
+               min = MAX_QPS_ON_FUNCTION;
+       else {
+               min = (encrypt < decrypt) ? encrypt : decrypt;
+               min = (min < hash) ? min : hash;
+       }
+
+       if (min == 0)
+               return MAX_QPS_ON_FUNCTION;
+       return min;
+}
+
+static void
+zsda_sym_dev_info_get(struct rte_cryptodev *dev,
+                     struct rte_cryptodev_info *info)
+{
+       struct zsda_sym_dev_private *sym_dev_priv = dev->data->dev_private;
+
+       if (info != NULL) {
+               info->max_nb_queue_pairs = zsda_sym_max_nb_qps();
+               info->feature_flags = dev->feature_flags;
+               info->capabilities = sym_dev_priv->zsda_dev_capabilities;
+               info->driver_id = zsda_sym_driver_id;
+               info->sym.max_nb_sessions = 0;
+       }
+}
+
 static struct rte_cryptodev_ops crypto_zsda_ops = {
 
-       .dev_configure = NULL,
-       .dev_start = NULL,
-       .dev_stop = NULL,
-       .dev_close = NULL,
-       .dev_infos_get = NULL,
+       .dev_configure = zsda_sym_dev_config,
+       .dev_start = zsda_sym_dev_start,
+       .dev_stop = zsda_sym_dev_stop,
+       .dev_close = zsda_sym_dev_close,
+       .dev_infos_get = zsda_sym_dev_info_get,
 
        .stats_get = NULL,
        .stats_reset = NULL,
@@ -104,6 +186,8 @@ zsda_sym_dev_destroy(struct zsda_pci_device *zsda_pci_dev)
        if (rte_eal_process_type() == RTE_PROC_PRIMARY)
                rte_memzone_free(sym_dev_priv->capa_mz);
 
+       zsda_sym_dev_close(sym_dev_priv->cryptodev);
+
        rte_cryptodev_pmd_destroy(sym_dev_priv->cryptodev);
        zsda_devs[zsda_pci_dev->zsda_dev_id].sym_rte_dev.name = NULL;
        zsda_pci_dev->sym_dev_priv = NULL;
-- 
2.27.0

Reply via email to