1 /* 2 * SPDX-License-Identifier: BSD-3-Clause 3 * Copyright(c) 2023 Napatech A/S 4 */ 5 6 #ifndef _HW_MOD_BACKEND_H_ 7 #define _HW_MOD_BACKEND_H_ 8 9 #include <stdbool.h> 10 11 #include "ntlog.h" 12 13 #include "hw_mod_cat_v18.h" 14 #include "hw_mod_cat_v21.h" 15 #include "hw_mod_flm_v25.h" 16 #include "hw_mod_km_v7.h" 17 #include "hw_mod_qsl_v7.h" 18 #include "hw_mod_pdb_v9.h" 19 #include "hw_mod_slc_lr_v2.h" 20 #include "hw_mod_hsh_v5.h" 21 #include "hw_mod_tpe_v3.h" 22 23 #define MAX_PHYS_ADAPTERS 8 24 25 #define VER_MAJOR(ver) (((ver) >> 16) & 0xffff) 26 #define VER_MINOR(ver) ((ver) & 0xffff) 27 28 struct flow_api_backend_s; 29 struct common_func_s; 30 31 void *callocate_mod(struct common_func_s *mod, int sets, ...); 32 void zero_module_cache(struct common_func_s *mod); 33 34 #define ALL_ENTRIES -1000 35 #define ALL_BANK_ENTRIES -1001 36 37 #define INDEX_TOO_LARGE (-2) 38 #define INDEX_TOO_LARGE_LOG NT_LOG(INF, FILTER, "ERROR:%s: Index too large", __func__) 39 40 #define WORD_OFF_TOO_LARGE (-3) 41 #define WORD_OFF_TOO_LARGE_LOG NT_LOG(INF, FILTER, "ERROR:%s: Word offset too large", __func__) 42 43 #define UNSUP_FIELD (-5) 44 #define UNSUP_FIELD_LOG \ 45 NT_LOG(INF, FILTER, "ERROR:%s: Unsupported field in NIC module", __func__) 46 47 #define UNSUP_VER (-4) 48 #define UNSUP_VER_LOG \ 49 NT_LOG(INF, FILTER, "ERROR:%s: Unsupported NIC module: %s ver %i.%i", __func__, _MOD_, \ 50 VER_MAJOR(_VER_), VER_MINOR(_VER_)) 51 52 #define COUNT_ERROR (-4) 53 #define COUNT_ERROR_LOG(_RESOURCE_) \ 54 NT_LOG(INF, FILTER, \ 55 "ERROR:%s: Insufficient resource [ %s ] : NIC module: %s ver %i.%i", __func__, \ 56 #_RESOURCE_, _MOD_, VER_MAJOR(_VER_), VER_MINOR(_VER_)) \ 57 58 #define NOT_FOUND 0xffffffff 59 60 enum { 61 EXTRA_INDEXES 62 }; 63 64 #define GET(cached_val, val) ({ *(val) = *(cached_val); }) 65 66 #define SET(cached_val, val) ({ *(cached_val) = *(val); }) 67 68 #define GET_SET(cached_val, val) \ 69 do { \ 70 uint32_t *temp_val = (val); \ 71 typeof(cached_val) *temp_cached_val = &(cached_val); \ 72 if (get) \ 73 GET(temp_cached_val, temp_val); \ 74 else \ 75 SET(temp_cached_val, temp_val); \ 76 } while (0) 77 78 #define GET_SIGNED(cached_val, val) ({ *(val) = (uint32_t)(*(cached_val)); }) 79 80 #define SET_SIGNED(cached_val, val) ({ *(cached_val) = (int32_t)(*(val)); }) 81 82 #define GET_SET_SIGNED(cached_val, val) \ 83 do { \ 84 uint32_t *temp_val = (val); \ 85 typeof(cached_val) *temp_cached_val = &(cached_val); \ 86 if (get) \ 87 GET_SIGNED(temp_cached_val, temp_val); \ 88 else \ 89 SET_SIGNED(temp_cached_val, temp_val); \ 90 } while (0) 91 92 #define FIND_EQUAL_INDEX(be_module_reg, type, idx, start, nb_elements) \ 93 do { \ 94 typeof(be_module_reg) *temp_be_module = \ 95 (typeof(be_module_reg) *)be_module_reg; \ 96 typeof(idx) tmp_idx = (idx); \ 97 typeof(nb_elements) tmp_nb_elements = (nb_elements); \ 98 unsigned int start_idx = (unsigned int)(start); \ 99 *value = NOT_FOUND; \ 100 for (unsigned int i = start_idx; i < tmp_nb_elements; i++) { \ 101 if ((unsigned int)(tmp_idx) == i) \ 102 continue; \ 103 if (memcmp(&temp_be_module[tmp_idx], &temp_be_module[i], sizeof(type)) == \ 104 0) { \ 105 *value = i; \ 106 break; \ 107 } \ 108 } \ 109 } while (0) 110 111 #define DO_COMPARE_INDEXS(be_module_reg, type, idx, cmp_idx) \ 112 do { \ 113 typeof(be_module_reg) *temp_be_module = &(be_module_reg); \ 114 typeof(idx) tmp_idx = (idx); \ 115 typeof(cmp_idx) tmp_cmp_idx = (cmp_idx); \ 116 if ((unsigned int)(tmp_idx) != (unsigned int)(tmp_cmp_idx)) { \ 117 (void)memcmp(temp_be_module + tmp_idx, &temp_be_module[tmp_cmp_idx], \ 118 sizeof(type)); \ 119 } \ 120 } while (0) 121 122 enum km_flm_if_select_e { 123 KM_FLM_IF_FIRST = 0, 124 KM_FLM_IF_SECOND = 1 125 }; 126 127 #define FIELD_START_INDEX 100 128 129 #define COMMON_FUNC_INFO_S \ 130 int ver; \ 131 void *base; \ 132 unsigned int alloced_size; \ 133 int debug 134 135 struct common_func_s { 136 COMMON_FUNC_INFO_S; 137 }; 138 139 struct cat_func_s { 140 COMMON_FUNC_INFO_S; 141 uint32_t nb_cat_funcs; 142 uint32_t nb_flow_types; 143 uint32_t nb_pm_ext; 144 uint32_t nb_len; 145 uint32_t kcc_size; 146 uint32_t cts_num; 147 uint32_t kcc_banks; 148 uint32_t kcc_id_bit_size; 149 uint32_t kcc_records; 150 uint32_t km_if_count; 151 int32_t km_if_m0; 152 int32_t km_if_m1; 153 154 union { 155 struct hw_mod_cat_v18_s v18; 156 struct hw_mod_cat_v21_s v21; 157 }; 158 }; 159 enum hw_cat_e { 160 /* 161 * functions initial CAT v18 162 */ 163 /* 00 */ HW_CAT_CFN_SET_ALL_DEFAULTS = 0, 164 /* 01 */ HW_CAT_CFN_PRESET_ALL, 165 /* 02 */ HW_CAT_CFN_COMPARE, 166 /* 03 */ HW_CAT_CFN_FIND, 167 /* 04 */ HW_CAT_CFN_COPY_FROM, 168 /* 05 */ HW_CAT_COT_PRESET_ALL, 169 /* 06 */ HW_CAT_COT_COMPARE, 170 /* 07 */ HW_CAT_COT_FIND, 171 /* 08 */ HW_CAT_COT_COPY_FROM, 172 /* fields */ 173 /* 00 */ HW_CAT_CFN_ENABLE = FIELD_START_INDEX, 174 /* 01 */ HW_CAT_CFN_INV, 175 /* 02 */ HW_CAT_CFN_PTC_INV, 176 /* 03 */ HW_CAT_CFN_PTC_ISL, 177 /* 04 */ HW_CAT_CFN_PTC_CFP, 178 /* 05 */ HW_CAT_CFN_PTC_MAC, 179 /* 06 */ HW_CAT_CFN_PTC_L2, 180 /* 07 */ HW_CAT_CFN_PTC_VNTAG, 181 /* 08 */ HW_CAT_CFN_PTC_VLAN, 182 /* 09 */ HW_CAT_CFN_PTC_MPLS, 183 /* 10 */ HW_CAT_CFN_PTC_L3, 184 /* 11 */ HW_CAT_CFN_PTC_FRAG, 185 /* 12 */ HW_CAT_CFN_PTC_IP_PROT, 186 /* 13 */ HW_CAT_CFN_PTC_L4, 187 /* 14 */ HW_CAT_CFN_PTC_TUNNEL, 188 /* 15 */ HW_CAT_CFN_PTC_TNL_L2, 189 /* 16 */ HW_CAT_CFN_PTC_TNL_VLAN, 190 /* 17 */ HW_CAT_CFN_PTC_TNL_MPLS, 191 /* 18 */ HW_CAT_CFN_PTC_TNL_L3, 192 /* 19 */ HW_CAT_CFN_PTC_TNL_FRAG, 193 /* 20 */ HW_CAT_CFN_PTC_TNL_IP_PROT, 194 /* 21 */ HW_CAT_CFN_PTC_TNL_L4, 195 /* 22 */ HW_CAT_CFN_ERR_INV, 196 /* 23 */ HW_CAT_CFN_ERR_CV, 197 /* 24 */ HW_CAT_CFN_ERR_FCS, 198 /* 25 */ HW_CAT_CFN_ERR_TRUNC, 199 /* 26 */ HW_CAT_CFN_ERR_L3_CS, 200 /* 27 */ HW_CAT_CFN_ERR_L4_CS, 201 /* 28 */ HW_CAT_CFN_MAC_PORT, 202 /* 29 */ HW_CAT_CFN_PM_CMP, 203 /* 30 */ HW_CAT_CFN_PM_DCT, 204 /* 31 */ HW_CAT_CFN_PM_EXT_INV, 205 /* 32 */ HW_CAT_CFN_PM_CMB, 206 /* 33 */ HW_CAT_CFN_PM_AND_INV, 207 /* 34 */ HW_CAT_CFN_PM_OR_INV, 208 /* 35 */ HW_CAT_CFN_PM_INV, 209 /* 36 */ HW_CAT_CFN_LC, 210 /* 37 */ HW_CAT_CFN_LC_INV, 211 /* 38 */ HW_CAT_CFN_KM0_OR, 212 /* 39 */ HW_CAT_CFN_KM1_OR, 213 /* 40 */ HW_CAT_KCE_ENABLE_BM, 214 /* 41 */ HW_CAT_KCS_CATEGORY, 215 /* 42 */ HW_CAT_FTE_ENABLE_BM, 216 /* 43 */ HW_CAT_CTE_ENABLE_BM, 217 /* 44 */ HW_CAT_CTS_CAT_A, 218 /* 45 */ HW_CAT_CTS_CAT_B, 219 /* 46 */ HW_CAT_COT_COLOR, 220 /* 47 */ HW_CAT_COT_KM, 221 /* 48 */ HW_CAT_CCT_COLOR, 222 /* 49 */ HW_CAT_CCT_KM, 223 /* 50 */ HW_CAT_KCC_KEY, 224 /* 51 */ HW_CAT_KCC_CATEGORY, 225 /* 52 */ HW_CAT_KCC_ID, 226 /* 53 */ HW_CAT_EXO_DYN, 227 /* 54 */ HW_CAT_EXO_OFS, 228 /* 55 */ HW_CAT_RCK_DATA, 229 /* 56 */ HW_CAT_LEN_LOWER, 230 /* 57 */ HW_CAT_LEN_UPPER, 231 /* 58 */ HW_CAT_LEN_DYN1, 232 /* 59 */ HW_CAT_LEN_DYN2, 233 /* 60 */ HW_CAT_LEN_INV, 234 /* 61 */ HW_CAT_CFN_ERR_TNL_L3_CS, 235 /* 62 */ HW_CAT_CFN_ERR_TNL_L4_CS, 236 /* 63 */ HW_CAT_CFN_ERR_TTL_EXP, 237 /* 64 */ HW_CAT_CFN_ERR_TNL_TTL_EXP, 238 }; 239 240 bool hw_mod_cat_present(struct flow_api_backend_s *be); 241 int hw_mod_cat_alloc(struct flow_api_backend_s *be); 242 void hw_mod_cat_free(struct flow_api_backend_s *be); 243 int hw_mod_cat_reset(struct flow_api_backend_s *be); 244 int hw_mod_cat_cfn_flush(struct flow_api_backend_s *be, int start_idx, int count); 245 int hw_mod_cat_cfn_set(struct flow_api_backend_s *be, enum hw_cat_e field, int index, int word_off, 246 uint32_t value); 247 248 int hw_mod_cat_cte_flush(struct flow_api_backend_s *be, int start_idx, int count); 249 int hw_mod_cat_cts_flush(struct flow_api_backend_s *be, int start_idx, int count); 250 int hw_mod_cat_cot_flush(struct flow_api_backend_s *be, int start_idx, int count); 251 int hw_mod_cat_cct_flush(struct flow_api_backend_s *be, int start_idx, int count); 252 int hw_mod_cat_kcc_flush(struct flow_api_backend_s *be, int start_idx, int count); 253 254 int hw_mod_cat_exo_flush(struct flow_api_backend_s *be, int start_idx, int count); 255 int hw_mod_cat_rck_flush(struct flow_api_backend_s *be, int start_idx, int count); 256 int hw_mod_cat_len_flush(struct flow_api_backend_s *be, int start_idx, int count); 257 258 struct km_func_s { 259 COMMON_FUNC_INFO_S; 260 uint32_t nb_categories; 261 uint32_t nb_cam_banks; 262 uint32_t nb_cam_record_words; 263 uint32_t nb_cam_records; 264 uint32_t nb_tcam_banks; 265 uint32_t nb_tcam_bank_width; 266 /* not read from backend, but rather set using version */ 267 uint32_t nb_km_rcp_mask_a_word_size; 268 /* --- || --- */ 269 uint32_t nb_km_rcp_mask_b_word_size; 270 union { 271 struct hw_mod_km_v7_s v7; 272 }; 273 }; 274 enum hw_km_e { 275 /* functions */ 276 HW_KM_RCP_PRESET_ALL = 0, 277 HW_KM_CAM_PRESET_ALL, 278 /* to sync and reset hw with cache - force write all entries in a bank */ 279 HW_KM_TCAM_BANK_RESET, 280 /* fields */ 281 HW_KM_RCP_QW0_DYN = FIELD_START_INDEX, 282 HW_KM_RCP_QW0_OFS, 283 HW_KM_RCP_QW0_SEL_A, 284 HW_KM_RCP_QW0_SEL_B, 285 HW_KM_RCP_QW4_DYN, 286 HW_KM_RCP_QW4_OFS, 287 HW_KM_RCP_QW4_SEL_A, 288 HW_KM_RCP_QW4_SEL_B, 289 HW_KM_RCP_DW8_DYN, 290 HW_KM_RCP_DW8_OFS, 291 HW_KM_RCP_DW8_SEL_A, 292 HW_KM_RCP_DW8_SEL_B, 293 HW_KM_RCP_DW10_DYN, 294 HW_KM_RCP_DW10_OFS, 295 HW_KM_RCP_DW10_SEL_A, 296 HW_KM_RCP_DW10_SEL_B, 297 HW_KM_RCP_SWX_CCH, 298 HW_KM_RCP_SWX_SEL_A, 299 HW_KM_RCP_SWX_SEL_B, 300 HW_KM_RCP_MASK_A, 301 HW_KM_RCP_MASK_B, 302 HW_KM_RCP_DUAL, 303 HW_KM_RCP_PAIRED, 304 HW_KM_RCP_EL_A, 305 HW_KM_RCP_EL_B, 306 HW_KM_RCP_INFO_A, 307 HW_KM_RCP_INFO_B, 308 HW_KM_RCP_FTM_A, 309 HW_KM_RCP_FTM_B, 310 HW_KM_RCP_BANK_A, 311 HW_KM_RCP_BANK_B, 312 HW_KM_RCP_KL_A, 313 HW_KM_RCP_KL_B, 314 HW_KM_RCP_KEYWAY_A, 315 HW_KM_RCP_KEYWAY_B, 316 HW_KM_RCP_SYNERGY_MODE, 317 HW_KM_RCP_DW0_B_DYN, 318 HW_KM_RCP_DW0_B_OFS, 319 HW_KM_RCP_DW2_B_DYN, 320 HW_KM_RCP_DW2_B_OFS, 321 HW_KM_RCP_SW4_B_DYN, 322 HW_KM_RCP_SW4_B_OFS, 323 HW_KM_RCP_SW5_B_DYN, 324 HW_KM_RCP_SW5_B_OFS, 325 HW_KM_CAM_W0, 326 HW_KM_CAM_W1, 327 HW_KM_CAM_W2, 328 HW_KM_CAM_W3, 329 HW_KM_CAM_W4, 330 HW_KM_CAM_W5, 331 HW_KM_CAM_FT0, 332 HW_KM_CAM_FT1, 333 HW_KM_CAM_FT2, 334 HW_KM_CAM_FT3, 335 HW_KM_CAM_FT4, 336 HW_KM_CAM_FT5, 337 HW_KM_TCAM_T, 338 HW_KM_TCI_COLOR, 339 HW_KM_TCI_FT, 340 HW_KM_TCQ_BANK_MASK, 341 HW_KM_TCQ_QUAL 342 }; 343 bool hw_mod_km_present(struct flow_api_backend_s *be); 344 int hw_mod_km_alloc(struct flow_api_backend_s *be); 345 void hw_mod_km_free(struct flow_api_backend_s *be); 346 int hw_mod_km_reset(struct flow_api_backend_s *be); 347 int hw_mod_km_rcp_flush(struct flow_api_backend_s *be, int start_idx, int count); 348 int hw_mod_km_cam_flush(struct flow_api_backend_s *be, int start_bank, int start_record, 349 int count); 350 int hw_mod_km_tcam_flush(struct flow_api_backend_s *be, int start_bank, int count); 351 int hw_mod_km_tcam_set(struct flow_api_backend_s *be, enum hw_km_e field, int bank, int byte, 352 int byte_val, uint32_t *value_set); 353 int hw_mod_km_tci_flush(struct flow_api_backend_s *be, int start_bank, int start_record, 354 int count); 355 int hw_mod_km_tcq_flush(struct flow_api_backend_s *be, int start_bank, int start_record, 356 int count); 357 358 struct flm_func_s { 359 COMMON_FUNC_INFO_S; 360 uint32_t nb_categories; 361 uint32_t nb_size_mb; 362 uint32_t nb_entry_size; 363 uint32_t nb_variant; 364 uint32_t nb_prios; 365 uint32_t nb_pst_profiles; 366 uint32_t nb_scrub_profiles; 367 uint32_t nb_rpp_clock_in_ps; 368 uint32_t nb_load_aps_max; 369 union { 370 struct hw_mod_flm_v25_s v25; 371 }; 372 }; 373 374 struct hsh_func_s { 375 COMMON_FUNC_INFO_S; 376 uint32_t nb_rcp;/* number of HSH recipes supported by FPGA */ 377 /* indication if Toeplitz is supported by FPGA, i.e. 0 - unsupported, 1 - supported */ 378 uint32_t toeplitz; 379 union { 380 struct hw_mod_hsh_v5_s v5; 381 }; 382 }; 383 384 struct qsl_func_s { 385 COMMON_FUNC_INFO_S; 386 uint32_t nb_rcp_categories; 387 uint32_t nb_qst_entries; 388 union { 389 struct hw_mod_qsl_v7_s v7; 390 }; 391 }; 392 393 struct slc_lr_func_s { 394 COMMON_FUNC_INFO_S; 395 union { 396 struct hw_mod_slc_lr_v2_s v2; 397 }; 398 }; 399 400 struct pdb_func_s { 401 COMMON_FUNC_INFO_S; 402 uint32_t nb_pdb_rcp_categories; 403 404 union { 405 struct hw_mod_pdb_v9_s v9; 406 }; 407 }; 408 409 struct tpe_func_s { 410 COMMON_FUNC_INFO_S; 411 uint32_t nb_rcp_categories; 412 uint32_t nb_ifr_categories; 413 uint32_t nb_cpy_writers; 414 uint32_t nb_rpl_depth; 415 uint32_t nb_rpl_ext_categories; 416 union { 417 struct hw_mod_tpe_v3_s v3; 418 }; 419 }; 420 421 enum debug_mode_e { 422 FLOW_BACKEND_DEBUG_MODE_NONE = 0x0000, 423 FLOW_BACKEND_DEBUG_MODE_WRITE = 0x0001 424 }; 425 426 struct flow_api_backend_ops { 427 int version; 428 int (*set_debug_mode)(void *dev, enum debug_mode_e mode); 429 int (*get_nb_phy_port)(void *dev); 430 int (*get_nb_rx_port)(void *dev); 431 int (*get_ltx_avail)(void *dev); 432 int (*get_nb_cat_funcs)(void *dev); 433 int (*get_nb_categories)(void *dev); 434 int (*get_nb_cat_km_if_cnt)(void *dev); 435 int (*get_nb_cat_km_if_m0)(void *dev); 436 int (*get_nb_cat_km_if_m1)(void *dev); 437 438 int (*get_nb_queues)(void *dev); 439 int (*get_nb_km_flow_types)(void *dev); 440 int (*get_nb_pm_ext)(void *dev); 441 int (*get_nb_len)(void *dev); 442 int (*get_kcc_size)(void *dev); 443 int (*get_kcc_banks)(void *dev); 444 int (*get_nb_km_categories)(void *dev); 445 int (*get_nb_km_cam_banks)(void *dev); 446 int (*get_nb_km_cam_record_words)(void *dev); 447 int (*get_nb_km_cam_records)(void *dev); 448 int (*get_nb_km_tcam_banks)(void *dev); 449 int (*get_nb_km_tcam_bank_width)(void *dev); 450 int (*get_nb_flm_categories)(void *dev); 451 int (*get_nb_flm_size_mb)(void *dev); 452 int (*get_nb_flm_entry_size)(void *dev); 453 int (*get_nb_flm_variant)(void *dev); 454 int (*get_nb_flm_prios)(void *dev); 455 int (*get_nb_flm_pst_profiles)(void *dev); 456 int (*get_nb_flm_scrub_profiles)(void *dev); 457 int (*get_nb_flm_load_aps_max)(void *dev); 458 int (*get_nb_qsl_categories)(void *dev); 459 int (*get_nb_qsl_qst_entries)(void *dev); 460 int (*get_nb_pdb_categories)(void *dev); 461 int (*get_nb_roa_categories)(void *dev); 462 int (*get_nb_tpe_categories)(void *dev); 463 int (*get_nb_tx_cpy_writers)(void *dev); 464 int (*get_nb_tx_cpy_mask_mem)(void *dev); 465 int (*get_nb_tx_rpl_depth)(void *dev); 466 int (*get_nb_tx_rpl_ext_categories)(void *dev); 467 int (*get_nb_tpe_ifr_categories)(void *dev); 468 int (*get_nb_rpp_per_ps)(void *dev); 469 int (*get_nb_hsh_categories)(void *dev); 470 int (*get_nb_hsh_toeplitz)(void *dev); 471 472 int (*alloc_rx_queue)(void *dev, int queue_id); 473 int (*free_rx_queue)(void *dev, int hw_queue); 474 475 /* CAT */ 476 bool (*get_cat_present)(void *dev); 477 uint32_t (*get_cat_version)(void *dev); 478 int (*cat_cfn_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt); 479 int (*cat_kce_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int index, 480 int cnt); 481 int (*cat_kcs_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int cat_func, 482 int cnt); 483 int (*cat_fte_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int index, 484 int cnt); 485 int (*cat_cte_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt); 486 int (*cat_cts_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 487 int (*cat_cot_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt); 488 int (*cat_cct_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 489 int (*cat_exo_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 490 int (*cat_rck_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 491 int (*cat_len_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 492 int (*cat_kcc_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 493 494 /* KM */ 495 bool (*get_km_present)(void *dev); 496 uint32_t (*get_km_version)(void *dev); 497 int (*km_rcp_flush)(void *dev, const struct km_func_s *km, int category, int cnt); 498 int (*km_cam_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt); 499 int (*km_tcam_flush)(void *dev, const struct km_func_s *km, int bank, int byte, int value, 500 int cnt); 501 int (*km_tci_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt); 502 int (*km_tcq_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt); 503 504 /* FLM */ 505 bool (*get_flm_present)(void *dev); 506 uint32_t (*get_flm_version)(void *dev); 507 int (*flm_control_flush)(void *dev, const struct flm_func_s *flm); 508 int (*flm_status_flush)(void *dev, const struct flm_func_s *flm); 509 int (*flm_status_update)(void *dev, const struct flm_func_s *flm); 510 int (*flm_scan_flush)(void *dev, const struct flm_func_s *flm); 511 int (*flm_load_bin_flush)(void *dev, const struct flm_func_s *flm); 512 int (*flm_prio_flush)(void *dev, const struct flm_func_s *flm); 513 int (*flm_pst_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt); 514 int (*flm_rcp_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt); 515 int (*flm_scrub_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt); 516 int (*flm_buf_ctrl_update)(void *dev, const struct flm_func_s *flm); 517 int (*flm_stat_update)(void *dev, const struct flm_func_s *flm); 518 int (*flm_lrn_data_flush)(void *be_dev, const struct flm_func_s *flm, 519 const uint32_t *lrn_data, uint32_t records, 520 uint32_t *handled_records, uint32_t words_per_record, 521 uint32_t *inf_word_cnt, uint32_t *sta_word_cnt); 522 int (*flm_inf_sta_data_update)(void *be_dev, const struct flm_func_s *flm, 523 uint32_t *inf_data, uint32_t inf_size, 524 uint32_t *inf_word_cnt, uint32_t *sta_data, 525 uint32_t sta_size, uint32_t *sta_word_cnt); 526 527 /* HSH */ 528 bool (*get_hsh_present)(void *dev); 529 uint32_t (*get_hsh_version)(void *dev); 530 int (*hsh_rcp_flush)(void *dev, const struct hsh_func_s *hsh, int category, int cnt); 531 532 /* QSL */ 533 bool (*get_qsl_present)(void *dev); 534 uint32_t (*get_qsl_version)(void *dev); 535 int (*qsl_rcp_flush)(void *dev, const struct qsl_func_s *qsl, int category, int cnt); 536 int (*qsl_qst_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt); 537 int (*qsl_qen_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt); 538 int (*qsl_unmq_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt); 539 540 /* SLC LR */ 541 bool (*get_slc_lr_present)(void *dev); 542 uint32_t (*get_slc_lr_version)(void *dev); 543 int (*slc_lr_rcp_flush)(void *dev, const struct slc_lr_func_s *slc_lr, int category, 544 int cnt); 545 546 /* PDB */ 547 bool (*get_pdb_present)(void *dev); 548 uint32_t (*get_pdb_version)(void *dev); 549 int (*pdb_rcp_flush)(void *dev, const struct pdb_func_s *pdb, int category, int cnt); 550 int (*pdb_config_flush)(void *dev, const struct pdb_func_s *pdb); 551 552 /* TPE */ 553 bool (*get_tpe_present)(void *dev); 554 uint32_t (*get_tpe_version)(void *dev); 555 int (*tpe_rpp_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 556 int (*tpe_rpp_ifr_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 557 int (*tpe_ifr_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 558 int (*tpe_ins_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 559 int (*tpe_rpl_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 560 int (*tpe_rpl_ext_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 561 int (*tpe_rpl_rpl_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 562 int (*tpe_cpy_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 563 int (*tpe_hfu_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 564 int (*tpe_csu_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 565 }; 566 567 struct flow_api_backend_s { 568 void *be_dev; 569 const struct flow_api_backend_ops *iface; 570 571 /* flow filter FPGA modules */ 572 struct cat_func_s cat; 573 struct km_func_s km; 574 575 /* NIC attributes */ 576 unsigned int num_phy_ports; 577 unsigned int num_rx_ports; 578 579 /* flow filter resource capacities */ 580 unsigned int max_categories; 581 unsigned int max_queues; 582 }; 583 584 int flow_api_backend_init(struct flow_api_backend_s *dev, const struct flow_api_backend_ops *iface, 585 void *be_dev); 586 int flow_api_backend_done(struct flow_api_backend_s *dev); 587 588 #endif /* _HW_MOD_BACKEND_H_ */ 589