1696843ccSMike Baucom /* SPDX-License-Identifier: BSD-3-Clause 26d160d77SRandy Schacher * Copyright(c) 2014-2023 Broadcom 3696843ccSMike Baucom * All rights reserved. 4696843ccSMike Baucom */ 5696843ccSMike Baucom 6696843ccSMike Baucom #ifndef _ULP_MAPPER_H_ 7696843ccSMike Baucom #define _ULP_MAPPER_H_ 8696843ccSMike Baucom 9dd0191d5SShuanglin Wang /* TBD: it is added Thor2 testing */ 10dd0191d5SShuanglin Wang /* #define ULP_MAPPER_TFC_TEST 1 */ 11dd0191d5SShuanglin Wang 12696843ccSMike Baucom #include <rte_log.h> 13696843ccSMike Baucom #include <rte_flow.h> 14696843ccSMike Baucom #include <rte_flow_driver.h> 15072cb4a8SMike Baucom #include "tf_core.h" 168ce17d56SKishore Padmanabha #include "ulp_template_db_enum.h" 17696843ccSMike Baucom #include "ulp_template_struct.h" 18696843ccSMike Baucom #include "bnxt_ulp.h" 19696843ccSMike Baucom #include "ulp_utils.h" 20f634204bSKishore Padmanabha #include "ulp_gen_tbl.h" 21dd0191d5SShuanglin Wang #include "tfc_em.h" 2261a7ca1fSKishore Padmanabha #include "bitalloc.h" 2383f916bdSKishore Padmanabha #include "ulp_alloc_tbl.h" 24696843ccSMike Baucom 254bc32a80SMike Baucom #define ULP_IDENTS_INVALID ((uint16_t)0xffff) 264bc32a80SMike Baucom 27bfcaae8fSKishore Padmanabha struct bnxt_ulp_mapper_glb_resource_entry { 28bfcaae8fSKishore Padmanabha enum bnxt_ulp_resource_func resource_func; 29bfcaae8fSKishore Padmanabha uint32_t resource_type; /* TF_ enum type */ 30bfcaae8fSKishore Padmanabha uint64_t resource_hndl; 31c6062ec0SMike Baucom bool shared; 32072cb4a8SMike Baucom }; 33072cb4a8SMike Baucom 34dd0191d5SShuanglin Wang #define BNXT_ULP_KEY_RECIPE_MAX_FLDS 128 35dd0191d5SShuanglin Wang struct bnxt_ulp_key_recipe_entry { 36dd0191d5SShuanglin Wang uint32_t cnt; 37dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_key_info flds[BNXT_ULP_KEY_RECIPE_MAX_FLDS]; 38dd0191d5SShuanglin Wang }; 39dd0191d5SShuanglin Wang 404a925aa7SKishore Padmanabha #define ULP_RECIPE_TYPE_MAX (BNXT_ULP_RESOURCE_SUB_TYPE_KEY_RECIPE_TABLE_WM + 1) 41dd0191d5SShuanglin Wang struct bnxt_ulp_key_recipe_info { 42dd0191d5SShuanglin Wang uint32_t num_recipes; 43dd0191d5SShuanglin Wang uint8_t max_fields; 444a925aa7SKishore Padmanabha struct bnxt_ulp_key_recipe_entry **recipes[BNXT_ULP_DIRECTION_LAST][ULP_RECIPE_TYPE_MAX]; 4561a7ca1fSKishore Padmanabha struct bitalloc *recipe_ba[BNXT_ULP_DIRECTION_LAST][ULP_RECIPE_TYPE_MAX]; 46dd0191d5SShuanglin Wang }; 47dd0191d5SShuanglin Wang 48dd0191d5SShuanglin Wang struct ulp_mapper_core_ops; 49dd0191d5SShuanglin Wang 50072cb4a8SMike Baucom struct bnxt_ulp_mapper_data { 51dd0191d5SShuanglin Wang const struct ulp_mapper_core_ops *mapper_oper; 52bfcaae8fSKishore Padmanabha struct bnxt_ulp_mapper_glb_resource_entry 53741172beSKishore Padmanabha glb_res_tbl[TF_DIR_MAX][BNXT_ULP_GLB_RF_IDX_LAST]; 54f634204bSKishore Padmanabha struct ulp_mapper_gen_tbl_list gen_tbl_list[BNXT_ULP_GEN_TBL_MAX_SZ]; 55dd0191d5SShuanglin Wang struct bnxt_ulp_key_recipe_info key_recipe_info; 5683f916bdSKishore Padmanabha struct ulp_allocator_tbl_entry alloc_tbl[BNXT_ULP_ALLOCATOR_TBL_MAX_SZ]; 57072cb4a8SMike Baucom }; 58072cb4a8SMike Baucom 59696843ccSMike Baucom /* Internal Structure for passing the arguments around */ 60696843ccSMike Baucom struct bnxt_ulp_mapper_parms { 610c9fe336SMike Baucom enum bnxt_ulp_template_type tmpl_type; 62696843ccSMike Baucom uint32_t dev_id; 63696843ccSMike Baucom uint32_t act_tid; 64696843ccSMike Baucom uint32_t class_tid; 65696843ccSMike Baucom struct ulp_rte_act_prop *act_prop; 66696843ccSMike Baucom struct ulp_rte_act_bitmap *act_bitmap; 674c4e86faSKishore Padmanabha struct ulp_rte_hdr_bitmap *hdr_bitmap; 68f63aa27dSKishore Padmanabha struct ulp_rte_hdr_bitmap *enc_hdr_bitmap; 69696843ccSMike Baucom struct ulp_rte_hdr_field *hdr_field; 70f63aa27dSKishore Padmanabha struct ulp_rte_hdr_field *enc_field; 71c5d06df4SMike Baucom struct ulp_rte_field_bitmap *fld_bitmap; 721993b267SShahaji Bhosle uint64_t *comp_fld; 73696843ccSMike Baucom struct ulp_regfile *regfile; 74696843ccSMike Baucom struct bnxt_ulp_context *ulp_ctx; 75dd0191d5SShuanglin Wang uint32_t flow_id; 76dd0191d5SShuanglin Wang uint16_t func_id; 776d160d77SRandy Schacher uint32_t rid; 780c9fe336SMike Baucom enum bnxt_ulp_fdb_type flow_type; 79072cb4a8SMike Baucom struct bnxt_ulp_mapper_data *mapper_data; 80494f03ffSKishore Padmanabha struct bnxt_ulp_device_params *device_params; 81bdf4a3c6SKishore Padmanabha uint32_t child_flow; 82be8acb27SKishore Padmanabha uint32_t parent_flow; 83675e31d8SVenkat Duvvuru uint8_t tun_idx; 849cbfa4cfSKishore Padmanabha uint32_t app_priority; 85642e5ab3SKishore Padmanabha uint64_t shared_hndl; 86255add67SKishore Padmanabha uint32_t flow_pattern_id; 87255add67SKishore Padmanabha uint32_t act_pattern_id; 885b73c859SKishore Padmanabha uint8_t app_id; 891993b267SShahaji Bhosle uint16_t port_id; 90dd0191d5SShuanglin Wang uint16_t fw_fid; 91dd0191d5SShuanglin Wang uint64_t cf_bitmap; 92dd0191d5SShuanglin Wang uint64_t wc_field_bitmap; 93dd0191d5SShuanglin Wang uint64_t exclude_field_bitmap; 94dd0191d5SShuanglin Wang struct tfc_mpc_batch_info_t batch_info; 95696843ccSMike Baucom }; 96696843ccSMike Baucom 97072cb4a8SMike Baucom /* Function to initialize any dynamic mapper data. */ 98dd0191d5SShuanglin Wang struct ulp_mapper_core_ops { 99072cb4a8SMike Baucom int32_t 100dd0191d5SShuanglin Wang (*ulp_mapper_core_tcam_tbl_process)(struct bnxt_ulp_mapper_parms *parms, 101dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *t); 1028f153057SMike Baucom int32_t 103dd0191d5SShuanglin Wang (*ulp_mapper_core_tcam_entry_free)(struct bnxt_ulp_context *ulp_ctx, 104dd0191d5SShuanglin Wang struct ulp_flow_db_res_params *res); 10505a11d7dSMike Baucom int32_t 106dd0191d5SShuanglin Wang (*ulp_mapper_core_em_tbl_process)(struct bnxt_ulp_mapper_parms *parms, 107dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *t, 108dd0191d5SShuanglin Wang void *error); 109dd0191d5SShuanglin Wang int32_t 110dd0191d5SShuanglin Wang (*ulp_mapper_core_em_entry_free)(struct bnxt_ulp_context *ulp, 111dd0191d5SShuanglin Wang struct ulp_flow_db_res_params *res, 112dd0191d5SShuanglin Wang void *error); 11305a11d7dSMike Baucom 114dd0191d5SShuanglin Wang int32_t 115dd0191d5SShuanglin Wang (*ulp_mapper_core_index_tbl_process)(struct bnxt_ulp_mapper_parms *parm, 116dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info 117dd0191d5SShuanglin Wang *t); 118dd0191d5SShuanglin Wang int32_t 119dd0191d5SShuanglin Wang (*ulp_mapper_core_index_entry_free)(struct bnxt_ulp_context *ulp, 120dd0191d5SShuanglin Wang struct ulp_flow_db_res_params *res); 121dd0191d5SShuanglin Wang int32_t 122dd0191d5SShuanglin Wang (*ulp_mapper_core_cmm_tbl_process)(struct bnxt_ulp_mapper_parms *parm, 123dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *t, 124dd0191d5SShuanglin Wang void *error); 125dd0191d5SShuanglin Wang int32_t 126dd0191d5SShuanglin Wang (*ulp_mapper_core_cmm_entry_free)(struct bnxt_ulp_context *ulp, 127dd0191d5SShuanglin Wang struct ulp_flow_db_res_params *res, 128dd0191d5SShuanglin Wang void *error); 129dd0191d5SShuanglin Wang int32_t 130dd0191d5SShuanglin Wang (*ulp_mapper_core_if_tbl_process)(struct bnxt_ulp_mapper_parms *parms, 131dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *t); 132dd0191d5SShuanglin Wang 133dd0191d5SShuanglin Wang int32_t 134dd0191d5SShuanglin Wang (*ulp_mapper_core_ident_alloc_process)(struct bnxt_ulp_context *ulp_ctx, 135dd0191d5SShuanglin Wang uint32_t session_type, 136dd0191d5SShuanglin Wang uint16_t ident_type, 137dd0191d5SShuanglin Wang uint8_t direction, 1382aa70990SKishore Padmanabha enum cfa_track_type tt, 139dd0191d5SShuanglin Wang uint64_t *identifier_id); 140dd0191d5SShuanglin Wang 141dd0191d5SShuanglin Wang int32_t 142dd0191d5SShuanglin Wang (*ulp_mapper_core_index_tbl_alloc_process)(struct bnxt_ulp_context *ulp, 143dd0191d5SShuanglin Wang uint32_t session_type, 144dd0191d5SShuanglin Wang uint16_t table_type, 145dd0191d5SShuanglin Wang uint8_t direction, 146dd0191d5SShuanglin Wang uint64_t *index); 147dd0191d5SShuanglin Wang int32_t 148dd0191d5SShuanglin Wang (*ulp_mapper_core_ident_free)(struct bnxt_ulp_context *ulp_ctx, 149dd0191d5SShuanglin Wang struct ulp_flow_db_res_params *res); 150dd0191d5SShuanglin Wang uint32_t 151dd0191d5SShuanglin Wang (*ulp_mapper_core_dyn_tbl_type_get)(struct bnxt_ulp_mapper_parms *parms, 152dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *t, 153dd0191d5SShuanglin Wang uint16_t blob_len, 154dd0191d5SShuanglin Wang uint16_t *out_len); 155dd0191d5SShuanglin Wang int32_t 156dd0191d5SShuanglin Wang (*ulp_mapper_core_app_glb_res_info_init)(struct bnxt_ulp_context *ulp_ctx, 157dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_data *mapper_data); 158dd0191d5SShuanglin Wang 159dd0191d5SShuanglin Wang int32_t 160dd0191d5SShuanglin Wang (*ulp_mapper_core_handle_to_offset)(struct bnxt_ulp_mapper_parms *parms, 161dd0191d5SShuanglin Wang uint64_t handle, 162dd0191d5SShuanglin Wang uint32_t offset, 163dd0191d5SShuanglin Wang uint64_t *result); 164dd0191d5SShuanglin Wang int 165dd0191d5SShuanglin Wang (*ulp_mapper_mpc_batch_start)(struct tfc_mpc_batch_info_t *batch_info); 166dd0191d5SShuanglin Wang 167dd0191d5SShuanglin Wang bool 168dd0191d5SShuanglin Wang (*ulp_mapper_mpc_batch_started)(struct tfc_mpc_batch_info_t *batch_info); 169dd0191d5SShuanglin Wang 170dd0191d5SShuanglin Wang int 171dd0191d5SShuanglin Wang (*ulp_mapper_mpc_batch_end)(struct tfc *tfcp, 172dd0191d5SShuanglin Wang struct tfc_mpc_batch_info_t *batch_info); 173dd0191d5SShuanglin Wang }; 174dd0191d5SShuanglin Wang 175dd0191d5SShuanglin Wang extern const struct ulp_mapper_core_ops ulp_mapper_tf_core_ops; 176dd0191d5SShuanglin Wang extern const struct ulp_mapper_core_ops ulp_mapper_tfc_core_ops; 177dd0191d5SShuanglin Wang 178dd0191d5SShuanglin Wang int32_t 179dd0191d5SShuanglin Wang ulp_mapper_glb_resource_read(struct bnxt_ulp_mapper_data *mapper_data, 180dd0191d5SShuanglin Wang enum tf_dir dir, 181dd0191d5SShuanglin Wang uint16_t idx, 182dd0191d5SShuanglin Wang uint64_t *regval, 183dd0191d5SShuanglin Wang bool *shared); 184dd0191d5SShuanglin Wang 185dd0191d5SShuanglin Wang int32_t 186dd0191d5SShuanglin Wang ulp_mapper_glb_resource_write(struct bnxt_ulp_mapper_data *data, 187dd0191d5SShuanglin Wang struct bnxt_ulp_glb_resource_info *res, 188dd0191d5SShuanglin Wang uint64_t regval, bool shared); 189dd0191d5SShuanglin Wang 190dd0191d5SShuanglin Wang int32_t 191dd0191d5SShuanglin Wang ulp_mapper_resource_ident_allocate(struct bnxt_ulp_context *ulp_ctx, 192dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_data *mapper_data, 193dd0191d5SShuanglin Wang struct bnxt_ulp_glb_resource_info *glb_res, 194dd0191d5SShuanglin Wang bool shared); 195dd0191d5SShuanglin Wang 196dd0191d5SShuanglin Wang int32_t 197dd0191d5SShuanglin Wang ulp_mapper_resource_index_tbl_alloc(struct bnxt_ulp_context *ulp_ctx, 198dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_data *mapper_data, 199dd0191d5SShuanglin Wang struct bnxt_ulp_glb_resource_info *glb_res, 200dd0191d5SShuanglin Wang bool shared); 201dd0191d5SShuanglin Wang 202dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_key_info * 203dd0191d5SShuanglin Wang ulp_mapper_key_fields_get(struct bnxt_ulp_mapper_parms *mparms, 204dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *tbl, 205dd0191d5SShuanglin Wang uint32_t *num_flds); 206dd0191d5SShuanglin Wang 207af50070eSKishore Padmanabha uint32_t 208af50070eSKishore Padmanabha ulp_mapper_partial_key_fields_get(struct bnxt_ulp_mapper_parms *mparms, 209af50070eSKishore Padmanabha struct bnxt_ulp_mapper_tbl_info *tbl); 210af50070eSKishore Padmanabha 211dd0191d5SShuanglin Wang int32_t 212dd0191d5SShuanglin Wang ulp_mapper_fdb_opc_process(struct bnxt_ulp_mapper_parms *parms, 213dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *tbl, 214dd0191d5SShuanglin Wang struct ulp_flow_db_res_params *fid_parms); 215dd0191d5SShuanglin Wang 216dd0191d5SShuanglin Wang int32_t 217dd0191d5SShuanglin Wang ulp_mapper_priority_opc_process(struct bnxt_ulp_mapper_parms *parms, 218dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *tbl, 219dd0191d5SShuanglin Wang uint32_t *priority); 220dd0191d5SShuanglin Wang 221dd0191d5SShuanglin Wang int32_t 222dd0191d5SShuanglin Wang ulp_mapper_tbl_ident_scan_ext(struct bnxt_ulp_mapper_parms *parms, 223dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *tbl, 224dd0191d5SShuanglin Wang uint8_t *byte_data, 225dd0191d5SShuanglin Wang uint32_t byte_data_size, 226dd0191d5SShuanglin Wang enum bnxt_ulp_byte_order byte_order); 227dd0191d5SShuanglin Wang 228dd0191d5SShuanglin Wang int32_t 229dd0191d5SShuanglin Wang ulp_mapper_field_opc_process(struct bnxt_ulp_mapper_parms *parms, 230dd0191d5SShuanglin Wang enum tf_dir dir, 231dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_field_info *fld, 232dd0191d5SShuanglin Wang struct ulp_blob *blob, 233dd0191d5SShuanglin Wang uint8_t is_key, 234dd0191d5SShuanglin Wang const char *name); 235dd0191d5SShuanglin Wang 236dd0191d5SShuanglin Wang int32_t 237dd0191d5SShuanglin Wang ulp_mapper_key_recipe_field_opc_process(struct bnxt_ulp_mapper_parms *parms, 238dd0191d5SShuanglin Wang uint8_t dir, 239dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_field_info *fld, 240dd0191d5SShuanglin Wang uint8_t is_key, 241dd0191d5SShuanglin Wang const char *name, 242dd0191d5SShuanglin Wang bool *written, 243dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_field_info *ofld); 244dd0191d5SShuanglin Wang 245dd0191d5SShuanglin Wang int32_t 246dd0191d5SShuanglin Wang ulp_mapper_tbl_result_build(struct bnxt_ulp_mapper_parms *parms, 247dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *tbl, 248dd0191d5SShuanglin Wang struct ulp_blob *data, 249dd0191d5SShuanglin Wang const char *name); 250dd0191d5SShuanglin Wang 251dd0191d5SShuanglin Wang int32_t 252dd0191d5SShuanglin Wang ulp_mapper_mark_gfid_process(struct bnxt_ulp_mapper_parms *parms, 253dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *tbl, 254dd0191d5SShuanglin Wang uint64_t flow_id); 255dd0191d5SShuanglin Wang 256dd0191d5SShuanglin Wang int32_t 257dd0191d5SShuanglin Wang ulp_mapper_mark_act_ptr_process(struct bnxt_ulp_mapper_parms *parms, 258dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *tbl); 259dd0191d5SShuanglin Wang 260dd0191d5SShuanglin Wang int32_t 261dd0191d5SShuanglin Wang ulp_mapper_mark_vfr_idx_process(struct bnxt_ulp_mapper_parms *parms, 262dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *tbl); 263dd0191d5SShuanglin Wang 264dd0191d5SShuanglin Wang int32_t 265dd0191d5SShuanglin Wang ulp_mapper_tcam_tbl_ident_alloc(struct bnxt_ulp_mapper_parms *parms, 266dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *tbl); 267dd0191d5SShuanglin Wang 268dd0191d5SShuanglin Wang uint32_t 269dd0191d5SShuanglin Wang ulp_mapper_wc_tcam_tbl_dyn_post_process(struct bnxt_ulp_device_params *dparms, 270dd0191d5SShuanglin Wang struct ulp_blob *key, 271dd0191d5SShuanglin Wang struct ulp_blob *mask, 272dd0191d5SShuanglin Wang struct ulp_blob *tkey, 273dd0191d5SShuanglin Wang struct ulp_blob *tmask); 274dd0191d5SShuanglin Wang 275dd0191d5SShuanglin Wang void ulp_mapper_wc_tcam_tbl_post_process(struct ulp_blob *blob); 276dd0191d5SShuanglin Wang 27705a11d7dSMike Baucom int32_t 27805a11d7dSMike Baucom ulp_mapper_resources_free(struct bnxt_ulp_context *ulp_ctx, 27930683082SKishore Padmanabha enum bnxt_ulp_fdb_type flow_type, 280dd0191d5SShuanglin Wang uint32_t fid, 281dd0191d5SShuanglin Wang void *error); 28205a11d7dSMike Baucom 2833fe124d2SKishore Padmanabha int32_t 284dd0191d5SShuanglin Wang ulp_mapper_flow_destroy(struct bnxt_ulp_context *ulp_ctx, 285dd0191d5SShuanglin Wang enum bnxt_ulp_fdb_type flow_type, 286dd0191d5SShuanglin Wang uint32_t fid, 287dd0191d5SShuanglin Wang void *error); 288dd0191d5SShuanglin Wang 289dd0191d5SShuanglin Wang int32_t 290dd0191d5SShuanglin Wang ulp_mapper_flow_create(struct bnxt_ulp_context *ulp_ctx, 291dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_parms *parms, 292dd0191d5SShuanglin Wang void *error); 293dd0191d5SShuanglin Wang 294dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_key_info * 295dd0191d5SShuanglin Wang ulp_mapper_key_recipe_fields_get(struct bnxt_ulp_mapper_parms *parms, 296dd0191d5SShuanglin Wang struct bnxt_ulp_mapper_tbl_info *tbl, 297dd0191d5SShuanglin Wang uint32_t *num_flds); 298dd0191d5SShuanglin Wang 299dd0191d5SShuanglin Wang int32_t 300dd0191d5SShuanglin Wang ulp_mapper_init(struct bnxt_ulp_context *ulp_ctx); 301dd0191d5SShuanglin Wang 302dd0191d5SShuanglin Wang void 303dd0191d5SShuanglin Wang ulp_mapper_deinit(struct bnxt_ulp_context *ulp_ctx); 304dd0191d5SShuanglin Wang 305*ffbc3529SShuanglin Wang #ifdef TF_FLOW_SCALE_QUERY 306*ffbc3529SShuanglin Wang int32_t 307*ffbc3529SShuanglin Wang ulp_resc_usage_sync(struct bnxt_ulp_context *ulp_ctx); 308*ffbc3529SShuanglin Wang #endif /* TF_FLOW_SCALE_QUERY */ 309*ffbc3529SShuanglin Wang 310696843ccSMike Baucom #endif /* _ULP_MAPPER_H_ */ 311