1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2014-2021 Broadcom 3 * All rights reserved. 4 */ 5 6 #ifndef _ULP_TEMPLATE_STRUCT_H_ 7 #define _ULP_TEMPLATE_STRUCT_H_ 8 9 #include <stdint.h> 10 #include "rte_ether.h" 11 #include "rte_icmp.h" 12 #include "rte_ip.h" 13 #include "rte_tcp.h" 14 #include "rte_udp.h" 15 #include "rte_esp.h" 16 #include "rte_sctp.h" 17 #include "rte_flow.h" 18 #include "tf_core.h" 19 20 /* Number of fields for each protocol */ 21 #define BNXT_ULP_PROTO_HDR_SVIF_NUM 2 22 #define BNXT_ULP_PROTO_HDR_ETH_NUM 3 23 #define BNXT_ULP_PROTO_HDR_S_VLAN_NUM 3 24 #define BNXT_ULP_PROTO_HDR_VLAN_NUM 6 25 #define BNXT_ULP_PROTO_HDR_IPV4_NUM 10 26 #define BNXT_ULP_PROTO_HDR_IPV6_NUM 8 27 #define BNXT_ULP_PROTO_HDR_UDP_NUM 4 28 #define BNXT_ULP_PROTO_HDR_TCP_NUM 9 29 #define BNXT_ULP_PROTO_HDR_VXLAN_NUM 4 30 #define BNXT_ULP_PROTO_HDR_GRE_NUM 6 31 #define BNXT_ULP_PROTO_HDR_ICMP_NUM 5 32 #define BNXT_ULP_PROTO_HDR_MAX 128 33 #define BNXT_ULP_PROTO_HDR_FIELD_SVIF_IDX 1 34 35 /* Direction attributes */ 36 #define BNXT_ULP_FLOW_ATTR_TRANSFER 0x1 37 #define BNXT_ULP_FLOW_ATTR_INGRESS 0x2 38 #define BNXT_ULP_FLOW_ATTR_EGRESS 0x4 39 40 struct ulp_rte_hdr_bitmap { 41 uint64_t bits; 42 }; 43 44 struct ulp_rte_field_bitmap { 45 uint64_t bits; 46 }; 47 48 /* Structure to store the protocol fields */ 49 #define RTE_PARSER_FLOW_HDR_FIELD_SIZE 16 50 struct ulp_rte_hdr_field { 51 uint8_t spec[RTE_PARSER_FLOW_HDR_FIELD_SIZE]; 52 uint8_t mask[RTE_PARSER_FLOW_HDR_FIELD_SIZE]; 53 uint32_t size; 54 }; 55 56 struct ulp_rte_act_bitmap { 57 uint64_t bits; 58 }; 59 60 /* Structure to hold the action property details. */ 61 struct ulp_rte_act_prop { 62 uint8_t act_details[BNXT_ULP_ACT_PROP_IDX_LAST]; 63 }; 64 65 /* Structure to be used for passing all the parser functions */ 66 struct ulp_rte_parser_params { 67 STAILQ_ENTRY(ulp_rte_parser_params) next; 68 struct ulp_rte_hdr_bitmap hdr_bitmap; 69 struct ulp_rte_hdr_bitmap hdr_fp_bit; 70 struct ulp_rte_field_bitmap fld_bitmap; 71 struct ulp_rte_field_bitmap fld_s_bitmap; 72 struct ulp_rte_hdr_field hdr_field[BNXT_ULP_PROTO_HDR_MAX]; 73 uint64_t comp_fld[BNXT_ULP_CF_IDX_LAST]; 74 uint32_t field_idx; 75 struct ulp_rte_act_bitmap act_bitmap; 76 struct ulp_rte_act_prop act_prop; 77 uint32_t dir_attr; 78 uint32_t priority; 79 uint32_t fid; 80 uint32_t parent_flow; 81 uint32_t parent_fid; 82 uint16_t func_id; 83 uint16_t port_id; 84 uint32_t class_id; 85 uint32_t act_tmpl; 86 struct bnxt_ulp_context *ulp_ctx; 87 uint32_t hdr_sig_id; 88 uint32_t flow_sig_id; 89 uint32_t flow_pattern_id; 90 uint32_t act_pattern_id; 91 uint8_t app_id; 92 }; 93 94 /* Flow Parser Header Information Structure */ 95 struct bnxt_ulp_rte_hdr_info { 96 enum bnxt_ulp_hdr_type hdr_type; 97 /* Flow Parser Protocol Header Function Prototype */ 98 int (*proto_hdr_func)(const struct rte_flow_item *item_list, 99 struct ulp_rte_parser_params *params); 100 }; 101 102 /* Flow Parser Header Information Structure Array defined in template source*/ 103 extern struct bnxt_ulp_rte_hdr_info ulp_hdr_info[]; 104 105 /* Flow Parser Action Information Structure */ 106 struct bnxt_ulp_rte_act_info { 107 enum bnxt_ulp_act_type act_type; 108 /* Flow Parser Protocol Action Function Prototype */ 109 int32_t (*proto_act_func) 110 (const struct rte_flow_action *action_item, 111 struct ulp_rte_parser_params *params); 112 }; 113 114 /* Flow Parser Action Information Structure Array defined in template source*/ 115 extern struct bnxt_ulp_rte_act_info ulp_act_info[]; 116 117 /* Flow Matcher structures */ 118 struct bnxt_ulp_header_match_info { 119 struct ulp_rte_hdr_bitmap hdr_bitmap; 120 uint32_t start_idx; 121 uint32_t num_entries; 122 uint32_t class_tmpl_id; 123 uint32_t act_vnic; 124 }; 125 126 struct ulp_rte_bitmap { 127 uint64_t bits; 128 }; 129 130 struct bnxt_ulp_class_match_info { 131 struct ulp_rte_bitmap hdr_sig; 132 struct ulp_rte_bitmap field_sig; 133 uint32_t class_hid; 134 uint32_t class_tid; 135 uint8_t act_vnic; 136 uint8_t wc_pri; 137 uint8_t app_sig; 138 uint32_t hdr_sig_id; 139 uint32_t flow_sig_id; 140 uint32_t flow_pattern_id; 141 }; 142 143 /* Flow Matcher templates Structure for class entries */ 144 extern uint16_t ulp_class_sig_tbl[]; 145 extern struct bnxt_ulp_class_match_info ulp_class_match_list[]; 146 147 /* Flow Matcher Action structures */ 148 struct bnxt_ulp_action_match_info { 149 struct ulp_rte_act_bitmap act_bitmap; 150 uint32_t act_tmpl_id; 151 }; 152 153 struct bnxt_ulp_act_match_info { 154 struct ulp_rte_bitmap act_sig; 155 uint32_t act_hid; 156 uint32_t act_tid; 157 uint32_t act_pattern_id; 158 uint8_t app_sig; 159 }; 160 161 /* Flow Matcher templates Structure for action entries */ 162 extern uint16_t ulp_act_sig_tbl[]; 163 extern struct bnxt_ulp_act_match_info ulp_act_match_list[]; 164 165 /* Device Specific Tables for mapper */ 166 struct bnxt_ulp_mapper_cond_info { 167 enum bnxt_ulp_cond_opc cond_opcode; 168 uint32_t cond_operand; 169 }; 170 171 struct bnxt_ulp_mapper_cond_list_info { 172 enum bnxt_ulp_cond_list_opc cond_list_opcode; 173 uint32_t cond_start_idx; 174 uint32_t cond_nums; 175 int32_t cond_true_goto; 176 int32_t cond_false_goto; 177 }; 178 179 struct bnxt_ulp_mapper_func_info { 180 enum bnxt_ulp_func_opc func_opc; 181 enum bnxt_ulp_func_src func_src1; 182 enum bnxt_ulp_func_src func_src2; 183 uint16_t func_opr1; 184 uint16_t func_opr2; 185 uint16_t func_dst_opr; 186 }; 187 188 struct bnxt_ulp_template_device_tbls { 189 struct bnxt_ulp_mapper_tmpl_info *tmpl_list; 190 uint32_t tmpl_list_size; 191 struct bnxt_ulp_mapper_tbl_info *tbl_list; 192 uint32_t tbl_list_size; 193 struct bnxt_ulp_mapper_key_info *key_info_list; 194 uint32_t key_info_list_size; 195 struct bnxt_ulp_mapper_field_info *result_field_list; 196 uint32_t result_field_list_size; 197 struct bnxt_ulp_mapper_ident_info *ident_list; 198 uint32_t ident_list_size; 199 struct bnxt_ulp_mapper_cond_info *cond_list; 200 uint32_t cond_list_size; 201 }; 202 203 /* Device specific parameters */ 204 struct bnxt_ulp_device_params { 205 uint8_t description[16]; 206 enum bnxt_ulp_byte_order byte_order; 207 uint8_t encap_byte_swap; 208 uint8_t num_phy_ports; 209 uint32_t mark_db_lfid_entries; 210 uint64_t mark_db_gfid_entries; 211 uint64_t int_flow_db_num_entries; 212 uint64_t ext_flow_db_num_entries; 213 uint32_t flow_count_db_entries; 214 uint32_t fdb_parent_flow_entries; 215 uint32_t num_resources_per_flow; 216 uint32_t ext_cntr_table_type; 217 uint64_t byte_count_mask; 218 uint64_t packet_count_mask; 219 uint32_t byte_count_shift; 220 uint32_t packet_count_shift; 221 uint32_t dynamic_pad_en; 222 uint16_t em_blk_size_bits; 223 uint16_t em_blk_align_bits; 224 uint16_t em_key_align_bytes; 225 uint16_t em_result_size_bits; 226 uint16_t wc_slice_width; 227 uint16_t wc_max_slices; 228 uint32_t wc_mode_list[4]; 229 uint32_t wc_mod_list_max_size; 230 uint32_t wc_ctl_size_bits; 231 const struct bnxt_ulp_template_device_tbls *dev_tbls; 232 }; 233 234 /* Flow Mapper */ 235 struct bnxt_ulp_mapper_tmpl_info { 236 uint32_t device_name; 237 uint32_t start_tbl_idx; 238 uint32_t num_tbls; 239 struct bnxt_ulp_mapper_cond_list_info reject_info; 240 }; 241 242 struct bnxt_ulp_mapper_tbl_info { 243 enum bnxt_ulp_resource_func resource_func; 244 uint32_t resource_type; /* TF_ enum type */ 245 enum bnxt_ulp_resource_sub_type resource_sub_type; 246 struct bnxt_ulp_mapper_cond_list_info execute_info; 247 struct bnxt_ulp_mapper_func_info func_info; 248 enum bnxt_ulp_cond_opc cond_opcode; 249 uint32_t cond_operand; 250 uint8_t direction; 251 enum bnxt_ulp_pri_opc pri_opcode; 252 uint32_t pri_operand; 253 enum bnxt_ulp_byte_order byte_order; 254 255 /* conflict resolution opcode */ 256 enum bnxt_ulp_accept_opc accept_opcode; 257 258 enum bnxt_ulp_critical_resource critical_resource; 259 260 /* Information for accessing the ulp_key_field_list */ 261 uint32_t key_start_idx; 262 uint16_t key_bit_size; 263 uint16_t key_num_fields; 264 /* Size of the blob that holds the key */ 265 uint16_t blob_key_bit_size; 266 267 /* Information for accessing the ulp_class_result_field_list */ 268 uint32_t result_start_idx; 269 uint16_t result_bit_size; 270 uint16_t result_num_fields; 271 uint16_t encap_num_fields; 272 273 /* Information for accessing the ulp_ident_list */ 274 uint32_t ident_start_idx; 275 uint16_t ident_nums; 276 277 enum bnxt_ulp_mark_db_opc mark_db_opcode; 278 279 /* Table opcode for table operations */ 280 uint32_t tbl_opcode; 281 uint32_t tbl_operand; 282 enum bnxt_ulp_generic_tbl_lkup_type gen_tbl_lkup_type; 283 284 /* FDB table opcode */ 285 enum bnxt_ulp_fdb_opc fdb_opcode; 286 uint32_t fdb_operand; 287 288 /* Shared session */ 289 enum bnxt_ulp_shared_session shared_session; 290 }; 291 292 struct bnxt_ulp_mapper_field_info { 293 uint8_t description[64]; 294 uint16_t field_bit_size; 295 enum bnxt_ulp_field_opc field_opc; 296 enum bnxt_ulp_field_src field_src1; 297 uint8_t field_opr1[16]; 298 enum bnxt_ulp_field_src field_src2; 299 uint8_t field_opr2[16]; 300 enum bnxt_ulp_field_src field_src3; 301 uint8_t field_opr3[16]; 302 }; 303 304 struct bnxt_ulp_mapper_key_info { 305 struct bnxt_ulp_mapper_field_info field_info_spec; 306 struct bnxt_ulp_mapper_field_info field_info_mask; 307 }; 308 309 struct bnxt_ulp_mapper_ident_info { 310 uint8_t description[64]; 311 uint32_t resource_func; 312 313 uint16_t ident_type; 314 uint16_t ident_bit_size; 315 uint16_t ident_bit_pos; 316 enum bnxt_ulp_rf_idx regfile_idx; 317 }; 318 319 struct bnxt_ulp_glb_resource_info { 320 uint8_t app_id; 321 enum bnxt_ulp_device_id device_id; 322 enum tf_dir direction; 323 enum bnxt_ulp_resource_func resource_func; 324 uint32_t resource_type; /* TF_ enum type */ 325 enum bnxt_ulp_glb_rf_idx glb_regfile_index; 326 }; 327 328 struct bnxt_ulp_resource_resv_info { 329 uint8_t app_id; 330 enum bnxt_ulp_device_id device_id; 331 enum tf_dir direction; 332 enum bnxt_ulp_resource_func resource_func; 333 uint32_t resource_type; /* TF_ enum type */ 334 uint32_t count; 335 }; 336 337 struct bnxt_ulp_app_capabilities_info { 338 uint8_t app_id; 339 enum bnxt_ulp_device_id device_id; 340 uint32_t flags; 341 }; 342 343 struct bnxt_ulp_cache_tbl_params { 344 uint16_t num_entries; 345 }; 346 347 struct bnxt_ulp_generic_tbl_params { 348 const char *name; 349 uint16_t result_num_entries; 350 uint16_t result_num_bytes; 351 enum bnxt_ulp_byte_order result_byte_order; 352 uint32_t hash_tbl_entries; 353 uint16_t num_buckets; 354 uint16_t key_num_bytes; 355 }; 356 357 struct bnxt_ulp_shared_act_info { 358 uint64_t act_bitmask; 359 }; 360 361 /* 362 * Flow Mapper Static Data Externs: 363 * Access to the below static data should be done through access functions and 364 * directly throughout the code. 365 */ 366 367 /* 368 * The ulp_device_params is indexed by the dev_id. 369 * This table maintains the device specific parameters. 370 */ 371 extern struct bnxt_ulp_device_params ulp_device_params[]; 372 373 /* 374 * The ulp_act_prop_map_table provides the mapping to index and size of action 375 * properties. 376 */ 377 extern uint32_t ulp_act_prop_map_table[]; 378 379 /* 380 * The ulp_glb_resource_tbl provides the list of global resources that need to 381 * be initialized and where to store them. 382 */ 383 extern struct bnxt_ulp_glb_resource_info ulp_glb_resource_tbl[]; 384 385 /* 386 * The ulp_app_glb_resource_tbl provides the list of shared resources required 387 * in the event that shared session is enabled. 388 */ 389 extern struct bnxt_ulp_glb_resource_info ulp_app_glb_resource_tbl[]; 390 391 /* 392 * The ulp_resource_resv_list provides the list of tf resources required when 393 * calling tf_open. 394 */ 395 extern struct bnxt_ulp_resource_resv_info ulp_resource_resv_list[]; 396 397 /* 398 * The ulp_app_resource_resv_list provides the list of tf resources required 399 * when calling tf_open. 400 */ 401 extern struct bnxt_ulp_resource_resv_info ulp_app_resource_resv_list[]; 402 403 /* 404 * The_app_cap_info_list provides the list of ULP capabilities per app/device. 405 */ 406 extern struct bnxt_ulp_app_capabilities_info ulp_app_cap_info_list[]; 407 408 /* 409 * The ulp_cache_tbl_parms table provides the sizes of the cache tables the 410 * mapper must dynamically allocate during initialization. 411 */ 412 extern struct bnxt_ulp_cache_tbl_params ulp_cache_tbl_params[]; 413 414 /* 415 * The ulp_generic_tbl_parms table provides the sizes of the generic tables the 416 * mapper must dynamically allocate during initialization. 417 */ 418 extern struct bnxt_ulp_generic_tbl_params ulp_generic_tbl_params[]; 419 /* 420 * The ulp_global template table is used to initialize default entries 421 * that could be reused by other templates. 422 */ 423 extern uint32_t ulp_glb_template_tbl[]; 424 425 #endif /* _ULP_TEMPLATE_STRUCT_H_ */ 426