1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2*2d9fd380Sjfb8856606 * Copyright(c) 2014-2019 Broadcom 3*2d9fd380Sjfb8856606 * All rights reserved. 4*2d9fd380Sjfb8856606 */ 5*2d9fd380Sjfb8856606 6*2d9fd380Sjfb8856606 #ifndef _ULP_TEMPLATE_STRUCT_H_ 7*2d9fd380Sjfb8856606 #define _ULP_TEMPLATE_STRUCT_H_ 8*2d9fd380Sjfb8856606 9*2d9fd380Sjfb8856606 #include <stdint.h> 10*2d9fd380Sjfb8856606 #include "rte_ether.h" 11*2d9fd380Sjfb8856606 #include "rte_icmp.h" 12*2d9fd380Sjfb8856606 #include "rte_ip.h" 13*2d9fd380Sjfb8856606 #include "rte_tcp.h" 14*2d9fd380Sjfb8856606 #include "rte_udp.h" 15*2d9fd380Sjfb8856606 #include "rte_esp.h" 16*2d9fd380Sjfb8856606 #include "rte_sctp.h" 17*2d9fd380Sjfb8856606 #include "rte_flow.h" 18*2d9fd380Sjfb8856606 #include "tf_core.h" 19*2d9fd380Sjfb8856606 20*2d9fd380Sjfb8856606 /* Number of fields for each protocol */ 21*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_SVIF_NUM 1 22*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_ETH_NUM 3 23*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_S_VLAN_NUM 3 24*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_VLAN_NUM 6 25*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_IPV4_NUM 10 26*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_IPV6_NUM 8 27*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_UDP_NUM 4 28*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_TCP_NUM 9 29*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_VXLAN_NUM 4 30*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_MAX 128 31*2d9fd380Sjfb8856606 #define BNXT_ULP_PROTO_HDR_FIELD_SVIF_IDX 0 32*2d9fd380Sjfb8856606 33*2d9fd380Sjfb8856606 /* Direction attributes */ 34*2d9fd380Sjfb8856606 #define BNXT_ULP_FLOW_ATTR_TRANSFER 0x1 35*2d9fd380Sjfb8856606 #define BNXT_ULP_FLOW_ATTR_INGRESS 0x2 36*2d9fd380Sjfb8856606 #define BNXT_ULP_FLOW_ATTR_EGRESS 0x4 37*2d9fd380Sjfb8856606 38*2d9fd380Sjfb8856606 struct ulp_rte_hdr_bitmap { 39*2d9fd380Sjfb8856606 uint64_t bits; 40*2d9fd380Sjfb8856606 }; 41*2d9fd380Sjfb8856606 42*2d9fd380Sjfb8856606 struct ulp_rte_field_bitmap { 43*2d9fd380Sjfb8856606 uint64_t bits; 44*2d9fd380Sjfb8856606 }; 45*2d9fd380Sjfb8856606 46*2d9fd380Sjfb8856606 /* Structure to store the protocol fields */ 47*2d9fd380Sjfb8856606 #define RTE_PARSER_FLOW_HDR_FIELD_SIZE 16 48*2d9fd380Sjfb8856606 struct ulp_rte_hdr_field { 49*2d9fd380Sjfb8856606 uint8_t spec[RTE_PARSER_FLOW_HDR_FIELD_SIZE]; 50*2d9fd380Sjfb8856606 uint8_t mask[RTE_PARSER_FLOW_HDR_FIELD_SIZE]; 51*2d9fd380Sjfb8856606 uint32_t size; 52*2d9fd380Sjfb8856606 }; 53*2d9fd380Sjfb8856606 54*2d9fd380Sjfb8856606 struct ulp_rte_act_bitmap { 55*2d9fd380Sjfb8856606 uint64_t bits; 56*2d9fd380Sjfb8856606 }; 57*2d9fd380Sjfb8856606 58*2d9fd380Sjfb8856606 /* Structure to hold the action property details. */ 59*2d9fd380Sjfb8856606 struct ulp_rte_act_prop { 60*2d9fd380Sjfb8856606 uint8_t act_details[BNXT_ULP_ACT_PROP_IDX_LAST]; 61*2d9fd380Sjfb8856606 }; 62*2d9fd380Sjfb8856606 63*2d9fd380Sjfb8856606 /* Structure to be used for passing all the parser functions */ 64*2d9fd380Sjfb8856606 struct ulp_rte_parser_params { 65*2d9fd380Sjfb8856606 struct ulp_rte_hdr_bitmap hdr_bitmap; 66*2d9fd380Sjfb8856606 struct ulp_rte_hdr_bitmap hdr_fp_bit; 67*2d9fd380Sjfb8856606 struct ulp_rte_field_bitmap fld_bitmap; 68*2d9fd380Sjfb8856606 struct ulp_rte_hdr_field hdr_field[BNXT_ULP_PROTO_HDR_MAX]; 69*2d9fd380Sjfb8856606 uint32_t comp_fld[BNXT_ULP_CF_IDX_LAST]; 70*2d9fd380Sjfb8856606 uint32_t field_idx; 71*2d9fd380Sjfb8856606 uint32_t vlan_idx; 72*2d9fd380Sjfb8856606 struct ulp_rte_act_bitmap act_bitmap; 73*2d9fd380Sjfb8856606 struct ulp_rte_act_prop act_prop; 74*2d9fd380Sjfb8856606 uint32_t dir_attr; 75*2d9fd380Sjfb8856606 uint32_t priority; 76*2d9fd380Sjfb8856606 uint32_t fid; 77*2d9fd380Sjfb8856606 uint32_t parent_flow; 78*2d9fd380Sjfb8856606 uint32_t parent_fid; 79*2d9fd380Sjfb8856606 uint16_t func_id; 80*2d9fd380Sjfb8856606 uint16_t port_id; 81*2d9fd380Sjfb8856606 uint32_t class_id; 82*2d9fd380Sjfb8856606 uint32_t act_tmpl; 83*2d9fd380Sjfb8856606 struct bnxt_ulp_context *ulp_ctx; 84*2d9fd380Sjfb8856606 }; 85*2d9fd380Sjfb8856606 86*2d9fd380Sjfb8856606 /* Flow Parser Header Information Structure */ 87*2d9fd380Sjfb8856606 struct bnxt_ulp_rte_hdr_info { 88*2d9fd380Sjfb8856606 enum bnxt_ulp_hdr_type hdr_type; 89*2d9fd380Sjfb8856606 /* Flow Parser Protocol Header Function Prototype */ 90*2d9fd380Sjfb8856606 int (*proto_hdr_func)(const struct rte_flow_item *item_list, 91*2d9fd380Sjfb8856606 struct ulp_rte_parser_params *params); 92*2d9fd380Sjfb8856606 }; 93*2d9fd380Sjfb8856606 94*2d9fd380Sjfb8856606 /* Flow Parser Header Information Structure Array defined in template source*/ 95*2d9fd380Sjfb8856606 extern struct bnxt_ulp_rte_hdr_info ulp_hdr_info[]; 96*2d9fd380Sjfb8856606 97*2d9fd380Sjfb8856606 /* Flow Parser Action Information Structure */ 98*2d9fd380Sjfb8856606 struct bnxt_ulp_rte_act_info { 99*2d9fd380Sjfb8856606 enum bnxt_ulp_act_type act_type; 100*2d9fd380Sjfb8856606 /* Flow Parser Protocol Action Function Prototype */ 101*2d9fd380Sjfb8856606 int32_t (*proto_act_func) 102*2d9fd380Sjfb8856606 (const struct rte_flow_action *action_item, 103*2d9fd380Sjfb8856606 struct ulp_rte_parser_params *params); 104*2d9fd380Sjfb8856606 }; 105*2d9fd380Sjfb8856606 106*2d9fd380Sjfb8856606 /* Flow Parser Action Information Structure Array defined in template source*/ 107*2d9fd380Sjfb8856606 extern struct bnxt_ulp_rte_act_info ulp_act_info[]; 108*2d9fd380Sjfb8856606 109*2d9fd380Sjfb8856606 /* Flow Matcher structures */ 110*2d9fd380Sjfb8856606 struct bnxt_ulp_header_match_info { 111*2d9fd380Sjfb8856606 struct ulp_rte_hdr_bitmap hdr_bitmap; 112*2d9fd380Sjfb8856606 uint32_t start_idx; 113*2d9fd380Sjfb8856606 uint32_t num_entries; 114*2d9fd380Sjfb8856606 uint32_t class_tmpl_id; 115*2d9fd380Sjfb8856606 uint32_t act_vnic; 116*2d9fd380Sjfb8856606 }; 117*2d9fd380Sjfb8856606 118*2d9fd380Sjfb8856606 struct ulp_rte_bitmap { 119*2d9fd380Sjfb8856606 uint64_t bits; 120*2d9fd380Sjfb8856606 }; 121*2d9fd380Sjfb8856606 122*2d9fd380Sjfb8856606 struct bnxt_ulp_class_match_info { 123*2d9fd380Sjfb8856606 struct ulp_rte_bitmap hdr_sig; 124*2d9fd380Sjfb8856606 struct ulp_rte_bitmap field_sig; 125*2d9fd380Sjfb8856606 uint32_t class_hid; 126*2d9fd380Sjfb8856606 uint32_t class_tid; 127*2d9fd380Sjfb8856606 uint8_t act_vnic; 128*2d9fd380Sjfb8856606 uint8_t wc_pri; 129*2d9fd380Sjfb8856606 }; 130*2d9fd380Sjfb8856606 131*2d9fd380Sjfb8856606 /* Flow Matcher templates Structure for class entries */ 132*2d9fd380Sjfb8856606 extern uint16_t ulp_class_sig_tbl[]; 133*2d9fd380Sjfb8856606 extern struct bnxt_ulp_class_match_info ulp_class_match_list[]; 134*2d9fd380Sjfb8856606 135*2d9fd380Sjfb8856606 /* Flow Matcher Action structures */ 136*2d9fd380Sjfb8856606 struct bnxt_ulp_action_match_info { 137*2d9fd380Sjfb8856606 struct ulp_rte_act_bitmap act_bitmap; 138*2d9fd380Sjfb8856606 uint32_t act_tmpl_id; 139*2d9fd380Sjfb8856606 }; 140*2d9fd380Sjfb8856606 141*2d9fd380Sjfb8856606 struct bnxt_ulp_act_match_info { 142*2d9fd380Sjfb8856606 struct ulp_rte_bitmap act_sig; 143*2d9fd380Sjfb8856606 uint32_t act_hid; 144*2d9fd380Sjfb8856606 uint32_t act_tid; 145*2d9fd380Sjfb8856606 }; 146*2d9fd380Sjfb8856606 147*2d9fd380Sjfb8856606 /* Flow Matcher templates Structure for action entries */ 148*2d9fd380Sjfb8856606 extern uint16_t ulp_act_sig_tbl[]; 149*2d9fd380Sjfb8856606 extern struct bnxt_ulp_act_match_info ulp_act_match_list[]; 150*2d9fd380Sjfb8856606 151*2d9fd380Sjfb8856606 /* Device Specific Tables for mapper */ 152*2d9fd380Sjfb8856606 struct ulp_template_device_tbls { 153*2d9fd380Sjfb8856606 struct bnxt_ulp_mapper_tbl_list_info *tmpl_list; 154*2d9fd380Sjfb8856606 struct bnxt_ulp_mapper_tbl_info *tbl_list; 155*2d9fd380Sjfb8856606 struct bnxt_ulp_mapper_key_field_info *key_field_list; 156*2d9fd380Sjfb8856606 struct bnxt_ulp_mapper_result_field_info *result_field_list; 157*2d9fd380Sjfb8856606 struct bnxt_ulp_mapper_ident_info *ident_list; 158*2d9fd380Sjfb8856606 }; 159*2d9fd380Sjfb8856606 160*2d9fd380Sjfb8856606 /* Device specific parameters */ 161*2d9fd380Sjfb8856606 struct bnxt_ulp_device_params { 162*2d9fd380Sjfb8856606 uint8_t description[16]; 163*2d9fd380Sjfb8856606 enum bnxt_ulp_byte_order byte_order; 164*2d9fd380Sjfb8856606 uint8_t encap_byte_swap; 165*2d9fd380Sjfb8856606 uint8_t num_phy_ports; 166*2d9fd380Sjfb8856606 uint32_t mark_db_lfid_entries; 167*2d9fd380Sjfb8856606 uint64_t mark_db_gfid_entries; 168*2d9fd380Sjfb8856606 uint64_t int_flow_db_num_entries; 169*2d9fd380Sjfb8856606 uint64_t ext_flow_db_num_entries; 170*2d9fd380Sjfb8856606 uint32_t flow_count_db_entries; 171*2d9fd380Sjfb8856606 uint32_t fdb_parent_flow_entries; 172*2d9fd380Sjfb8856606 uint32_t num_resources_per_flow; 173*2d9fd380Sjfb8856606 uint32_t ext_cntr_table_type; 174*2d9fd380Sjfb8856606 uint64_t byte_count_mask; 175*2d9fd380Sjfb8856606 uint64_t packet_count_mask; 176*2d9fd380Sjfb8856606 uint32_t byte_count_shift; 177*2d9fd380Sjfb8856606 uint32_t packet_count_shift; 178*2d9fd380Sjfb8856606 const struct ulp_template_device_tbls *dev_tbls; 179*2d9fd380Sjfb8856606 }; 180*2d9fd380Sjfb8856606 181*2d9fd380Sjfb8856606 /* Flow Mapper */ 182*2d9fd380Sjfb8856606 struct bnxt_ulp_mapper_tbl_list_info { 183*2d9fd380Sjfb8856606 uint32_t device_name; 184*2d9fd380Sjfb8856606 uint32_t start_tbl_idx; 185*2d9fd380Sjfb8856606 uint32_t num_tbls; 186*2d9fd380Sjfb8856606 }; 187*2d9fd380Sjfb8856606 188*2d9fd380Sjfb8856606 struct bnxt_ulp_mapper_tbl_info { 189*2d9fd380Sjfb8856606 enum bnxt_ulp_resource_func resource_func; 190*2d9fd380Sjfb8856606 uint32_t resource_type; /* TF_ enum type */ 191*2d9fd380Sjfb8856606 enum bnxt_ulp_resource_sub_type resource_sub_type; 192*2d9fd380Sjfb8856606 enum bnxt_ulp_cond_opcode cond_opcode; 193*2d9fd380Sjfb8856606 uint32_t cond_operand; 194*2d9fd380Sjfb8856606 enum bnxt_ulp_mem_type_opcode mem_type_opcode; 195*2d9fd380Sjfb8856606 uint8_t direction; 196*2d9fd380Sjfb8856606 uint32_t priority; 197*2d9fd380Sjfb8856606 enum bnxt_ulp_search_before_alloc srch_b4_alloc; 198*2d9fd380Sjfb8856606 enum bnxt_ulp_critical_resource critical_resource; 199*2d9fd380Sjfb8856606 200*2d9fd380Sjfb8856606 /* Information for accessing the ulp_key_field_list */ 201*2d9fd380Sjfb8856606 uint32_t key_start_idx; 202*2d9fd380Sjfb8856606 uint16_t key_bit_size; 203*2d9fd380Sjfb8856606 uint16_t key_num_fields; 204*2d9fd380Sjfb8856606 /* Size of the blob that holds the key */ 205*2d9fd380Sjfb8856606 uint16_t blob_key_bit_size; 206*2d9fd380Sjfb8856606 207*2d9fd380Sjfb8856606 /* Information for accessing the ulp_class_result_field_list */ 208*2d9fd380Sjfb8856606 uint32_t result_start_idx; 209*2d9fd380Sjfb8856606 uint16_t result_bit_size; 210*2d9fd380Sjfb8856606 uint16_t result_num_fields; 211*2d9fd380Sjfb8856606 uint16_t encap_num_fields; 212*2d9fd380Sjfb8856606 213*2d9fd380Sjfb8856606 /* Information for accessing the ulp_ident_list */ 214*2d9fd380Sjfb8856606 uint32_t ident_start_idx; 215*2d9fd380Sjfb8856606 uint16_t ident_nums; 216*2d9fd380Sjfb8856606 217*2d9fd380Sjfb8856606 enum bnxt_ulp_mark_db_opcode mark_db_opcode; 218*2d9fd380Sjfb8856606 enum bnxt_ulp_index_opcode index_opcode; 219*2d9fd380Sjfb8856606 uint32_t index_operand; 220*2d9fd380Sjfb8856606 }; 221*2d9fd380Sjfb8856606 222*2d9fd380Sjfb8856606 struct bnxt_ulp_mapper_key_field_info { 223*2d9fd380Sjfb8856606 uint8_t description[64]; 224*2d9fd380Sjfb8856606 enum bnxt_ulp_mapper_opc mask_opcode; 225*2d9fd380Sjfb8856606 enum bnxt_ulp_mapper_opc spec_opcode; 226*2d9fd380Sjfb8856606 uint16_t field_bit_size; 227*2d9fd380Sjfb8856606 uint8_t mask_operand[16]; 228*2d9fd380Sjfb8856606 uint8_t spec_operand[16]; 229*2d9fd380Sjfb8856606 }; 230*2d9fd380Sjfb8856606 231*2d9fd380Sjfb8856606 struct bnxt_ulp_mapper_result_field_info { 232*2d9fd380Sjfb8856606 uint8_t description[64]; 233*2d9fd380Sjfb8856606 enum bnxt_ulp_mapper_opc result_opcode; 234*2d9fd380Sjfb8856606 uint16_t field_bit_size; 235*2d9fd380Sjfb8856606 uint8_t result_operand[16]; 236*2d9fd380Sjfb8856606 uint8_t result_operand_true[16]; 237*2d9fd380Sjfb8856606 uint8_t result_operand_false[16]; 238*2d9fd380Sjfb8856606 }; 239*2d9fd380Sjfb8856606 240*2d9fd380Sjfb8856606 struct bnxt_ulp_mapper_ident_info { 241*2d9fd380Sjfb8856606 uint8_t description[64]; 242*2d9fd380Sjfb8856606 uint32_t resource_func; 243*2d9fd380Sjfb8856606 244*2d9fd380Sjfb8856606 uint16_t ident_type; 245*2d9fd380Sjfb8856606 uint16_t ident_bit_size; 246*2d9fd380Sjfb8856606 uint16_t ident_bit_pos; 247*2d9fd380Sjfb8856606 enum bnxt_ulp_regfile_index regfile_idx; 248*2d9fd380Sjfb8856606 }; 249*2d9fd380Sjfb8856606 250*2d9fd380Sjfb8856606 struct bnxt_ulp_glb_resource_info { 251*2d9fd380Sjfb8856606 enum bnxt_ulp_resource_func resource_func; 252*2d9fd380Sjfb8856606 uint32_t resource_type; /* TF_ enum type */ 253*2d9fd380Sjfb8856606 enum bnxt_ulp_glb_regfile_index glb_regfile_index; 254*2d9fd380Sjfb8856606 enum tf_dir direction; 255*2d9fd380Sjfb8856606 }; 256*2d9fd380Sjfb8856606 257*2d9fd380Sjfb8856606 struct bnxt_ulp_cache_tbl_params { 258*2d9fd380Sjfb8856606 uint16_t num_entries; 259*2d9fd380Sjfb8856606 }; 260*2d9fd380Sjfb8856606 261*2d9fd380Sjfb8856606 /* 262*2d9fd380Sjfb8856606 * Flow Mapper Static Data Externs: 263*2d9fd380Sjfb8856606 * Access to the below static data should be done through access functions and 264*2d9fd380Sjfb8856606 * directly throughout the code. 265*2d9fd380Sjfb8856606 */ 266*2d9fd380Sjfb8856606 267*2d9fd380Sjfb8856606 /* 268*2d9fd380Sjfb8856606 * The ulp_device_params is indexed by the dev_id. 269*2d9fd380Sjfb8856606 * This table maintains the device specific parameters. 270*2d9fd380Sjfb8856606 */ 271*2d9fd380Sjfb8856606 extern struct bnxt_ulp_device_params ulp_device_params[]; 272*2d9fd380Sjfb8856606 273*2d9fd380Sjfb8856606 /* 274*2d9fd380Sjfb8856606 * The ulp_act_prop_map_table provides the mapping to index and size of action 275*2d9fd380Sjfb8856606 * properties. 276*2d9fd380Sjfb8856606 */ 277*2d9fd380Sjfb8856606 extern uint32_t ulp_act_prop_map_table[]; 278*2d9fd380Sjfb8856606 279*2d9fd380Sjfb8856606 /* 280*2d9fd380Sjfb8856606 * The ulp_glb_resource_tbl provides the list of global resources that need to 281*2d9fd380Sjfb8856606 * be initialized and where to store them. 282*2d9fd380Sjfb8856606 */ 283*2d9fd380Sjfb8856606 extern struct bnxt_ulp_glb_resource_info ulp_glb_resource_tbl[]; 284*2d9fd380Sjfb8856606 285*2d9fd380Sjfb8856606 /* 286*2d9fd380Sjfb8856606 * The ulp_cache_tbl_parms table provides the sizes of the cache tables the 287*2d9fd380Sjfb8856606 * mapper must dynamically allocate during initialization. 288*2d9fd380Sjfb8856606 */ 289*2d9fd380Sjfb8856606 extern struct bnxt_ulp_cache_tbl_params ulp_cache_tbl_params[]; 290*2d9fd380Sjfb8856606 291*2d9fd380Sjfb8856606 /* 292*2d9fd380Sjfb8856606 * The ulp_global template table is used to initialize default entries 293*2d9fd380Sjfb8856606 * that could be reused by other templates. 294*2d9fd380Sjfb8856606 */ 295*2d9fd380Sjfb8856606 extern uint32_t ulp_glb_template_tbl[]; 296*2d9fd380Sjfb8856606 297*2d9fd380Sjfb8856606 #endif /* _ULP_TEMPLATE_STRUCT_H_ */ 298