OSDN Git Service

octeontx2-af: Support to enable/disable default MCAM entries
authorSunil Goutham <sgoutham@marvell.com>
Mon, 19 Nov 2018 10:47:33 +0000 (16:17 +0530)
committerDavid S. Miller <davem@davemloft.net>
Tue, 20 Nov 2018 01:56:08 +0000 (17:56 -0800)
For a PF/VF with a NIXLF attached has default/reserved MCAM entries
for receiving Ucast/Bcast/Promisc traffic. Ideally traffic should be
forwarded to NIXLF only after it's contexts are initialized. This
patch keeps these default entries disabled and adds mbox messages
for a PF/VF to enable these once NPA/NIXLF initialization is done.
Likewise while PF/VF is being teared down, it can send the disable
mailbox message to stop receiving traffic.

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.h
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c

index bef1605..39fe62a 100644 (file)
@@ -195,7 +195,9 @@ M(NIX_RSS_FLOWKEY_CFG,  0x8009, nix_rss_flowkey_cfg,                        \
                                 nix_rss_flowkey_cfg, msg_rsp)          \
 M(NIX_SET_MAC_ADDR,    0x800a, nix_set_mac_addr, nix_set_mac_addr, msg_rsp) \
 M(NIX_SET_RX_MODE,     0x800b, nix_set_rx_mode, nix_rx_mode, msg_rsp)  \
-M(NIX_SET_HW_FRS,      0x800c, nix_set_hw_frs, nix_frs_cfg, msg_rsp)
+M(NIX_SET_HW_FRS,      0x800c, nix_set_hw_frs, nix_frs_cfg, msg_rsp)   \
+M(NIX_LF_START_RX,     0x800d, nix_lf_start_rx, msg_req, msg_rsp)      \
+M(NIX_LF_STOP_RX,      0x800e, nix_lf_stop_rx, msg_req, msg_rsp)
 
 /* Messages initiated by AF (range 0xC00 - 0xDFF) */
 #define MBOX_UP_CGX_MESSAGES                                           \
index 93a74b6..19d5f16 100644 (file)
@@ -366,6 +366,10 @@ int rvu_mbox_handler_nix_set_rx_mode(struct rvu *rvu, struct nix_rx_mode *req,
                                     struct msg_rsp *rsp);
 int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
                                    struct msg_rsp *rsp);
+int rvu_mbox_handler_nix_lf_start_rx(struct rvu *rvu, struct msg_req *req,
+                                    struct msg_rsp *rsp);
+int rvu_mbox_handler_nix_lf_stop_rx(struct rvu *rvu, struct msg_req *req,
+                                   struct msg_rsp *rsp);
 
 /* NPC APIs */
 int rvu_npc_init(struct rvu *rvu);
@@ -377,9 +381,12 @@ void rvu_npc_install_ucast_entry(struct rvu *rvu, u16 pcifunc,
 void rvu_npc_install_promisc_entry(struct rvu *rvu, u16 pcifunc,
                                   int nixlf, u64 chan, bool allmulti);
 void rvu_npc_disable_promisc_entry(struct rvu *rvu, u16 pcifunc, int nixlf);
+void rvu_npc_enable_promisc_entry(struct rvu *rvu, u16 pcifunc, int nixlf);
 void rvu_npc_install_bcast_match_entry(struct rvu *rvu, u16 pcifunc,
                                       int nixlf, u64 chan);
 void rvu_npc_disable_mcam_entries(struct rvu *rvu, u16 pcifunc, int nixlf);
+void rvu_npc_disable_default_entries(struct rvu *rvu, u16 pcifunc, int nixlf);
+void rvu_npc_enable_default_entries(struct rvu *rvu, u16 pcifunc, int nixlf);
 void rvu_npc_update_flowkey_alg_idx(struct rvu *rvu, u16 pcifunc, int nixlf,
                                    int group, int alg_idx, int mcam_index);
 int rvu_mbox_handler_npc_mcam_alloc_entry(struct rvu *rvu,
index 0491e35..fb8456e 100644 (file)
@@ -821,6 +821,9 @@ int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
        if (err)
                goto free_mem;
 
+       /* Disable NPC entries as NIXLF's contexts are not initialized yet */
+       rvu_npc_disable_default_entries(rvu, pcifunc, nixlf);
+
        goto exit;
 
 free_mem:
@@ -2176,3 +2179,48 @@ void rvu_nix_freemem(struct rvu *rvu)
                mutex_destroy(&mcast->mce_lock);
        }
 }
+
+static int nix_get_nixlf(struct rvu *rvu, u16 pcifunc, int *nixlf)
+{
+       struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
+       struct rvu_hwinfo *hw = rvu->hw;
+       int blkaddr;
+
+       blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
+       if (!pfvf->nixlf || blkaddr < 0)
+               return NIX_AF_ERR_AF_LF_INVALID;
+
+       *nixlf = rvu_get_lf(rvu, &hw->block[blkaddr], pcifunc, 0);
+       if (*nixlf < 0)
+               return NIX_AF_ERR_AF_LF_INVALID;
+
+       return 0;
+}
+
+int rvu_mbox_handler_nix_lf_start_rx(struct rvu *rvu, struct msg_req *req,
+                                    struct msg_rsp *rsp)
+{
+       u16 pcifunc = req->hdr.pcifunc;
+       int nixlf, err;
+
+       err = nix_get_nixlf(rvu, pcifunc, &nixlf);
+       if (err)
+               return err;
+
+       rvu_npc_enable_default_entries(rvu, pcifunc, nixlf);
+       return 0;
+}
+
+int rvu_mbox_handler_nix_lf_stop_rx(struct rvu *rvu, struct msg_req *req,
+                                   struct msg_rsp *rsp)
+{
+       u16 pcifunc = req->hdr.pcifunc;
+       int nixlf, err;
+
+       err = nix_get_nixlf(rvu, pcifunc, &nixlf);
+       if (err)
+               return err;
+
+       rvu_npc_disable_default_entries(rvu, pcifunc, nixlf);
+       return 0;
+}
index d749611..af51352 100644 (file)
@@ -384,7 +384,8 @@ void rvu_npc_install_promisc_entry(struct rvu *rvu, u16 pcifunc,
                              NIX_INTF_RX, &entry, true);
 }
 
-void rvu_npc_disable_promisc_entry(struct rvu *rvu, u16 pcifunc, int nixlf)
+static void npc_enadis_promisc_entry(struct rvu *rvu, u16 pcifunc,
+                                    int nixlf, bool enable)
 {
        struct npc_mcam *mcam = &rvu->hw->mcam;
        int blkaddr, index;
@@ -399,7 +400,17 @@ void rvu_npc_disable_promisc_entry(struct rvu *rvu, u16 pcifunc, int nixlf)
 
        index = npc_get_nixlf_mcam_index(mcam, pcifunc,
                                         nixlf, NIXLF_PROMISC_ENTRY);
-       npc_enable_mcam_entry(rvu, mcam, blkaddr, index, false);
+       npc_enable_mcam_entry(rvu, mcam, blkaddr, index, enable);
+}
+
+void rvu_npc_disable_promisc_entry(struct rvu *rvu, u16 pcifunc, int nixlf)
+{
+       npc_enadis_promisc_entry(rvu, pcifunc, nixlf, false);
+}
+
+void rvu_npc_enable_promisc_entry(struct rvu *rvu, u16 pcifunc, int nixlf)
+{
+       npc_enadis_promisc_entry(rvu, pcifunc, nixlf, true);
 }
 
 void rvu_npc_install_bcast_match_entry(struct rvu *rvu, u16 pcifunc,
@@ -512,11 +523,59 @@ void rvu_npc_update_flowkey_alg_idx(struct rvu *rvu, u16 pcifunc, int nixlf,
                    NPC_AF_MCAMEX_BANKX_ACTION(index, bank), *(u64 *)&action);
 }
 
-void rvu_npc_disable_mcam_entries(struct rvu *rvu, u16 pcifunc, int nixlf)
+static void npc_enadis_default_entries(struct rvu *rvu, u16 pcifunc,
+                                      int nixlf, bool enable)
 {
        struct npc_mcam *mcam = &rvu->hw->mcam;
        struct nix_rx_action action;
-       int blkaddr, index, bank;
+       int index, bank, blkaddr;
+
+       blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
+       if (blkaddr < 0)
+               return;
+
+       /* Ucast MCAM match entry of this PF/VF */
+       index = npc_get_nixlf_mcam_index(mcam, pcifunc,
+                                        nixlf, NIXLF_UCAST_ENTRY);
+       npc_enable_mcam_entry(rvu, mcam, blkaddr, index, enable);
+
+       /* For PF, ena/dis promisc and bcast MCAM match entries */
+       if (pcifunc & RVU_PFVF_FUNC_MASK)
+               return;
+
+       /* For bcast, enable/disable only if it's action is not
+        * packet replication, incase if action is replication
+        * then this PF's nixlf is removed from bcast replication
+        * list.
+        */
+       index = npc_get_nixlf_mcam_index(mcam, pcifunc,
+                                        nixlf, NIXLF_BCAST_ENTRY);
+       bank = npc_get_bank(mcam, index);
+       *(u64 *)&action = rvu_read64(rvu, blkaddr,
+            NPC_AF_MCAMEX_BANKX_ACTION(index & (mcam->banksize - 1), bank));
+       if (action.op != NIX_RX_ACTIONOP_MCAST)
+               npc_enable_mcam_entry(rvu, mcam,
+                                     blkaddr, index, enable);
+       if (enable)
+               rvu_npc_enable_promisc_entry(rvu, pcifunc, nixlf);
+       else
+               rvu_npc_disable_promisc_entry(rvu, pcifunc, nixlf);
+}
+
+void rvu_npc_disable_default_entries(struct rvu *rvu, u16 pcifunc, int nixlf)
+{
+       npc_enadis_default_entries(rvu, pcifunc, nixlf, false);
+}
+
+void rvu_npc_enable_default_entries(struct rvu *rvu, u16 pcifunc, int nixlf)
+{
+       npc_enadis_default_entries(rvu, pcifunc, nixlf, true);
+}
+
+void rvu_npc_disable_mcam_entries(struct rvu *rvu, u16 pcifunc, int nixlf)
+{
+       struct npc_mcam *mcam = &rvu->hw->mcam;
+       int blkaddr;
 
        blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
        if (blkaddr < 0)
@@ -532,29 +591,7 @@ void rvu_npc_disable_mcam_entries(struct rvu *rvu, u16 pcifunc, int nixlf)
 
        mutex_unlock(&mcam->lock);
 
-       /* Disable ucast MCAM match entry of this PF/VF */
-       index = npc_get_nixlf_mcam_index(mcam, pcifunc,
-                                        nixlf, NIXLF_UCAST_ENTRY);
-       npc_enable_mcam_entry(rvu, mcam, blkaddr, index, false);
-
-       /* For PF, disable promisc and bcast MCAM match entries */
-       if (!(pcifunc & RVU_PFVF_FUNC_MASK)) {
-               index = npc_get_nixlf_mcam_index(mcam, pcifunc,
-                                                nixlf, NIXLF_BCAST_ENTRY);
-               /* For bcast, disable only if it's action is not
-                * packet replication, incase if action is replication
-                * then this PF's nixlf is removed from bcast replication
-                * list.
-                */
-               bank = npc_get_bank(mcam, index);
-               index &= (mcam->banksize - 1);
-               *(u64 *)&action = rvu_read64(rvu, blkaddr,
-                                    NPC_AF_MCAMEX_BANKX_ACTION(index, bank));
-               if (action.op != NIX_RX_ACTIONOP_MCAST)
-                       npc_enable_mcam_entry(rvu, mcam, blkaddr, index, false);
-
-               rvu_npc_disable_promisc_entry(rvu, pcifunc, nixlf);
-       }
+       rvu_npc_disable_default_entries(rvu, pcifunc, nixlf);
 }
 
 #define SET_KEX_LD(intf, lid, ltype, ld, cfg)  \