From: Bharat Bhushan Large Memory Transaction store (LMTST) operation is required for enqueuing workto CPT hardware. An LMTST operation makes one or more 128-byte write operation to normal, cacheable memory region. This patch setup LMTST memory region for enqueuing work to CPT hardware. Signed-off-by: Bharat Bhushan Signed-off-by: Tanmay Jagdale --- Changes in V3: - None Changes in V2: - None V1 Link: https://lore.kernel.org/netdev/20250502132005.611698-4-tanmay@marvell.com/ V2 Link: https://lore.kernel.org/netdev/20250618113020.130888-4-tanmay@marvell.com/ .../net/ethernet/marvell/octeontx2/af/rvu.c | 1 + .../net/ethernet/marvell/octeontx2/af/rvu.h | 7 +++ .../ethernet/marvell/octeontx2/af/rvu_cpt.c | 51 +++++++++++++++++++ .../ethernet/marvell/octeontx2/af/rvu_cpt.h | 4 ++ 4 files changed, 63 insertions(+) diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu.c index a4e9430acba9..250d9e34b91e 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu.c @@ -726,6 +726,7 @@ static void rvu_free_hw_resources(struct rvu *rvu) rvu_npa_freemem(rvu); rvu_npc_freemem(rvu); rvu_nix_freemem(rvu); + rvu_cpt_freemem(rvu); /* Free block LF bitmaps */ for (id = 0; id < BLK_COUNT; id++) { diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h index 9f982c9f5953..1054a4ee19e0 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h @@ -602,6 +602,12 @@ struct rvu_cpt { struct rvu_cpt_inst_queue cpt0_iq; struct rvu_cpt_inst_queue cpt1_iq; struct rvu_cpt_rx_inline_lf_cfg rx_cfg; + + /* CPT LMTST */ + void *lmt_base; + u64 lmt_addr; + size_t lmt_size; + dma_addr_t lmt_iova; }; struct rvu { @@ -1149,6 +1155,7 @@ int rvu_cpt_lf_teardown(struct rvu *rvu, u16 pcifunc, int blkaddr, int lf, int slot); int rvu_cpt_ctx_flush(struct rvu *rvu, u16 pcifunc); int rvu_cpt_init(struct rvu *rvu); +void rvu_cpt_freemem(struct rvu *rvu); #define NDC_AF_BANK_MASK GENMASK_ULL(7, 0) #define NDC_AF_BANK_LINE_MASK GENMASK_ULL(31, 16) diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c index e1b170919ba9..84ca775b1871 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c @@ -1875,10 +1875,46 @@ int rvu_mbox_handler_cpt_rx_inline_lf_cfg(struct rvu *rvu, #define MAX_RXC_ICB_CNT GENMASK_ULL(40, 32) +static int rvu_cpt_lmt_init(struct rvu *rvu) +{ + struct lmtst_tbl_setup_req req; + dma_addr_t iova; + void *base; + int size; + int err; + + if (is_rvu_otx2(rvu)) + return 0; + + memset(&req, 0, sizeof(struct lmtst_tbl_setup_req)); + + size = LMT_LINE_SIZE * LMT_BURST_SIZE + OTX2_ALIGN; + base = dma_alloc_attrs(rvu->dev, size, &iova, GFP_ATOMIC, + DMA_ATTR_FORCE_CONTIGUOUS); + if (!base) + return -ENOMEM; + + req.lmt_iova = ALIGN(iova, OTX2_ALIGN); + req.use_local_lmt_region = true; + err = rvu_mbox_handler_lmtst_tbl_setup(rvu, &req, NULL); + if (err) { + dma_free_attrs(rvu->dev, size, base, iova, + DMA_ATTR_FORCE_CONTIGUOUS); + return err; + } + + rvu->rvu_cpt.lmt_addr = (__force u64)PTR_ALIGN(base, OTX2_ALIGN); + rvu->rvu_cpt.lmt_base = base; + rvu->rvu_cpt.lmt_size = size; + rvu->rvu_cpt.lmt_iova = iova; + return 0; +} + int rvu_cpt_init(struct rvu *rvu) { struct rvu_hwinfo *hw = rvu->hw; u64 reg_val; + int ret; /* Retrieve CPT PF number */ rvu->cpt_pf_num = get_cpt_pf_num(rvu); @@ -1899,6 +1935,21 @@ int rvu_cpt_init(struct rvu *rvu) spin_lock_init(&rvu->cpt_intr_lock); + ret = rvu_cpt_lmt_init(rvu); + if (ret) + return ret; + mutex_init(&rvu->rvu_cpt.lock); return 0; } + +void rvu_cpt_freemem(struct rvu *rvu) +{ + if (is_rvu_otx2(rvu)) + return; + + if (rvu->rvu_cpt.lmt_base) + dma_free_attrs(rvu->dev, rvu->rvu_cpt.lmt_size, + rvu->rvu_cpt.lmt_base, rvu->rvu_cpt.lmt_iova, + DMA_ATTR_FORCE_CONTIGUOUS); +} diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.h b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.h index 4b57c7038d6c..e6fa247a03ba 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.h +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.h @@ -49,6 +49,10 @@ #define OTX2_CPT_INLINE_RX_OPCODE (0x26 | (1 << 6)) #define CN10K_CPT_INLINE_RX_OPCODE (0x29 | (1 << 6)) +/* CPT LMTST */ +#define LMT_LINE_SIZE 128 /* LMT line size in bytes */ +#define LMT_BURST_SIZE 32 /* 32 LMTST lines for burst */ + /* Calculate CPT register offset */ #define CPT_RVU_FUNC_ADDR_S(blk, slot, offs) \ (((blk) << 20) | ((slot) << 12) | (offs)) -- 2.43.0