X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fcrypto%2Fcnxk%2Fcnxk_cryptodev_ops.c;h=21ee09f962395fa2fd7135de53482444af12e66d;hb=09e5c772fadec40c51eb2a286990fd41b0eb4e14;hp=8ef0e6f5c504c3f3343413d0d36e132c0b7c0ce2;hpb=7e0189607c58c44bcf087537f39ab70cb3e74d3a;p=dpdk.git diff --git a/drivers/crypto/cnxk/cnxk_cryptodev_ops.c b/drivers/crypto/cnxk/cnxk_cryptodev_ops.c index 8ef0e6f5c5..21ee09f962 100644 --- a/drivers/crypto/cnxk/cnxk_cryptodev_ops.c +++ b/drivers/crypto/cnxk/cnxk_cryptodev_ops.c @@ -3,15 +3,20 @@ */ #include -#include +#include #include #include "roc_cpt.h" +#include "cnxk_ae.h" #include "cnxk_cryptodev.h" #include "cnxk_cryptodev_ops.h" +#include "cnxk_cryptodev_capabilities.h" #include "cnxk_se.h" +#define CNXK_CPT_MAX_ASYM_OP_NUM_PARAMS 5 +#define CNXK_CPT_MAX_ASYM_OP_MOD_LEN 1024 + static int cnxk_cpt_get_mlen(void) { @@ -30,6 +35,20 @@ cnxk_cpt_get_mlen(void) return len; } +static int +cnxk_cpt_asym_get_mlen(void) +{ + uint32_t len; + + /* To hold RPTR */ + len = sizeof(uint64_t); + + /* Get meta len for asymmetric operations */ + len += CNXK_CPT_MAX_ASYM_OP_NUM_PARAMS * CNXK_CPT_MAX_ASYM_OP_MOD_LEN; + + return len; +} + int cnxk_cpt_dev_config(struct rte_cryptodev *dev, struct rte_cryptodev_config *conf) @@ -39,7 +58,7 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, uint16_t nb_lf_avail, nb_lf; int ret; - dev->feature_flags &= ~conf->ff_disable; + dev->feature_flags = cnxk_cpt_default_ff_get() & ~conf->ff_disable; nb_lf_avail = roc_cpt->nb_lf_avail; nb_lf = conf->nb_queue_pairs; @@ -53,13 +72,41 @@ cnxk_cpt_dev_config(struct rte_cryptodev *dev, return ret; } + if (dev->feature_flags & RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO) { + /* Initialize shared FPM table */ + ret = roc_ae_fpm_get(vf->cnxk_fpm_iova); + if (ret) { + plt_err("Could not get FPM table"); + return ret; + } + + /* Init EC grp table */ + ret = roc_ae_ec_grp_get(vf->ec_grp); + if (ret) { + plt_err("Could not get EC grp table"); + roc_ae_fpm_put(); + return ret; + } + } + return 0; } int cnxk_cpt_dev_start(struct rte_cryptodev *dev) { - RTE_SET_USED(dev); + struct cnxk_cpt_vf *vf = dev->data->dev_private; + struct roc_cpt *roc_cpt = &vf->cpt; + uint16_t nb_lf = roc_cpt->nb_lf; + uint16_t qp_id; + + for (qp_id = 0; qp_id < nb_lf; qp_id++) { + /* Application may not setup all queue pair */ + if (roc_cpt->lf[qp_id] == NULL) + continue; + + roc_cpt_iq_enable(roc_cpt->lf[qp_id]); + } return 0; } @@ -67,7 +114,17 @@ cnxk_cpt_dev_start(struct rte_cryptodev *dev) void cnxk_cpt_dev_stop(struct rte_cryptodev *dev) { - RTE_SET_USED(dev); + struct cnxk_cpt_vf *vf = dev->data->dev_private; + struct roc_cpt *roc_cpt = &vf->cpt; + uint16_t nb_lf = roc_cpt->nb_lf; + uint16_t qp_id; + + for (qp_id = 0; qp_id < nb_lf; qp_id++) { + if (roc_cpt->lf[qp_id] == NULL) + continue; + + roc_cpt_iq_disable(roc_cpt->lf[qp_id]); + } } int @@ -85,6 +142,11 @@ cnxk_cpt_dev_close(struct rte_cryptodev *dev) } } + if (dev->feature_flags & RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO) { + roc_ae_fpm_put(); + roc_ae_ec_grp_put(); + } + roc_cpt_dev_clear(&vf->cpt); return 0; @@ -97,12 +159,15 @@ cnxk_cpt_dev_info_get(struct rte_cryptodev *dev, struct cnxk_cpt_vf *vf = dev->data->dev_private; struct roc_cpt *roc_cpt = &vf->cpt; - info->max_nb_queue_pairs = roc_cpt->nb_lf_avail; - info->feature_flags = dev->feature_flags; - info->capabilities = NULL; + info->max_nb_queue_pairs = + RTE_MIN(roc_cpt->nb_lf_avail, vf->max_qps_limit); + plt_cpt_dbg("max_nb_queue_pairs %u", info->max_nb_queue_pairs); + + info->feature_flags = cnxk_cpt_default_ff_get(); + info->capabilities = cnxk_crypto_capabilities_get(vf); info->sym.max_nb_sessions = 0; info->min_mbuf_headroom_req = CNXK_CPT_MIN_HEADROOM_REQ; - info->min_mbuf_tailroom_req = 0; + info->min_mbuf_tailroom_req = CNXK_CPT_MIN_TAILROOM_REQ; } static void @@ -118,23 +183,38 @@ cnxk_cpt_metabuf_mempool_create(const struct rte_cryptodev *dev, { char mempool_name[RTE_MEMPOOL_NAMESIZE]; struct cpt_qp_meta_info *meta_info; + int lcore_cnt = rte_lcore_count(); struct rte_mempool *pool; + int mb_pool_sz, mlen = 8; uint32_t cache_sz; - int mlen = 8; if (dev->feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) { /* Get meta len */ mlen = cnxk_cpt_get_mlen(); } + if (dev->feature_flags & RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO) { + + /* Get meta len required for asymmetric operations */ + mlen = RTE_MAX(mlen, cnxk_cpt_asym_get_mlen()); + } + + mb_pool_sz = nb_elements; cache_sz = RTE_MIN(RTE_MEMPOOL_CACHE_MAX_SIZE, nb_elements / 1.5); + /* For poll mode, core that enqueues and core that dequeues can be + * different. For event mode, all cores are allowed to use same crypto + * queue pair. + */ + + mb_pool_sz += (RTE_MAX(2, lcore_cnt) * cache_sz); + /* Allocate mempool */ snprintf(mempool_name, RTE_MEMPOOL_NAMESIZE, "cnxk_cpt_mb_%u:%u", dev->data->dev_id, qp_id); - pool = rte_mempool_create(mempool_name, nb_elements, mlen, cache_sz, 0, + pool = rte_mempool_create(mempool_name, mb_pool_sz, mlen, cache_sz, 0, NULL, NULL, NULL, NULL, rte_socket_id(), 0); if (pool == NULL) { @@ -207,9 +287,8 @@ cnxk_cpt_qp_create(const struct rte_cryptodev *dev, uint16_t qp_id, /* Initialize pending queue */ qp->pend_q.req_queue = pq_mem->addr; - qp->pend_q.enq_tail = 0; - qp->pend_q.deq_head = 0; - qp->pend_q.pending_count = 0; + qp->pend_q.head = 0; + qp->pend_q.tail = 0; return qp; @@ -310,6 +389,8 @@ cnxk_cpt_queue_pair_setup(struct rte_cryptodev *dev, uint16_t qp_id, goto exit; } + qp->pend_q.pq_mask = qp->lf.nb_desc - 1; + roc_cpt->lf[qp_id] = &qp->lf; ret = roc_cpt_lmtline_init(roc_cpt, &qp->lmtline, qp_id); @@ -457,6 +538,32 @@ sym_session_configure(struct roc_cpt *roc_cpt, int driver_id, sess_priv = priv; switch (ret) { + case CNXK_CPT_CIPHER: + ret = fill_sess_cipher(xform, sess_priv); + break; + case CNXK_CPT_AUTH: + if (xform->auth.algo == RTE_CRYPTO_AUTH_AES_GMAC) + ret = fill_sess_gmac(xform, sess_priv); + else + ret = fill_sess_auth(xform, sess_priv); + break; + case CNXK_CPT_AEAD: + ret = fill_sess_aead(xform, sess_priv); + break; + case CNXK_CPT_CIPHER_ENC_AUTH_GEN: + case CNXK_CPT_CIPHER_DEC_AUTH_VRFY: + ret = fill_sess_cipher(xform, sess_priv); + if (ret < 0) + break; + ret = fill_sess_auth(xform->next, sess_priv); + break; + case CNXK_CPT_AUTH_VRFY_CIPHER_DEC: + case CNXK_CPT_AUTH_GEN_CIPHER_ENC: + ret = fill_sess_auth(xform, sess_priv); + if (ret < 0) + break; + ret = fill_sess_cipher(xform->next, sess_priv); + break; default: ret = -1; } @@ -464,6 +571,18 @@ sym_session_configure(struct roc_cpt *roc_cpt, int driver_id, if (ret) goto priv_put; + if ((sess_priv->roc_se_ctx.fc_type == ROC_SE_HASH_HMAC) && + cpt_mac_len_verify(&xform->auth)) { + plt_dp_err("MAC length is not supported"); + if (sess_priv->roc_se_ctx.auth_key != NULL) { + plt_free(sess_priv->roc_se_ctx.auth_key); + sess_priv->roc_se_ctx.auth_key = NULL; + } + + ret = -ENOTSUP; + goto priv_put; + } + sess_priv->cpt_inst_w7 = cnxk_cpt_inst_w7_get(sess_priv, roc_cpt); set_sym_session_private_data(sess, driver_id, sess_priv); @@ -495,11 +614,17 @@ void sym_session_clear(int driver_id, struct rte_cryptodev_sym_session *sess) { void *priv = get_sym_session_private_data(sess, driver_id); + struct cnxk_se_sess *sess_priv; struct rte_mempool *pool; if (priv == NULL) return; + sess_priv = priv; + + if (sess_priv->roc_se_ctx.auth_key != NULL) + plt_free(sess_priv->roc_se_ctx.auth_key); + memset(priv, 0, cnxk_cpt_sym_session_get_size(NULL)); pool = rte_mempool_from_obj(priv); @@ -515,3 +640,63 @@ cnxk_cpt_sym_session_clear(struct rte_cryptodev *dev, { return sym_session_clear(dev->driver_id, sess); } + +unsigned int +cnxk_ae_session_size_get(struct rte_cryptodev *dev __rte_unused) +{ + return sizeof(struct cnxk_ae_sess); +} + +void +cnxk_ae_session_clear(struct rte_cryptodev *dev, + struct rte_cryptodev_asym_session *sess) +{ + struct rte_mempool *sess_mp; + struct cnxk_ae_sess *priv; + + priv = get_asym_session_private_data(sess, dev->driver_id); + if (priv == NULL) + return; + + /* Free resources allocated in session_cfg */ + cnxk_ae_free_session_parameters(priv); + + /* Reset and free object back to pool */ + memset(priv, 0, cnxk_ae_session_size_get(dev)); + sess_mp = rte_mempool_from_obj(priv); + set_asym_session_private_data(sess, dev->driver_id, NULL); + rte_mempool_put(sess_mp, priv); +} + +int +cnxk_ae_session_cfg(struct rte_cryptodev *dev, + struct rte_crypto_asym_xform *xform, + struct rte_cryptodev_asym_session *sess, + struct rte_mempool *pool) +{ + struct cnxk_cpt_vf *vf = dev->data->dev_private; + struct roc_cpt *roc_cpt = &vf->cpt; + struct cnxk_ae_sess *priv; + union cpt_inst_w7 w7; + int ret; + + if (rte_mempool_get(pool, (void **)&priv)) + return -ENOMEM; + + memset(priv, 0, sizeof(struct cnxk_ae_sess)); + + ret = cnxk_ae_fill_session_parameters(priv, xform); + if (ret) { + rte_mempool_put(pool, priv); + return ret; + } + + w7.u64 = 0; + w7.s.egrp = roc_cpt->eng_grp[CPT_ENG_TYPE_AE]; + priv->cpt_inst_w7 = w7.u64; + priv->cnxk_fpm_iova = vf->cnxk_fpm_iova; + priv->ec_grp = vf->ec_grp; + set_asym_session_private_data(sess, dev->driver_id, priv); + + return 0; +}