From: Ratheesh Kannoth <rkannoth@marvell.com>
To: <linux-kernel@vger.kernel.org>, <netdev@vger.kernel.org>
Cc: <andrew+netdev@lunn.ch>, <davem@davemloft.net>,
<edumazet@google.com>, <kuba@kernel.org>, <pabeni@redhat.com>,
<sgoutham@marvell.com>, Suman Ghosh <sumang@marvell.com>,
Ratheesh Kannoth <rkannoth@marvell.com>
Subject: [PATCH net-next] octeontx2-af: Add tracepoints for NPC MCAM entry programming
Date: Tue, 15 Sep 2026 08:20:14 +0530 [thread overview]
Message-ID: <20260915025014.928685-1-rkannoth@marvell.com> (raw)
From: Suman Ghosh <sumang@marvell.com>
Add ftrace events to observe NPC MCAM allocation, CAM keyword
programming, action/VLAN tag writes, and entry enable/disable in the
AF driver. Emit traces from npc_mcam_alloc_entries(),
npc_config_mcam_entry(), npc_read_mcam_entry(), and
npc_enable_mcam_entry() so live systems can correlate mailbox-driven
rule changes with the underlying MCAM state.
Signed-off-by: Suman Ghosh <sumang@marvell.com>
Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com>
---
.../ethernet/marvell/octeontx2/af/rvu_npc.c | 46 +++++----
.../ethernet/marvell/octeontx2/af/rvu_trace.c | 4 +
.../ethernet/marvell/octeontx2/af/rvu_trace.h | 99 +++++++++++++++++++
3 files changed, 131 insertions(+), 18 deletions(-)
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
index c34f8d86cc8a..ae373558975e 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
@@ -20,6 +20,7 @@
#include "rvu_npc.h"
#include "cn20k/reg.h"
#include "lmac_common.h"
+#include <rvu_trace.h>
#define RSVD_MCAM_ENTRIES_PER_PF 3 /* Broadcast, Promisc and AllMulticast */
#define RSVD_MCAM_ENTRIES_PER_NIXLF 1 /* Ucast for LFs */
@@ -259,6 +260,7 @@ void npc_enable_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam,
int bank = npc_get_bank(mcam, index);
int actbank = bank;
+ trace_otx2_npc_enable_mcam_entry(index, (u8)enable);
if (is_cn20k(rvu->pdev)) {
if (npc_cn20k_enable_mcam_entry(rvu, blkaddr, index, enable))
dev_err(rvu->dev, "Error to %s mcam %u entry\n",
@@ -521,10 +523,10 @@ static void npc_config_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam,
struct mcam_entry *entry, bool enable)
{
int bank = npc_get_bank(mcam, index);
+ u64 w0_cam0, w0_cam1, w1_cam0, w1_cam1;
int kw = 0, actbank, actindex;
u8 tx_intf_mask = ~intf & 0x3;
u8 tx_intf = intf;
- u64 cam0, cam1;
actbank = bank; /* Save bank id, to set action later on */
actindex = index;
@@ -561,17 +563,18 @@ static void npc_config_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam,
tx_intf_mask);
/* Set the match key */
- npc_get_keyword(entry, kw, &cam0, &cam1);
+ npc_get_keyword(entry, kw, &w0_cam0, &w0_cam1);
rvu_write64(rvu, blkaddr,
- NPC_AF_MCAMEX_BANKX_CAMX_W0(index, bank, 1), cam1);
+ NPC_AF_MCAMEX_BANKX_CAMX_W0(index, bank, 1), w0_cam1);
rvu_write64(rvu, blkaddr,
- NPC_AF_MCAMEX_BANKX_CAMX_W0(index, bank, 0), cam0);
+ NPC_AF_MCAMEX_BANKX_CAMX_W0(index, bank, 0), w0_cam0);
- npc_get_keyword(entry, kw + 1, &cam0, &cam1);
+ npc_get_keyword(entry, kw + 1, &w1_cam0, &w1_cam1);
rvu_write64(rvu, blkaddr,
- NPC_AF_MCAMEX_BANKX_CAMX_W1(index, bank, 1), cam1);
+ NPC_AF_MCAMEX_BANKX_CAMX_W1(index, bank, 1), w1_cam1);
rvu_write64(rvu, blkaddr,
- NPC_AF_MCAMEX_BANKX_CAMX_W1(index, bank, 0), cam0);
+ NPC_AF_MCAMEX_BANKX_CAMX_W1(index, bank, 0), w1_cam0);
+ trace_otx2_npc_cam(index, bank, w0_cam0, w0_cam1, w1_cam0, w1_cam1);
}
/* PF installing VF rule */
@@ -586,6 +589,8 @@ static void npc_config_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam,
rvu_write64(rvu, blkaddr, NPC_AF_MCAMEX_BANKX_TAG_ACT(index, actbank),
entry->vtag_action);
+ trace_otx2_npc_action(index, actbank, tx_intf, (u8)enable,
+ entry->action, entry->vtag_action);
/* Enable the entry */
if (enable)
npc_enable_mcam_entry(rvu, mcam, blkaddr, actindex, true);
@@ -596,24 +601,25 @@ void npc_read_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam,
struct mcam_entry *entry, u8 *intf, u8 *ena)
{
int sbank = npc_get_bank(mcam, src);
+ u64 w0_cam0, w0_cam1, w1_cam0, w1_cam1;
int bank, kw = 0;
- u64 cam0, cam1;
src &= (mcam->banksize - 1);
bank = sbank;
for (; bank < (sbank + mcam->banks_per_entry); bank++, kw = kw + 2) {
- cam1 = rvu_read64(rvu, blkaddr,
- NPC_AF_MCAMEX_BANKX_CAMX_W0(src, bank, 1));
- cam0 = rvu_read64(rvu, blkaddr,
- NPC_AF_MCAMEX_BANKX_CAMX_W0(src, bank, 0));
- npc_fill_entryword(entry, kw, cam0, cam1);
+ w0_cam1 = rvu_read64(rvu, blkaddr,
+ NPC_AF_MCAMEX_BANKX_CAMX_W0(src, bank, 1));
+ w0_cam0 = rvu_read64(rvu, blkaddr,
+ NPC_AF_MCAMEX_BANKX_CAMX_W0(src, bank, 0));
+ npc_fill_entryword(entry, kw, w0_cam0, w0_cam1);
- cam1 = rvu_read64(rvu, blkaddr,
- NPC_AF_MCAMEX_BANKX_CAMX_W1(src, bank, 1));
- cam0 = rvu_read64(rvu, blkaddr,
- NPC_AF_MCAMEX_BANKX_CAMX_W1(src, bank, 0));
- npc_fill_entryword(entry, kw + 1, cam0, cam1);
+ w1_cam1 = rvu_read64(rvu, blkaddr,
+ NPC_AF_MCAMEX_BANKX_CAMX_W1(src, bank, 1));
+ w1_cam0 = rvu_read64(rvu, blkaddr,
+ NPC_AF_MCAMEX_BANKX_CAMX_W1(src, bank, 0));
+ npc_fill_entryword(entry, kw + 1, w1_cam0, w1_cam1);
+ trace_otx2_npc_cam(src, bank, w0_cam0, w0_cam1, w1_cam0, w1_cam1);
}
entry->action = rvu_read64(rvu, blkaddr,
@@ -625,6 +631,8 @@ void npc_read_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam,
NPC_AF_MCAMEX_BANKX_CAMX_INTF(src, sbank, 1)) & 3;
*ena = rvu_read64(rvu, blkaddr,
NPC_AF_MCAMEX_BANKX_CFG(src, sbank)) & 1;
+ trace_otx2_npc_action(src, sbank, *intf, *ena,
+ entry->action, entry->vtag_action);
}
static int npc_copy_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam,
@@ -3197,6 +3205,7 @@ static int npc_mcam_alloc_entries(struct npc_mcam *mcam, u16 pcifunc,
rsp->free_count = -1;
mutex_unlock(&mcam->lock);
+ trace_otx2_npc_mcam_alloc_entries(pcifunc, req, rsp);
return 0;
not_cn20k:
@@ -3383,6 +3392,7 @@ static int npc_mcam_alloc_entries(struct npc_mcam *mcam, u16 pcifunc,
rsp->free_count = mcam->bmap_fcnt;
mutex_unlock(&mcam->lock);
+ trace_otx2_npc_mcam_alloc_entries(pcifunc, req, rsp);
return 0;
}
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.c
index 19e0d16b12f6..0919c4398dc4 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.c
@@ -13,3 +13,7 @@ EXPORT_TRACEPOINT_SYMBOL(otx2_msg_interrupt);
EXPORT_TRACEPOINT_SYMBOL(otx2_msg_process);
EXPORT_TRACEPOINT_SYMBOL(otx2_msg_status);
EXPORT_TRACEPOINT_SYMBOL(otx2_parse_dump);
+EXPORT_TRACEPOINT_SYMBOL(otx2_npc_mcam_alloc_entries);
+EXPORT_TRACEPOINT_SYMBOL(otx2_npc_enable_mcam_entry);
+EXPORT_TRACEPOINT_SYMBOL(otx2_npc_cam);
+EXPORT_TRACEPOINT_SYMBOL(otx2_npc_action);
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.h b/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.h
index 4cd0fc4b0d20..77dc1b4a4c64 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.h
@@ -159,6 +159,105 @@ TRACE_EVENT(otx2_parse_dump,
__entry->w3, __entry->w4, __entry->w5)
);
+TRACE_EVENT(otx2_npc_mcam_alloc_entries,
+ TP_PROTO(u16 pcifunc,
+ struct npc_mcam_alloc_entry_req *req,
+ struct npc_mcam_alloc_entry_rsp *rsp),
+ TP_ARGS(pcifunc, req, rsp),
+ TP_STRUCT__entry(__field(u16, pcifunc)
+ __field(u8, contig)
+ __field(u8, ref_prio)
+ __field(u16, ref_entry)
+ __field(u16, req_count)
+ __field(u8, kw_type)
+ __field(u8, virt)
+ __field(u16, start_mcam_idx)
+ __field(u16, rsp_count)
+ __field(u16, free_count)
+ ),
+ TP_fast_assign(__entry->contig = req->contig;
+ __entry->ref_prio = req->ref_prio;
+ __entry->ref_entry = req->ref_entry;
+ __entry->req_count = req->count;
+ __entry->kw_type = req->kw_type;
+ __entry->virt = req->virt;
+ __entry->start_mcam_idx = rsp->entry;
+ __entry->rsp_count = rsp->count;
+ __entry->free_count = rsp->free_count;
+ ),
+ TP_printk("pcifunc:%d req_contig:%d req_ref_prio:%d req->ref_entry:%d req->req_count:%d req->kw_type:%d req->virt:%d rsp_start_mcam_idx:%d rsp_count:%d rsp_free_count:%d\n",
+ __entry->pcifunc, __entry->contig, __entry->ref_prio,
+ __entry->ref_entry, __entry->req_count, __entry->kw_type,
+ __entry->virt, __entry->start_mcam_idx, __entry->rsp_count,
+ __entry->free_count)
+);
+
+TRACE_EVENT(otx2_npc_enable_mcam_entry,
+ TP_PROTO(u16 index, u8 enable),
+ TP_ARGS(index, enable),
+ TP_STRUCT__entry(__field(u16, mcam_index)
+ __field(u8, ena)
+ ),
+ TP_fast_assign(__entry->mcam_index = index;
+ __entry->ena = enable;
+ ),
+ TP_printk("mcam_index:%d enable:%d\n", __entry->mcam_index, __entry->ena)
+);
+
+TRACE_EVENT(otx2_npc_cam,
+ TP_PROTO(u16 index, u8 bank,
+ u64 w0_cam0,
+ u64 w0_cam1,
+ u64 w1_cam0,
+ u64 w1_cam1),
+ TP_ARGS(index, bank,
+ w0_cam0, w0_cam1,
+ w1_cam0, w1_cam1),
+ TP_STRUCT__entry(__field(u16, mcam_index)
+ __field(u8, bank)
+ __field(u64, w0_cam0)
+ __field(u64, w0_cam1)
+ __field(u64, w1_cam0)
+ __field(u64, w1_cam1)
+ ),
+ TP_fast_assign(__entry->mcam_index = index;
+ __entry->bank = bank;
+ __entry->w0_cam0 = w0_cam0;
+ __entry->w0_cam1 = w0_cam1;
+ __entry->w1_cam0 = w1_cam0;
+ __entry->w1_cam1 = w1_cam1;
+ ),
+ TP_printk("mcam_index:%d bank:%d w0_cam0:0x%llx w0_cam1:0x%llx, w1_cam0:0x%llx, w1_cam1:0x%llx\n",
+ __entry->mcam_index, __entry->bank, __entry->w0_cam0, __entry->w0_cam1,
+ __entry->w1_cam0, __entry->w1_cam1)
+);
+
+TRACE_EVENT(otx2_npc_action,
+ TP_PROTO(u16 index, u8 bank,
+ u8 tx_intf, u8 enable,
+ u64 act, u64 vtag_act),
+ TP_ARGS(index, bank,
+ tx_intf, enable,
+ act, vtag_act),
+ TP_STRUCT__entry(__field(u16, mcam_index)
+ __field(u8, bank)
+ __field(u8, tx_intf)
+ __field(u8, enable)
+ __field(u64, act)
+ __field(u64, vtag_act)
+ ),
+ TP_fast_assign(__entry->mcam_index = index;
+ __entry->bank = bank;
+ __entry->tx_intf = tx_intf;
+ __entry->enable = enable;
+ __entry->act = act;
+ __entry->vtag_act = vtag_act;
+ ),
+ TP_printk("mcam_index:%d bank:%d tx_intf:%d enable:%d action:0x%llx vtag_action:0x%llx\n",
+ __entry->mcam_index, __entry->bank, __entry->tx_intf,
+ __entry->enable, __entry->act, __entry->vtag_act)
+);
+
#endif /* __RVU_TRACE_H */
#undef TRACE_INCLUDE_PATH
--
2.43.0
next reply other threads:[~2026-09-15 2:50 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-15 2:50 Ratheesh Kannoth [this message]
2026-09-18 8:51 ` netdev-bot+sashiko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260915025014.928685-1-rkannoth@marvell.com \
--to=rkannoth@marvell.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=sgoutham@marvell.com \
--cc=sumang@marvell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®