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 = <_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