Message ID | 20240701090746.2171565-3-schalla@marvell.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Fixes for CPT and RSS configuration | expand |
On Mon, Jul 01, 2024 at 02:37:42PM +0530, Srujana Challa wrote: > On new silicon(cn10kb), the number of FLT interrupt vectors has > been reduced. Hence, this patch modifies the code to make > it work for both cn10ka and cn10kb. > I am tempted to think this is more about enabling new hardware than fixing a bug. But I do also see how one might argue otherwise. In any case, if this is a fix then a fixes tag should go here. > Signed-off-by: Srujana Challa <schalla@marvell.com> > --- > .../net/ethernet/marvell/octeontx2/af/mbox.h | 5 +- > .../ethernet/marvell/octeontx2/af/rvu_cpt.c | 73 ++++++++++++++++--- > .../marvell/octeontx2/af/rvu_struct.h | 5 +- > 3 files changed, 65 insertions(+), 18 deletions(-) > > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h > index 4a77f6fe2622..41b46724cb3d 100644 > --- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h > +++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h > @@ -1848,8 +1848,9 @@ struct cpt_flt_eng_info_req { > > struct cpt_flt_eng_info_rsp { > struct mbox_msghdr hdr; > - u64 flt_eng_map[CPT_10K_AF_INT_VEC_RVU]; > - u64 rcvrd_eng_map[CPT_10K_AF_INT_VEC_RVU]; > +#define CPT_AF_MAX_FLT_INT_VECS 3 > + u64 flt_eng_map[CPT_AF_MAX_FLT_INT_VECS]; > + u64 rcvrd_eng_map[CPT_AF_MAX_FLT_INT_VECS]; > u64 rsvd; > }; > > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c > index 98440a0241a2..38363ea56c6c 100644 > --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c > +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c > @@ -37,6 +37,38 @@ > (_rsp)->free_sts_##etype = free_sts; \ > }) > > +#define MAX_AE GENMASK_ULL(47, 32) > +#define MAX_IE GENMASK_ULL(31, 16) > +#define MAX_SE GENMASK_ULL(15, 0) > +static u32 cpt_max_engines_get(struct rvu *rvu) > +{ > + u16 max_ses, max_ies, max_aes; > + u64 reg; > + > + reg = rvu_read64(rvu, BLKADDR_CPT0, CPT_AF_CONSTANTS1); > + max_ses = FIELD_GET(MAX_SE, reg); > + max_ies = FIELD_GET(MAX_IE, reg); > + max_aes = FIELD_GET(MAX_AE, reg); > + > + return max_ses + max_ies + max_aes; > +} > + > +/* Number of flt interrupt vectors are depends on number of engines that > + * the chip has. Each flt vector represents 64 engines. > + */ > +static int cpt_10k_flt_nvecs_get(struct rvu *rvu) > +{ > + u32 max_engs; > + int flt_vecs; > + > + max_engs = cpt_max_engines_get(rvu); > + > + flt_vecs = (max_engs / 64); > + flt_vecs += (max_engs % 64) ? 1 : 0; > + > + return flt_vecs; > +} > + I think the callers of this function assume it will never return a value greater than 3. Perhaps it would be worth enforcing that, or WARNing if it not so. I'm thinking of a case a fw/hw revision comes along and this assumption no longer holds. > static irqreturn_t cpt_af_flt_intr_handler(int vec, void *ptr) > { > struct rvu_block *block = ptr; ...
> On Mon, Jul 01, 2024 at 02:37:42PM +0530, Srujana Challa wrote: > > On new silicon(cn10kb), the number of FLT interrupt vectors has been > > reduced. Hence, this patch modifies the code to make it work for both > > cn10ka and cn10kb. > > > > I am tempted to think this is more about enabling new hardware than fixing a > bug. But I do also see how one might argue otherwise. > > In any case, if this is a fix then a fixes tag should go here. I’ll exclude the patch from this series and submit it to net-next. > > Signed-off-by: Srujana Challa <schalla@marvell.com> > > --- > > .../net/ethernet/marvell/octeontx2/af/mbox.h | 5 +- > > .../ethernet/marvell/octeontx2/af/rvu_cpt.c | 73 ++++++++++++++++--- > > .../marvell/octeontx2/af/rvu_struct.h | 5 +- > > 3 files changed, 65 insertions(+), 18 deletions(-) > > > > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h > > b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h > > index 4a77f6fe2622..41b46724cb3d 100644 > > --- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h > > +++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h > > @@ -1848,8 +1848,9 @@ struct cpt_flt_eng_info_req { > > > > struct cpt_flt_eng_info_rsp { > > struct mbox_msghdr hdr; > > - u64 flt_eng_map[CPT_10K_AF_INT_VEC_RVU]; > > - u64 rcvrd_eng_map[CPT_10K_AF_INT_VEC_RVU]; > > +#define CPT_AF_MAX_FLT_INT_VECS 3 > > + u64 flt_eng_map[CPT_AF_MAX_FLT_INT_VECS]; > > + u64 rcvrd_eng_map[CPT_AF_MAX_FLT_INT_VECS]; > > u64 rsvd; > > }; > > > > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c > > b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c > > index 98440a0241a2..38363ea56c6c 100644 > > --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c > > +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c > > @@ -37,6 +37,38 @@ > > (_rsp)->free_sts_##etype = free_sts; \ > > }) > > > > +#define MAX_AE GENMASK_ULL(47, 32) > > +#define MAX_IE GENMASK_ULL(31, 16) > > +#define MAX_SE GENMASK_ULL(15, 0) > > +static u32 cpt_max_engines_get(struct rvu *rvu) { > > + u16 max_ses, max_ies, max_aes; > > + u64 reg; > > + > > + reg = rvu_read64(rvu, BLKADDR_CPT0, CPT_AF_CONSTANTS1); > > + max_ses = FIELD_GET(MAX_SE, reg); > > + max_ies = FIELD_GET(MAX_IE, reg); > > + max_aes = FIELD_GET(MAX_AE, reg); > > + > > + return max_ses + max_ies + max_aes; > > +} > > + > > +/* Number of flt interrupt vectors are depends on number of engines > > +that > > + * the chip has. Each flt vector represents 64 engines. > > + */ > > +static int cpt_10k_flt_nvecs_get(struct rvu *rvu) { > > + u32 max_engs; > > + int flt_vecs; > > + > > + max_engs = cpt_max_engines_get(rvu); > > + > > + flt_vecs = (max_engs / 64); > > + flt_vecs += (max_engs % 64) ? 1 : 0; > > + > > + return flt_vecs; > > +} > > + > > I think the callers of this function assume it will never return a value greater > than 3. Perhaps it would be worth enforcing that, or WARNing if it not so. I'm > thinking of a case a fw/hw revision comes along and this assumption no > longer holds. > > > static irqreturn_t cpt_af_flt_intr_handler(int vec, void *ptr) { > > struct rvu_block *block = ptr; > > ...
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h index 4a77f6fe2622..41b46724cb3d 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h +++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h @@ -1848,8 +1848,9 @@ struct cpt_flt_eng_info_req { struct cpt_flt_eng_info_rsp { struct mbox_msghdr hdr; - u64 flt_eng_map[CPT_10K_AF_INT_VEC_RVU]; - u64 rcvrd_eng_map[CPT_10K_AF_INT_VEC_RVU]; +#define CPT_AF_MAX_FLT_INT_VECS 3 + u64 flt_eng_map[CPT_AF_MAX_FLT_INT_VECS]; + u64 rcvrd_eng_map[CPT_AF_MAX_FLT_INT_VECS]; u64 rsvd; }; diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c index 98440a0241a2..38363ea56c6c 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c @@ -37,6 +37,38 @@ (_rsp)->free_sts_##etype = free_sts; \ }) +#define MAX_AE GENMASK_ULL(47, 32) +#define MAX_IE GENMASK_ULL(31, 16) +#define MAX_SE GENMASK_ULL(15, 0) +static u32 cpt_max_engines_get(struct rvu *rvu) +{ + u16 max_ses, max_ies, max_aes; + u64 reg; + + reg = rvu_read64(rvu, BLKADDR_CPT0, CPT_AF_CONSTANTS1); + max_ses = FIELD_GET(MAX_SE, reg); + max_ies = FIELD_GET(MAX_IE, reg); + max_aes = FIELD_GET(MAX_AE, reg); + + return max_ses + max_ies + max_aes; +} + +/* Number of flt interrupt vectors are depends on number of engines that + * the chip has. Each flt vector represents 64 engines. + */ +static int cpt_10k_flt_nvecs_get(struct rvu *rvu) +{ + u32 max_engs; + int flt_vecs; + + max_engs = cpt_max_engines_get(rvu); + + flt_vecs = (max_engs / 64); + flt_vecs += (max_engs % 64) ? 1 : 0; + + return flt_vecs; +} + static irqreturn_t cpt_af_flt_intr_handler(int vec, void *ptr) { struct rvu_block *block = ptr; @@ -150,17 +182,25 @@ static void cpt_10k_unregister_interrupts(struct rvu_block *block, int off) { struct rvu *rvu = block->rvu; int blkaddr = block->addr; + u32 max_engs; + u8 nr; int i; + max_engs = cpt_max_engines_get(rvu); + /* Disable all CPT AF interrupts */ - rvu_write64(rvu, blkaddr, CPT_AF_FLTX_INT_ENA_W1C(0), ~0ULL); - rvu_write64(rvu, blkaddr, CPT_AF_FLTX_INT_ENA_W1C(1), ~0ULL); - rvu_write64(rvu, blkaddr, CPT_AF_FLTX_INT_ENA_W1C(2), 0xFFFF); + for (i = CPT_10K_AF_INT_VEC_FLT0; i < cpt_10k_flt_nvecs_get(rvu); i++) { + nr = (max_engs > 64) ? 64 : max_engs; + max_engs -= nr; + rvu_write64(rvu, blkaddr, CPT_AF_FLTX_INT_ENA_W1C(i), + INTR_MASK(nr)); + } rvu_write64(rvu, blkaddr, CPT_AF_RVU_INT_ENA_W1C, 0x1); rvu_write64(rvu, blkaddr, CPT_AF_RAS_INT_ENA_W1C, 0x1); - for (i = 0; i < CPT_10K_AF_INT_VEC_CNT; i++) + /* CPT AF interrupt vectors are flt_int, rvu_int and ras_int. */ + for (i = 0; i < cpt_10k_flt_nvecs_get(rvu) + 2; i++) if (rvu->irq_allocated[off + i]) { free_irq(pci_irq_vector(rvu->pdev, off + i), block); rvu->irq_allocated[off + i] = false; @@ -206,12 +246,17 @@ void rvu_cpt_unregister_interrupts(struct rvu *rvu) static int cpt_10k_register_interrupts(struct rvu_block *block, int off) { + int rvu_intr_vec, ras_intr_vec; struct rvu *rvu = block->rvu; int blkaddr = block->addr; irq_handler_t flt_fn; + u32 max_engs; int i, ret; + u8 nr; + + max_engs = cpt_max_engines_get(rvu); - for (i = CPT_10K_AF_INT_VEC_FLT0; i < CPT_10K_AF_INT_VEC_RVU; i++) { + for (i = CPT_10K_AF_INT_VEC_FLT0; i < cpt_10k_flt_nvecs_get(rvu); i++) { sprintf(&rvu->irq_name[(off + i) * NAME_SIZE], "CPTAF FLT%d", i); switch (i) { @@ -229,20 +274,24 @@ static int cpt_10k_register_interrupts(struct rvu_block *block, int off) flt_fn, &rvu->irq_name[(off + i) * NAME_SIZE]); if (ret) goto err; - if (i == CPT_10K_AF_INT_VEC_FLT2) - rvu_write64(rvu, blkaddr, CPT_AF_FLTX_INT_ENA_W1S(i), 0xFFFF); - else - rvu_write64(rvu, blkaddr, CPT_AF_FLTX_INT_ENA_W1S(i), ~0ULL); + + nr = (max_engs > 64) ? 64 : max_engs; + max_engs -= nr; + rvu_write64(rvu, blkaddr, CPT_AF_FLTX_INT_ENA_W1S(i), + INTR_MASK(nr)); } - ret = rvu_cpt_do_register_interrupt(block, off + CPT_10K_AF_INT_VEC_RVU, + rvu_intr_vec = cpt_10k_flt_nvecs_get(rvu); + ras_intr_vec = rvu_intr_vec + 1; + + ret = rvu_cpt_do_register_interrupt(block, off + rvu_intr_vec, rvu_cpt_af_rvu_intr_handler, "CPTAF RVU"); if (ret) goto err; rvu_write64(rvu, blkaddr, CPT_AF_RVU_INT_ENA_W1S, 0x1); - ret = rvu_cpt_do_register_interrupt(block, off + CPT_10K_AF_INT_VEC_RAS, + ret = rvu_cpt_do_register_interrupt(block, off + ras_intr_vec, rvu_cpt_af_ras_intr_handler, "CPTAF RAS"); if (ret) @@ -922,7 +971,7 @@ int rvu_mbox_handler_cpt_flt_eng_info(struct rvu *rvu, struct cpt_flt_eng_info_r return blkaddr; block = &rvu->hw->block[blkaddr]; - for (vec = 0; vec < CPT_10K_AF_INT_VEC_RVU; vec++) { + for (vec = 0; vec < cpt_10k_flt_nvecs_get(block->rvu); vec++) { spin_lock_irqsave(&rvu->cpt_intr_lock, flags); rsp->flt_eng_map[vec] = block->cpt_flt_eng_map[vec]; rsp->rcvrd_eng_map[vec] = block->cpt_rcvrd_eng_map[vec]; diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_struct.h b/drivers/net/ethernet/marvell/octeontx2/af/rvu_struct.h index 5ef406c7e8a4..120776063e86 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_struct.h +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_struct.h @@ -71,13 +71,10 @@ enum cpt_af_int_vec_e { CPT_AF_INT_VEC_CNT = 0x4, }; -enum cpt_10k_af_int_vec_e { +enum cpt_cn10k_flt_int_vec_e { CPT_10K_AF_INT_VEC_FLT0 = 0x0, CPT_10K_AF_INT_VEC_FLT1 = 0x1, CPT_10K_AF_INT_VEC_FLT2 = 0x2, - CPT_10K_AF_INT_VEC_RVU = 0x3, - CPT_10K_AF_INT_VEC_RAS = 0x4, - CPT_10K_AF_INT_VEC_CNT = 0x5, }; /* NPA Admin function Interrupt Vector Enumeration */
On new silicon(cn10kb), the number of FLT interrupt vectors has been reduced. Hence, this patch modifies the code to make it work for both cn10ka and cn10kb. Signed-off-by: Srujana Challa <schalla@marvell.com> --- .../net/ethernet/marvell/octeontx2/af/mbox.h | 5 +- .../ethernet/marvell/octeontx2/af/rvu_cpt.c | 73 ++++++++++++++++--- .../marvell/octeontx2/af/rvu_struct.h | 5 +- 3 files changed, 65 insertions(+), 18 deletions(-)