xref: /dpdk/drivers/common/cnxk/roc_npc_mcam_dump.c (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
19869c399SSatheesh Paul /* SPDX-License-Identifier: BSD-3-Clause
29869c399SSatheesh Paul  * Copyright(C) 2021 Marvell.
39869c399SSatheesh Paul  */
49869c399SSatheesh Paul 
59869c399SSatheesh Paul #include "roc_api.h"
69869c399SSatheesh Paul #include "roc_priv.h"
79869c399SSatheesh Paul 
89869c399SSatheesh Paul #define NPC_MAX_FIELD_NAME_SIZE	   80
99869c399SSatheesh Paul #define NPC_RX_ACTIONOP_MASK	   GENMASK(3, 0)
109869c399SSatheesh Paul #define NPC_RX_ACTION_PFFUNC_MASK  GENMASK(19, 4)
119869c399SSatheesh Paul #define NPC_RX_ACTION_INDEX_MASK   GENMASK(39, 20)
129869c399SSatheesh Paul #define NPC_RX_ACTION_MATCH_MASK   GENMASK(55, 40)
139869c399SSatheesh Paul #define NPC_RX_ACTION_FLOWKEY_MASK GENMASK(60, 56)
149869c399SSatheesh Paul 
159869c399SSatheesh Paul #define NPC_TX_ACTION_INDEX_MASK GENMASK(31, 12)
169869c399SSatheesh Paul #define NPC_TX_ACTION_MATCH_MASK GENMASK(47, 32)
179869c399SSatheesh Paul 
189869c399SSatheesh Paul #define NIX_RX_VTAGACT_VTAG0_RELPTR_MASK GENMASK(7, 0)
199869c399SSatheesh Paul #define NIX_RX_VTAGACT_VTAG0_LID_MASK	 GENMASK(10, 8)
209869c399SSatheesh Paul #define NIX_RX_VTAGACT_VTAG0_TYPE_MASK	 GENMASK(14, 12)
219869c399SSatheesh Paul #define NIX_RX_VTAGACT_VTAG0_VALID_MASK	 BIT_ULL(15)
229869c399SSatheesh Paul 
239869c399SSatheesh Paul #define NIX_RX_VTAGACT_VTAG1_RELPTR_MASK GENMASK(39, 32)
249869c399SSatheesh Paul #define NIX_RX_VTAGACT_VTAG1_LID_MASK	 GENMASK(42, 40)
259869c399SSatheesh Paul #define NIX_RX_VTAGACT_VTAG1_TYPE_MASK	 GENMASK(46, 44)
269869c399SSatheesh Paul #define NIX_RX_VTAGACT_VTAG1_VALID_MASK	 BIT_ULL(47)
279869c399SSatheesh Paul 
289869c399SSatheesh Paul #define NIX_TX_VTAGACT_VTAG0_RELPTR_MASK GENMASK(7, 0)
299869c399SSatheesh Paul #define NIX_TX_VTAGACT_VTAG0_LID_MASK	 GENMASK(10, 8)
309869c399SSatheesh Paul #define NIX_TX_VTAGACT_VTAG0_OP_MASK	 GENMASK(13, 12)
319869c399SSatheesh Paul #define NIX_TX_VTAGACT_VTAG0_DEF_MASK	 GENMASK(25, 16)
329869c399SSatheesh Paul 
339869c399SSatheesh Paul #define NIX_TX_VTAGACT_VTAG1_RELPTR_MASK GENMASK(39, 32)
349869c399SSatheesh Paul #define NIX_TX_VTAGACT_VTAG1_LID_MASK	 GENMASK(42, 40)
359869c399SSatheesh Paul #define NIX_TX_VTAGACT_VTAG1_OP_MASK	 GENMASK(45, 44)
369869c399SSatheesh Paul #define NIX_TX_VTAGACT_VTAG1_DEF_MASK	 GENMASK(57, 48)
379869c399SSatheesh Paul 
38*e7750639SAndre Muezerie struct __plt_packed_begin npc_rx_parse_nibble_s {
399869c399SSatheesh Paul 	uint16_t chan : 3;
409869c399SSatheesh Paul 	uint16_t errlev : 1;
419869c399SSatheesh Paul 	uint16_t errcode : 2;
429869c399SSatheesh Paul 	uint16_t l2l3bm : 1;
439869c399SSatheesh Paul 	uint16_t laflags : 2;
449869c399SSatheesh Paul 	uint16_t latype : 1;
459869c399SSatheesh Paul 	uint16_t lbflags : 2;
469869c399SSatheesh Paul 	uint16_t lbtype : 1;
479869c399SSatheesh Paul 	uint16_t lcflags : 2;
489869c399SSatheesh Paul 	uint16_t lctype : 1;
499869c399SSatheesh Paul 	uint16_t ldflags : 2;
509869c399SSatheesh Paul 	uint16_t ldtype : 1;
519869c399SSatheesh Paul 	uint16_t leflags : 2;
529869c399SSatheesh Paul 	uint16_t letype : 1;
539869c399SSatheesh Paul 	uint16_t lfflags : 2;
549869c399SSatheesh Paul 	uint16_t lftype : 1;
559869c399SSatheesh Paul 	uint16_t lgflags : 2;
569869c399SSatheesh Paul 	uint16_t lgtype : 1;
579869c399SSatheesh Paul 	uint16_t lhflags : 2;
589869c399SSatheesh Paul 	uint16_t lhtype : 1;
59*e7750639SAndre Muezerie } __plt_packed_end;
609869c399SSatheesh Paul 
619869c399SSatheesh Paul static const char *const intf_str[] = {
629869c399SSatheesh Paul 	"NIX-RX",
639869c399SSatheesh Paul 	"NIX-TX",
649869c399SSatheesh Paul };
659869c399SSatheesh Paul 
669869c399SSatheesh Paul static const char *const ltype_str[NPC_MAX_LID][NPC_MAX_LT] = {
679869c399SSatheesh Paul 	[NPC_LID_LA][0] = "NONE",
689869c399SSatheesh Paul 	[NPC_LID_LA][NPC_LT_LA_ETHER] = "LA_ETHER",
699869c399SSatheesh Paul 	[NPC_LID_LA][NPC_LT_LA_IH_NIX_ETHER] = "LA_IH_NIX_ETHER",
709869c399SSatheesh Paul 	[NPC_LID_LA][NPC_LT_LA_HIGIG2_ETHER] = "LA_HIGIG2_ETHER",
719869c399SSatheesh Paul 	[NPC_LID_LA][NPC_LT_LA_IH_NIX_HIGIG2_ETHER] = "LA_IH_NIX_HIGIG2_ETHER",
72a0c837adSSatheesh Paul 	[NPC_LID_LA][NPC_LT_LA_CUSTOM_L2_90B_ETHER] = "LA_CUSTOM_L2_90B_ETHER",
73a0c837adSSatheesh Paul 	[NPC_LID_LA][NPC_LT_LA_CPT_HDR] = "LA_CPT_HDR",
74a0c837adSSatheesh Paul 	[NPC_LID_LA][NPC_LT_LA_CUSTOM_L2_24B_ETHER] = "LA_CUSTOM_L2_24B_ETHER",
75a0c837adSSatheesh Paul 	[NPC_LID_LA][NPC_LT_LA_CUSTOM_PRE_L2_ETHER] = "NPC_LT_LA_CUSTOM_PRE_L2_ETHER",
7644550b64SSatheesh Paul 	[NPC_LID_LA][NPC_LT_LA_CUSTOM0] = "NPC_LT_LA_CUSTOM0",
7744550b64SSatheesh Paul 	[NPC_LID_LA][NPC_LT_LA_CUSTOM1] = "NPC_LT_LA_CUSTOM1",
789869c399SSatheesh Paul 	[NPC_LID_LB][0] = "NONE",
7944550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_ETAG] = "LB_ETAG",
809869c399SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_CTAG] = "LB_CTAG",
819869c399SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_STAG_QINQ] = "LB_STAG_QINQ",
8244550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_BTAG] = "LB_BTAG",
8344550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_PPPOE] = "LB_PPPOE",
8444550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_DSA] = "LB_DSA",
8544550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_DSA_VLAN] = "LB_DSA_VLAN",
8644550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_EDSA] = "LB_EDSA",
8744550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_EDSA_VLAN] = "LB_EDSA_VLAN",
889869c399SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_EXDSA] = "LB_EXDSA",
8944550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_EXDSA_VLAN] = "LB_EXDSA_VLAN",
9044550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_FDSA] = "LB_FDSA",
919869c399SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_VLAN_EXDSA] = "LB_VLAN_EXDSA",
9244550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_CUSTOM0] = "LB_CUSTOM0",
9344550b64SSatheesh Paul 	[NPC_LID_LB][NPC_LT_LB_CUSTOM1] = "LB_CUSTOM1",
949869c399SSatheesh Paul 	[NPC_LID_LC][0] = "NONE",
9544550b64SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_PTP] = "LC_PTP",
969869c399SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_IP] = "LC_IP",
9744550b64SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_IP_OPT] = "LC_IP_OPT",
989869c399SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_IP6] = "LC_IP6",
999869c399SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_IP6_EXT] = "LC_IP6_EXT",
10044550b64SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_ARP] = "LC_ARP",
10144550b64SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_RARP] = "LC_RARP",
10244550b64SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_MPLS] = "LC_MPLS",
10344550b64SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_NSH] = "LC_NSH",
10444550b64SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_FCOE] = "LC_FCOE",
1059869c399SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_NGIO] = "LC_NGIO",
10644550b64SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_CUSTOM0] = "LC_CUSTOM0",
10744550b64SSatheesh Paul 	[NPC_LID_LC][NPC_LT_LC_CUSTOM1] = "LC_CUSTOM1",
1089869c399SSatheesh Paul 	[NPC_LID_LD][0] = "NONE",
1099869c399SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_TCP] = "LD_TCP",
11044550b64SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_UDP] = "LD_UDP",
1119869c399SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_SCTP] = "LD_SCTP",
11244550b64SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_ICMP6] = "LD_ICMP6",
11344550b64SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_CUSTOM0] = "LD_CUSTOM0",
11444550b64SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_CUSTOM1] = "LD_CUSTOM1",
11544550b64SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_IGMP] = "LD_IGMP",
11644550b64SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_AH] = "LD_AH",
1179869c399SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_GRE] = "LD_GRE",
1189869c399SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_NVGRE] = "LD_NVGRE",
11944550b64SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_NSH] = "LD_NSH",
12044550b64SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_TU_MPLS_IN_NSH] = "LD_TU_MPLS_IN_NSH",
12144550b64SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_TU_MPLS_IN_IP] = "LD_TU_MPLS_IN_IP",
12244550b64SSatheesh Paul 	[NPC_LID_LD][NPC_LT_LD_ICMP] = "LD_ICMP",
1239869c399SSatheesh Paul 	[NPC_LID_LE][0] = "NONE",
1249869c399SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_VXLAN] = "LE_VXLAN",
1259869c399SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_GENEVE] = "LE_GENEVE",
12644550b64SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_ESP] = "LE_ESP",
12744550b64SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_GTPU] = "LE_GTPU",
1289869c399SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_VXLANGPE] = "LE_VXLANGPE",
12944550b64SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_GTPC] = "LE_GTPC",
13044550b64SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_NSH] = "LE_NSH",
13144550b64SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_TU_MPLS_IN_GRE] = "LE_TU_MPLS_IN_GRE",
13244550b64SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_TU_NSH_IN_GRE] = "LE_TU_NSH_IN_GRE",
13344550b64SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_TU_MPLS_IN_UDP] = "LE_TU_MPLS_IN_UDP",
13444550b64SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_CUSTOM0] = "LE_CUSTOM0",
13544550b64SSatheesh Paul 	[NPC_LID_LE][NPC_LT_LE_CUSTOM1] = "LE_CUSTOM1",
1369869c399SSatheesh Paul 	[NPC_LID_LF][0] = "NONE",
1379869c399SSatheesh Paul 	[NPC_LID_LF][NPC_LT_LF_TU_ETHER] = "LF_TU_ETHER",
13844550b64SSatheesh Paul 	[NPC_LID_LF][NPC_LT_LF_TU_PPP] = "LF_TU_PPP",
13944550b64SSatheesh Paul 	[NPC_LID_LF][NPC_LT_LF_TU_MPLS_IN_VXLANGPE] = "LF_TU_MPLS_IN_VXLANGPE",
14044550b64SSatheesh Paul 	[NPC_LID_LF][NPC_LT_LF_TU_NSH_IN_VXLANGPE] = "LF_TU_NSH_IN_VXLANGPE",
14144550b64SSatheesh Paul 	[NPC_LID_LF][NPC_LT_LF_TU_MPLS_IN_NSH] = "LF_TU_MPLS_IN_NSH",
14244550b64SSatheesh Paul 	[NPC_LID_LF][NPC_LT_LF_TU_3RD_NSH] = "LF_TU_3RD_NSH",
14344550b64SSatheesh Paul 	[NPC_LID_LF][NPC_LT_LF_CUSTOM0] = "LF_CUSTOM0",
14444550b64SSatheesh Paul 	[NPC_LID_LF][NPC_LT_LF_CUSTOM1] = "LF_CUSTOM1",
1459869c399SSatheesh Paul 	[NPC_LID_LG][0] = "NONE",
1469869c399SSatheesh Paul 	[NPC_LID_LG][NPC_LT_LG_TU_IP] = "LG_TU_IP",
1479869c399SSatheesh Paul 	[NPC_LID_LG][NPC_LT_LG_TU_IP6] = "LG_TU_IP6",
14844550b64SSatheesh Paul 	[NPC_LID_LG][NPC_LT_LG_TU_ARP] = "LG_TU_ARP",
14944550b64SSatheesh Paul 	[NPC_LID_LG][NPC_LT_LG_TU_ETHER_IN_NSH] = "LG_TU_ETHER_IN_NSH",
15044550b64SSatheesh Paul 	[NPC_LID_LG][NPC_LT_LG_CUSTOM0] = "LG_CUSTOM0",
15144550b64SSatheesh Paul 	[NPC_LID_LG][NPC_LT_LG_CUSTOM1] = "LG_CUSTOM1",
1529869c399SSatheesh Paul 	[NPC_LID_LH][0] = "NONE",
1539869c399SSatheesh Paul 	[NPC_LID_LH][NPC_LT_LH_TU_TCP] = "LH_TU_TCP",
15444550b64SSatheesh Paul 	[NPC_LID_LH][NPC_LT_LH_TU_UDP] = "LH_TU_UDP",
1559869c399SSatheesh Paul 	[NPC_LID_LH][NPC_LT_LH_TU_SCTP] = "LH_TU_SCTP",
15644550b64SSatheesh Paul 	[NPC_LID_LH][NPC_LT_LH_TU_ICMP6] = "LH_TU_ICMP6",
15744550b64SSatheesh Paul 	[NPC_LID_LH][NPC_LT_LH_CUSTOM0] = "LH_CUSTOM0",
15844550b64SSatheesh Paul 	[NPC_LID_LH][NPC_LT_LH_CUSTOM1] = "LH_CUSTOM1",
15944550b64SSatheesh Paul 	[NPC_LID_LH][NPC_LT_LH_TU_IGMP] = "LH_TU_IGMP",
1609869c399SSatheesh Paul 	[NPC_LID_LH][NPC_LT_LH_TU_ESP] = "LH_TU_ESP",
16144550b64SSatheesh Paul 	[NPC_LID_LH][NPC_LT_LH_TU_AH] = "LH_TU_AH",
16244550b64SSatheesh Paul 	[NPC_LID_LH][NPC_LT_LH_TU_ICMP] = "LH_TU_ICMP",
1639869c399SSatheesh Paul };
1649869c399SSatheesh Paul 
1659869c399SSatheesh Paul static uint16_t
1669869c399SSatheesh Paul npc_get_nibbles(struct roc_npc_flow *flow, uint16_t size, uint32_t bit_offset)
1679869c399SSatheesh Paul {
1689869c399SSatheesh Paul 	uint32_t byte_index, noffset;
1699869c399SSatheesh Paul 	uint16_t data, mask;
1709869c399SSatheesh Paul 	uint8_t *bytes;
1719869c399SSatheesh Paul 
1729869c399SSatheesh Paul 	bytes = (uint8_t *)flow->mcam_data;
1739869c399SSatheesh Paul 	mask = (1ULL << (size * 4)) - 1;
1749869c399SSatheesh Paul 	byte_index = bit_offset / 8;
1759869c399SSatheesh Paul 	noffset = bit_offset % 8;
1769869c399SSatheesh Paul 	data = *(unaligned_uint16_t *)&bytes[byte_index];
1779869c399SSatheesh Paul 	data >>= noffset;
1789869c399SSatheesh Paul 	data &= mask;
1799869c399SSatheesh Paul 
1809869c399SSatheesh Paul 	return data;
1819869c399SSatheesh Paul }
1829869c399SSatheesh Paul 
1839869c399SSatheesh Paul static void
1849869c399SSatheesh Paul npc_flow_print_parse_nibbles(FILE *file, struct roc_npc_flow *flow,
1859869c399SSatheesh Paul 			     uint64_t parse_nibbles)
1869869c399SSatheesh Paul {
1879869c399SSatheesh Paul 	struct npc_rx_parse_nibble_s *rx_parse;
1889869c399SSatheesh Paul 	uint32_t data, offset = 0;
1899869c399SSatheesh Paul 
1909869c399SSatheesh Paul 	rx_parse = (struct npc_rx_parse_nibble_s *)&parse_nibbles;
1919869c399SSatheesh Paul 
1929869c399SSatheesh Paul 	if (rx_parse->chan) {
1939869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 3, offset);
1949869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_CHAN:%#03X\n", data);
1959869c399SSatheesh Paul 		offset += 12;
1969869c399SSatheesh Paul 	}
1979869c399SSatheesh Paul 
1989869c399SSatheesh Paul 	if (rx_parse->errlev) {
1999869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 1, offset);
2009869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_ERRLEV:%#X\n", data);
2019869c399SSatheesh Paul 		offset += 4;
2029869c399SSatheesh Paul 	}
2039869c399SSatheesh Paul 
2049869c399SSatheesh Paul 	if (rx_parse->errcode) {
2059869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 2, offset);
2069869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_ERRCODE:%#02X\n", data);
2079869c399SSatheesh Paul 		offset += 8;
2089869c399SSatheesh Paul 	}
2099869c399SSatheesh Paul 
2109869c399SSatheesh Paul 	if (rx_parse->l2l3bm) {
2119869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 1, offset);
2129869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_L2L3_BCAST:%#X\n", data);
2139869c399SSatheesh Paul 		offset += 4;
2149869c399SSatheesh Paul 	}
2159869c399SSatheesh Paul 
2160ed49186SSatheesh Paul 	if (rx_parse->laflags) {
2170ed49186SSatheesh Paul 		data = npc_get_nibbles(flow, 2, offset);
2180ed49186SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LA_FLAGS:%#02X\n", data);
2190ed49186SSatheesh Paul 		offset += 8;
2200ed49186SSatheesh Paul 	}
2210ed49186SSatheesh Paul 
2229869c399SSatheesh Paul 	if (rx_parse->latype) {
2239869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 1, offset);
2249869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LA_LTYPE:%s\n",
2259869c399SSatheesh Paul 			ltype_str[NPC_LID_LA][data]);
2269869c399SSatheesh Paul 		offset += 4;
2279869c399SSatheesh Paul 	}
2289869c399SSatheesh Paul 
2290ed49186SSatheesh Paul 	if (rx_parse->lbflags) {
2309869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 2, offset);
2310ed49186SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LB_FLAGS:%#02X\n", data);
2329869c399SSatheesh Paul 		offset += 8;
2339869c399SSatheesh Paul 	}
2349869c399SSatheesh Paul 
2359869c399SSatheesh Paul 	if (rx_parse->lbtype) {
2369869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 1, offset);
2379869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LB_LTYPE:%s\n",
2389869c399SSatheesh Paul 			ltype_str[NPC_LID_LB][data]);
2399869c399SSatheesh Paul 		offset += 4;
2409869c399SSatheesh Paul 	}
2419869c399SSatheesh Paul 
2420ed49186SSatheesh Paul 	if (rx_parse->lcflags) {
2439869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 2, offset);
2440ed49186SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LC_FLAGS:%#02X\n", data);
2459869c399SSatheesh Paul 		offset += 8;
2469869c399SSatheesh Paul 	}
2479869c399SSatheesh Paul 
2489869c399SSatheesh Paul 	if (rx_parse->lctype) {
2499869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 1, offset);
2509869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LC_LTYPE:%s\n",
2519869c399SSatheesh Paul 			ltype_str[NPC_LID_LC][data]);
2529869c399SSatheesh Paul 		offset += 4;
2539869c399SSatheesh Paul 	}
2549869c399SSatheesh Paul 
2550ed49186SSatheesh Paul 	if (rx_parse->ldflags) {
2569869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 2, offset);
2570ed49186SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LD_FLAGS:%#02X\n", data);
2589869c399SSatheesh Paul 		offset += 8;
2599869c399SSatheesh Paul 	}
2609869c399SSatheesh Paul 
2619869c399SSatheesh Paul 	if (rx_parse->ldtype) {
2629869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 1, offset);
2639869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LD_LTYPE:%s\n",
2649869c399SSatheesh Paul 			ltype_str[NPC_LID_LD][data]);
2659869c399SSatheesh Paul 		offset += 4;
2669869c399SSatheesh Paul 	}
2679869c399SSatheesh Paul 
2680ed49186SSatheesh Paul 	if (rx_parse->leflags) {
2699869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 2, offset);
2700ed49186SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LE_FLAGS:%#02X\n", data);
2719869c399SSatheesh Paul 		offset += 8;
2729869c399SSatheesh Paul 	}
2739869c399SSatheesh Paul 
2749869c399SSatheesh Paul 	if (rx_parse->letype) {
2759869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 1, offset);
2769869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LE_LTYPE:%s\n",
2779869c399SSatheesh Paul 			ltype_str[NPC_LID_LE][data]);
2789869c399SSatheesh Paul 		offset += 4;
2799869c399SSatheesh Paul 	}
2809869c399SSatheesh Paul 
2810ed49186SSatheesh Paul 	if (rx_parse->lfflags) {
2829869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 2, offset);
2830ed49186SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LF_FLAGS:%#02X\n", data);
2849869c399SSatheesh Paul 		offset += 8;
2859869c399SSatheesh Paul 	}
2869869c399SSatheesh Paul 
2879869c399SSatheesh Paul 	if (rx_parse->lftype) {
2889869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 1, offset);
2899869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LF_LTYPE:%s\n",
2909869c399SSatheesh Paul 			ltype_str[NPC_LID_LF][data]);
2919869c399SSatheesh Paul 		offset += 4;
2929869c399SSatheesh Paul 	}
2939869c399SSatheesh Paul 
2940ed49186SSatheesh Paul 	if (rx_parse->lgflags) {
2959869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 2, offset);
2960ed49186SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LG_FLAGS:%#02X\n", data);
2979869c399SSatheesh Paul 		offset += 8;
2989869c399SSatheesh Paul 	}
2999869c399SSatheesh Paul 
3009869c399SSatheesh Paul 	if (rx_parse->lgtype) {
3019869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 1, offset);
3029869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LG_LTYPE:%s\n",
3039869c399SSatheesh Paul 			ltype_str[NPC_LID_LG][data]);
3049869c399SSatheesh Paul 		offset += 4;
3059869c399SSatheesh Paul 	}
3069869c399SSatheesh Paul 
3070ed49186SSatheesh Paul 	if (rx_parse->lhflags) {
3089869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 2, offset);
3090ed49186SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LH_FLAGS:%#02X\n", data);
3109869c399SSatheesh Paul 	}
3119869c399SSatheesh Paul 
3129869c399SSatheesh Paul 	if (rx_parse->lhtype) {
3139869c399SSatheesh Paul 		data = npc_get_nibbles(flow, 1, offset);
3149869c399SSatheesh Paul 		fprintf(file, "\tNPC_PARSE_NIBBLE_LH_LTYPE:%s\n",
3159869c399SSatheesh Paul 			ltype_str[NPC_LID_LH][data]);
3169869c399SSatheesh Paul 		offset += 4;
3179869c399SSatheesh Paul 	}
3189869c399SSatheesh Paul }
3199869c399SSatheesh Paul 
3209869c399SSatheesh Paul static void
3219869c399SSatheesh Paul npc_flow_print_xtractinfo(FILE *file, struct npc_xtract_info *lfinfo,
3229869c399SSatheesh Paul 			  struct roc_npc_flow *flow, int lid, int lt)
3239869c399SSatheesh Paul {
3249869c399SSatheesh Paul 	uint8_t *datastart, *maskstart;
3259869c399SSatheesh Paul 	int i;
3269869c399SSatheesh Paul 
3279869c399SSatheesh Paul 	datastart = (uint8_t *)&flow->mcam_data + lfinfo->key_off;
3289869c399SSatheesh Paul 	maskstart = (uint8_t *)&flow->mcam_mask + lfinfo->key_off;
3299869c399SSatheesh Paul 
3309869c399SSatheesh Paul 	fprintf(file, "\t%s, hdr offset:%#X, len:%#X, key offset:%#X, ",
3319869c399SSatheesh Paul 		ltype_str[lid][lt], lfinfo->hdr_off, lfinfo->len,
3329869c399SSatheesh Paul 		lfinfo->key_off);
3339869c399SSatheesh Paul 
3349869c399SSatheesh Paul 	fprintf(file, "Data:0X");
3359869c399SSatheesh Paul 	for (i = lfinfo->len - 1; i >= 0; i--)
3369869c399SSatheesh Paul 		fprintf(file, "%02X", datastart[i]);
3379869c399SSatheesh Paul 
3389869c399SSatheesh Paul 	fprintf(file, ", Mask:0X");
3399869c399SSatheesh Paul 
3409869c399SSatheesh Paul 	for (i = lfinfo->len - 1; i >= 0; i--)
3419869c399SSatheesh Paul 		fprintf(file, "%02X", maskstart[i]);
3429869c399SSatheesh Paul 
3439869c399SSatheesh Paul 	fprintf(file, "\n");
3449869c399SSatheesh Paul }
3459869c399SSatheesh Paul 
3469869c399SSatheesh Paul static void
3479869c399SSatheesh Paul npc_flow_print_item(FILE *file, struct npc *npc, struct npc_xtract_info *xinfo,
3489869c399SSatheesh Paul 		    struct roc_npc_flow *flow, int intf, int lid, int lt,
3499869c399SSatheesh Paul 		    int ld)
3509869c399SSatheesh Paul {
3519869c399SSatheesh Paul 	struct npc_xtract_info *lflags_info;
3529869c399SSatheesh Paul 	int i, lf_cfg = 0;
3539869c399SSatheesh Paul 
3549869c399SSatheesh Paul 	npc_flow_print_xtractinfo(file, xinfo, flow, lid, lt);
3559869c399SSatheesh Paul 
3569869c399SSatheesh Paul 	if (xinfo->flags_enable) {
3579869c399SSatheesh Paul 		lf_cfg = npc->prx_lfcfg[ld].i;
3589869c399SSatheesh Paul 
3599869c399SSatheesh Paul 		if (lf_cfg != lid)
3609869c399SSatheesh Paul 			return;
3619869c399SSatheesh Paul 
3629869c399SSatheesh Paul 		for (i = 0; i < NPC_MAX_LFL; i++) {
3639869c399SSatheesh Paul 			lflags_info = npc->prx_fxcfg[intf][ld][i].xtract;
3649869c399SSatheesh Paul 
365af45c18eSSatheesh Paul 			if (!lflags_info->enable)
366af45c18eSSatheesh Paul 				continue;
367af45c18eSSatheesh Paul 
368af45c18eSSatheesh Paul 			npc_flow_print_xtractinfo(file, lflags_info, flow, lid, lt);
3699869c399SSatheesh Paul 		}
3709869c399SSatheesh Paul 	}
3719869c399SSatheesh Paul }
3729869c399SSatheesh Paul 
3739869c399SSatheesh Paul static void
3749869c399SSatheesh Paul npc_flow_dump_patterns(FILE *file, struct npc *npc, struct roc_npc_flow *flow)
3759869c399SSatheesh Paul {
3769869c399SSatheesh Paul 	struct npc_lid_lt_xtract_info *lt_xinfo;
3779869c399SSatheesh Paul 	struct npc_xtract_info *xinfo;
3789869c399SSatheesh Paul 	uint32_t intf, lid, ld, i;
3799869c399SSatheesh Paul 	uint64_t parse_nibbles;
3809869c399SSatheesh Paul 	uint16_t ltype;
3819869c399SSatheesh Paul 
3829869c399SSatheesh Paul 	intf = flow->nix_intf;
3839869c399SSatheesh Paul 	parse_nibbles = npc->keyx_supp_nmask[intf];
3849869c399SSatheesh Paul 	npc_flow_print_parse_nibbles(file, flow, parse_nibbles);
3859869c399SSatheesh Paul 
3869869c399SSatheesh Paul 	for (i = 0; i < flow->num_patterns; i++) {
3879869c399SSatheesh Paul 		lid = flow->dump_data[i].lid;
3889869c399SSatheesh Paul 		ltype = flow->dump_data[i].ltype;
3899869c399SSatheesh Paul 		lt_xinfo = &npc->prx_dxcfg[intf][lid][ltype];
3909869c399SSatheesh Paul 
3919869c399SSatheesh Paul 		for (ld = 0; ld < NPC_MAX_LD; ld++) {
3929869c399SSatheesh Paul 			xinfo = &lt_xinfo->xtract[ld];
3939869c399SSatheesh Paul 			if (!xinfo->enable)
3949869c399SSatheesh Paul 				continue;
3959869c399SSatheesh Paul 			npc_flow_print_item(file, npc, xinfo, flow, intf, lid,
3969869c399SSatheesh Paul 					    ltype, ld);
3979869c399SSatheesh Paul 		}
3989869c399SSatheesh Paul 	}
3999869c399SSatheesh Paul }
4009869c399SSatheesh Paul 
4019869c399SSatheesh Paul static void
4029869c399SSatheesh Paul npc_flow_dump_tx_action(FILE *file, uint64_t npc_action)
4039869c399SSatheesh Paul {
4049869c399SSatheesh Paul 	char index_name[NPC_MAX_FIELD_NAME_SIZE] = "Index:";
4059869c399SSatheesh Paul 	uint32_t tx_op, index, match_id;
4069869c399SSatheesh Paul 
4079869c399SSatheesh Paul 	tx_op = npc_action & NPC_RX_ACTIONOP_MASK;
4089869c399SSatheesh Paul 
4099869c399SSatheesh Paul 	fprintf(file, "\tActionOp:");
4109869c399SSatheesh Paul 
4119869c399SSatheesh Paul 	switch (tx_op) {
4129869c399SSatheesh Paul 	case NIX_TX_ACTIONOP_DROP:
4139869c399SSatheesh Paul 		fprintf(file, "NIX_TX_ACTIONOP_DROP (%" PRIu64 ")\n",
4149869c399SSatheesh Paul 			(uint64_t)NIX_RX_ACTIONOP_DROP);
4159869c399SSatheesh Paul 		break;
4169869c399SSatheesh Paul 	case NIX_TX_ACTIONOP_UCAST_DEFAULT:
4179869c399SSatheesh Paul 		fprintf(file, "NIX_TX_ACTIONOP_UCAST_DEFAULT (%" PRIu64 ")\n",
4189869c399SSatheesh Paul 			(uint64_t)NIX_TX_ACTIONOP_UCAST_DEFAULT);
4199869c399SSatheesh Paul 		break;
4209869c399SSatheesh Paul 	case NIX_TX_ACTIONOP_UCAST_CHAN:
4219869c399SSatheesh Paul 		fprintf(file, "NIX_TX_ACTIONOP_UCAST_DEFAULT (%" PRIu64 ")\n",
4229869c399SSatheesh Paul 			(uint64_t)NIX_TX_ACTIONOP_UCAST_CHAN);
4239869c399SSatheesh Paul 		plt_strlcpy(index_name,
4249869c399SSatheesh Paul 			    "Transmit Channel:", NPC_MAX_FIELD_NAME_SIZE);
4259869c399SSatheesh Paul 		break;
4269869c399SSatheesh Paul 	case NIX_TX_ACTIONOP_MCAST:
4279869c399SSatheesh Paul 		fprintf(file, "NIX_TX_ACTIONOP_MCAST (%" PRIu64 ")\n",
4289869c399SSatheesh Paul 			(uint64_t)NIX_TX_ACTIONOP_MCAST);
4299869c399SSatheesh Paul 		plt_strlcpy(index_name,
4309869c399SSatheesh Paul 			    "Multicast Table Index:", NPC_MAX_FIELD_NAME_SIZE);
4319869c399SSatheesh Paul 		break;
4329869c399SSatheesh Paul 	case NIX_TX_ACTIONOP_DROP_VIOL:
4339869c399SSatheesh Paul 		fprintf(file, "NIX_TX_ACTIONOP_DROP_VIOL (%" PRIu64 ")\n",
4349869c399SSatheesh Paul 			(uint64_t)NIX_TX_ACTIONOP_DROP_VIOL);
4359869c399SSatheesh Paul 		break;
4369869c399SSatheesh Paul 	default:
4379869c399SSatheesh Paul 		plt_err("Unknown NIX_TX_ACTIONOP found");
4389869c399SSatheesh Paul 		return;
4399869c399SSatheesh Paul 	}
4409869c399SSatheesh Paul 
4419869c399SSatheesh Paul 	index = ((npc_action & NPC_TX_ACTION_INDEX_MASK) >> 12) &
4429869c399SSatheesh Paul 		GENMASK(19, 0);
4439869c399SSatheesh Paul 
4449869c399SSatheesh Paul 	fprintf(file, "\t%s:%#05X\n", index_name, index);
4459869c399SSatheesh Paul 
4469869c399SSatheesh Paul 	match_id = ((npc_action & NPC_TX_ACTION_MATCH_MASK) >> 32) &
4479869c399SSatheesh Paul 		   GENMASK(15, 0);
4489869c399SSatheesh Paul 
4499869c399SSatheesh Paul 	fprintf(file, "\tMatch Id:%#04X\n", match_id);
4509869c399SSatheesh Paul }
4519869c399SSatheesh Paul 
4529869c399SSatheesh Paul static void
4539869c399SSatheesh Paul npc_flow_dump_rx_action(FILE *file, uint64_t npc_action)
4549869c399SSatheesh Paul {
4559869c399SSatheesh Paul 	uint32_t rx_op, pf_func, index, match_id, flowkey_alg;
4569869c399SSatheesh Paul 	char index_name[NPC_MAX_FIELD_NAME_SIZE] = "Index:";
4579869c399SSatheesh Paul 
4589869c399SSatheesh Paul 	rx_op = npc_action & NPC_RX_ACTIONOP_MASK;
4599869c399SSatheesh Paul 
4609869c399SSatheesh Paul 	fprintf(file, "\tActionOp:");
4619869c399SSatheesh Paul 
4629869c399SSatheesh Paul 	switch (rx_op) {
4639869c399SSatheesh Paul 	case NIX_RX_ACTIONOP_DROP:
4649869c399SSatheesh Paul 		fprintf(file, "NIX_RX_ACTIONOP_DROP (%" PRIu64 ")\n",
4659869c399SSatheesh Paul 			(uint64_t)NIX_RX_ACTIONOP_DROP);
4669869c399SSatheesh Paul 		break;
4679869c399SSatheesh Paul 	case NIX_RX_ACTIONOP_UCAST:
4689869c399SSatheesh Paul 		fprintf(file, "NIX_RX_ACTIONOP_UCAST (%" PRIu64 ")\n",
4699869c399SSatheesh Paul 			(uint64_t)NIX_RX_ACTIONOP_UCAST);
4709869c399SSatheesh Paul 		plt_strlcpy(index_name, "RQ Index", NPC_MAX_FIELD_NAME_SIZE);
4719869c399SSatheesh Paul 		break;
4729869c399SSatheesh Paul 	case NIX_RX_ACTIONOP_UCAST_IPSEC:
4739869c399SSatheesh Paul 		fprintf(file, "NIX_RX_ACTIONOP_UCAST_IPSEC (%" PRIu64 ")\n",
4749869c399SSatheesh Paul 			(uint64_t)NIX_RX_ACTIONOP_UCAST_IPSEC);
4759869c399SSatheesh Paul 		plt_strlcpy(index_name, "RQ Index:", NPC_MAX_FIELD_NAME_SIZE);
4769869c399SSatheesh Paul 		break;
4779869c399SSatheesh Paul 	case NIX_RX_ACTIONOP_MCAST:
4789869c399SSatheesh Paul 		fprintf(file, "NIX_RX_ACTIONOP_MCAST (%" PRIu64 ")\n",
4799869c399SSatheesh Paul 			(uint64_t)NIX_RX_ACTIONOP_MCAST);
4809869c399SSatheesh Paul 		plt_strlcpy(index_name, "Multicast/mirror table index",
4819869c399SSatheesh Paul 			    NPC_MAX_FIELD_NAME_SIZE);
4829869c399SSatheesh Paul 		break;
4839869c399SSatheesh Paul 	case NIX_RX_ACTIONOP_RSS:
4849869c399SSatheesh Paul 		fprintf(file, "NIX_RX_ACTIONOP_RSS (%" PRIu64 ")\n",
4859869c399SSatheesh Paul 			(uint64_t)NIX_RX_ACTIONOP_RSS);
4869869c399SSatheesh Paul 		plt_strlcpy(index_name, "RSS Group Index",
4879869c399SSatheesh Paul 			    NPC_MAX_FIELD_NAME_SIZE);
4889869c399SSatheesh Paul 		break;
4899869c399SSatheesh Paul 	case NIX_RX_ACTIONOP_PF_FUNC_DROP:
4909869c399SSatheesh Paul 		fprintf(file, "NIX_RX_ACTIONOP_PF_FUNC_DROP (%" PRIu64 ")\n",
4919869c399SSatheesh Paul 			(uint64_t)NIX_RX_ACTIONOP_PF_FUNC_DROP);
4929869c399SSatheesh Paul 		break;
4939869c399SSatheesh Paul 	case NIX_RX_ACTIONOP_MIRROR:
4949869c399SSatheesh Paul 		fprintf(file, "NIX_RX_ACTIONOP_MIRROR (%" PRIu64 ")\n",
4959869c399SSatheesh Paul 			(uint64_t)NIX_RX_ACTIONOP_MIRROR);
4969869c399SSatheesh Paul 		plt_strlcpy(index_name, "Multicast/mirror table index",
4979869c399SSatheesh Paul 			    NPC_MAX_FIELD_NAME_SIZE);
4989869c399SSatheesh Paul 		break;
499b1f677d4SSatheesh Paul 	case NIX_RX_ACTIONOP_DEFAULT:
500b1f677d4SSatheesh Paul 		fprintf(file, "NIX_RX_ACTIONOP_DEFAULT (%" PRIu64 ")\n",
501b1f677d4SSatheesh Paul 			(uint64_t)NIX_RX_ACTIONOP_DEFAULT);
502b1f677d4SSatheesh Paul 		break;
5039869c399SSatheesh Paul 	default:
5049869c399SSatheesh Paul 		plt_err("Unknown NIX_RX_ACTIONOP found");
5059869c399SSatheesh Paul 		return;
5069869c399SSatheesh Paul 	}
5079869c399SSatheesh Paul 
5089869c399SSatheesh Paul 	pf_func = ((npc_action & NPC_RX_ACTION_PFFUNC_MASK) >> 4) &
5099869c399SSatheesh Paul 		  GENMASK(15, 0);
5109869c399SSatheesh Paul 
5119869c399SSatheesh Paul 	fprintf(file, "\tPF_FUNC: %#04X\n", pf_func);
5129869c399SSatheesh Paul 
5139869c399SSatheesh Paul 	index = ((npc_action & NPC_RX_ACTION_INDEX_MASK) >> 20) &
5149869c399SSatheesh Paul 		GENMASK(19, 0);
5159869c399SSatheesh Paul 
5169869c399SSatheesh Paul 	fprintf(file, "\t%s:%#05X\n", index_name, index);
5179869c399SSatheesh Paul 
5189869c399SSatheesh Paul 	match_id = ((npc_action & NPC_RX_ACTION_MATCH_MASK) >> 40) &
5199869c399SSatheesh Paul 		   GENMASK(15, 0);
5209869c399SSatheesh Paul 
5219869c399SSatheesh Paul 	fprintf(file, "\tMatch Id:%#04X\n", match_id);
5229869c399SSatheesh Paul 
5239869c399SSatheesh Paul 	flowkey_alg = ((npc_action & NPC_RX_ACTION_FLOWKEY_MASK) >> 56) &
5249869c399SSatheesh Paul 		      GENMASK(4, 0);
5259869c399SSatheesh Paul 
5269869c399SSatheesh Paul 	fprintf(file, "\tFlow Key Alg:%#X\n", flowkey_alg);
5279869c399SSatheesh Paul }
5289869c399SSatheesh Paul 
5299869c399SSatheesh Paul static void
5309869c399SSatheesh Paul npc_flow_dump_parsed_action(FILE *file, uint64_t npc_action, bool is_rx)
5319869c399SSatheesh Paul {
5329869c399SSatheesh Paul 	if (is_rx) {
5339869c399SSatheesh Paul 		fprintf(file, "NPC RX Action:%#016lX\n", npc_action);
5349869c399SSatheesh Paul 		npc_flow_dump_rx_action(file, npc_action);
5359869c399SSatheesh Paul 	} else {
5369869c399SSatheesh Paul 		fprintf(file, "NPC TX Action:%#016lX\n", npc_action);
5379869c399SSatheesh Paul 		npc_flow_dump_tx_action(file, npc_action);
5389869c399SSatheesh Paul 	}
5399869c399SSatheesh Paul }
5409869c399SSatheesh Paul 
5419869c399SSatheesh Paul static void
5429869c399SSatheesh Paul npc_flow_dump_rx_vtag_action(FILE *file, uint64_t vtag_action)
5439869c399SSatheesh Paul {
5449869c399SSatheesh Paul 	uint32_t type, lid, relptr;
5459869c399SSatheesh Paul 
5469869c399SSatheesh Paul 	if (vtag_action & NIX_RX_VTAGACT_VTAG0_VALID_MASK) {
5479869c399SSatheesh Paul 		relptr = vtag_action & NIX_RX_VTAGACT_VTAG0_RELPTR_MASK;
5489869c399SSatheesh Paul 		lid = ((vtag_action & NIX_RX_VTAGACT_VTAG0_LID_MASK) >> 8) &
5499869c399SSatheesh Paul 		      GENMASK(2, 0);
5509869c399SSatheesh Paul 		type = ((vtag_action & NIX_RX_VTAGACT_VTAG0_TYPE_MASK) >> 12) &
5519869c399SSatheesh Paul 		       GENMASK(2, 0);
5529869c399SSatheesh Paul 
5539869c399SSatheesh Paul 		fprintf(file, "\tVTAG0:relptr:%#X\n", relptr);
5549869c399SSatheesh Paul 		fprintf(file, "\tlid:%#X\n", lid);
5559869c399SSatheesh Paul 		fprintf(file, "\ttype:%#X\n", type);
5569869c399SSatheesh Paul 	}
5579869c399SSatheesh Paul 
5589869c399SSatheesh Paul 	if (vtag_action & NIX_RX_VTAGACT_VTAG1_VALID_MASK) {
5599869c399SSatheesh Paul 		relptr = ((vtag_action & NIX_RX_VTAGACT_VTAG1_RELPTR_MASK) >>
5609869c399SSatheesh Paul 			  32) &
5619869c399SSatheesh Paul 			 GENMASK(7, 0);
5629869c399SSatheesh Paul 		lid = ((vtag_action & NIX_RX_VTAGACT_VTAG1_LID_MASK) >> 40) &
5639869c399SSatheesh Paul 		      GENMASK(2, 0);
5649869c399SSatheesh Paul 		type = ((vtag_action & NIX_RX_VTAGACT_VTAG1_TYPE_MASK) >> 44) &
5659869c399SSatheesh Paul 		       GENMASK(2, 0);
5669869c399SSatheesh Paul 
5679869c399SSatheesh Paul 		fprintf(file, "\tVTAG1:relptr:%#X\n", relptr);
5689869c399SSatheesh Paul 		fprintf(file, "\tlid:%#X\n", lid);
5699869c399SSatheesh Paul 		fprintf(file, "\ttype:%#X\n", type);
5709869c399SSatheesh Paul 	}
5719869c399SSatheesh Paul }
5729869c399SSatheesh Paul 
5739869c399SSatheesh Paul static void
5749869c399SSatheesh Paul npc_get_vtag_opname(uint32_t op, char *opname, int len)
5759869c399SSatheesh Paul {
5769869c399SSatheesh Paul 	switch (op) {
5779869c399SSatheesh Paul 	case 0x0:
5789869c399SSatheesh Paul 		plt_strlcpy(opname, "NOP", len - 1);
5799869c399SSatheesh Paul 		break;
5809869c399SSatheesh Paul 	case 0x1:
5819869c399SSatheesh Paul 		plt_strlcpy(opname, "INSERT", len - 1);
5829869c399SSatheesh Paul 		break;
5839869c399SSatheesh Paul 	case 0x2:
5849869c399SSatheesh Paul 		plt_strlcpy(opname, "REPLACE", len - 1);
5859869c399SSatheesh Paul 		break;
5869869c399SSatheesh Paul 	default:
5879869c399SSatheesh Paul 		plt_err("Unknown vtag op found");
5889869c399SSatheesh Paul 		break;
5899869c399SSatheesh Paul 	}
5909869c399SSatheesh Paul }
5919869c399SSatheesh Paul 
5929869c399SSatheesh Paul static void
5939869c399SSatheesh Paul npc_flow_dump_tx_vtag_action(FILE *file, uint64_t vtag_action)
5949869c399SSatheesh Paul {
5959869c399SSatheesh Paul 	uint32_t relptr, lid, op, vtag_def;
5969869c399SSatheesh Paul 	char opname[10];
5979869c399SSatheesh Paul 
5989869c399SSatheesh Paul 	relptr = vtag_action & NIX_TX_VTAGACT_VTAG0_RELPTR_MASK;
5999869c399SSatheesh Paul 	lid = ((vtag_action & NIX_TX_VTAGACT_VTAG0_LID_MASK) >> 8) &
6009869c399SSatheesh Paul 	      GENMASK(2, 0);
6019869c399SSatheesh Paul 	op = ((vtag_action & NIX_TX_VTAGACT_VTAG0_OP_MASK) >> 12) &
6029869c399SSatheesh Paul 	     GENMASK(1, 0);
6039869c399SSatheesh Paul 	vtag_def = ((vtag_action & NIX_TX_VTAGACT_VTAG0_DEF_MASK) >> 16) &
6049869c399SSatheesh Paul 		   GENMASK(9, 0);
6059869c399SSatheesh Paul 
6069869c399SSatheesh Paul 	npc_get_vtag_opname(op, opname, sizeof(opname));
6079869c399SSatheesh Paul 
6089869c399SSatheesh Paul 	fprintf(file, "\tVTAG0 relptr:%#X\n", relptr);
6099869c399SSatheesh Paul 	fprintf(file, "\tlid:%#X\n", lid);
6109869c399SSatheesh Paul 	fprintf(file, "\top:%s\n", opname);
6119869c399SSatheesh Paul 	fprintf(file, "\tvtag_def:%#X\n", vtag_def);
6129869c399SSatheesh Paul 
6139869c399SSatheesh Paul 	relptr = ((vtag_action & NIX_TX_VTAGACT_VTAG1_RELPTR_MASK) >> 32) &
6149869c399SSatheesh Paul 		 GENMASK(7, 0);
6159869c399SSatheesh Paul 	lid = ((vtag_action & NIX_TX_VTAGACT_VTAG1_LID_MASK) >> 40) &
6169869c399SSatheesh Paul 	      GENMASK(2, 0);
6179869c399SSatheesh Paul 	op = ((vtag_action & NIX_TX_VTAGACT_VTAG1_OP_MASK) >> 44) &
6189869c399SSatheesh Paul 	     GENMASK(1, 0);
6199869c399SSatheesh Paul 	vtag_def = ((vtag_action & NIX_TX_VTAGACT_VTAG1_DEF_MASK) >> 48) &
6209869c399SSatheesh Paul 		   GENMASK(9, 0);
6219869c399SSatheesh Paul 
6229869c399SSatheesh Paul 	npc_get_vtag_opname(op, opname, sizeof(opname));
6239869c399SSatheesh Paul 
6249869c399SSatheesh Paul 	fprintf(file, "\tVTAG1:relptr:%#X\n", relptr);
6259869c399SSatheesh Paul 	fprintf(file, "\tlid:%#X\n", lid);
6269869c399SSatheesh Paul 	fprintf(file, "\top:%s\n", opname);
6279869c399SSatheesh Paul 	fprintf(file, "\tvtag_def:%#X\n", vtag_def);
6289869c399SSatheesh Paul }
6299869c399SSatheesh Paul 
6309869c399SSatheesh Paul static void
6319869c399SSatheesh Paul npc_flow_dump_vtag_action(FILE *file, uint64_t vtag_action, bool is_rx)
6329869c399SSatheesh Paul {
6339869c399SSatheesh Paul 	if (is_rx) {
6349869c399SSatheesh Paul 		fprintf(file, "NPC RX VTAG Action:%#016lX\n", vtag_action);
6359869c399SSatheesh Paul 		npc_flow_dump_rx_vtag_action(file, vtag_action);
6369869c399SSatheesh Paul 	} else {
6379869c399SSatheesh Paul 		fprintf(file, "NPC TX VTAG Action:%#016lX\n", vtag_action);
6389869c399SSatheesh Paul 		npc_flow_dump_tx_vtag_action(file, vtag_action);
6399869c399SSatheesh Paul 	}
6409869c399SSatheesh Paul }
6419869c399SSatheesh Paul 
64244550b64SSatheesh Paul static void
64344550b64SSatheesh Paul npc_flow_hw_mcam_entry_dump(FILE *file, struct npc *npc, struct roc_npc_flow *flow)
6449869c399SSatheesh Paul {
64544550b64SSatheesh Paul 	uint64_t mcam_data[ROC_NPC_MAX_MCAM_WIDTH_DWORDS];
64644550b64SSatheesh Paul 	uint64_t mcam_mask[ROC_NPC_MAX_MCAM_WIDTH_DWORDS];
647d382a8d3SSatheesh Paul 	struct npc_mcam_read_entry_req *mcam_read_req;
648d382a8d3SSatheesh Paul 	struct npc_mcam_read_entry_rsp *mcam_read_rsp;
64944550b64SSatheesh Paul 	struct nix_inl_dev *inl_dev = NULL;
65044550b64SSatheesh Paul 	struct idev_cfg *idev;
65144550b64SSatheesh Paul 	struct mbox *mbox;
6526441b7a4SKiran Kumar K 	uint8_t enabled;
65344550b64SSatheesh Paul 	int rc = 0, i;
65444550b64SSatheesh Paul 
65544550b64SSatheesh Paul 	idev = idev_get_cfg();
65644550b64SSatheesh Paul 	if (idev)
65744550b64SSatheesh Paul 		inl_dev = idev->nix_inl_dev;
65844550b64SSatheesh Paul 
65944550b64SSatheesh Paul 	if (inl_dev && flow->use_pre_alloc)
66044550b64SSatheesh Paul 		mbox = inl_dev->dev.mbox;
66144550b64SSatheesh Paul 	else
66244550b64SSatheesh Paul 		mbox = npc->mbox;
66344550b64SSatheesh Paul 
66444550b64SSatheesh Paul 	mcam_read_req = mbox_alloc_msg_npc_mcam_read_entry(mbox_get(mbox));
66544550b64SSatheesh Paul 	if (mcam_read_req == NULL) {
66644550b64SSatheesh Paul 		plt_err("Failed to alloc msg");
66744550b64SSatheesh Paul 		mbox_put(mbox);
66844550b64SSatheesh Paul 		return;
66944550b64SSatheesh Paul 	}
67044550b64SSatheesh Paul 
67144550b64SSatheesh Paul 	mcam_read_req->entry = flow->mcam_id;
67244550b64SSatheesh Paul 	rc = mbox_process_msg(mbox, (void *)&mcam_read_rsp);
67344550b64SSatheesh Paul 	if (rc) {
67444550b64SSatheesh Paul 		mbox_put(mbox);
67544550b64SSatheesh Paul 		plt_err("Failed to fetch MCAM entry:%d", flow->mcam_id);
67644550b64SSatheesh Paul 		return;
67744550b64SSatheesh Paul 	}
67844550b64SSatheesh Paul 
67944550b64SSatheesh Paul 	mbox_memcpy(mcam_data, mcam_read_rsp->entry_data.kw, sizeof(mcam_data));
68044550b64SSatheesh Paul 	mbox_memcpy(mcam_mask, mcam_read_rsp->entry_data.kw_mask, sizeof(mcam_data));
6816441b7a4SKiran Kumar K 	enabled = mcam_read_rsp->enable;
68244550b64SSatheesh Paul 
68344550b64SSatheesh Paul 	fprintf(file, "HW MCAM Data :\n");
68444550b64SSatheesh Paul 
68544550b64SSatheesh Paul 	for (i = 0; i < ROC_NPC_MAX_MCAM_WIDTH_DWORDS; i++) {
68644550b64SSatheesh Paul 		fprintf(file, "\tDW%d     :%016lX\n", i, mcam_data[i]);
68744550b64SSatheesh Paul 		fprintf(file, "\tDW%d_Mask:%016lX\n", i, mcam_mask[i]);
68844550b64SSatheesh Paul 	}
6896441b7a4SKiran Kumar K 	fprintf(file, "\tEnabled = 0x%x\n", enabled);
69044550b64SSatheesh Paul 
69144550b64SSatheesh Paul 	fprintf(file, "\n");
69244550b64SSatheesh Paul 	mbox_put(mbox);
69344550b64SSatheesh Paul }
69444550b64SSatheesh Paul 
69544550b64SSatheesh Paul void
69644550b64SSatheesh Paul roc_npc_flow_mcam_dump(FILE *file, struct roc_npc *roc_npc, struct roc_npc_flow *flow)
69744550b64SSatheesh Paul {
69844550b64SSatheesh Paul 	struct npc *npc = roc_npc_to_npc_priv(roc_npc);
699ad2c7b20SSatheesh Paul 	uint64_t count = 0;
7009869c399SSatheesh Paul 	bool is_rx = 0;
701d382a8d3SSatheesh Paul 	int i, rc = 0;
7029869c399SSatheesh Paul 
7039869c399SSatheesh Paul 	fprintf(file, "MCAM Index:%d\n", flow->mcam_id);
704ad2c7b20SSatheesh Paul 	if (flow->ctr_id != NPC_COUNTER_NONE && flow->use_ctr) {
70544550b64SSatheesh Paul 		if (flow->use_pre_alloc)
70644550b64SSatheesh Paul 			rc = roc_npc_inl_mcam_read_counter(flow->ctr_id, &count);
70744550b64SSatheesh Paul 		else
708ad2c7b20SSatheesh Paul 			rc = roc_npc_mcam_read_counter(roc_npc, flow->ctr_id, &count);
70944550b64SSatheesh Paul 
710ad2c7b20SSatheesh Paul 		if (rc)
711ad2c7b20SSatheesh Paul 			return;
712ad2c7b20SSatheesh Paul 		fprintf(file, "Hit count: %" PRIu64 "\n", count);
713ad2c7b20SSatheesh Paul 	}
714ad2c7b20SSatheesh Paul 
715ad2c7b20SSatheesh Paul 	fprintf(file, "Interface :%s (%d)\n", intf_str[flow->nix_intf], flow->nix_intf);
7169869c399SSatheesh Paul 	fprintf(file, "Priority  :%d\n", flow->priority);
7179869c399SSatheesh Paul 
7189869c399SSatheesh Paul 	if (flow->nix_intf == NIX_INTF_RX)
7199869c399SSatheesh Paul 		is_rx = 1;
7209869c399SSatheesh Paul 
7219869c399SSatheesh Paul 	npc_flow_dump_parsed_action(file, flow->npc_action, is_rx);
7229869c399SSatheesh Paul 	npc_flow_dump_vtag_action(file, flow->vtag_action, is_rx);
7239869c399SSatheesh Paul 	fprintf(file, "Patterns:\n");
7249869c399SSatheesh Paul 	npc_flow_dump_patterns(file, npc, flow);
7259869c399SSatheesh Paul 
7269869c399SSatheesh Paul 	fprintf(file, "MCAM Raw Data :\n");
7279869c399SSatheesh Paul 
7289869c399SSatheesh Paul 	for (i = 0; i < ROC_NPC_MAX_MCAM_WIDTH_DWORDS; i++) {
7299869c399SSatheesh Paul 		fprintf(file, "\tDW%d     :%016lX\n", i, flow->mcam_data[i]);
7309869c399SSatheesh Paul 		fprintf(file, "\tDW%d_Mask:%016lX\n", i, flow->mcam_mask[i]);
7319869c399SSatheesh Paul 	}
7329869c399SSatheesh Paul 
73344550b64SSatheesh Paul 	npc_flow_hw_mcam_entry_dump(file, npc, flow);
7349869c399SSatheesh Paul }
735