1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2019-2021 Broadcom 3 * All rights reserved. 4 */ 5 6 #ifndef _BNXT_ULP_H_ 7 #define _BNXT_ULP_H_ 8 9 #include <inttypes.h> 10 #include <stdbool.h> 11 #include <sys/queue.h> 12 13 #include "rte_version.h" 14 #include "rte_ethdev.h" 15 16 #include "ulp_template_db_enum.h" 17 #include "ulp_tun.h" 18 #include "bnxt_tf_common.h" 19 20 /* NAT defines to reuse existing inner L2 SMAC and DMAC */ 21 #define BNXT_ULP_NAT_INNER_L2_HEADER_SMAC 0x2000 22 #define BNXT_ULP_NAT_OUTER_MOST_L2_HDR_SMAC 0x6000 23 #define BNXT_ULP_NAT_OUTER_MOST_L2_VLAN_TAGS 0xc00 24 #define BNXT_ULP_NAT_INNER_L2_HEADER_DMAC 0x100 25 #define BNXT_ULP_NAT_OUTER_MOST_L2_HDR_DMAC 0x300 26 #define BNXT_ULP_NAT_OUTER_MOST_FLAGS (BNXT_ULP_NAT_OUTER_MOST_L2_HDR_SMAC |\ 27 BNXT_ULP_NAT_OUTER_MOST_L2_VLAN_TAGS |\ 28 BNXT_ULP_NAT_OUTER_MOST_L2_HDR_DMAC) 29 30 /* defines for the ulp_flags */ 31 #define BNXT_ULP_VF_REP_ENABLED 0x1 32 #define BNXT_ULP_SHARED_SESSION_ENABLED 0x2 33 #define BNXT_ULP_APP_DEV_UNSUPPORTED 0x4 34 #define BNXT_ULP_HIGH_AVAIL_ENABLED 0x8 35 #define BNXT_ULP_APP_UNICAST_ONLY 0x10 36 #define ULP_VF_REP_IS_ENABLED(flag) ((flag) & BNXT_ULP_VF_REP_ENABLED) 37 #define ULP_SHARED_SESSION_IS_ENABLED(flag) ((flag) &\ 38 BNXT_ULP_SHARED_SESSION_ENABLED) 39 #define ULP_APP_DEV_UNSUPPORTED_ENABLED(flag) ((flag) &\ 40 BNXT_ULP_APP_DEV_UNSUPPORTED) 41 #define ULP_HIGH_AVAIL_IS_ENABLED(flag) ((flag) & BNXT_ULP_HIGH_AVAIL_ENABLED) 42 43 enum bnxt_ulp_flow_mem_type { 44 BNXT_ULP_FLOW_MEM_TYPE_INT = 0, 45 BNXT_ULP_FLOW_MEM_TYPE_EXT = 1, 46 BNXT_ULP_FLOW_MEM_TYPE_BOTH = 2, 47 BNXT_ULP_FLOW_MEM_TYPE_LAST = 3 48 }; 49 50 enum bnxt_rte_flow_item_type { 51 BNXT_RTE_FLOW_ITEM_TYPE_END = (uint32_t)INT_MIN, 52 BNXT_RTE_FLOW_ITEM_TYPE_VXLAN_DECAP, 53 BNXT_RTE_FLOW_ITEM_TYPE_LAST 54 }; 55 56 enum bnxt_rte_flow_action_type { 57 BNXT_RTE_FLOW_ACTION_TYPE_END = (uint32_t)INT_MIN, 58 BNXT_RTE_FLOW_ACTION_TYPE_VXLAN_DECAP, 59 BNXT_RTE_FLOW_ACTION_TYPE_LAST 60 }; 61 62 struct bnxt_ulp_df_rule_info { 63 uint32_t def_port_flow_id; 64 uint8_t valid; 65 }; 66 67 struct bnxt_ulp_vfr_rule_info { 68 uint32_t vfr_flow_id; 69 uint16_t parent_port_id; 70 uint8_t valid; 71 }; 72 73 struct bnxt_ulp_data { 74 uint32_t tbl_scope_id; 75 struct bnxt_ulp_mark_tbl *mark_tbl; 76 uint32_t dev_id; /* Hardware device id */ 77 uint32_t ref_cnt; 78 struct bnxt_ulp_flow_db *flow_db; 79 pthread_mutex_t flow_db_lock; 80 void *mapper_data; 81 struct bnxt_ulp_port_db *port_db; 82 struct bnxt_ulp_fc_info *fc_info; 83 struct bnxt_ulp_ha_mgr_info *ha_info; 84 uint32_t ulp_flags; 85 struct bnxt_ulp_df_rule_info df_rule_info[RTE_MAX_ETHPORTS]; 86 struct bnxt_ulp_vfr_rule_info vfr_rule_info[RTE_MAX_ETHPORTS]; 87 enum bnxt_ulp_flow_mem_type mem_type; 88 #define BNXT_ULP_TUN_ENTRY_INVALID -1 89 #define BNXT_ULP_MAX_TUN_CACHE_ENTRIES 16 90 struct bnxt_tun_cache_entry tun_tbl[BNXT_ULP_MAX_TUN_CACHE_ENTRIES]; 91 bool accum_stats; 92 uint8_t app_id; 93 uint8_t num_shared_clients; 94 struct bnxt_flow_app_tun_ent app_tun[BNXT_ULP_MAX_TUN_CACHE_ENTRIES]; 95 }; 96 97 struct bnxt_ulp_context { 98 struct bnxt_ulp_data *cfg_data; 99 struct tf *g_tfp; 100 struct tf *g_shared_tfp; 101 }; 102 103 struct bnxt_ulp_pci_info { 104 uint32_t domain; 105 uint8_t bus; 106 }; 107 108 struct bnxt_ulp_session_state { 109 STAILQ_ENTRY(bnxt_ulp_session_state) next; 110 bool bnxt_ulp_init; 111 pthread_mutex_t bnxt_ulp_mutex; 112 struct bnxt_ulp_pci_info pci_info; 113 struct bnxt_ulp_data *cfg_data; 114 struct tf *g_tfp; 115 struct tf g_shared_tfp; 116 uint32_t session_opened; 117 }; 118 119 /* ULP flow id structure */ 120 struct rte_tf_flow { 121 uint32_t flow_id; 122 }; 123 124 struct ulp_tlv_param { 125 enum bnxt_ulp_df_param_type type; 126 uint32_t length; 127 uint8_t value[16]; 128 }; 129 130 struct ulp_context_list_entry { 131 TAILQ_ENTRY(ulp_context_list_entry) next; 132 struct bnxt_ulp_context *ulp_ctx; 133 }; 134 135 /* 136 * Allow the deletion of context only for the bnxt device that 137 * created the session 138 */ 139 bool 140 ulp_ctx_deinit_allowed(struct bnxt_ulp_context *ulp_ctx); 141 142 /* Function to set the device id of the hardware. */ 143 int32_t 144 bnxt_ulp_cntxt_dev_id_set(struct bnxt_ulp_context *ulp_ctx, uint32_t dev_id); 145 146 /* Function to get the device id of the hardware. */ 147 int32_t 148 bnxt_ulp_cntxt_dev_id_get(struct bnxt_ulp_context *ulp_ctx, uint32_t *dev_id); 149 150 /* Function to get whether or not ext mem is used for EM */ 151 int32_t 152 bnxt_ulp_cntxt_mem_type_get(struct bnxt_ulp_context *ulp_ctx, 153 enum bnxt_ulp_flow_mem_type *mem_type); 154 155 /* Function to set whether or not ext mem is used for EM */ 156 int32_t 157 bnxt_ulp_cntxt_mem_type_set(struct bnxt_ulp_context *ulp_ctx, 158 enum bnxt_ulp_flow_mem_type mem_type); 159 160 /* Function to set the table scope id of the EEM table. */ 161 int32_t 162 bnxt_ulp_cntxt_tbl_scope_id_set(struct bnxt_ulp_context *ulp_ctx, 163 uint32_t tbl_scope_id); 164 165 /* Function to get the table scope id of the EEM table. */ 166 int32_t 167 bnxt_ulp_cntxt_tbl_scope_id_get(struct bnxt_ulp_context *ulp_ctx, 168 uint32_t *tbl_scope_id); 169 170 /* Function to set the tfp session details in the ulp context. */ 171 int32_t 172 bnxt_ulp_cntxt_shared_tfp_set(struct bnxt_ulp_context *ulp, struct tf *tfp); 173 174 /* Function to get the tfp session details from ulp context. */ 175 struct tf * 176 bnxt_ulp_cntxt_shared_tfp_get(struct bnxt_ulp_context *ulp); 177 178 /* Function to set the tfp session details in the ulp context. */ 179 int32_t 180 bnxt_ulp_cntxt_tfp_set(struct bnxt_ulp_context *ulp, struct tf *tfp); 181 182 /* Function to get the tfp session details from ulp context. */ 183 struct tf * 184 bnxt_ulp_cntxt_tfp_get(struct bnxt_ulp_context *ulp, 185 enum bnxt_ulp_shared_session shared); 186 187 /* Get the device table entry based on the device id. */ 188 struct bnxt_ulp_device_params * 189 bnxt_ulp_device_params_get(uint32_t dev_id); 190 191 int32_t 192 bnxt_ulp_ctxt_ptr2_mark_db_set(struct bnxt_ulp_context *ulp_ctx, 193 struct bnxt_ulp_mark_tbl *mark_tbl); 194 195 struct bnxt_ulp_mark_tbl * 196 bnxt_ulp_ctxt_ptr2_mark_db_get(struct bnxt_ulp_context *ulp_ctx); 197 198 /* Function to set the flow database to the ulp context. */ 199 int32_t 200 bnxt_ulp_cntxt_ptr2_flow_db_set(struct bnxt_ulp_context *ulp_ctx, 201 struct bnxt_ulp_flow_db *flow_db); 202 203 /* Function to get the flow database from the ulp context. */ 204 struct bnxt_ulp_flow_db * 205 bnxt_ulp_cntxt_ptr2_flow_db_get(struct bnxt_ulp_context *ulp_ctx); 206 207 /* Function to get the tunnel cache table info from the ulp context. */ 208 struct bnxt_tun_cache_entry * 209 bnxt_ulp_cntxt_ptr2_tun_tbl_get(struct bnxt_ulp_context *ulp_ctx); 210 211 /* Function to get the ulp context from eth device. */ 212 struct bnxt_ulp_context * 213 bnxt_ulp_eth_dev_ptr2_cntxt_get(struct rte_eth_dev *dev); 214 215 /* Function to add the ulp mapper data to the ulp context */ 216 int32_t 217 bnxt_ulp_cntxt_ptr2_mapper_data_set(struct bnxt_ulp_context *ulp_ctx, 218 void *mapper_data); 219 220 /* Function to get the ulp mapper data from the ulp context */ 221 void * 222 bnxt_ulp_cntxt_ptr2_mapper_data_get(struct bnxt_ulp_context *ulp_ctx); 223 224 /* Function to set the port database to the ulp context. */ 225 int32_t 226 bnxt_ulp_cntxt_ptr2_port_db_set(struct bnxt_ulp_context *ulp_ctx, 227 struct bnxt_ulp_port_db *port_db); 228 229 /* Function to get the port database from the ulp context. */ 230 struct bnxt_ulp_port_db * 231 bnxt_ulp_cntxt_ptr2_port_db_get(struct bnxt_ulp_context *ulp_ctx); 232 233 /* Function to create default flows. */ 234 int32_t 235 ulp_default_flow_create(struct rte_eth_dev *eth_dev, 236 struct ulp_tlv_param *param_list, 237 uint32_t ulp_class_tid, 238 uint32_t *flow_id); 239 240 /* Function to destroy default flows. */ 241 int32_t 242 ulp_default_flow_destroy(struct rte_eth_dev *eth_dev, 243 uint32_t flow_id); 244 245 int 246 bnxt_ulp_flow_destroy(struct rte_eth_dev *dev, struct rte_flow *flow, 247 struct rte_flow_error *error); 248 249 int32_t 250 bnxt_ulp_cntxt_ptr2_fc_info_set(struct bnxt_ulp_context *ulp_ctx, 251 struct bnxt_ulp_fc_info *ulp_fc_info); 252 253 struct bnxt_ulp_fc_info * 254 bnxt_ulp_cntxt_ptr2_fc_info_get(struct bnxt_ulp_context *ulp_ctx); 255 256 int32_t 257 bnxt_ulp_cntxt_ptr2_ulp_flags_get(struct bnxt_ulp_context *ulp_ctx, 258 uint32_t *flags); 259 260 int32_t 261 bnxt_ulp_get_df_rule_info(uint8_t port_id, struct bnxt_ulp_context *ulp_ctx, 262 struct bnxt_ulp_df_rule_info *info); 263 264 struct bnxt_ulp_vfr_rule_info* 265 bnxt_ulp_cntxt_ptr2_ulp_vfr_info_get(struct bnxt_ulp_context *ulp_ctx, 266 uint32_t port_id); 267 268 int32_t 269 bnxt_ulp_cntxt_acquire_fdb_lock(struct bnxt_ulp_context *ulp_ctx); 270 271 void 272 bnxt_ulp_cntxt_release_fdb_lock(struct bnxt_ulp_context *ulp_ctx); 273 274 struct bnxt_ulp_glb_resource_info * 275 bnxt_ulp_app_glb_resource_info_list_get(uint32_t *num_entries); 276 277 int32_t 278 bnxt_ulp_cntxt_app_id_set(struct bnxt_ulp_context *ulp_ctx, uint8_t app_id); 279 280 int32_t 281 bnxt_ulp_cntxt_app_id_get(struct bnxt_ulp_context *ulp_ctx, uint8_t *app_id); 282 283 bool 284 bnxt_ulp_cntxt_shared_session_enabled(struct bnxt_ulp_context *ulp_ctx); 285 286 struct bnxt_ulp_app_capabilities_info * 287 bnxt_ulp_app_cap_list_get(uint32_t *num_entries); 288 289 int32_t 290 bnxt_ulp_cntxt_app_caps_init(struct bnxt_ulp_context *ulp_ctx, 291 uint8_t app_id, uint32_t dev_id); 292 293 struct bnxt_ulp_resource_resv_info * 294 bnxt_ulp_resource_resv_list_get(uint32_t *num_entries); 295 296 int32_t 297 bnxt_ulp_cntxt_ptr2_ha_info_set(struct bnxt_ulp_context *ulp_ctx, 298 struct bnxt_ulp_ha_mgr_info *ulp_ha_info); 299 300 struct bnxt_ulp_ha_mgr_info * 301 bnxt_ulp_cntxt_ptr2_ha_info_get(struct bnxt_ulp_context *ulp_ctx); 302 303 bool 304 bnxt_ulp_cntxt_ha_enabled(struct bnxt_ulp_context *ulp_ctx); 305 306 struct bnxt_ulp_context * 307 bnxt_ulp_cntxt_entry_acquire(void); 308 309 void 310 bnxt_ulp_cntxt_entry_release(void); 311 312 uint8_t 313 bnxt_ulp_cntxt_num_shared_clients_get(struct bnxt_ulp_context *ulp_ctx); 314 315 struct bnxt_flow_app_tun_ent * 316 bnxt_ulp_cntxt_ptr2_app_tun_list_get(struct bnxt_ulp_context *ulp); 317 318 #endif /* _BNXT_ULP_H_ */ 319