From: Rakesh Kudurumalla <[email protected]>

Added ROC api to support custom inline profile creation,
and create and configure sa_table for both inl_dev and nix
dev.

Signed-off-by: Rakesh Kudurumalla <[email protected]>
---
 drivers/common/cnxk/hw/nix.h                  |  44 +++
 drivers/common/cnxk/roc_nix_inl.c             | 294 ++++++++++++++++++
 drivers/common/cnxk/roc_nix_inl.h             |   9 +
 drivers/common/cnxk/roc_nix_inl_dev.c         |  28 +-
 drivers/common/cnxk/roc_nix_inl_priv.h        |   2 +
 drivers/common/cnxk/roc_npc.c                 |  23 +-
 drivers/common/cnxk/roc_npc.h                 |   6 +
 .../common/cnxk/roc_platform_base_symbols.c   |   3 +
 8 files changed, 392 insertions(+), 17 deletions(-)

diff --git a/drivers/common/cnxk/hw/nix.h b/drivers/common/cnxk/hw/nix.h
index a2a372a56a..6abb184d45 100644
--- a/drivers/common/cnxk/hw/nix.h
+++ b/drivers/common/cnxk/hw/nix.h
@@ -2794,4 +2794,48 @@ enum cgx_port_type {
        CGX_PORT_OTHER = 0xff,
 };
 
+/* Shift values for NIX_AF_RX_DEF_INLINE register */
+enum {
+       NIX_LTYPE_MASK_SHIFT = 0,
+       NIX_LTYPE_MATCH_SHIFT = 4,
+       NIX_LID_SHIFT = 8,
+       NIX_GEN_OFFSET_NG_SHIFT = 11,
+       NIX_GEN_OFFSET_SHIFT = 12,
+       NIX_GEN_NZ_SHIFT = 16,
+       NIX_CPT_L3_LID_SHIFT = 17,
+       NIX_FLAGS_MASK_SHIFT = 20,
+       NIX_FLAGS_MATCH_SHIFT = 24,
+       NIX_MATCH_OIPV4_SHIFT = 28,
+       NIX_MATCH_OIPV6_SHIFT = 29,
+       NIX_OIPLEN_ENA_SHIFT = 30,
+       NIX_INLINE_SHIFT_SHIFT = 32,
+};
+
+/* Shift values for NIX_AF_RX_INLINE_GEN_CFG register */
+enum {
+       NIX_PARAM2_SHIFT = 0,
+       NIX_PARAM1_SHIFT = 16,
+       NIX_OPCODE_SHIFT = 32,
+       NIX_EGRP_SHIFT = 48,
+       NIX_CTX_VAL_SHIFT = 51,
+};
+
+/* Shift values for NIX_AF_RX_EXTRACT_INLINE register */
+enum {
+       NIX_LEN_L_SHIFT = 0,
+       NIX_BITPOS_L_SHIFT = 8,
+       NIX_LEN_M_SHIFT = 16,
+       NIX_BITPOS_M_SHIFT = 24,
+       NIX_LEN_H_SHIFT = 32,
+       NIX_BITPOS_H_SHIFT = 40,
+};
+
+/* Shift values for NIX_AF_RX_PROT_FIELD_INLINE register */
+enum {
+       NIX_VALID_SHIFT = 0,
+       NIX_OFFSET_SHIFT = 2,
+       NIX_SIZEM1_SHIFT = 8,
+       NIX_LOGMULT_SHIFT = 12,
+};
+
 #endif /* __NIX_HW_H__ */
diff --git a/drivers/common/cnxk/roc_nix_inl.c 
b/drivers/common/cnxk/roc_nix_inl.c
index ecf93ed03e..b515d52534 100644
--- a/drivers/common/cnxk/roc_nix_inl.c
+++ b/drivers/common/cnxk/roc_nix_inl.c
@@ -778,6 +778,43 @@ roc_nix_inl_inb_sa_base_get(struct roc_nix *roc_nix, bool 
inb_inl_dev)
        return (uintptr_t)nix->inb_sa_base[nix->ipsec_prof_id];
 }
 
+uintptr_t
+roc_nix_inl_inb_prof_sa_base_get(struct roc_nix *roc_nix, bool inb_inl_dev, 
uint16_t profile_id)
+{
+       struct idev_cfg *idev = idev_get_cfg();
+       struct nix_inl_dev *inl_dev;
+       struct nix *nix = NULL;
+
+       /* Validate profile_id range */
+       if (profile_id >= ROC_NIX_INL_PROFILE_CNT) {
+               plt_err("Invalid profile_id %u, must be < %u", profile_id, 
ROC_NIX_INL_PROFILE_CNT);
+               return 0;
+       }
+
+       if (idev == NULL)
+               return 0;
+
+       if (!inb_inl_dev && roc_nix == NULL)
+               return 0;
+
+       if (roc_nix) {
+               nix = roc_nix_to_nix_priv(roc_nix);
+               if (!nix->inl_inb_ena)
+                       return 0;
+       }
+
+       if (inb_inl_dev) {
+               inl_dev = idev->nix_inl_dev;
+               /* Return inline dev sa base for the specified profile */
+               if (inl_dev)
+                       return (uintptr_t)inl_dev->inb_sa_base[profile_id];
+               return 0;
+       }
+
+       /* Return NIX sa base for the specified profile */
+       return (uintptr_t)nix->inb_sa_base[profile_id];
+}
+
 uint16_t
 roc_nix_inl_inb_ipsec_profile_id_get(struct roc_nix *roc_nix, bool inb_inl_dev)
 {
@@ -838,6 +875,263 @@ roc_nix_inl_inb_reass_profile_id_get(struct roc_nix 
*roc_nix, bool inb_inl_dev)
        return nix->reass_prof_id;
 }
 
+static int
+nix_inl_custom_profile_sa_tbl_setup(struct roc_nix *roc_nix, uint32_t sa_size, 
uint32_t max_sa,
+                                   uint16_t profile_id)
+{
+       struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+       struct idev_cfg *idev = idev_get_cfg();
+       struct nix_inl_dev *inl_dev = NULL;
+       struct nix_rx_inl_lf_cfg_req *lf_cfg;
+       uint64_t res_addr_offset = 0;
+       uint64_t cpt_cq_ena = 0;
+       uint32_t inb_sa_sz;
+       uint32_t lenm1_max;
+       uint64_t def_cptq = 0;
+       struct mbox *mbox;
+       uint8_t sa_pow2_sz;
+       uint8_t sa_w;
+       int rc = 0;
+
+       /* Validate profile_id range */
+       if (profile_id >= ROC_NIX_INL_PROFILE_CNT) {
+               plt_err("Invalid profile_id %u, must be < %u", profile_id, 
ROC_NIX_INL_PROFILE_CNT);
+               return -EINVAL;
+       }
+
+       /* Use sa_size parameter if provided, otherwise use default */
+       if (sa_size > 0)
+               inb_sa_sz = sa_size;
+       else
+               inb_sa_sz = ROC_NIX_INL_OW_IPSEC_INB_SA_SZ;
+
+       /* Validate max_sa is provided */
+       if (max_sa == 0) {
+               plt_err("max_sa must be greater than 0 for profile %u", 
profile_id);
+               return -EINVAL;
+       }
+
+       /* Update max_sa */
+       nix->inb_sa_max[profile_id] = max_sa;
+
+       nix->inb_sa_sz[profile_id] = inb_sa_sz;
+       nix->inb_sa_base[profile_id] = plt_zmalloc(inb_sa_sz * max_sa, 
ROC_NIX_INL_SA_BASE_ALIGN);
+       if (!nix->inb_sa_base[profile_id]) {
+               plt_err("Failed to allocate memory for Inbound SA for profile 
%u", profile_id);
+               rc = -ENOMEM;
+               goto exit;
+       }
+
+       mbox = mbox_get(nix->dev.mbox);
+       lf_cfg = mbox_alloc_msg_nix_rx_inl_lf_cfg(mbox);
+       if (lf_cfg == NULL) {
+               rc = -ENOSPC;
+               goto free_mem;
+       }
+
+       lenm1_max = NIX_RPM_MAX_HW_FRS - 1;
+       sa_w = plt_log2_u32(max_sa);
+       sa_pow2_sz = plt_log2_u32(inb_sa_sz);
+
+       /* Get default CPT queue from inline device if available */
+       if (idev && idev->nix_inl_dev) {
+               inl_dev = idev->nix_inl_dev;
+               if (!inl_dev->nb_inb_cptlfs)
+                       def_cptq = 0;
+               else
+                       def_cptq = 
inl_dev->nix_inb_qids[inl_dev->inb_cpt_lf_id];
+
+               res_addr_offset = (uint64_t)(inl_dev->res_addr_offset & 0xFF) 
<< 48;
+               if (res_addr_offset)
+                       res_addr_offset |= (1UL << 56);
+
+               cpt_cq_ena = (uint64_t)inl_dev->cpt_cq_ena << 63;
+       }
+
+       lf_cfg->enable = 1;
+       lf_cfg->profile_id = profile_id;
+       lf_cfg->rx_inline_sa_base = (uintptr_t)nix->inb_sa_base[profile_id] | 
cpt_cq_ena;
+       lf_cfg->rx_inline_cfg0 = ((uint64_t)def_cptq << 57) | res_addr_offset |
+                                ((uint64_t)SSO_TT_ORDERED << 44) | (sa_pow2_sz 
<< 16) | lenm1_max;
+       lf_cfg->rx_inline_cfg1 = (max_sa - 1) | ((uint64_t)sa_w << 32);
+
+       rc = mbox_process(mbox);
+       if (rc) {
+               plt_err("Failed to setup NIX Inbound SA conf of profile=%u, 
rc=%d", profile_id, rc);
+               goto free_mem;
+       }
+
+       mbox_put(mbox);
+       return rc;
+
+free_mem:
+       mbox_put(mbox);
+       plt_free(nix->inb_sa_base[profile_id]);
+       nix->inb_sa_base[profile_id] = NULL;
+exit:
+       return rc;
+}
+
+int
+roc_nix_inl_custom_profile_setup(struct roc_nix *roc_nix, uint64_t def_cfg, 
uint64_t gen_cfg,
+                                uint64_t extract_cfg, const uint64_t 
*prot_field_cfg,
+                                uint32_t sa_size, uint32_t max_sa, bool 
is_inline,
+                                uint16_t *profile_id)
+{
+       struct nix_rx_inl_profile_cfg_req *req;
+       struct nix_rx_inl_profile_cfg_rsp *rsp;
+       struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+       struct idev_cfg *idev = idev_get_cfg();
+       struct nix_inl_dev *inl_dev = NULL;
+       struct mbox *mbox;
+       int rc = 0;
+       int i;
+
+       if (roc_nix == NULL || profile_id == NULL)
+               return -EINVAL;
+
+       if (!nix->inl_inb_ena)
+               return -ENOTSUP;
+
+       /* Get inline device - required for custom profiles */
+       if (!idev || !idev->nix_inl_dev) {
+               plt_err("nix_inl_dev not available for custom profile setup");
+               return -ENODEV;
+       }
+
+       inl_dev = idev->nix_inl_dev;
+
+       /* Use inline device mbox if is_inline is true, otherwise use nix mbox 
*/
+       if (is_inline)
+               mbox = mbox_get(inl_dev->dev.mbox);
+       else
+               mbox = mbox_get(nix->dev.mbox);
+
+       req = mbox_alloc_msg_nix_rx_inl_profile_cfg(mbox);
+       if (req == NULL) {
+               rc = -ENOSPC;
+               plt_err("Failed to alloc %s profile cfg mbox msg",
+                       is_inline ? "inline device" : "nix device");
+               mbox_put(mbox);
+               goto exit;
+       }
+
+       req->def_cfg = def_cfg;
+       req->gen_cfg = gen_cfg;
+       req->extract_cfg = extract_cfg;
+       for (i = 0; i < NIX_RX_INL_PROFILE_PROTO_CNT; i++)
+               req->prot_field_cfg[i] = prot_field_cfg[i];
+
+       rc = mbox_process_msg(mbox, (void **)&rsp);
+       if (rc) {
+               plt_err("Failed to setup %s custom profile, rc=%d",
+                       is_inline ? "inline device" : "nix device", rc);
+               mbox_put(mbox);
+               goto exit;
+       }
+
+       *profile_id = rsp->profile_id;
+
+       /* Validate returned profile_id */
+       if (*profile_id >= ROC_NIX_INL_PROFILE_CNT) {
+               plt_err("Hardware returned invalid profile_id %u", *profile_id);
+               mbox_put(mbox);
+               rc = -EINVAL;
+               goto exit;
+       }
+
+       plt_info("%s custom profile %u created", is_inline ? "Inline device" : 
"NIX device",
+                *profile_id);
+       mbox_put(mbox);
+
+       if (is_inline)
+               rc = nix_inl_dev_profile_config(inl_dev, sa_size, max_sa, 
*profile_id);
+       else
+               rc = nix_inl_custom_profile_sa_tbl_setup(roc_nix, sa_size, 
max_sa, *profile_id);
+
+       if (rc) {
+               plt_err("Failed to configure custom profile %u, rc=%d", 
*profile_id, rc);
+               /* Release the allocated profile on failure */
+               roc_nix_inl_custom_profile_release(roc_nix, *profile_id, 
is_inline);
+       }
+
+exit:
+       return rc;
+}
+
+int
+roc_nix_inl_custom_profile_release(struct roc_nix *roc_nix, uint16_t 
profile_id, bool is_inline)
+{
+       struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+       struct idev_cfg *idev = idev_get_cfg();
+       struct nix_inl_dev *inl_dev = NULL;
+       struct nix_rx_inl_lf_cfg_req *lf_cfg;
+       struct mbox *mbox;
+       int rc = 0;
+
+       if (roc_nix == NULL)
+               return -EINVAL;
+
+       if (!nix->inl_inb_ena)
+               return -ENOTSUP;
+
+       /* Validate profile_id range */
+       if (profile_id >= ROC_NIX_INL_PROFILE_CNT) {
+               plt_err("Invalid profile_id %u, must be < %u", profile_id, 
ROC_NIX_INL_PROFILE_CNT);
+               return -EINVAL;
+       }
+
+       if (is_inline) {
+               /* Get inline device for inline mode */
+               if (!idev || !idev->nix_inl_dev) {
+                       plt_err("nix_inl_dev not available for custom profile 
release");
+                       return -ENODEV;
+               }
+               inl_dev = idev->nix_inl_dev;
+               mbox = mbox_get(inl_dev->dev.mbox);
+       } else {
+               /* Use NIX device mbox for non-inline mode */
+               mbox = mbox_get(nix->dev.mbox);
+       }
+
+       lf_cfg = mbox_alloc_msg_nix_rx_inl_lf_cfg(mbox);
+       if (lf_cfg == NULL) {
+               rc = -ENOSPC;
+               plt_err("Failed to alloc profile release mbox msg");
+               mbox_put(mbox);
+               goto exit;
+       }
+
+       lf_cfg->enable = 0;
+       lf_cfg->profile_id = profile_id;
+       rc = mbox_process(mbox);
+       if (rc) {
+               plt_err("Failed to cleanup NIX Inbound profile=%u SA conf, 
rc=%d", profile_id, rc);
+               mbox_put(mbox);
+               goto exit;
+       }
+
+       /* Free SA base memory */
+       if (is_inline) {
+               if (inl_dev->inb_sa_base[profile_id]) {
+                       plt_free(inl_dev->inb_sa_base[profile_id]);
+                       inl_dev->inb_sa_base[profile_id] = NULL;
+               }
+       } else {
+               if (nix->inb_sa_base[profile_id]) {
+                       plt_free(nix->inb_sa_base[profile_id]);
+                       nix->inb_sa_base[profile_id] = NULL;
+               }
+       }
+
+       mbox_put(mbox);
+       plt_info("%s custom profile %u released", is_inline ? "Inline device" : 
"NIX device",
+                profile_id);
+
+exit:
+       return rc;
+}
+
 bool
 roc_nix_inl_inb_rx_inject_enable(struct roc_nix *roc_nix, bool inb_inl_dev)
 {
diff --git a/drivers/common/cnxk/roc_nix_inl.h 
b/drivers/common/cnxk/roc_nix_inl.h
index 82dae4b1ba..2832ed7961 100644
--- a/drivers/common/cnxk/roc_nix_inl.h
+++ b/drivers/common/cnxk/roc_nix_inl.h
@@ -162,8 +162,17 @@ int __roc_api roc_nix_inl_inb_fini(struct roc_nix 
*roc_nix);
 bool __roc_api roc_nix_inl_inb_is_enabled(struct roc_nix *roc_nix);
 uintptr_t __roc_api roc_nix_inl_inb_sa_base_get(struct roc_nix *roc_nix,
                                                bool inl_dev_sa);
+uintptr_t __roc_api roc_nix_inl_inb_prof_sa_base_get(struct roc_nix *roc_nix, 
bool inb_inl_dev,
+                                                    uint16_t profile_id);
 uint16_t roc_nix_inl_inb_ipsec_profile_id_get(struct roc_nix *roc_nix, bool 
inb_inl_dev);
 uint16_t __roc_api roc_nix_inl_inb_reass_profile_id_get(struct roc_nix 
*roc_nix, bool inb_inl_dev);
+int __roc_api roc_nix_inl_custom_profile_setup(struct roc_nix *roc_nix, 
uint64_t def_cfg,
+                                              uint64_t gen_cfg, uint64_t 
extract_cfg,
+                                              const uint64_t *prot_field_cfg,
+                                              uint32_t sa_size, uint32_t 
max_sa,
+                                              bool is_inline, uint16_t 
*profile_id);
+int __roc_api roc_nix_inl_custom_profile_release(struct roc_nix *roc_nix, 
uint16_t profile_id,
+                                                bool is_inline);
 bool __roc_api roc_nix_inl_inb_rx_inject_enable(struct roc_nix *roc_nix, bool 
inl_dev_sa);
 uint32_t __roc_api roc_nix_inl_inb_spi_range(struct roc_nix *roc_nix,
                                             bool inl_dev_sa, uint32_t *min,
diff --git a/drivers/common/cnxk/roc_nix_inl_dev.c 
b/drivers/common/cnxk/roc_nix_inl_dev.c
index 246dd4612f..667209b8a0 100644
--- a/drivers/common/cnxk/roc_nix_inl_dev.c
+++ b/drivers/common/cnxk/roc_nix_inl_dev.c
@@ -641,11 +641,12 @@ nix_inl_sso_release(struct nix_inl_dev *inl_dev)
        return 0;
 }
 
-static int
-nix_inl_nix_profile_config(struct nix_inl_dev *inl_dev, uint8_t profile_id)
+int
+nix_inl_dev_profile_config(struct nix_inl_dev *inl_dev, uint32_t sa_size, 
uint32_t max_sa,
+                          uint16_t profile_id)
 {
        struct mbox *mbox = mbox_get((&inl_dev->dev)->mbox);
-       uint64_t max_sa, sa_w, sa_pow2_sz, lenm1_max;
+       uint64_t sa_w, sa_pow2_sz, lenm1_max;
        struct nix_rx_inl_lf_cfg_req *lf_cfg;
        uint64_t res_addr_offset;
        uint64_t cpt_cq_ena;
@@ -653,10 +654,12 @@ nix_inl_nix_profile_config(struct nix_inl_dev *inl_dev, 
uint8_t profile_id)
        size_t inb_sa_sz;
        void *sa;
        int rc;
+       uint32_t i;
 
-       /* Alloc contiguous memory for Inbound SA's */
-       inb_sa_sz = ROC_NIX_INL_OW_IPSEC_INB_SA_SZ;
-       max_sa = inl_dev->inb_sa_max[profile_id];
+       inb_sa_sz = sa_size;
+
+       /* Update max_sa in inl_dev */
+       inl_dev->inb_sa_max[profile_id] = max_sa;
        inl_dev->inb_sa_sz[profile_id] = inb_sa_sz;
        inl_dev->inb_sa_base[profile_id] =
                plt_zmalloc(inb_sa_sz * max_sa, ROC_NIX_INL_SA_BASE_ALIGN);
@@ -666,8 +669,11 @@ nix_inl_nix_profile_config(struct nix_inl_dev *inl_dev, 
uint8_t profile_id)
                goto exit;
        }
 
-       sa = ((uint8_t *)inl_dev->inb_sa_base[profile_id]);
-       roc_ow_reass_inb_sa_init(sa);
+       /* Initialize all SAs */
+       for (i = 0; i < max_sa; i++) {
+               sa = ((uint8_t *)inl_dev->inb_sa_base[profile_id]) + (i * 
inb_sa_sz);
+               roc_ow_reass_inb_sa_init(sa);
+       }
        lf_cfg = mbox_alloc_msg_nix_rx_inl_lf_cfg(mbox);
        if (lf_cfg == NULL) {
                rc = -ENOSPC;
@@ -694,7 +700,7 @@ nix_inl_nix_profile_config(struct nix_inl_dev *inl_dev, 
uint8_t profile_id)
        lf_cfg->rx_inline_cfg0 =
                ((def_cptq << 57) | res_addr_offset | ((uint64_t)SSO_TT_ORDERED 
<< 44) |
                 (sa_pow2_sz << 16) | lenm1_max);
-       lf_cfg->rx_inline_cfg1 = (max_sa - 1) | (sa_w << 32);
+       lf_cfg->rx_inline_cfg1 = (max_sa - 1) | ((uint64_t)sa_w << 32);
 
        rc = mbox_process(mbox);
        if (rc) {
@@ -791,8 +797,8 @@ nix_inl_nix_reass_setup(struct nix_inl_dev *inl_dev)
                return rc;
        }
 
-       inl_dev->inb_sa_max[inl_dev->reass_prof_id] = 1;
-       return nix_inl_nix_profile_config(inl_dev, inl_dev->reass_prof_id);
+       return nix_inl_dev_profile_config(inl_dev, 
ROC_NIX_INL_OW_IPSEC_INB_SA_SZ, 1,
+                                         inl_dev->reass_prof_id);
 }
 
 static int
diff --git a/drivers/common/cnxk/roc_nix_inl_priv.h 
b/drivers/common/cnxk/roc_nix_inl_priv.h
index 402b1514e7..f63b7787ac 100644
--- a/drivers/common/cnxk/roc_nix_inl_priv.h
+++ b/drivers/common/cnxk/roc_nix_inl_priv.h
@@ -148,5 +148,7 @@ uint16_t nix_inl_dev_pffunc_get(void);
 
 int nix_inl_setup_dflt_ipsec_profile(struct dev *dev, uint16_t *prof_id);
 int nix_inl_setup_reass_profile(struct dev *dev, uint8_t *prof_id);
+int nix_inl_dev_profile_config(struct nix_inl_dev *inl_dev, uint32_t sa_size, 
uint32_t max_sa,
+                              uint16_t profile_id);
 
 #endif /* _ROC_NIX_INL_PRIV_H_ */
diff --git a/drivers/common/cnxk/roc_npc.c b/drivers/common/cnxk/roc_npc.c
index acf0007e05..a906fe0413 100644
--- a/drivers/common/cnxk/roc_npc.c
+++ b/drivers/common/cnxk/roc_npc.c
@@ -547,9 +547,13 @@ npc_parse_spi_to_sa_action(struct roc_npc *roc_npc, const 
struct roc_npc_action
                req->spi_index = plt_be_to_cpu_32(flow->spi_to_sa_info.spi);
                req->match_id = flow->match_id;
                req->valid = true;
-               if (roc_model_is_cn20k())
-                       req->inline_profile_id =
-                               roc_nix_inl_inb_ipsec_profile_id_get(roc_nix, 
true);
+               if (roc_model_is_cn20k()) {
+                       if (sec_action->use_custom_profile)
+                               req->inline_profile_id = sec_action->profile_id;
+                       else
+                               req->inline_profile_id =
+                                       
roc_nix_inl_inb_ipsec_profile_id_get(roc_nix, true);
+               }
                rc = mbox_process_msg(mbox, (void *)&rsp);
                if (rc)
                        return rc;
@@ -937,11 +941,18 @@ npc_parse_actions(struct roc_npc *roc_npc, const struct 
roc_npc_attr *attr,
                flow->npc_action = NIX_RX_ACTIONOP_UCAST;
        } else if (req_act & ROC_NPC_ACTION_TYPE_SEC) {
                if (roc_model_is_cn20k()) {
+                       const struct roc_npc_sec_action *sa_action = NULL;
+                       uint16_t profile_id;
+
                        flow->npc_action = NIX_RX_ACTIONOP_UCAST_CPT;
                        flow->npc_action |= (uint64_t)rq << 20;
-                       flow->npc_action2 =
-                               roc_nix_inl_inb_ipsec_profile_id_get(roc_nix, 
true) << 8;
-                       flow->npc_action2 |= is_non_inp ? (1ULL << 15) : 0;
+                       profile_id = 
roc_nix_inl_inb_ipsec_profile_id_get(roc_nix, true);
+                       if (sec_action && sec_action->conf) {
+                               sa_action = (const struct roc_npc_sec_action 
*)sec_action->conf;
+                               if (sa_action->use_custom_profile)
+                                       profile_id = sa_action->profile_id;
+                       }
+                       flow->npc_action2 = (is_non_inp ? (1ULL << 15) : 0) | 
(profile_id << 8);
                } else {
                        flow->npc_action = NIX_RX_ACTIONOP_UCAST_IPSEC;
                        flow->npc_action |= (uint64_t)rq << 20;
diff --git a/drivers/common/cnxk/roc_npc.h b/drivers/common/cnxk/roc_npc.h
index 62385e4481..130990bda7 100644
--- a/drivers/common/cnxk/roc_npc.h
+++ b/drivers/common/cnxk/roc_npc.h
@@ -285,6 +285,12 @@ struct roc_npc_sec_action {
         */
        enum roc_npc_sec_action_alg alg;
        bool is_non_inp;
+       uint16_t profile_id;
+       /* Enable custom inline profile.
+        * When true, use custom IPsec profile specified by profile_id.
+        * When false, use default IPsec profile (backward compatible).
+        */
+       bool use_custom_profile;
 };
 
 struct roc_npc_attr {
diff --git a/drivers/common/cnxk/roc_platform_base_symbols.c 
b/drivers/common/cnxk/roc_platform_base_symbols.c
index cf080b1bdc..ed34d4b05b 100644
--- a/drivers/common/cnxk/roc_platform_base_symbols.c
+++ b/drivers/common/cnxk/roc_platform_base_symbols.c
@@ -249,6 +249,9 @@ RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_outb_lf_base_get)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_inb_inj_lf_get)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_outb_sa_base_get)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_inb_sa_base_get)
+RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_inb_prof_sa_base_get)
+RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_custom_profile_setup)
+RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_custom_profile_release)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_inb_rx_inject_enable)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_inb_spi_range)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_inl_inb_sa_sz)
-- 
2.25.1

Reply via email to