octeontx2-af: Configure AF VFs to talk over LBK channels
authorTomasz Duszynski <tduszynski@marvell.com>
Mon, 19 Nov 2018 10:47:40 +0000 (16:17 +0530)
committerDavid S. Miller <davem@davemloft.net>
Tue, 20 Nov 2018 01:56:08 +0000 (17:56 -0800)
Configure AF VFs such that they are able to talk over consecutive
loopback channels.

If 8 VFs are attached to AF then communication will work as below:

TX      RX
lbk0 -> lbk1
lbk1 -> lbk0

lbk2 -> lbk3
lbk3 -> lbk2

lbk4 -> lbk5
lbk5 -> lbk4

lbk6 -> lbk7
lbk7 -> lbk6

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

index a8c89df0788675242291b9d4c11fe94998a45b53..9bddb032dd7ecb25e29ebb0d4ebba6157a1c5e6b 100644 (file)
@@ -174,7 +174,9 @@ enum nix_scheduler {
 
 #define MAX_LMAC_PKIND                 12
 #define NIX_LINK_CGX_LMAC(a, b)                (0 + 4 * (a) + (b))
+#define NIX_LINK_LBK(a)                        (12 + (a))
 #define NIX_CHAN_CGX_LMAC_CHX(a, b, c) (0x800 + 0x100 * (a) + 0x10 * (b) + (c))
+#define NIX_CHAN_LBK_CHX(a, b)         (0 + 0x100 * (a) + (b))
 
 /* NIX LSO format indices.
  * As of now TSO is the only one using, so statically assigning indices.
index d5743e472fb8dae3045c3d453617909b973b689f..8936cfbf10e00f4360ea966c54949c0c0e3f0084 100644 (file)
@@ -258,6 +258,11 @@ static inline u64 rvupf_read64(struct rvu *rvu, u64 offset)
 /* Function Prototypes
  * RVU
  */
+static inline int is_afvf(u16 pcifunc)
+{
+       return !(pcifunc & ~RVU_PFVF_FUNC_MASK);
+}
+
 int rvu_alloc_bitmap(struct rsrc_bmap *rsrc);
 int rvu_alloc_rsrc(struct rsrc_bmap *rsrc);
 void rvu_free_rsrc(struct rsrc_bmap *rsrc, int id);
index 58c6720141521157f8cc778ea8fbbfb03a040840..e46db89e91f9da628f46904072b4d7ad106bd765 100644 (file)
@@ -144,7 +144,7 @@ static int nix_interface_init(struct rvu *rvu, u16 pcifunc, int type, int nixlf)
 {
        struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
        u8 cgx_id, lmac_id;
-       int pkind, pf;
+       int pkind, pf, vf;
        int err;
 
        pf = rvu_get_pf(pcifunc);
@@ -170,6 +170,14 @@ static int nix_interface_init(struct rvu *rvu, u16 pcifunc, int type, int nixlf)
                rvu_npc_set_pkind(rvu, pkind, pfvf);
                break;
        case NIX_INTF_TYPE_LBK:
+               vf = (pcifunc & RVU_PFVF_FUNC_MASK) - 1;
+               pfvf->rx_chan_base = NIX_CHAN_LBK_CHX(0, vf);
+               pfvf->tx_chan_base = vf & 0x1 ? NIX_CHAN_LBK_CHX(0, vf - 1) :
+                                               NIX_CHAN_LBK_CHX(0, vf + 1);
+               pfvf->rx_chan_cnt = 1;
+               pfvf->tx_chan_cnt = 1;
+               rvu_npc_install_promisc_entry(rvu, pcifunc, nixlf,
+                                             pfvf->rx_chan_base, false);
                break;
        }
 
@@ -684,7 +692,7 @@ int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
                                  struct nix_lf_alloc_req *req,
                                  struct nix_lf_alloc_rsp *rsp)
 {
-       int nixlf, qints, hwctx_size, err, rc = 0;
+       int nixlf, qints, hwctx_size, intf, err, rc = 0;
        struct rvu_hwinfo *hw = rvu->hw;
        u16 pcifunc = req->hdr.pcifunc;
        struct rvu_block *block;
@@ -839,7 +847,8 @@ int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
        /* Config Rx pkt length, csum checks and apad  enable / disable */
        rvu_write64(rvu, blkaddr, NIX_AF_LFX_RX_CFG(nixlf), req->rx_cfg);
 
-       err = nix_interface_init(rvu, pcifunc, NIX_INTF_TYPE_CGX, nixlf);
+       intf = is_afvf(pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
+       err = nix_interface_init(rvu, pcifunc, intf, nixlf);
        if (err)
                goto free_mem;
 
@@ -1354,6 +1363,10 @@ static int nix_update_bcast_mce_list(struct rvu *rvu, u16 pcifunc, bool add)
        struct rvu_pfvf *pfvf;
        int blkaddr;
 
+       /* Broadcast pkt replication is not needed for AF's VFs, hence skip */
+       if (is_afvf(pcifunc))
+               return 0;
+
        blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
        if (blkaddr < 0)
                return 0;
@@ -1966,6 +1979,12 @@ int rvu_mbox_handler_nix_rxvlan_alloc(struct rvu *rvu, struct msg_req *req,
        int blkaddr, nixlf, err;
        struct rvu_pfvf *pfvf;
 
+       /* LBK VFs do not have separate MCAM UCAST entry hence
+        * skip allocating rxvlan for them
+        */
+       if (is_afvf(pcifunc))
+               return 0;
+
        pfvf = rvu_get_pfvf(rvu, pcifunc);
        if (pfvf->rxvlan)
                return 0;
index 738314067a9ea7da9eb2e8777c771662aa03a207..d93397e27e057f9a9cbaac9ef1c2da3c47915818 100644 (file)
@@ -314,6 +314,10 @@ void rvu_npc_install_ucast_entry(struct rvu *rvu, u16 pcifunc,
        int blkaddr, index, kwi;
        u64 mac = 0;
 
+       /* AF's VFs work in promiscuous mode */
+       if (is_afvf(pcifunc))
+               return;
+
        blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
        if (blkaddr < 0)
                return;
@@ -368,12 +372,12 @@ void rvu_npc_install_promisc_entry(struct rvu *rvu, u16 pcifunc,
        struct nix_rx_action action = { };
        int blkaddr, index, kwi;
 
-       blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
-       if (blkaddr < 0)
+       /* Only PF or AF VF can add a promiscuous entry */
+       if ((pcifunc & RVU_PFVF_FUNC_MASK) && !is_afvf(pcifunc))
                return;
 
-       /* Only PF or AF VF can add a promiscuous entry */
-       if (pcifunc & RVU_PFVF_FUNC_MASK)
+       blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
+       if (blkaddr < 0)
                return;
 
        index = npc_get_nixlf_mcam_index(mcam, pcifunc,