crypto/bcmfs: optimize crypto request processing
[dpdk.git] / drivers / crypto / bcmfs / bcmfs_sym_pmd.c
index 0f96915..aa7fad6 100644 (file)
@@ -14,6 +14,8 @@
 #include "bcmfs_qp.h"
 #include "bcmfs_sym_pmd.h"
 #include "bcmfs_sym_req.h"
+#include "bcmfs_sym_session.h"
+#include "bcmfs_sym_capabilities.h"
 
 uint8_t cryptodev_bcmfs_driver_id;
 
@@ -65,6 +67,7 @@ bcmfs_sym_dev_info_get(struct rte_cryptodev *dev,
                dev_info->max_nb_queue_pairs = fsdev->max_hw_qps;
                /* No limit of number of sessions */
                dev_info->sym.max_nb_sessions = 0;
+               dev_info->capabilities = bcmfs_sym_get_capabilities();
        }
 }
 
@@ -129,6 +132,10 @@ static void
 spu_req_init(struct bcmfs_sym_request *sr, rte_iova_t iova __rte_unused)
 {
        memset(sr, 0, sizeof(*sr));
+       sr->fptr = iova + offsetof(struct bcmfs_sym_request, fmd);
+       sr->optr = iova + offsetof(struct bcmfs_sym_request, omd);
+       sr->dptr = iova + offsetof(struct bcmfs_sym_request, digest);
+       sr->rptr = iova + offsetof(struct bcmfs_sym_request, resp);
 }
 
 static void
@@ -228,6 +235,10 @@ static struct rte_cryptodev_ops crypto_bcmfs_ops = {
        /* Queue-Pair management */
        .queue_pair_setup       = bcmfs_sym_qp_setup,
        .queue_pair_release     = bcmfs_sym_qp_release,
+       /* Crypto session related operations */
+       .sym_session_get_size   = bcmfs_sym_session_get_private_size,
+       .sym_session_configure  = bcmfs_sym_session_configure,
+       .sym_session_clear      = bcmfs_sym_session_clear
 };
 
 /** Enqueue burst */
@@ -237,8 +248,10 @@ bcmfs_sym_pmd_enqueue_op_burst(void *queue_pair,
                               uint16_t nb_ops)
 {
        int i, j;
+       int retval;
        uint16_t enq = 0;
        struct bcmfs_sym_request *sreq;
+       struct bcmfs_sym_session *sess;
        struct bcmfs_qp *qp = (struct bcmfs_qp *)queue_pair;
 
        if (nb_ops == 0)
@@ -252,6 +265,10 @@ bcmfs_sym_pmd_enqueue_op_burst(void *queue_pair,
                nb_ops = qp->nb_descriptors - qp->nb_pending_requests;
 
        for (i = 0; i < nb_ops; i++) {
+               sess = bcmfs_sym_get_session(ops[i]);
+               if (unlikely(sess == NULL))
+                       goto enqueue_err;
+
                if (rte_mempool_get(qp->sr_mp, (void **)&sreq))
                        goto enqueue_err;
 
@@ -261,6 +278,11 @@ bcmfs_sym_pmd_enqueue_op_burst(void *queue_pair,
                /* save context */
                qp->infl_msgs[i] = &sreq->msgs;
                qp->infl_msgs[i]->ctx = (void *)sreq;
+
+               /* pre process the request crypto h/w acceleration */
+               retval = bcmfs_process_sym_crypto_op(ops[i], sess, sreq);
+               if (unlikely(retval < 0))
+                       goto enqueue_err;
        }
        /* Send burst request to hw QP */
        enq = bcmfs_enqueue_op_burst(qp, (void **)qp->infl_msgs, i);
@@ -277,6 +299,17 @@ enqueue_err:
        return enq;
 }
 
+static void bcmfs_sym_set_request_status(struct rte_crypto_op *op,
+                                        struct bcmfs_sym_request *out)
+{
+       if (*out->resp == BCMFS_SYM_RESPONSE_SUCCESS)
+               op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+       else if (*out->resp == BCMFS_SYM_RESPONSE_HASH_TAG_ERROR)
+               op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
+       else
+               op->status = RTE_CRYPTO_OP_STATUS_ERROR;
+}
+
 static uint16_t
 bcmfs_sym_pmd_dequeue_op_burst(void *queue_pair,
                               struct rte_crypto_op **ops,
@@ -296,6 +329,9 @@ bcmfs_sym_pmd_dequeue_op_burst(void *queue_pair,
        for (i = 0; i < deq; i++) {
                sreq = (struct bcmfs_sym_request *)qp->infl_msgs[i]->ctx;
 
+               /* set the status based on the response from the crypto h/w */
+               bcmfs_sym_set_request_status(sreq->op, sreq);
+
                ops[pkts++] = sreq->op;
 
                rte_mempool_put(qp->sr_mp, sreq);
@@ -356,6 +392,7 @@ bcmfs_sym_dev_create(struct bcmfs_device *fsdev)
        fsdev->sym_dev = internals;
 
        internals->sym_dev_id = cryptodev->data->dev_id;
+       internals->fsdev_capabilities = bcmfs_sym_get_capabilities();
 
        BCMFS_LOG(DEBUG, "Created bcmfs-sym device %s as cryptodev instance %d",
                  cryptodev->data->name, internals->sym_dev_id);