[PATCH v2 net-next] octeontx2-af: add tracepoints for NPC MCAM entry programming

Ratheesh Kannoth posted 1 patch 1 day, 9 hours ago
.../ethernet/marvell/octeontx2/af/cn20k/npc.c |  51 +++++---
.../ethernet/marvell/octeontx2/af/rvu_npc.c   |  69 +++++++----
.../ethernet/marvell/octeontx2/af/rvu_trace.c |   5 +
.../ethernet/marvell/octeontx2/af/rvu_trace.h | 114 ++++++++++++++++++
4 files changed, 196 insertions(+), 43 deletions(-)
[PATCH v2 net-next] octeontx2-af: add tracepoints for NPC MCAM entry programming
Posted by Ratheesh Kannoth 1 day, 9 hours ago
From: Suman Ghosh <sumang@marvell.com>

Add ftrace events for MCAM allocation, CAM keyword writes, action/tag
programming, enable/disable, and entry copies. Emit them from the legacy
and CN20K NPC alloc, config, read, and shift paths so mailbox-driven
rule changes can be correlated with the programmed MCAM state.

---

v1 -> v2: Addressed sashiko comments.
- Assign pcifunc in otx2_npc_mcam_alloc_entries() and print it as 0x%x;
  record start_mcam_idx from rsp->entry_list[0] for non-contiguous
  allocations.
- Pass absolute actindex to cam/action traces and mask tx_intf to 0x1 on
  TX interfaces so emitters agree on mcam_index and tx_intf semantics.
- Add otx2_npc_mcam_copy and emit it from npc_copy_mcam_entry() to cover
  MCAM entry shifts; emit cam/action traces from the CN20K config path.
- Drop redundant TP_printk newlines; zero npc_mcam_alloc_entry_req on
  stack in alloc-and-write mailbox handlers before tracing kw_type/virt.
	https://lore.kernel.org/netdev/20260915025014.928685-1-rkannoth@marvell.com/

Signed-off-by: Suman Ghosh <sumang@marvell.com>
Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com>
---
 .../ethernet/marvell/octeontx2/af/cn20k/npc.c |  51 +++++---
 .../ethernet/marvell/octeontx2/af/rvu_npc.c   |  69 +++++++----
 .../ethernet/marvell/octeontx2/af/rvu_trace.c |   5 +
 .../ethernet/marvell/octeontx2/af/rvu_trace.h | 114 ++++++++++++++++++
 4 files changed, 196 insertions(+), 43 deletions(-)

diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
index 7c829b1da3e5..0b485728f399 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
@@ -15,6 +15,7 @@
 #include "cn20k/npc.h"
 #include "cn20k/reg.h"
 #include "rvu_npc_fs.h"
+#include <rvu_trace.h>
 
 static struct npc_priv_t *npc_priv;
 
@@ -973,13 +974,15 @@ static void npc_cn20k_config_kw_x2(struct rvu *rvu, struct npc_mcam *mcam,
 				   int blkaddr, int index, u8 intf,
 				   struct cn20k_mcam_entry *entry,
 				   int bank, u8 kw_type, int kw,
-				   u8 req_kw_type)
+				   u8 req_kw_type, u16 actindex)
 {
+	u64 w0_cam0, w0_cam1, w1_cam0, w1_cam1;
+	u64 w2_cam0, w2_cam1, w3_cam0, w3_cam1;
 	u64 intf_ext = 0, intf_ext_mask = 0;
 	u8 tx_intf_mask = ~intf & 0x3;
 	u8 tx_intf = intf, kex_type;
 	u8 kw_type_mask = ~kw_type;
-	u64 cam0, cam1, kex_cfg;
+	u64 kex_cfg;
 
 	if (is_npc_intf_tx(intf)) {
 		/* Last bit must be set and rest don't care
@@ -1018,43 +1021,46 @@ static void npc_cn20k_config_kw_x2(struct rvu *rvu, struct npc_mcam *mcam,
 		    intf_ext_mask);
 
 	/* Set the match key */
-	npc_cn20k_get_keyword(entry, kw, &cam0, &cam1);
+	npc_cn20k_get_keyword(entry, kw, &w0_cam0, &w0_cam1);
 	rvu_write64(rvu, blkaddr,
 		    NPC_AF_CN20K_MCAMEX_BANKX_CAMX_W0_EXT(index, bank, 1),
-		    cam1);
+		    w0_cam1);
 	rvu_write64(rvu, blkaddr,
 		    NPC_AF_CN20K_MCAMEX_BANKX_CAMX_W0_EXT(index, bank, 0),
-		    cam0);
+		    w0_cam0);
 
-	npc_cn20k_get_keyword(entry, kw + 1, &cam0, &cam1);
+	npc_cn20k_get_keyword(entry, kw + 1, &w1_cam0, &w1_cam1);
 	rvu_write64(rvu, blkaddr,
 		    NPC_AF_CN20K_MCAMEX_BANKX_CAMX_W1_EXT(index, bank, 1),
-		    cam1);
+		    w1_cam1);
 	rvu_write64(rvu, blkaddr,
 		    NPC_AF_CN20K_MCAMEX_BANKX_CAMX_W1_EXT(index, bank, 0),
-		    cam0);
+		    w1_cam0);
 
-	npc_cn20k_get_keyword(entry, kw + 2, &cam0, &cam1);
+	npc_cn20k_get_keyword(entry, kw + 2, &w2_cam0, &w2_cam1);
 	rvu_write64(rvu, blkaddr,
 		    NPC_AF_CN20K_MCAMEX_BANKX_CAMX_W2_EXT(index, bank, 1),
-		    cam1);
+		    w2_cam1);
 	rvu_write64(rvu, blkaddr,
 		    NPC_AF_CN20K_MCAMEX_BANKX_CAMX_W2_EXT(index, bank, 0),
-		    cam0);
+		    w2_cam0);
 
-	npc_cn20k_get_keyword(entry, kw + 3, &cam0, &cam1);
+	npc_cn20k_get_keyword(entry, kw + 3, &w3_cam0, &w3_cam1);
 	rvu_write64(rvu, blkaddr,
 		    NPC_AF_CN20K_MCAMEX_BANKX_CAMX_W3_EXT(index, bank, 1),
-		    cam1);
+		    w3_cam1);
 	rvu_write64(rvu, blkaddr,
 		    NPC_AF_CN20K_MCAMEX_BANKX_CAMX_W3_EXT(index, bank, 0),
-		    cam0);
+		    w3_cam0);
+
+	trace_otx2_npc_cam(actindex, bank, w0_cam0, w0_cam1, w1_cam0, w1_cam1);
+	trace_otx2_npc_cam(actindex, bank, w2_cam0, w2_cam1, w3_cam0, w3_cam1);
 }
 
 static void npc_cn20k_config_kw_x4(struct rvu *rvu, struct npc_mcam *mcam,
 				   int blkaddr, int index, u8 intf,
 				   struct cn20k_mcam_entry *entry,
-				   u8 kw_type, u8 req_kw_type)
+				   u8 kw_type, u8 req_kw_type, u16 actindex)
 {
 	int kw = 0, bank;
 
@@ -1062,7 +1068,7 @@ static void npc_cn20k_config_kw_x4(struct rvu *rvu, struct npc_mcam *mcam,
 		npc_cn20k_config_kw_x2(rvu, mcam, blkaddr,
 				       index, intf,
 				       entry, bank, kw_type,
-				       kw, req_kw_type);
+				       kw, req_kw_type, actindex);
 }
 
 int npc_cn20k_config_mcam_entry(struct rvu *rvu, int blkaddr, int index,
@@ -1071,10 +1077,11 @@ int npc_cn20k_config_mcam_entry(struct rvu *rvu, int blkaddr, int index,
 {
 	struct npc_mcam *mcam = &rvu->hw->mcam;
 	int mcam_idx = index % mcam->banksize;
+	int actbank = npc_get_bank(mcam, index);
 	int bank = index / mcam->banksize;
 	u64 bank_cfg = (u64)hw_prio << 24;
+	u8 kw_type, tx_intf = intf;
 	int kw = 0;
-	u8 kw_type;
 
 	if (index < 0 || index >= mcam->total_entries)
 		return -EINVAL;
@@ -1097,7 +1104,7 @@ int npc_cn20k_config_mcam_entry(struct rvu *rvu, int blkaddr, int index,
 		npc_clear_x2_entry(rvu, blkaddr, bank, mcam_idx);
 		npc_cn20k_config_kw_x2(rvu, mcam, blkaddr,
 				       mcam_idx, intf, entry,
-				       bank, kw_type, kw, req_kw_type);
+				       bank, kw_type, kw, req_kw_type, index);
 		/* Set 'action' */
 		rvu_write64(rvu, blkaddr,
 			    NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(mcam_idx,
@@ -1128,7 +1135,7 @@ int npc_cn20k_config_mcam_entry(struct rvu *rvu, int blkaddr, int index,
 
 		npc_cn20k_config_kw_x4(rvu, mcam, blkaddr,
 				       mcam_idx, intf, entry,
-				       kw_type, req_kw_type);
+				       kw_type, req_kw_type, index);
 		for (bank = 0; bank < mcam->banks_per_entry; bank++) {
 			/* Set 'action' */
 			rvu_write64(rvu, blkaddr,
@@ -1157,6 +1164,10 @@ int npc_cn20k_config_mcam_entry(struct rvu *rvu, int blkaddr, int index,
 
 	/* TODO: */
 	/* PF installing VF rule */
+	if (is_npc_intf_tx(intf))
+		tx_intf &= 0x1;
+	trace_otx2_npc_action(index, actbank, tx_intf, (u8)enable,
+			      entry->action, entry->vtag_action);
 	if (npc_cn20k_enable_mcam_entry(rvu, blkaddr, index, enable))
 		return -EINVAL;
 
@@ -1434,7 +1445,7 @@ int rvu_mbox_handler_npc_cn20k_mcam_alloc_and_write_entry(struct rvu *rvu,
 {
 	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, req->hdr.pcifunc);
 	struct npc_mcam_free_entry_req free_req = { 0 };
-	struct npc_mcam_alloc_entry_req entry_req;
+	struct npc_mcam_alloc_entry_req entry_req = { 0 };
 	struct npc_mcam_alloc_entry_rsp entry_rsp;
 	struct npc_mcam *mcam = &rvu->hw->mcam;
 	u16 entry = NPC_MCAM_ENTRY_INVALID;
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
index 42a601976db3..fe8625ee4051 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(actindex, bank, w0_cam0, w0_cam1, w1_cam0, w1_cam1);
 	}
 
 	/* PF installing VF rule */
@@ -586,6 +589,10 @@ 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);
 
+	if (is_npc_intf_tx(intf))
+		tx_intf &= 0x1;
+	trace_otx2_npc_action(actindex, 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 +603,27 @@ 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;
+	u16 actindex = src;
+	u8 tx_intf;
 	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(actindex, bank, w0_cam0, w0_cam1, w1_cam0, w1_cam1);
 	}
 
 	entry->action = rvu_read64(rvu, blkaddr,
@@ -625,18 +635,28 @@ 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;
+	tx_intf = *intf;
+	if (is_npc_intf_tx(tx_intf))
+		tx_intf &= 0x1;
+	trace_otx2_npc_action(actindex, sbank, tx_intf, *ena,
+			      entry->action, entry->vtag_action);
 }
 
 static int npc_copy_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam,
 			       int blkaddr, u16 src, u16 dest)
 {
+	u64 cfg, sreg, dreg;
+	u16 orig_src = src, orig_dest = dest;
 	int dbank = npc_get_bank(mcam, dest);
 	int sbank = npc_get_bank(mcam, src);
-	u64 cfg, sreg, dreg;
-	int bank, i;
+	int bank, i, err;
 
-	if (is_cn20k(rvu->pdev))
-		return npc_cn20k_copy_mcam_entry(rvu, blkaddr, src, dest);
+	if (is_cn20k(rvu->pdev)) {
+		err = npc_cn20k_copy_mcam_entry(rvu, blkaddr, src, dest);
+		if (!err)
+			trace_otx2_npc_mcam_copy(orig_src, orig_dest);
+		return err;
+	}
 
 	src &= (mcam->banksize - 1);
 	dest &= (mcam->banksize - 1);
@@ -668,6 +688,7 @@ static int npc_copy_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam,
 			 NPC_AF_MCAMEX_BANKX_CFG(src, sbank));
 	rvu_write64(rvu, blkaddr,
 		    NPC_AF_MCAMEX_BANKX_CFG(dest, dbank), cfg);
+	trace_otx2_npc_mcam_copy(orig_src, orig_dest);
 	return 0;
 }
 
@@ -3198,6 +3219,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:
@@ -3384,6 +3406,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;
 }
 
@@ -4043,7 +4066,7 @@ int rvu_mbox_handler_npc_mcam_alloc_and_write_entry(struct rvu *rvu,
 	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, req->hdr.pcifunc);
 	struct npc_mcam_alloc_counter_req cntr_req;
 	struct npc_mcam_alloc_counter_rsp cntr_rsp;
-	struct npc_mcam_alloc_entry_req entry_req;
+	struct npc_mcam_alloc_entry_req entry_req = { 0 };
 	struct npc_mcam_alloc_entry_rsp entry_rsp;
 	struct npc_mcam *mcam = &rvu->hw->mcam;
 	u16 entry = NPC_MCAM_ENTRY_INVALID;
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.c
index 19e0d16b12f6..42797e7d13ba 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.c
@@ -13,3 +13,8 @@ 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_mcam_copy);
+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..ea1c5d7f1007 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.h
@@ -159,6 +159,120 @@ 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->pcifunc = pcifunc;
+			   __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 = req->contig ? rsp->entry :
+				(rsp->count ? rsp->entry_list[0] :
+				 NPC_MCAM_ENTRY_INVALID);
+			   __entry->rsp_count = rsp->count;
+			   __entry->free_count = rsp->free_count;
+	    ),
+	    TP_printk("pcifunc:0x%x 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",
+		      __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_mcam_copy,
+	    TP_PROTO(u16 src, u16 dest),
+	    TP_ARGS(src, dest),
+	    TP_STRUCT__entry(__field(u16, src)
+			     __field(u16, dest)
+	    ),
+	    TP_fast_assign(__entry->src = src;
+			   __entry->dest = dest;
+	    ),
+	    TP_printk("src:%d dest:%d", __entry->src, __entry->dest)
+);
+
+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", __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",
+		      __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",
+		      __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