lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID:
 <BY3PR18MB47079974090AAC62DAB458B9A0432@BY3PR18MB4707.namprd18.prod.outlook.com>
Date: Mon, 21 Oct 2024 15:33:31 +0000
From: Sai Krishna Gajula <saikrishnag@...vell.com>
To: Kalesh Anakkur Purayil <kalesh-anakkur.purayil@...adcom.com>
CC: "davem@...emloft.net" <davem@...emloft.net>,
        "edumazet@...gle.com"
	<edumazet@...gle.com>,
        "kuba@...nel.org" <kuba@...nel.org>,
        "pabeni@...hat.com" <pabeni@...hat.com>,
        "netdev@...r.kernel.org"
	<netdev@...r.kernel.org>,
        "linux-kernel@...r.kernel.org"
	<linux-kernel@...r.kernel.org>,
        Sunil Kovvuri Goutham <sgoutham@...vell.com>,
        Geethasowjanya Akula <gakula@...vell.com>,
        Linu Cherian
	<lcherian@...vell.com>, Jerin Jacob <jerinj@...vell.com>,
        Hariprasad Kelam
	<hkelam@...vell.com>,
        Subbaraya Sundeep Bhatta <sbhatta@...vell.com>
Subject: Re: [net-next PATCH 3/6] octeontx2-af: CN20k mbox to support AF
 REQ/ACK functionality


> -----Original Message-----
> From: Kalesh Anakkur Purayil <kalesh-anakkur.purayil@...adcom.com>
> Sent: Monday, October 21, 2024 9:06 AM
> To: Sai Krishna Gajula <saikrishnag@...vell.com>
> Cc: davem@...emloft.net; edumazet@...gle.com; kuba@...nel.org;
> pabeni@...hat.com; netdev@...r.kernel.org; linux-kernel@...r.kernel.org;
> Sunil Kovvuri Goutham <sgoutham@...vell.com>; Geethasowjanya Akula
> <gakula@...vell.com>; Linu Cherian <lcherian@...vell.com>; Jerin Jacob
> <jerinj@...vell.com>; Hariprasad Kelam <hkelam@...vell.com>; Subbaraya
> Sundeep Bhatta <sbhatta@...vell.com>
> Subject: Re: [net-next PATCH 3/6] octeontx2-af: CN20k mbox to
> support AF REQ/ACK functionality
> 
> On Sat, Oct 19, 2024 at 2:02 AM Sai Krishna <saikrishnag@...vell.com>
> wrote:
> >
> > This implementation uses separate trigger interrupts for request,
> > response MBOX messages against using trigger message data in CN10K.
> > This patch adds support for basic mbox implementation for CN20K
> > from AF side.
> >
> > Signed-off-by: Sunil Kovvuri Goutham <sgoutham@...vell.com>
> > Signed-off-by: Sai Krishna <saikrishnag@...vell.com>
> > ---
> >  .../ethernet/marvell/octeontx2/af/cn20k/api.h |   8 +
> >  .../marvell/octeontx2/af/cn20k/mbox_init.c    | 214
> ++++++++++++++++++
> >  .../ethernet/marvell/octeontx2/af/cn20k/reg.h |  17 ++
> >  .../marvell/octeontx2/af/cn20k/struct.h       |  25 ++
> >  .../net/ethernet/marvell/octeontx2/af/mbox.c  |  77 ++++++-
> >  .../net/ethernet/marvell/octeontx2/af/mbox.h  |   1 +
> >  .../net/ethernet/marvell/octeontx2/af/rvu.c   |  62 +++--
> >  .../net/ethernet/marvell/octeontx2/af/rvu.h   |  16 +-
> >  8 files changed, 401 insertions(+), 19 deletions(-)
> >  create mode 100644
> drivers/net/ethernet/marvell/octeontx2/af/cn20k/struct.h
> >
> > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/api.h
> b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/api.h
> > index b57bd38181aa..9436a4a4d815 100644
> > --- a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/api.h
> > +++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/api.h
> > @@ -15,8 +15,16 @@ struct ng_rvu {
> >         struct qmem             *pf_mbox_addr;
> >  };
> >
> > +struct rvu;
> > +
> >  /* Mbox related APIs */
> >  int cn20k_rvu_mbox_init(struct rvu *rvu, int type, int num);
> > +int cn20k_register_afpf_mbox_intr(struct rvu *rvu);
> >  int cn20k_rvu_get_mbox_regions(struct rvu *rvu, void **mbox_addr,
> >                                int num, int type, unsigned long *pf_bmap);
> > +void cn20k_rvu_enable_mbox_intr(struct rvu *rvu);
> > +void cn20k_rvu_unregister_interrupts(struct rvu *rvu);
> > +void cn20k_free_mbox_memory(struct rvu *rvu);
> > +int cn20k_mbox_setup(struct otx2_mbox *mbox, struct pci_dev *pdev,
> > +                    void *reg_base, int direction, int ndevs);
> >  #endif /* CN20K_API_H */
> > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/mbox_init.c
> b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/mbox_init.c
> > index 0d7ad31e5dfb..e19de47da84a 100644
> > --- a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/mbox_init.c
> > +++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/mbox_init.c
> > @@ -13,6 +13,137 @@
> >  #include "reg.h"
> >  #include "api.h"
> >
> > +/* CN20K mbox PFx => AF irq handler */
> > +static irqreturn_t cn20k_mbox_pf_common_intr_handler(int irq, void
> *rvu_irq)
> > +{
> > +       struct rvu_irq_data *rvu_irq_data = (struct rvu_irq_data *)rvu_irq;
> > +       struct rvu *rvu = rvu_irq_data->rvu;
> > +       u64 intr;
> > +
> > +       /* Clear interrupts */
> > +       intr = rvu_read64(rvu, BLKADDR_RVUM, rvu_irq_data->intr_status);
> > +       rvu_write64(rvu, BLKADDR_RVUM, rvu_irq_data->intr_status, intr);
> > +
> > +       if (intr)
> > +               trace_otx2_msg_interrupt(rvu->pdev, "PF(s) to AF", intr);
> > +
> > +       /* Sync with mbox memory region */
> > +       rmb();
> > +
> > +       rvu_irq_data->rvu_queue_work_hdlr(&rvu->afpf_wq_info,
> > +                                         rvu_irq_data->start,
> > +                                         rvu_irq_data->mdevs, intr);
> > +
> > +       return IRQ_HANDLED;
> > +}
> > +
> > +void cn20k_rvu_enable_mbox_intr(struct rvu *rvu)
> > +{
> > +       struct rvu_hwinfo *hw = rvu->hw;
> > +
> > +       /* Clear spurious irqs, if any */
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> > +                   RVU_MBOX_AF_PFAF_INT(0), INTR_MASK(hw->total_pfs));
> > +
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> > +                   RVU_MBOX_AF_PFAF_INT(1), INTR_MASK(hw->total_pfs - 64));
> > +
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> > +                   RVU_MBOX_AF_PFAF1_INT(0), INTR_MASK(hw->total_pfs));
> > +
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> > +                   RVU_MBOX_AF_PFAF1_INT(1), INTR_MASK(hw->total_pfs - 64));
> > +
> > +       /* Enable mailbox interrupt for all PFs except PF0 i.e AF itself */
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> RVU_MBOX_AF_PFAF_INT_ENA_W1S(0),
> > +                   INTR_MASK(hw->total_pfs) & ~1ULL);
> > +
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> RVU_MBOX_AF_PFAF_INT_ENA_W1S(1),
> > +                   INTR_MASK(hw->total_pfs - 64));
> > +
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> RVU_MBOX_AF_PFAF1_INT_ENA_W1S(0),
> > +                   INTR_MASK(hw->total_pfs) & ~1ULL);
> > +
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> RVU_MBOX_AF_PFAF1_INT_ENA_W1S(1),
> > +                   INTR_MASK(hw->total_pfs - 64));
> > +}
> > +
> > +void cn20k_rvu_unregister_interrupts(struct rvu *rvu)
> > +{
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> RVU_MBOX_AF_PFAF_INT_ENA_W1C(0),
> > +                   INTR_MASK(rvu->hw->total_pfs) & ~1ULL);
> > +
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> RVU_MBOX_AF_PFAF_INT_ENA_W1C(1),
> > +                   INTR_MASK(rvu->hw->total_pfs - 64));
> > +
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> RVU_MBOX_AF_PFAF1_INT_ENA_W1C(0),
> > +                   INTR_MASK(rvu->hw->total_pfs) & ~1ULL);
> > +
> > +       rvu_write64(rvu, BLKADDR_RVUM,
> RVU_MBOX_AF_PFAF1_INT_ENA_W1C(1),
> > +                   INTR_MASK(rvu->hw->total_pfs - 64));
> > +}
> > +
> > +int cn20k_register_afpf_mbox_intr(struct rvu *rvu)
> > +{
> > +       struct rvu_irq_data *irq_data;
> > +       int intr_vec, ret, vec = 0;
> > +
> > +       /* irq data for 4 PF intr vectors */
> > +       irq_data = devm_kcalloc(rvu->dev, 4,
> > +                               sizeof(struct rvu_irq_data), GFP_KERNEL);
> > +       if (!irq_data)
> > +               return -ENOMEM;
> > +
> > +       for (intr_vec = RVU_AF_CN20K_INT_VEC_PFAF_MBOX0; intr_vec <=
> > +                               RVU_AF_CN20K_INT_VEC_PFAF1_MBOX1; intr_vec++,
> > +                               vec++) {
> > +               switch (intr_vec) {
> > +               case RVU_AF_CN20K_INT_VEC_PFAF_MBOX0:
> > +                       irq_data[vec].intr_status =
> > +                                               RVU_MBOX_AF_PFAF_INT(0);
> > +                       irq_data[vec].start = 0;
> > +                       irq_data[vec].mdevs = 64;
> > +                       break;
> > +               case RVU_AF_CN20K_INT_VEC_PFAF_MBOX1:
> > +                       irq_data[vec].intr_status =
> > +                                               RVU_MBOX_AF_PFAF_INT(1);
> > +                       irq_data[vec].start = 64;
> > +                       irq_data[vec].mdevs = 96;
> > +                       break;
> > +               case RVU_AF_CN20K_INT_VEC_PFAF1_MBOX0:
> > +                       irq_data[vec].intr_status =
> > +                                               RVU_MBOX_AF_PFAF1_INT(0);
> > +                       irq_data[vec].start = 0;
> > +                       irq_data[vec].mdevs = 64;
> > +                       break;
> > +               case RVU_AF_CN20K_INT_VEC_PFAF1_MBOX1:
> > +                       irq_data[vec].intr_status =
> > +                                               RVU_MBOX_AF_PFAF1_INT(1);
> > +                       irq_data[vec].start = 64;
> > +                       irq_data[vec].mdevs = 96;
> > +                       break;
> > +               }
> > +               irq_data[vec].rvu_queue_work_hdlr = rvu_queue_work;
> > +               irq_data[vec].vec_num = intr_vec;
> > +               irq_data[vec].rvu = rvu;
> > +
> > +               /* Register mailbox interrupt handler */
> > +               sprintf(&rvu->irq_name[intr_vec * NAME_SIZE],
> > +                       "RVUAF PFAF%d Mbox%d",
> > +                       vec / 2, vec % 2);
> > +               ret = request_irq(pci_irq_vector(rvu->pdev, intr_vec),
> > +                                 rvu->ng_rvu->rvu_mbox_ops->pf_intr_handler, 0,
> > +                                 &rvu->irq_name[intr_vec * NAME_SIZE],
> > +                                 &irq_data[vec]);
> > +               if (ret)
> > +                       return ret;
> > +
> > +               rvu->irq_allocated[intr_vec] = true;
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> >  int cn20k_rvu_get_mbox_regions(struct rvu *rvu, void **mbox_addr,
> >                                int num, int type, unsigned long *pf_bmap)
> >  {
> > @@ -37,6 +168,50 @@ int cn20k_rvu_get_mbox_regions(struct rvu *rvu,
> void **mbox_addr,
> >         return -ENOMEM;
> >  }
> >
> > +static struct mbox_ops cn20k_mbox_ops = {
> > +       .pf_intr_handler = cn20k_mbox_pf_common_intr_handler,
> > +};
> > +
> > +static int rvu_alloc_mbox_memory(struct rvu *rvu, int type,
> > +                                int ndevs, int mbox_size)
> > +{
> > +       struct qmem *mbox_addr;
> > +       dma_addr_t iova;
> > +       int pf, err;
> > +
> > +       /* Allocate contiguous memory for mailbox communication.
> > +        * eg: AF <=> PFx mbox memory
> > +        * This allocated memory is split into chunks of MBOX_SIZE
> > +        * and setup into each of the RVU PFs. In HW this memory will
> > +        * get aliased to an offset within BAR2 of those PFs.
> > +        *
> > +        * AF will access mbox memory using direct physical addresses
> > +        * and PFs will access the same shared memory from BAR2.
> > +        */
> > +
> > +       err = qmem_alloc(rvu->dev, &mbox_addr, ndevs, mbox_size);
> > +       if (err) {
> > +               dev_err(rvu->dev, "qmem alloc fail\n");
> [Kalesh] I think you can drop the failure log message from here. I see
> in other places there is no error log in case qmem_alloc fails

Ack, will submit V2 patch with the suggested changes.

> > +               return -ENOMEM;
> > +       }
> > +
> > +       switch (type) {
> > +       case TYPE_AFPF:
> > +               rvu->ng_rvu->pf_mbox_addr = mbox_addr;
> > +               iova = (u64)mbox_addr->iova;
> > +               for (pf = 0; pf < ndevs; pf++) {
> > +                       rvu_write64(rvu, BLKADDR_RVUM,
> RVU_MBOX_AF_PFX_ADDR(pf),
> > +                                   (u64)iova);
> > +                       iova += mbox_size;
> > +               }
> > +               break;
> > +       default:
> > +               return 0;
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> >  int cn20k_rvu_mbox_init(struct rvu *rvu, int type, int ndevs)
> >  {
> >         int dev;
> > @@ -44,9 +219,48 @@ int cn20k_rvu_mbox_init(struct rvu *rvu, int type,
> int ndevs)
> >         if (!is_cn20k(rvu->pdev))
> >                 return 0;
> >
> > +       rvu->ng_rvu->rvu_mbox_ops = &cn20k_mbox_ops;
> > +
> >         for (dev = 0; dev < ndevs; dev++)
> >                 rvu_write64(rvu, BLKADDR_RVUM,
> >                             RVU_MBOX_AF_PFX_CFG(dev), ilog2(MBOX_SIZE));
> >
> > +       return rvu_alloc_mbox_memory(rvu, type, ndevs, MBOX_SIZE);
> > +}
> > +
> > +void cn20k_free_mbox_memory(struct rvu *rvu)
> > +{
> > +       qmem_free(rvu->dev, rvu->ng_rvu->pf_mbox_addr);
> > +}
> > +
> > +int rvu_alloc_cint_qint_mem(struct rvu *rvu, struct rvu_pfvf *pfvf,
> > +                           int blkaddr, int nixlf)
> > +{
> > +       int qints, hwctx_size, err;
> > +       u64 cfg, ctx_cfg;
> > +
> > +       ctx_cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST3);
> > +       /* Alloc memory for CQINT's HW contexts */
> > +       cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST2);
> > +       qints = (cfg >> 24) & 0xFFF;
> > +       hwctx_size = 1UL << ((ctx_cfg >> 24) & 0xF);
> > +       err = qmem_alloc(rvu->dev, &pfvf->cq_ints_ctx, qints, hwctx_size);
> > +       if (err)
> > +               return -ENOMEM;
> > +
> > +       rvu_write64(rvu, blkaddr, NIX_AF_LFX_CINTS_BASE(nixlf),
> > +                   (u64)pfvf->cq_ints_ctx->iova);
> > +
> > +       /* Alloc memory for QINT's HW contexts */
> > +       cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST2);
> > +       qints = (cfg >> 12) & 0xFFF;
> > +       hwctx_size = 1UL << ((ctx_cfg >> 20) & 0xF);
> > +       err = qmem_alloc(rvu->dev, &pfvf->nix_qints_ctx, qints, hwctx_size);
> > +       if (err)
> > +               return -ENOMEM;
> > +
> > +       rvu_write64(rvu, blkaddr, NIX_AF_LFX_QINTS_BASE(nixlf),
> > +                   (u64)pfvf->nix_qints_ctx->iova);
> > +
> >         return 0;
> >  }
> > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/reg.h
> b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/reg.h
> > index 58152a4024ec..df2d52567da7 100644
> > --- a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/reg.h
> > +++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/reg.h
> > @@ -19,6 +19,23 @@
> >  /* RVU AF BAR0 Mbox registers for AF => PFx */
> >  #define RVU_MBOX_AF_PFX_ADDR(a)                        (0x5000 | (a) << 4)
> >  #define RVU_MBOX_AF_PFX_CFG(a)                 (0x6000 | (a) << 4)
> > +#define RVU_MBOX_AF_AFPFX_TRIGX(a)             (0x9000 | (a) << 3)
> > +#define RVU_MBOX_AF_PFAF_INT(a)                        (0x2980 | (a) << 6)
> > +#define RVU_MBOX_AF_PFAF_INT_W1S(a)            (0x2988 | (a) << 6)
> > +#define RVU_MBOX_AF_PFAF_INT_ENA_W1S(a)                (0x2990 | (a) <<
> 6)
> > +#define RVU_MBOX_AF_PFAF_INT_ENA_W1C(a)                (0x2998 | (a) <<
> 6)
> > +#define RVU_MBOX_AF_PFAF1_INT(a)               (0x29A0 | (a) << 6)
> > +#define RVU_MBOX_AF_PFAF1_INT_W1S(a)           (0x29A8 | (a) << 6)
> > +#define RVU_MBOX_AF_PFAF1_INT_ENA_W1S(a)       (0x29B0 | (a) << 6)
> > +#define RVU_MBOX_AF_PFAF1_INT_ENA_W1C(a)       (0x29B8 | (a) << 6)
> > +
> > +/* RVU PF => AF mbox registers */
> > +#define RVU_MBOX_PF_PFAF_TRIGX(a)              (0xC00 | (a) << 3)
> > +#define RVU_MBOX_PF_INT                                (0xC20)
> > +#define RVU_MBOX_PF_INT_W1S                    (0xC28)
> > +#define RVU_MBOX_PF_INT_ENA_W1S                        (0xC30)
> > +#define RVU_MBOX_PF_INT_ENA_W1C                        (0xC38)
> > +
> >  #define RVU_AF_BAR2_SEL                                (0x9000000)
> >  #define RVU_AF_BAR2_PFID                       (0x16400)
> >  #define NIX_CINTX_INT_W1S(a)                   (0xd30 | (a) << 12)
> > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/struct.h
> b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/struct.h
> > new file mode 100644
> > index 000000000000..fccad6e422e8
> > --- /dev/null
> > +++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/struct.h
> > @@ -0,0 +1,25 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +/* Marvell RVU Admin Function driver
> > + *
> > + * Copyright (C) 2024 Marvell.
> > + *
> > + */
> > +
> > +#ifndef STRUCT_H
> > +#define STRUCT_H
> > +
> > +/* RVU Admin function Interrupt Vector Enumeration */
> > +enum rvu_af_cn20k_int_vec_e {
> > +       RVU_AF_CN20K_INT_VEC_POISON             = 0x0,
> > +       RVU_AF_CN20K_INT_VEC_PFFLR0             = 0x1,
> > +       RVU_AF_CN20K_INT_VEC_PFFLR1             = 0x2,
> > +       RVU_AF_CN20K_INT_VEC_PFME0              = 0x3,
> > +       RVU_AF_CN20K_INT_VEC_PFME1              = 0x4,
> > +       RVU_AF_CN20K_INT_VEC_GEN                = 0x5,
> > +       RVU_AF_CN20K_INT_VEC_PFAF_MBOX0         = 0x6,
> > +       RVU_AF_CN20K_INT_VEC_PFAF_MBOX1         = 0x7,
> > +       RVU_AF_CN20K_INT_VEC_PFAF1_MBOX0        = 0x8,
> > +       RVU_AF_CN20K_INT_VEC_PFAF1_MBOX1        = 0x9,
> > +       RVU_AF_CN20K_INT_VEC_CNT                = 0xa,
> > +};
> > +#endif
> > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.c
> b/drivers/net/ethernet/marvell/octeontx2/af/mbox.c
> > index 1e3e72107a9d..15aaa5e166e4 100644
> > --- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.c
> > +++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.c
> > @@ -46,8 +46,10 @@ void __otx2_mbox_reset(struct otx2_mbox *mbox,
> int devid)
> >         mdev->rsp_size = 0;
> >         tx_hdr->num_msgs = 0;
> >         tx_hdr->msg_size = 0;
> > +       tx_hdr->sig = 0;
> >         rx_hdr->num_msgs = 0;
> >         rx_hdr->msg_size = 0;
> > +       rx_hdr->sig = 0;
> >  }
> >  EXPORT_SYMBOL(__otx2_mbox_reset);
> >
> > @@ -71,9 +73,78 @@ void otx2_mbox_destroy(struct otx2_mbox *mbox)
> >  }
> >  EXPORT_SYMBOL(otx2_mbox_destroy);
> >
> > +int cn20k_mbox_setup(struct otx2_mbox *mbox, struct pci_dev *pdev,
> > +                    void *reg_base, int direction, int ndevs)
> > +{
> > +       switch (direction) {
> > +       case MBOX_DIR_AFPF:
> > +               mbox->tx_start = MBOX_DOWN_TX_START;
> > +               mbox->rx_start = MBOX_DOWN_RX_START;
> > +               mbox->tx_size  = MBOX_DOWN_TX_SIZE;
> > +               mbox->rx_size  = MBOX_DOWN_RX_SIZE;
> > +               break;
> > +       case MBOX_DIR_PFAF:
> > +               mbox->tx_start = MBOX_DOWN_RX_START;
> > +               mbox->rx_start = MBOX_DOWN_TX_START;
> > +               mbox->tx_size  = MBOX_DOWN_RX_SIZE;
> > +               mbox->rx_size  = MBOX_DOWN_TX_SIZE;
> > +               break;
> > +       case MBOX_DIR_AFPF_UP:
> > +               mbox->tx_start = MBOX_UP_TX_START;
> > +               mbox->rx_start = MBOX_UP_RX_START;
> > +               mbox->tx_size  = MBOX_UP_TX_SIZE;
> > +               mbox->rx_size  = MBOX_UP_RX_SIZE;
> > +               break;
> > +       case MBOX_DIR_PFAF_UP:
> > +               mbox->tx_start = MBOX_UP_RX_START;
> > +               mbox->rx_start = MBOX_UP_TX_START;
> > +               mbox->tx_size  = MBOX_UP_RX_SIZE;
> > +               mbox->rx_size  = MBOX_UP_TX_SIZE;
> > +               break;
> > +       default:
> > +               return -ENODEV;
> > +       }
> > +
> > +       switch (direction) {
> > +       case MBOX_DIR_AFPF:
> > +               mbox->trigger = RVU_MBOX_AF_AFPFX_TRIGX(1);
> > +               mbox->tr_shift = 4;
> > +               break;
> > +       case MBOX_DIR_AFPF_UP:
> > +               mbox->trigger = RVU_MBOX_AF_AFPFX_TRIGX(0);
> > +               mbox->tr_shift = 4;
> > +               break;
> > +       case MBOX_DIR_PFAF:
> > +               mbox->trigger = RVU_MBOX_PF_PFAF_TRIGX(0);
> > +               mbox->tr_shift = 0;
> > +               break;
> > +       case MBOX_DIR_PFAF_UP:
> > +               mbox->trigger = RVU_MBOX_PF_PFAF_TRIGX(1);
> > +               mbox->tr_shift = 0;
> > +               break;
> > +       default:
> > +               return -ENODEV;
> > +       }
> > +       mbox->reg_base = reg_base;
> > +       mbox->pdev = pdev;
> > +
> > +       mbox->dev = kcalloc(ndevs, sizeof(struct otx2_mbox_dev),
> GFP_KERNEL);
> > +       if (!mbox->dev) {
> > +               otx2_mbox_destroy(mbox);
> > +               return -ENOMEM;
> > +       }
> > +       mbox->ndevs = ndevs;
> > +
> > +       return 0;
> > +}
> > +
> >  static int otx2_mbox_setup(struct otx2_mbox *mbox, struct pci_dev *pdev,
> >                            void *reg_base, int direction, int ndevs)
> >  {
> > +       if (is_cn20k(pdev))
> > +               return cn20k_mbox_setup(mbox, pdev, reg_base,
> > +                                                       direction, ndevs);
> > +
> >         switch (direction) {
> >         case MBOX_DIR_AFPF:
> >         case MBOX_DIR_PFVF:
> > @@ -252,7 +323,10 @@ static void otx2_mbox_msg_send_data(struct
> otx2_mbox *mbox, int devid, u64 data)
> >
> >         spin_lock(&mdev->mbox_lock);
> >
> > -       tx_hdr->msg_size = mdev->msg_size;
> > +       if (!tx_hdr->sig) {
> > +               tx_hdr->msg_size = mdev->msg_size;
> > +               tx_hdr->num_msgs = mdev->num_msgs;
> > +       }
> >
> >         /* Reset header for next messages */
> >         mdev->msg_size = 0;
> > @@ -266,7 +340,6 @@ static void otx2_mbox_msg_send_data(struct
> otx2_mbox *mbox, int devid, u64 data)
> >          * messages.  So this should be written after writing all the messages
> >          * to the shared memory.
> >          */
> > -       tx_hdr->num_msgs = mdev->num_msgs;
> >         rx_hdr->num_msgs = 0;
> >
> >         trace_otx2_msg_send(mbox->pdev, tx_hdr->num_msgs, tx_hdr-
> >msg_size);
> > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
> b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
> > index df64a18fe1d6..86d07fc4a7ff 100644
> > --- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
> > +++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
> > @@ -13,6 +13,7 @@
> >
> >  #include "rvu_struct.h"
> >  #include "common.h"
> > +#include "cn20k/struct.h"
> >
> >  #define MBOX_SIZE              SZ_64K
> >
> > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.c
> b/drivers/net/ethernet/marvell/octeontx2/af/rvu.c
> > index a5ebd7cd3a5c..e49f9bc7ebda 100644
> > --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu.c
> > +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu.c
> > @@ -755,6 +755,13 @@ static void rvu_free_hw_resources(struct rvu *rvu)
> >
> >         rvu_reset_msix(rvu);
> >         mutex_destroy(&rvu->rsrc_lock);
> > +
> > +       /* Free the QINT/CINt memory */
> > +       pfvf = &rvu->pf[RVU_AFPF];
> > +       if (pfvf->nix_qints_ctx)
> [Kalesh] This NULL check is not needed as qmem_free() already has as
> check inside that

Ack, will submit V2 patch with the suggested changes.

> > +               qmem_free(rvu->dev, pfvf->nix_qints_ctx);
> > +       if (pfvf->cq_ints_ctx)
> [Kalesh] same comment as above

Ack, will submit V2 patch with the suggested changes.

> > +               qmem_free(rvu->dev, pfvf->cq_ints_ctx);
> >  }
> >
> >  static void rvu_setup_pfvf_macaddress(struct rvu *rvu)
> > @@ -2683,6 +2690,11 @@ static void rvu_enable_mbox_intr(struct rvu
> *rvu)
> >  {
> >         struct rvu_hwinfo *hw = rvu->hw;
> >
> > +       if (is_cn20k(rvu->pdev)) {
> > +               cn20k_rvu_enable_mbox_intr(rvu);
> > +               return;
> > +       }
> > +
> >         /* Clear spurious irqs, if any */
> >         rvu_write64(rvu, BLKADDR_RVUM,
> >                     RVU_AF_PFAF_MBOX_INT, INTR_MASK(hw->total_pfs));
> > @@ -2936,9 +2948,12 @@ static void rvu_unregister_interrupts(struct rvu
> *rvu)
> >
> >         rvu_cpt_unregister_interrupts(rvu);
> >
> > -       /* Disable the Mbox interrupt */
> > -       rvu_write64(rvu, BLKADDR_RVUM,
> RVU_AF_PFAF_MBOX_INT_ENA_W1C,
> > -                   INTR_MASK(rvu->hw->total_pfs) & ~1ULL);
> > +       if (!is_cn20k(rvu->pdev))
> > +               /* Disable the Mbox interrupt */
> > +               rvu_write64(rvu, BLKADDR_RVUM,
> RVU_AF_PFAF_MBOX_INT_ENA_W1C,
> > +                           INTR_MASK(rvu->hw->total_pfs) & ~1ULL);
> > +       else
> > +               cn20k_rvu_unregister_interrupts(rvu);
> >
> >         /* Disable the PF FLR interrupt */
> >         rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_PFFLR_INT_ENA_W1C,
> > @@ -3001,20 +3016,30 @@ static int rvu_register_interrupts(struct rvu
> *rvu)
> >                 return ret;
> >         }
> >
> > -       /* Register mailbox interrupt handler */
> > -       sprintf(&rvu->irq_name[RVU_AF_INT_VEC_MBOX * NAME_SIZE],
> "RVUAF Mbox");
> > -       ret = request_irq(pci_irq_vector
> > -                         (rvu->pdev, RVU_AF_INT_VEC_MBOX),
> > -                         rvu->ng_rvu->rvu_mbox_ops->pf_intr_handler, 0,
> > -                         &rvu->irq_name[RVU_AF_INT_VEC_MBOX *
> > -                         NAME_SIZE], rvu);
> > -       if (ret) {
> > -               dev_err(rvu->dev,
> > -                       "RVUAF: IRQ registration failed for mbox\n");
> > -               goto fail;
> > -       }
> > +       if (!is_cn20k(rvu->pdev)) {
> > +               /* Register mailbox interrupt handler */
> > +               sprintf(&rvu->irq_name[RVU_AF_INT_VEC_MBOX * NAME_SIZE],
> > +                       "RVUAF Mbox");
> > +               ret = request_irq(pci_irq_vector
> > +                                 (rvu->pdev, RVU_AF_INT_VEC_MBOX),
> > +                                 rvu->ng_rvu->rvu_mbox_ops->pf_intr_handler, 0,
> > +                                 &rvu->irq_name[RVU_AF_INT_VEC_MBOX *
> > +                                 NAME_SIZE], rvu);
> > +               if (ret) {
> > +                       dev_err(rvu->dev,
> > +                               "RVUAF: IRQ registration failed for mbox\n");
> > +                       goto fail;
> > +               }
> >
> > -       rvu->irq_allocated[RVU_AF_INT_VEC_MBOX] = true;
> > +               rvu->irq_allocated[RVU_AF_INT_VEC_MBOX] = true;
> > +       } else {
> > +               ret = cn20k_register_afpf_mbox_intr(rvu);
> > +               if (ret) {
> > +                       dev_err(rvu->dev,
> > +                               "RVUAF: IRQ registration failed for mbox\n");
> > +                       goto fail;
> > +               }
> > +       }
> >
> >         /* Enable mailbox interrupts from all PFs */
> >         rvu_enable_mbox_intr(rvu);
> > @@ -3467,6 +3492,9 @@ static int rvu_probe(struct pci_dev *pdev, const
> struct pci_device_id *id)
> >                 ptp_start(rvu, rvu->fwdata->sclk, rvu->fwdata->ptp_ext_clk_rate,
> >                           rvu->fwdata->ptp_ext_tstamp);
> >
> > +       /* Alloc CINT and QINT memory */
> > +       rvu_alloc_cint_qint_mem(rvu, &rvu->pf[RVU_AFPF], BLKADDR_NIX0,
> > +                               (rvu->hw->block[BLKADDR_NIX0].lf.max));
> >         return 0;
> >  err_dl:
> >         rvu_unregister_dl(rvu);
> > @@ -3518,6 +3546,8 @@ static void rvu_remove(struct pci_dev *pdev)
> >         pci_set_drvdata(pdev, NULL);
> >
> >         devm_kfree(&pdev->dev, rvu->hw);
> > +       if (is_cn20k(rvu->pdev))
> > +               cn20k_free_mbox_memory(rvu);
> >         kfree(rvu->ng_rvu);
> >         devm_kfree(&pdev->dev, rvu);
> >  }
> > diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
> b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
> > index 9fd7aea8c481..c3a6947e5e70 100644
> > --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
> > +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
> > @@ -47,6 +47,9 @@
> >  #define RVU_PFVF_FUNC_MASK     rvu_pcifunc_func_mask
> >
> >  #ifdef CONFIG_DEBUG_FS
> > +
> > +#define RVU_AFPF           25
> > +
> >  struct dump_ctx {
> >         int     lf;
> >         int     id;
> > @@ -444,6 +447,16 @@ struct mbox_wq_info {
> >         struct workqueue_struct *mbox_wq;
> >  };
> >
> > +struct rvu_irq_data {
> > +       u64 intr_status;
> > +       void (*rvu_queue_work_hdlr)(struct mbox_wq_info *mw, int first,
> > +                                   int mdevs, u64 intr);
> > +       struct  rvu *rvu;
> > +       int vec_num;
> > +       int start;
> > +       int mdevs;
> > +};
> > +
> >  struct mbox_ops {
> >         irqreturn_t (*pf_intr_handler)(int irq, void *rvu_irq);
> >  };
> > @@ -956,7 +969,8 @@ int rvu_nix_mcast_get_mce_index(struct rvu *rvu,
> u16 pcifunc,
> >  int rvu_nix_mcast_update_mcam_entry(struct rvu *rvu, u16 pcifunc,
> >                                     u32 mcast_grp_idx, u16 mcam_index);
> >  void rvu_nix_flr_free_bpids(struct rvu *rvu, u16 pcifunc);
> > -
> > +int rvu_alloc_cint_qint_mem(struct rvu *rvu, struct rvu_pfvf *pfvf,
> > +                           int blkaddr, int nixlf);
> >  /* NPC APIs */
> >  void rvu_npc_freemem(struct rvu *rvu);
> >  int rvu_npc_get_pkind(struct rvu *rvu, u16 pf);
> > --
> > 2.25.1
> >
> >
> 
> 
> --
> Regards,
> Kalesh A P

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ