net/iavf: replace license text with SPDX tag
[dpdk.git] / drivers / crypto / dpaa_sec / dpaa_sec.c
index 2e77a8a..122c80a 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
  *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
- *   Copyright 2017-2018 NXP
+ *   Copyright 2017-2019 NXP
  *
  */
 
@@ -61,7 +61,7 @@ dpaa_sec_op_ending(struct dpaa_sec_op_ctx *ctx)
                ctx->op->status = RTE_CRYPTO_OP_STATUS_ERROR;
        }
 
-       /* report op status to sym->op and then free the ctx memeory  */
+       /* report op status to sym->op and then free the ctx memory  */
        rte_mempool_put(ctx->ctx_pool, (void *)ctx);
 }
 
@@ -643,7 +643,7 @@ dpaa_sec_prep_cdb(dpaa_sec_session *ses)
 
                shared_desc_len = cnstr_shdsc_blkcipher(
                                                cdb->sh_desc, true,
-                                               swap, &alginfo_c,
+                                               swap, SHR_NEVER, &alginfo_c,
                                                NULL,
                                                ses->iv.length,
                                                ses->dir);
@@ -660,7 +660,7 @@ dpaa_sec_prep_cdb(dpaa_sec_session *ses)
                alginfo_a.key_type = RTA_DATA_IMM;
 
                shared_desc_len = cnstr_shdsc_hmac(cdb->sh_desc, true,
-                                                  swap, &alginfo_a,
+                                                  swap, SHR_NEVER, &alginfo_a,
                                                   !ses->dir,
                                                   ses->digest_length);
        } else if (is_aead(ses)) {
@@ -676,13 +676,13 @@ dpaa_sec_prep_cdb(dpaa_sec_session *ses)
 
                if (ses->dir == DIR_ENC)
                        shared_desc_len = cnstr_shdsc_gcm_encap(
-                                       cdb->sh_desc, true, swap,
+                                       cdb->sh_desc, true, swap, SHR_NEVER,
                                        &alginfo,
                                        ses->iv.length,
                                        ses->digest_length);
                else
                        shared_desc_len = cnstr_shdsc_gcm_decap(
-                                       cdb->sh_desc, true, swap,
+                                       cdb->sh_desc, true, swap, SHR_NEVER,
                                        &alginfo,
                                        ses->iv.length,
                                        ses->digest_length);
@@ -741,7 +741,7 @@ dpaa_sec_prep_cdb(dpaa_sec_session *ses)
                 * overwritten in fd for each packet.
                 */
                shared_desc_len = cnstr_shdsc_authenc(cdb->sh_desc,
-                               true, swap, &alginfo_c, &alginfo_a,
+                               true, swap, SHR_SERIAL, &alginfo_c, &alginfo_a,
                                ses->iv.length, 0,
                                ses->digest_length, ses->dir);
        }
@@ -1683,15 +1683,18 @@ dpaa_sec_enqueue_burst(void *qp, struct rte_crypto_op **ops,
                                nb_ops = loop;
                                goto send_pkts;
                        }
-                       if (unlikely(!ses->qp)) {
+                       if (unlikely(!ses->qp[rte_lcore_id() % MAX_DPAA_CORES])) {
                                if (dpaa_sec_attach_sess_q(qp, ses)) {
                                        frames_to_send = loop;
                                        nb_ops = loop;
                                        goto send_pkts;
                                }
-                       } else if (unlikely(ses->qp != qp)) {
+                       } else if (unlikely(ses->qp[rte_lcore_id() %
+                                               MAX_DPAA_CORES] != qp)) {
                                DPAA_SEC_DP_ERR("Old:sess->qp = %p"
-                                       " New qp = %p\n", ses->qp, qp);
+                                       " New qp = %p\n",
+                                       ses->qp[rte_lcore_id() %
+                                       MAX_DPAA_CORES], qp);
                                frames_to_send = loop;
                                nb_ops = loop;
                                goto send_pkts;
@@ -1743,7 +1746,7 @@ dpaa_sec_enqueue_burst(void *qp, struct rte_crypto_op **ops,
                        }
 
                        fd = &fds[loop];
-                       inq[loop] = ses->inq;
+                       inq[loop] = ses->inq[rte_lcore_id() % MAX_DPAA_CORES];
                        fd->opaque_addr = 0;
                        fd->cmd = 0;
                        qm_fd_addr_set64(fd, dpaa_mem_vtop(cf->sg));
@@ -1937,13 +1940,13 @@ dpaa_sec_attach_rxq(struct dpaa_sec_dev_private *qi)
 {
        unsigned int i;
 
-       for (i = 0; i < qi->max_nb_sessions; i++) {
+       for (i = 0; i < qi->max_nb_sessions * MAX_DPAA_CORES; i++) {
                if (qi->inq_attach[i] == 0) {
                        qi->inq_attach[i] = 1;
                        return &qi->inq[i];
                }
        }
-       DPAA_SEC_WARN("All ses session in use %x", qi->max_nb_sessions);
+       DPAA_SEC_WARN("All session in use %u", qi->max_nb_sessions);
 
        return NULL;
 }
@@ -1969,7 +1972,7 @@ dpaa_sec_attach_sess_q(struct dpaa_sec_qp *qp, dpaa_sec_session *sess)
 {
        int ret;
 
-       sess->qp = qp;
+       sess->qp[rte_lcore_id() % MAX_DPAA_CORES] = qp;
        ret = dpaa_sec_prep_cdb(sess);
        if (ret) {
                DPAA_SEC_ERR("Unable to prepare sec cdb");
@@ -1982,7 +1985,8 @@ dpaa_sec_attach_sess_q(struct dpaa_sec_qp *qp, dpaa_sec_session *sess)
                        return ret;
                }
        }
-       ret = dpaa_sec_init_rx(sess->inq, dpaa_mem_vtop(&sess->cdb),
+       ret = dpaa_sec_init_rx(sess->inq[rte_lcore_id() % MAX_DPAA_CORES],
+                              dpaa_mem_vtop(&sess->cdb),
                               qman_fq_fqid(&qp->outq));
        if (ret)
                DPAA_SEC_ERR("Unable to init sec queue");
@@ -1996,6 +2000,7 @@ dpaa_sec_set_session_parameters(struct rte_cryptodev *dev,
 {
        struct dpaa_sec_dev_private *internals = dev->data->dev_private;
        dpaa_sec_session *session = sess;
+       uint32_t i;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -2052,12 +2057,15 @@ dpaa_sec_set_session_parameters(struct rte_cryptodev *dev,
        }
        session->ctx_pool = internals->ctx_pool;
        rte_spinlock_lock(&internals->lock);
-       session->inq = dpaa_sec_attach_rxq(internals);
-       rte_spinlock_unlock(&internals->lock);
-       if (session->inq == NULL) {
-               DPAA_SEC_ERR("unable to attach sec queue");
-               goto err1;
+       for (i = 0; i < MAX_DPAA_CORES; i++) {
+               session->inq[i] = dpaa_sec_attach_rxq(internals);
+               if (session->inq[i] == NULL) {
+                       DPAA_SEC_ERR("unable to attach sec queue");
+                       rte_spinlock_unlock(&internals->lock);
+                       goto err1;
+               }
        }
+       rte_spinlock_unlock(&internals->lock);
 
        return 0;
 
@@ -2107,7 +2115,7 @@ dpaa_sec_sym_session_clear(struct rte_cryptodev *dev,
                struct rte_cryptodev_sym_session *sess)
 {
        struct dpaa_sec_dev_private *qi = dev->data->dev_private;
-       uint8_t index = dev->driver_id;
+       uint8_t index = dev->driver_id, i;
        void *sess_priv = get_sym_session_private_data(sess, index);
 
        PMD_INIT_FUNC_TRACE();
@@ -2117,8 +2125,12 @@ dpaa_sec_sym_session_clear(struct rte_cryptodev *dev,
        if (sess_priv) {
                struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
 
-               if (s->inq)
-                       dpaa_sec_detach_rxq(qi, s->inq);
+               for (i = 0; i < MAX_DPAA_CORES; i++) {
+                       if (s->inq[i])
+                               dpaa_sec_detach_rxq(qi, s->inq[i]);
+                       s->inq[i] = NULL;
+                       s->qp[i] = NULL;
+               }
                rte_free(s->cipher_key.data);
                rte_free(s->auth_key.data);
                memset(s, 0, sizeof(dpaa_sec_session));
@@ -2137,6 +2149,7 @@ dpaa_sec_set_ipsec_session(__rte_unused struct rte_cryptodev *dev,
        struct rte_crypto_auth_xform *auth_xform = NULL;
        struct rte_crypto_cipher_xform *cipher_xform = NULL;
        dpaa_sec_session *session = (dpaa_sec_session *)sess;
+       uint32_t i;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -2256,12 +2269,15 @@ dpaa_sec_set_ipsec_session(__rte_unused struct rte_cryptodev *dev,
                goto out;
        session->ctx_pool = internals->ctx_pool;
        rte_spinlock_lock(&internals->lock);
-       session->inq = dpaa_sec_attach_rxq(internals);
-       rte_spinlock_unlock(&internals->lock);
-       if (session->inq == NULL) {
-               DPAA_SEC_ERR("unable to attach sec queue");
-               goto out;
+       for (i = 0; i < MAX_DPAA_CORES; i++) {
+               session->inq[i] = dpaa_sec_attach_rxq(internals);
+               if (session->inq[i] == NULL) {
+                       DPAA_SEC_ERR("unable to attach sec queue");
+                       rte_spinlock_unlock(&internals->lock);
+                       goto out;
+               }
        }
+       rte_spinlock_unlock(&internals->lock);
 
        return 0;
 out:
@@ -2282,6 +2298,7 @@ dpaa_sec_set_pdcp_session(struct rte_cryptodev *dev,
        struct rte_crypto_cipher_xform *cipher_xform = NULL;
        dpaa_sec_session *session = (dpaa_sec_session *)sess;
        struct dpaa_sec_dev_private *dev_priv = dev->data->dev_private;
+       uint32_t i;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -2363,12 +2380,15 @@ dpaa_sec_set_pdcp_session(struct rte_cryptodev *dev,
 
        session->ctx_pool = dev_priv->ctx_pool;
        rte_spinlock_lock(&dev_priv->lock);
-       session->inq = dpaa_sec_attach_rxq(dev_priv);
-       rte_spinlock_unlock(&dev_priv->lock);
-       if (session->inq == NULL) {
-               DPAA_SEC_ERR("unable to attach sec queue");
-               goto out;
+       for (i = 0; i < MAX_DPAA_CORES; i++) {
+               session->inq[i] = dpaa_sec_attach_rxq(dev_priv);
+               if (session->inq[i] == NULL) {
+                       DPAA_SEC_ERR("unable to attach sec queue");
+                       rte_spinlock_unlock(&dev_priv->lock);
+                       goto out;
+               }
        }
+       rte_spinlock_unlock(&dev_priv->lock);
        return 0;
 out:
        rte_free(session->auth_key.data);
@@ -2433,7 +2453,7 @@ dpaa_sec_security_session_destroy(void *dev __rte_unused,
 
                rte_free(s->cipher_key.data);
                rte_free(s->auth_key.data);
-               memset(sess, 0, sizeof(dpaa_sec_session));
+               memset(s, 0, sizeof(dpaa_sec_session));
                set_sec_session_private_data(sess, NULL);
                rte_mempool_put(sess_mp, sess_priv);
        }
@@ -2452,7 +2472,7 @@ dpaa_sec_dev_configure(struct rte_cryptodev *dev,
        PMD_INIT_FUNC_TRACE();
 
        internals = dev->data->dev_private;
-       sprintf(str, "ctx_pool_%d", dev->data->dev_id);
+       snprintf(str, sizeof(str), "ctx_pool_%d", dev->data->dev_id);
        if (!internals->ctx_pool) {
                internals->ctx_pool = rte_mempool_create((const char *)str,
                                                        CTX_POOL_NUM_BUFS,
@@ -2630,7 +2650,7 @@ dpaa_sec_dev_init(struct rte_cryptodev *cryptodev)
 
        flags = QMAN_FQ_FLAG_LOCKED | QMAN_FQ_FLAG_DYNAMIC_FQID |
                QMAN_FQ_FLAG_TO_DCPORTAL;
-       for (i = 0; i < internals->max_nb_sessions; i++) {
+       for (i = 0; i < MAX_DPAA_CORES * internals->max_nb_sessions; i++) {
                /* create rx qman fq for sessions*/
                ret = qman_create_fq(0, flags, &internals->inq[i]);
                if (unlikely(ret != 0)) {
@@ -2658,7 +2678,8 @@ cryptodev_dpaa_sec_probe(struct rte_dpaa_driver *dpaa_drv __rte_unused,
 
        int retval;
 
-       sprintf(cryptodev_name, "dpaa_sec-%d", dpaa_dev->id.dev_id);
+       snprintf(cryptodev_name, sizeof(cryptodev_name), "dpaa_sec-%d",
+                       dpaa_dev->id.dev_id);
 
        cryptodev = rte_cryptodev_pmd_allocate(cryptodev_name, rte_socket_id());
        if (cryptodev == NULL)