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