Skip to content

Commit c554f9c

Browse files
Geetha sowjanyadavem330
authored andcommitted
octeontx2-af: Teardown NPA, NIX LF upon receiving FLR
Upon receiving FLR IRQ for a RVU PF, teardown or cleanup resources held by that PF_FUNC. This patch cleans up, NIX LF - Stop ingress/egress traffic - Disable NPC MCAM entries being used. - Free Tx scheduler queues - Disable RQ/SQ/CQ HW contexts NPA LF - Disable Pool/Aura HW contexts In future teardown of SSO/SSOW/TIM/CPT will be added. Also added a mailbox message for a RVU PF to request AF, to perform FLR for a RVU VF under it. Signed-off-by: Geetha sowjanya <[email protected]> Signed-off-by: Stanislaw Kardach <[email protected]> Signed-off-by: Sunil Goutham <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9fe4ebf commit c554f9c

File tree

5 files changed

+156
-1
lines changed

5 files changed

+156
-1
lines changed

drivers/net/ethernet/marvell/octeontx2/af/mbox.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ M(READY, 0x001, ready, msg_req, ready_msg_rsp) \
124124
M(ATTACH_RESOURCES, 0x002, attach_resources, rsrc_attach, msg_rsp) \
125125
M(DETACH_RESOURCES, 0x003, detach_resources, rsrc_detach, msg_rsp) \
126126
M(MSIX_OFFSET, 0x004, msix_offset, msg_req, msix_offset_rsp) \
127+
M(VF_FLR, 0x006, vf_flr, msg_req, msg_rsp) \
127128
/* CGX mbox IDs (range 0x200 - 0x3FF) */ \
128129
M(CGX_START_RXTX, 0x200, cgx_start_rxtx, msg_req, msg_rsp) \
129130
M(CGX_STOP_RXTX, 0x201, cgx_stop_rxtx, msg_req, msg_rsp) \
@@ -229,6 +230,13 @@ struct msg_rsp {
229230
struct mbox_msghdr hdr;
230231
};
231232

233+
/* RVU mailbox error codes
234+
* Range 256 - 300.
235+
*/
236+
enum rvu_af_status {
237+
RVU_INVALID_VF_ID = -256,
238+
};
239+
232240
struct ready_msg_rsp {
233241
struct mbox_msghdr hdr;
234242
u16 sclk_feq; /* SCLK frequency */

drivers/net/ethernet/marvell/octeontx2/af/rvu.c

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ static void rvu_set_msix_offset(struct rvu *rvu, struct rvu_pfvf *pfvf,
2929
struct rvu_block *block, int lf);
3030
static void rvu_clear_msix_offset(struct rvu *rvu, struct rvu_pfvf *pfvf,
3131
struct rvu_block *block, int lf);
32+
static void __rvu_flr_handler(struct rvu *rvu, u16 pcifunc);
3233

3334
/* Supported devices */
3435
static const struct pci_device_id rvu_id_table[] = {
@@ -1320,6 +1321,26 @@ static int rvu_mbox_handler_msix_offset(struct rvu *rvu, struct msg_req *req,
13201321
return 0;
13211322
}
13221323

1324+
static int rvu_mbox_handler_vf_flr(struct rvu *rvu, struct msg_req *req,
1325+
struct msg_rsp *rsp)
1326+
{
1327+
u16 pcifunc = req->hdr.pcifunc;
1328+
u16 vf, numvfs;
1329+
u64 cfg;
1330+
1331+
vf = pcifunc & RVU_PFVF_FUNC_MASK;
1332+
cfg = rvu_read64(rvu, BLKADDR_RVUM,
1333+
RVU_PRIV_PFX_CFG(rvu_get_pf(pcifunc)));
1334+
numvfs = (cfg >> 12) & 0xFF;
1335+
1336+
if (vf && vf <= numvfs)
1337+
__rvu_flr_handler(rvu, pcifunc);
1338+
else
1339+
return RVU_INVALID_VF_ID;
1340+
1341+
return 0;
1342+
}
1343+
13231344
static int rvu_process_mbox_msg(struct rvu *rvu, int devid,
13241345
struct mbox_msghdr *req)
13251346
{
@@ -1601,14 +1622,73 @@ static void rvu_enable_mbox_intr(struct rvu *rvu)
16011622
INTR_MASK(hw->total_pfs) & ~1ULL);
16021623
}
16031624

1625+
static void rvu_blklf_teardown(struct rvu *rvu, u16 pcifunc, u8 blkaddr)
1626+
{
1627+
struct rvu_block *block;
1628+
int slot, lf, num_lfs;
1629+
int err;
1630+
1631+
block = &rvu->hw->block[blkaddr];
1632+
num_lfs = rvu_get_rsrc_mapcount(rvu_get_pfvf(rvu, pcifunc),
1633+
block->type);
1634+
if (!num_lfs)
1635+
return;
1636+
for (slot = 0; slot < num_lfs; slot++) {
1637+
lf = rvu_get_lf(rvu, block, pcifunc, slot);
1638+
if (lf < 0)
1639+
continue;
1640+
1641+
/* Cleanup LF and reset it */
1642+
if (block->addr == BLKADDR_NIX0)
1643+
rvu_nix_lf_teardown(rvu, pcifunc, block->addr, lf);
1644+
else if (block->addr == BLKADDR_NPA)
1645+
rvu_npa_lf_teardown(rvu, pcifunc, lf);
1646+
1647+
err = rvu_lf_reset(rvu, block, lf);
1648+
if (err) {
1649+
dev_err(rvu->dev, "Failed to reset blkaddr %d LF%d\n",
1650+
block->addr, lf);
1651+
}
1652+
}
1653+
}
1654+
1655+
static void __rvu_flr_handler(struct rvu *rvu, u16 pcifunc)
1656+
{
1657+
mutex_lock(&rvu->flr_lock);
1658+
/* Reset order should reflect inter-block dependencies:
1659+
* 1. Reset any packet/work sources (NIX, CPT, TIM)
1660+
* 2. Flush and reset SSO/SSOW
1661+
* 3. Cleanup pools (NPA)
1662+
*/
1663+
rvu_blklf_teardown(rvu, pcifunc, BLKADDR_NIX0);
1664+
rvu_blklf_teardown(rvu, pcifunc, BLKADDR_CPT0);
1665+
rvu_blklf_teardown(rvu, pcifunc, BLKADDR_TIM);
1666+
rvu_blklf_teardown(rvu, pcifunc, BLKADDR_SSOW);
1667+
rvu_blklf_teardown(rvu, pcifunc, BLKADDR_SSO);
1668+
rvu_blklf_teardown(rvu, pcifunc, BLKADDR_NPA);
1669+
rvu_detach_rsrcs(rvu, NULL, pcifunc);
1670+
mutex_unlock(&rvu->flr_lock);
1671+
}
1672+
16041673
static void rvu_flr_handler(struct work_struct *work)
16051674
{
16061675
struct rvu_work *flrwork = container_of(work, struct rvu_work, work);
16071676
struct rvu *rvu = flrwork->rvu;
1608-
u16 pf;
1677+
u16 pcifunc, numvfs, vf;
1678+
u64 cfg;
1679+
int pf;
16091680

16101681
pf = flrwork - rvu->flr_wrk;
16111682

1683+
cfg = rvu_read64(rvu, BLKADDR_RVUM, RVU_PRIV_PFX_CFG(pf));
1684+
numvfs = (cfg >> 12) & 0xFF;
1685+
pcifunc = pf << RVU_PFVF_PF_SHIFT;
1686+
1687+
for (vf = 0; vf < numvfs; vf++)
1688+
__rvu_flr_handler(rvu, (pcifunc | (vf + 1)));
1689+
1690+
__rvu_flr_handler(rvu, pcifunc);
1691+
16121692
/* Signal FLR finish */
16131693
rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_PFTRPEND, BIT_ULL(pf));
16141694

drivers/net/ethernet/marvell/octeontx2/af/rvu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ int rvu_mbox_handler_cgx_intlbk_disable(struct rvu *rvu, struct msg_req *req,
325325
/* NPA APIs */
326326
int rvu_npa_init(struct rvu *rvu);
327327
void rvu_npa_freemem(struct rvu *rvu);
328+
void rvu_npa_lf_teardown(struct rvu *rvu, u16 pcifunc, int npalf);
328329
int rvu_mbox_handler_npa_aq_enq(struct rvu *rvu,
329330
struct npa_aq_enq_req *req,
330331
struct npa_aq_enq_rsp *rsp);
@@ -342,6 +343,7 @@ bool is_nixlf_attached(struct rvu *rvu, u16 pcifunc);
342343
int rvu_nix_init(struct rvu *rvu);
343344
void rvu_nix_freemem(struct rvu *rvu);
344345
int rvu_get_nixlf_count(struct rvu *rvu);
346+
void rvu_nix_lf_teardown(struct rvu *rvu, u16 pcifunc, int blkaddr, int npalf);
345347
int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
346348
struct nix_lf_alloc_req *req,
347349
struct nix_lf_alloc_rsp *rsp);

drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,17 @@ static inline struct nix_hw *get_nix_hw(struct rvu_hwinfo *hw, int blkaddr)
105105
return NULL;
106106
}
107107

108+
static void nix_rx_sync(struct rvu *rvu, int blkaddr)
109+
{
110+
int err;
111+
112+
/*Sync all in flight RX packets to LLC/DRAM */
113+
rvu_write64(rvu, blkaddr, NIX_AF_RX_SW_SYNC, BIT_ULL(0));
114+
err = rvu_poll_reg(rvu, blkaddr, NIX_AF_RX_SW_SYNC, BIT_ULL(0), true);
115+
if (err)
116+
dev_err(rvu->dev, "NIX RX software sync failed\n");
117+
}
118+
108119
static bool is_valid_txschq(struct rvu *rvu, int blkaddr,
109120
int lvl, u16 pcifunc, u16 schq)
110121
{
@@ -2281,3 +2292,40 @@ int rvu_mbox_handler_nix_lf_stop_rx(struct rvu *rvu, struct msg_req *req,
22812292
rvu_npc_disable_default_entries(rvu, pcifunc, nixlf);
22822293
return 0;
22832294
}
2295+
2296+
void rvu_nix_lf_teardown(struct rvu *rvu, u16 pcifunc, int blkaddr, int nixlf)
2297+
{
2298+
struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
2299+
struct hwctx_disable_req ctx_req;
2300+
int err;
2301+
2302+
ctx_req.hdr.pcifunc = pcifunc;
2303+
2304+
/* Cleanup NPC MCAM entries, free Tx scheduler queues being used */
2305+
nix_interface_deinit(rvu, pcifunc, nixlf);
2306+
nix_rx_sync(rvu, blkaddr);
2307+
nix_txschq_free(rvu, pcifunc);
2308+
2309+
if (pfvf->sq_ctx) {
2310+
ctx_req.ctype = NIX_AQ_CTYPE_SQ;
2311+
err = nix_lf_hwctx_disable(rvu, &ctx_req);
2312+
if (err)
2313+
dev_err(rvu->dev, "SQ ctx disable failed\n");
2314+
}
2315+
2316+
if (pfvf->rq_ctx) {
2317+
ctx_req.ctype = NIX_AQ_CTYPE_RQ;
2318+
err = nix_lf_hwctx_disable(rvu, &ctx_req);
2319+
if (err)
2320+
dev_err(rvu->dev, "RQ ctx disable failed\n");
2321+
}
2322+
2323+
if (pfvf->cq_ctx) {
2324+
ctx_req.ctype = NIX_AQ_CTYPE_CQ;
2325+
err = nix_lf_hwctx_disable(rvu, &ctx_req);
2326+
if (err)
2327+
dev_err(rvu->dev, "CQ ctx disable failed\n");
2328+
}
2329+
2330+
nix_ctx_free(rvu, pfvf);
2331+
}

drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,3 +470,20 @@ void rvu_npa_freemem(struct rvu *rvu)
470470
block = &hw->block[blkaddr];
471471
rvu_aq_free(rvu, block->aq);
472472
}
473+
474+
void rvu_npa_lf_teardown(struct rvu *rvu, u16 pcifunc, int npalf)
475+
{
476+
struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
477+
struct hwctx_disable_req ctx_req;
478+
479+
/* Disable all pools */
480+
ctx_req.hdr.pcifunc = pcifunc;
481+
ctx_req.ctype = NPA_AQ_CTYPE_POOL;
482+
npa_lf_hwctx_disable(rvu, &ctx_req);
483+
484+
/* Disable all auras */
485+
ctx_req.ctype = NPA_AQ_CTYPE_AURA;
486+
npa_lf_hwctx_disable(rvu, &ctx_req);
487+
488+
npa_ctx_free(rvu, pfvf);
489+
}

0 commit comments

Comments
 (0)