enable CPT CQ in cpt instruction to read outbound
error packets from CQ

Signed-off-by: Rakesh Kudurumalla <[email protected]>
---
 doc/guides/nics/cnxk.rst                       | 12 ++++++++++++
 drivers/common/cnxk/roc_nix_inl.c              | 18 ++++++++++++++++++
 drivers/common/cnxk/roc_nix_inl.h              |  1 +
 .../common/cnxk/roc_platform_base_symbols.c    |  1 +
 drivers/net/cnxk/cn20k_ethdev_sec.c            | 10 ++++++----
 drivers/net/cnxk/cn20k_rxtx.h                  |  2 +-
 drivers/net/cnxk/cn20k_tx.h                    | 11 +++++++----
 7 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/doc/guides/nics/cnxk.rst b/doc/guides/nics/cnxk.rst
index 667a876710..166e964a3c 100644
--- a/doc/guides/nics/cnxk.rst
+++ b/doc/guides/nics/cnxk.rst
@@ -678,6 +678,18 @@ Runtime Config Options for inline device
    With the above configuration, driver would poll for soft expiry events every
    1000 usec.
 
+- ``CPT completion queue enable for outbound expiry packet`` (default ``0``)
+
+   CPT completion queue can be enabled for outbound expiry packet processing
+   by specifying ``cpt_cq_ena`` ``devargs`` parameter.
+
+   For example::
+
+      -a 0002:1d:00.0,cpt_cq_ena=1
+
+   With the above configuration, CPT completion queue will be enabled for
+   outbound expiry packet handling on the inline device.
+
 - ``Rx Inject Enable inbound inline IPsec for second pass`` (default ``0``)
 
    Rx packet inject feature for inbound inline IPsec processing can be enabled
diff --git a/drivers/common/cnxk/roc_nix_inl.c 
b/drivers/common/cnxk/roc_nix_inl.c
index bc63f4ee62..70ab8001e1 100644
--- a/drivers/common/cnxk/roc_nix_inl.c
+++ b/drivers/common/cnxk/roc_nix_inl.c
@@ -2563,3 +2563,21 @@ 
roc_nix_inl_custom_meta_pool_cb_register(roc_nix_inl_custom_meta_pool_cb_t cb)
 {
        custom_meta_pool_cb = cb;
 }
+
+uint8_t
+roc_nix_inl_is_cq_ena(struct roc_nix *roc_nix)
+{
+       struct idev_cfg *idev = idev_get_cfg();
+       struct nix_inl_dev *inl_dev;
+
+       PLT_SET_USED(roc_nix);
+       if (idev != NULL) {
+               inl_dev = idev->nix_inl_dev;
+               if (inl_dev)
+                       return inl_dev->cpt_cq_ena;
+               else
+                       return 0;
+       } else {
+               return 0;
+       }
+}
diff --git a/drivers/common/cnxk/roc_nix_inl.h 
b/drivers/common/cnxk/roc_nix_inl.h
index 4bae261848..7970ac2258 100644
--- a/drivers/common/cnxk/roc_nix_inl.h
+++ b/drivers/common/cnxk/roc_nix_inl.h
@@ -213,6 +213,7 @@ int __roc_api roc_nix_inl_ctx_write(struct roc_nix 
*roc_nix, void *sa_dptr,
 void __roc_api roc_nix_inl_outb_cpt_lfs_dump(struct roc_nix *roc_nix, FILE 
*file);
 uint64_t __roc_api roc_nix_inl_eng_caps_get(struct roc_nix *roc_nix);
 void *__roc_api roc_nix_inl_dev_qptr_get(uint8_t qid);
+uint8_t __roc_api roc_nix_inl_is_cq_ena(struct roc_nix *roc_nix);
 
 enum roc_nix_cpt_lf_stats_type {
        ROC_NIX_CPT_LF_STATS_INL_DEV,
diff --git a/drivers/common/cnxk/roc_platform_base_symbols.c 
b/drivers/common/cnxk/roc_platform_base_symbols.c
index e6fa3b540b..16ab37655d 100644
--- a/drivers/common/cnxk/roc_platform_base_symbols.c
+++ b/drivers/common/cnxk/roc_platform_base_symbols.c
@@ -281,6 +281,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_eng_caps_get)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_custom_meta_pool_cb_register)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_dev_xaq_realloc)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_dev_qptr_get)
+RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_is_cq_ena)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_dev_stats_get)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_dev_stats_reset)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_dev_init)
diff --git a/drivers/net/cnxk/cn20k_ethdev_sec.c 
b/drivers/net/cnxk/cn20k_ethdev_sec.c
index 03cc088900..baa3423e28 100644
--- a/drivers/net/cnxk/cn20k_ethdev_sec.c
+++ b/drivers/net/cnxk/cn20k_ethdev_sec.c
@@ -664,6 +664,9 @@ cn20k_eth_sec_outb_sa_misc_fill(struct roc_nix *roc_nix, 
struct roc_ow_ipsec_out
 {
        uint64_t *ring_base, ring_addr;
 
+       if (roc_nix_inl_is_cq_ena(roc_nix))
+               goto done;
+
        if (ipsec_xfrm->life.bytes_soft_limit | 
ipsec_xfrm->life.packets_soft_limit) {
                ring_base = roc_nix_inl_outb_ring_base_get(roc_nix);
                if (ring_base == NULL)
@@ -674,6 +677,7 @@ cn20k_eth_sec_outb_sa_misc_fill(struct roc_nix *roc_nix, 
struct roc_ow_ipsec_out
                sa->ctx.err_ctl.s.address = ring_addr >> 3;
                sa->w0.s.ctx_id = ((uintptr_t)sa_cptr >> 51) & 0x1ff;
        }
+done:
        return 0;
 }
 
@@ -909,8 +913,7 @@ cn20k_eth_sec_session_create(void *device, struct 
rte_security_session_conf *con
                sess_priv.chksum =
                        (!ipsec->options.ip_csum_enable << 1 | 
!ipsec->options.l4_csum_enable);
                sess_priv.dec_ttl = ipsec->options.dec_ttl;
-               if (roc_feature_nix_has_inl_ipsec_mseg() && 
dev->outb.cpt_eng_caps & BIT_ULL(35))
-                       sess_priv.nixtx_off = 1;
+               sess_priv.cpt_cq_ena = roc_nix_inl_is_cq_ena(&dev->nix);
 
                /* Pointer from eth_sec -> outb_sa */
                eth_sec->sa = outb_sa;
@@ -1106,9 +1109,8 @@ cn20k_eth_sec_session_update(void *device, struct 
rte_security_session *sess,
                sess_priv.chksum =
                        (!ipsec->options.ip_csum_enable << 1 | 
!ipsec->options.l4_csum_enable);
                sess_priv.dec_ttl = ipsec->options.dec_ttl;
-               if (roc_feature_nix_has_inl_ipsec_mseg() && 
dev->outb.cpt_eng_caps & BIT_ULL(35))
-                       sess_priv.nixtx_off = 1;
 
+               sess_priv.cpt_cq_ena = roc_nix_inl_is_cq_ena(&dev->nix);
                rc = roc_nix_inl_ctx_write(&dev->nix, outb_sa_dptr, 
eth_sec->sa, eth_sec->inb,
                                           sizeof(struct roc_ow_ipsec_outb_sa));
                if (rc)
diff --git a/drivers/net/cnxk/cn20k_rxtx.h b/drivers/net/cnxk/cn20k_rxtx.h
index 10da42680f..5fc4f8656d 100644
--- a/drivers/net/cnxk/cn20k_rxtx.h
+++ b/drivers/net/cnxk/cn20k_rxtx.h
@@ -106,7 +106,7 @@ struct __rte_packed_begin cn20k_sec_sess_priv {
                        uint16_t partial_len : 10;
                        uint16_t chksum : 2;
                        uint16_t dec_ttl : 1;
-                       uint16_t nixtx_off : 1;
+                       uint16_t cpt_cq_ena : 1;
                        uint16_t rsvd : 2;
                };
 
diff --git a/drivers/net/cnxk/cn20k_tx.h b/drivers/net/cnxk/cn20k_tx.h
index 3fb2e1f4e1..9e48744831 100644
--- a/drivers/net/cnxk/cn20k_tx.h
+++ b/drivers/net/cnxk/cn20k_tx.h
@@ -444,14 +444,15 @@ cn20k_nix_prep_sec_vec(struct rte_mbuf *m, uint64x2_t 
*cmd0, uint64x2_t *cmd1,
        uint32_t pkt_len, dlen_adj, rlen;
        uint8_t l3l4type, chksum;
        uint64x2_t cmd01, cmd23;
+       uint64_t sa, cpt_cq_ena;
        uint8_t l2_len, l3_len;
        uintptr_t dptr, nixtx;
        uint64_t ucode_cmd[4];
        uint64_t *laddr, w0;
        uint16_t tag;
-       uint64_t sa;
 
        sess_priv.u64 = *rte_security_dynfield(m);
+       cpt_cq_ena = sess_priv.cpt_cq_ena;
 
        if (flags & NIX_TX_NEED_SEND_HDR_W1) {
                /* Extract l3l4type either from il3il4type or ol3ol4type */
@@ -530,7 +531,7 @@ cn20k_nix_prep_sec_vec(struct rte_mbuf *m, uint64x2_t 
*cmd0, uint64x2_t *cmd1,
        cmd01 = vdupq_n_u64(0);
        cmd01 = vsetq_lane_u64(w0, cmd01, 0);
        /* CPT_RES_S is 16B above NIXTX */
-       cmd01 = vsetq_lane_u64(nixtx - 16, cmd01, 1);
+       cmd01 = vsetq_lane_u64((nixtx - 16) | cpt_cq_ena << 63, cmd01, 1);
 
        /* Return nixtx addr */
        *nixtx_addr = nixtx;
@@ -577,15 +578,16 @@ cn20k_nix_prep_sec(struct rte_mbuf *m, uint64_t *cmd, 
uintptr_t *nixtx_addr, uin
        uint8_t l3l4type, chksum;
        uint64x2_t cmd01, cmd23;
        union nix_send_sg_s *sg;
+       uint64_t sa, cpt_cq_ena;
        uint8_t l2_len, l3_len;
        uintptr_t dptr, nixtx;
        uint64_t ucode_cmd[4];
        uint64_t *laddr, w0;
        uint16_t tag;
-       uint64_t sa;
 
        /* Move to our line from base */
        sess_priv.u64 = *rte_security_dynfield(m);
+       cpt_cq_ena = sess_priv.cpt_cq_ena;
        send_hdr = (struct nix_send_hdr_s *)cmd;
        if (flags & NIX_TX_NEED_EXT_HDR)
                sg = (union nix_send_sg_s *)&cmd[4];
@@ -668,7 +670,8 @@ cn20k_nix_prep_sec(struct rte_mbuf *m, uint64_t *cmd, 
uintptr_t *nixtx_addr, uin
        cmd01 = vdupq_n_u64(0);
        cmd01 = vsetq_lane_u64(w0, cmd01, 0);
        /* CPT_RES_S is 16B above NIXTX */
-       cmd01 = vsetq_lane_u64(nixtx - 16, cmd01, 1);
+       /* CQ_ENA for cpt */
+       cmd01 = vsetq_lane_u64((nixtx - 16) | cpt_cq_ena << 63, cmd01, 1);
 
        /* Return nixtx addr */
        *nixtx_addr = nixtx;
-- 
2.25.1

Reply via email to