mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-28 13:34:38 +08:00
octeontx2-af: Support to enable/disable default MCAM entries
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>
This commit is contained in:
parent
631e70bb84
commit
40df309e41
@ -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 \
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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) \
|
||||
|
Loading…
Reference in New Issue
Block a user