ft_alu.h (35768B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2020 Broadcom Inc. All rights reserved. 6 * 7 * File: ft_alu.h 8 * Purpose: Function declarations for flowtracker Alu. 9 */ 10 11 #ifndef _BCM_INT_FT_ALU_H_ 12 #define _BCM_INT_FT_ALU_H_ 13 14 #include <shared/bsl.h> 15 #include <soc/helix5.h> 16 #include <soc/drv.h> 17 #include <bcm/error.h> 18 #include <soc/debug.h> 19 #include <soc/mem.h> 20 #include <bcm/flowtracker.h> 21 #include <bcm_int/esw/flowtracker/ft_common.h> 22 #include <bcm_int/esw/flowtracker/ft_field.h> 23 24 #include <soc/defs.h> 25 26 #if defined(BCM_FLOWTRACKER_SUPPORT) 27 28 /************************************************************* 29 | Start - Basic ALU/LOAD HW structs & defines | 30 */ 31 32 typedef enum bcmi_ft_alu_load_type_e { 33 34 /* Load8 resource type. */ 35 bcmiFtAluLoadTypeLoad8 = 0, 36 37 /* Load16 resource type. */ 38 bcmiFtAluLoadTypeLoad16 = 1, 39 40 /* Alu16 resource type. */ 41 bcmiFtAluLoadTypeAlu16 = 2, 42 43 /* Alu32 resource type. */ 44 bcmiFtAluLoadTypeAlu32 = 3, 45 46 /* Aggregate Alu32 resource type. */ 47 bcmiFtAluLoadTypeAggAlu32 = 4, 48 49 /* Resource type none. */ 50 bcmiFtAluLoadTypeNone = 5 51 52 } bcmi_ft_alu_load_type_t; 53 54 extern uint8 55 alu_type_str[6][50]; 56 57 typedef struct bcmi_ft_alu_key_s { 58 59 /* Location of tracking param. */ 60 int location; 61 62 /* Is it a alu. */ 63 int is_alu; 64 65 /* Length of tracking param. */ 66 int length; 67 68 } bcmi_ft_alu_key_t; 69 70 typedef enum bcmi_flowtracker_check_set_e { 71 72 /* Check timestamp set. */ 73 bcmFlowtrackerFlowCheckTsSet = 0, 74 75 /* Check timestamp reset. */ 76 bcmFlowtrackerFlowCheckTsReset = 1 77 78 } bcmi_flowtracker_check_set_t; 79 80 typedef struct bcmi_ft_flowchecker_list_s { 81 82 /* Flowchecker identifier. */ 83 bcm_flowtracker_check_t flowchecker_id; 84 85 /* Next pointer to checker identifier. */ 86 struct bcmi_ft_flowchecker_list_s *next; 87 88 } bcmi_ft_flowchecker_list_t; 89 90 /* ALU/LOAD internal flags. */ 91 /* Next element is attached to this. */ 92 #define BCMI_FT_ALU_LOAD_NEXT_ATTACH (1 << 0) 93 94 /* Aggregate ALU32 supported in the group */ 95 #define BCMI_FT_ALU_LOAD_USE_AGG_ALU32 (1 << 1) 96 97 /* Shift is applied to data (flowcheck action) */ 98 #define BCMI_FT_ALU_LOAD_DATA_SHIFT_APPLIED (1 << 2) 99 100 /* alu info is installed in the hardware */ 101 #define BCMI_FT_ALU_LOAD_HW_INSTALLED (1 << 3) 102 103 /* Internally defined */ 104 #define BCMI_FT_ALU_LOAD_INTERNAL (1 << 4) 105 106 /* Extended to other alu info */ 107 #define BCMI_FT_ALU_LOAD_EXTENDED (1 << 5) 108 109 /* StickyOr update should be activated */ 110 #define BCMI_FT_ALU_LOAD_STICKYOR_UPDATE (1 << 6) 111 112 /* Internal Flowchecker shift adjusted */ 113 #define BCMI_FT_ALU_LOAD_INTERNAL_DATA_SHIFT_ADJUSTED (1 << 7) 114 /************************************************************* 115 | End - Basic ALU/LOAD HW structs & defines | 116 */ 117 118 119 120 /************************************************************* 121 | Start - FT resource tracking structs & defines | 122 */ 123 124 /* Session Data size in bits */ 125 #define BCMI_FT_SESSION_DATA_SINGLE_LEN 256 126 #define BCMI_FT_SESSION_DATA_SINGLE_BANK_SIZE 64 127 128 /* Session Data Bank Mem and their data sizes. */ 129 #define TOTAL_GROUP_SESSION_DATA_BANK_MEM 1 130 #define TOTAL_GROUP_SESSION_DATA_BANK_SW_DATA_NUM 4 131 #define TOTAL_GROUP_SESSION_DATA_BANK_DW_DATA_NUM 8 132 #define TOTAL_GROUP_AGG_SESSION_DATA_BANK_MEM 4 133 134 /* Total ALU memories and their data sizes. */ 135 #define TOTAL_GROUP_ALU32_MEM 12 136 #define TOTAL_GROUP_ALU32_DATA_NUM 1 137 #define TOTAL_GROUP_ALU16_MEM 8 138 #define TOTAL_GROUP_ALU16_DATA_NUM 1 139 #define TOTAL_GROUP_LOAD16_MEM 1 140 #define TOTAL_GROUP_LOAD16_DATA_NUM 16 141 #define TOTAL_GROUP_LOAD8_MEM 1 142 #define TOTAL_GROUP_LOAD8_DATA_NUM 8 143 #define TOTAL_GROUP_TIMESTAMP_ENGINE_MEM 1 144 #define TOTAL_GROUP_TIMESTAMP_ENGINE_DATA_NUM 4 145 #define TOTAL_GROUP_AGG_ALU32_MEM 16 146 147 /* ALU16/32 & LOAD8/16 */ 148 #define BCMI_FT_ALU_LOAD_MEMS (bcmiFtAluLoadTypeNone) 149 150 typedef struct alu_load_info_s { 151 152 /* Memory identifier. */ 153 soc_mem_t mem; 154 155 /* Memory size. */ 156 int mem_size; 157 158 /* Flowtracker type. */ 159 bcmi_ft_type_t *resource_ft_type; 160 161 } alu_load_info_t; 162 163 typedef struct bcmi_ft_group_pdd_bus_info_s { 164 165 /* Param identifier. */ 166 int param_id; 167 168 /* End bit. */ 169 int end; 170 171 /* Start bit. */ 172 int start; 173 174 /* Length. */ 175 int length; 176 177 } bcmi_ft_group_pdd_bus_info_t; 178 179 typedef struct alu_load_index_info_s { 180 181 /* Total memory count. */ 182 int total_mem_count; 183 184 /* Total index per memory. */ 185 int total_idx_per_memory; 186 187 /* Index Bitmap. */ 188 SHR_BITDCL *index_bitmap; 189 190 /* Refcounts for all the indexes on this memory. */ 191 uint32 *idx_refcount; 192 193 /* ALU/LOAD memory information. */ 194 alu_load_info_t *alu_load_info; 195 196 /* PDD bus information. */ 197 bcmi_ft_group_pdd_bus_info_t *pdd_bus_info; 198 199 /* Group field information. */ 200 uint32 *group_fid_info; 201 202 } alu_load_index_info_t; 203 204 /* There are 4 different types of memories. */ 205 extern alu_load_index_info_t 206 alu_load_index_info[BCM_MAX_NUM_UNITS][BCMI_FT_ALU_LOAD_MEMS]; 207 208 #define BCMI_FT_ALU_LOAD_INFO(_u, type) \ 209 (alu_load_index_info[_u][type]) 210 211 #define BCMI_FT_ALU_LOAD_MEM_COUNT(_u, type) \ 212 ((alu_load_index_info[_u][type]).total_mem_count) 213 214 #define BCMI_FT_ALU_LOAD_MEM_TOTAL_INDEX(_u, type) \ 215 ((alu_load_index_info[_u][type]).total_idx_per_memory) 216 217 #define BCMI_FT_ALU_LOAD_BITMAP_INFO(_u, type) \ 218 (alu_load_index_info[_u][type].index_bitmap) 219 220 #define BCMI_FT_ALU_LOAD_REFCOUNT_INFO(_u, type) \ 221 (alu_load_index_info[_u][type].idx_refcount) 222 223 #define BCMI_FT_ALU_LOAD_REFCOUNT_INCR(_u, type, idx) \ 224 ((alu_load_index_info[_u][type].idx_refcount[idx])++) 225 226 #define BCMI_FT_ALU_LOAD_REFCOUNT_DEC(_u, type, idx) \ 227 ((alu_load_index_info[_u][type].idx_refcount[idx])--) 228 229 #define BCMI_FT_ALU_LOAD_REFCOUNT(_u, type, idx) \ 230 (alu_load_index_info[_u][type].idx_refcount[idx]) 231 232 #define BCMI_FT_ALU_LOAD_GROUP_FID_INFO(_u, type) \ 233 ((alu_load_index_info[_u][type]).group_fid_info) 234 235 #define BCMI_FT_ALU_LOAD_PDD_INFO(_u, type) \ 236 (alu_load_index_info[_u][type].pdd_bus_info) 237 238 #define BCMI_FT_ALU_LOAD_MEM_INFO(_u, type) \ 239 ((alu_load_index_info[_u][type]).alu_load_info) 240 241 #define BCMI_FT_ALU_LOAD_MEM(_u, type, mem_idx) \ 242 (((BCMI_FT_ALU_LOAD_MEM_INFO(_u, type))[mem_idx]).mem) 243 244 #define BCMI_FT_ALU_LOAD_MEM_SIZE(_u, type, mem_idx) \ 245 (((BCMI_FT_ALU_LOAD_MEM_INFO(_u, type))[mem_idx]).mem_size) 246 247 #define BCMI_FT_ALU_LOAD_MEM_FT_TYPE(_u, type, mem_idx, bank_idx) \ 248 (((BCMI_FT_ALU_LOAD_MEM_INFO(_u, type))[mem_idx]).resource_ft_type[bank_idx]) 249 250 /* Session Data Bank Info */ 251 extern 252 alu_load_info_t *session_data_bank_info[BCM_MAX_NUM_UNITS]; 253 #define BCMI_FT_SESSION_DATA_BANK_INFO(_u) \ 254 (session_data_bank_info[_u]) 255 256 #define BCMI_FT_SESSION_DATA_BANK_MEM(_u) \ 257 ((session_data_bank_info[_u])->mem) 258 259 #define BCMI_FT_SESSION_DATA_BANK_MEM_SIZE(_u) \ 260 ((session_data_bank_info[_u])->mem_size) 261 262 #define BCMI_FT_SESSION_DATA_BANK_FT_TYPE(_u, idx) \ 263 ((session_data_bank_info[_u])->resource_ft_type[idx]) 264 265 #if defined(BCM_FLOWTRACKER_V3_SUPPORT) 266 extern 267 alu_load_info_t *agg_session_data_bank_info[BCM_MAX_NUM_UNITS]; 268 #define BCMI_FT_AGG_SESSION_DATA_BANK_INFO(_u) \ 269 (agg_session_data_bank_info[_u]) 270 271 #define BCMI_FT_AGG_SESSION_DATA_BANK_MEM(_u, _idx) \ 272 ((agg_session_data_bank_info[_u])[_idx].mem) 273 274 #define BCMI_FT_AGG_SESSION_DATA_BANK_MEM_SIZE(_u, _idx) \ 275 ((agg_session_data_bank_info[_u])[_idx].mem_size) 276 277 #define BCMI_FT_AGG_SESSION_DATA_BANK_FT_TYPE(_u, _idx, _ridx) \ 278 ((agg_session_data_bank_info[_u])[_idx].resource_ft_type[_ridx]) 279 #endif 280 281 /* TimeStamp Engine Info */ 282 extern 283 alu_load_info_t *timestamp_engine_info[BCM_MAX_NUM_UNITS]; 284 #define BCMI_FT_TIMESTAMP_ENGINE_INFO(_u) \ 285 (timestamp_engine_info[_u]) 286 287 #define BCMI_FT_TIMESTAMP_ENGINE_MEM(_u) \ 288 ((timestamp_engine_info[_u])->mem) 289 290 #define BCMI_FT_TIMESTAMP_ENGINE_MEM_SIZE(_u) \ 291 ((timestamp_engine_info[_u])->mem_size) 292 293 #define BCMI_FT_TIMESTAMP_ENGINE_FT_TYPE(_u, idx) \ 294 ((timestamp_engine_info[_u])->resource_ft_type[idx]) 295 296 /* Resource Software State Info */ 297 typedef struct bcmi_ft_resource_sw_info_s { 298 299 /* Number of banks allocated to each FT stage. */ 300 uint8 num_banks[bcmiFtTypeCount]; 301 302 /* Local PDE start offset for each FT stage. */ 303 uint8 bank_start_local_pde_offset[bcmiFtTypeCount]; 304 305 /* Export PDE start offset for each FT stage. */ 306 uint8 bank_start_export_pde_offset[bcmiFtTypeCount]; 307 308 /* Local offset jump for each FT stage. */ 309 uint8 bank_offset_local_jump[bcmiFtTypeCount]; 310 311 /* Export offset jump for each FT stage. */ 312 uint8 bank_offset_export_jump[bcmiFtTypeCount]; 313 314 /* Fill bytes for each FT stage. */ 315 uint8 bank_fill_bytes[bcmiFtTypeCount]; 316 317 /* No. of fill for each FT stage. */ 318 uint8 bank_num_fills[bcmiFtTypeCount]; 319 320 /* No. of Load8 resource allocated to each FT stage. */ 321 uint8 num_load8[bcmiFtTypeCount]; 322 323 /* No. of Load16 resource allocated to each FT stage. */ 324 uint8 num_load16[bcmiFtTypeCount]; 325 326 /* No. of timestamp resource allocated to each FT stage. */ 327 uint8 num_tsbank[bcmiFtTypeCount]; 328 329 /* Chip delay granularity. */ 330 uint8 chip_delay_gran; 331 332 /* End to End delay granularity. */ 333 uint8 e2e_delay_gran; 334 335 /* Inter packet arrival delay granularity. */ 336 uint8 ipat_delay_gran; 337 338 /* Inter packet departure delay granularity. */ 339 uint8 ipdt_delay_gran; 340 341 /* Chip delay offset. */ 342 int chip_delay_offset; 343 344 /* End to End delay offset. */ 345 int e2e_delay_offset; 346 347 /* Inter packet arrival delay offset. */ 348 int ipat_delay_offset; 349 350 /* Inter packet departure delay offset. */ 351 int ipdt_delay_offset; 352 353 } bcmi_ft_resource_sw_info_t; 354 355 extern bcmi_ft_resource_sw_info_t 356 bcmi_ft_resource_sw_state[BCM_MAX_NUM_UNITS]; 357 358 #define BCMI_FT_RESOURCE_SW_INFO(unit) \ 359 (bcmi_ft_resource_sw_state[unit]) 360 361 #define BCMI_FT_RESOURCE_SW_INFO_NUM_BANKS(unit, ft_type) \ 362 (bcmi_ft_resource_sw_state[unit].num_banks[ft_type]) 363 364 #define BCMI_FT_RESOURCE_SW_INFO_BANK_START_LOCAL_PDE_OFFSET(unit, ft_type) \ 365 (bcmi_ft_resource_sw_state[unit].bank_start_local_pde_offset[ft_type]) 366 367 #define BCMI_FT_RESOURCE_SW_INFO_BANK_START_EXPORT_PDE_OFFSET(unit, ft_type) \ 368 (bcmi_ft_resource_sw_state[unit].bank_start_export_pde_offset[ft_type]) 369 370 #define BCMI_FT_RESOURCE_SW_INFO_BANK_OFFSET_LOCAL_JUMP(unit, ft_type) \ 371 (bcmi_ft_resource_sw_state[unit].bank_offset_local_jump[ft_type]) 372 373 #define BCMI_FT_RESOURCE_SW_INFO_BANK_OFFSET_EXPORT_JUMP(unit, ft_type) \ 374 (bcmi_ft_resource_sw_state[unit].bank_offset_export_jump[ft_type]) 375 376 #define BCMI_FT_RESOURCE_SW_INFO_BANK_FILL_BYTES(unit, ft_type) \ 377 (bcmi_ft_resource_sw_state[unit].bank_fill_bytes[ft_type]) 378 379 #define BCMI_FT_RESOURCE_SW_INFO_BANK_NUM_FILLS(unit, ft_type) \ 380 (bcmi_ft_resource_sw_state[unit].bank_num_fills[ft_type]) 381 382 #define BCMI_FT_RESOURCE_SW_INFO_BANK_NUM_LOAD8(unit, ft_type) \ 383 (bcmi_ft_resource_sw_state[unit].num_load8[ft_type]) 384 385 #define BCMI_FT_RESOURCE_SW_INFO_BANK_NUM_LOAD16(unit, ft_type) \ 386 (bcmi_ft_resource_sw_state[unit].num_load16[ft_type]) 387 388 #define BCMI_FT_RESOURCE_SW_INFO_BANK_NUM_TS(unit, ft_type) \ 389 (bcmi_ft_resource_sw_state[unit].num_tsbank[ft_type]) 390 391 #define BCMI_FT_RESOURCE_SW_INFO_CHIP_GRAN(unit) \ 392 (bcmi_ft_resource_sw_state[unit].chip_delay_gran) 393 394 #define BCMI_FT_RESOURCE_SW_INFO_E2E_GRAN(unit) \ 395 (bcmi_ft_resource_sw_state[unit].e2e_delay_gran) 396 397 #define BCMI_FT_RESOURCE_SW_INFO_IPAT_GRAN(unit) \ 398 (bcmi_ft_resource_sw_state[unit].ipat_delay_gran) 399 400 #define BCMI_FT_RESOURCE_SW_INFO_IPDT_GRAN(unit) \ 401 (bcmi_ft_resource_sw_state[unit].ipdt_delay_gran) 402 403 #define BCMI_FT_RESOURCE_SW_INFO_CHIP_OFFSET(unit) \ 404 (bcmi_ft_resource_sw_state[unit].chip_delay_offset) 405 406 #define BCMI_FT_RESOURCE_SW_INFO_E2E_OFFSET(unit) \ 407 (bcmi_ft_resource_sw_state[unit].e2e_delay_offset) 408 409 #define BCMI_FT_RESOURCE_SW_INFO_IPAT_OFFSET(unit) \ 410 (bcmi_ft_resource_sw_state[unit].ipat_delay_offset) 411 412 #define BCMI_FT_RESOURCE_SW_INFO_IPDT_OFFSET(unit) \ 413 (bcmi_ft_resource_sw_state[unit].ipdt_delay_offset) 414 /************************************************************* 415 | End - FT resource tracking structs & defines | 416 */ 417 418 419 /************************************************************* 420 | Start - ALU Hash structs & defines | 421 */ 422 423 /* Hash table defines. */ 424 #define BCMI_FT_ALU_HASH_BUCKETS 1024 425 #define BCMI_FT_ALU_HASH_KEY_LEN_IN_WORDS 8 426 427 /* Below is the information what will be stored 428 * in hash table. */ 429 typedef struct bcmi_ft_alu_hash_info_s { 430 431 /* ALU/LOAD index allocated. */ 432 int alu_load_index; 433 434 /* ALU/LOAD type. */ 435 bcmi_ft_alu_load_type_t alu_load_type; 436 437 /* ALU/LOAD key. */ 438 bcmi_ft_alu_key_t key; 439 440 /* Tracking param. */ 441 uint16 param; 442 443 /* Custom Id */ 444 uint16 custom_id; 445 446 /* Id of this flowchecker. */ 447 bcmi_ft_flowchecker_list_t *head; 448 449 /* Flowtracker type (None/IFT/MFT/EFT). 450 * Not valid for LOAD8/16 memories. */ 451 bcmi_ft_type_t hash_ft_type; 452 453 /* LOAD8/16 banks allocated. */ 454 uint32 hash_load_mem_vector; 455 456 /* Group direction. */ 457 bcm_flowtracker_direction_t direction; 458 459 } bcmi_ft_alu_hash_info_t; 460 461 typedef struct bcmi_ft_alu_entry_list_s { 462 463 /* ALU hash info. */ 464 bcmi_ft_alu_hash_info_t alu_info; 465 466 /* Link to next hash entry. */ 467 struct bcmi_ft_alu_entry_list_s *link; 468 469 } bcmi_ft_alu_entry_list_t; 470 471 typedef struct bcmi_ft_alu_table_hash_s { 472 473 /* Head alu hash entry link. */ 474 bcmi_ft_alu_entry_list_t *head_link; 475 476 } bcmi_ft_alu_table_hash_t; 477 478 /************************************************************* 479 | End - ALU Hash structs & defines | 480 */ 481 482 483 484 /************************************************************* 485 | Start - FT checker structs & defines | 486 */ 487 488 /* Flowtracker checker software info. */ 489 typedef struct bcmi_flowtracker_flowchecker_info_s { 490 491 /* Check flags. */ 492 uint32 flags; 493 494 /* Primary check of this flowchecker. */ 495 bcm_flowtracker_check_info_t check1; 496 497 /* Second check of this flowchecker. */ 498 bcm_flowtracker_check_info_t check2; 499 500 /* Action to be performed for this flowchecker. */ 501 bcm_flowtracker_check_action_info_t action_info; 502 503 /* Export action information for this flowchecker. */ 504 bcm_flowtracker_check_export_info_t export_info; 505 506 /* Delay information for this flowchecker. */ 507 bcm_flowtracker_check_delay_info_t delay_info; 508 509 /* Supported flowtracker type bitmap. */ 510 uint16 check_ft_type_bmp; 511 512 } bcmi_flowtracker_flowchecker_info_t; 513 514 /* Flowtracker checker software state. */ 515 typedef struct bcmi_ft_flowchecker_sw_info_s { 516 517 /* Flowchecker software info. */ 518 bcmi_flowtracker_flowchecker_info_t **bcmi_sw_info; 519 520 /* Flowchecker index bitmap. */ 521 SHR_BITDCL *ft_flowchecker_bitmap; 522 523 /* Flowchecker index reference count. */ 524 uint32 *fc_idx_refcount; 525 526 /* Flowchecker maximum id. */ 527 uint16 max_check; 528 529 } bcmi_ft_flowchecker_sw_state_t; 530 531 extern bcmi_ft_flowchecker_sw_state_t 532 bcmi_ft_flowchecker_state[BCM_MAX_NUM_UNITS]; 533 534 #define BCMI_FT_FLOWCHECKER_BITMAP(unit) \ 535 (bcmi_ft_flowchecker_state[unit].ft_flowchecker_bitmap) 536 537 #define BCMI_FT_FLOWCHECKER_STATE(unit) \ 538 (bcmi_ft_flowchecker_state[unit].bcmi_sw_info) 539 540 #define BCMI_FT_FLOWCHECKER_INFO(unit, index) \ 541 (bcmi_ft_flowchecker_state[unit].bcmi_sw_info[index]) 542 543 #define BCMI_FT_FLOWCHECKER_REFCOUNT_STATE(unit) \ 544 (bcmi_ft_flowchecker_state[unit].fc_idx_refcount) 545 546 #define BCMI_FT_FLOWCHECKER_REFCOUNT(unit, index) \ 547 (bcmi_ft_flowchecker_state[unit].fc_idx_refcount[index]) 548 549 #define BCMI_FT_FLOWCHECKER_REFCOUNT_DEC(unit, index) \ 550 ((bcmi_ft_flowchecker_state[unit].fc_idx_refcount[index])--) 551 552 #define BCMI_FT_FLOWCHECKER_REFCOUNT_INC(unit, index) \ 553 ((bcmi_ft_flowchecker_state[unit].fc_idx_refcount[index])++) 554 555 #define BCMI_FT_FLOWCHECKER_MAX_ID(unit) \ 556 (bcmi_ft_flowchecker_state[unit].max_check) 557 558 /************************************************************* 559 | End - FT checker structs & defines | 560 */ 561 562 563 564 /************************************************************* 565 | Start - ALU/LOAD HW structs & defines | 566 */ 567 568 /* Below is the information that FTFP will send to Group. */ 569 typedef struct bcmi_ft_group_alu_info_s { 570 571 /* Flags. */ 572 uint32 flags; 573 574 /* Check 1 data.*/ 575 bcmi_ft_alu_key_t key1; 576 /* Element type. */ 577 bcm_flowtracker_tracking_param_type_t element_type1; 578 579 /* Check 2 data.*/ 580 bcmi_ft_alu_key_t key2; 581 /* Element type. */ 582 bcm_flowtracker_tracking_param_type_t element_type2; 583 584 /* action data.*/ 585 bcmi_ft_alu_key_t action_key; 586 587 /* Element type. */ 588 bcm_flowtracker_tracking_param_type_t action_element_type; 589 590 /* id of this flowchecker */ 591 bcm_flowtracker_check_t flowchecker_id; 592 593 /* Flowtracker type (None/IFT/MFT/EFT). 594 * Not valid for LOAD8/16 memories. */ 595 bcmi_ft_type_t alu_ft_type; 596 597 /* These are needed for warmboot and may be for SER. */ 598 int alu_load_index; 599 600 /* ALU/LOAD type */ 601 bcmi_ft_alu_load_type_t alu_load_type; 602 603 /* Flow direction */ 604 bcm_flowtracker_direction_t direction; 605 606 /* Custom Ids for Key1 */ 607 uint16 custom_id1; 608 609 /* Custom Ids for Key2 */ 610 uint16 custom_id2; 611 612 /* Custom Ids for action_key */ 613 uint16 action_custom_id; 614 615 } bcmi_ft_group_alu_info_t; 616 617 typedef struct bcmi_ft_element_alu_info_s { 618 619 /* Tracking param type. */ 620 bcm_flowtracker_tracking_param_type_t element; 621 622 /* Flowchecker operation. */ 623 bcm_flowtracker_check_operation_t operation; 624 625 /* Flowchecker action. */ 626 bcm_flowtracker_check_action_t action; 627 628 } bcmi_ft_element_alu_info_t; 629 630 /* Select packet attribute from Extracted bus for check */ 631 #define BCMI_FT_ALU_ATTR_SELECT_EXTRACTION 0 632 633 /* Select byte count for check */ 634 #define BCMI_FT_ALU_ATTR_SELECT_BYTE_COUNT 1 635 636 /* ALU Check logic Kmap bit selection */ 637 /* DO NOT CHANGE. Hw encoding */ 638 #define BCMI_FT_ALU_KMAP_BIT_SEL_CHECK0_RES 0 639 #define BCMI_FT_ALU_KMAP_BIT_SEL_CHECK1_RES 1 640 #define BCMI_FT_ALU_KMAP_BIT_SEL_PKT_FLAGS0 2 641 #define BCMI_FT_ALU_KMAP_BIT_SEL_PKT_FLAGS1 3 642 #define BCMI_FT_ALU_KMAP_BIT_SEL_PKT_FLAGS2 4 643 #define BCMI_FT_ALU_KMAP_BIT_SEL_PKT_FLAGS3 5 644 #define BCMI_FT_ALU_KMAP_BIT_SEL_PKT_FLAGS4 6 645 #define BCMI_FT_ALU_KMAP_BIT_SEL_STATE_TRIG 7 646 647 /* Vector definitions for various ALU/LOAD methods. */ 648 typedef struct bcmi_ft_alu_load_method_s { 649 650 int (*alu_load_match)(int unit, 651 bcm_flowtracker_group_t id, 652 bcmi_ft_group_alu_info_t *temp, 653 bcmi_ft_alu_hash_info_t *alu_info, 654 int *load16_indexes, int *index); 655 656 int (*alu_load_install)( 657 int unit, 658 bcm_flowtracker_group_t id, 659 bcmi_ft_group_alu_info_t *info, 660 int *indexes); 661 662 int (*alu_load_uninstall)( 663 int unit, 664 bcm_flowtracker_group_t id, 665 bcmi_ft_group_alu_info_t *info, 666 int *indexes); 667 668 } bcmi_ft_alu_load_method_t; 669 670 extern 671 bcmi_ft_alu_load_method_t 672 *alu_load_methods[BCMI_FT_ALU_LOAD_MEMS]; 673 674 /* ALU/LOAD match methods. */ 675 #define bcmi_ft_method_match(type) \ 676 (alu_load_methods[type]->alu_load_match) 677 678 #define BCMI_FT_METHOD_MATCH_CHECK(type) \ 679 do { \ 680 if (!bcmi_ft_method_match(type)) { \ 681 rv = BCM_E_UNAVAIL; \ 682 } \ 683 } while(0); 684 685 #define BCMI_FT_METHOD_MATCH_EXEC(type) \ 686 (*(bcmi_ft_method_match(type))) 687 688 689 /* ALU/LOAD Install methods. */ 690 #define bcmi_ft_method_install(type) \ 691 (alu_load_methods[type]->alu_load_install) 692 693 #define BCMI_FT_METHOD_INSTALL_CHECK(type) \ 694 do { \ 695 if (!bcmi_ft_method_install(type)) { \ 696 rv = BCM_E_UNAVAIL; \ 697 } \ 698 } while(0); 699 700 #define BCMI_FT_METHOD_INSTALL_EXEC(type) \ 701 (*(bcmi_ft_method_install(type))) 702 703 /* ALU/LOAD uninstall methods. */ 704 #define bcmi_ft_method_uninstall(type) \ 705 (alu_load_methods[type]->alu_load_uninstall) 706 707 #define BCMI_FT_METHOD_UNINSTALL_CHECK(type) \ 708 do { \ 709 if (!bcmi_ft_method_uninstall(type)) { \ 710 rv = BCM_E_UNAVAIL; \ 711 } \ 712 } while(0); 713 714 #define BCMI_FT_METHOD_UNINSTALL_EXEC(type) \ 715 (*(bcmi_ft_method_uninstall(type))) 716 717 /************************************************************* 718 | End - ALU/LOAD HW structs & defines | 719 */ 720 721 722 723 /************************************************************* 724 | Start - Chip debug structs & defines | 725 */ 726 727 typedef struct bcmi_ft_chip_debug_param_s { 728 729 /* Tracking param type. */ 730 bcm_flowtracker_tracking_param_type_t param; 731 732 /* ALU/LOAD type. */ 733 bcmi_ft_alu_load_type_t alu_type; 734 735 /* Memory identifier. */ 736 int mem_id; 737 738 /* Count. */ 739 uint32 count; 740 741 } bcmi_ft_chip_debug_param_t; 742 743 typedef struct bcmi_ft_chip_debug_s { 744 745 /* Chip debug enable status. */ 746 int chip_debug_enable; 747 748 /* Number of debug information. */ 749 int num_debug_info; 750 751 /* ALU32 mem resource used. */ 752 int alu32_mem_used[TOTAL_GROUP_ALU32_MEM]; 753 754 /* ALU16 mem resource used. */ 755 int alu16_mem_used[TOTAL_GROUP_ALU16_MEM]; 756 757 /* ALU32 mem resource reference count. */ 758 int alu32_ref_count[TOTAL_GROUP_ALU32_MEM]; 759 760 /* ALU16 mem resource reference count. */ 761 int alu16_ref_count[TOTAL_GROUP_ALU16_MEM]; 762 763 /* Chip debug param information. */ 764 bcmi_ft_chip_debug_param_t *param_info; 765 766 } bcmi_ft_chip_debug_t; 767 768 extern 769 bcmi_ft_chip_debug_t chip_debug_info[BCM_MAX_NUM_UNITS]; 770 771 #define BCMI_FT_CHIP_DEBUG_INFO(unit) \ 772 (chip_debug_info[unit]) 773 774 #define BCMI_FT_CHIP_DEBUG_ENABLE(unit) \ 775 ((chip_debug_info[unit]).chip_debug_enable) 776 777 #define BCMI_FT_CHIP_NUM_DEBUG_INFO(unit) \ 778 ((chip_debug_info[unit]).num_debug_info) 779 780 #define BCMI_FT_CHIP_DEBUG_PARAM_INFO(unit) \ 781 (chip_debug_info[unit].param_info) 782 783 #define BCMI_FT_CHIP_DEBUG_PARAM(unit, id) \ 784 (chip_debug_info[unit].param_info[id]) 785 786 /************************************************************* 787 | End - Chip debug structs & defines | 788 */ 789 790 791 792 793 /************************************************************* 794 | Start - FT resource methods | 795 */ 796 797 extern int 798 bcmi_ft_alu_load_init(int unit); 799 800 extern void 801 bcmi_ft_alu_load_cleanup(int unit); 802 803 /************************************************************* 804 | End - FT resource methods | 805 */ 806 807 808 809 /************************************************************* 810 | Start - ALU Hash methods | 811 */ 812 813 extern int 814 bcmi_ft_alu_hash_init(int unit); 815 816 extern void 817 bcmi_ft_alu_hash_cleanup(int unit); 818 819 /* Functions for hash insert/remove. */ 820 extern int 821 bcmi_ft_alu_hash_insert( 822 int unit, bcm_flowtracker_group_t id, 823 bcmi_ft_alu_load_type_t alu_load_type, 824 bcmi_ft_group_alu_info_t *group_alu_info, 825 int *load_indexes, 826 int *alu_load_index); 827 828 extern int 829 bcmi_ft_alu_hash_remove( 830 int unit, bcm_flowtracker_group_t id, 831 bcmi_ft_alu_load_type_t alu_load_type, 832 bcmi_ft_group_alu_info_t *group_alu_info, 833 int *load_indexes, 834 int *alu_load_index); 835 836 extern int 837 bcmi_ft_alu_hash_mem_index_get ( 838 int unit, bcm_flowtracker_group_t id, 839 bcmi_ft_alu_load_type_t alu_load_type, 840 bcmi_ft_group_alu_info_t *group_alu_info, 841 int *load_indexes, 842 int *alu_load_index); 843 844 extern int 845 bcmi_ft_alu_load_compare( 846 int unit, bcm_flowtracker_group_t id, 847 bcmi_ft_group_alu_info_t *group_alu_info, 848 bcmi_ft_alu_load_type_t alu_load_type, 849 bcmi_ft_alu_hash_info_t *alu_info, 850 int *indexes); 851 852 extern int 853 bcmi_ft_alu_check16_mapping_get( 854 int unit, 855 bcm_flowtracker_group_t id, 856 bcm_flowtracker_check_t *check_map); 857 858 extern int 859 bcmi_ft_alu_load_hash_dump( 860 int unit); 861 862 /************************************************************* 863 | End - ALU Hash methods | 864 */ 865 866 867 /************************************************************* 868 | Start - ALU hardware methods | 869 */ 870 871 extern int 872 bcmi_ft_alu_entry_match( 873 int unit, 874 bcm_flowtracker_group_t id, 875 bcmi_ft_group_alu_info_t *temp, 876 bcmi_ft_alu_hash_info_t *alu_info, 877 int *load8_indexes, int *index); 878 879 extern int 880 bcmi_ft_alu32_entry_install( 881 int unit, bcm_flowtracker_group_t id, 882 bcmi_ft_group_alu_info_t *info, 883 int *indexes); 884 885 extern int 886 bcmi_ft_alu32_entry_uninstall( 887 int unit, bcm_flowtracker_group_t id, 888 bcmi_ft_group_alu_info_t *info, 889 int *indexes); 890 891 extern int 892 bcmi_ft_alu16_entry_install( 893 int unit, bcm_flowtracker_group_t id, 894 bcmi_ft_group_alu_info_t *info, 895 int *indexes); 896 897 extern int 898 bcmi_ft_alu16_entry_uninstall( 899 int unit, bcm_flowtracker_group_t id, 900 bcmi_ft_group_alu_info_t *info, 901 int *indexes); 902 903 extern int 904 bcmi_ft_load16_entry_match( 905 int unit, 906 bcm_flowtracker_group_t id, 907 bcmi_ft_group_alu_info_t *temp, 908 bcmi_ft_alu_hash_info_t *alu_info, 909 int *load16_indexes, int *index); 910 911 extern int 912 bcmi_ft_load16_entry_install( 913 int unit, bcm_flowtracker_group_t id, 914 bcmi_ft_group_alu_info_t *info, 915 int *indexes); 916 917 extern int 918 bcmi_ft_load16_entry_uninstall( 919 int unit, 920 bcm_flowtracker_group_t id, 921 bcmi_ft_group_alu_info_t *info, 922 int *indexes); 923 924 extern int 925 bcmi_ft_load8_entry_match( 926 int unit, 927 bcm_flowtracker_group_t id, 928 bcmi_ft_group_alu_info_t *temp, 929 bcmi_ft_alu_hash_info_t *alu_info, 930 int *load8_indexes, int *index); 931 932 extern int 933 bcmi_ft_load8_entry_install( 934 int unit, bcm_flowtracker_group_t id, 935 bcmi_ft_group_alu_info_t *info, 936 int *indexes); 937 938 extern int 939 bcmi_ft_load8_entry_uninstall( 940 int unit, 941 bcm_flowtracker_group_t id, 942 bcmi_ft_group_alu_info_t *info, 943 int *indexes); 944 945 /* Utility Functions - install/uninstall. */ 946 extern int 947 bcmi_ft_flowchecker_alu_base_control_set( 948 int unit, 949 bcm_flowtracker_group_t id, 950 bcmi_ft_group_alu_info_t *info, 951 uint32 *alu_fmt); 952 953 extern int 954 bcmi_ft_load16_entry_write( 955 int unit, bcm_flowtracker_group_t id, 956 bcmi_ft_group_alu_info_t *temp, 957 int *load16_indexes, int index); 958 959 extern int 960 bcmi_ft_load8_entry_write( 961 int unit, bcm_flowtracker_group_t id, 962 bcmi_ft_group_alu_info_t *temp, 963 int *load8_indexes, int index); 964 965 extern int 966 bcmi_ft_load16_entry_clear(int unit, int index); 967 968 /* Utility Functions - index. */ 969 extern int 970 bcmi_ft_alu_check_free_index( 971 int unit, 972 bcm_flowtracker_group_t id, 973 bcmi_ft_alu_load_type_t alu_load_type, 974 int index); 975 976 extern int 977 bcmi_ft_alu_get_free_index( 978 int unit, 979 bcm_flowtracker_group_t id, 980 bcmi_ft_alu_load_type_t alu_load_type, 981 bcmi_ft_group_alu_info_t *group_alu_info, 982 int *load_indexes, 983 int *index); 984 985 extern void 986 bcmi_ft_alu_load_mem_index_get( 987 int unit, 988 int index, bcmi_ft_alu_load_type_t type, 989 int *new_index, soc_mem_t *mem, int *bit); 990 991 /* Utility methods - other. */ 992 extern void 993 bcmi_ft_alu_load_pdd_mem_get(int unit, 994 bcmi_ft_type_t ft_type, 995 soc_mem_t *mem); 996 997 extern int 998 bcmi_ft_alu_hw_operation_get( 999 int unit, 1000 bcm_flowtracker_check_operation_t operation, 1001 int *check_0_operation, 1002 int *check_1_operation); 1003 1004 extern int 1005 bcmi_ft_flowchecker_opr_is_dual( 1006 int unit, 1007 bcm_flowtracker_check_operation_t operation); 1008 1009 extern int 1010 bcmi_ft_alu_hw_action_get( 1011 int unit, 1012 bcmi_ft_group_alu_info_t *alu_info, 1013 bcm_flowtracker_check_action_t action, 1014 int * hw_action); 1015 1016 extern void 1017 bcmi_ft_group_alu_action_shift_bits_get( 1018 int unit, 1019 bcm_flowtracker_check_action_t action, 1020 bcmi_ft_group_alu_info_t *info, 1021 int *action_shift_bits); 1022 1023 extern int 1024 bcmi_ft_group_alu_load_trigger_set( 1025 int unit, 1026 bcm_flowtracker_group_t id, 1027 bcm_flowtracker_direction_t direction); 1028 1029 extern int 1030 bcmi_ft_alu_load_values_normalize(int unit, 1031 bcmi_ft_group_alu_info_t *info, 1032 int *length, 1033 int *alu); 1034 1035 extern int 1036 bcmi_ft_alu_load_type_get( 1037 int unit, 1038 int alu, 1039 int length, 1040 bcmi_ft_alu_load_type_t *type); 1041 1042 #ifdef BCM_FLOWTRACKER_V2_SUPPORT 1043 extern void 1044 bcmi_ftv2_get_load_mem_vector(int unit, 1045 bcm_flowtracker_group_t id, 1046 bcmi_ft_alu_load_type_t alu_load_type, 1047 int *load_indexes, 1048 uint32 *load_mem_vector); 1049 #endif /* BCM_FLOWTRACKER_V2_SUPPORT */ 1050 1051 extern int 1052 bcmi_ft_group_alu_load_index_match( 1053 int unit, 1054 bcm_flowtracker_group_t id, 1055 bcmi_ft_alu_load_type_t alu_load_type, 1056 bcmi_ft_alu_hash_info_t *alu_info); 1057 1058 extern int 1059 bcmi_ft_tracking_param_in_Debug_mode(int unit, 1060 bcm_flowtracker_group_t id, 1061 bcmi_ft_group_alu_info_t *group_alu_info, 1062 bcmi_ft_alu_load_type_t alu_load_type); 1063 1064 extern int 1065 bcmi_ft_chip_debug_counter_get(int unit, 1066 int mem_idx, 1067 bcmi_ft_alu_load_type_t alu_load_type, 1068 uint32 *count); 1069 1070 extern void 1071 bcmi_ft_chip_debug_use_mem_update(int unit, 1072 bcmi_ft_alu_load_type_t alu_load_type, 1073 int mem_idx, 1074 int val); 1075 1076 extern int 1077 bcmi_ft_chip_debug_mem_check(int unit, 1078 bcmi_ft_alu_load_type_t alu_load_type, 1079 int mem_idx); 1080 1081 extern int 1082 bcmi_ft_chip_debug_info_get(int unit, 1083 int max_size, 1084 bcm_flowtracker_chip_debug_info_t *info, 1085 int *num_debug_info); 1086 1087 extern int 1088 bcmi_ft_chip_debug_alu_index_get(int unit, 1089 bcm_flowtracker_group_t id, 1090 bcmi_ft_group_alu_info_t *group_alu_info, 1091 bcmi_ft_alu_load_type_t alu_load_type, 1092 int *index); 1093 1094 extern int 1095 bcmi_ft_chip_debug_data_sanity(int unit, 1096 int num_info, 1097 bcm_flowtracker_chip_debug_info_t *info); 1098 1099 /* Get the matching data from valid pdd entry. */ 1100 extern int 1101 bcmi_ft_group_alu_load_index_match_data_get(int unit, 1102 bcm_flowtracker_group_t id, 1103 bcmi_ft_alu_load_type_t alu_load_type, 1104 int iter, 1105 bcmi_ft_group_alu_info_t **temp); 1106 1107 extern int 1108 bcmi_ft_group_alu_load_pdd_status_get(int unit, 1109 bcm_flowtracker_group_t id, 1110 uint32 *in_pdd_entry, 1111 bcmi_ft_alu_load_type_t alu_load_type, 1112 int iter); 1113 1114 extern int 1115 bcmi_ft_tracking_param_weight_hw_val_get( 1116 int unit, 1117 bcm_flowtracker_tracking_param_weight_t weight, 1118 uint32 *hw_val); 1119 1120 extern int 1121 bcmit_ft_tracking_param_weight_enum_get( 1122 int unit, 1123 uint32 hw_val, 1124 bcm_flowtracker_tracking_param_weight_t *weight); 1125 1126 extern int 1127 bcmi_ft_check_ft_type_bmp_set( 1128 int unit, 1129 bcmi_flowtracker_flowchecker_info_t *fc_info); 1130 1131 /************************************************************* 1132 | End - ALU hardware methods | 1133 */ 1134 1135 1136 1137 /************************************************************* 1138 | Start - Chip debug methods | 1139 */ 1140 1141 extern int 1142 bcmi_ft_chip_debug_info_set(int unit, 1143 int num_info, 1144 bcm_flowtracker_chip_debug_info_t *info); 1145 1146 extern int 1147 bcmi_ft_chip_debug_info_get(int unit, 1148 int max_size, 1149 bcm_flowtracker_chip_debug_info_t *info, 1150 int *num_debug_info); 1151 1152 /************************************************************* 1153 | End - Chip debug methods | 1154 */ 1155 1156 1157 1158 /************************************************************* 1159 | Start - Flowtracker version 2 methods | 1160 */ 1161 1162 #if defined(BCM_FLOWTRACKER_V2_SUPPORT) 1163 extern int 1164 bcmi_ftv2_alu_load_mem_config_init(int unit); 1165 1166 extern int 1167 bcmi_ftv2_resource_info_init(int unit); 1168 1169 extern int 1170 bcmi_ftv2_group_alu_mask_set(int unit, 1171 bcmi_ft_group_alu_info_t *alu_info, 1172 bcmi_flowtracker_flowchecker_info_t *fc_info, 1173 uint32 *alu_fmt); 1174 1175 extern int 1176 bcmi_ftv2_group_alu16_mask_clear(int unit, 1177 soc_mem_t mem, 1178 int index); 1179 1180 extern int 1181 bcmi_ftv2_group_alu32_mask_clear(int unit, 1182 bcmi_ft_alu_load_type_t alu_load_type, 1183 soc_mem_t mem, 1184 int index); 1185 1186 extern int 1187 bcmi_ftv2_group_param_delay_set(int unit, 1188 bcm_flowtracker_group_t id, 1189 bcmi_ft_group_alu_info_t *alu_info, 1190 uint32 *alu32_specific_ctrlfmt); 1191 1192 extern int 1193 bcmi_ftv2_group_check_delay_set(int unit, 1194 bcm_flowtracker_group_t id, 1195 bcmi_flowtracker_flowchecker_info_t *fc_info, 1196 uint32 *alu32_specific_ctrlfmt); 1197 extern int 1198 bcmi_ftv2_alu_hw_timestamp_get(int unit, 1199 bcm_flowtracker_group_t id, 1200 int user_req, 1201 bcm_flowtracker_timestamp_source_t sw_ts, 1202 int *hw_ts); 1203 #endif /* BCM_FLOWTRACKER_V2_SUPPORT */ 1204 1205 /************************************************************* 1206 | End - Flowtracker version 2 methods | 1207 */ 1208 1209 /************************************************************* 1210 | Start - Flowtracker version 3 methods | 1211 */ 1212 1213 #if defined(BCM_FLOWTRACKER_V3_SUPPORT) 1214 extern int 1215 bcmi_ftv3_alu_load_mem_config_init(int unit); 1216 1217 extern void 1218 bcmi_ftv3_alu_check_attr_select_get(int unit, 1219 bcmi_flowtracker_flowchecker_info_t *fc_info, 1220 int *check1_attr_sel, 1221 int *check2_attr_sel, 1222 int *update_attr_sel); 1223 1224 #endif /* BCM_FLOWTRACKER_V3_SUPPORT */ 1225 1226 /************************************************************* 1227 | End - Flowtracker version 3 methods | 1228 */ 1229 1230 #endif /* BCM_FLOWTRACKER_SUPPORT */ 1231 #endif /* _BCM_INT_FT_ALU_H_ */