Adding support for custom metadata in CN20K PMD.

Signed-off-by: Tejasree Kondoj <ktejas...@marvell.com>
---
 drivers/common/cnxk/hw/cpt.h              | 14 +++-
 drivers/crypto/cnxk/cn20k_cryptodev_ops.c |  4 +
 drivers/crypto/cnxk/cnxk_se.h             | 94 +++++++++++++++--------
 3 files changed, 78 insertions(+), 34 deletions(-)

diff --git a/drivers/common/cnxk/hw/cpt.h b/drivers/common/cnxk/hw/cpt.h
index e542f3a3d4..4079221676 100644
--- a/drivers/common/cnxk/hw/cpt.h
+++ b/drivers/common/cnxk/hw/cpt.h
@@ -247,7 +247,13 @@ struct cpt_inst_s {
                        uint64_t nixtxl : 3;
                        uint64_t doneint : 1;
                        uint64_t nixtx_addr : 60;
-               } s;
+               } cn10k;
+               struct {
+                       uint64_t nixtxl : 3;
+                       uint64_t doneint : 1;
+                       uint64_t rsvd : 58;
+                       uint64_t pkt_ctl : 2;
+               } cn20k;
                struct {
                        uint64_t nixtxl : 3;
                        uint64_t doneint : 1;
@@ -260,7 +266,11 @@ struct cpt_inst_s {
                uint64_t u64;
        } w0;
 
-       uint64_t res_addr;
+       struct {
+               uint64_t res_addr : 59;
+               uint64_t meta_sz : 4;
+               uint64_t cq_ena : 1;
+       };
 
        union cpt_inst_w2 {
                struct {
diff --git a/drivers/crypto/cnxk/cn20k_cryptodev_ops.c 
b/drivers/crypto/cnxk/cn20k_cryptodev_ops.c
index 30194db4ad..b696c28081 100644
--- a/drivers/crypto/cnxk/cn20k_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cn20k_cryptodev_ops.c
@@ -196,6 +196,10 @@ cn20k_cpt_fill_inst(struct cnxk_cpt_qp *qp, struct 
rte_crypto_op *ops[], struct
        inst[0].w2.u64 = 0;
        inst[0].w3.u64 = 0;
 
+       inst[0].meta_sz = 0;
+       inst[0].cq_ena = 0;
+       inst[0].res_addr = 0;
+
        sym_op = op->sym;
 
        if (op->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
diff --git a/drivers/crypto/cnxk/cnxk_se.h b/drivers/crypto/cnxk/cnxk_se.h
index 3631b95e8c..7a0624ca28 100644
--- a/drivers/crypto/cnxk/cnxk_se.h
+++ b/drivers/crypto/cnxk/cnxk_se.h
@@ -17,6 +17,9 @@
 #define DST_IOV_SIZE                                                           
                    \
        (sizeof(struct roc_se_iov_ptr) + (sizeof(struct roc_se_buf_ptr) * 
ROC_MAX_SG_CNT))
 
+#define META_PKT_CTL_ENABLE 1
+#define META_SIZE_DIVISOR   32
+
 enum cpt_dp_thread_type {
        CPT_DP_THREAD_TYPE_FC_CHAIN = 0x1,
        CPT_DP_THREAD_TYPE_FC_AEAD,
@@ -1526,7 +1529,8 @@ cpt_dec_hmac_prep(uint32_t flags, uint64_t d_offs, 
uint64_t d_lens,
 static __rte_always_inline int
 cpt_pdcp_chain_alg_prep(uint32_t req_flags, uint64_t d_offs, uint64_t d_lens,
                        struct roc_se_fc_params *params, struct cpt_inst_s 
*inst,
-                       const bool is_sg_ver2, const bool use_metadata)
+                       struct cpt_inflight_req *infl_req, const bool 
is_sg_ver2,
+                       const bool use_metadata)
 {
        uint32_t encr_data_len, auth_data_len, aad_len, passthr_len, pad_len, 
hdr_len;
        uint32_t encr_offset, auth_offset, iv_offset = 0;
@@ -1611,19 +1615,23 @@ cpt_pdcp_chain_alg_prep(uint32_t req_flags, uint64_t 
d_offs, uint64_t d_lens,
                dm_vaddr = params->bufs[0].vaddr;
 
                /* Use Direct mode */
+               if (use_metadata) {
+                       inst->w0.cn20k.pkt_ctl = META_PKT_CTL_ENABLE;
+                       inst->meta_sz = META_LEN / META_SIZE_DIVISOR;
 
-               offset_vaddr = PLT_PTR_SUB(dm_vaddr, off_ctrl_len + hdr_len);
-               *offset_vaddr = offset_ctrl;
-
-               /* DPTR */
-               inst->dptr = (uint64_t)offset_vaddr;
-               /* RPTR should just exclude offset control word */
-               if (use_metadata)
-                       inst->rptr = (uint64_t)dm_vaddr - pad_len;
-               else
+                       offset_vaddr = PLT_PTR_CAST(infl_req->meta);
+                       inst->dptr = (uint64_t)dm_vaddr - pad_len;
+                       inst->rptr = inst->dptr;
+                       cpt_inst_w4.s.dlen = inputlen - iv_len;
+               } else {
+                       offset_vaddr = PLT_PTR_SUB(dm_vaddr, off_ctrl_len + 
hdr_len);
+                       inst->dptr = (uint64_t)offset_vaddr;
+                       /* RPTR should just exclude offset control word */
                        inst->rptr = (uint64_t)PLT_PTR_SUB(dm_vaddr, hdr_len);
+                       cpt_inst_w4.s.dlen = inputlen + off_ctrl_len;
+               }
 
-               cpt_inst_w4.s.dlen = inputlen + off_ctrl_len;
+               *offset_vaddr = offset_ctrl;
 
                iv_d = ((uint8_t *)offset_vaddr + off_ctrl_len);
                pdcp_iv_copy(iv_d, cipher_iv, pdcp_ci_alg, false);
@@ -1649,8 +1657,8 @@ cpt_pdcp_chain_alg_prep(uint32_t req_flags, uint64_t 
d_offs, uint64_t d_lens,
 
 static __rte_always_inline int
 cpt_pdcp_alg_prep(uint32_t req_flags, uint64_t d_offs, uint64_t d_lens,
-                 struct roc_se_fc_params *params, struct cpt_inst_s *inst, 
const bool is_sg_ver2,
-                 const bool use_metadata)
+                 struct roc_se_fc_params *params, struct cpt_inst_s *inst,
+                 struct cpt_inflight_req *infl_req, const bool is_sg_ver2, 
const bool use_metadata)
 {
        /*
         * pdcp_iv_offset is auth_iv_offset wrt cipher_iv_offset which is
@@ -1666,9 +1674,11 @@ cpt_pdcp_alg_prep(uint32_t req_flags, uint64_t d_offs, 
uint64_t d_lens,
        const int flags = se_ctx->zsk_flags;
        uint32_t encr_offset, auth_offset;
        union cpt_inst_w4 cpt_inst_w4;
+       uint32_t passthrough_len = 0;
        int32_t inputlen, outputlen;
        uint64_t *offset_vaddr;
        uint8_t pdcp_alg_type;
+       uint32_t pad_len = 0;
        uint32_t mac_len = 0;
        uint64_t offset_ctrl;
        bool pack_iv = false;
@@ -1703,8 +1713,10 @@ cpt_pdcp_alg_prep(uint32_t req_flags, uint64_t d_offs, 
uint64_t d_lens,
                }
 
                if (use_metadata) {
-                       inputlen = iv_len + auth_offset + auth_data_len;
-                       outputlen = mac_len;
+                       passthrough_len = RTE_ALIGN_CEIL(auth_offset, 8);
+                       pad_len = passthrough_len - auth_offset;
+                       inputlen = pad_len + iv_len + auth_offset + 
auth_data_len;
+                       outputlen = pad_len + mac_len;
                } else {
                        /* consider iv len */
                        auth_offset += iv_len;
@@ -1735,7 +1747,9 @@ cpt_pdcp_alg_prep(uint32_t req_flags, uint64_t d_offs, 
uint64_t d_lens,
                encr_offset = encr_offset / 8;
 
                if (use_metadata) {
-                       outputlen = encr_offset + (RTE_ALIGN(encr_data_len, 8) 
/ 8);
+                       passthrough_len = RTE_ALIGN_CEIL(encr_offset, 8);
+                       pad_len = passthrough_len - encr_offset;
+                       outputlen = pad_len + encr_offset + 
(RTE_ALIGN(encr_data_len, 8) / 8);
                        inputlen = iv_len + outputlen;
                } else {
                        /* consider iv len */
@@ -1767,22 +1781,35 @@ cpt_pdcp_alg_prep(uint32_t req_flags, uint64_t d_offs, 
uint64_t d_lens,
         */
        if (likely((req_flags & ROC_SE_SINGLE_BUF_INPLACE) &&
                   (req_flags & ROC_SE_SINGLE_BUF_HEADROOM))) {
+
                void *dm_vaddr = params->bufs[0].vaddr;
 
                /* Use Direct mode */
-
                cpt_inst_w4.s.opcode_major = ROC_SE_MAJOR_OP_PDCP_CHAIN;
-               offset_vaddr = (uint64_t *)((uint8_t *)dm_vaddr - off_ctrl_len 
- iv_len);
 
-               /* DPTR */
-               inst->dptr = (uint64_t)offset_vaddr;
-               /* RPTR should just exclude offset control word */
-               if (use_metadata)
-                       inst->rptr = (uint64_t)dm_vaddr;
-               else
+               if (use_metadata) {
+                       inst->w0.cn20k.pkt_ctl = META_PKT_CTL_ENABLE;
+                       inst->meta_sz = META_LEN / META_SIZE_DIVISOR;
+
+                       offset_vaddr = PLT_PTR_CAST(infl_req->meta);
+                       offset_ctrl = 
rte_cpu_to_be_64((uint64_t)(passthrough_len));
+                       *offset_vaddr = offset_ctrl;
+
+                       inst->dptr = (uint64_t)dm_vaddr - pad_len;
+                       inst->rptr = inst->dptr;
+
+                       cpt_inst_w4.s.dlen = inputlen - iv_len + pad_len;
+               } else {
+
+                       offset_vaddr = (uint64_t *)((uint8_t *)dm_vaddr - 
off_ctrl_len - iv_len);
+
+                       /* DPTR */
+                       inst->dptr = (uint64_t)offset_vaddr;
+                       /* RPTR should just exclude offset control word */
                        inst->rptr = (uint64_t)dm_vaddr - iv_len;
 
-               cpt_inst_w4.s.dlen = inputlen + off_ctrl_len;
+                       cpt_inst_w4.s.dlen = inputlen + off_ctrl_len;
+               }
 
                uint8_t *iv_d = ((uint8_t *)offset_vaddr + off_ctrl_len);
                pdcp_iv_copy(iv_d, iv_s, pdcp_alg_type, pack_iv);
@@ -1950,7 +1977,8 @@ cpt_kasumi_dec_prep(uint64_t d_offs, uint64_t d_lens, 
struct roc_se_fc_params *p
 static __rte_always_inline int
 cpt_fc_enc_hmac_prep(uint32_t flags, uint64_t d_offs, uint64_t d_lens,
                     struct roc_se_fc_params *fc_params, struct cpt_inst_s 
*inst,
-                    const bool is_sg_ver2, const bool use_metadata)
+                    struct cpt_inflight_req *infl_req, const bool is_sg_ver2,
+                    const bool use_metadata)
 {
        struct roc_se_ctx *ctx = fc_params->ctx;
        uint8_t fc_type;
@@ -1961,8 +1989,8 @@ cpt_fc_enc_hmac_prep(uint32_t flags, uint64_t d_offs, 
uint64_t d_lens,
        if (likely(fc_type == ROC_SE_FC_GEN)) {
                ret = cpt_enc_hmac_prep(flags, d_offs, d_lens, fc_params, inst, 
is_sg_ver2);
        } else if (fc_type == ROC_SE_PDCP) {
-               ret = cpt_pdcp_alg_prep(flags, d_offs, d_lens, fc_params, inst, 
is_sg_ver2,
-                                       use_metadata);
+               ret = cpt_pdcp_alg_prep(flags, d_offs, d_lens, fc_params, inst, 
infl_req,
+                                       is_sg_ver2, use_metadata);
        } else if (fc_type == ROC_SE_KASUMI) {
                ret = cpt_kasumi_enc_prep(flags, d_offs, d_lens, fc_params, 
inst, is_sg_ver2);
        } else if (fc_type == ROC_SE_HASH_HMAC) {
@@ -3062,7 +3090,8 @@ fill_pdcp_params(struct rte_crypto_op *cop, struct 
cnxk_se_sess *sess,
                }
        }
 
-       ret = cpt_pdcp_alg_prep(flags, d_offs, d_lens, &fc_params, inst, 
is_sg_ver2, use_metadata);
+       ret = cpt_pdcp_alg_prep(flags, d_offs, d_lens, &fc_params, inst, 
infl_req, is_sg_ver2,
+                               use_metadata);
        if (unlikely(ret)) {
                plt_dp_err("Could not prepare instruction");
                goto free_mdata_and_exit;
@@ -3195,7 +3224,7 @@ fill_pdcp_chain_params(struct rte_crypto_op *cop, struct 
cnxk_se_sess *sess,
        }
 
        /* Finally prepare the instruction */
-       ret = cpt_pdcp_chain_alg_prep(flags, d_offs, d_lens, &fc_params, inst, 
is_sg_ver2,
+       ret = cpt_pdcp_chain_alg_prep(flags, d_offs, d_lens, &fc_params, inst, 
infl_req, is_sg_ver2,
                                      use_metadata);
        if (unlikely(ret)) {
                plt_dp_err("Could not prepare instruction");
@@ -3406,7 +3435,8 @@ fill_digest_params(struct rte_crypto_op *cop, struct 
cnxk_se_sess *sess,
                goto free_mdata_and_exit;
        }
 
-       ret = cpt_fc_enc_hmac_prep(flags, d_offs, d_lens, &params, inst, 
is_sg_ver2, use_metadata);
+       ret = cpt_fc_enc_hmac_prep(flags, d_offs, d_lens, &params, inst, 
infl_req, is_sg_ver2,
+                                  use_metadata);
 
        if (ret)
                goto free_mdata_and_exit;
@@ -3758,7 +3788,7 @@ fill_raw_digest_params(struct cnxk_iov *iov, struct 
cnxk_se_sess *sess,
        fc_params.meta_buf.vaddr = (uint8_t *)mdata + space;
        fc_params.meta_buf.size -= space;
 
-       ret = cpt_fc_enc_hmac_prep(flags, d_offs, d_lens, &fc_params, inst, 
is_sg_ver2,
+       ret = cpt_fc_enc_hmac_prep(flags, d_offs, d_lens, &fc_params, inst, 
infl_req, is_sg_ver2,
                                   use_metadata);
        if (ret)
                goto free_mdata_and_exit;
-- 
2.25.1

Reply via email to