X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fcrypto%2Fdpaa_sec%2Fdpaa_sec.c;h=122c80a072ffa1ac038509405ee1612eaed029db;hb=317862a4e44f;hp=2e77a8af80101f0730d62d7907ab5c05d5ea6876;hpb=a1173d55598c5dec9f1d305db9df743e784c9c55;p=dpdk.git diff --git a/drivers/crypto/dpaa_sec/dpaa_sec.c b/drivers/crypto/dpaa_sec/dpaa_sec.c index 2e77a8af80..122c80a072 100644 --- a/drivers/crypto/dpaa_sec/dpaa_sec.c +++ b/drivers/crypto/dpaa_sec/dpaa_sec.c @@ -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)