cryptodev: pass IV as offset
[dpdk.git] / drivers / crypto / dpaa2_sec / dpaa2_sec_dpseci.c
index 680cace..1605701 100644 (file)
@@ -87,6 +87,8 @@ build_authenc_fd(dpaa2_sec_session *sess,
        int icv_len = sym_op->auth.digest.length;
        uint8_t *old_icv;
        uint32_t mem_len = (7 * sizeof(struct qbman_fle)) + icv_len;
+       uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op, uint8_t *,
+                       op->sym->cipher.iv.offset);
 
        PMD_INIT_FUNC_TRACE();
 
@@ -178,7 +180,7 @@ build_authenc_fd(dpaa2_sec_session *sess,
                         sym_op->auth.digest.length);
 
        /* Configure Input SGE for Encap/Decap */
-       DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(sym_op->cipher.iv.data));
+       DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(iv_ptr));
        sge->length = sym_op->cipher.iv.length;
        sge++;
 
@@ -307,6 +309,8 @@ build_cipher_fd(dpaa2_sec_session *sess, struct rte_crypto_op *op,
        uint32_t mem_len = (5 * sizeof(struct qbman_fle));
        struct sec_flow_context *flc;
        struct ctxt_priv *priv = sess->ctxt;
+       uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op, uint8_t *,
+                       op->sym->cipher.iv.offset);
 
        PMD_INIT_FUNC_TRACE();
 
@@ -369,7 +373,7 @@ build_cipher_fd(dpaa2_sec_session *sess, struct rte_crypto_op *op,
 
        DPAA2_SET_FLE_SG_EXT(fle);
 
-       DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(sym_op->cipher.iv.data));
+       DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(iv_ptr));
        sge->length = sym_op->cipher.iv.length;
 
        sge++;
@@ -437,7 +441,7 @@ dpaa2_sec_enqueue_burst(void *qp, struct rte_crypto_op **ops,
        if (unlikely(nb_ops == 0))
                return 0;
 
-       if (ops[0]->sym->sess_type != RTE_CRYPTO_SYM_OP_WITH_SESSION) {
+       if (ops[0]->sess_type != RTE_CRYPTO_OP_WITH_SESSION) {
                RTE_LOG(ERR, PMD, "sessionless crypto op not supported\n");
                return 0;
        }
@@ -1387,12 +1391,88 @@ dpaa2_sec_dev_infos_get(struct rte_cryptodev *dev,
        }
 }
 
+static
+void dpaa2_sec_stats_get(struct rte_cryptodev *dev,
+                        struct rte_cryptodev_stats *stats)
+{
+       struct dpaa2_sec_dev_private *priv = dev->data->dev_private;
+       struct fsl_mc_io *dpseci = (struct fsl_mc_io *)priv->hw;
+       struct dpseci_sec_counters counters = {0};
+       struct dpaa2_sec_qp **qp = (struct dpaa2_sec_qp **)
+                                       dev->data->queue_pairs;
+       int ret, i;
+
+       PMD_INIT_FUNC_TRACE();
+       if (stats == NULL) {
+               PMD_DRV_LOG(ERR, "invalid stats ptr NULL");
+               return;
+       }
+       for (i = 0; i < dev->data->nb_queue_pairs; i++) {
+               if (qp[i] == NULL) {
+                       PMD_DRV_LOG(DEBUG, "Uninitialised queue pair");
+                       continue;
+               }
+
+               stats->enqueued_count += qp[i]->tx_vq.tx_pkts;
+               stats->dequeued_count += qp[i]->rx_vq.rx_pkts;
+               stats->enqueue_err_count += qp[i]->tx_vq.err_pkts;
+               stats->dequeue_err_count += qp[i]->rx_vq.err_pkts;
+       }
+
+       ret = dpseci_get_sec_counters(dpseci, CMD_PRI_LOW, priv->token,
+                                     &counters);
+       if (ret) {
+               PMD_DRV_LOG(ERR, "dpseci_get_sec_counters failed\n");
+       } else {
+               PMD_DRV_LOG(INFO, "dpseci hw stats:"
+                           "\n\tNumber of Requests Dequeued = %lu"
+                           "\n\tNumber of Outbound Encrypt Requests = %lu"
+                           "\n\tNumber of Inbound Decrypt Requests = %lu"
+                           "\n\tNumber of Outbound Bytes Encrypted = %lu"
+                           "\n\tNumber of Outbound Bytes Protected = %lu"
+                           "\n\tNumber of Inbound Bytes Decrypted = %lu"
+                           "\n\tNumber of Inbound Bytes Validated = %lu",
+                           counters.dequeued_requests,
+                           counters.ob_enc_requests,
+                           counters.ib_dec_requests,
+                           counters.ob_enc_bytes,
+                           counters.ob_prot_bytes,
+                           counters.ib_dec_bytes,
+                           counters.ib_valid_bytes);
+       }
+}
+
+static
+void dpaa2_sec_stats_reset(struct rte_cryptodev *dev)
+{
+       int i;
+       struct dpaa2_sec_qp **qp = (struct dpaa2_sec_qp **)
+                                  (dev->data->queue_pairs);
+
+       PMD_INIT_FUNC_TRACE();
+
+       for (i = 0; i < dev->data->nb_queue_pairs; i++) {
+               if (qp[i] == NULL) {
+                       PMD_DRV_LOG(DEBUG, "Uninitialised queue pair");
+                       continue;
+               }
+               qp[i]->tx_vq.rx_pkts = 0;
+               qp[i]->tx_vq.tx_pkts = 0;
+               qp[i]->tx_vq.err_pkts = 0;
+               qp[i]->rx_vq.rx_pkts = 0;
+               qp[i]->rx_vq.tx_pkts = 0;
+               qp[i]->rx_vq.err_pkts = 0;
+       }
+}
+
 static struct rte_cryptodev_ops crypto_ops = {
        .dev_configure        = dpaa2_sec_dev_configure,
        .dev_start            = dpaa2_sec_dev_start,
        .dev_stop             = dpaa2_sec_dev_stop,
        .dev_close            = dpaa2_sec_dev_close,
        .dev_infos_get        = dpaa2_sec_dev_infos_get,
+       .stats_get            = dpaa2_sec_stats_get,
+       .stats_reset          = dpaa2_sec_stats_reset,
        .queue_pair_setup     = dpaa2_sec_queue_pair_setup,
        .queue_pair_release   = dpaa2_sec_queue_pair_release,
        .queue_pair_start     = dpaa2_sec_queue_pair_start,
@@ -1405,8 +1485,7 @@ static struct rte_cryptodev_ops crypto_ops = {
 };
 
 static int
-dpaa2_sec_uninit(const struct rte_cryptodev_driver *crypto_drv __rte_unused,
-                struct rte_cryptodev *dev)
+dpaa2_sec_uninit(const struct rte_cryptodev *dev)
 {
        PMD_INIT_LOG(INFO, "Closing DPAA2_SEC device %s on numa socket %u\n",
                     dev->data->name, rte_socket_id());
@@ -1495,7 +1574,7 @@ init_error:
 }
 
 static int
-cryptodev_dpaa2_sec_probe(struct rte_dpaa2_driver *dpaa2_drv,
+cryptodev_dpaa2_sec_probe(struct rte_dpaa2_driver *dpaa2_drv __rte_unused,
                          struct rte_dpaa2_device *dpaa2_dev)
 {
        struct rte_cryptodev *cryptodev;
@@ -1523,7 +1602,6 @@ cryptodev_dpaa2_sec_probe(struct rte_dpaa2_driver *dpaa2_drv,
 
        dpaa2_dev->cryptodev = cryptodev;
        cryptodev->device = &dpaa2_dev->device;
-       cryptodev->driver = (struct rte_cryptodev_driver *)dpaa2_drv;
 
        /* init user callbacks */
        TAILQ_INIT(&(cryptodev->link_intr_cbs));
@@ -1551,7 +1629,7 @@ cryptodev_dpaa2_sec_remove(struct rte_dpaa2_device *dpaa2_dev)
        if (cryptodev == NULL)
                return -ENODEV;
 
-       ret = dpaa2_sec_uninit(NULL, cryptodev);
+       ret = dpaa2_sec_uninit(cryptodev);
        if (ret)
                return ret;
 
@@ -1562,7 +1640,6 @@ cryptodev_dpaa2_sec_remove(struct rte_dpaa2_device *dpaa2_dev)
                rte_free(cryptodev->data->dev_private);
 
        cryptodev->device = NULL;
-       cryptodev->driver = NULL;
        cryptodev->data = NULL;
 
        return 0;