From: Anoob Joseph <ano...@marvell.com>

IE engines are present only with cn9k and cn10k.

Signed-off-by: Anoob Joseph <ano...@marvell.com>
---
 drivers/common/cnxk/roc_cpt.c | 43 +++++++++++++++++++++++++++++++----
 drivers/common/cnxk/roc_cpt.h |  3 +++
 2 files changed, 41 insertions(+), 5 deletions(-)

diff --git a/drivers/common/cnxk/roc_cpt.c b/drivers/common/cnxk/roc_cpt.c
index 90433e2390..88f6044e60 100644
--- a/drivers/common/cnxk/roc_cpt.c
+++ b/drivers/common/cnxk/roc_cpt.c
@@ -624,9 +624,13 @@ roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf, 
bool rxc_ena, uint16_t
        for (i = 0; i < nb_lf; i++)
                cpt->lf_blkaddr[i] = blkaddr[blknum];
 
-       eng_grpmsk = (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_AE]) |
-                    (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_SE]) |
-                    (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_IE]);
+       if (roc_cpt_has_ie_engines())
+               eng_grpmsk = (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_AE]) |
+                            (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_SE]) |
+                            (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_IE]);
+       else
+               eng_grpmsk = (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_AE]) |
+                            (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_SE]);
 
        if (roc_errata_cpt_has_ctx_fetch_issue()) {
                ctx_ilen_valid = true;
@@ -1180,12 +1184,13 @@ int
 roc_cpt_ctx_write(struct roc_cpt_lf *lf, void *sa_dptr, void *sa_cptr,
                  uint16_t sa_len)
 {
-       uintptr_t lmt_base = lf->lmt_base;
        union cpt_res_s res, *hw_res;
        uint64_t lmt_arg, io_addr;
        struct cpt_inst_s *inst;
+       uintptr_t lmt_base;
        uint16_t lmt_id;
        uint64_t *dptr;
+       uint8_t egrp;
        int i;
 
        if (!plt_is_aligned(sa_cptr, 128)) {
@@ -1193,6 +1198,25 @@ roc_cpt_ctx_write(struct roc_cpt_lf *lf, void *sa_dptr, 
void *sa_cptr,
                return -EINVAL;
        }
 
+       if (lf == NULL) {
+               plt_err("Invalid CPT LF");
+               return -EINVAL;
+       }
+
+       if (lf->roc_cpt == NULL) {
+               if (roc_cpt_has_ie_engines())
+                       egrp = ROC_CPT_DFLT_ENG_GRP_SE_IE;
+               else
+                       egrp = ROC_CPT_DFLT_ENG_GRP_SE;
+       } else {
+               if (roc_cpt_has_ie_engines())
+                       egrp = lf->roc_cpt->eng_grp[CPT_ENG_TYPE_IE];
+               else
+                       egrp = lf->roc_cpt->eng_grp[CPT_ENG_TYPE_SE];
+       }
+
+       lmt_base = lf->lmt_base;
+
        /* Use this lcore's LMT line as no one else is using it */
        ROC_LMT_BASE_ID_GET(lmt_base, lmt_id);
        inst = (struct cpt_inst_s *)lmt_base;
@@ -1225,7 +1249,7 @@ roc_cpt_ctx_write(struct roc_cpt_lf *lf, void *sa_dptr, 
void *sa_cptr,
        inst->w4.s.opcode_minor = ROC_IE_OT_MINOR_OP_WRITE_SA;
        inst->w7.s.cptr = (uint64_t)sa_cptr;
        inst->w7.s.ctx_val = 1;
-       inst->w7.s.egrp = ROC_CPT_DFLT_ENG_GRP_SE_IE;
+       inst->w7.s.egrp = egrp;
 
        lmt_arg = ROC_CN10K_CPT_LMT_ARG | (uint64_t)lmt_id;
        io_addr = lf->io_addr | ROC_CN10K_CPT_INST_DW_M1 << 4;
@@ -1276,3 +1300,12 @@ roc_cpt_int_misc_cb_unregister(roc_cpt_int_misc_cb_t cb, 
void *args)
        int_cb.cb_args = NULL;
        return 0;
 }
+
+bool
+roc_cpt_has_ie_engines(void)
+{
+       if (roc_model_is_cn9k() || roc_model_is_cn10k())
+               return true;
+
+       return false;
+}
diff --git a/drivers/common/cnxk/roc_cpt.h b/drivers/common/cnxk/roc_cpt.h
index 70129531eb..c8cf9354da 100644
--- a/drivers/common/cnxk/roc_cpt.h
+++ b/drivers/common/cnxk/roc_cpt.h
@@ -226,4 +226,7 @@ int __roc_api roc_cpt_ctx_write(struct roc_cpt_lf *lf, void 
*sa_dptr, void *sa_c
 
 void __roc_api roc_cpt_int_misc_cb_register(roc_cpt_int_misc_cb_t cb, void 
*args);
 int __roc_api roc_cpt_int_misc_cb_unregister(roc_cpt_int_misc_cb_t cb, void 
*args);
+
+bool roc_cpt_has_ie_engines(void);
+
 #endif /* _ROC_CPT_H_ */
-- 
2.34.1

Reply via email to