octeontx2-af: Verify NPA/SSO/NIX PF_FUNC mapping
authorSunil Goutham <sgoutham@marvell.com>
Mon, 19 Nov 2018 10:47:35 +0000 (16:17 +0530)
committerDavid S. Miller <davem@davemloft.net>
Tue, 20 Nov 2018 01:56:08 +0000 (17:56 -0800)
While mapping a NIX LF to a NPA LF attached PF_FUNC or
SSO LF attached PF_FUNC, verify if PF_FUNC is valid and
if that PF_FUNC has a LF of that block attached to it or not.

Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/octeontx2/af/mbox.h
drivers/net/ethernet/marvell/octeontx2/af/rvu.c
drivers/net/ethernet/marvell/octeontx2/af/rvu.h
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c

index 3c38e32..de31857 100644 (file)
@@ -405,6 +405,8 @@ enum nix_af_status {
        NIX_AF_INVAL_TXSCHQ_CFG     = -412,
        NIX_AF_SMQ_FLUSH_FAILED     = -413,
        NIX_AF_ERR_LF_RESET         = -414,
+       NIX_AF_INVAL_NPA_PF_FUNC    = -419,
+       NIX_AF_INVAL_SSO_PF_FUNC    = -420,
 };
 
 /* For NIX LF context alloc and init */
index e59dfd3..517922f 100644 (file)
@@ -337,6 +337,28 @@ struct rvu_pfvf *rvu_get_pfvf(struct rvu *rvu, int pcifunc)
                return &rvu->pf[rvu_get_pf(pcifunc)];
 }
 
+static bool is_pf_func_valid(struct rvu *rvu, u16 pcifunc)
+{
+       int pf, vf, nvfs;
+       u64 cfg;
+
+       pf = rvu_get_pf(pcifunc);
+       if (pf >= rvu->hw->total_pfs)
+               return false;
+
+       if (!(pcifunc & RVU_PFVF_FUNC_MASK))
+               return true;
+
+       /* Check if VF is within number of VFs attached to this PF */
+       vf = (pcifunc & RVU_PFVF_FUNC_MASK) - 1;
+       cfg = rvu_read64(rvu, BLKADDR_RVUM, RVU_PRIV_PFX_CFG(pf));
+       nvfs = (cfg >> 12) & 0xFF;
+       if (vf >= nvfs)
+               return false;
+
+       return true;
+}
+
 bool is_block_implemented(struct rvu_hwinfo *hw, int blkaddr)
 {
        struct rvu_block *block;
@@ -860,6 +882,22 @@ static u16 rvu_get_rsrc_mapcount(struct rvu_pfvf *pfvf, int blktype)
        return 0;
 }
 
+bool is_pffunc_map_valid(struct rvu *rvu, u16 pcifunc, int blktype)
+{
+       struct rvu_pfvf *pfvf;
+
+       if (!is_pf_func_valid(rvu, pcifunc))
+               return false;
+
+       pfvf = rvu_get_pfvf(rvu, pcifunc);
+
+       /* Check if this PFFUNC has a LF of type blktype attached */
+       if (!rvu_get_rsrc_mapcount(pfvf, blktype))
+               return false;
+
+       return true;
+}
+
 static int rvu_lookup_rsrc(struct rvu *rvu, struct rvu_block *block,
                           int pcifunc, int slot)
 {
index 9727164..7c96942 100644 (file)
@@ -255,6 +255,7 @@ int rvu_get_pf(u16 pcifunc);
 struct rvu_pfvf *rvu_get_pfvf(struct rvu *rvu, int pcifunc);
 void rvu_get_pf_numvfs(struct rvu *rvu, int pf, int *numvfs, int *hwvf);
 bool is_block_implemented(struct rvu_hwinfo *hw, int blkaddr);
+bool is_pffunc_map_valid(struct rvu *rvu, u16 pcifunc, int blktype);
 int rvu_get_lf(struct rvu *rvu, struct rvu_block *block, u16 pcifunc, u16 slot);
 int rvu_lf_reset(struct rvu *rvu, struct rvu_block *block, int lf);
 int rvu_get_blkaddr(struct rvu *rvu, int blktype, u16 pcifunc);
index a8d9fdf..55fd2fd 100644 (file)
@@ -694,6 +694,24 @@ int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
        if (nixlf < 0)
                return NIX_AF_ERR_AF_LF_INVALID;
 
+       /* Check if requested 'NIXLF <=> NPALF' mapping is valid */
+       if (req->npa_func) {
+               /* If default, use 'this' NIXLF's PFFUNC */
+               if (req->npa_func == RVU_DEFAULT_PF_FUNC)
+                       req->npa_func = pcifunc;
+               if (!is_pffunc_map_valid(rvu, req->npa_func, BLKTYPE_NPA))
+                       return NIX_AF_INVAL_NPA_PF_FUNC;
+       }
+
+       /* Check if requested 'NIXLF <=> SSOLF' mapping is valid */
+       if (req->sso_func) {
+               /* If default, use 'this' NIXLF's PFFUNC */
+               if (req->sso_func == RVU_DEFAULT_PF_FUNC)
+                       req->sso_func = pcifunc;
+               if (!is_pffunc_map_valid(rvu, req->sso_func, BLKTYPE_SSO))
+                       return NIX_AF_INVAL_SSO_PF_FUNC;
+       }
+
        /* If RSS is being enabled, check if requested config is valid.
         * RSS table size should be power of two, otherwise
         * RSS_GRP::OFFSET + adder might go beyond that group or
@@ -798,18 +816,10 @@ int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
        /* Enable LMTST for this NIX LF */
        rvu_write64(rvu, blkaddr, NIX_AF_LFX_TX_CFG2(nixlf), BIT_ULL(0));
 
-       /* Set CQE/WQE size, NPA_PF_FUNC for SQBs and also SSO_PF_FUNC
-        * If requester has sent a 'RVU_DEFAULT_PF_FUNC' use this NIX LF's
-        * PCIFUNC itself.
-        */
-       if (req->npa_func == RVU_DEFAULT_PF_FUNC)
-               cfg = pcifunc;
-       else
+       /* Set CQE/WQE size, NPA_PF_FUNC for SQBs and also SSO_PF_FUNC */
+       if (req->npa_func)
                cfg = req->npa_func;
-
-       if (req->sso_func == RVU_DEFAULT_PF_FUNC)
-               cfg |= (u64)pcifunc << 16;
-       else
+       if (req->sso_func)
                cfg |= (u64)req->sso_func << 16;
 
        cfg |= (u64)req->xqe_sz << 33;