field.h (364918B)
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-2019 Broadcom Inc. All rights reserved. 6 * 7 * File: field.h 8 * Purpose: Internal Field Processor data structure definitions for the 9 * BCM library. 10 */ 11 12 #ifndef _BCM_INT_FIELD_H 13 #define _BCM_INT_FIELD_H 14 15 #include <bcm/field.h> 16 #include <bcm_int/common/field.h> 17 18 #include <soc/mem.h> 19 #include <soc/profile_mem.h> 20 #include <soc/er_tcam.h> 21 22 #include <sal/core/sync.h> 23 #include <bcm_int/esw/xgs4.h> 24 #include <bcm_int/esw/keygen_api.h> 25 #include <bcm/flowtracker.h> 26 #include <bcm_int/esw/flowtracker/ft_field.h> 27 28 #ifdef BCM_FIELD_SUPPORT 29 30 /* 31 *Macro: 32 * FP_LOCK 33 * Purpose: 34 * Lock take the Field control mutex 35 */ 36 #define FP_LOCK(unit) \ 37 sal_mutex_take(SOC_CONTROL(unit)->fp_lock, sal_mutex_FOREVER) 38 39 /* 40 * Macro: 41 * FP_UNLOCK 42 * Purpose: 43 * Lock take the Field control mutex 44 */ 45 #define FP_UNLOCK(unit) \ 46 sal_mutex_give(SOC_CONTROL(unit)->fp_lock); 47 48 #define BCM_IF_ERROR_CLEANUP(rv) \ 49 do { \ 50 if (rv < 0) { \ 51 goto cleanup; \ 52 } \ 53 } while(0) 54 55 #define _FP_PORT_BITWIDTH(_unit_) \ 56 ((SOC_IS_TOMAHAWKX(_unit_) || SOC_IS_TRIDENT3X(_unit_)) ? 8 : \ 57 (SOC_IS_TD_TT(_unit_) || SOC_IS_KATANAX(_unit_) || \ 58 SOC_IS_TRIUMPH3(_unit_) || \ 59 SOC_IS_GREYHOUND2(_unit_)) ? 7 : 6) 60 61 #define _FP_MCAST_D_TYPE_OFFSET(_unit_) \ 62 ((SOC_IS_TRIDENT2X(unit) ||SOC_IS_TITAN2PLUS(unit) || \ 63 SOC_IS_TRIUMPH3(unit)) ? (18) : \ 64 ((SOC_IS_TD_TT(unit) || SOC_IS_KATANAX(unit)) ? (16) : \ 65 (14))); 66 67 #define _FP_GLOBAL_INST (-1) 68 69 #define _FP_2PIPE_MEM_IDENTIFIER_GET(_mem_, _name1_, _name2_, _inst_) \ 70 { \ 71 if (_inst_ == 0) { \ 72 _mem_ = _name1_ ## _ ## _name2_ ## 0 ## m; \ 73 } else if (_inst_ == 1) { \ 74 _mem_ = _name1_ ## _ ## _name2_ ## 1 ## m; \ 75 } else if (_inst_ == _FP_GLOBAL_INST) { \ 76 _mem_ = _name1_ ## m; \ 77 } \ 78 } 79 80 #define _FP_4PIPE_MEM_IDENTIFIER_GET(_mem_, _name1_, _name2_, _inst_) \ 81 { \ 82 if (_inst_ == 0) { \ 83 _mem_ = _name1_ ## _ ## _name2_ ## 0 ## m; \ 84 } else if (_inst_ == 1) { \ 85 _mem_ = _name1_ ## _ ## _name2_ ## 1 ## m; \ 86 } else if (_inst_ == 2) { \ 87 _mem_ = _name1_ ## _ ## _name2_ ## 2 ## m; \ 88 } else if (_inst_ == 3) { \ 89 _mem_ = _name1_ ## _ ## _name2_ ## 3 ## m; \ 90 } else if (_inst_ == _FP_GLOBAL_INST) { \ 91 _mem_ = _name1_ ## m; \ 92 } \ 93 } 94 95 #define _FP_8PIPE_MEM_IDENTIFIER_GET(_mem_, _name1_, _name2_, _inst_) \ 96 { \ 97 if (_inst_ == 0) { \ 98 _mem_ = _name1_ ## _ ## _name2_ ## 0 ## m; \ 99 } else if (_inst_ == 1) { \ 100 _mem_ = _name1_ ## _ ## _name2_ ## 1 ## m; \ 101 } else if (_inst_ == 2) { \ 102 _mem_ = _name1_ ## _ ## _name2_ ## 2 ## m; \ 103 } else if (_inst_ == 3) { \ 104 _mem_ = _name1_ ## _ ## _name2_ ## 3 ## m; \ 105 } else if (_inst_ == 4) { \ 106 _mem_ = _name1_ ## _ ## _name2_ ## 4 ## m; \ 107 } else if (_inst_ == 5) { \ 108 _mem_ = _name1_ ## _ ## _name2_ ## 5 ## m; \ 109 } else if (_inst_ == 6) { \ 110 _mem_ = _name1_ ## _ ## _name2_ ## 6 ## m; \ 111 } else if (_inst_ == 7) { \ 112 _mem_ = _name1_ ## _ ## _name2_ ## 7 ## m; \ 113 } else if (_inst_ == _FP_GLOBAL_INST) { \ 114 _mem_ = _name1_ ## m; \ 115 } \ 116 } 117 118 #define _FP_2PIPE_REG_IDENTIFIER_GET(_reg_, _name1_, _name2_, _inst_) \ 119 { \ 120 if (_inst_ == 0) { \ 121 _reg_ = _name1_ ## _ ## _name2_ ## 0 ## r; \ 122 } else if (_inst_ == 1) { \ 123 _reg_ = _name1_ ## _ ## _name2_ ## 1 ## r; \ 124 } else if (_inst_ == _FP_GLOBAL_INST) { \ 125 _reg_ = _name1_ ## r; \ 126 } \ 127 } 128 129 #define _FP_4PIPE_REG_IDENTIFIER_GET(_mem_, _name1_, _name2_, _inst_) \ 130 { \ 131 if (_inst_ == 0) { \ 132 _mem_ = _name1_ ## _ ## _name2_ ## 0 ## r; \ 133 } else if (_inst_ == 1) { \ 134 _mem_ = _name1_ ## _ ## _name2_ ## 1 ## r; \ 135 } else if (_inst_ == 2) { \ 136 _mem_ = _name1_ ## _ ## _name2_ ## 2 ## r; \ 137 } else if (_inst_ == 3) { \ 138 _mem_ = _name1_ ## _ ## _name2_ ## 3 ## r; \ 139 } else if (_inst_ == _FP_GLOBAL_INST) { \ 140 _mem_ = _name1_ ## r; \ 141 } \ 142 } 143 144 #define _FP_8PIPE_REG_IDENTIFIER_GET(_reg_, _name1_, _name2_, _inst_) \ 145 { \ 146 if (_inst_ == 0) { \ 147 _reg_ = _name1_ ## _ ## _name2_ ## 0 ## r; \ 148 } else if (_inst_ == 1) { \ 149 _reg_ = _name1_ ## _ ## _name2_ ## 1 ## r; \ 150 } else if (_inst_ == 2) { \ 151 _reg_ = _name1_ ## _ ## _name2_ ## 2 ## r; \ 152 } else if (_inst_ == 3) { \ 153 _reg_ = _name1_ ## _ ## _name2_ ## 3 ## r; \ 154 } else if (_inst_ == 4) { \ 155 _reg_ = _name1_ ## _ ## _name2_ ## 4 ## r; \ 156 } else if (_inst_ == 5) { \ 157 _reg_ = _name1_ ## _ ## _name2_ ## 5 ## r; \ 158 } else if (_inst_ == 6) { \ 159 _reg_ = _name1_ ## _ ## _name2_ ## 6 ## r; \ 160 } else if (_inst_ == 7) { \ 161 _reg_ = _name1_ ## _ ## _name2_ ## 7 ## r; \ 162 } else if (_inst_ == _FP_GLOBAL_INST) { \ 163 _reg_ = _name1_ ## r; \ 164 } \ 165 } 166 167 #define _FIELD_IS_INTERNAL_UDF_QUAL(_qid_) ((_bcmFieldQualifyData0 == (_qid_)) \ 168 || (_bcmFieldQualifyData1 == (_qid_)) \ 169 || (_bcmFieldQualifyData2 == (_qid_)) \ 170 || (_bcmFieldQualifyData3 == (_qid_)) \ 171 || (_bcmFieldQualifyData4 == (_qid_)) \ 172 || (_bcmFieldQualifyData5 == (_qid_)) \ 173 || (_bcmFieldQualifyData6 == (_qid_)) \ 174 || (_bcmFieldQualifyData7 == (_qid_)) \ 175 || (_bcmFieldQualifyData8 == (_qid_)) \ 176 || (_bcmFieldQualifyData9 == (_qid_)) \ 177 || (_bcmFieldQualifyData10 == (_qid_)) \ 178 || (_bcmFieldQualifyData11 == (_qid_)) \ 179 || (_bcmFieldQualifyData12 == (_qid_)) \ 180 || (_bcmFieldQualifyData13 == (_qid_)) \ 181 || (_bcmFieldQualifyData14 == (_qid_)) \ 182 || (_bcmFieldQualifyData15 == (_qid_))) 183 184 #define _FP_INVALID_INDEX (-1) 185 186 /* 64 bit software counter collection bucket. */ 187 #define _FP_64_COUNTER_BUCKET 512 188 189 /* Maximum number of paired slices.*/ 190 #define _FP_PAIR_MAX (3) 191 extern int 192 _bcm_internal_field_action_add(int unit, 193 bcm_field_entry_t src_entry, 194 bcm_field_entry_t entry, 195 bcm_field_action_t action, 196 uint32 param0, 197 uint32 param1); 198 #if defined (BCM_TRIUMPH3_SUPPORT) 199 200 typedef struct _field_action_l2mod_index_bmp_s { 201 SHR_BITDCL *w; 202 } _field_action_l2mod_index_bmp_t; 203 204 #endif 205 206 #if defined (BCM_KATANA_SUPPORT) 207 /* linked list to hold fabricQueue action params*/ 208 typedef struct _field_fabricQueue_action_s { 209 uint32 queue_index; /* cosQ index */ 210 uint32 profile_index; /* cosQ profile index */ 211 int reference_count; /* Reference count */ 212 struct _field_fabricQueue_action_s *next; 213 } _field_fabricQueue_action_t; 214 #endif /* (BCM_KATANA_SUPPORT)*/ 215 216 /* Macro to find the PBMP support in a multi-pipe tcam slice mode */ 217 #if defined(BCM_TOMAHAWK_SUPPORT) 218 #define _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(_g_flags) \ 219 (((_g_flags & _FP_GROUP_SPAN_SINGLE_SLICE) && \ 220 (_g_flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)) || \ 221 (_g_flags & _FP_GROUP_SPAN_DOUBLE_SLICE) || \ 222 (_g_flags & _FP_GROUP_SPAN_TRIPLE_SLICE)) 223 #else 224 #define _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(_g_flags) 0 225 #endif /*BCM_TOMAHAWK_SUPPORT */ 226 /* 227 * Meter mode. 228 */ 229 #define _BCM_FIELD_METER_BOTH (BCM_FIELD_METER_PEAK | \ 230 BCM_FIELD_METER_COMMITTED) 231 232 /* Value for control->tcam_ext_numb that indicates there is no external TCAM. */ 233 #define FP_EXT_TCAM_NONE _FP_INVALID_INDEX 234 235 /* 236 * Initial group IDs and entry IDs. 237 */ 238 #define _FP_ID_BASE 1 239 #define _FP_ID_MAX (0x1000000) 240 241 /* This IDs are reserved for internal use */ 242 #define _FP_INTERNAL_RESERVED_ID_MAX 0xFFFFFFFF 243 #define _FP_INTERNAL_RESERVED_ID_MIN 0xFFFFF000 244 /* Currently used reserved id */ 245 #define _FP_INTERNAL_RESERVED_ID (_FP_INTERNAL_RESERVED_ID_MIN) 246 /* Used for TH3 EM COS SW WAR */ 247 #define _FP_INTERNAL_RESERVED_EM_ID (_FP_INTERNAL_RESERVED_ID_MIN + 1) 248 #define _FP_PRESEL_INTERNAL_RESERVED_ID (_BCM_FIELD_PRESEL_ID_MAX - 1) 249 250 /* 251 * Field Group IDs reserved for FLOWTRACKER module 252 * To create EXACTMATCH groups. 253 */ 254 #define _FP_FLOWTRACKER_RESERVED_EM_GID_MAX 0xF910117F 255 #define _FP_FLOWTRACKER_RESERVED_EM_GID_MIN 0xF9101170 256 #define _FP_FLOWTRACKER_RESERVED_EM_GID_AFTER_SHIFT 0xF910117 257 #define _FP_FLOWTRACKER_RESERVED_EM_GID_SHIFT_VAL 0x4 258 259 /* 260 * Range of Hint Ids. 261 */ 262 #define _FP_HINT_ID_BASE (0x1) 263 #define _FP_HINT_ID_MAX (0x400) 264 #define _FP_MAX_HINTS_PER_HINTID (0x100) 265 266 /* 267 * Action flags. 268 */ 269 /* Action valid. */ 270 #define _FP_ACTION_VALID (1 << 0) 271 /* Reinstall is required. */ 272 #define _FP_ACTION_DIRTY (1 << 1) 273 /* Remove action from hw. */ 274 #define _FP_ACTION_RESOURCE_FREE (1 << 2) 275 /* Action was updated free previously used hw resources. */ 276 #define _FP_ACTION_OLD_RESOURCE_FREE (1 << 3) 277 278 #define _FP_ACTION_MODIFY (1 << 4) 279 280 #define _FP_ACTION_HW_FREE (_FP_ACTION_RESOURCE_FREE | \ 281 _FP_ACTION_OLD_RESOURCE_FREE) 282 283 #define _FP_ACTION_POLICER_SW_UPDATE (1 << 5) 284 #if defined (BCM_TOMAHAWK_SUPPORT) 285 #define _BCM_FIELD_ACTION_CTC_MANIPULATE_FLAG (1 << 6) 286 #endif /* BCM_TOMAHAWK_SUPPORT */ 287 #define _BCM_FIELD_ACTION_REF_STALE (1 << 7) 288 289 /* Oam Stat Action flags */ 290 #define _FP_OAM_STAT_ACTION_VALID (1 << 0) 291 #define _FP_OAM_STAT_ACTION_DIRTY (1 << 1) 292 293 /* Field policy table Cos queue priority hw modes */ 294 #define _FP_ACTION_UCAST_MCAST_QUEUE_NEW_MODE 0x1 295 #define _FP_ACTION_UCAST_QUEUE_CHANGE 0x2 296 #define _FP_ACTION_UCAST_QUEUE_NEW_MODE 0x8 297 #define _FP_ACTION_MCAST_QUEUE_NEW_MODE 0x9 298 /* Action set unicast queue value */ 299 #define _FP_ACTION_UCAST_QUEUE_SET(q) ((q) & (0xf)) 300 /* Action set multicast queue value */ 301 #define _FP_ACTION_MCAST_QUEUE_SET(q) (((q) & 0x7) << 4) 302 /* Action get unicast queue value */ 303 #define _FP_ACTION_UCAST_QUEUE_GET(q) ((q) & (0xf)) 304 /* Action get multicast queue value */ 305 #define _FP_ACTION_MCAST_QUEUE_GET(q) (((q) >> 4) & 0x7) 306 /* Action set both unicast and multicast queue value */ 307 #define _FP_ACTION_UCAST_MCAST_QUEUE_SET(u,m) ((_FP_ACTION_UCAST_QUEUE_SET(u)) | \ 308 (_FP_ACTION_MCAST_QUEUE_SET(m))) 309 310 /* 311 * Maximum number of meter pools 312 * Should change when new chips are defined 313 */ 314 #define _FIELD_MAX_METER_POOLS 20 315 316 #define _FIELD_MAX_CNTR_POOLS 20 317 318 /* 319 * Internal version of qset add that will allow Data[01] to be set. 320 */ 321 #define BCM_FIELD_QSET_ADD_INTERNAL(qset, q) SHR_BITSET(((qset).w), (q)) 322 #define BCM_FIELD_QSET_REMOVE_INTERNAL(qset, q) SHR_BITCLR(((qset).w), (q)) 323 #define BCM_FIELD_QSET_TEST_INTERNAL(qset, q) SHR_BITGET(((qset).w), (q)) 324 325 /* 326 * Operation between two qsets. 327 */ 328 #define _FIELD_BITS_OP(_a, _b, _max, _op) \ 329 { \ 330 int _ct; \ 331 int _max_w = (_max + SHR_BITWID - 1)/SHR_BITWID; \ 332 for (_ct = 0; _ct < (_max_w); _ct++) { \ 333 (_a)[_ct] _op (_b)[_ct]; \ 334 } \ 335 } 336 337 #define _BCM_FIELD_QSET_OR(_qset, _qset_new, _max_count) \ 338 _FIELD_BITS_OP(_qset.w, _qset_new.w, _max_count, |=) 339 340 341 /* User-Defined Field (UDF) IP Flags. */ 342 #define _BCM_FIELD_USER_THREE_MPLS_LABELS (18 << 6) 343 #define _BCM_FIELD_USER_FOUR_MPLS_LABELS (19 << 6) 344 #define _BCM_FIELD_USER_FIVE_MPLS_LABELS (20 << 6) 345 346 /* Qualifier data/mask buffer. */ 347 #define _FP_UDF_DATA_WORDS (8) 348 typedef uint32 _bcm_field_udf_data_t[_FP_UDF_DATA_WORDS]; 349 350 #ifdef BCM_WARM_BOOT_SUPPORT 351 /* Version change to 28 - for 6.5.15 352 */ 353 #define BCM_FIELD_WB_VERSION_1_28 SOC_SCACHE_VERSION(1, 28) 354 355 /* Version change to 27 - for flowtracker stage 356 * Also, sync the slice indexes of disabled entries for EFP/VFP of TH WB 357 */ 358 #define BCM_FIELD_WB_VERSION_1_27 SOC_SCACHE_VERSION(1, 27) 359 360 /* Version change to 26 - for 6.5.14 361 * Number of bytes increased to sync instance info in slice map and 362 * group information for EFP/VFP 363 */ 364 #define BCM_FIELD_WB_VERSION_1_26 SOC_SCACHE_VERSION(1, 26) 365 /* Version change to 25 - for 6.5.13 366 * TH3 related new changes added. 367 */ 368 #define BCM_FIELD_WB_VERSION_1_25 SOC_SCACHE_VERSION(1, 25) 369 /* Version change to 23 - For 6.5.11 370 * There is an issue with sync of extractor code for TH WB. 371 * The extractor codes of the first part is copied to remaining 372 * parts of the group. The is fixed both in sync and recovery 373 * This version is used as a checkpoint to devide on whether to 374 * use fix in recovery. all release after this version will not 375 * use the fix in recovery code 376 */ 377 #define BCM_FIELD_WB_VERSION_1_24 SOC_SCACHE_VERSION(1, 24) 378 /* Version change to 23 - For 6.5.10 379 * There are couple of requirements for this change 380 * 1. Ingress_logical_policer_pools_mode is synced at wrong location earlier. 381 * It has to be synced at the begining of the ingress 382 * before slice recovery is done. Hence syncing it here again. 383 * The earlier sync of Ingress_logical_policer_pools_mode is retained not 384 * to disturb legacy code. 385 * 2. To recover group loopback type selcode 386 */ 387 #define BCM_FIELD_WB_VERSION_1_23 SOC_SCACHE_VERSION(1, 23) 388 /* Version change to 22 - For 6.5.7 NO Scache size increment */ 389 #define BCM_FIELD_WB_VERSION_1_22 SOC_SCACHE_VERSION(1, 22) 390 /* Version change to 21 - For 6.5.6 */ 391 #define BCM_FIELD_WB_VERSION_1_21 SOC_SCACHE_VERSION(1, 21) 392 /* Version change to 20 to recover MirrorIngress/Egress Action. - For 6.5.5 */ 393 #define BCM_FIELD_WB_VERSION_1_20 SOC_SCACHE_VERSION(1, 20) 394 /* Version change to 19 to recover IngressMplsPortSet Action. - For 6.5.4 */ 395 #define BCM_FIELD_WB_VERSION_1_19 SOC_SCACHE_VERSION(1, 19) 396 /* Version Change to 18 to recover SVP, DVP TYPE for each part of entry from scache. */ 397 #define BCM_FIELD_WB_VERSION_1_18 SOC_SCACHE_VERSION(1, 18) 398 /* Version Change to 17 to recover policer configurations from scache. */ 399 #define BCM_FIELD_WB_VERSION_1_17 SOC_SCACHE_VERSION(1, 17) 400 /* Version Change to 16 to recover EFP KEY for TH from scache. */ 401 #define BCM_FIELD_WB_VERSION_1_16 SOC_SCACHE_VERSION(1, 16) 402 /* Version Change to 15 to recover actions from scache. */ 403 #define BCM_FIELD_WB_VERSION_1_15 SOC_SCACHE_VERSION(1, 15) 404 /* Version Change..TR3 stat recovery for stageExternal */ 405 #define BCM_FIELD_WB_VERSION_1_14 SOC_SCACHE_VERSION(1, 14) 406 #define BCM_FIELD_WB_VERSION_1_13 SOC_SCACHE_VERSION(1, 13) 407 #define BCM_FIELD_WB_VERSION_1_12 SOC_SCACHE_VERSION(1, 12) 408 #define BCM_FIELD_WB_VERSION_1_11 SOC_SCACHE_VERSION(1, 11) 409 #define BCM_FIELD_WB_VERSION_1_10 SOC_SCACHE_VERSION(1, 10) 410 #define BCM_FIELD_WB_VERSION_1_9 SOC_SCACHE_VERSION(1,9) 411 #define BCM_FIELD_WB_VERSION_1_8 SOC_SCACHE_VERSION(1,8) 412 #define BCM_FIELD_WB_VERSION_1_7 SOC_SCACHE_VERSION(1,7) 413 #define BCM_FIELD_WB_VERSION_1_6 SOC_SCACHE_VERSION(1,6) 414 #define BCM_FIELD_WB_VERSION_1_5 SOC_SCACHE_VERSION(1,5) 415 #define BCM_FIELD_WB_VERSION_1_4 SOC_SCACHE_VERSION(1,4) 416 #define BCM_FIELD_WB_VERSION_1_3 SOC_SCACHE_VERSION(1,3) 417 #define BCM_FIELD_WB_VERSION_1_2 SOC_SCACHE_VERSION(1,2) 418 #define BCM_FIELD_WB_VERSION_1_1 SOC_SCACHE_VERSION(1,1) 419 #define BCM_FIELD_WB_VERSION_1_0 SOC_SCACHE_VERSION(1,0) 420 #define BCM_FIELD_WB_DEFAULT_VERSION BCM_FIELD_WB_VERSION_1_28 421 #endif 422 423 #if defined(BCM_FLOWTRACKER_SUPPORT) 424 /* Keygen profile types */ 425 #define _BCM_FIELD_FT_KEYGEN_PROFILE_AAB (1 << 0) 426 #define _BCM_FIELD_FT_KEYGEN_PROFILE_AB (1 << 1) 427 428 /* Maximum value for group key type */ 429 #define _BCM_FIELD_FT_GROUP_KEY_TYPE_MAX 128 430 431 /* 432 * Typedef: 433 * _field_ft_keygen_type_a_ext_t 434 * Purpose: 435 * Keygen type A extractors information 436 */ 437 typedef struct _field_ft_keygen_type_a_ext_s { 438 int l1_e16_sel[10]; 439 int l2_e16_ext_mode[10]; 440 int l2_e16_ext_section[10]; 441 } _field_ft_keygen_type_a_ext_t; 442 443 /* 444 * Typedef: 445 * _field_ft_keygen_type_a_ext_mask_t 446 * 447 * Purpose: 448 * Keygen type A extractors Mask information 449 */ 450 typedef struct _field_ft_keygen_type_a_ext_mask_s { 451 uint32 mask[4]; 452 } _field_ft_keygen_type_a_ext_mask_t; 453 454 /* 455 * Typedef: 456 * _field_ft_keygen_type_b_ext_t 457 * Purpose: 458 * Keygen type B extractors information. 459 */ 460 typedef struct _field_ft_keygen_type_b_ext_s { 461 int l1_e16_sel[8]; 462 } _field_ft_keygen_type_b_ext_t; 463 464 /* 465 * Typedef: 466 * _field_ft_keygen_type_c_ext_t 467 * Purpose: 468 * Keygen type C extractors information. 469 */ 470 typedef struct _field_ft_keygen_type_c_ext_s { 471 int l1_e1_sel[16]; 472 } _field_ft_keygen_type_c_ext_t; 473 474 /* 475 * Typedef: 476 * _field_ft_keygen_type_c_ext_mask_t 477 * 478 * Purpose: 479 * Keygen type C extractors Mask information 480 */ 481 typedef struct _field_ft_keygen_type_c_ext_mask_s { 482 uint32 mask; 483 } _field_ft_keygen_type_c_ext_mask_t; 484 485 /* 486 * Typedef: 487 * _field_ft_keygen_ext_codes_t 488 * Purpose 489 * Keygen extraction codes information 490 */ 491 typedef struct _field_ft_keygen_ext_codes_s { 492 int keygen_profile; 493 _field_ft_keygen_type_a_ext_t type_a_extractors[2]; 494 _field_ft_keygen_type_a_ext_mask_t type_a_mask[2]; 495 _field_ft_keygen_type_b_ext_t type_b_extractors; 496 _field_ft_keygen_type_c_ext_t type_c_extractors; 497 _field_ft_keygen_type_c_ext_mask_t type_c_mask; 498 } _field_ft_keygen_ext_codes_t; 499 500 /* 501 * Typedef: 502 * bcmi_ft_tracking_param_qual_map_t 503 * Purpose: 504 * Flow group tracking param and qualifier map. 505 */ 506 typedef struct bcmi_ft_tracking_param_qual_map_s { 507 uint16 param; 508 bcm_field_qualify_t qual; 509 uint16 start_loc; 510 uint16 width; 511 uint32 flags; 512 } _field_ft_tracking_param_qual_map_t; 513 514 /* Number of tracking elements */ 515 #define _FIELD_FT_TRACKING_ELEMENT_TYPE_MAX \ 516 bcmFlowtrackerTrackingParamTypeCount 517 518 /* Number of tracking alu data. */ 519 #define _FIELD_FT_TRACKING_ALU_DATA_MAX \ 520 _bcmFieldFtAluDataCount 521 522 /* 523 * Maximum number of tracking params. Maximum value include exposed 524 * export elements and internal tracking param (related with flowchecks 525 * and Alu Data) 526 */ 527 #define _FIELD_FT_TRACKING_PARAM_MAX \ 528 (_FIELD_FT_TRACKING_ELEMENT_TYPE_MAX + \ 529 _FIELD_FT_TRACKING_ALU_DATA_MAX) 530 531 /* 532 * Typedef: 533 * _field_ft_tracking_param_qual_map_db_t 534 * Purpose: 535 * Database of Flow group tracking param and qualifier map. 536 */ 537 typedef struct _field_ft_tracking_param_qual_map_db_s { 538 uint32 num_params; 539 _field_ft_tracking_param_qual_map_t *param_qual_map[_FIELD_FT_TRACKING_PARAM_MAX]; 540 } _field_ft_tracking_param_qual_map_db_t; 541 542 /* 543 * Typedef: 544 * _field_ft_info_t 545 * Purpose: 546 * flowtracker stage specific information structure. 547 */ 548 typedef struct _field_ft_info_s { 549 SHR_BITDCL key_type_bmp[_SHR_BITDCLSIZE(_BCM_FIELD_FT_GROUP_KEY_TYPE_MAX)]; 550 soc_profile_mem_t session_key_profile; /* Profile for session Key */ 551 soc_profile_mem_t session_key_user_profile; /* Profile for session Key 552 * entries for user installed flows. 553 */ 554 soc_profile_mem_t session_data_profile; /* Profile for session data */ 555 soc_profile_mem_t alu_data_profile; /* Profile for Alu data */ 556 bcmi_keygen_qual_cfg_info_db_t *flow_key_qual_cfg; /* Maintains the database for 557 qualifiers and its attributes 558 valid for session Key */ 559 bcmi_keygen_qual_cfg_info_db_t *flow_data_qual_cfg; /* Maintains the database for 560 qualifiers and its attributes 561 valid for session data */ 562 bcmi_keygen_ext_cfg_db_t **flow_key_ext_cfg_arr; /* Maintains the database 563 for extractors for session Key */ 564 bcmi_keygen_ext_cfg_db_t *flow_data_ext_cfg; /* Maintains the database 565 for extractors for session Data */ 566 _field_ft_tracking_param_qual_map_db_t *param_qual_map_db; /* Maintains the 567 database for valid tracking param and 568 qualifier map */ 569 } _field_ft_info_t; 570 571 /* Extractor offsets per qualifier */ 572 typedef struct _field_ft_qual_sel_s { 573 /* Number of extractors Offset. */ 574 uint8 num_offsets; 575 /* Extractor offsets. */ 576 uint16 ext_num[BCMI_KEYGEN_QUAL_OFFSETS_MAX]; 577 } _field_ft_qual_sel_t; 578 579 typedef struct _field_ft_qual_ext_offset_info_s { 580 /* Qualifier array. */ 581 bcm_field_qualify_t *qid_arr; 582 /* Offset and width information corresponding to 583 * qualifiers in qid_arr. */ 584 bcmi_keygen_qual_offset_t *offset_arr; 585 /* Size of the qid_arr and offset_arr arrays */ 586 /* Selector offsets array */ 587 _field_ft_qual_sel_t *sel_offset_arr; 588 /* Number of quals */ 589 uint16 size; 590 } _field_ft_qual_ext_offset_info_t; 591 592 #endif /* BCM_FLOWTRACKER_SUPPORT */ 593 594 /* 595 * Typedef: 596 * _field_sel_t 597 * Purpose: 598 */ 599 typedef struct _field_sel_s { 600 int8 fpf0; /* FPF0 field(s) select. */ 601 int8 fpf1; /* FPF1 field(s) select. */ 602 int8 fpf2; /* FPF2 field(s) select. */ 603 int8 fpf3; /* FPF3 field(s) select. */ 604 int8 fpf4; /* FPF4 field(s) selector. */ 605 int8 extn; /* field(s) select external. */ 606 int8 src_class_sel; /* Source lookup class selection. */ 607 int8 dst_class_sel; /* Destination lookup class selection.*/ 608 int8 intf_class_sel; /* Interface class selection. */ 609 int8 ingress_entity_sel;/* Ingress entity selection. */ 610 int8 src_entity_sel; /* Src port/trunk entity selection. */ 611 int8 dst_fwd_entity_sel;/* Destination forwarding entity. */ 612 int8 fwd_field_sel; /* Forwarding field type select. */ 613 int8 loopback_type_sel; /* Loopback/Tunnel type selection. */ 614 int8 ip_header_sel; /* Inner/Outer Ip header selection. */ 615 int8 ip6_addr_sel; /* Ip6 address format selection. */ 616 int8 intraslice; /* Intraslice double wide selection. */ 617 int8 secondary; 618 int8 inner_vlan_overlay; 619 int8 intraslice_vfp_sel; 620 int8 aux_tag_1_sel; 621 int8 aux_tag_2_sel; 622 int8 oam_overlay_sel; /* Oam Overlay Selection*/ 623 int8 ttl_class_sel; 624 int8 tcp_class_sel; 625 int8 tos_class_sel; 626 int8 normalize_ip_sel; 627 int8 normalize_mac_sel; 628 int8 egr_class_f1_sel; /* EFP KEY1 Class ID Selector */ 629 int8 egr_class_f2_sel; /* EFP KEY2 Class ID Selector */ 630 int8 egr_class_f3_sel; /* EFP KEY3 Class ID Selector */ 631 int8 egr_class_f4_sel; /* EFP KEY4 Class ID Selector */ 632 int8 egr_class_f6_sel; /* EFP KEY6 Class ID Selector */ 633 int8 egr_class_f7_sel; /* EFP KEY7 Class ID Selector */ 634 int8 egr_class_f8_sel; /* EFP KEY8 Class ID Selector */ 635 int8 src_dest_class_f1_sel; 636 int8 src_dest_class_f3_sel; 637 int8 src_type_sel; 638 int8 egr_key4_dvp_sel; /* EFP KEY4 DVP Secondary selector */ 639 int8 egr_key8_dvp_sel; /* EFP KEY8 DVP Secondary selector */ 640 int8 egr_dest_port_f1_sel; 641 int8 egr_dest_port_f5_sel; 642 int8 egr_key4_mdl_sel; /* EFP KEY4 MDL Secondary selector */ 643 int8 egr_oam_overlay_sel; /* EFP Oam Overlay Selection*/ 644 int8 oam_intf_class_sel; /* Oam SVP Intf Class Selector */ 645 int8 egr_classId_B_f1_sel; /* EFP KEY1 Class ID B Selector */ 646 int8 egr_classId_B_f2_sel; /* EFP KEY2 Class ID B Selector */ 647 int8 egr_classId_B_f3_sel; /* EFP KEY3 Class ID B Selector */ 648 int8 egr_classId_B_f4_sel; /* EFP KEY4 Class ID B Selector */ 649 int8 egr_classId_B_f5_sel; /* EFP KEY5 Class ID B Selector */ 650 int8 egr_classId_B_f6_sel; /* EFP KEY6 Class ID B Selector */ 651 int8 egr_classId_B_f7_sel; /* EFP KEY7 Class ID B Selector */ 652 int8 egr_classId_B_f8_sel; /* EFP KEY8 Class ID B Selector */ 653 int8 egr_key4_l3_classId_sel;/* EFP KEY4 L3 Class ID Selector */ 654 int8 egr_key8_l3_classId_sel;/* EFP KEY4 L3 Class ID Selector */ 655 } _field_sel_t; 656 657 658 /* 659 * Count number of bits in a memory field. 660 */ 661 #define _FIELD_MEM_FIELD_LENGTH(_u_, _mem_, _fld_) \ 662 (SOC_MEM_FIELD_VALID((_u_), (_mem_), (_fld_)) ? \ 663 (soc_mem_field_length((_u_), (_mem_), (_fld_))) : 0) 664 665 666 /* 667 * Field select code macros 668 * 669 * These are for resolving if the select code has meaning or is really a don't 670 * care. 671 */ 672 673 #define _FP_SELCODE_DONT_CARE (-1) 674 #define _FP_SELCODE_DONT_USE (-2) 675 676 #define _FP_SELCODE_INVALIDATE(selcode) \ 677 ((selcode) = _FP_SELCODE_DONT_CARE); 678 679 #define _FP_SELCODE_IS_VALID(selcode) \ 680 (((selcode) == _FP_SELCODE_DONT_CARE || \ 681 (selcode) == _FP_SELCODE_DONT_USE) ? 0 : 1) 682 683 #define _FP_SELCODE_IS_INVALID(selcode) \ 684 (0 == _FP_SELCODE_IS_VALID(selcode)) 685 686 #define _FP_MAX_FPF_BREAK(_selcode, _stage_fc, _fpf_id) \ 687 if (_FP_SELCODE_IS_VALID(_selcode)) { \ 688 if (NULL == (_stage_fc->_field_table_fpf ## _fpf_id[_selcode])) { \ 689 break; \ 690 } \ 691 } 692 693 #define _FP_SELCODE_SET(_selcode_qset, _selcode) \ 694 sal_memset((_selcode_qset), (int8)_selcode, sizeof(_field_sel_t)); 695 696 697 /* 698 * Macros for packing and unpacking L3 information for field actions 699 * into and out of a uint32 value. 700 */ 701 702 #define MAX_CNT_BITS 10 703 704 #define _FP_L3_ACTION_PACK_ECMP(ecmp_ptr, ecmp_cnt) \ 705 ( 0x80000000 | ((ecmp_ptr) << MAX_CNT_BITS) | (ecmp_cnt) ) 706 #define _FP_L3_ACTION_UNPACK_ECMP_MODE(cookie) \ 707 ( (cookie) >> 31 ) 708 #define _FP_L3_ACTION_UNPACK_ECMP_PTR(cookie) \ 709 ( ((cookie) & 0x7fffffff) >> MAX_CNT_BITS ) 710 #define _FP_L3_ACTION_UNPACK_ECMP_CNT(cookie) \ 711 ((cookie) & ~(0xffffffff << MAX_CNT_BITS)) 712 713 #define _FP_L3_ACTION_PACK_NEXT_HOP(next_hop) \ 714 ( (next_hop) & 0x7fffffff ) 715 #define _FP_L3_ACTION_UNPACK_NEXT_HOP(cookie) \ 716 ( (cookie) & 0x7fffffff ) 717 718 719 #define _FP_MAX_ENTRY_WIDTH 4 /* Maximum field entry width. */ 720 #define _FP_TH_MAX_ENTRY_WIDTH 3 /* Field entry parts count in Tomahawk */ 721 722 /* Both for EFP and External Stage, TCAM Key Generation logic 723 * is packet dependent. In EFP, based on the TCAM Slice_Mode and incoming 724 * packet type, TCAM Lookup Key is generated. 725 * Each entry in EFP TCAM can match on a KEY_MATCH_TYPE field 726 * (4 Most Significant Bits) + actual KEY fields from the packet 727 * + Pipeline Meta data. 728 * KEY_MATCH_TYPE is an encoded value generated by the EFP key generation 729 * logic that can be applied to all entries in EFP TCAM to guarantee that 730 * each entry matches only on the desired Packet type/s." 731 */ 732 #define _FP_MAX_ENTRY_TYPES 2 733 734 735 #define _FP_ENTRY_TYPE_0 0 /* Entries which use Default Slice mode and 736 * KEY_MATCH_TYPE (only EFP)selected by Group 737 * Create logic. 738 */ 739 740 #define _FP_ENTRY_TYPE_1 1 /* Entries in which alternate KEY_MATCH_TYPE is used 741 * based on the qualifiers applied to the entry. 742 * Typically used to match Not L3 and Not FCoE 743 * Packets. 744 */ 745 746 #define _FP_ENTRY_TYPE_DEFAULT _FP_ENTRY_TYPE_0 747 748 /* Macros for packing and unpacking Eight Bytes Payload qualifier information */ 749 #define _FP_PACK_L2_EIGHT_BYTES_PAYLOAD(qual_in_1, qual_in_2, qual_out) do {\ 750 (qual_out)[1] = (uint32) (qual_in_1); \ 751 (qual_out)[0] = (uint32) (qual_in_2); \ 752 } while (0) 753 754 #define _FP_UNPACK_L2_EIGHT_BYTES_PAYLOAD(qual_in, qual_out_1, qual_out_2) do {\ 755 (*qual_out_1) = (uint32) ((qual_in)[1]); \ 756 (*qual_out_2) = (uint32) ((qual_in)[0]); \ 757 } while (0) 758 759 /* 760 * Macro: _BCM_FIELD_ENTRIES_IN_SLICE 761 * 762 * Purpose: 763 * Returns number of entries in a slice, depending on mode 764 * 765 * Parameters: 766 * fg - pointer to entry's field group struct 767 * fs - pointer to entry's field slice struct 768 * result - return value 769 */ 770 #if defined (BCM_TOMAHAWK_SUPPORT) 771 #define _BCM_FIELD_ENTRIES_IN_SLICE(_u_, _fg_, _fs_, _result_) \ 772 do { \ 773 if (!(soc_feature(unit, soc_feature_field_multi_pipe_support) && \ 774 (_fg_->stage_id == _BCM_FIELD_STAGE_INGRESS)) && \ 775 ((_fg_)->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)) { \ 776 (_result_) = ((_fs_)->entry_count >> 1); \ 777 } else { \ 778 (_result_) = (_fs_)->entry_count; \ 779 } \ 780 } while (0) 781 #else 782 #define _BCM_FIELD_ENTRIES_IN_SLICE(_u_, _fg_, _fs_, _result_) \ 783 do { \ 784 if ((_fg_)->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) { \ 785 (_result_) = ((_fs_)->entry_count >> 1); \ 786 } else { \ 787 (_result_) = (_fs_)->entry_count; \ 788 } \ 789 } while (0) 790 #endif /* BCM_TOMAHAWK_SUPPORT */ 791 792 /* 793 * Macro: 794 * _BCM_FIELD_TH_NARROW_WIDE_PRIO_ORDER_TCAM_INDEX_GET 795 * Purpose: 796 * To retrieve the right priority index for the given index for the groups 797 * operated in narrow wide (80-bit) TCAMs. 798 * Note: It is the SW WAR to fix the issue reported RTL JIRA TH-4424. 799 */ 800 #if defined(BCM_TOMAHAWK_SUPPORT) 801 #define _BCM_FIELD_TH_NARROW_WIDE_PRIO_ORDER_TCAM_INDEX_GET(__u__, \ 802 __stage__, \ 803 __g_flags__, \ 804 __slice_no__, \ 805 __tid__) \ 806 do { \ 807 if (soc_feature(__u__, soc_feature_fp_nw_tcam_prio_order_war) && \ 808 ((__stage__ == _BCM_FIELD_STAGE_INGRESS) && \ 809 ((__g_flags__ & _FP_GROUP_SPAN_SINGLE_SLICE) && \ 810 !(__g_flags__ & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) { \ 811 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, \ 812 "Changed TCAM_ID: %d -"), __tid__)); \ 813 if (__tid__ % 2) { \ 814 __tid__ = 256 + (__slice_no__ * 256) + (__tid__/2); \ 815 } else { \ 816 __tid__ = (__slice_no__ * 256) + (__tid__/2); \ 817 } \ 818 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, \ 819 " %d for slice:%d\n\r"), __tid__,__slice_no__)); \ 820 } \ 821 } while(0); 822 #endif /*BCM_TOMAHAWK_SUPPORT */ 823 824 /* 825 * Macro:_FP_QUAL_INFO_SET 826 * 827 * Purpose: 828 * Set the fields of a _qual_info_t struct. 829 */ 830 #define _FP_QUAL_INFO_SET(qual, field, off, wid, fq) \ 831 (fq)->qid = (qual); \ 832 (fq)->fpf = (field); \ 833 (fq)->offset = (off); \ 834 (fq)->width = (wid); \ 835 (fq)->next = NULL; 836 /* 837 * Macro: 838 * _FIELD_SELCODE_CLEAR (internal) 839 * Purpose: 840 * Set all fields of a field select code to invalid 841 * Parameters: 842 * selcode - _field_selcode_t struct 843 */ 844 845 #define _FIELD_SELCODE_CLEAR(_selcode_) \ 846 _FP_SELCODE_SET(&(_selcode_), _FP_SELCODE_DONT_CARE) 847 848 /* 849 * Macro: 850 * _FIELD_NEED_I_WRITE 851 * Purpose: 852 * Test if it is necessary to write to "I" version of FP_PORT_FIELD_SEL 853 * table. 854 * Parameters: 855 * _u_ - BCM device number 856 * _p_ - port 857 * _m_ - Memory (usually IFP_PORT_FIELD_SEL) 858 */ 859 #define _FIELD_NEED_I_WRITE(_u_, _p_, _m_) \ 860 ((SOC_MEM_IS_VALID((_u_), (_m_))) && \ 861 (IS_XE_PORT((_u_), (_p_)) || IS_ST_PORT((_u_),(_p_)) || \ 862 IS_CPU_PORT((_u_),(_p_)))) 863 864 865 #if defined(BCM_FIREBOLT2_SUPPORT) || defined(BCM_TRX_SUPPORT) 866 867 /* Egress FP slice modes. */ 868 #define _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L2 (0x0) 869 #define _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3 (0x1) 870 #define _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE (0x2) 871 #define _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3_ANY (0x3) 872 #define _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY (0x4) 873 #define _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6 (0x5) 874 #define _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_FCOE (0x6) 875 #if defined(BCM_TSN_SUPPORT) || defined(BCM_TSN_SR_SUPPORT) 876 #define _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_SR (0x6) 877 #endif /* BCM_TSN_SUPPORT || BCM_TSN_SR_SUPPORT */ 878 879 880 /* Egress FP slice v6 key modes. */ 881 #define _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_SIP6 (0x0) 882 #define _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_DIP6 (0x1) 883 #define _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_SIP_DIP_64 (0x2) 884 885 886 /* Egress FP possible keys. */ 887 #define _BCM_FIELD_EFP_KEY1 (0x0) /* IPv4 key. */ 888 #define _BCM_FIELD_EFP_KEY2 (0x1) /* IPv6 key. */ 889 #define _BCM_FIELD_EFP_KEY3 (0x2) /* IPv6 dw key. */ 890 #define _BCM_FIELD_EFP_KEY4 (0x3) /* L2 key. */ 891 #define _BCM_FIELD_EFP_KEY1_NO_V4 (0x4) /* Ip Any key. */ 892 #define _BCM_FIELD_EFP_KEY5 (0x5) /* HiGiG Key. */ 893 #define _BCM_FIELD_EFP_KEY6 (0x6) /* HiGiG Key. */ 894 #define _BCM_FIELD_EFP_KEY7 (0x7) /* Loopback Key. */ 895 #define _BCM_FIELD_EFP_KEY8 (0x8) /* Bytes after 896 L2 Header key. */ 897 #define _BCM_EFP_FIELD_KEY_STRINGS \ 898 { \ 899 "KEY1", \ 900 "KEY2", \ 901 "KEY3", \ 902 "KEY4", \ 903 "KEY1_NO_V4", \ 904 "KEY5", \ 905 "KEY6", \ 906 "KEY7", \ 907 "KEY8", \ 908 } 909 910 /* KEY_MATCH type field for EFP_TCAM encoding. for every key. */ 911 #define _BCM_FIELD_EFP_KEY1_MATCH_TYPE (0x1) 912 #define _BCM_FIELD_EFP_KEY2_MATCH_TYPE (0x2) 913 #define _BCM_FIELD_EFP_KEY2_KEY3_MATCH_TYPE (0x3) 914 #define _BCM_FIELD_EFP_KEY1_KEY4_MATCH_TYPE (0x4) 915 #define _BCM_FIELD_EFP_KEY4_MATCH_TYPE (0x5) 916 #define _BCM_FIELD_EFP_KEY2_KEY4_MATCH_TYPE (0x6) 917 #define _BCM_FIELD_EFP_KEY5_MATCH_TYPE (0x7) 918 #define _BCM_FIELD_EFP_KEY5_KEY4_MATCH_TYPE (0x8) 919 #define _BCM_FIELD_EFP_KEY6_MATCH_TYPE (0x9) 920 921 /* Key Match Type Values used in Tomahawk */ 922 #define KEY_TYPE_INVALID (0x0) 923 #define KEY_TYPE_IPv4_SINGLE (0x1) 924 #define KEY_TYPE_IPv6_SINGLE (0x2) 925 #define KEY_TYPE_IPv6_DOUBLE (0x3) 926 #define KEY_TYPE_IPv4_L2_L3_DOUBLE (0x4) 927 #define KEY_TYPE_L2_SINGLE (0x5) 928 #define KEY_TYPE_IPv4_IPv6_DOUBLE (0x6) 929 #define KEY_TYPE_HIGIG_DOUBLE (0x9) 930 #define KEY_TYPE_LOOPBACK_DOUBLE (0xa) 931 #define KEY_TYPE_L2_DOUBLE (0xb) 932 #define KEY_TYPE_FCOE_SINGLE (0xc) 933 #define KEY_TYPE_FCOE_DOUBLE (0xd) 934 935 #endif /* BCM_FIREBOLT2_SUPPORT || BCM_TRX_SUPPORT */ 936 937 #define FPF_SZ_MAX (32) 938 939 #define _FP_HASH_SZ(_fc_) \ 940 (((_fc_)->flags & _FP_EXTERNAL_PRESENT) ? (0x1000) : (0x100)) 941 #define _FP_HASH_INDEX_MASK(_fc_) (_FP_HASH_SZ(_fc_) - 1) 942 943 #define _FP_HASH_INSERT(_hash_ptr_, _inserted_ptr_, _index_) \ 944 do { \ 945 (_inserted_ptr_)->next = (_hash_ptr_)[(_index_)]; \ 946 (_hash_ptr_)[(_index_)] = (_inserted_ptr_); \ 947 } while (0) 948 949 #define _FP_HASH_REMOVE(_hash_ptr_, _entry_type_, _removed_ptr_, _index_) \ 950 do { \ 951 _entry_type_ *_prev_ent_ = NULL; \ 952 _entry_type_ *_lkup_ent_ = (_hash_ptr_)[(_index_)]; \ 953 while (NULL != _lkup_ent_) { \ 954 if (_lkup_ent_ != (_removed_ptr_)) { \ 955 _prev_ent_ = _lkup_ent_; \ 956 _lkup_ent_ = _lkup_ent_->next; \ 957 continue; \ 958 } \ 959 if (_prev_ent_!= NULL) { \ 960 _prev_ent_->next = (_removed_ptr_)->next; \ 961 } else { \ 962 (_hash_ptr_)[(_index_)] = (_removed_ptr_)->next; \ 963 } \ 964 break; \ 965 } \ 966 } while (0) 967 968 #define _FP_HINTS_LINKLIST_INSERT(_head_, _node_) \ 969 do { \ 970 if (*_head_ != NULL) { \ 971 (_node_)->next = (*_head_); \ 972 } \ 973 (*_head_) = (_node_); \ 974 }while (0) 975 976 #define _FP_HINTS_LINKLIST_DELETE(_head_, _entry_type_, _node_) \ 977 do { \ 978 _entry_type_ *prev = NULL; \ 979 _entry_type_ *curr = NULL; \ 980 for (prev = curr = *_head_; curr != NULL; curr = curr->next) { \ 981 if (curr == _node_) { \ 982 prev->next = curr->next; \ 983 if (curr == *_head_) { \ 984 *_head_ = (*_head_)->next; \ 985 } \ 986 if (curr->hint != NULL) { \ 987 sal_free (curr->hint); \ 988 curr->hint = NULL; \ 989 } \ 990 sal_free (curr); \ 991 curr = NULL; \ 992 break; \ 993 } \ 994 prev = curr; \ 995 } \ 996 }while (0) 997 998 #define _FP_HINTS_LINKLIST_DELETE_ALL(_head_, _entry_type_) \ 999 do { \ 1000 _entry_type_ *node = NULL; \ 1001 while (*_head_ != NULL) { \ 1002 node = *_head_; \ 1003 *_head_ = (*_head_)->next; \ 1004 if (node->hint != NULL) { \ 1005 sal_free (node->hint); \ 1006 node->hint = NULL; \ 1007 } \ 1008 sal_free (node); \ 1009 node = NULL; \ 1010 } \ 1011 }while (0) 1012 1013 #define _FP_LINKLIST_INSERT(_head_, _node_, _rc_) \ 1014 do { \ 1015 if ((_head_ == NULL) || (_node_ == NULL)) { \ 1016 *_rc_ = BCM_E_PARAM; \ 1017 } else { \ 1018 if (*_head_ != NULL) { \ 1019 (_node_)->next = (*_head_); \ 1020 } \ 1021 (*_head_) = (_node_); \ 1022 *_rc_ = BCM_E_NONE; \ 1023 } \ 1024 }while (0) 1025 1026 #define _FP_ACTION_IS_COLOR_BASED(action) \ 1027 ((bcmFieldActionRpDrop <= (action) && \ 1028 (action) <= bcmFieldActionYpPrioIntCancel) || \ 1029 (bcmFieldActionGpDrop <= (action) \ 1030 && (action) <= bcmFieldActionGpPrioIntCancel)) 1031 1032 /* Different types of packet types for External TCAM */ 1033 #define _FP_EXT_NUM_PKT_TYPES 3 1034 #define _FP_EXT_L2 0 1035 #define _FP_EXT_IP4 1 1036 #define _FP_EXT_IP6 2 1037 1038 /* 1039 * Different types of Databases in External TCAM (Triumph) 1040 * Each type of database is considered as a slice (in S/W) 1041 * The number of entries in each type of database is configurable 1042 * The field_slice_t.num_ext_entries denotes the number of entries 1043 * 1044 * See include/soc/er_tcam.h for the database types: 1045 * slice_numb database type (soc_tcam_partition_type_t) meaning 1046 * 0 TCAM_PARTITION_ACL_L2C ACL_144_L2 1047 * 1 TCAM_PARTITION_ACL_L2 ACL_L2 1048 * 2 TCAM_PARTITION_ACL_IP4C ACL_144_IPV4 1049 * 3 TCAM_PARTITION_ACL_IP4 ACL_IPV4 1050 * 4 TCAM_PARTITION_ACL_L2IP4 ACL_L2_IPV4 1051 * 5 TCAM_PARTITION_ACL_IP6C ACL_144_IPV6 1052 * 6 TCAM_PARTITION_ACL_IP6S ACL_IPV6_SHORT 1053 * 7 TCAM_PARTITION_ACL_IP6F ACL_IPV6_FULL 1054 * 8 TCAM_PARTITION_ACL_L2IP6 ACL_L2_IPV6 1055 */ 1056 #define _FP_EXT_ACL_144_L2 0 1057 #define _FP_EXT_ACL_L2 1 1058 #define _FP_EXT_ACL_144_IPV4 2 1059 #define _FP_EXT_ACL_IPV4 3 1060 #define _FP_EXT_ACL_L2_IPV4 4 1061 #define _FP_EXT_ACL_144_IPV6 5 1062 #define _FP_EXT_ACL_IPV6_SHORT 6 1063 #define _FP_EXT_ACL_IPV6_FULL 7 1064 #define _FP_EXT_ACL_L2_IPV6 8 1065 #define _FP_EXT_NUM_PARTITIONS 9 1066 1067 extern soc_tcam_partition_type_t _bcm_field_fp_tcam_partitions[]; 1068 extern soc_mem_t _bcm_field_ext_data_mask_mems[]; 1069 extern soc_mem_t _bcm_field_ext_data_mems[]; 1070 extern soc_mem_t _bcm_field_ext_mask_mems[]; 1071 extern soc_mem_t _bcm_field_ext_policy_mems[]; 1072 extern soc_mem_t _bcm_field_ext_counter_mems[]; 1073 1074 1075 /* 1076 * Structure for Group auto-expansion feature 1077 * S/W copy of FP_SLICE_MAP 1078 */ 1079 1080 typedef struct _field_virtual_map_s { 1081 int valid; /* Map is valid flag. */ 1082 int vmap_key; /* Key = Physical slice number + stage key base */ 1083 int virtual_group; /* Virtual group id. */ 1084 int priority; /* Virtual group priority. */ 1085 int flags; /* Field group flags. */ 1086 } _field_virtual_map_t; 1087 1088 /* Number of entries in a single map.*/ 1089 #define _FP_VMAP_SIZE (17) 1090 /* Default virtual map id. */ 1091 #define _FP_VMAP_DEFAULT (_FP_EXT_L2) 1092 /* Number of virtual maps per stage.*/ 1093 #define _FP_VMAP_CNT (_FP_EXT_NUM_PKT_TYPES) 1094 1095 /* Encode physical slice into vmap key. */ 1096 #define _FP_VMAP_IDX_TO_KEY(_slice_, _stage_) \ 1097 (((_stage_) == _BCM_FIELD_STAGE_EXTERNAL) ? \ 1098 ((_FP_VMAP_SIZE_) - 1 ) : (_slice_)) 1099 1100 /* 1101 * Typedef: 1102 * _bcm_field_device_sel_t 1103 * Purpose: 1104 * Enumerate per device controls used for qualifier selection. 1105 */ 1106 typedef enum _bcm_field_device_sel_e { 1107 _bcmFieldDevSelDisable, /* Don't care selection. */ 1108 _bcmFieldDevSelInnerVlanOverlay, /* Inner vlan overlay enable. */ 1109 _bcmFieldDevSelIntrasliceVfpKey, /* Intraslice vfp key select. */ 1110 _bcmFieldDevSelCount /* Always Last. Not a usable value. */ 1111 } _bcm_field_device_sel_t; 1112 1113 /* 1114 * Typedef: 1115 * _bcm_field_fwd_entity_sel_t 1116 * Purpose: 1117 * Enumerate Forwarding Entity Type selection. 1118 */ 1119 typedef enum _bcm_field_fwd_entity_sel_e { 1120 _bcmFieldFwdEntityAny, /* Don't care selection. */ 1121 _bcmFieldFwdEntityMplsGport, /* MPLS gport selection. */ 1122 _bcmFieldFwdEntityMimGport, /* Mim gport selection. */ 1123 _bcmFieldFwdEntityWlanGport, /* Wlan gport selection. */ 1124 _bcmFieldFwdEntityL3Egress, /* Next hop selection. */ 1125 _bcmFieldFwdEntityGlp, /* (MOD/PORT/TRUNK) selection. */ 1126 _bcmFieldFwdEntityModPortGport, /* MOD/PORT even if port is part of 1127 the trunk. */ 1128 _bcmFieldFwdEntityMulticastGroup,/* Mcast group id selection. */ 1129 _bcmFieldFwdEntityMultipath, /* Multpath id selection. */ 1130 _bcmFieldFwdEntityPortGroupNum, /* Ingress port group and number */ 1131 _bcmFieldFwdEntityCommonGport, /* Mod/Port gport or MPLS/MiM/ 1132 Wlan/Niv gport selection. */ 1133 _bcmFieldFwdEntityVxlanGport, /* vxlan gport selection. */ 1134 _bcmFieldFwdEntityNivGport, /* Niv gport selection. */ 1135 _bcmFieldFwdEntityVlanGport, /* Vlan gport selection. */ 1136 _bcmFieldFwdEntityCount /* Always Last. Not a usable value. */ 1137 } _bcm_field_fwd_entity_sel_t; 1138 1139 1140 /* 1141 * Typedef: 1142 * _bcm_field_oam_intf_class_sel_t 1143 * Purpose: 1144 * Enumerate Oam Class Id from SVP table selection. 1145 */ 1146 typedef enum _bcm_field_oam_intf_class_sel_e { 1147 _bcmFieldOamInterfaceClassSelectAny, 1148 _bcmFieldOamInterfaceClassSelectNiv, 1149 _bcmFieldOamInterfaceClassSelectMim, 1150 _bcmFieldOamInterfaceClassSelectVxlan, 1151 _bcmFieldOamInterfaceClassSelectVlan, 1152 _bcmFieldOamInterfaceClassSelectMpls, 1153 _bcmFieldOamInterfaceClassSelectCount 1154 } _bcm_field_oam_intf_class_sel_t; 1155 1156 /* 1157 * Typedef: 1158 * _bcm_field_fwd_field_sel_t 1159 * Purpose: 1160 * Enumerate Forwarding Field Type selection. 1161 */ 1162 typedef enum _bcm_field_fwd_field_sel_e { 1163 _bcmFieldFwdFieldAny, /* Don't care selection. */ 1164 _bcmFieldFwdFieldVrf, /* L3 Vrf id selection. */ 1165 _bcmFieldFwdFieldVpn, /* VPLS/VPWS VFI selection. */ 1166 _bcmFieldFwdFieldVlan, /* Forwarding vlan selection. */ 1167 _bcmFieldFwdFieldCount /* Always Last. Not a usable value. */ 1168 } _bcm_field_fwd_field_sel_t; 1169 1170 /* 1171 * Typedef: 1172 * _bcm_field_aux_tag_sel_t 1173 * Purpose: 1174 * Enumerate Auxiliary Tag Type selection. 1175 */ 1176 typedef enum _bcm_field_aux_tag_sel_e { 1177 _bcmFieldAuxTagAny = 0, /* Don't care selection. */ 1178 _bcmFieldAuxTagVn = 1, /* VN Tag selection. */ 1179 _bcmFieldAuxTagCn = 2, /* CN Tag selection. */ 1180 _bcmFieldAuxTagMimlHeader = 2, /* MIML Header. */ 1181 _bcmFieldAuxTagFabricQueue = 3, /* Fabric Queue Tag selection. */ 1182 _bcmFieldAuxTagCustomHeader = 3, /* Custom header */ 1183 _bcmFieldAuxTagMplsFwdingLabel = 4, 1184 _bcmFieldAuxTagCapwapInfo = 4, /* Capwap Info */ 1185 _bcmFieldAuxTagMplsCntlWord = 5, 1186 _bcmFieldAuxTagRtag7A = 6, 1187 _bcmFieldAuxTagRtag7B = 7, 1188 _bcmFieldAuxTagVxlanOrLLTag = 8, /* Vxlan Flags,24 bit VNI/ 1189 16 bit Logical Link ID */ 1190 _bcmFieldAuxTagVxlanReserved = 9, /* Vxlan Header Reserved Field */ 1191 _bcmFieldAuxTagCount = 10 /* Always Last. Not a usable value. */ 1192 } _bcm_field_aux_tag_sel_t; 1193 1194 /* 1195 * Typedef: 1196 * _bcm_field_nat_oam_sel_t 1197 * Purpose: 1198 * Enumerate Auxiliary Tag Type selection. 1199 */ 1200 typedef enum _bcm_field_nat_oam_sel_e { 1201 _bcmFieldNatOamInvalid = 0, /* NAT & OAM Invalid */ 1202 _bcmFieldNatOamValidNat = 1, /* NAT is valid */ 1203 _bcmFieldNatOamValidOam = 2, /* OAM is Valid */ 1204 _bcmFieldNatOamReserved = 3, /* Reserved Field */ 1205 _bcmFieldNatOamCount = 4 /* Always Last. Not a usable value. */ 1206 } _bcm_field_nat_oam_sel_t; 1207 1208 /* 1209 * Typedef: 1210 * _bcm_field_oam_overlay_sel_t 1211 * Purpose: 1212 * Enumerate Oam Overlay Enable selector value. 1213 */ 1214 typedef enum _bcm_field_oam_overlay_sel_e { 1215 _bcmFieldOamOverlayDisable = 0, /* Oam Overlay Disable */ 1216 _bcmFieldOamOverlayEnable = 1, /* Oam Overlay Enable */ 1217 _bcmFieldOamOverlayCount = 2 /* Always Last. Not a usable value. */ 1218 } _bcm_field_oam_overlay_sel_t; 1219 1220 1221 /* 1222 * Typedef: 1223 * _bcm_field_slice_sel_t 1224 * Purpose: 1225 * Enumerate per slice controls used for qualifier selection. 1226 */ 1227 typedef enum _bcm_field_slice_sel_e { 1228 _bcmFieldSliceSelDisable, /* Don't care selection. */ 1229 _bcmFieldSliceSelFpf1, /* Field selector 1. */ 1230 _bcmFieldSliceSelFpf2, /* Field selector 2. */ 1231 _bcmFieldSliceSelFpf3, /* Field selector 3. */ 1232 _bcmFieldSliceSelFpf4, /* Field selector 3. */ 1233 _bcmFieldSliceSelExternal, /* Field selector External key. */ 1234 _bcmFieldSliceSrcClassSelect, /* Field source class selector. */ 1235 _bcmFieldSliceDstClassSelect, /* Field destination class selector. */ 1236 _bcmFieldSliceIntfClassSelect, /* Field interface class selector. */ 1237 _bcmFieldSliceIpHeaderSelect, /* Inner/Outer Ip header selector. */ 1238 _bcmFieldSliceLoopbackTypeSelect,/* Loopback vs Tunnel type selector. */ 1239 _bcmFieldSliceIngressEntitySelect,/* Ingress entity type selector. */ 1240 _bcmFieldSliceSrcEntitySelect, /* Src entity type selector. */ 1241 _bcmFieldSliceDstFwdEntitySelect, /* Destination entity type selector. */ 1242 _bcmFieldSliceIp6AddrSelect, /* Sip/Dip/Dip64_Sip64 selector. */ 1243 _bcmFieldSliceFwdFieldSelect, /* Vrf/Vfi/Forwarding vlan selector. */ 1244 _bcmFieldSliceAuxTag1Select, /* VN/CN/FabricQueue tag selector 1. */ 1245 _bcmFieldSliceAuxTag2Select, /* VN/CN/FabricQueue tag selector 2. */ 1246 _bcmFieldSliceOamOverLayEnable, /* OAM Overlay enable selector on TD2+*/ 1247 _bcmFieldSliceFpf1SrcDstClassSelect, 1248 _bcmFieldSliceFpf3SrcDstClassSelect, 1249 _bcmFieldSliceSelEgrClassF1, 1250 _bcmFieldSliceSelEgrClassF2, 1251 _bcmFieldSliceSelEgrClassF3, 1252 _bcmFieldSliceSelEgrClassF4, 1253 _bcmFieldSliceSrcTypeSelect, 1254 _bcmFieldSliceTtlClassSelect, /* Secondary selector for 1255 Ttl class */ 1256 _bcmFieldSliceTcpClassSelect, /* Secondary selector for 1257 Tcp class */ 1258 _bcmFieldSliceTosClassSelect, /* Secondary selector for 1259 Tos class */ 1260 _bcmFieldSliceSelEgrDvpKey4, /* Secondary Selector for 1261 * EFP_KEY4_DVP_SELECTORr 1262 */ 1263 _bcmFieldSliceSelEgrMdlKey4, /* Secondary Selector for 1264 * EFP_KEY4_MDL_SELECTORr 1265 */ 1266 1267 _bcmFieldSliceSelEgrOamOverlayKey4, /* Egress OAM Overlay enable selector 1268 on TD2+ */ 1269 _bcmFieldSliceSelEgrClassF6, /* Select CLASS ID from IFP/L3 next Hop/ 1270 L3 intf/ Egress DVP for EFP_KEY6 */ 1271 _bcmFieldSliceSelEgrClassF7, /* Select CLASS ID from IFP/L3 next Hop/ 1272 L3 intf/ Egress DVP for EFP_KEY7 */ 1273 _bcmFieldSliceSelEgrClassF8, /* Select IFP Class ID/Egress Port/CPU COS 1274 * for EFP_KEY8 1275 */ 1276 _bcmFieldSliceSelEgrDvpKey8, /* Secondary Selector for 1277 * EFP_KEY8_DVP_SELECTORr 1278 */ 1279 _bcmFieldSliceOamInterfaceClassSelect, /* OAM SVP class selector on TD2+ */ 1280 _bcmFieldSliceSelEgrDestPortF1, /* Secondary Selector for KEY1 1281 * EFP_DEST_PORT_SELECTORr 1282 */ 1283 _bcmFieldSliceSelEgrDestPortF5, /* Secondary Selector for KEY5 1284 * EFP_DEST_PORT_SELECTORr 1285 */ 1286 _bcmFieldSliceSelEgrClassIdBF1, 1287 _bcmFieldSliceSelEgrClassIdBF2, 1288 _bcmFieldSliceSelEgrClassIdBF3, 1289 _bcmFieldSliceSelEgrClassIdBF4, 1290 _bcmFieldSliceSelEgrClassIdBF5, 1291 _bcmFieldSliceSelEgrClassIdBF6, /* Select CLASS ID from IFP/L3 next Hop/ 1292 L3 intf/ Egress DVP for EFP_KEY6 */ 1293 _bcmFieldSliceSelEgrClassIdBF7, /* Select CLASS ID from IFP/L3 next Hop/ 1294 L3 intf/ Egress DVP for EFP_KEY7 */ 1295 _bcmFieldSliceSelEgrClassIdBF8, /* Select IFP Class ID/Egress Port/CPU COS 1296 * for EFP_KEY8 1297 */ 1298 _bcmFieldSliceSelEgrClassKey4, /* Select L3 CLASS_ID for EFP_KEY4 */ 1299 _bcmFieldSliceSelEgrClassKey8, /* Select L3 CLASS_ID for EFP_KEY8 */ 1300 _bcmFieldSliceCount /* Always Last. Not a usable value. */ 1301 } _bcm_field_slice_sel_t; 1302 1303 /* 1304 * Typedef: 1305 * _bcm_field_selector_t 1306 * Purpose: 1307 * Select codes configuration required for qualifer. 1308 */ 1309 typedef struct _bcm_field_selector_s { 1310 _bcm_field_device_sel_t dev_sel; /* Per device Selector. */ 1311 uint8 dev_sel_val; /* Device selector value. */ 1312 _bcm_field_slice_sel_t pri_sel; /* Primary slice selector. */ 1313 uint8 pri_sel_val; /* Primary selector value. */ 1314 _bcm_field_slice_sel_t sec_sel; /* Secondary slice selector.*/ 1315 uint8 sec_sel_val; /* Secondary selector value.*/ 1316 _bcm_field_slice_sel_t ter_sel; /* Tertiary slice selector. */ 1317 uint8 ter_sel_val; /* Tertiary selector value. */ 1318 uint8 intraslice; /* Intra-slice double wide. */ 1319 uint8 secondary; /* Slice pairing overlay. */ 1320 uint8 primary; /* Primary slice pairing 1321 overlay. */ 1322 uint8 update_count; /* Number of selcodes updates 1323 required for selection.*/ 1324 } _bcm_field_selector_t; 1325 1326 /* Max Qualifiers Offsets */ 1327 #if defined(BCM_TOMAHAWK_SUPPORT) 1328 /* 1329 * Current Max offsets value is set as 64. 1330 * In TH qualifiers can be split across TCAM slices in wide mode. 1331 * Per-Slice upto 32 extractors are supported in HW. 1332 */ 1333 #define _BCM_FIELD_QUAL_OFFSET_MAX 64 1334 #else 1335 #define _BCM_FIELD_QUAL_OFFSET_MAX 3 1336 #endif /* BCM_TOMAHAWK_SUPPORT */ 1337 1338 /* 1339 * Field Qualifier Type 1340 */ 1341 typedef enum _bcm_field_qual_type_e { 1342 _bcmFieldQualifierTypeDefault = 0, 1343 _bcmFieldQualifierTypePresel = 1, 1344 _bcmFieldQualifierTypeCount = 2 1345 } _bcm_field_qual_type_t; 1346 1347 1348 /* 1349 * Typedef: 1350 * _bcm_field_qual_offset_t 1351 * Purpose: 1352 * Qualifier offsets in FP tcam. 1353 */ 1354 typedef struct _bcm_field_qual_offset_s { 1355 soc_field_t field; /* Field name. */ 1356 uint8 num_offsets; /* Number of Offsets. */ 1357 uint16 offset[_BCM_FIELD_QUAL_OFFSET_MAX]; /* Qualifier offset. */ 1358 uint8 width[_BCM_FIELD_QUAL_OFFSET_MAX]; /* Qualifier offset width.*/ 1359 uint8 secondary; 1360 uint8 bit_pos; /* Qualifier Bit Position.*/ 1361 uint16 qual_width; /* Actual Qualifier Width.*/ 1362 uint8 flags; /* Qualifier Flags. */ 1363 } _bcm_field_qual_offset_t; 1364 1365 /* 1366 * Typedef: 1367 * _bcm_field_qual_data_t 1368 * Purpose: 1369 * Qualifier data/mask field buffer. 1370 */ 1371 #define _FP_QUAL_DATA_WORDS (8) 1372 typedef uint32 _bcm_field_qual_data_t[_FP_QUAL_DATA_WORDS]; /* Qualifier data/mask buffer. */ 1373 1374 #define _FP_QUAL_DATA_CLEAR(_data_) \ 1375 sal_memset((_data_), 0, _FP_QUAL_DATA_WORDS * sizeof(uint32)) 1376 1377 1378 /* 1379 * Typedef: 1380 * _bcm_field_qual_conf_s 1381 * Purpose: 1382 * Select codes/offsets and other qualifier attributes. 1383 */ 1384 typedef struct _bcm_field_qual_conf_s { 1385 _bcm_field_selector_t selector; /* Per slice/device 1386 configuration required. */ 1387 _bcm_field_qual_offset_t offset; /* Qualifier tcam offsets. */ 1388 } _bcm_field_qual_conf_t; 1389 1390 /* 1391 * Typedef: 1392 * _bcm_field_entry_part_qual_s 1393 * Purpose: 1394 * Field entry part qualifiers information. 1395 */ 1396 typedef struct _bcm_field_group_qual_s { 1397 uint16 *qid_arr; /* Qualifier id. */ 1398 _bcm_field_qual_offset_t *offset_arr; /* Qualifier tcam offsets. */ 1399 uint16 size; /* Qualifier array size. */ 1400 } _bcm_field_group_qual_t; 1401 1402 /* 1403 * Typedef: 1404 * _FP_QUAL_OFFSET_XXX 1405 * Purpose: 1406 * Field qualifier offset attribute flags. 1407 */ 1408 #define _BCM_FIELD_QUAL_OFFSET_DEFAULT 0 1409 #define _BCM_FIELD_QUAL_OFFSET_NO_IFP_SUPPORT (1 << 0) 1410 #define _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT (1 << 1) 1411 #define _BCM_FIELD_QUAL_OFFSET_NO_FT_SUPPORT (1 << 2) 1412 #define _BCM_FIELD_QUAL_OFFSET_FLOW_TYPE_TUNNEL_NONE (1 << 3) 1413 #define _BCM_FIELD_QUAL_OFFSET_FLOW_TYPE_TUNNEL_L2 (1 << 4) 1414 #define _BCM_FIELD_QUAL_OFFSET_FLOW_TYPE_TUNNEL_L3 (1 << 5) 1415 1416 1417 /* _FP_QUAL_* macros require the following declaration 1418 in any function which uses them. 1419 */ 1420 #define _FP_QUAL_DECL \ 1421 int _rv_; \ 1422 _bcm_field_qual_conf_t _fp_qual_conf_; \ 1423 soc_field_t _key_fld_ = SOC_IS_TD_TT(unit) ? KEYf : DATAf; 1424 1425 /* Add qualifier to stage qualifiers set. */ 1426 #define __FP_QUAL_EXT_ADD(_unit_, _stage_fc_, _qual_id_, \ 1427 _dev_sel_, _dev_sel_val_, \ 1428 _pri_sel_, _pri_sel_val_, \ 1429 _sec_sel_, _sec_sel_val_, \ 1430 _ter_sel_, _ter_sel_val_, \ 1431 _intraslice_, \ 1432 _offset_0_, _width_0_, \ 1433 _offset_1_, _width_1_, \ 1434 _offset_2_, _width_2_, \ 1435 _secondary_, _primary_) \ 1436 do { \ 1437 _bcm_field_qual_conf_t_init(&_fp_qual_conf_); \ 1438 (_fp_qual_conf_).selector.dev_sel = (_dev_sel_); \ 1439 (_fp_qual_conf_).selector.dev_sel_val = (_dev_sel_val_); \ 1440 (_fp_qual_conf_).selector.pri_sel = (_pri_sel_); \ 1441 (_fp_qual_conf_).selector.pri_sel_val = (_pri_sel_val_); \ 1442 (_fp_qual_conf_).selector.sec_sel = (_sec_sel_); \ 1443 (_fp_qual_conf_).selector.sec_sel_val = (_sec_sel_val_); \ 1444 (_fp_qual_conf_).selector.ter_sel = (_ter_sel_); \ 1445 (_fp_qual_conf_).selector.ter_sel_val = (_ter_sel_val_); \ 1446 (_fp_qual_conf_).selector.intraslice = (_intraslice_); \ 1447 (_fp_qual_conf_).offset.field = (_key_fld_); \ 1448 (_fp_qual_conf_).offset.num_offsets = 3; \ 1449 (_fp_qual_conf_).offset.offset[0] = _offset_0_ ; \ 1450 (_fp_qual_conf_).offset.width[0] = _width_0_; \ 1451 (_fp_qual_conf_).offset.offset[1] = _offset_1_ ; \ 1452 (_fp_qual_conf_).offset.width[1] = _width_1_; \ 1453 (_fp_qual_conf_).offset.offset[2] = _offset_2_ ; \ 1454 (_fp_qual_conf_).offset.width[2] = _width_2_; \ 1455 (_fp_qual_conf_).offset.secondary = (_secondary_); \ 1456 (_fp_qual_conf_).selector.secondary = (_secondary_); \ 1457 (_fp_qual_conf_).selector.primary = (_primary_); \ 1458 _rv_ =_bcm_field_qual_insert((_unit_), (_stage_fc_), (0), \ 1459 (_qual_id_), &(_fp_qual_conf_)); \ 1460 BCM_IF_ERROR_RETURN(_rv_); \ 1461 } while (0) 1462 1463 #define _FP_QUAL_EXT_ADD(_unit_, _stage_fc_, _qual_id_, \ 1464 _dev_sel_, _dev_sel_val_, \ 1465 _pri_sel_, _pri_sel_val_, \ 1466 _sec_sel_, _sec_sel_val_, \ 1467 _intraslice_, \ 1468 _offset_0_, _width_0_, \ 1469 _offset_1_, _width_1_, \ 1470 _offset_2_, _width_2_, \ 1471 _secondary_) \ 1472 __FP_QUAL_EXT_ADD((_unit_), (_stage_fc_), (_qual_id_), \ 1473 (_dev_sel_), (_dev_sel_val_), \ 1474 (_pri_sel_), (_pri_sel_val_), \ 1475 (_sec_sel_), (_sec_sel_val_), \ 1476 _bcmFieldDevSelDisable, 0, \ 1477 (_intraslice_), \ 1478 (_offset_0_), (_width_0_), \ 1479 (_offset_1_), (_width_1_), \ 1480 (_offset_2_), (_width_2_), \ 1481 (_secondary_), 0 \ 1482 ) 1483 1484 #define _FP_QUAL_PRIMARY_EXT_ADD(_unit_, _stage_fc_, _qual_id_, \ 1485 _dev_sel_, _dev_sel_val_, \ 1486 _pri_sel_, _pri_sel_val_, \ 1487 _sec_sel_, _sec_sel_val_, \ 1488 _intraslice_, \ 1489 _offset_0_, _width_0_, \ 1490 _offset_1_, _width_1_, \ 1491 _offset_2_, _width_2_, \ 1492 _secondary_, _primary_) \ 1493 __FP_QUAL_EXT_ADD((_unit_), (_stage_fc_), (_qual_id_), \ 1494 (_dev_sel_), (_dev_sel_val_), \ 1495 (_pri_sel_), (_pri_sel_val_), \ 1496 (_sec_sel_), (_sec_sel_val_), \ 1497 _bcmFieldDevSelDisable, 0, \ 1498 (_intraslice_), \ 1499 (_offset_0_), (_width_0_), \ 1500 (_offset_1_), (_width_1_), \ 1501 (_offset_2_), (_width_2_), \ 1502 (_secondary_), (_primary_) \ 1503 ) 1504 1505 #define _FP_QUAL_PRIMARY_ADD(_unit_, _stage_fc_, _qual_id_, \ 1506 _pri_slice_sel_, _pri_slice_sel_val_, \ 1507 _offset_0_, _width_0_) \ 1508 _FP_QUAL_PRIMARY_EXT_ADD((_unit_), (_stage_fc_),(_qual_id_), \ 1509 _bcmFieldDevSelDisable, 0, \ 1510 (_pri_slice_sel_), (_pri_slice_sel_val_),\ 1511 _bcmFieldSliceSelDisable, 0, 0, \ 1512 (_offset_0_), (_width_0_), 0, 0, 0, 0, 0, 1) 1513 1514 /* Add single offset & two slice selectors qualifier. */ 1515 #define _FP_QUAL_PRIMARY_TWO_SLICE_SEL_ADD(_unit_, _stage_fc_, _qual_id_, \ 1516 _pri_slice_sel_, _pri_slice_sel_val_, \ 1517 _sec_slice_sel_, _sec_slice_sel_val_, \ 1518 _offset_0_, _width_0_) \ 1519 _FP_QUAL_PRIMARY_EXT_ADD((_unit_), (_stage_fc_),(_qual_id_), \ 1520 _bcmFieldDevSelDisable, 0, \ 1521 (_pri_slice_sel_), (_pri_slice_sel_val_),\ 1522 (_sec_slice_sel_), (_sec_slice_sel_val_),\ 1523 0, (_offset_0_), (_width_0_), 0, 0, 0, 0, 0, 1) 1524 1525 /* Add single offset & three slice selectors qualifier. */ 1526 #define _FP_QUAL_PRIMARY_THREE_SLICE_SEL_ADD(_unit_, _stage_fc_, _qual_id_, \ 1527 _pri_slice_sel_, _pri_slice_sel_val_, \ 1528 _sec_slice_sel_, _sec_slice_sel_val_, \ 1529 _ter_slice_sel_, _ter_slice_sel_val_, \ 1530 _offset_0_, _width_0_) \ 1531 __FP_QUAL_EXT_ADD((_unit_), (_stage_fc_),(_qual_id_), \ 1532 _bcmFieldDevSelDisable, 0, \ 1533 (_pri_slice_sel_), (_pri_slice_sel_val_), \ 1534 (_sec_slice_sel_), (_sec_slice_sel_val_), \ 1535 (_ter_slice_sel_), (_ter_slice_sel_val_), \ 1536 0, (_offset_0_), (_width_0_), 0, 0, 0, 0, 0, 0, 1) 1537 1538 /* Add basic (single offset & single per slice selector. */ 1539 #define _FP_QUAL_ADD(_unit_, _stage_fc_, _qual_id_, \ 1540 _pri_slice_sel_, _pri_slice_sel_val_, \ 1541 _offset_0_, _width_0_) \ 1542 _FP_QUAL_EXT_ADD((_unit_), (_stage_fc_),(_qual_id_), \ 1543 _bcmFieldDevSelDisable, 0, \ 1544 (_pri_slice_sel_), (_pri_slice_sel_val_),\ 1545 _bcmFieldSliceSelDisable, 0, 0, \ 1546 (_offset_0_), (_width_0_), 0, 0, 0, 0, 0) 1547 1548 /* Add single offset & two slice selectors qualifier. */ 1549 #define _FP_QUAL_TWO_SLICE_SEL_ADD(_unit_, _stage_fc_, _qual_id_, \ 1550 _pri_slice_sel_, _pri_slice_sel_val_, \ 1551 _sec_slice_sel_, _sec_slice_sel_val_, \ 1552 _offset_0_, _width_0_) \ 1553 _FP_QUAL_EXT_ADD((_unit_), (_stage_fc_),(_qual_id_), \ 1554 _bcmFieldDevSelDisable, 0, \ 1555 (_pri_slice_sel_), (_pri_slice_sel_val_),\ 1556 (_sec_slice_sel_), (_sec_slice_sel_val_),\ 1557 0, (_offset_0_), (_width_0_), 0, 0, 0, 0, 0) 1558 1559 /* Add single offset & three slice selectors qualifier. */ 1560 #define _FP_QUAL_THREE_SLICE_SEL_ADD(_unit_, _stage_fc_, _qual_id_, \ 1561 _pri_slice_sel_, _pri_slice_sel_val_, \ 1562 _sec_slice_sel_, _sec_slice_sel_val_, \ 1563 _ter_slice_sel_, _ter_slice_sel_val_, \ 1564 _offset_0_, _width_0_) \ 1565 __FP_QUAL_EXT_ADD((_unit_), (_stage_fc_),(_qual_id_), \ 1566 _bcmFieldDevSelDisable, 0, \ 1567 (_pri_slice_sel_), (_pri_slice_sel_val_), \ 1568 (_sec_slice_sel_), (_sec_slice_sel_val_), \ 1569 (_ter_slice_sel_), (_ter_slice_sel_val_), \ 1570 0, (_offset_0_), (_width_0_), 0, 0, 0, 0, 0, 0) 1571 1572 /* Add single offset & two slice selectors qualifier. */ 1573 #define _FP_QUAL_INTRASLICE_ADD(_unit_, _stage_fc_, _qual_id_, \ 1574 _pri_slice_sel_, _pri_slice_sel_val_, \ 1575 _sec_slice_sel_, _sec_slice_sel_val_, \ 1576 _offset_0_, _width_0_) \ 1577 _FP_QUAL_EXT_ADD((_unit_), (_stage_fc_),(_qual_id_), \ 1578 _bcmFieldDevSelDisable, 0, \ 1579 (_pri_slice_sel_), (_pri_slice_sel_val_),\ 1580 (_sec_slice_sel_), (_sec_slice_sel_val_),\ 1581 0x1, (_offset_0_), (_width_0_), 0, 0, 0, 0, 0) 1582 1583 1584 /* Add qualifier to stage qualifiers set. */ 1585 #define __FP_QUAL_MULTI_EXT_ADD(_unit_, _stage_fc_, _qual_id_, \ 1586 _dev_sel_, _dev_sel_val_, \ 1587 _pri_sel_, _pri_sel_val_, \ 1588 _sec_sel_, _sec_sel_val_, \ 1589 _ter_sel_, _ter_sel_val_, \ 1590 _intraslice_, _num_offsets_, \ 1591 _offset_arr_, _width_arr_) \ 1592 do { \ 1593 _bcm_field_qual_conf_t_init(&_fp_qual_conf_); \ 1594 (_fp_qual_conf_).selector.dev_sel = (_dev_sel_); \ 1595 (_fp_qual_conf_).selector.dev_sel_val = (_dev_sel_val_); \ 1596 (_fp_qual_conf_).selector.pri_sel = (_pri_sel_); \ 1597 (_fp_qual_conf_).selector.pri_sel_val = (_pri_sel_val_); \ 1598 (_fp_qual_conf_).selector.sec_sel = (_sec_sel_); \ 1599 (_fp_qual_conf_).selector.sec_sel_val = (_sec_sel_val_); \ 1600 (_fp_qual_conf_).selector.ter_sel = (_ter_sel_); \ 1601 (_fp_qual_conf_).selector.ter_sel_val = (_ter_sel_val_); \ 1602 (_fp_qual_conf_).selector.intraslice = (_intraslice_); \ 1603 (_fp_qual_conf_).offset.field = (_key_fld_); \ 1604 (_fp_qual_conf_).offset.num_offsets = (_num_offsets_); \ 1605 sal_memcpy(&(_fp_qual_conf_).offset.offset, _offset_arr_, \ 1606 sizeof(_fp_qual_conf_.offset.offset)*_num_offsets_t); \ 1607 sal_memcpy(&(_fp_qual_conf_).offset.width, _width_arr_, \ 1608 sizeof(_fp_qual_conf_.offset.width)*_num_offsets_t); \ 1609 (_fp_qual_conf_).selector.secondary = 0; \ 1610 _rv_ =_bcm_field_qual_insert((_unit_), (_stage_fc_), (0), \ 1611 (_qual_id_), &(_fp_qual_conf_)); \ 1612 BCM_IF_ERROR_RETURN(_rv_); \ 1613 } while (0) 1614 1615 #define _FP_QUAL_MULTI_EXT_ADD(_unit_, _stage_fc_, _qual_id_, \ 1616 _dev_sel_, _dev_sel_val_, \ 1617 _pri_sel_, _pri_sel_val_, \ 1618 _sec_sel_, _sec_sel_val_, \ 1619 _intraslice_, \ 1620 _num_offsets_, \ 1621 _offset_arr_, _width_arr_) \ 1622 __FP_QUAL_MULTI_EXT_ADD((_unit_), (_stage_fc_), (_qual_id_), \ 1623 (_dev_sel_), (_dev_sel_val_), \ 1624 (_pri_sel_), (_pri_sel_val_), \ 1625 (_sec_sel_), (_sec_sel_val_), \ 1626 _bcmFieldDevSelDisable, 0, \ 1627 (_intraslice_), \ 1628 _num_offsets_, \ 1629 _offset_arr_, _width_arr_) 1630 1631 1632 /* Add multiple offsets. */ 1633 #define _FP_QUAL_MULTI_ADD(_unit_, _stage_fc_, _qual_id_, \ 1634 _pri_slice_sel_, _pri_slice_sel_val, \ 1635 _num_offsets_, offset_arr_, _width_arr_) \ 1636 _FP_QUAL_MULTI_EXT_ADD((_unit_), (_stage_fc_),(_qual_id_), \ 1637 _bcmFieldDevSelDisable, 0, \ 1638 (_pri_slice_sel_), (_pri_slice_sel_val_), \ 1639 _bcmFieldSliceSelDisable, 0, 0, \ 1640 _num_offsets_, _offset_arr_, _width_arr_) 1641 1642 /* Add basic (single offset per slice selector with qualifier bit position. */ 1643 #define _FP_QUAL_MULTI_INFO_ADD(_unit_, _stage_fc_, _qual_id_, \ 1644 _pri_slice_sel_, _pri_slice_sel_val_, \ 1645 _offset_0_, _width_0_, _actual_width_, \ 1646 _bit_pos_) \ 1647 do { \ 1648 _bcm_field_qual_conf_t_init(&_fp_qual_conf_); \ 1649 (_fp_qual_conf_).selector.pri_sel = (_pri_slice_sel_); \ 1650 (_fp_qual_conf_).selector.pri_sel_val = (_pri_slice_sel_val_); \ 1651 (_fp_qual_conf_).offset.field = (_key_fld_); \ 1652 (_fp_qual_conf_).offset.num_offsets = 1; \ 1653 (_fp_qual_conf_).offset.offset[0] = (_offset_0_); \ 1654 (_fp_qual_conf_).offset.width[0] = (_width_0_); \ 1655 (_fp_qual_conf_).offset.qual_width = (_actual_width_); \ 1656 (_fp_qual_conf_).offset.bit_pos = (_bit_pos_); \ 1657 _rv_ =_bcm_field_qual_insert((_unit_), (_stage_fc_), (0), \ 1658 (_qual_id_), &(_fp_qual_conf_)); \ 1659 BCM_IF_ERROR_RETURN(_rv_); \ 1660 } while (0) 1661 1662 #define _BCM_FIELD_QUAL_MULTI_OFFSET_WIDTH(_q_offset_, _width_) \ 1663 do { \ 1664 int i; \ 1665 _width_ = 0; \ 1666 for (i = 0; i < (_q_offset_)->num_offsets; i++) { \ 1667 (_width_) = (_width_) + (_q_offset_)->width[i]; \ 1668 } \ 1669 } while(0) 1670 1671 1672 /* Add basic (single offset & single per slice selector with flags. */ 1673 #define _FP_QUAL_ADD_WITH_FLAGS(_unit_, _stage_fc_, _qual_id_,_flags_, \ 1674 _pri_slice_sel_, _pri_slice_sel_val_, \ 1675 _offset_0_, _width_0_, \ 1676 _actual_width_, _bit_pos_) \ 1677 _FP_QUAL_EXT_ADD_WITH_FLAGS((_unit_), (_stage_fc_),(_qual_id_),(_flags_), \ 1678 _bcmFieldDevSelDisable, 0, \ 1679 (_pri_slice_sel_), (_pri_slice_sel_val_), \ 1680 _bcmFieldSliceSelDisable, 0, 0, \ 1681 (_offset_0_), (_width_0_), 0, 0, 0, 0, 0, \ 1682 (_actual_width_), (_bit_pos_)) 1683 1684 #define _FP_QUAL_EXT_ADD_WITH_FLAGS(_unit_, _stage_fc_, _qual_id_,_flags_, \ 1685 _dev_sel_, _dev_sel_val_, \ 1686 _pri_sel_, _pri_sel_val_, \ 1687 _sec_sel_, _sec_sel_val_, \ 1688 _intraslice_, \ 1689 _offset_0_, _width_0_, \ 1690 _offset_1_, _width_1_, \ 1691 _offset_2_, _width_2_, \ 1692 _secondary_, \ 1693 _actual_width_, _bit_pos_) \ 1694 __FP_QUAL_EXT_ADD_WITH_FLAGS((_unit_), (_stage_fc_), (_qual_id_),(_flags_),\ 1695 (_dev_sel_), (_dev_sel_val_), \ 1696 (_pri_sel_), (_pri_sel_val_), \ 1697 (_sec_sel_), (_sec_sel_val_), \ 1698 _bcmFieldDevSelDisable, 0, \ 1699 (_intraslice_), \ 1700 (_offset_0_), (_width_0_), \ 1701 (_offset_1_), (_width_1_), \ 1702 (_offset_2_), (_width_2_), \ 1703 (_secondary_), 0, \ 1704 (_actual_width_), (_bit_pos_) \ 1705 ) 1706 1707 #define __FP_QUAL_EXT_ADD_WITH_FLAGS(_unit_, _stage_fc_, _qual_id_,_flags_, \ 1708 _dev_sel_, _dev_sel_val_, \ 1709 _pri_sel_, _pri_sel_val_, \ 1710 _sec_sel_, _sec_sel_val_, \ 1711 _ter_sel_, _ter_sel_val_, \ 1712 _intraslice_, \ 1713 _offset_0_, _width_0_, \ 1714 _offset_1_, _width_1_, \ 1715 _offset_2_, _width_2_, \ 1716 _secondary_, _primary_, \ 1717 _actual_width_, _bit_pos_) \ 1718 do { \ 1719 _bcm_field_qual_conf_t_init(&_fp_qual_conf_); \ 1720 (_fp_qual_conf_).selector.dev_sel = (_dev_sel_); \ 1721 (_fp_qual_conf_).selector.dev_sel_val = (_dev_sel_val_); \ 1722 (_fp_qual_conf_).selector.pri_sel = (_pri_sel_); \ 1723 (_fp_qual_conf_).selector.pri_sel_val = (_pri_sel_val_); \ 1724 (_fp_qual_conf_).selector.sec_sel = (_sec_sel_); \ 1725 (_fp_qual_conf_).selector.sec_sel_val = (_sec_sel_val_); \ 1726 (_fp_qual_conf_).selector.ter_sel = (_ter_sel_); \ 1727 (_fp_qual_conf_).selector.ter_sel_val = (_ter_sel_val_); \ 1728 (_fp_qual_conf_).selector.intraslice = (_intraslice_); \ 1729 (_fp_qual_conf_).offset.field = (_key_fld_); \ 1730 (_fp_qual_conf_).offset.num_offsets = 3; \ 1731 (_fp_qual_conf_).offset.offset[0] = _offset_0_ ; \ 1732 (_fp_qual_conf_).offset.width[0] = _width_0_; \ 1733 (_fp_qual_conf_).offset.offset[1] = _offset_1_ ; \ 1734 (_fp_qual_conf_).offset.width[1] = _width_1_; \ 1735 (_fp_qual_conf_).offset.offset[2] = _offset_2_ ; \ 1736 (_fp_qual_conf_).offset.width[2] = _width_2_; \ 1737 (_fp_qual_conf_).offset.secondary = (_secondary_); \ 1738 (_fp_qual_conf_).selector.secondary = (_secondary_); \ 1739 (_fp_qual_conf_).selector.primary = (_primary_); \ 1740 (_fp_qual_conf_).offset.qual_width = (_actual_width_); \ 1741 (_fp_qual_conf_).offset.bit_pos = (_bit_pos_); \ 1742 (_fp_qual_conf_).offset.flags = (_flags_); \ 1743 _rv_ =_bcm_field_qual_insert((_unit_), (_stage_fc_), (0), \ 1744 (_qual_id_), &(_fp_qual_conf_)); \ 1745 BCM_IF_ERROR_RETURN(_rv_); \ 1746 } while (0) 1747 1748 /* 1749 * Typedef: 1750 * _bcm_field_qual_t 1751 * Purpose: 1752 */ 1753 typedef struct _bcm_field_qual_info_s { 1754 uint16 qid; /* Qualifer id. */ 1755 _bcm_field_qual_conf_t *conf_arr; /* Configurations array. */ 1756 uint8 conf_sz; /* Configurations array size. */ 1757 } _bcm_field_qual_info_t; 1758 1759 /* 1760 * Typedef: 1761 * _qual_info_t 1762 * Purpose: 1763 * Holds format info for a particular qualifier's access parameters. These 1764 * nodes are stored in qualifier lists for groups and in the FPFx tables 1765 * for each chip. 1766 */ 1767 typedef struct _qual_info_s { 1768 int qid; /* Which Qualifier */ 1769 soc_field_t fpf; /* FPFx field choice */ 1770 int offset; /* Offset within FPFx field */ 1771 int width; /* Qual width within FPFx field */ 1772 struct _qual_info_s *next; 1773 } _qual_info_t; 1774 1775 /* Typedef: 1776 * _field_fpf_info_t 1777 * Purpose: 1778 * Hardware memory details of field qualifier 1779 */ 1780 typedef struct _field_fpf_info_s { 1781 _qual_info_t **qual_table; 1782 bcm_field_qset_t *sel_table; 1783 soc_field_t field; 1784 } _field_fpf_info_t; 1785 1786 /* 1787 * Struct: 1788 * _field_counter32_collect_s 1789 * Purpose: 1790 * Holds the accumulated count of FP Counters 1791 * Useful for wrap around and movement. 1792 * This is used when h/w counter width is <= 32 bits 1793 */ 1794 typedef struct _field_counter32_collect_s { 1795 uint64 accumulated_counter; 1796 uint32 last_hw_value; 1797 } _field_counter32_collect_t; 1798 1799 /* 1800 * Struct: 1801 * _field_counter64_collect_s 1802 * Purpose: 1803 * Holds the accumulated count of FP Counters 1804 * Useful for wrap around and movement. 1805 * This is used when h/w counter width is > 32 bits 1806 * e.g. Bradley, Triumph Byte counters 1807 */ 1808 typedef struct _field_counter64_collect_s { 1809 uint64 accumulated_counter; 1810 uint64 last_hw_value; 1811 } _field_counter64_collect_t; 1812 1813 /* 1814 * Typedef: 1815 * _field_meter_bmp_t 1816 * Purpose: 1817 * Meter bit map for tracking allocation state of group's meter pairs. 1818 */ 1819 typedef struct _field_meter_bmp_s { 1820 SHR_BITDCL *w; 1821 } _field_meter_bmp_t; 1822 1823 #define _FP_METER_BMP_FREE(bmp, size) sal_free((bmp).w) 1824 #define _FP_METER_BMP_ADD(bmp, mtr) SHR_BITSET(((bmp).w), (mtr)) 1825 #define _FP_METER_BMP_REMOVE(bmp, mtr) SHR_BITCLR(((bmp).w), (mtr)) 1826 #define _FP_METER_BMP_TEST(bmp, mtr) SHR_BITGET(((bmp).w), (mtr)) 1827 1828 1829 /* 1830 * struct: 1831 * _field_meter_pool_s 1832 * Purpose: 1833 * Global meter pool 1834 * Note: 1835 * Note that the 2nd parameter is slice_id and not group_id. This 1836 * is because more than one group can share the same slice (pbmp based 1837 * groups) 1838 * 1839 * Due to this, it needs to be enforced that for an entry in a group 1840 * which is not in the group's first slice (due to group auto-expansion/ 1841 * virtual groups), slice_id denotes the entry's group's first slice. 1842 */ 1843 typedef struct _field_global_meter_pool_s { 1844 int8 level; /* Level meter pool attached. */ 1845 int slice_id; /* First slice which uses this meter pool*/ 1846 uint16 size; /* Number of valid meters in pool. */ 1847 uint16 pool_size; /* Total number of meters in pool. */ 1848 uint16 free_meters; /* Number of free meters */ 1849 uint16 num_meter_pairs; /* Number of meter pairs in a pool. */ 1850 _field_meter_bmp_t meter_bmp; /* Meter usage bitmap */ 1851 } _field_meter_pool_t; 1852 1853 1854 typedef struct _field_global_counter_pool_s { 1855 int8 slice_id; /* First slice which uses this pool */ 1856 uint16 size; /* Number of counters in pool */ 1857 uint16 free_cntrs; /* Number of free counters */ 1858 _field_meter_bmp_t cntr_bmp; /* Counter usage bitmap */ 1859 } _field_cntr_pool_t; 1860 1861 1862 /* 1863 * DATA qualifiers section. 1864 */ 1865 1866 /* Instead of the old model of n sets of m 4-consecutive-byte chunks of ingress 1867 packet (currently: n = 2 and m = 4), consider all user-defined 4-byte chunks 1868 of ingress packet data presented to the FP as equivalent -- the only proviso 1869 is that any one data qualifier cannot use chunks that are in different "udf 1870 numbers" (since those are in different FP selectors). 1871 So, call the index of a 4-byte chunk in the set of (n*m) of them the "data 1872 qualifier index". This is also the "column index" in the FP_UDF_OFFSET 1873 table. An API-level data qualifier that uses multiple 4-byte 1874 chunks will be assigned a data qualifier index (see _field_data_qualifier_t) 1875 based on the lowest numbered chunk index it uses. 1876 */ 1877 #define BCM_FIELD_USER_DQIDX(udf_num, user_num) \ 1878 ((udf_num) * (BCM_FIELD_USER_MAX_USER_NUM + 1) + (user_num)) 1879 /* Maximum number of data qualifiers. */ 1880 #define BCM_FIELD_USER_MAX_DQS \ 1881 BCM_FIELD_USER_DQIDX((BCM_FIELD_USER_MAX_UDF_NUM + 1), 0) 1882 #define BCM_FIELD_USER_DQIDX_TO_UDF_NUM(dqidx) ((dqidx) / (BCM_FIELD_USER_MAX_USER_NUM + 1)) 1883 #define BCM_FIELD_USER_DQIDX_TO_USER_NUM(dqidx) ((dqidx) % (BCM_FIELD_USER_MAX_USER_NUM + 1)) 1884 1885 /* Maximum packet depth data qualifier can qualify */ 1886 #define _FP_DATA_OFFSET_MAX (128) 1887 1888 /* Maximum packet depth data qualifier can qualify */ 1889 #define _FP_DATA_WORDS_COUNT (8) 1890 1891 /* Number of UDF_OFFSETS allocated for ethertype based qualifiers. */ 1892 #define _FP_DATA_ETHERTYPE_MAX (8) 1893 /* Number of UDF_OFFSETS allocated for IPv4 protocol based qualifiers. */ 1894 #define _FP_DATA_IP_PROTOCOL_MAX (2) 1895 /* Number of UDF_OFFSETS allocated for IPv6 next header based qualifiers. */ 1896 #define _FP_DATA_NEXT_HEADER_MAX (2) 1897 1898 /* Hw specific config.*/ 1899 #define _FP_DATA_DATA0_WORD_MIN (0) 1900 #define _FP_DATA_DATA0_WORD_MAX (3) 1901 #define _FP_DATA_DATA1_WORD_MIN (4) 1902 #define _FP_DATA_DATA1_WORD_MAX (7) 1903 1904 /* Ethertype match L2 format. */ 1905 #define _BCM_FIELD_DATA_FORMAT_ETHERTYPE (0x3) 1906 1907 /* Ip protocol match . */ 1908 #define _BCM_FIELD_DATA_FORMAT_IP4_PROTOCOL0 (BCM_FIELD_DATA_FORMAT_IP6 + 0x1) 1909 #define _BCM_FIELD_DATA_FORMAT_IP4_PROTOCOL1 (BCM_FIELD_DATA_FORMAT_IP6 + 0x2) 1910 #define _BCM_FIELD_DATA_FORMAT_IP6_PROTOCOL0 (BCM_FIELD_DATA_FORMAT_IP6 + 0x3) 1911 #define _BCM_FIELD_DATA_FORMAT_IP6_PROTOCOL1 (BCM_FIELD_DATA_FORMAT_IP6 + 0x4) 1912 1913 /* Packet content (data) qualification object flags. */ 1914 #define _BCM_FIELD_DATA_QUALIFIER_FLAGS \ 1915 (BCM_FIELD_DATA_QUALIFIER_OFFSET_IP4_OPTIONS_ADJUST | \ 1916 BCM_FIELD_DATA_QUALIFIER_OFFSET_IP6_EXTENSIONS_ADJUST | \ 1917 BCM_FIELD_DATA_QUALIFIER_OFFSET_GRE_OPTIONS_ADJUST | \ 1918 BCM_FIELD_DATA_QUALIFIER_OFFSET_FLEX_HASH | \ 1919 BCM_FIELD_DATA_QUALIFIER_STAGE_LOOKUP) 1920 1921 /* UDF spec - offset is valid flag */ 1922 #define _BCM_FIELD_USER_OFFSET_VALID (1 << 31) 1923 1924 #define _BCM_FIELD_USER_OFFSET_FLAGS \ 1925 (_BCM_FIELD_USER_OFFSET_VALID | \ 1926 _BCM_FIELD_USER_OPTION_ADJUST | \ 1927 _BCM_FIELD_USER_GRE_OPTION_ADJUST) 1928 1929 /* Data qualifiers tcam priorities. */ 1930 /* Specified packet l2 format. */ 1931 #define _FP_DATA_QUALIFIER_PRIO_L2_FORMAT (0x01) 1932 /* Specified number of vlan tags. */ 1933 #define _FP_DATA_QUALIFIER_PRIO_VLAN_FORMAT (0x01) 1934 /* Specified l3 format tunnel types/inner/outer ip type. */ 1935 #define _FP_DATA_QUALIFIER_PRIO_L3_FORMAT (0x01) 1936 /* Specified MPLS format tunnel. */ 1937 #define _FP_DATA_QUALIFIER_PRIO_MPLS_FORMAT (0x01) 1938 /* Specified FCoE format tunnel. */ 1939 #define _FP_DATA_QUALIFIER_PRIO_FCOE_FORMAT (0x01) 1940 /* Specified ip protocol. */ 1941 #define _FP_DATA_QUALIFIER_PRIO_IPPROTO (0x01) 1942 /* Specified ip protocol/ethertype. */ 1943 #define _FP_DATA_QUALIFIER_PRIO_MISC (0x01) 1944 /* Specified priority for misc flags */ 1945 #define _FP_DATA_QUALIFIER_PRIO_FLAGS (0x01) 1946 /* Maximum udf tcam entry priority. */ 1947 #define _FP_DATA_QUALIFIER_PRIO_HIGHEST (0xff) 1948 1949 /* MPLS data qualifier label priority */ 1950 #define _FP_DATA_QUALIFIER_PRIO_MPLS_ANY (0x00) 1951 #define _FP_DATA_QUALIFIER_PRIO_MPLS_ONE_LABEL (0x01) 1952 #define _FP_DATA_QUALIFIER_PRIO_MPLS_TWO_LABEL (0x02) 1953 #define _FP_DATA_QUALIFIER_PRIO_MPLS_THREE_LABEL (0x03) 1954 #define _FP_DATA_QUALIFIER_PRIO_MPLS_FOUR_LABEL (0x04) 1955 #define _FP_DATA_QUALIFIER_PRIO_MPLS_FIVE_LABEL (0x05) 1956 1957 /* 1958 * Typedef: 1959 * _field_data_qualifier_s 1960 * Purpose: 1961 * Data qualifiers description structure. 1962 */ 1963 typedef struct _field_data_qualifier_s { 1964 int qid; /* Qualifier id. */ 1965 bcm_field_udf_spec_t *spec; /* Hw adjusted offsets array. */ 1966 bcm_field_data_offset_base_t offset_base; /* Offset base adjustment. */ 1967 int offset; /* Master word offset. */ 1968 uint8 byte_offset; /* Data offset inside the word. */ 1969 uint32 hw_bmap; /* Allocated hw words. */ 1970 uint32 flags; /* Offset adjustment flags. */ 1971 uint8 elem_count; /* Number of hardware elements required. */ 1972 int length; /* Matched data byte length. */ 1973 struct _field_data_qualifier_s *next;/* Next installed qualifier. */ 1974 } _field_data_qualifier_t, *_field_data_qualifier_p; 1975 1976 /* 1977 * Typedef: 1978 * _field_data_ethertype_s 1979 * Purpose: 1980 * Ethertype based data qualifiers description structure. 1981 */ 1982 typedef struct _field_data_ethertype_s { 1983 int ref_count; /* Reference count. */ 1984 uint16 l2; /* Packet l2 format. */ 1985 uint16 vlan_tag; /* Packet vlan tag format. */ 1986 bcm_port_ethertype_t ethertype; /* Ether type value. */ 1987 int relative_offset; /* Packet byte offset */ 1988 /* relative to qualifier */ 1989 /* byte offset. */ 1990 } _field_data_ethertype_t; 1991 1992 /* 1993 * Typedef: 1994 * _field_data_protocol_s 1995 * Purpose: 1996 * Protocol based data qualifiers description structure. 1997 */ 1998 typedef struct _field_data_protocol_s { 1999 int ip4_ref_count; /* Ip4 Reference count. */ 2000 int ip6_ref_count; /* Ip6 Reference count. */ 2001 uint32 flags; /* Ip4/Ip6 flags. */ 2002 uint8 ip; /* Ip protocol id. */ 2003 uint16 l2; /* Packet l2 format. */ 2004 uint16 vlan_tag; /* Packet vlan tag format. */ 2005 int relative_offset; /* Packet byte offset */ 2006 /* relative to qualifier */ 2007 /* byte offset. */ 2008 } _field_data_protocol_t; 2009 2010 /* 2011 * Typedef: 2012 * _field_data_tcam_entry_s 2013 * Purpose: 2014 * Field data tcam entry structucture. Used for 2015 * tcam entry allocation and organization by relative priority. 2016 */ 2017 typedef struct _field_data_tcam_entry_s { 2018 uint8 ref_count; /* udf tcam entry reference count. */ 2019 uint8 priority; /* udf tcam entry priority. */ 2020 } _field_data_tcam_entry_t; 2021 2022 /* 2023 * Typedef: 2024 * _field_data_control_s 2025 * Purpose: 2026 * Field data qualifiers control structucture. 2027 */ 2028 typedef struct _field_data_control_s { 2029 uint32 usage_bmap; /* Offset usage bitmap. */ 2030 _field_data_qualifier_p data_qual; /* List of data qualifiers. */ 2031 /* Ethertype based qualifiers. */ 2032 _field_data_ethertype_t etype[_FP_DATA_ETHERTYPE_MAX]; 2033 /* IP protocol based qualifiers. */ 2034 _field_data_protocol_t ip[_FP_DATA_IP_PROTOCOL_MAX]; 2035 _field_data_tcam_entry_t *tcam_entry_arr;/* Tcam entries/keys array.*/ 2036 int elem_size; /* Number of bytes per element. */ 2037 int num_elems; /* Number of elements per UDF. */ 2038 } _field_data_control_t; 2039 2040 /* Katana2 can support 170 pp_ports */ 2041 #define _FP_ACTION_PARAM_SZ (6) 2042 2043 #define _FP_ACTION_MAX_PARAM_ENC (5) 2044 /* 2045 * Typedef: 2046 * _bcm_field_action_offset_t 2047 * Purpose: 2048 * Action offsets in FP policy table. 2049 */ 2050 typedef struct _bcm_field_action_offset_s { 2051 uint32 flags; /* Action flags _BCM_FIELD_ACTION_XXX. */ 2052 uint16 offset[_FP_ACTION_PARAM_SZ]; /* Action offset. */ 2053 uint8 width[_FP_ACTION_PARAM_SZ]; /* Action width. */ 2054 uint8 aset; /*Action set */ 2055 int value[_FP_ACTION_PARAM_SZ]; /* Action Value. */ 2056 uint32 encode_bmp; /* Bitmap of offsets which hold action encodings*/ 2057 uint32 param_bmp; /* Bitmap of offsets which hold user given parameters */ 2058 struct _bcm_field_action_offset_s *next; 2059 } _bcm_field_action_offset_t; 2060 2061 typedef struct _bcm_field_action_conf_s { 2062 bcm_field_action_t action; /* Field Action bcmFieldActionXXX. */ 2063 _bcm_field_action_offset_t *offset; /* Action offset information. */ 2064 } _bcm_field_action_conf_t; 2065 2066 2067 #ifdef BCM_TOMAHAWK_SUPPORT 2068 typedef struct _field_action_params_s { 2069 int cosq_new; 2070 int nh_ecmp_id; 2071 uint8 is_dvp; 2072 uint8 is_trunk; 2073 uint8 fabric_tag_type; 2074 uint8 ucast_redirect_control; 2075 uint8 mcast_redirect_control; 2076 uint32 flags; 2077 uint32 i2e_cl_sel; 2078 uint32 i2e_hg_cl_sel; 2079 uint32 fabric_tag; 2080 uint32 redirect_value; 2081 #ifdef INCLUDE_L3 2082 int32 hw_idx; 2083 int32 hw_half; 2084 #endif 2085 int mtp_index; 2086 int mtp_type_index; 2087 uint32 eh_tag; 2088 uint8 eh_tag_mask_index; 2089 } _field_action_params_t; 2090 2091 #define _BCM_FIELD_ACTION_REDIRECT_DGLP (1 << 0) 2092 #define _BCM_FIELD_ACTION_REDIRECT_DVP (1 << 1) 2093 #define _BCM_FIELD_ACTION_REDIRECT_NEXT_HOP (1 << 2) 2094 #define _BCM_FIELD_ACTION_REDIRECT_ECMP (1 << 3) 2095 #define _BCM_FIELD_ACTION_REDIRECT_TRUNK (1 << 4) 2096 #define _BCM_FIELD_ACTION_NO_IFP_SUPPORT (1 << 5) 2097 #define _BCM_FIELD_ACTION_NO_EM_SUPPORT (1 << 6) 2098 2099 #define _BCM_FIELD_ACTION_L3SWITCH_NEXT_HOP (1 << 0) 2100 #define _BCM_FIELD_ACTION_L3SWITCH_ECMP (1 << 1) 2101 2102 #define _FP_INVALID_ACTION_VAL (-1) 2103 2104 /* _FP_ACTION_* macros require the following declaration 2105 * in any function which uses them. 2106 */ 2107 #define _FP_ACTION_DECL \ 2108 int _rv_; \ 2109 _bcm_field_action_offset_t _fp_action_offset_; 2110 2111 /* Add Action to stage actions set. */ 2112 #define _FP_ACTION_ADD(_unit_, _stage_fc_, _action_, _flags_, \ 2113 _aset_, _offset1_, _width1_, _value1_, \ 2114 _offset2_, _width2_, _value2_, \ 2115 _offset3_, _width3_, _value3_, \ 2116 _offset4_, _width4_, _value4_, \ 2117 _offset5_, _width5_, _value5_) \ 2118 do { \ 2119 sal_memset(&(_fp_action_offset_), 0, \ 2120 sizeof(_fp_action_offset_)); \ 2121 (_fp_action_offset_).flags |= (_flags_); \ 2122 (_fp_action_offset_).aset = (_aset_); \ 2123 (_fp_action_offset_).offset[0] = (_offset1_); \ 2124 (_fp_action_offset_).width[0] = (_width1_); \ 2125 (_fp_action_offset_).value[0] = (_value1_); \ 2126 (_fp_action_offset_).offset[1] = (_offset2_); \ 2127 (_fp_action_offset_).width[1] = (_width2_); \ 2128 (_fp_action_offset_).value[1] = (_value2_); \ 2129 (_fp_action_offset_).offset[2] = (_offset3_); \ 2130 (_fp_action_offset_).width[2] = (_width3_); \ 2131 (_fp_action_offset_).value[2] = (_value3_); \ 2132 (_fp_action_offset_).offset[3] = (_offset4_); \ 2133 (_fp_action_offset_).width[3] = (_width4_); \ 2134 (_fp_action_offset_).value[3] = (_value4_); \ 2135 (_fp_action_offset_).offset[4] = (_offset5_); \ 2136 (_fp_action_offset_).width[4] = (_width5_); \ 2137 (_fp_action_offset_).value[4] = (_value5_); \ 2138 (_fp_action_offset_).next = NULL; \ 2139 _rv_ =_bcm_field_action_insert((_unit_), (_stage_fc_), \ 2140 (_action_), &(_fp_action_offset_)); \ 2141 BCM_IF_ERROR_RETURN(_rv_); \ 2142 } while (0) 2143 2144 /* Add single offset, width, value for action. */ 2145 #define _FP_ACTION_ADD_ONE(_unit_, _stage_fc_, _action_, _flags_, \ 2146 _offset1_, _width1_, _value1_) \ 2147 _FP_ACTION_ADD((_unit_), (_stage_fc_),(_action_), \ 2148 (_flags_), 0, (_offset1_), (_width1_), \ 2149 (_value1_), 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 2150 0, 0, 0) 2151 2152 #define _FP_ACTION_ADD_TWO(_unit_, _stage_fc_, _action_, _flags_, \ 2153 _offset1_, _width1_, _value1_, \ 2154 _offset2_, _width2_, _value2_) \ 2155 _FP_ACTION_ADD((_unit_), (_stage_fc_),(_action_), \ 2156 (_flags_), 0, (_offset1_), (_width1_), \ 2157 (_value1_), (_offset2_), (_width2_), \ 2158 (_value2_), 0, 0, 0, 0, 0, 0, 0, 0, 0) 2159 2160 #define _FP_ACTION_ADD_THREE(_unit_, _stage_fc_, _action_, _flags_, \ 2161 _offset1_, _width1_, _value1_, \ 2162 _offset2_, _width2_, _value2_, \ 2163 _offset3_, _width3_, _value3_) \ 2164 _FP_ACTION_ADD((_unit_), (_stage_fc_),(_action_), \ 2165 (_flags_), 0, (_offset1_), (_width1_), \ 2166 (_value1_), (_offset2_), (_width2_), \ 2167 (_value2_), (_offset3_), (_width3_), \ 2168 (_value3_), 0, 0, 0, 0, 0, 0) 2169 2170 #define _FP_ACTION_ADD_FOUR(_unit_, _stage_fc_, _action_, _flags_, \ 2171 _offset1_, _width1_, _value1_, \ 2172 _offset2_, _width2_, _value2_, \ 2173 _offset3_, _width3_, _value3_, \ 2174 _offset4_, _width4_, _value4_) \ 2175 _FP_ACTION_ADD((_unit_), (_stage_fc_),(_action_), \ 2176 (_flags_), 0, (_offset1_), (_width1_), \ 2177 (_value1_), (_offset2_), (_width2_), \ 2178 (_value2_), (_offset3_), (_width3_), \ 2179 (_value3_), (_offset4_), (_width4_), \ 2180 (_value4_), 0, 0, 0) 2181 2182 #define _FP_ACTION_ADD_FIVE(_unit_, _stage_fc_, _action_, _flags_, \ 2183 _offset1_, _width1_, _value1_, \ 2184 _offset2_, _width2_, _value2_, \ 2185 _offset3_, _width3_, _value3_, \ 2186 _offset4_, _width4_, _value4_, \ 2187 _offset5_, _width5_, _value5_) \ 2188 _FP_ACTION_ADD((_unit_), (_stage_fc_),(_action_), \ 2189 (_flags_), 0, (_offset1_), (_width1_), \ 2190 (_value1_), (_offset2_), (_width2_), \ 2191 (_value2_), (_offset3_), (_width3_), \ 2192 (_value3_), (_offset4_), (_width4_), \ 2193 (_value4_), (_offset5_), (_width5_), \ 2194 (_value5_)) 2195 2196 /*Add actions along with width, offset, value, flags and action set */ 2197 #define _FP_ACTION_WITH_ASET_ADD_ONE(_unit_, _stage_fc_, _action_, _flags_, \ 2198 _aset_, _offset1_, _width1_, _value1_) \ 2199 _FP_ACTION_ADD((_unit_), (_stage_fc_), (_action_), \ 2200 (_flags_), (_aset_), (_offset1_), \ 2201 (_width1_), (_value1_), 0, 0, 0, 0, 0, \ 2202 0, 0, 0, 0, 0, 0, 0) 2203 2204 #define _FP_ACTION_WITH_ASET_ADD_TWO(_unit_, _stage_fc_, _action_, _flags_, \ 2205 _aset_, _offset1_, _width1_, _value1_,\ 2206 _offset2_, _width2_, _value2_) \ 2207 _FP_ACTION_ADD((_unit_), (_stage_fc_), (_action_), \ 2208 (_flags_), (_aset_), (_offset1_), (_width1_),\ 2209 (_value1_), (_offset2_), (_width2_), \ 2210 (_value2_), 0, 0, 0, 0, 0, 0, 0, 0, 0) 2211 2212 #define _FP_ACTION_WITH_ASET_ADD_THREE(_unit_, _stage_fc_, _action_, _flags_, \ 2213 _aset_, _offset1_, _width1_, _value1_, \ 2214 _offset2_, _width2_, _value2_, \ 2215 _offset3_, _width3_, _value3_) \ 2216 _FP_ACTION_ADD((_unit_), (_stage_fc_),(_action_), \ 2217 (_flags_), (_aset_), (_offset1_), (_width1_),\ 2218 (_value1_), (_offset2_), (_width2_), \ 2219 (_value2_), (_offset3_), (_width3_), \ 2220 (_value3_), 0, 0, 0, 0, 0, 0) 2221 2222 #define _FP_ACTION_WITH_ASET_ADD_FOUR(_unit_, _stage_fc_, _action_, _flags_, \ 2223 _aset_, _offset1_, _width1_, _value1_,\ 2224 _offset2_, _width2_, _value2_, \ 2225 _offset3_, _width3_, _value3_, \ 2226 _offset4_, _width4_, _value4_) \ 2227 _FP_ACTION_ADD((_unit_), (_stage_fc_),(_action_), \ 2228 (_flags_), (_aset_), (_offset1_), (_width1_),\ 2229 (_value1_), (_offset2_), (_width2_), \ 2230 (_value2_), (_offset3_), (_width3_), \ 2231 (_value3_), (_offset4_), (_width4_), \ 2232 (_value4_), 0, 0, 0) 2233 2234 #define _FP_ACTION_WITH_ASET_ADD_FIVE(_unit_, _stage_fc_, _action_, _flags_, \ 2235 _aset_, _offset1_, _width1_, _value1_,\ 2236 _offset2_, _width2_, _value2_, \ 2237 _offset3_, _width3_, _value3_, \ 2238 _offset4_, _width4_, _value4_, \ 2239 _offset5_, _width5_, _value5_) \ 2240 _FP_ACTION_ADD((_unit_), (_stage_fc_),(_action_), \ 2241 (_flags_), (_aset_), (_offset1_), (_width1_),\ 2242 (_value1_), (_offset2_), (_width2_), \ 2243 (_value2_), (_offset3_), (_width3_), \ 2244 (_value3_), (_offset4_), (_width4_), \ 2245 (_value4_), (_offset5_), (_width5_), \ 2246 (_value5_)) 2247 2248 #define ACTION_CHECK(width, param) \ 2249 if (((1 << width) - 1) < param) { \ 2250 return BCM_E_PARAM; \ 2251 } 2252 2253 #define ACTION_GET(_unit_, _f_ent_, _buf_, _action_, _flags_, _a_offset_) \ 2254 do { \ 2255 int _rv_; \ 2256 _rv_ = _bcm_field_action_val_get((_unit_), (_f_ent_), \ 2257 (_buf_), (_action_), \ 2258 (_flags_), (_a_offset_)); \ 2259 BCM_IF_ERROR_RETURN(_rv_); \ 2260 } while (0) 2261 2262 #define ACTION_OFFSET_GET(_unit_, _stagefc_, _action_, _a_offset_, _flags_) \ 2263 do { \ 2264 int _rv_; \ 2265 _rv_ = _bcm_field_action_offset_get((_unit_), (_stagefc_), \ 2266 (_action_), (_a_offset_), \ 2267 (_flags_)); \ 2268 BCM_IF_ERROR_RETURN(_rv_); \ 2269 } while (0) 2270 2271 #define ACTION_SET(_unit_, _f_ent_, _buf_, _a_offset_) \ 2272 do { \ 2273 int _rv_; \ 2274 _rv_ = _bcm_field_action_val_set((_unit_), (_f_ent_), \ 2275 (_buf_), (_a_offset_)); \ 2276 BCM_IF_ERROR_RETURN(_rv_); \ 2277 } while (0) 2278 2279 #define ACTION_RESOLVE(_unit_, _fent_, _fa_, _params_) \ 2280 do { \ 2281 int _rv_; \ 2282 _rv_ = _bcm_field_action_resolve((_unit_), (_fent_), \ 2283 (_fa_), (_params_)); \ 2284 BCM_IF_ERROR_RETURN(_rv_); \ 2285 } while (0) 2286 2287 2288 /* Internal Actions */ 2289 typedef enum _bcm_field_internal_action_e { 2290 _bcmFieldActionEditCtrlId = bcmFieldActionCount,/* [0x00] Edit Ctrl ID. */ 2291 _bcmFieldActionExtractionCtrlId, /* [0x01] Extraction Ctrl ID. */ 2292 _bcmFieldActionOpaque1, /* [0x02] Opaque1. */ 2293 _bcmFieldActionOpaque2, /* [0x03] Opaque2. */ 2294 _bcmFieldActionOpaque3, /* [0x04] Opaque3. */ 2295 _bcmFieldActionOpaque4, /* [0x05] Opaque4. */ 2296 _bcmFieldActionCount /* [0x06] Always last not used. */ 2297 } _bcm_field_internal_action_t; 2298 2299 /* 2300 * Used to specify the actions that can be taken by the entries in a 2301 * group 2302 */ 2303 typedef struct _bcm_field_aset_s { 2304 SHR_BITDCL w[_SHR_BITDCLSIZE(_bcmFieldActionCount)]; 2305 bcm_field_action_width_t actions_width[16]; /* Actions width struct, used by 2306 bcm_petra_field_action_width_set to 2307 set width for certain action, 16 is 2308 max_actions_per_db */ 2309 } _bcm_field_aset_t; 2310 2311 /* EXTRACTION CTRL IDs */ 2312 #define _BCM_FIELD_EXTR_CTRL_ID_INT_ENABLE 0xEE /* INT (Inband-Telemetry) Encap Enable */ 2313 #define _BCM_FIELD_EXTR_CTRL_ID_ING_OUTER_VLAN_INSERT 0x10 /* Insert ING Outer Vlan to Egr Outer Vlan */ 2314 #define _BCM_FIELD_EXTR_CTRL_ID_ERSPAN3_VLAN_PKT_COPY 0x1 /* To add Incoming VLAN to ERSPAN3 header */ 2315 2316 /* EDIT CTRL IDs */ 2317 #define _BCM_FIELD_EDIT_CTRL_ID_INT_ENABLE 0xE0 /* INT (Inband-Telemetry) Encap Enable */ 2318 #define _BCM_FIELD_EDIT_CTRL_ID_INT_TURNAROUND 0xD0 /* INT (Inband-Telemetry) Turnaround */ 2319 #endif /* BCM_TOMAHAWK_SUPPORT */ 2320 /* 2321 * Stage flags. 2322 */ 2323 2324 /* Separate packet byte counters. */ 2325 #define _FP_STAGE_SEPARATE_PACKET_BYTE_COUNTERS (1 << 0) 2326 2327 /* Global meter pools . */ 2328 #define _FP_STAGE_GLOBAL_METER_POOLS (1 << 1) 2329 2330 /* Global counters. */ 2331 #define _FP_STAGE_GLOBAL_COUNTERS (1 << 2) 2332 2333 /* Auto expansion support. */ 2334 #define _FP_STAGE_AUTO_EXPANSION (1 << 3) 2335 2336 /* Slice enable/disable support. */ 2337 #define _FP_STAGE_SLICE_ENABLE (1 << 4) 2338 2339 /* Only first half of slice is valid.. */ 2340 #define _FP_STAGE_HALF_SLICE (1 << 5) 2341 2342 /* Global counter pools . */ 2343 #define _FP_STAGE_GLOBAL_CNTR_POOLS (1 << 6) 2344 2345 /* Only first quarter of slice is valid.. */ 2346 #define _FP_STAGE_QUARTER_SLICE (1 << 7) 2347 2348 #define _FP_STAGE_MULTI_PIPE_COUNTERS (1 << 8) 2349 2350 /* NUM_PIPE(unit) defines the number of 2351 pipes supported for a specific chip */ 2352 /* Maximum number of FP instances. */ 2353 #if defined (BCM_TOMAHAWK3_SUPPORT) 2354 #define _FP_MAX_NUM_PIPES 8 2355 #else 2356 #define _FP_MAX_NUM_PIPES 4 2357 #endif 2358 2359 #define _FP_GLOBAL_INST (-1) 2360 2361 /* Default FP instance. */ 2362 #define _FP_DEF_INST (0) 2363 2364 2365 #if defined(BCM_TOMAHAWK_SUPPORT) 2366 /* Maximum number of logical table partitions supported. */ 2367 #define _FP_MAX_LT_PARTS(unit) _bcm_field_th_max_lt_parts_get(unit) 2368 2369 /* Total number of logical tables supported. */ 2370 #define _FP_MAX_NUM_LT (32) 2371 2372 /* Maximum value supported for a LT partition in hardware. */ 2373 #define _FP_MAX_LT_PART_PRIO(unit) _bcm_field_max_lt_part_prio_get(unit) 2374 2375 /* Total number of extractor levels. */ 2376 #define _FP_EXT_LEVEL_COUNT (4) 2377 2378 /* 2379 * Field Extractors selector macros 2380 * 2381 * These are for resolving if the select code has meaning or is really 2382 * a don't care. 2383 */ 2384 #define _FP_EXT_SELCODE_DONT_CARE (-1) 2385 #define _FP_EXT_SELCODE_DONT_USE (-2) 2386 2387 #define _FP_EXT_SELCODE_SET(_selcode_qset, _selcode) \ 2388 sal_memset((_selcode_qset), (int8)_selcode, sizeof(_field_ext_sel_t)); 2389 2390 #define _FP_EXT_SELCODE_CLEAR(_selcode_) \ 2391 _FP_EXT_SELCODE_SET(&(_selcode_), _FP_EXT_SELCODE_DONT_CARE) 2392 2393 /* Maximum number of bus chunks used by a qualifier. */ 2394 #define _FP_QUAL_MAX_CHUNKS (128) 2395 2396 /* Qualify Set/Get Flags. */ 2397 #define _FP_QUALIFIER_ADD 1 << 0 2398 #define _FP_QUALIFIER_DEL 1 << 1 2399 2400 #if defined (BCM_TOMAHAWK_SUPPORT) 2401 2402 #define BCM_FIELD_METER_POOL_USED_BY_NONE (0) 2403 #define BCM_FIELD_METER_POOL_USED_BY_IFP (1) 2404 #define BCM_FIELD_METER_POOL_USED_BY_EM (2) 2405 2406 #endif 2407 /* 2408 * Typedef: 2409 * _field_em_mode_t 2410 * Purpose: 2411 * Field Exact Match Modes 2412 */ 2413 typedef enum _field_em_mode_e { 2414 _FieldExactMatchMode128 = 0, 2415 _FieldExactMatchMode160 = 1, 2416 _FieldExactMatchMode320 = 2 2417 } _field_em_mode_t; 2418 2419 /* 2420 * Typedef: 2421 * _bcm_field_action_set_t 2422 * Purpose: 2423 * Field Action set size and hw Fields 2424 */ 2425 typedef struct _bcm_field_action_set_s { 2426 uint16 size; /* Action set size. */ 2427 uint8 is_color_dependent; 2428 /*set to 1 for color dependent action sets */ 2429 soc_field_t hw_field; 2430 /* hardware field name associated with aset */ 2431 } _bcm_field_action_set_t; 2432 2433 /* 2434 * Typedef: 2435 * _field_action_set_type_t 2436 * Purpose: 2437 * Field Action Set for EM and IFP 2438 */ 2439 typedef enum _field_action_set_type_e { 2440 _FieldActionSetNone = 0, 2441 _FieldActionProtectionSwitchingDropOverrideSet = 1, 2442 _FieldActionIfpDlbAlternatePathControlSet = 2, 2443 _FieldActionEcmpDlbActionSet = 3, 2444 _FieldActionHgtLagDlbActionSet = 4, 2445 _FieldActionEcmp2RhActionSet = 5, 2446 _FieldActionEcmp1RhActionSet = 6, 2447 _FieldActionLagRhActionSet = 7, 2448 _FieldActionHgtRhActionSet = 8, 2449 _FieldActionLoopbackProfileActionSet = 9, 2450 _FieldActionExtractionCtrlIdActionSet = 10, 2451 _FieldActionOpaque4ActionSet = 11, 2452 _FieldActionOpaque3ActionSet = 12, 2453 _FieldActionOpaque2ActionSet = 13, 2454 _FieldActionOpaque1ActionSet = 14, 2455 _FieldActionTxTimestampInsertionSet = 15, 2456 _FieldActionRxTimestampInsertionSet = 16, 2457 _FieldActionIgnoreFcoEZoneCheckSet = 17, 2458 _FieldActionGreenToPidSet = 18, 2459 _FieldActionMirrorOverrideSet = 19, 2460 _FieldActionNatOverrideSet = 20, 2461 _FieldActionSflowSet = 21, 2462 _FieldActionCutThrOverrideSet = 22, 2463 _FieldActionUrpfOverrideSet = 23, 2464 _FieldActionTtlOverrideSet = 24, 2465 _FieldActionLbControlSet = 25, 2466 _FieldActionDropSet = 26, 2467 _FieldActionChangeCpuCosSet = 27, 2468 _FieldActionMirrorSet = 28, 2469 _FieldActionNatSet = 29, 2470 _FieldActionCopyToCpuSet = 30, 2471 _FieldActionL3SwChangeL2Set = 31, 2472 _FieldActionRedirectSet = 32, 2473 _FieldActionCounterSet = 33, 2474 _FieldActionChangeEcnSet = 34, 2475 _FieldActionChangePktPriSet = 35, 2476 _FieldActionChangeDscpTosSet = 36, 2477 _FieldActionChangeDropPrecendenceSet = 37, 2478 _FieldActionChangeCosOrIntPriSet = 38, 2479 _FieldActionChangeIntCNSet = 39, 2480 _FieldActionChangeInputPrioritySet = 40, 2481 _FieldActionInstrumentationSet = 41, 2482 _FieldActionEditCtrlIdSet = 42, 2483 _FieldActionFcoEVsanSet = 43, 2484 _FieldActionMeterSet = 44, 2485 _FieldActionTimestampInsertionSet = 45, 2486 _FieldActionDelayedDropSet = 46, 2487 _FieldActionDelayedRedirectSet = 47, 2488 _FieldActionEcmpDlbMonitorSet = 48, 2489 _FieldActionElephantTrapSet = 49, 2490 _FieldActionInbandTelemetrySet = 50, 2491 _FieldActionSetCount = 51 2492 } _field_action_set_type_t; 2493 #if defined(BCM_TOMAHAWK_SUPPORT) 2494 /* Aset size for Trident3 */ 2495 #define _FP_ASET_DATA_SIZE_FOR_POLICY_NARROW 181 2496 #define _FP_ASET_DATA_SIZE_FOR_POLICY_WIDE 367 2497 #define _FP_ASET_DATA_SIZE_WITH_ALL_ACTIONS 428 2498 2499 /* Max Action profile entries*/ 2500 #define _FP_FIELD_ACTION_PROFILE_ENTRIES 32 2501 /* Max Action profile entries per group 2502 Depends on which mode the group is in 2503 1 if group is narrow or intraslice mode 2504 2 if group is in doublewide mode 2505 3 if group is in triple wide mode 2506 */ 2507 #define MAX_ACT_PROF_ENTRIES_PER_GROUP 3 2508 /* IFP meter pools information. */ 2509 #define BCM_FIELD_INGRESS_TH_NUM_METER_POOLS 8 2510 #define BCM_FIELD_INGRESS_TH3_NUM_METER_POOLS 2 2511 #define BCM_FIELD_INGRESS_TH_NUM_METER_PAIRS_PER_POOL 128 2512 #define BCM_FIELD_INGRESS_TD3_NUM_METER_PAIRS_PER_POOL 384 2513 #define BCM_FIELD_ACTION_PRIO_PKT_AND_INT_TEST(action) \ 2514 ((action == bcmFieldActionPrioPktAndIntCancel) \ 2515 || (action == bcmFieldActionGpPrioPktAndIntCancel) \ 2516 || (action == bcmFieldActionYpPrioPktAndIntCancel) \ 2517 || (action == bcmFieldActionRpPrioPktAndIntCancel) \ 2518 || (action == bcmFieldActionPrioPktAndIntTos) \ 2519 || (action == bcmFieldActionGpPrioPktAndIntTos) \ 2520 || (action == bcmFieldActionYpPrioPktAndIntTos) \ 2521 || (action == bcmFieldActionRpPrioPktAndIntTos) \ 2522 || (action == bcmFieldActionPrioPktAndIntNew) \ 2523 || (action == bcmFieldActionGpPrioPktAndIntNew) \ 2524 || (action == bcmFieldActionYpPrioPktAndIntNew) \ 2525 || (action == bcmFieldActionGpPrioPktAndIntNew) \ 2526 || (action == bcmFieldActionPrioPktAndIntCopy) \ 2527 || (action == bcmFieldActionGpPrioPktAndIntCopy) \ 2528 || (action == bcmFieldActionYpPrioPktAndIntCopy) \ 2529 || (action == bcmFieldActionRpPrioPktAndIntCopy)) 2530 2531 /* Exact Match Action Set Size in Bits. */ 2532 #define EM_ACTION_METER_SET_SIZE 18 2533 #define EM_ACTION_GREEN_TO_PID_SET_SIZE 1 2534 #define EM_ACTION_MIRROR_OVERRIDE_SET_SIZE 1 2535 #define EM_ACTION_NAT_OVERRIDE_SET_SIZE 1 2536 #define EM_ACTION_SFLOW_SET_SIZE 1 2537 #define EM_ACTION_CUT_THR_OVERRIDE_SET_SIZE 1 2538 #define EM_ACTION_URPF_OVERRIDE_SET_SIZE 1 2539 #define EM_ACTION_TTL_OVERRIDE_SET_SIZE 1 2540 #define EM_ACTION_LB_CONTROL_SET_SIZE 3 2541 #define EM_ACTION_DROP_SET_SIZE 6 2542 #define EM_ACTION_CHANGE_CPU_COS_SET_SIZE 8 2543 #define EM_ACTION_MIRROR_SET_SIZE 12 2544 #define EM_ACTION_NAT_SET_SIZE 12 2545 #define EM_ACTION_COPY_TO_CPU_SET_SIZE 17 2546 #define EM_ACTION_L3SW_CHANGE_L2_SET_SIZE 23 2547 #define EM_ACTION_EM_REDIRECT_SET_SIZE 25 2548 #define EM_ACTION_COUNTER_SET_SIZE 25 2549 #define EM_ACTION_COUNTER_SET_SIZE_TH2 26 2550 #define EM_ACTION_TIMESTAMP_SET_SIZE 4 2551 #define EM_ACTION_DLB_ECMP_SET_SIZE 2 2552 #define EM_ACTION_DLB_HGT_LAG_SET_SIZE 2 2553 #define EM_ACTION_PROTECTION_SWITCHING_SET_SIZE 1 2554 #define EM_ACTION_INSTRUMENTATION_SET_SIZE 1 2555 #define EM_ACTION_DLB_ALTERNATE_PATH_CONTROL_SET_SIZE 10 2556 2557 /* Exact Match Key and Action Data Size in Bits. */ 2558 #define EM_MODE128_KEY_SIZE 128 2559 #define EM_MODE128_KEY_PART0_SIZE 101 2560 #define EM_MODE128_KEY_PART1_SIZE 27 2561 #define EM_MODE128_ACTION_DATA_SIZE 50 2562 #define EM_MODE160_KEY_SIZE 160 2563 #define EM_MODE160_KEY_PART0_SIZE 101 2564 #define EM_MODE160_KEY_PART1_SIZE 59 2565 #define EM_MODE160_ACTION_DATA_SIZE 18 2566 #define EM_MODE320_KEY_SIZE 320 2567 #define EM_MODE320_KEY_PART0_SIZE 101 2568 #define EM_MODE320_KEY_PART1_SIZE 101 2569 #define EM_MODE320_KEY_PART2_SIZE 101 2570 #define EM_MODE320_KEY_PART3_SIZE 17 2571 #define TD3_EM_MODE128_KEY_PART0_SIZE 103 2572 #define TD3_EM_MODE128_KEY_PART1_SIZE 25 2573 #define TD3_EM_MODE160_KEY_PART0_SIZE 103 2574 #define TD3_EM_MODE160_KEY_PART1_SIZE 57 2575 #define TD3_EM_MODE320_KEY_PART0_SIZE 103 2576 #define TD3_EM_MODE320_KEY_PART1_SIZE 105 2577 #define TD3_EM_MODE320_KEY_PART2_SIZE 105 2578 #define TD3_EM_MODE320_KEY_PART3_SIZE 7 2579 #define TH3_EM_MODE128_KEY_PART0_SIZE 115 2580 #define TH3_EM_MODE128_KEY_PART1_SIZE 13 2581 #define TH3_EM_MODE160_KEY_PART0_SIZE 115 2582 #define TH3_EM_MODE160_KEY_PART1_SIZE 45 2583 #define TH3_EM_MODE320_KEY_PART0_SIZE 115 2584 #define TH3_EM_MODE320_KEY_PART1_SIZE 117 2585 #define TH3_EM_MODE320_KEY_PART2_SIZE 88 2586 #define EM_MODE320_ACTION_DATA_SIZE 60 2587 2588 #define EM_ENTRY_PART0_KEYSIZE 160 2589 #define EM_ENTRY_PART1_KEYSIZE 160 2590 2591 /* Exact Match Default Policy Action Data Size in Bits. */ 2592 #define EM_DEFAULT_POLICY_ACTION_DATA_SIZE 60 2593 #endif 2594 /* 2595 * Typedef: 2596 * _field_em_action_set_t 2597 * Purpose: 2598 * To set individual action set data 2599 */ 2600 typedef struct _field_action_set_s { 2601 uint8 valid; 2602 uint32 data[2]; 2603 } _field_em_action_set_t; 2604 2605 /* 2606 * Typedef: 2607 * _field_keygen_profiles_t 2608 * Purpose: 2609 * TCAM Key generation program profile tables information structure. 2610 */ 2611 typedef struct _field_keygen_profiles_s { 2612 soc_profile_mem_t profile; /* keygen profile. */ 2613 } _field_keygen_profiles_t; 2614 2615 /* 2616 * Typedef: 2617 * _field_lt_slice_t 2618 * Purpose: 2619 * Logical Table Selection TCAM slice information structure. 2620 */ 2621 typedef struct _field_lt_slice_s { 2622 uint8 slice_number; /* Slice number. */ 2623 int start_tcam_idx; /* Slice first entry TCAM index. */ 2624 int entry_count; /* Number of entries in the slice. */ 2625 int free_count; /* Number of free entries. */ 2626 _field_stage_id_t stage_id; /* Pipeline Stage ID. */ 2627 struct _field_lt_entry_s **entries; /* List of entries pointer. */ 2628 struct _field_presel_entry_s **p_entries; /* List of Presel entries pointer.*/ 2629 struct _field_lt_slice_s *next; /* Linked list of auto expanded groups. */ 2630 struct _field_lt_slice_s *prev; /* Linked list of auto expanded groups. */ 2631 uint16 slice_flags; /* Slice flags. */ 2632 uint16 group_flags; /* Group flags. */ 2633 } _field_lt_slice_t; 2634 2635 /* 2636 * Typedef: 2637 * _field_lt_tcam_t 2638 * Purpose: 2639 * Logical Table Selection TCAM Entry Key, Mask and Data information 2640 * structure. 2641 */ 2642 typedef struct _field_lt_tcam_s { 2643 uint32 *key; /* HW entry key replica. */ 2644 uint32 *mask; /* HW entry mask replica. */ 2645 uint16 key_size; /* HW entry Key size. */ 2646 uint32 *data; /* HW entry data replica. */ 2647 uint16 data_size; /* HW entry Data size. */ 2648 } _field_lt_tcam_t; 2649 2650 /* 2651 * Typedef: 2652 * _field_lt_entry_t 2653 * Purpose: 2654 * Logical Table Selection TCAM Entry information structure. 2655 */ 2656 typedef struct _field_lt_entry_s { 2657 uint32 flags; /* Entry flags _FP_ENTRY_XXX. */ 2658 bcm_field_entry_t eid; /* Unique identifier. */ 2659 int index; /* Entry slice index. */ 2660 int prio; /* Entry priority. */ 2661 _field_lt_slice_t *lt_fs; /* LT slice where entry lives. */ 2662 struct _field_lt_tcam_s tcam; /* Fields to be written in logical table 2663 select TCAM. */ 2664 struct _field_action_s *actions; /* Lined list of actions per entry. */ 2665 struct _field_group_s *group; /* Group with which this entry 2666 associated. */ 2667 struct _field_lt_entry_s *next; /* LT entry lookup linked list */ 2668 } _field_lt_entry_t; 2669 2670 /* 2671 * Typedef: 2672 * _field_lt_config_t 2673 * Purpose: 2674 * Logical Tables configuration information structure. 2675 */ 2676 typedef struct _field_lt_config_s { 2677 int valid; /* Map is valid. */ 2678 int lt_id; /* Logical Table ID. */ 2679 int *lt_part_pri; /* Logical table partition priority. */ 2680 uint32 lt_part_map; /* Logical Table to Physical slice 2681 mapping. */ 2682 int lt_action_pri; /* Logical Table action priority. */ 2683 int priority; /* Group priority. */ 2684 int flags; /* Group flags. */ 2685 bcm_field_entry_t lt_entry; /* LT selection entry ID. */ 2686 } _field_lt_config_t; 2687 2688 /* 2689 * Typedef: 2690 * _field_group_lt_status_t 2691 * Purpose: 2692 * Field Group Logical Table Status structure. 2693 */ 2694 typedef struct _field_group_lt_status_s { 2695 int entries_total; /* Total possible entries in group. */ 2696 int entries_free; /* Unused entries in LT slice. */ 2697 int entry_count; /* Number of entries in the group. */ 2698 } _field_group_lt_status_t; 2699 2700 /* 2701 * Typedef: 2702 * _field_ext_sel_t 2703 * Purpose: 2704 * Logical table key generation program control selectors. 2705 */ 2706 typedef struct _field_ext_sel_s { 2707 int8 l1_e32_sel[4]; /* Level 1 32b extractors. */ 2708 int8 l1_e16_sel[10]; /* Level 1 16b extractors. */ 2709 int8 l1_e8_sel[7]; /* Level 1 8b extractors. */ 2710 int8 l1_e4_sel[10]; /* Level 1 4b extractors. */ 2711 int8 l1_e2_sel[8]; /* Level 1 2b extractors. */ 2712 int8 l2_e16_sel[10]; /* Level 2 16b extractors. */ 2713 int8 l2_e4_sel[16]; /* Level 2 4b extractors. */ 2714 int8 l2_e2_sel[8]; /* Level 2 2b extractors. */ 2715 int16 l2_e1_sel[3]; /* Level 2 1b extractors. */ 2716 int16 l3_e1_sel[2]; /* Level 3 1b extractors. */ 2717 int8 l3_e2_sel[5]; /* Level 3 2b extractors. */ 2718 int8 l3_e4_sel[21]; /* Level 3 4b extractors. */ 2719 int8 pmux_sel[15]; /* Post muxing extractors. */ 2720 int8 intraslice; /* Intraslice double wide selection. */ 2721 int8 secondary; /* Secondary selector. */ 2722 int8 ipbm_present; /* Post mux IPBM in final key. */ 2723 int8 normalize_l3_l4_sel; /* Normalize L3 and L4 address. */ 2724 int8 normalize_mac_sel; /* Normalize L2 SA & DA. */ 2725 int8 aux_tag_a_sel; /* Auxiliary Tag A Selector. */ 2726 int8 aux_tag_b_sel; /* Auxiliary Tag B Selector. */ 2727 int8 aux_tag_c_sel; /* Auxiliary Tag C Selector. */ 2728 int8 aux_tag_d_sel; /* Auxiliary Tag d Selector. */ 2729 int8 tcp_fn_sel; /* TCP function selector. */ 2730 int8 tos_fn_sel; /* TOS function selector. */ 2731 int8 ttl_fn_sel; /* TTL function selector. */ 2732 int8 class_id_cont_a_sel; /* Class ID container A selector. */ 2733 int8 class_id_cont_b_sel; /* Class ID container B selector. */ 2734 int8 class_id_cont_c_sel; /* Class ID container C selector. */ 2735 int8 class_id_cont_d_sel; /* Class ID container D selector. */ 2736 int8 src_cont_a_sel; /* SRC container A selector. */ 2737 int8 src_cont_b_sel; /* SRC container B selector. */ 2738 int8 src_dest_cont_0_sel; /* SRC or DST container 0 selector. */ 2739 int8 src_dest_cont_1_sel; /* SRC or DST container 1 selector. */ 2740 int8 dst_cont_a_sel; /* DST container 0 selector. */ 2741 int8 dst_cont_b_sel; /* DST container 1 selector. */ 2742 int8 udf_sel; /* UDF selector. */ 2743 uint32 keygen_index; /* LT keygen program profile index. */ 2744 int8 ipbm_source; /* Ingress Port Bitmap Source. */ 2745 int8 alt_ttl_fn_sel; /* ALT TTL function selector */ 2746 } _field_ext_sel_t; 2747 2748 /* 2749 * Typedef: 2750 * _field_keygen_ext_sel_t 2751 * Purpose: 2752 * Key Generation extractor selector encodings. 2753 */ 2754 typedef enum _field_keygen_ext_sel_e { 2755 _FieldKeygenExtSelDisable = 0, /* Selector disabled. */ 2756 _FieldKeygenExtSelL1E32 = 1, /* Level1 32bit extractor. */ 2757 _FieldKeygenExtSelL1E16 = 2, /* Level1 16bit extractor. */ 2758 _FieldKeygenExtSelL1E8 = 3, /* Level1 8bit extractor. */ 2759 _FieldKeygenExtSelL1E4 = 4, /* Level1 4bit extractor. */ 2760 _FieldKeygenExtSelL1E2 = 5, /* Level1 2bit extractor. */ 2761 _FieldKeygenExtSelL2E16 = 6, /* Level2 16bit extractor. */ 2762 _FieldKeygenExtSelL2E4 = 7, /* 104 Passthru bits. */ 2763 _FieldKeygenExtSelL3E16 = 8, /* Level3 16bit extractor. */ 2764 _FieldKeygenExtSelL3E4 = 9, /* Level3 4bit extractor. */ 2765 _FieldKeygenExtSelL3E2 = 10, /* Level3 2bit extractor. */ 2766 _FieldKeygenExtSelL3E1 = 11, /* Level3 16bit extractor. */ 2767 _FieldKeygenExtSelL4 = 12, /* Level4 output. */ 2768 _FieldKeygenExtSelL4A = 13, /* Level4 Slice A output. */ 2769 _FieldKeygenExtSelL4B = 14, /* Level4 Slice B output. */ 2770 _FieldKeygenExtSelL4C = 15, /* Level4 Slice C output. */ 2771 _FieldKeygenExtSelL2AE16 = 16, /* Level2 Slice A 16bit extractor. */ 2772 _FieldKeygenExtSelL2BE16 = 17, /* Level2 Slice B 16 bit extractor. */ 2773 _FieldKeygenExtSelL2CE16 = 18, /* Level2 Slice C 16 bit extractor. */ 2774 _FieldKeygenExtSelL2AE4 = 19, /* Level2 Slice A 4bit extractor. */ 2775 _FieldKeygenExtSelL2BE4 = 20, /* Level2 Slice B 4bit extractor. */ 2776 _FieldKeygenExtSelL2CE4 = 21, /* Level2 Slice C 4bit extractor. */ 2777 _FieldKeygenExtSelL3AE16 = 22, /* Level3 Slice A 16bit extractor. */ 2778 _FieldKeygenExtSelL3BE16 = 23, /* Level3 Slice B 16bit extractor. */ 2779 _FieldKeygenExtSelL3CE16 = 24, /* Level3 Slice C 16bit extractor. */ 2780 _FieldKeygenExtSelL3AE4 = 25, /* Level3 Slice A 4bit extractor. */ 2781 _FieldKeygenExtSelL3BE4 = 26, /* Level3 Slice B 4bit extractor. */ 2782 _FieldKeygenExtSelL3CE4 = 27, /* Level3 Slice C 4bit extractor. */ 2783 _FieldKeygenExtSelCount = 28 /* Always Last. Not a usable value. */ 2784 } _field_keygen_ext_sel_t; 2785 2786 #define _BCM_FIELD_KEYGEN_EXT_SEL_STRINGS \ 2787 { \ 2788 "Disable", \ 2789 "L1E32", \ 2790 "L1E16", \ 2791 "L1E8", \ 2792 "L1E4", \ 2793 "L1E2", \ 2794 "L2E16", \ 2795 "L2E4", \ 2796 "L3E16", \ 2797 "L3E4", \ 2798 "L3E", \ 2799 "L3E1", \ 2800 "L4", \ 2801 "L4A", \ 2802 "L4B", \ 2803 "L4C", \ 2804 "L2AE16", \ 2805 "L2BE16", \ 2806 "L2CE16", \ 2807 "L2AE4", \ 2808 "L2BE4", \ 2809 "L2CE4", \ 2810 "L3AE16", \ 2811 "L3BE16", \ 2812 "L3CE16", \ 2813 "L3AE4", \ 2814 "L3BE4", \ 2815 "L3CE4", \ 2816 "Count" \ 2817 } 2818 2819 /* Max Preselector Entries Per Group */ 2820 #define _FP_PRESEL_ENTRIES_MAX_PER_GROUP 4 2821 2822 /* 2823 * Typedef: 2824 * _field_class_table_bmp_t 2825 * Purpose: 2826 * Class table bitmap for tracking allocation. 2827 */ 2828 typedef struct _field_class_table_bmp_s { 2829 SHR_BITDCL *w; 2830 } _field_class_table_bmp_t; 2831 2832 #define _FP_CLASS_TABLE_BMP_FREE(bmp, size) sal_free((bmp).w) 2833 #define _FP_CLASS_TABLE_BMP_ADD(bmp, cl) SHR_BITSET(((bmp).w), (cl)) 2834 #define _FP_CLASS_TABLE_BMP_REMOVE(bmp, cl) SHR_BITCLR(((bmp).w), (cl)) 2835 #define _FP_CLASS_TABLE_BMP_TEST(bmp, cl) SHR_BITGET(((bmp).w), (cl)) 2836 2837 /* 2838 * Typedef: 2839 * _field_class_type_t 2840 * Purpose: 2841 * Field Class Types. 2842 */ 2843 typedef enum _field_class_type_e { 2844 _FieldClassEtherType = 0, 2845 _FieldClassTtl = 1, 2846 _FieldClassToS = 2, 2847 _FieldClassIpProto = 3, 2848 _FieldClassL4SrcPort = 4, 2849 _FieldClassL4DstPort = 5, 2850 _FieldClassTcp = 6, 2851 _FieldClassSrcCompression = 7, 2852 _FieldClassDstCompression = 8, 2853 _FieldClassIpTunnelTtl = 9, 2854 _FieldClassCount = 10 2855 } _field_class_type_t; 2856 2857 #define _BCM_FIELD_CLASS_TYPE_STRINGS \ 2858 {"EtherType", \ 2859 "TTL", \ 2860 "TOS", \ 2861 "IPProtocol", \ 2862 "L4SrcPort", \ 2863 "L4DstPort", \ 2864 "TCP", \ 2865 "SrcCompression", \ 2866 "DstCompression", \ 2867 "IpTunnelTtl"} 2868 2869 /* 2870 * Typedef: 2871 * _field_class_info_s { 2872 * Purpose: 2873 * Field Class Table information. 2874 */ 2875 typedef struct _field_class_info_s { 2876 uint32 flags; 2877 _field_class_type_t classtype; 2878 uint32 total_entries_used; 2879 uint32 total_entries_available; 2880 _field_class_table_bmp_t class_bmp; 2881 } _field_class_info_t; 2882 2883 /* Maximum number of FP Class tables. */ 2884 #define _FP_MAX_NUM_CLASS_TYPES _FieldClassCount 2885 2886 /* Total number of entries in class table */ 2887 #define _FP_MAX_NUM_CLASS_TTL soc_mem_index_count(unit,TTL_FNm) 2888 #define _FP_MAX_NUM_CLASS_TOS soc_mem_index_count(unit,TOS_FNm) 2889 #define _FP_MAX_NUM_CLASS_IP_PROTO soc_mem_index_count(unit,IP_PROTO_MAPm) 2890 #define _FP_MAX_NUM_CLASS_TCP soc_mem_index_count(unit,TCP_FNm) 2891 #define _FP_MAX_NUM_CLASS_SRC_COMPRESSION soc_mem_index_count(unit,SRC_COMPRESSIONm) 2892 #define _FP_MAX_NUM_CLASS_DST_COMPRESSION soc_mem_index_count(unit,DST_COMPRESSIONm) 2893 #define _FP_MAX_NUM_CLASS_ETHERTYPE 16 2894 #define _FP_MAX_NUM_CLASS_L4_SRC_PORT 16 2895 #define _FP_MAX_NUM_CLASS_L4_DST_PORT 16 2896 #define _FP_MAX_NUM_CLASS_IPTUNNELTTL soc_mem_index_count(unit,ALT_TTL_FNm) 2897 2898 /* Class Entry Size */ 2899 #define _FP_SIZE_CLASS_TTL 4 2900 #define _FP_SIZE_CLASS_TOS 4 2901 #define _FP_SIZE_CLASS_IP_PROTO 4 2902 #define _FP_SIZE_CLASS_TCP 4 2903 #define _FP_SIZE_CLASS_SRC_COMPRESSION 44 2904 #define _FP_SIZE_CLASS_DST_COMPRESSION 44 2905 #define _FP_SIZE_CLASS_ETHERTYPE 4 2906 #define _FP_SIZE_CLASS_L4_SRC_PORT 4 2907 #define _FP_SIZE_CLASS_L4_DST_PORT 4 2908 #define _FP_SIZE_CLASS_IPTUNNELTTL 4 2909 2910 /* Class Size in Bits*/ 2911 #define _FP_QUAL_CLASS_SIZE_TTL 8 2912 #define _FP_QUAL_CLASS_SIZE_TOS 8 2913 #define _FP_QUAL_CLASS_SIZE_IP_PROTO 4 2914 #define _FP_QUAL_CLASS_SIZE_TCP 8 2915 #define _FP_QUAL_CLASS_SIZE_SRC_COMPRESSION 36 2916 #define _FP_QUAL_CLASS_SIZE_DST_COMPRESSION 36 2917 #define _FP_QUAL_CLASS_SIZE_ETHERTYPE 4 2918 #define _FP_QUAL_CLASS_SIZE_L4_SRC_PORT 4 2919 #define _FP_QUAL_CLASS_SIZE_L4_DST_PORT 4 2920 #define _FP_QUAL_CLASS_SIZE_IPTUNNELTTL 8 2921 2922 /* L4 Src/Dst Port Match Types */ 2923 #define _FP_MATCH_L4_PORT_TYPE 0 2924 #define _FP_MATCH_EXCHANGE_ID_TYPE 1 2925 2926 /* Src/Dst Compression Key Type */ 2927 #define _FP_KEY_RESERVED_TYPE 0 2928 #define _FP_KEY_IPv4_TYPE 1 2929 #define _FP_KEY_IPv6_TYPE 2 2930 #define _FP_KEY_FCoE_TYPE 3 2931 2932 /* Src/Dst Compression Key Type Mask */ 2933 #define _FP_KEY_TYPE_MASK 3 2934 2935 /* Exact Match Lookup Information. */ 2936 #define BCM_FIELD_EXACT_MATCH_LOOKUP_0 0 2937 #define BCM_FIELD_EXACT_MATCH_LOOKUP_1 1 2938 2939 #define IS_SUDO_QUALIFIER(qid) \ 2940 ((bcmFieldQualifyStage == qid) \ 2941 || (bcmFieldQualifyStageIngress == qid) \ 2942 || (bcmFieldQualifyStageIngressExactMatch == qid) \ 2943 || (bcmFieldQualifyStageIngressFlowtracker == qid) \ 2944 || (bcmFieldQualifyIp4 == qid) \ 2945 || (bcmFieldQualifyIp6 == qid) \ 2946 || (bcmFieldQualifyExactMatchHitStatus == qid) \ 2947 || (bcmFieldQualifyExactMatchGroupClassId == qid) \ 2948 || (bcmFieldQualifyExactMatchActionClassId == qid) \ 2949 || (bcmFieldQualifyNormalizeIpAddrs == qid) \ 2950 || (bcmFieldQualifyNormalizeMacAddrs == qid)) 2951 2952 /* 2953 * Macro to validate the PortBitmap Qualifiers in the given Qset. 2954 */ 2955 #define _BCM_FIELD_QSET_PBMP_TEST(_qset_) \ 2956 ((BCM_FIELD_QSET_TEST(_qset_, bcmFieldQualifyInPorts)) || \ 2957 (BCM_FIELD_QSET_TEST(_qset_, bcmFieldQualifyDevicePortBitmap)) || \ 2958 (BCM_FIELD_QSET_TEST(_qset_, bcmFieldQualifySystemPortBitmap)) || \ 2959 (BCM_FIELD_QSET_TEST(_qset_, bcmFieldQualifySourceGportBitmap))) 2960 2961 #define _BCM_FIELD_IS_PBMP_QUALIFIER(_qid_) \ 2962 ((_qid_ == bcmFieldQualifyInPorts) || \ 2963 (_qid_ == bcmFieldQualifyDevicePortBitmap) || \ 2964 (_qid_ == bcmFieldQualifySystemPortBitmap) || \ 2965 (_qid_ == bcmFieldQualifySourceGportBitmap)) 2966 2967 2968 #endif /* !BCM_TOMAHAWK_SUPPORT */ 2969 2970 #define _FP_MAX_IBUS_CONTS 4 /* Maximum IBUS Containers A/B/C/D supported */ 2971 2972 #if defined BCM_TRIDENT3_SUPPORT 2973 2974 /* Ingress Field Bus Container fields */ 2975 typedef enum _field_ing_field_bus_cont_e { 2976 _bcmFieldIngFieldBusCont0 = 0, 2977 _bcmFieldIngFieldBusCont1 = 1, 2978 _bcmFieldIngFieldBusCont2 = 2, 2979 _bcmFieldIngFieldBusContOuterVlan = 3, 2980 _bcmFieldIngFieldBusCont4 = 4, 2981 _bcmFieldIngFieldBusContLastCount = 5 /* Last Count - Not in use */ 2982 } _field_ing_field_bus_cont_t; 2983 2984 typedef struct _field_auxtag_ing_fbus_cont_status_s { 2985 _field_ing_field_bus_cont_t cont_val; /* Ing Field Bus container field */ 2986 uint32 ref_count; /* Reference count */ 2987 } _field_auxtag_ing_fbus_cont_status_t; 2988 2989 #endif /* BCM_TRIDENT3_SUPPORT */ 2990 2991 /* 2992 * Typedef: 2993 * _field_stage_t 2994 * Purpose: 2995 * Pipeline stage field processor information. 2996 */ 2997 typedef struct _field_stage_s { 2998 _field_stage_id_t stage_id; /* Pipeline stage id. */ 2999 uint32 flags; /* Stage flags. */ 3000 int tcam_sz; /* Number of entries in TCAM. */ 3001 int tcam_slices; /* Number of internal slices. */ 3002 int num_instances; /* Number of active FP instances. */ 3003 int num_pipes; /* Number of pipelines in a stage */ 3004 struct _field_slice_s *slices[_FP_MAX_NUM_PIPES]; /* Array of slices.*/ 3005 struct _field_range_s *ranges; /* List of all ranges allocated.*/ 3006 uint32 range_id; /* Seed ID for range creation. */ 3007 /* Virtual map for slice extension */ 3008 /* and group priority management. */ 3009 _field_virtual_map_t vmap[_FP_MAX_NUM_PIPES][_FP_VMAP_CNT][_FP_VMAP_SIZE]; 3010 bcm_field_qset_t _field_supported_qset; 3011 _bcm_field_qual_info_t **f_qual_arr; /* Stage qualifiers config array. */ 3012 _bcm_field_qual_info_t **f_presel_qual_arr; /* Presel qualifiers config array. */ 3013 _bcm_field_action_conf_t **f_action_arr; 3014 3015 int counter_collect_table; /* Used for counter collection in chunks */ 3016 int counter_collect_index; /* Used for counter collection in chunks */ 3017 3018 int num_meter_pools; 3019 _field_meter_pool_t *meter_pool[_FP_MAX_NUM_PIPES][_FIELD_MAX_METER_POOLS]; 3020 #ifdef BCM_TRIUMPH3_SUPPORT 3021 int num_logical_meter_pools; 3022 _field_meter_pool_t *logical_meter_pool[_FIELD_MAX_METER_POOLS]; 3023 #endif 3024 unsigned num_cntr_pools; 3025 _field_cntr_pool_t *cntr_pool[_FIELD_MAX_CNTR_POOLS]; 3026 3027 _field_counter32_collect_t *_field_x32_counters; 3028 /* X pipeline 32 bit counter collect */ 3029 #if defined(BCM_EASYRIDER_SUPPORT) || defined(BCM_TRIUMPH_SUPPORT) 3030 _field_counter32_collect_t *_field_ext_counters; 3031 /* External counter collect */ 3032 #endif /* BCM_EASYRIDER_SUPPORT || BCM_TRIUMPH_SUPPORT */ 3033 3034 #if defined(BCM_BRADLEY_SUPPORT) || defined(BCM_TRX_SUPPORT) 3035 _field_counter64_collect_t *_field_x64_counters; 3036 /* X pipeline 64 bit counter collect */ 3037 _field_counter64_collect_t *_field_y64_counters; 3038 /* Y pipeline 64 bit counter collect */ 3039 #endif /* BCM_BRADLEY_SUPPORT || BCM_SCORPION_SUPPORT */ 3040 3041 #if defined(BCM_SCORPION_SUPPORT) 3042 _field_counter32_collect_t *_field_y32_counters; 3043 /* Y pipeline packet counter collect */ 3044 #endif /* BCM_SCORPION_SUPPORT */ 3045 3046 #if defined(BCM_TOMAHAWK_SUPPORT) 3047 _field_counter32_collect_t *_field_32_counters[_FP_MAX_NUM_PIPES]; 3048 _field_counter64_collect_t *_field_64_counters[_FP_MAX_NUM_PIPES]; 3049 int lt_tcam_sz; /* Logical table TCAM size. */ 3050 int num_logical_tables; 3051 /* Number of logical tables. */ 3052 bcm_field_qset_t presel_qset; 3053 /* Preselector Qualifiers Set*/ 3054 _field_lt_slice_t *lt_slices[_FP_MAX_NUM_PIPES]; 3055 /* Array of LT slices. */ 3056 _field_keygen_profiles_t keygen_profile[_FP_MAX_NUM_PIPES]; 3057 /* Keygen Profiles. */ 3058 soc_profile_mem_t action_profile[_FP_MAX_NUM_PIPES]; 3059 /* Action Profiles. */ 3060 soc_profile_mem_t qos_action_profile[_FP_MAX_NUM_PIPES]; 3061 /* QoS Action Profile. */ 3062 uint32 lt_action_pri; /* Logical Action Priority. */ 3063 int num_ext_levels; /* No. of extractor leves. */ 3064 _field_class_info_t **class_info_arr[_FP_MAX_NUM_PIPES]; 3065 /* Class Status Array. */ 3066 bcm_field_src_class_mode_t field_src_class_mode[BCM_PIPES_MAX]; 3067 /* Field Srouce Class Mode */ 3068 _bcm_field_action_set_t *action_set_ptr; /* Action set pointer */ 3069 3070 3071 bcmi_keygen_qual_cfg_info_db_t *qual_cfg_info_db; 3072 3073 bcmi_keygen_ext_cfg_db_t **ext_cfg_db_arr; 3074 3075 int group_running_prio; /* This value keeps incrementing while assigning it 3076 to the group if the group's prio assigned as 3077 BCM_FIELD_GROUP_PRIO_ANY */ 3078 #endif /* BCM_TOMAHAWK_SUPPORT */ 3079 3080 soc_memacc_t *_field_memacc_counters; 3081 /* Memory access info for FP counter fields */ 3082 3083 #if defined(BCM_TRIDENT2_SUPPORT) 3084 soc_profile_mem_t hash_select[2]; /* Hash select action memory profile */ 3085 #endif 3086 soc_profile_mem_t ext_act_profile; /* Action profile for external. */ 3087 _field_data_control_t *data_ctrl; /* Data qualifiers control. */ 3088 bcm_field_group_oper_mode_t oper_mode; /* Group Operational Mode */ 3089 3090 #if defined (BCM_TRIDENT3_SUPPORT) 3091 _field_auxtag_ing_fbus_cont_status_t ifbus_cont_stat[BCM_PIPES_MAX][_FP_MAX_IBUS_CONTS]; 3092 #endif 3093 #if defined(BCM_FLOWTRACKER_SUPPORT) 3094 _field_ft_info_t *ft_info; /* flowtracker specific info. */ 3095 #endif 3096 struct _field_stage_s *next; /* Next pipeline FP stage. */ 3097 } _field_stage_t; 3098 3099 /* Indexes into the memory access list for FP counter acceleration */ 3100 typedef enum _field_counters_memacc_type_e { 3101 _FIELD_COUNTER_MEMACC_BYTE, 3102 _FIELD_COUNTER_MEMACC_PACKET, 3103 _FIELD_COUNTER_MEMACC_BYTE_Y, 3104 _FIELD_COUNTER_MEMACC_PACKET_Y, 3105 _FIELD_COUNTER_MEMACC_NUM, /* The max size of the memacc list */ 3106 /* If the device doesn't have packet and byte counters in a single 3107 * counter mem entry, then these aliases are used. */ 3108 _FIELD_COUNTER_MEMACC_COUNTER = _FIELD_COUNTER_MEMACC_BYTE, 3109 _FIELD_COUNTER_MEMACC_COUNTER_Y = _FIELD_COUNTER_MEMACC_PACKET 3110 } _field_counters_memacc_type_t; 3111 3112 /* Indexes into the memory access list for FP counter acceleration */ 3113 typedef enum _field_counters_multi_pipe_memacc_type_e { 3114 _FIELD_COUNTER_MEMACC_PIPE0_BYTE = 0, 3115 _FIELD_COUNTER_MEMACC_PIPE0_PACKET = 1, 3116 _FIELD_COUNTER_MEMACC_PIPE1_BYTE = 2, 3117 _FIELD_COUNTER_MEMACC_PIPE1_PACKET = 3, 3118 _FIELD_COUNTER_MEMACC_PIPE2_BYTE = 4, 3119 _FIELD_COUNTER_MEMACC_PIPE2_PACKET = 5, 3120 _FIELD_COUNTER_MEMACC_PIPE3_BYTE = 6, 3121 _FIELD_COUNTER_MEMACC_PIPE3_PACKET = 7, 3122 _FIELD_COUNTER_MEMACC_PIPE_NUM = 8 /* The max size of the 3123 memacc list */ 3124 } _field_counters_multi_pipe_memacc_type_t; 3125 3126 #define _FIELD_FIRST_MEMORY_COUNTERS (1 << 0) 3127 #define _FIELD_SECOND_MEMORY_COUNTERS (1 << 1) 3128 #define _FIELD_MULTI_PIPE_MEMORY_COUNTERS (1 << 3) 3129 3130 #define FILL_FPF_TABLE(_fpf_info, _qid, _offset, _width, _code) \ 3131 BCM_IF_ERROR_RETURN \ 3132 (_field_qual_add((_fpf_info), (_qid), (_offset), (_width), (_code))) 3133 3134 /* Generic memory allocation routine. */ 3135 #define _FP_XGS3_ALLOC(_ptr_,_size_,_descr_) \ 3136 do { \ 3137 if (NULL == (_ptr_)) { \ 3138 (_ptr_) = sal_alloc((_size_), (_descr_)); \ 3139 } \ 3140 if((_ptr_) != NULL) { \ 3141 sal_memset((_ptr_), 0, (_size_)); \ 3142 } else { \ 3143 LOG_ERROR(BSL_LS_BCM_FP, \ 3144 (BSL_META("FP Error: Allocation failure %s\n"), (_descr_))); \ 3145 } \ 3146 } while (0) 3147 3148 /* 3149 * Typedef: 3150 * _field_udf_t 3151 * Purpose: 3152 * Holds user-defined field (UDF) hardware metadata. 3153 */ 3154 typedef struct _field_udf_s { 3155 uint8 valid; /* Indicates valid UDF */ 3156 int use_count; /* Number of groups using this UDF */ 3157 bcm_field_qualify_t udf_num; /* UDFn (UDF0 or UDF1) */ 3158 uint8 user_num; /* Which user field in UDFn */ 3159 } _field_udf_t; 3160 3161 3162 /* 3163 * Typedef: 3164 * _field_tcam_int_t 3165 * Purpose: 3166 * These are the fields that are written into or read from FP_TCAM_xxx. 3167 */ 3168 typedef struct _field_tcam_s { 3169 uint32 *key; 3170 uint32 *key_hw; /* Hardware replica */ 3171 uint32 *mask; 3172 uint32 *mask_hw; /* Hardware replica */ 3173 uint16 key_size; 3174 uint32 f4; 3175 uint32 f4_mask; 3176 uint8 higig; /* 0/1 non-HiGig/HiGig */ 3177 uint8 higig_mask; /* 0/1 non-HiGig/HiGig */ 3178 uint8 ip_type; 3179 #if defined(BCM_FIREBOLT2_SUPPORT) 3180 uint8 drop; /* 0/1 don't Drop/Drop */ 3181 uint8 drop_mask; /* 0/1 don't Drop/Drop */ 3182 #endif /* BCM_FIREBOLT2_SUPPORT */ 3183 } _field_tcam_t; 3184 3185 /* 3186 * Typedef: 3187 * _field_tcam_mem_info_t 3188 * Purpose: 3189 * TCAM memory name and chip specific field names. 3190 */ 3191 typedef struct _field_tcam_mem_info_s{ 3192 soc_mem_t memory; /* Tcam memory name. */ 3193 soc_field_t key_field; /* Tcam key field name. */ 3194 soc_field_t mask_field; /* Tcam mask field name.*/ 3195 } _field_tcam_mem_info_t; 3196 3197 #if defined(BCM_RAPTOR_SUPPORT) || defined(BCM_TRX_SUPPORT) 3198 typedef struct _field_pbmp_s { 3199 bcm_pbmp_t data; 3200 bcm_pbmp_t mask; 3201 } _field_pbmp_t; 3202 #endif /* BCM_RAPTOR_SUPPORT || BCM_TRX_SUPPORT */ 3203 3204 /* 3205 * Typedef: 3206 * _field_counter_t 3207 * Purpose: 3208 * Holds the counter parameters to be written into FP_POLICY_TABLE 3209 * (Firebolt) or FP_INTERNAL (Easyrider). 3210 */ 3211 typedef struct _field_counter_s { 3212 int index; 3213 uint16 entries; /* Number of entries using counter */ 3214 } _field_counter_t; 3215 3216 /* 3217 * Typedef: 3218 * _field_counter_bmp_t 3219 * Purpose: 3220 * Counter bit map for tracking allocation state of slice's counter pairs. 3221 */ 3222 typedef struct _field_counter_bmp_s { 3223 SHR_BITDCL *w; 3224 } _field_counter_bmp_t; 3225 3226 #define _FP_COUNTER_BMP_FREE(bmp, size) sal_free((bmp).w) 3227 #define _FP_COUNTER_BMP_ADD(bmp, ctr) SHR_BITSET(((bmp).w), (ctr)) 3228 #define _FP_COUNTER_BMP_REMOVE(bmp, ctr) SHR_BITCLR(((bmp).w), (ctr)) 3229 #define _FP_COUNTER_BMP_TEST(bmp, ctr) SHR_BITGET(((bmp).w), (ctr)) 3230 3231 /* Max number of counter pools. Tomahawk has 20 Flex counter pools which is 3232 * maximum among all devices. But only 16 are exposed for now. 3233 */ 3234 #define _FIELD_MAX_COUNTER_POOLS 20 3235 3236 /* per Group Counter Pool Bitmap */ 3237 typedef struct _field_counter_pool_bmp_s { 3238 SHR_BITDCL w[_FIELD_MAX_COUNTER_POOLS]; 3239 } _field_counter_pool_bmp_t; 3240 3241 #define _FP_COUNTER_POOL_BMP_ADD(bmp, ctr) SHR_BITSET(((bmp).w), (ctr)) 3242 #define _FP_COUNTER_POOL_BMP_REMOVE(bmp, ctr) SHR_BITCLR(((bmp).w), (ctr)) 3243 #define _FP_COUNTER_POOL_BMP_TEST(bmp, ctr) SHR_BITGET(((bmp).w), (ctr)) 3244 3245 3246 /* 3247 * Structure for priority management 3248 * Currently used only on External TCAM 3249 */ 3250 typedef struct _field_prio_mgmt_s { 3251 int prio; 3252 uint32 start_index; 3253 uint32 end_index; 3254 uint32 num_free_entries; 3255 struct _field_prio_mgmt_s *prev; 3256 struct _field_prio_mgmt_s *next; 3257 } _field_prio_mgmt_t; 3258 3259 /* Slice specific flags. */ 3260 #define _BCM_FIELD_SLICE_EXTERNAL (1 << 0) 3261 #define _BCM_FIELD_SLICE_INTRASLICE_CAPABLE (1 << 1) 3262 #define _BCM_FIELD_SLICE_SIZE_SMALL (1 << 2) 3263 #define _BCM_FIELD_SLICE_SIZE_LARGE (1 << 3) 3264 #define _BCM_FIELD_SLICE_IPBM_CAPABLE (1 << 4) 3265 /* Indicates whether the slice is operationally Enabled */ 3266 #define _BCM_FIELD_SLICE_HW_ENABLE (1 << 7) 3267 /* configure the flag to provide the SW atomicity for a slice. */ 3268 #define _BCM_FIELD_SLICE_SW_ATOMICITY_SUPPORT (1 << 8) 3269 /* configure the flag if hw supports atomicity for a slice. */ 3270 #define _BCM_FIELD_SLICE_HW_ATOMICITY_SUPPORT (1 << 9) 3271 /* configure the flag if slice supports more than 1 group modes. */ 3272 #define _BCM_FIELD_SLICE_MULTIMODE_ENTRIES (1 << 10) 3273 3274 #define _FP_INTRA_SLICE_PART_0 (0) 3275 #define _FP_INTRA_SLICE_PART_1 (1) 3276 #define _FP_INTRA_SLICE_PART_2 (2) 3277 #define _FP_INTRA_SLICE_PART_3 (3) 3278 3279 #define _FP_INTER_SLICE_PART_0 (0) 3280 #define _FP_INTER_SLICE_PART_1 (1) 3281 #define _FP_INTER_SLICE_PART_2 (2) 3282 3283 /* 3284 * Typedef: 3285 * _field_slice_t 3286 * Purpose: 3287 * This has the fields specific to a hardware slice. 3288 * Notes: 3289 */ 3290 typedef struct _field_slice_s { 3291 uint8 slice_number; /* Hardware slice number. */ 3292 int start_tcam_idx;/* Slice first entry tcam index. */ 3293 int entry_count; /* Number of entries in the slice.*/ 3294 int free_count; /* Number of free entries. */ 3295 int counters_count;/* Number of counters accessible. */ 3296 int meters_count; /* Number of meters accessible. */ 3297 int hw_ent_count; /* Number of entries installed 3298 in the slice. */ 3299 _field_counter_bmp_t counter_bmp; /* Bitmap for counter allocation. */ 3300 _field_meter_bmp_t meter_bmp; /* Bitmap for meter allocation. */ 3301 _field_stage_id_t stage_id; /* Pipeline stage slice belongs. */ 3302 bcm_pbmp_t pbmp; /* Ports in use by groups. */ 3303 3304 struct _field_entry_s **entries; /* List of entries pointers. */ 3305 _field_prio_mgmt_t *prio_mgmt; /* Priority management of entries.*/ 3306 3307 uint8 pkt_type[_FP_EXT_NUM_PKT_TYPES];/* Packet types supported 3308 by this slice (aka database). */ 3309 3310 bcm_pbmp_t ext_pbmp[_FP_EXT_NUM_PKT_TYPES];/* Bmap for each packet type.*/ 3311 3312 struct _field_slice_s *next; /* Linked list for auto-expand of groups.*/ 3313 struct _field_slice_s *prev; /* Linked list for auto-expand of groups.*/ 3314 uint32 slice_flags; /* _BCM_FIELD_SLICE_XXX flags. */ 3315 uint8 group_flags; /* Intalled groups _FP_XXX_GROUP. */ 3316 int8 doublewide_key_select; 3317 /* Key selection for the */ 3318 /* intraslice double wide mode. */ 3319 int8 src_class_sel; /* Source lookup class selection.*/ 3320 int8 dst_class_sel; /* Destination lookup class. */ 3321 int8 intf_class_sel;/* Interface class selection. */ 3322 int8 loopback_type_sel;/* Loopback/Tunnel selection. */ 3323 int8 ingress_entity_sel;/* Ingress entity selection. */ 3324 int8 src_entity_sel; /* Src port/trunk entity selection. */ 3325 int8 dst_fwd_entity_sel;/* Destination forwarding */ 3326 int8 fwd_field_sel; /* Forwarding field vrf/vpn/vid */ 3327 /* entity selection. */ 3328 int8 ttl_class_sel; /* Ttl class Selecti */ 3329 int8 tos_class_sel; /* Tos class Selecti */ 3330 int8 tcp_class_sel; /* Tcp class Selecti */ 3331 int8 aux_tag_1_sel; 3332 int8 aux_tag_2_sel; 3333 int8 oam_overlay_sel; /* Oam Overlay Selection*/ 3334 int8 egr_class_f1_sel; 3335 int8 egr_class_f2_sel; 3336 int8 egr_class_f3_sel; 3337 int8 egr_class_f4_sel; 3338 int8 src_dest_class_f1_sel; 3339 int8 src_dest_class_f3_sel; 3340 int8 egr_key4_dvp_sel; 3341 int8 egr_key4_mdl_sel; 3342 int8 egr_dest_port_f1_sel; 3343 int8 egr_dest_port_f5_sel; 3344 int8 egr_oam_overlay_sel; /* Egress Oam Overlay Selection*/ 3345 int8 oam_intf_class_sel; /* Oam SVP Class Id Selection*/ 3346 #if defined(BCM_TOMAHAWK_SUPPORT) 3347 uint32 lt_map; /* Bitmap of LT IDs on this slice. */ 3348 uint8 lt_partition_pri; /* LT Partition Priority. */ 3349 _field_ext_sel_t ext_sel[_FP_MAX_NUM_LT]; 3350 #endif 3351 } _field_slice_t; 3352 3353 /* Macro: _BCM_FIELD_SLICE_SIZE 3354 * Purpose: 3355 * Given stage, slice get number of entries in the slice. 3356 */ 3357 #define _BCM_FIELD_SLICE_SIZE(_stage_fc_, instance, _slice_) \ 3358 (((_stage_fc_)->slices[instance] + (_slice_))->entry_count) 3359 3360 3361 #define _FP_GROUP_ENTRY_ARR_BLOCK (0xff) 3362 typedef struct _field_entry_s _field_entry_t; 3363 /* 3364 * Typedef: 3365 * _field_group_t 3366 * Purpose: 3367 * This is the logical group's internal storage structure. It has 1, 2 or 3368 * 3 slices, each with physical entry structures. 3369 * Notes: 3370 * 'ent_qset' should always be a subset of 'qset'. 3371 */ 3372 typedef struct _field_group_s { 3373 bcm_field_group_t gid; /* Opaque handle. */ 3374 int priority; /* Field group priority. */ 3375 bcm_field_qset_t qset; /* This group's Qualifier Set. */ 3376 uint32 flags; /* Group configuration flags. */ 3377 _field_slice_t *slices; /* Pointer into slice array. */ 3378 bcm_pbmp_t pbmp; /* Ports in use this group. */ 3379 _field_sel_t sel_codes[_FP_MAX_ENTRY_WIDTH]; /* Select codes for 3380 slice(s). */ 3381 _bcm_field_group_qual_t qual_arr[_FP_MAX_ENTRY_TYPES][_FP_MAX_ENTRY_WIDTH]; 3382 /* Qualifiers available in each 3383 individual entry part. */ 3384 _field_stage_id_t stage_id; /* FP pipeline stage id. */ 3385 3386 _field_entry_t **entry_arr; /* FP group entry array. */ 3387 uint16 ent_block_count;/* FP group entry array size . */ 3388 /* 3389 * Public data for each group: The number of used and available entries, 3390 * counters, and meters for a field group. 3391 */ 3392 bcm_field_group_status_t group_status; 3393 #if defined(BCM_TOMAHAWK_SUPPORT) 3394 _bcm_field_aset_t aset; 3395 #else 3396 bcm_field_aset_t aset; 3397 #endif /* BCM_TOMAHAWK_SUPPORT */ 3398 _field_counter_pool_bmp_t counter_pool_bmp; /* counter pools in use for 3399 * this group. 3400 */ 3401 int instance; /* FP Instance. */ 3402 #if defined(BCM_TOMAHAWK_SUPPORT) 3403 _field_ext_sel_t ext_codes[_FP_MAX_ENTRY_WIDTH]; /* KeyGen select 3404 codes. */ 3405 _field_lt_slice_t *lt_slices; /* Pointer into LT slices arrary. */ 3406 int lt_id; /* Logical Table ID. */ 3407 _field_lt_entry_t **lt_entry_arr; /* FP Group LT entry array. */ 3408 uint16 lt_ent_blk_cnt; /* FP group LT entry array size. */ 3409 _field_group_lt_status_t lt_grp_status;/* FP Group LT status. */ 3410 int qset_size; /* Qset key size. */ 3411 _bcm_field_group_qual_t presel_qual_arr[_FP_MAX_ENTRY_TYPES][_FP_MAX_ENTRY_WIDTH]; 3412 /* Preselector Qualifiers available 3413 * in each individual presel entry part. */ 3414 struct _field_presel_entry_s *presel_ent_arr[_FP_PRESEL_ENTRIES_MAX_PER_GROUP]; 3415 /* Preselector entries associated with 3416 the group arranged on priority basis. */ 3417 _field_em_mode_t em_mode; /* Exact Match Mode. */ 3418 int8 action_profile_idx[MAX_ACT_PROF_ENTRIES_PER_GROUP]; 3419 /* Action Profile index */ 3420 #endif /* BCM_TOMAHAWK_SUPPORT */ 3421 bcm_field_hintid_t hintid; /* Hintid linked to a group */ 3422 int action_res_id; /* Action resolution id */ 3423 int vmap_group[_FP_PAIR_MAX]; 3424 uint32 max_group_size; /* Max Size of a group */ 3425 3426 #if defined(BCM_FLOWTRACKER_SUPPORT) 3427 _field_ft_keygen_ext_codes_t *ft_ext_codes; /* Flowtracker ext. codes. */ 3428 #endif 3429 struct _field_group_s *next; /* For storing in a linked-list */ 3430 } _field_group_t; 3431 3432 /* 3433 * Typedef: 3434 * _field_action_t 3435 * Purpose: 3436 * This is the real action storage structure that is hidden behind 3437 * the opaque handle bcm_field_action_t. 3438 */ 3439 typedef struct _field_action_s { 3440 bcm_field_action_t action; /* Action type */ 3441 uint32 param[_FP_ACTION_PARAM_SZ]; 3442 /* Action specific parameters */ 3443 int hw_index; /* Allocated hw resource index. */ 3444 int old_index; /* Hw resource to be freed, in */ 3445 /* case action parameters were */ 3446 /* modified. */ 3447 uint8 flags; /* Field action flags. */ 3448 bcm_pbmp_t *egress_pbmp; /* Egress Pbmp for delayed 3449 * actions which need special handling. 3450 */ 3451 uint8 elephant_pkts_only; /* Enable action only for 3452 * elephant flows. 3453 */ 3454 struct _field_action_s *next; 3455 } _field_action_t; 3456 3457 #define _FP_RANGE_STYLE_FIREBOLT 1 3458 3459 3460 #define PolicyMax(_unit_, _mem_, _field_) \ 3461 ((soc_mem_field_length((_unit_), (_mem_) , (_field_)) < 32) ? \ 3462 ((1 << soc_mem_field_length((_unit_), (_mem_), (_field_))) - 1) : \ 3463 (0xFFFFFFFFUL)) 3464 3465 #define PolicyGet(_unit_, _mem_, _entry_, _field_) \ 3466 soc_mem_field32_get((_unit_), (_mem_), (_entry_), (_field_)) 3467 3468 #define PolicySet(_unit_, _mem_, _entry_, _field_, _value_) \ 3469 soc_mem_field32_set((_unit_), (_mem_), (_entry_), (_field_), (_value_)) 3470 3471 #define PolicyCheck(_unit_, _mem_, _field_, _value_) \ 3472 if (0 == ((uint32)(_value_) <= \ 3473 (uint32)PolicyMax((_unit_), (_mem_), (_field_)))) { \ 3474 LOG_ERROR(BSL_LS_BCM_FP, \ 3475 (BSL_META("FP(unit %d) Error: Policy _value_ %d > %d (max) mem (%d)" \ 3476 "field (%d).\n"), _unit_, (_value_), \ 3477 (uint32)PolicyMax((_unit_), (_mem_), (_field_)), (_mem_), \ 3478 (_field_))); \ 3479 return (BCM_E_PARAM); \ 3480 } 3481 3482 /* 3483 * Typedef: 3484 * _field_range_t 3485 * Purpose: 3486 * Internal management of Range Checkers. There are two styles or range 3487 * checkers, the Firebolt style that only chooses source or destination 3488 * port, without any sense of TCP vs. UDP or inverting. This style writes 3489 * into the FP_RANGE_CHECK table. The Easyrider style is able to specify 3490 * TCP vs. UDP. 3491 * The choice of styles is based on the user supplied flags. 3492 * If a Firebolt style checker is sufficient, that will be used. If an 3493 * Easyrider style checker is required then that will be used. 3494 */ 3495 typedef struct _field_range_s { 3496 uint32 flags; 3497 bcm_field_range_t rid; 3498 bcm_l4_port_t min, max; 3499 int hw_index; 3500 uint8 style; /* Simple (FB) or more complex (ER) */ 3501 struct _field_range_s *next; 3502 } _field_range_t; 3503 3504 /* 3505 * Entry status flags. 3506 */ 3507 3508 /* 3509 * Software entry differs from one in hardware. 3510 * This flag has to be set for any change in 3511 * FP_TCAM or FP_POLICY_TABLE 3512 */ 3513 #define _FP_ENTRY_DIRTY (1 << 0) 3514 3515 /* Entry is in primary slice. */ 3516 #define _FP_ENTRY_PRIMARY (1 << 1) 3517 3518 /* Entry is in secondary slice of wide-mode group. */ 3519 #define _FP_ENTRY_SECONDARY (1 << 2) 3520 3521 /* Entry is in tertiary slice of wide-mode group. */ 3522 #define _FP_ENTRY_TERTIARY (1 << 3) 3523 3524 /* Entry has an ingress Mirror-To-Port reserved. */ 3525 #define _FP_ENTRY_MTP_ING0 (1 << 4) 3526 3527 /* Entry has an ingress 1 Mirror-To-Port reserved. */ 3528 #define _FP_ENTRY_MTP_ING1 (1 << 5) 3529 3530 /* Entry has an egress Mirror-To-Port reserved. */ 3531 #define _FP_ENTRY_MTP_EGR0 (1 << 6) 3532 3533 /* Entry has an egress 1 Mirror-To-Port reserved. */ 3534 #define _FP_ENTRY_MTP_EGR1 (1 << 7) 3535 3536 /* Second part of double wide intraslice entry. */ 3537 #define _FP_ENTRY_SECOND_HALF (1 << 8) 3538 3539 /* Field entry installed in hw. */ 3540 #define _FP_ENTRY_INSTALLED (1 << 9) 3541 3542 /* Treat all packets as green. */ 3543 #define _FP_ENTRY_COLOR_INDEPENDENT (1 << 10) 3544 3545 /* Meter installed in secondary slice . */ 3546 #define _FP_ENTRY_POLICER_IN_SECONDARY_SLICE (1 << 11) 3547 3548 /* Counter installed in secondary slice . */ 3549 #define _FP_ENTRY_STAT_IN_SECONDARY_SLICE (1 << 12) 3550 3551 /* Allocate meters/counters from secondary slice. */ 3552 #define _FP_ENTRY_ALLOC_FROM_SECONDARY_SLICE (1 << 13) 3553 3554 /* Entry uses secondary overlay */ 3555 #define _FP_ENTRY_USES_IPBM_OVERLAY (1 << 14) 3556 3557 /* 3558 * Entry POLICY_TABLE dirty 3559 * It can be used to set along with _FP_ENTRY_DIRTY 3560 * if and only if any change only in FP_POLICY_TABLE fields. 3561 * It will be set for change in actions/STATs/Policers 3562 * and will be reset for change in Qualifiers 3563 * as qualifier needs FP_TCAM write. 3564 */ 3565 #define _FP_ENTRY_POLICY_TABLE_ONLY_DIRTY (1 << 15) 3566 3567 /* Field entry enabled in hw. */ 3568 #define _FP_ENTRY_ENABLED (1 << 16) 3569 3570 3571 /* Entry slice identification flags. */ 3572 #define _FP_ENTRY_SLICE_FLAGS (_FP_ENTRY_PRIMARY | _FP_ENTRY_SECONDARY | \ 3573 _FP_ENTRY_TERTIARY) 3574 3575 /* Entry slice identification flags. */ 3576 #define _FP_ENTRY_MIRROR_ON (_FP_ENTRY_MTP_ING0 | _FP_ENTRY_MTP_ING1 | \ 3577 _FP_ENTRY_MTP_EGR0 | _FP_ENTRY_MTP_EGR1) 3578 3579 /* There is no action enum for Oam Stat Actions. 3580 * Oam Stat Actions conflict with NAT actions. 3581 * Using Flags to check conflict of actions. 3582 */ 3583 #define _FP_ENTRY_OAM_STAT_VALID (1 << 17) 3584 #define _FP_ENTRY_OAM_STAT_NOT_ALLOWED (1 << 18) 3585 3586 #define _FP_ENTRY_MIXED_SRC_CLASS_QUALIFIED (1 << 19) 3587 3588 /* Default Group Entry for Exact Match. */ 3589 #define _FP_ENTRY_EXACT_MATCH_GROUP_DEFAULT (1 << 20) 3590 3591 /* Field Entry modifies Slice Sw Entry count. */ 3592 #define _FP_ENTRY_MODIFY_SLICE_SW_ENTRY_COUNT (1 << 21) 3593 3594 /* Field Entry meter is modified. */ 3595 #define _FP_ENTRY_METER_MODIFIED (1 << 22) 3596 3597 /* 3598 * A flag to indicate whether the created entry's priority is not set, 3599 * this flag has to be set during the creation of entry 3600 */ 3601 #define _FP_ENTRY_CREATED_WITHOUT_PRIO (1 << 23) 3602 3603 /* 3604 * Group status flags. 3605 */ 3606 3607 /* Group resides in a single slice. */ 3608 #define _FP_GROUP_SPAN_SINGLE_SLICE (1 << 0) 3609 3610 /* Group resides in a two paired slices. */ 3611 #define _FP_GROUP_SPAN_DOUBLE_SLICE (1 << 1) 3612 3613 /* Group resides in three paired slices. */ 3614 #define _FP_GROUP_SPAN_TRIPLE_SLICE (1 << 2) 3615 3616 /* Group entries are double wide in each slice. */ 3617 #define _FP_GROUP_INTRASLICE_DOUBLEWIDE (1 << 3) 3618 3619 /* Group span flags mask. */ 3620 #define _FP_GROUP_SPAN_MASK (0xF) 3621 3622 /* 3623 * Group has slice lookup enabled 3624 * This is default, unless it is disabled by call to 3625 * bcm_field_group_enable_set with enable=0 3626 */ 3627 #define _FP_GROUP_LOOKUP_ENABLED (1 << 4) 3628 3629 /* Group for WLAN tunnel terminated packets. */ 3630 #define _FP_GROUP_WLAN (1 << 5) 3631 3632 /* Group resides on the smaller slice */ 3633 #define _FP_GROUP_SELECT_SMALL_SLICE (1 << 6) 3634 3635 /* Group resides on the larger slice */ 3636 #define _FP_GROUP_SELECT_LARGE_SLICE (1 << 7) 3637 3638 /* Group supports auto expansion */ 3639 #define _FP_GROUP_SELECT_AUTO_EXPANSION (1 << 8) 3640 3641 /* Flags to set auto expansion slice preference */ 3642 #define _FP_GROUP_AUTO_EXPAND_SMALL_SLICE (1 << 9) 3643 #define _FP_GROUP_AUTO_EXPAND_LARGE_SLICE (1 << 10) 3644 3645 /* Max Group Size Hard Limit */ 3646 #define _FP_GROUP_MAX_SIZE_HARD_LIMIT (1 << 11) 3647 3648 /* Group supports Preselector */ 3649 #define _FP_GROUP_PRESELECTOR_SUPPORT (1 << 12) 3650 3651 #define _FP_GROUP_STATUS_MASK (_FP_GROUP_SPAN_SINGLE_SLICE | \ 3652 _FP_GROUP_SPAN_DOUBLE_SLICE | \ 3653 _FP_GROUP_SPAN_TRIPLE_SLICE | \ 3654 _FP_GROUP_INTRASLICE_DOUBLEWIDE | \ 3655 _FP_GROUP_WLAN) 3656 3657 /* Group is Port base */ 3658 #define _FP_GROUP_PER_PORT_OR_PBMP (1 << 13) 3659 3660 /* Group creation to be verified with given configs */ 3661 #define _FP_GROUP_CONFIG_VALIDATE (1 << 14) 3662 3663 /* Group creation for FLOWTRACKER Module */ 3664 #define _FP_GROUP_CONFIG_FLOWTRACKER_SPECIFIC (1 << 15) 3665 3666 /* Group QSET is update */ 3667 #define _FP_GROUP_QSET_UPDATE (1 << 16) 3668 3669 /* Group entries are double-wide and continuous in same slice */ 3670 #define _FP_GROUP_DW_DEPTH_EXPANDED (1 << 17) 3671 3672 /* Mask for Group Mode flags */ 3673 #define _FP_GROUP_MODE_MASK (_FP_GROUP_SPAN_SINGLE_SLICE | \ 3674 _FP_GROUP_SPAN_DOUBLE_SLICE | \ 3675 _FP_GROUP_SPAN_TRIPLE_SLICE | \ 3676 _FP_GROUP_INTRASLICE_DOUBLEWIDE | \ 3677 _FP_GROUP_DW_DEPTH_EXPANDED) 3678 3679 /* Flowtracker Group key type shift */ 3680 #define _FP_GROUP_FT_KEYTYPE_SHIFT 1 3681 3682 /* Flowtracker group key type mask */ 3683 #define _FP_GROUP_FT_KEYTYPE_MASK 0x7F 3684 3685 /* Internal DATA qualifiers. */ 3686 typedef enum _bcm_field_internal_qualify_e { 3687 _bcmFieldQualifyData0 = bcmFieldQualifyCount,/* [0x00] Data qualifier 0. */ 3688 _bcmFieldQualifyData1, /* [0x01] Data qualifier 1. */ 3689 _bcmFieldQualifyData2, /* [0x02] Data qualifier 2. */ 3690 _bcmFieldQualifyData3, /* [0x03] Data qualifier 3. */ 3691 _bcmFieldQualifySvpValid, /* [0x04] SVP valid */ 3692 _bcmFieldQualifyPreLogicalTableId, /* [0x05] Preselector LT ID. */ 3693 _bcmFieldQualifyData4, /* [0x06] Data qualifier 4. */ 3694 _bcmFieldQualifyData5, /* [0x07] Data qualifier 5. */ 3695 _bcmFieldQualifyData6, /* [0x08] Data qualifier 6. */ 3696 _bcmFieldQualifyData7, /* [0x09] Data qualifier 7. */ 3697 _bcmFieldQualifyData8, /* [0x0a] Data qualifier 8. */ 3698 _bcmFieldQualifyData9, /* [0x0b] Data qualifier 9. */ 3699 _bcmFieldQualifyRangeCheckBits24_31, /* [0x0c] Upper 8 bits of the 3700 * Range Check qualifier.*/ 3701 _bcmFieldQualifyExactMatchHitStatusLookup0, 3702 /* [0x0d] Exact Match Lookup Zero 3703 * Hit Status. */ 3704 _bcmFieldQualifyExactMatchHitStatusLookup1, 3705 /* [0x0e] Exact Match Lookup One 3706 * Hit Status. */ 3707 _bcmFieldQualifyExactMatchGroupClassIdLookup0, 3708 /* [0x0f] Exact Match Lookup Zero 3709 * Group Class Id (Logical 3710 * Table Id), applicable 3711 * per group. */ 3712 _bcmFieldQualifyExactMatchGroupClassIdLookup1, 3713 /* [0x10] Exact Match Lookup One 3714 * Group Class Id (Logical 3715 * Table Id), applicable 3716 * per group. */ 3717 _bcmFieldQualifyExactMatchActionClassIdLookup0, 3718 /* [0x11] Exact Match Lookup Zero 3719 * Action Class Id, 3720 * applicable per exact 3721 * match entry. */ 3722 _bcmFieldQualifyExactMatchActionClassIdLookup1, 3723 /* [0x12] Exact Match Lookup One 3724 * Action Class Id, 3725 * applicable per exact 3726 * entry. */ 3727 _bcmFieldQualifyData10, /* [0x13] Data qualifier 10. */ 3728 _bcmFieldQualifyData11, /* [0x14] Data qualifier 11. */ 3729 _bcmFieldQualifyData12, /* [0x15] Data qualifier 12. */ 3730 _bcmFieldQualifyData13, /* [0x16] Data qualifier 13. */ 3731 _bcmFieldQualifyData14, /* [0x17] Data qualifier 14. */ 3732 _bcmFieldQualifyData15, /* [0x18] Data qualifier 15. */ 3733 _bcmFieldQualifyInPorts_1, /* Refers to logical ports 34 to 49. */ 3734 _bcmFieldQualifyInPorts_2, /* Refers to logical ports 50 to 65. */ 3735 _bcmFieldQualifyPktFlowTypeTunnelNone, /* Pkt Flow Type Non-Tunnel */ 3736 _bcmFieldQualifyPktFlowTypeTunnelL2, /* Pkt Flow Type L2Tunnel */ 3737 _bcmFieldQualifyPktFlowTypeTunnelL3, /* Pkt Flow Type L3Tunnel */ 3738 _bcmFieldQualifyCpuTxCtrl, /* Cpu Tx Control Info */ 3739 _bcmFieldQualifyPreLogicalTableId1, /* Preselector LT ID for part 1. */ 3740 _bcmFieldQualifyPreLogicalTableId2, /* Preselector LT ID for part 2. */ 3741 _bcmFieldQualifyCount /* Always last not used. */ 3742 } _bcm_field_internal_qualify_t; 3743 3744 3745 #define _BCM_FIELD_QUALIFY_STRINGS \ 3746 { \ 3747 "_Data0", \ 3748 "_Data1", \ 3749 "_Data2", \ 3750 "_Data3", \ 3751 "_SvpValid", \ 3752 "_PreLogicalTableId", \ 3753 "_Data4", \ 3754 "_Data5", \ 3755 "_Data6", \ 3756 "_Data7", \ 3757 "_Data8", \ 3758 "_Data9", \ 3759 "_RangeCheckBits24_31", \ 3760 "_ExactMatchHitStatusLookup0", \ 3761 "_ExactMatchHitStatusLookup1", \ 3762 "_ExactMatchGroupClassIdLookup0", \ 3763 "_ExactMatchGroupClassIdLookup1", \ 3764 "_ExactMatchActionClassIdLookup0", \ 3765 "_ExactMatchActionClassIdLookup1", \ 3766 "_Data10", \ 3767 "_Data11", \ 3768 "_Data12", \ 3769 "_Data13", \ 3770 "_Data14", \ 3771 "_Data15", \ 3772 "_InPorts_1", \ 3773 "_InPorts_2", \ 3774 "_PktFlowTypeTunnelNone", \ 3775 "_PktFlowTypeTunnelL2", \ 3776 "_PktFlowTypeTunnelL3", \ 3777 "_CpuTxCtrl", \ 3778 "_PreLogicalTableId1", \ 3779 "_PreLogicalTableId2", \ 3780 } 3781 3782 /* Committed portion in sw doesn't match hw. */ 3783 #define _FP_POLICER_COMMITTED_DIRTY (0x80000000) 3784 3785 /* Peak portion in sw doesn't match hw. */ 3786 #define _FP_POLICER_PEAK_DIRTY (0x40000000) 3787 3788 /* Policer created through meter APIs. */ 3789 #define _FP_POLICER_INTERNAL (0x20000000) 3790 3791 /* Policer using excess meter. */ 3792 #define _FP_POLICER_EXCESS_METER (0x10000000) 3793 3794 #define _FP_POLICER_DIRTY (_FP_POLICER_COMMITTED_DIRTY | \ 3795 _FP_POLICER_PEAK_DIRTY) 3796 3797 #define _FP_POLICER_LEVEL_COUNT (2) 3798 3799 /* Flow mode policer using committed meter in hardware. */ 3800 #define _FP_POLICER_COMMITTED_HW_METER(f_pl) \ 3801 (bcmPolicerModeCommitted == (f_pl)->cfg.mode \ 3802 && !((f_pl)->hw_flags & _FP_POLICER_EXCESS_METER)) 3803 3804 /* Flow mode policer using excess meter in hardware. */ 3805 #define _FP_POLICER_EXCESS_HW_METER(f_pl) \ 3806 (bcmPolicerModeCommitted == (f_pl)->cfg.mode \ 3807 && ((f_pl)->hw_flags & _FP_POLICER_EXCESS_METER)) 3808 3809 /* Set excess meter bit. */ 3810 #define _FP_POLICER_EXCESS_HW_METER_SET(f_pl) \ 3811 ((f_pl)->hw_flags |= _FP_POLICER_EXCESS_METER) 3812 3813 /* Clear excess meter bit. */ 3814 #define _FP_POLICER_EXCESS_HW_METER_CLEAR(f_pl) \ 3815 ((f_pl)->hw_flags &= ~_FP_POLICER_EXCESS_METER) 3816 3817 /* Check for Flow mode policer. */ 3818 #define _FP_POLICER_IS_FLOW_MODE(f_pl) \ 3819 (bcmPolicerModeCommitted == (f_pl)->cfg.mode) 3820 3821 /* 3822 * Typedef: 3823 * _field_policer_t 3824 * Purpose: 3825 * This is the policer description structure. 3826 * Indexed by bcm_policer_t handle. 3827 */ 3828 typedef struct _field_policer_s { 3829 bcm_policer_t pid; /* Unique policer identifier. */ 3830 bcm_policer_config_t cfg; /* API level policer configuration. */ 3831 uint16 sw_ref_count;/* SW object use reference count. */ 3832 uint16 hw_ref_count;/* HW object use reference count. */ 3833 uint8 level; /* Policer attachment level. */ 3834 int8 pool_index; 3835 /* Physical Meter pool/slice policer resides.*/ 3836 /* the variable with old_ prefix are added to store the policer info 3837 * prior to updating with bcm_field_policer_set api. The stored is used 3838 * to retieve in case meter allocation failns during entry install 3839 */ 3840 uint8 old_level; 3841 int8 old_pool_index; 3842 bcm_policer_mode_t old_mode; /* Policer mode. */ 3843 int old_hw_index; 3844 uint8 old_sw_ref_count; 3845 uint16 old_hw_ref_count; 3846 bcm_policer_config_t old_cfg; 3847 int32 old_hw_flags; 3848 #ifdef BCM_TRIUMPH3_SUPPORT 3849 int8 logical_pool_index; 3850 /* Logical Meter pool/slice policer resides.*/ 3851 int8 old_logical_pool_index; 3852 #endif 3853 int hw_index; /* HW index policer resides. */ 3854 uint32 hw_flags; /* HW installation status flags. */ 3855 _field_stage_id_t stage_id; /* Attached entry stage id. */ 3856 struct _field_policer_s *next; /* Policer lookup linked list. */ 3857 }_field_policer_t; 3858 3859 3860 #define _FP_POLICER_VALID (1 << 0) 3861 #define _FP_POLICER_INSTALLED (1 << 1) 3862 #define _FP_POLICER_DETACH (1 << 2) 3863 3864 /* 3865 * Typedef: 3866 * _field_entry_policer_t 3867 * Purpose: 3868 * This is field entry policers description structure. 3869 * Used to form an array for currently attached policers. 3870 */ 3871 typedef struct _field_entry_policer_s { 3872 bcm_policer_t pid; /* Unique policer identifier. */ 3873 uint8 flags; /* Policer/entry flags. */ 3874 }_field_entry_policer_t; 3875 3876 /* _bcm_field_stat_e - Internal counter types. */ 3877 typedef enum _bcm_field_stat_e { 3878 _bcmFieldStatCount = bcmFieldStatAcceptedBytes /* Internal STAT count 3879 for XGS devices. Not 3880 a usable value. */ 3881 } _bcm_field_stat_t; 3882 3883 #define _BCM_FIELD_STAT \ 3884 { \ 3885 "BytesEven", \ 3886 "BytesOdd", \ 3887 "PacketsEven", \ 3888 "PacketsOdd" \ 3889 } 3890 3891 #define _FP_STAT_HW_MODE_MAX (0xf) 3892 #define _FP_TRIDENT_STAT_HW_MODE_MAX (0x3F) 3893 3894 /* Statistics entity was created through counter APIs. */ 3895 #define _FP_STAT_INTERNAL (1 << 0) 3896 /* UpdateCounter action was used with NO_YES/YES_NO. */ 3897 #define _FP_STAT_COUNTER_PAIR (1 << 1) 3898 /* Arithmetic operations. */ 3899 #define _FP_STAT_ADD (1 << 2) 3900 #define _FP_STAT_SUBSTRACT (1 << 3) 3901 /* Packet/bytes selector. */ 3902 #define _FP_STAT_BYTES (1 << 4) 3903 /* Sw entry doesn't match hw. */ 3904 #define _FP_STAT_DIRTY (1 << 5) 3905 /* Stat Create with ID */ 3906 #define _FP_STAT_CREATE_ID (1 << 6) 3907 /* Stat uses Flex Stat resources. */ 3908 #define _FP_STAT_FLEX_CNTR (1 << 7) 3909 /* Stat Create with Internal Advanced Flex Counter feature */ 3910 #define _FP_STAT_INTERNAL_FLEX_COUNTER (1 << 8) 3911 /* Stat Created by flex stat module using bcm_stat_group_create API. */ 3912 #define _FP_STAT_CREATED_BY_FLEX_MODULE (1 << 9) 3913 /* Stat uses VLAN Flow Count Stat resources. */ 3914 #define _FP_STAT_FLOWCNT_CNTR (1 << 10) 3915 3916 3917 3918 3919 /* Action conflict check macro. */ 3920 #define _FP_ACTIONS_CONFLICT(_val_) \ 3921 if (action == _val_) { \ 3922 return (BCM_E_CONFIG); \ 3923 } 3924 3925 3926 /* 3927 * Typedef: 3928 * _field_stat_t 3929 * Purpose: 3930 * This is the statistics collection entity description structure. 3931 * Indexed by int sid (statistics id) handle. 3932 */ 3933 typedef struct _field_stat_s { 3934 uint32 sid; /* Unique stat entity identifier. */ 3935 3936 /* Reference counters information.*/ 3937 uint16 sw_ref_count; /* SW object use reference count. */ 3938 uint16 hw_ref_count; /* HW object use reference count. */ 3939 /* Allocated hw resource information.*/ 3940 int8 offset_mode; /* Mode to compute final counter idx*/ 3941 int8 pool_index; /* Counter pool/slice stat resides. */ 3942 int hw_index; /* HW index stat resides. */ 3943 /* Reinstall flags. */ 3944 uint32 hw_flags; /* HW installation status flags. */ 3945 /* Application requested statistics. */ 3946 uint8 nstat; /* User requested stats array size. */ 3947 bcm_field_stat_t *stat_arr; /* User requested stats array. */ 3948 /* HW supported statistics. */ 3949 uint32 hw_stat; /* Statistics supported by HW. */ 3950 uint16 hw_mode; /* Hw configuration mode. */ 3951 uint8 hw_entry_count;/* Number of counters needed. */ 3952 bcm_field_group_t gid; /* Group statistics entity attached.*/ 3953 _field_stage_id_t stage_id; /* Attached entry stage id. */ 3954 struct _field_stat_s *next; /* Stat lookup linked list. */ 3955 /* Values after last detach. */ 3956 uint64 *stat_values; /* Stat value after it was detached */ 3957 /* from a last entry. */ 3958 uint32 flex_mode; /* Flex stat entity identifier. */ 3959 } _field_stat_t; 3960 3961 typedef enum _field_stat_color_s { 3962 _bcmFieldStatColorNoColor = 0, 3963 _bcmFieldStatColorGreen, 3964 _bcmFieldStatColorYellow, 3965 _bcmFieldStatColorRed, 3966 _bcmFieldStatColorNotGreen, 3967 _bcmFieldStatColorNotYellow, 3968 _bcmFieldStatColorNotRed, 3969 _bcmFieldStatColorGreenYellow, 3970 _bcmFieldStatColorGreenRed, 3971 _bcmFieldStatColorYellowRed, 3972 _bcmFieldStatColorGreenNotGreen, 3973 _bcmFieldStatColorYellowNotYellow, 3974 _bcmFieldStatColorRedNotRed, 3975 _bcmFieldStatColorGreenYellowRed, 3976 _bcmFieldStatColorCount 3977 } _field_stat_color_t; 3978 3979 /* 3980 * Typedef: 3981 * _field_entry_stat_t 3982 * Purpose: 3983 * This is field entry statistics collector descriptor structure. 3984 */ 3985 typedef struct _field_entry_stat_s { 3986 int sid; /* Unique statistics entity id. */ 3987 int extended_sid; /* Statistics entity id for Flex counter 3988 * in IFP */ 3989 uint16 flags; /* Statistics entity/entry flags.*/ 3990 bcm_field_stat_action_t 3991 stat_action; /* Stat Action. */ 3992 }_field_entry_stat_t; 3993 /* Statistics entity attached to fp entry flag. */ 3994 #define _FP_ENTRY_STAT_VALID (1 << 0) 3995 /* Statistics entity installed in HW. */ 3996 #define _FP_ENTRY_STAT_INSTALLED (1 << 1) 3997 /* Statistics entity doesn't have any counters attached. */ 3998 #define _FP_ENTRY_STAT_EMPTY (1 << 2) 3999 /* Statistics entity use even counter. */ 4000 #define _FP_ENTRY_STAT_USE_EVEN (1 << 3) 4001 /* Statistics entity use odd counter. */ 4002 #define _FP_ENTRY_STAT_USE_ODD (1 << 4) 4003 /* In Trident2 EFP , Statistics action conflicts with 4004 * Vxlan Actions. Below flag will be used in case of 4005 * conflicts */ 4006 #define _FP_ENTRY_STAT_NOT_ALLOWED (1 << 5) 4007 #define _FP_ENTRY_EXTENDED_STAT_VALID (1 << 6) 4008 #define _FP_ENTRY_EXTENDED_STAT_NOT_ALLOWED (1 << 7) 4009 #define _FP_ENTRY_EXTENDED_STAT_INSTALLED (1 << 8) 4010 #define _FP_ENTRY_EXTENDED_STAT_RESERVED (1 << 9) 4011 /* Statistics entity Dirty flag to fp entry flag. */ 4012 #define _FP_ENTRY_STAT_DIRTY (1 << 10) 4013 4014 4015 typedef struct _field_oam_stat_action_s { 4016 bcm_field_oam_stat_action_t *oam_stat_action; /* Oam Stat Action */ 4017 uint8 flex_pool_id; /* Flex Stat Pool Id */ 4018 int8 pool_instance; /* Flex Pool Instance in 4019 FP_POLICY_TABLE */ 4020 uint16 flags; /* Action Flags */ 4021 struct _field_oam_stat_action_s *next; /* Next Pointer */ 4022 } _field_oam_stat_action_t; 4023 4024 typedef enum _field_oam_stat_pool_config_e { 4025 _bcmFieldOamStatPoolInstanceFree = 0, 4026 _bcmFieldOamStatPoolInstanceReserve = 1, 4027 _bcmFieldOamStatPoolInstanceGet = 2, 4028 _bcmFieldOamStatPoolInstanceFreeAll = 3, 4029 _bcmFieldOamStatPoolInstanceCount = 4 4030 } _field_oam_stat_pool_config_t; 4031 4032 #define _FP_EGRESS_OAM_CLASS_ID 0x1 4033 #define _FP_EGRESS_SAT_CLASS_ID 0x2 4034 4035 #define _FP_ETHOAM_ETHER_TYPE 0x8902 4036 #define _FP_SAT_ETHER_TYPE 0x88b7 4037 4038 /* 4039 * Typedef: 4040 * _field_entry_t 4041 * Purpose: 4042 * This is the physical entry structure, hidden behind the logical 4043 * bcm_field_entry_t handle. 4044 * Notes: 4045 * Entries are stored in linked list in the under a slice's _field_slice_t 4046 * structure. 4047 * 4048 * Each entry can use 0 or 1 counters. Multiple entries may use the 4049 * same counter. The only requirement is that the counter be within 4050 * the same slice as the entry. 4051 * 4052 * Similarly each entry can use 0 or 1 meter. Multiple entries may use 4053 * the same meter. The only requirement is that the meter be within 4054 * the same slice as the entry. 4055 */ 4056 struct _field_entry_s { 4057 bcm_field_entry_t eid; /* BCM unit unique entry identifier */ 4058 int prio; /* Entry priority */ 4059 uint32 slice_idx; /* Field entry tcam index. */ 4060 uint32 ext_act_profile_idx; /* External field entry action profile index. */ 4061 uint32 flags; /* _FP_ENTRY_xxx flags */ 4062 int8 efp_key_match_type; /* Holds info(0/1) of which 4063 tcam (tcam/key_match_tcam) has 4064 to be written into EFP_TCAM 4065 during entry install */ 4066 _field_tcam_t tcam; /* Fields to be written into FP_TCAM */ 4067 _field_tcam_t extra_tcam; 4068 _field_tcam_t key_match_tcam; /* Fields to be written 4069 into FP_TCAM */ 4070 #if defined(BCM_RAPTOR_SUPPORT) || defined(BCM_TRX_SUPPORT) 4071 _field_pbmp_t pbmp; /* Port bitmap */ 4072 #endif /* BCM_RAPTOR_SUPPORT || BCM_TRX_SUPPORT */ 4073 _field_action_t *actions; /* linked list of actions for entry */ 4074 _field_slice_t *fs; /* Slice where entry lives */ 4075 _field_group_t *group; /* Group where entry lives */ 4076 _field_entry_stat_t statistic; /* Statistics collection entity. */ 4077 /* Policers attached to the entry. */ 4078 _field_oam_stat_action_t *field_oam_stat_action; /* Oam Stat Actions */ 4079 uint8 oam_pool_instance; /* Oam Stat Pool Instance */ 4080 _field_entry_policer_t policer[_FP_POLICER_LEVEL_COUNT]; 4081 #if defined(BCM_KATANA_SUPPORT) || defined(BCM_TRIUMPH3_SUPPORT) || \ 4082 defined(BCM_APACHE_SUPPORT) || defined(BCM_GREYHOUND2_SUPPORT) 4083 _field_entry_policer_t global_meter_policer; 4084 #endif 4085 uint8 ing_mtp_slot_map; /* Ingress Mirror 4086 Slot Container Allocated */ 4087 uint8 egr_mtp_slot_map; /* Egress Mirror 4088 Slot Container Allocated */ 4089 struct _field_entry_s *ent_copy; 4090 uint8 dvp_type; /* Type of DVP used in qualification */ 4091 uint8 svp_type; /* Type of SVP used in qualification */ 4092 #if defined(BCM_APACHE_SUPPORT) 4093 uint8 eth_oam_ctrl_mep_type; /* MEP type for 4094 ETH OAM Control Drop Qualifiers */ 4095 uint8 eth_oam_data_mep_type; /* MEP type for 4096 ETH OAM Data Drop Qualifiers */ 4097 uint8 mpls_oam_ctrl_mep_type; /* MEP type for 4098 Mpls OAM Control Drop Qualifiers */ 4099 uint8 mpls_oam_data_mep_type; /* MEP type for 4100 Mpls OAM Data Drop Qualifiers */ 4101 #endif 4102 #if defined(BCM_TRIDENT3_SUPPORT) 4103 bcm_vlan_action_set_t *vlan_action_set; /* Reference to VLAN Action set. */ 4104 #endif /* BCM_TRIDENT3_SUPPORT */ 4105 struct _field_entry_s *next; /* Entry lookup linked list. */ 4106 }; 4107 4108 typedef struct _field_control_s _field_control_t; 4109 4110 typedef struct _field_entry_recover_egr_ports_s { 4111 bcm_field_entry_t eid; 4112 struct _field_entry_recover_egr_ports_s *next; 4113 }_field_entry_recover_egr_ports_t; 4114 4115 typedef struct _field_egr_ports_entry_ids_list_s { 4116 bcm_field_entry_t eid; 4117 bcm_pbmp_t egr_ports_pbmp; 4118 struct _field_egr_ports_entry_ids_list_s *next; 4119 }_field_egr_ports_entry_ids_list_t; 4120 4121 typedef struct _field_egr_ports_recovery_s { 4122 _field_entry_recover_egr_ports_t **entry_recover_egr_ports; 4123 }_field_egr_ports_recovery_t; 4124 4125 4126 /* Sw WorkAround for EgressPortsAdd Action */ 4127 extern _field_egr_ports_recovery_t 4128 *_field_egr_ports_recovery[BCM_MAX_NUM_UNITS]; 4129 4130 /* Warmboot recovery for bcmFieldActionDscpMapNew */ 4131 typedef struct _field_dscp_map_new_eid_list_s { 4132 bcm_field_entry_t eid; 4133 struct _field_dscp_map_new_eid_list_s *next; 4134 }_field_dscp_map_new_eid_list_t; 4135 4136 /* 4137 * Typedef: 4138 * _field_funct_t 4139 * Purpose: 4140 * Function pointers to device specific Field functions 4141 */ 4142 typedef struct _field_funct_s { 4143 int(*fp_detach)(int, _field_control_t *fc); /* destructor function */ 4144 int(*fp_data_qualifier_ethertype_add)(int, int, 4145 bcm_field_data_ethertype_t *); 4146 int(*fp_data_qualifier_ethertype_delete)(int, int, 4147 bcm_field_data_ethertype_t *); 4148 int(*fp_data_qualifier_ip_protocol_add)(int, int, 4149 bcm_field_data_ip_protocol_t *); 4150 int(*fp_data_qualifier_ip_protocol_delete)(int, int, 4151 bcm_field_data_ip_protocol_t *); 4152 int(*fp_data_qualifier_packet_format_add)(int, int, 4153 bcm_field_data_packet_format_t *); 4154 int(*fp_data_qualifier_packet_format_delete)(int, int, 4155 bcm_field_data_packet_format_t *); 4156 int(*fp_group_install)(int, _field_group_t *fg); 4157 int(*fp_selcodes_install)(int unit, _field_group_t *fg, 4158 uint8 slice_numb, bcm_pbmp_t pbmp, 4159 int selcode_index); 4160 int(*fp_slice_clear)(int unit, _field_group_t *fg, _field_slice_t *fs); 4161 int(*fp_entry_remove)(int unit, _field_entry_t *f_ent, int tcam_idx); 4162 int(*fp_entry_move) (int unit, _field_entry_t *f_ent, int parts_count, 4163 int *tcam_idx_old, int *tcam_idx_new); 4164 int(*fp_selcode_get)(int unit, _field_stage_t*, bcm_field_qset_t*, 4165 _field_group_t*); 4166 int(*fp_selcode_to_qset)(int unit, _field_stage_t *stage_fc, 4167 _field_group_t *fg, 4168 int code_id, 4169 bcm_field_qset_t *qset); 4170 int(*fp_qual_list_get)(int unit, _field_stage_t *, _field_group_t*); 4171 int(*fp_tcam_policy_clear)(int unit, _field_entry_t *f_ent, 4172 _field_stage_id_t stage_id, int idx); 4173 int(*fp_tcam_policy_install)(int unit, _field_entry_t *f_ent, int idx); 4174 int(*fp_tcam_policy_reinstall)(int unit, _field_entry_t *f_ent, int idx); 4175 int(*fp_policer_install)(int unit, _field_entry_t *f_ent, 4176 _field_policer_t *f_pl); 4177 int(*fp_write_slice_map)(int unit, _field_stage_t *stage_fc, 4178 _field_group_t *fg); 4179 int(*fp_qualify_ip_type)(int unit, bcm_field_entry_t entry, 4180 bcm_field_IpType_t type, bcm_field_qualify_t qual); 4181 int(*fp_qualify_ip_type_get)(int unit, bcm_field_entry_t entry, 4182 bcm_field_IpType_t *type, bcm_field_qualify_t qual); 4183 int(*fp_action_support_check)(int unit, _field_entry_t *f_ent, 4184 bcm_field_action_t action, int *result); 4185 int(*fp_action_conflict_check)(int unit, _field_entry_t *f_ent, 4186 bcm_field_action_t action, 4187 bcm_field_action_t action1); 4188 int(*fp_action_params_check)(int unit, _field_entry_t *f_ent, 4189 _field_action_t *fa); 4190 int(*fp_action_depends_check)(int unit, _field_entry_t *f_ent, 4191 _field_action_t *fa); 4192 int (*fp_egress_key_match_type_set)(int unit, _field_entry_t *f_ent); 4193 int (*fp_external_entry_install)(int unit, _field_entry_t *f_ent); 4194 int (*fp_external_entry_reinstall)(int unit, _field_entry_t *f_ent); 4195 int (*fp_external_entry_remove)(int unit, _field_entry_t *f_ent); 4196 int (*fp_external_entry_prio_set)(int unit, _field_entry_t *f_ent, 4197 int prio); 4198 int (*fp_counter_get)(int unit, _field_stage_t *stage_fc, 4199 soc_mem_t counter_x_mem, uint32 *mem_x_buf, 4200 soc_mem_t counter_y_mem, uint32 *mem_y_buf, 4201 int idx, uint64 *packet_count, 4202 uint64 *byte_count); 4203 int (*fp_counter_set)(int unit, _field_stage_t *stage_fc, 4204 soc_mem_t counter_x_mem, uint32 *mem_x_buf, 4205 soc_mem_t counter_y_mem, uint32 *mem_y_buf, 4206 int idx, uint64 *packet_count, 4207 uint64 *byte_count); 4208 int (*fp_stat_index_get)(int unit, _field_stat_t *f_st, 4209 bcm_field_stat_t stat, int *idx1, 4210 int *idx2, int *idx3, uint32 *out_flags); 4211 int (*fp_control_set)(int unit, _field_control_t *fc, 4212 bcm_field_control_t control, uint32 state); 4213 int (*fp_control_get)(int unit, _field_control_t *fc, 4214 bcm_field_control_t control, uint32 *state); 4215 int (*fp_stat_value_get)(int unit, int sync_mode, _field_stat_t *f_st, 4216 bcm_field_stat_t stat, uint64 *value); 4217 int (*fp_stat_value_set)(int unit, _field_stat_t *f_st, 4218 bcm_field_stat_t stat, uint64 value); 4219 int (*fp_stat_hw_mode_get)(int unit, _field_stat_t *f_st, 4220 _field_stage_id_t stage_id); 4221 int (*fp_stat_hw_alloc)(int unit, _field_entry_t *f_ent); 4222 int (*fp_stat_hw_free)(int unit, _field_entry_t *f_ent); 4223 int (*fp_group_add)(int unit, uint32 flags, bcm_field_group_config_t *grp_conf); 4224 int (*fp_entry_enable)(int unit, _field_entry_t *f_ent, int enable_flag); 4225 int (*fp_qualify_svp)(int unit, bcm_field_entry_t entry, 4226 bcm_field_qualify_t qual, uint32 data, 4227 uint32 mask, int svp_valid); 4228 int (*fp_qualify_dvp)(int unit, bcm_field_entry_t entry, 4229 bcm_field_qualify_t qual, uint32 data, 4230 uint32 mask, int dvp_valid); 4231 int (*fp_qualify_trunk)(int unit, 4232 bcm_field_entry_t entry, 4233 bcm_field_qualify_t qual, 4234 bcm_trunk_t data, bcm_trunk_t mask); 4235 int (*fp_qualify_trunk_get)(int unit, 4236 bcm_field_entry_t entry, 4237 bcm_field_qualify_t qual, 4238 bcm_trunk_t *data, bcm_trunk_t *mask); 4239 int (*fp_qualify_inports)(int unit, 4240 bcm_field_entry_t entry, 4241 bcm_field_qualify_t qual, 4242 bcm_pbmp_t data, 4243 bcm_pbmp_t mask); 4244 int (*fp_entry_stat_extended_attach)(int unit, _field_entry_t *f_ent, 4245 int stat_id, bcm_field_stat_action_t stat_action); 4246 int (*fp_entry_stat_extended_get)(int unit, _field_entry_t *f_ent, 4247 int *stat_id, bcm_field_stat_action_t *stat_action); 4248 int (*fp_entry_stat_detach)(int unit, _field_entry_t *f_ent, int stat_id); 4249 int (*fp_class_size_get)(int unit, bcm_field_qualify_t qual, 4250 uint16 *class_size); 4251 int (*fp_policer_packet_counter_get32)(int unit, 4252 _field_policer_t *f_pl, uint32 *count); 4253 int (*fp_policer_packet_reset_counter_get32)(int unit, 4254 _field_policer_t *f_pl, uint32 *count); 4255 int (*fp_eh_mask_profile_hw_alloc)(int unit, _field_entry_t *f_ent); 4256 int (*fp_eh_mask_profile_hw_free)(int unit, 4257 _field_entry_t *f_ent, uint32 flags); 4258 int (*fp_zone_match_id_partition_init)(int unit, _field_stage_t *stage_fc); 4259 int (*fp_vlan_actions_profile_hw_alloc)(int unit, _field_entry_t *f_ent); 4260 int (*fp_vlan_actions_profile_hw_free)(int unit, 4261 _field_entry_t *f_ent, uint32 flags); 4262 int (*fp_qset_id_multi_set)(int unit, bcm_field_qualify_t qualifier, 4263 int num_objects, int objects_list[], 4264 bcm_field_qset_t *qset); 4265 int (*fp_qset_id_multi_get)(int unit, bcm_field_qset_t qset, 4266 bcm_field_qualify_t qualifier, int max, 4267 int *objects_list, int *actual); 4268 int (*fp_qset_id_multi_delete)(int unit, bcm_field_qualify_t qualifier, 4269 int num_objects, int objects_list[], 4270 bcm_field_qset_t *qset); 4271 int (*fp_qualify_udf)(int unit, bcm_field_entry_t eid, 4272 bcm_udf_id_t udf_id, int length, 4273 uint8 *data, uint8 *mask); 4274 int (*fp_qualify_udf_get)(int unit, bcm_field_entry_t eid, 4275 bcm_udf_id_t udf_id, int max_length, 4276 uint8 *data, uint8 *mask, int *actual_length); 4277 int (*fp_qualify_packet_res)(int unit, bcm_field_entry_t entry, 4278 uint32 *data, uint32 *mask); 4279 int (*fp_qualify_packet_res_get)(int unit, bcm_field_entry_t entry, 4280 uint32 *data, uint32 *mask); 4281 int (*fp_ddrop_action_alloc)(int unit, _field_entry_t *f_ent, 4282 _field_action_t *fa); 4283 int (*fp_dredirect_action_alloc)(int unit, _field_entry_t *f_ent, 4284 _field_action_t *fa); 4285 } _field_funct_t; 4286 4287 /* If given index in slice is free to be used. */ 4288 #define _BCM_FIELD_SLICE_IDX_TYPE_FREE 1 4289 /* If given index in slice has different group mode. */ 4290 #define _BCM_FIELD_SLICE_IDX_TYPE_DIFF 2 4291 /* If given index in slice has same group mode. */ 4292 #define _BCM_FIELD_SLICE_IDX_TYPE_SAME 3 4293 4294 /* 4295 * Typedef: 4296 * _bcm_field_entry_shift_params_t 4297 * Purpose: 4298 * For Entry movement due to change in priority requires to search for 4299 * free indices in the slice belonging to the field group. These free 4300 * indices in slices decides how entry is moved within the group slices 4301 * to acheive desired configuration. 4302 */ 4303 typedef struct _bcm_field_entry_shift_params_s { 4304 /* Target field slice where this entry need to be moved. */ 4305 _field_slice_t *target_fs; 4306 /* Slice index in target slice. */ 4307 int slice_idx_target; 4308 /* Slice where free index is found just after deciding target_fs/index. */ 4309 _field_slice_t *next_null_fs; 4310 /* Corresopnding index in next_null_fs. */ 4311 int next_null_index; 4312 /* slice where free index is found just before reaching target_fs/index. */ 4313 _field_slice_t *prev_null_fs; 4314 /* corresponding index in prev_null_fs. */ 4315 int prev_null_index; 4316 /* operator if decrement in target_idx is required. */ 4317 int decr_on_shift_up; 4318 /* Flag which represent free entry is not present in field group. */ 4319 int flag_no_free_entries; 4320 /* operator if only move is required for desired configuration. */ 4321 int only_move; 4322 4323 /* Remove it later */ 4324 _field_slice_t *first_null_fs; 4325 int first_null_index; 4326 int first_null_flag; 4327 4328 } _bcm_field_entry_shift_params_t; 4329 4330 #ifdef BCM_WARM_BOOT_SUPPORT 4331 #ifdef BCM_TOMAHAWK_SUPPORT 4332 4333 typedef struct _field_group_entry_arr_pos_s _field_group_entry_arr_pos_t; 4334 4335 struct _field_dynamic_map_entry_s { 4336 int entry_id; 4337 _field_entry_t *entry; 4338 struct _field_dynamic_map_entry_s *next; 4339 }; 4340 typedef struct _field_dynamic_map_entry_s _field_dynamic_map_entry_t; 4341 4342 struct _field_dynamic_map_lt_entry_s { 4343 int lt_entry_id; 4344 _field_lt_entry_t *lt_entry; 4345 struct _field_dynamic_map_lt_entry_s *next; 4346 }; 4347 typedef struct _field_dynamic_map_lt_entry_s _field_dynamic_map_lt_entry_t; 4348 4349 4350 struct _field_dynamic_map_s { 4351 _field_dynamic_map_entry_t *entry_map; 4352 _field_dynamic_map_lt_entry_t *lt_entry_map; 4353 }; 4354 4355 typedef struct _field_dynamic_map_s _field_dynamic_map_t; 4356 4357 4358 /* 4359 * Typedef: 4360 * _field_stat_bmp_t 4361 * Purpose: 4362 * Stat bit map for tracking configured stat types for each statid, 4363 * used only in WB. 4364 */ 4365 typedef struct _field_stat_bmp_s { 4366 SHR_BITDCL *w; 4367 } _field_stat_bmp_t; 4368 4369 #define _FP_STAT_BMP_FREE(bmp) sal_free((bmp).w) 4370 #define _FP_STAT_BMP_ADD(bmp, ctr) SHR_BITSET(((bmp).w), (ctr)) 4371 #define _FP_STAT_BMP_REMOVE(bmp, ctr) SHR_BITCLR(((bmp).w), (ctr)) 4372 #define _FP_STAT_BMP_TEST(bmp, ctr) SHR_BITGET(((bmp).w), (ctr)) 4373 4374 4375 /* Flags */ 4376 #define _FP_WB_TLV_LEN_PRESENT 0x00000001 4377 #define _FP_WB_TLV_LEN_ENCODED 0x00000002 4378 #define _FP_WB_TLV_NO_VALUE 0x00000004 4379 #define _FP_WB_TLV_NO_TYPE 0x00000008 4380 #define _FP_WB_TLV_NO_INGRESS 0x00010000 4381 #define _FP_WB_TLV_CLASS 0x00020000 4382 #define _FP_WB_TLV_NO_EM 0x00040000 4383 #define _FP_WB_TLV_NO_FT 0x00080000 4384 4385 /* TLV Processing */ 4386 #define _FP_WB_TLV_TYPES_MASK 0xffc00000 4387 #define _FP_WB_TLV_TYPE_SHIFT 22 4388 #define _FP_WB_TLV_LENGTH_MASK 0x003fffff 4389 #define _FP_WB_TLV_BASIC_TYPE_SHIFT 28 4390 #define _FP_WB_TLV_BASIC_TYPE_MASK 0xf0000000 4391 #define _FP_WB_TLV_ELEM_TYPE_MASK 0x0fffffff 4392 4393 /* end markers */ 4394 #define _FIELD_WB_EM_CONTROL 0xceab1122 4395 #define _FIELD_WB_EM_STAT 0xceab3344 4396 #define _FIELD_WB_EM_POLICER 0xceab5566 4397 #define _FIELD_WB_EM_HINT 0xceab7788 4398 #define _FIELD_WB_EM_STAGE 0xceab9900 4399 #define _FIELD_WB_EM_RANGE 0xcead1122 4400 #define _FIELD_WB_EM_METER 0xcead3344 4401 #define _FIELD_WB_EM_CNTR 0xcead5566 4402 #define _FIELD_WB_EM_LTCONF 0xcead7788 4403 #define _FIELD_WB_EM_DATACONTROL 0xcead9900 4404 #define _FIELD_WB_EM_DATAQUAL 0xceab1234 4405 #define _FIELD_WB_EM_DATAETYPE 0xceab5678 4406 #define _FIELD_WB_EM_DATAPROT 0xceab4321 4407 #define _FIELD_WB_EM_DATATCAM 0xceab8765 4408 #define _FIELD_WB_EM_QUAL 0xcead4321 4409 #define _FIELD_WB_EM_GROUP 0xcead8765 4410 #define _FIELD_WB_EM_QUALOFFSET 0xcead1234 4411 #define _FIELD_WB_EM_UDF 0xcead5678 4412 #define _FIELD_WB_EM_LTENTRY 0xcead9012 4413 #define _FIELD_WB_EM_ENTRY 0xcead3456 4414 #define _FIELD_WB_EM_SLICE 0xcead7890 4415 #define _FIELD_WB_EM_LTSLICE 0xcead0987 4416 #define _FIELD_WB_EM_EXTRACTOR 0xcead6543 4417 #define _FIELD_WB_EM_CLASS 0xcead2109 4418 #define _FIELD_WB_EM_PRESEL 0xcead5432 4419 #define _FIELD_WB_EM_AUXTAG_IBUS 0xcead0001 4420 4421 /* 4422 * Contains a type for every element that needs to be stored 4423 * in field structures 4424 */ 4425 typedef enum _bcm_field_internal_element_e { 4426 _bcmFieldInternalType = 0, 4427 _bcmFieldInternalExtractor = 1, 4428 _bcmFieldInternalGroup = 2, 4429 _bcmFieldInternalGroupId = 3, 4430 _bcmFieldInternalGroupPri = 4, 4431 _bcmFieldInternalGroupQset = 5, 4432 _bcmFieldInternalQsetW = 6, 4433 _bcmFieldInternalQsetUdfMap = 7, 4434 _bcmFieldInternalGroupFlags = 8, 4435 _bcmFieldInternalGroupPbmp = 9, 4436 _bcmFieldInternalGroupSlice = 10, 4437 _bcmFieldInternalGroupQual = 11, 4438 _bcmFieldInternalQualQid = 12, 4439 _bcmFieldInternalQualOffset = 13, 4440 _bcmFieldInternalQualSize = 14, 4441 _bcmFieldInternalGroupStage = 15, 4442 _bcmFieldInternalGroupEntry = 16, 4443 _bcmFieldInternalGroupBlockCount = 17, 4444 _bcmFieldInternalGroupGroupStatus = 18, 4445 _bcmFieldInternalGroupGroupAset = 19, 4446 _bcmFieldInternalGroupCounterBmp = 20, 4447 _bcmFieldInternalGroupInstance = 21, 4448 _bcmFieldInternalGroupExtCodes = 22, 4449 _bcmFieldInternalGroupLtSlice = 23, 4450 _bcmFieldInternalGroupLtConfig = 24, 4451 _bcmFieldInternalGroupLtEntry = 25, 4452 _bcmFieldInternalGroupLtEntrySize = 26, 4453 _bcmFieldInternalGroupLtEntryStatus = 27, 4454 _bcmFieldInternalLtStatusEntriesFree = 28, 4455 _bcmFieldInternalLtStatusEntriesTotal = 29, 4456 _bcmFieldInternalLtStatusEntriesCnt = 30, 4457 _bcmFieldInternalGroupQsetSize = 31, 4458 _bcmFieldInternalGroupHintId = 32, 4459 _bcmFieldInternalGroupMaxSize = 33, 4460 _bcmFieldInternalEndStructGroup = 34, 4461 _bcmFieldInternalQualOffsetField = 35, 4462 _bcmFieldInternalQualOffsetNumOffset = 36, 4463 _bcmFieldInternalQualOffsetOffsetArr = 37, 4464 _bcmFieldInternalQualOffsetWidth = 38, 4465 _bcmFieldInternalQualOffsetSec = 39, 4466 _bcmFieldInternalQualOffsetBitPos = 40, 4467 _bcmFieldInternalQualOffsetQualWidth = 41, 4468 _bcmFieldInternalGroupPartCount = 42, 4469 _bcmFieldInternalEntryEid = 43, 4470 _bcmFieldInternalEntryPrio = 44, 4471 _bcmFieldInternalEntrySliceId = 45, 4472 _bcmFieldInternalEntryFlagsPart1 = 46, 4473 _bcmFieldInternalEntryFlagsPart2 = 47, 4474 _bcmFieldInternalEntryFlagsPart3 = 48, 4475 _bcmFieldInternalEntryPbmp = 49, 4476 _bcmFieldInternalEntryAction = 50, 4477 _bcmFieldInternalEntrySlice = 51, 4478 _bcmFieldInternalEntryGroup = 52, 4479 _bcmFieldInternalEntryStat = 53, 4480 _bcmFieldInternalEntryPolicer = 54, 4481 _bcmFieldInternalEntryIngMtp = 55, 4482 _bcmFieldInternalEntryEgrMtp = 56, 4483 _bcmFieldInternalEntryDvp = 57, 4484 _bcmFieldInternalEntryCopy = 58, 4485 _bcmFieldInternalEntryCopyTypePointer = 59, 4486 _bcmFieldInternalPbmpData = 60, 4487 _bcmFieldInternalPbmpMask = 61, 4488 _bcmFieldInternalEntryActionsPbmp = 62, 4489 _bcmFieldInternalActionParam = 63, 4490 _bcmFieldInternalGroupClassAct = 64, 4491 _bcmFieldInternalActionHwIdx = 65, 4492 _bcmFieldInternalActionFlags = 66, 4493 _bcmFieldInternalStatFlags = 67, 4494 _bcmFieldInternalPolicerFlags = 68, 4495 _bcmFieldInternalExtl1e32Sel = 69, 4496 _bcmFieldInternalExtl1e16Sel = 70, 4497 _bcmFieldInternalExtl1e8Sel = 71, 4498 _bcmFieldInternalExtl1e4Sel = 72, 4499 _bcmFieldInternalExtl1e2Sel = 73, 4500 _bcmFieldInternalExtl2e16Sel = 74, 4501 _bcmFieldInternalExtl3e1Sel = 75, 4502 _bcmFieldInternalExtl3e2Sel = 76, 4503 _bcmFieldInternalExtl3e4Sel = 77, 4504 _bcmFieldInternalExtPmuxSel = 78, 4505 _bcmFieldInternalExtIntraSlice = 79, 4506 _bcmFieldInternalExtSecondary = 80, 4507 _bcmFieldInternalExtIpbmpRes = 81, 4508 _bcmFieldInternalExtNorml3l4 = 82, 4509 _bcmFieldInternalExtNormmac = 83, 4510 _bcmFieldInternalExtAuxTagaSel = 84, 4511 _bcmFieldInternalExtAuxTagbSel = 85, 4512 _bcmFieldInternalExtAuxTagcSel = 86, 4513 _bcmFieldInternalExtAuxTagdSel = 87, 4514 _bcmFieldInternalExtTcpFnSel = 88, 4515 _bcmFieldInternalExtTosFnSel = 89, 4516 _bcmFieldInternalExtTtlFnSel = 90, 4517 _bcmFieldInternalExtClassIdaSel = 91, 4518 _bcmFieldInternalExtClassIdbSel = 92, 4519 _bcmFieldInternalExtClassIdcSel = 93, 4520 _bcmFieldInternalExtClassIddSel = 94, 4521 _bcmFieldInternalExtSrcContaSel = 95, 4522 _bcmFieldInternalExtSrcContbSel = 96, 4523 _bcmFieldInternalExtSrcDestCont0Sel = 97, 4524 _bcmFieldInternalExtSrcDestCont1Sel = 98, 4525 _bcmFieldInternalExtKeygenIndex = 99, 4526 _bcmFieldInternalLtEntrySlice = 100, 4527 _bcmFieldInternalLtEntryIndex = 101, 4528 _bcmFieldInternalGroupCount = 102, 4529 _bcmFieldInternalSliceCount = 103, 4530 _bcmFieldInternalLtSliceCount = 104, 4531 _bcmFieldInternalEndStructGroupQual = 105, 4532 _bcmFieldInternalEndStructQualOffset = 106, 4533 _bcmFieldInternalEndStructEntryDetails = 107, 4534 _bcmFieldInternalEndStructEntry = 108, 4535 _bcmFieldInternalEntryPbmpData = 109, 4536 _bcmFieldInternalEntryPbmpMask = 110, 4537 _bcmFieldInternalEndStructAction = 111, 4538 _bcmFieldInternalGlobalEntryPolicer = 112, 4539 _bcmFieldInternalGlobalEntryPolicerPid = 113, 4540 _bcmFieldInternalGlobalEntryPolicerFlags = 114, 4541 _bcmFieldInternalEndGroupExtractor = 115, 4542 _bcmFieldInternalControl = 116, 4543 _bcmFieldInternalControlFlags = 117, 4544 _bcmFieldInternalStage = 118, 4545 _bcmFieldInternalControlGroups = 119, 4546 _bcmFieldInternalControlStages = 120, 4547 _bcmFieldInternalControlPolicerHash = 121, 4548 _bcmFieldInternalControlPolicerCount = 122, 4549 _bcmFieldInternalControlStathash = 123, 4550 _bcmFieldInternalControlStatCount = 124, 4551 _bcmFieldInternalControlHintBmp = 125, 4552 _bcmFieldInternalControlHintHash = 126, 4553 _bcmFieldInternalControlLastAllocatedLtId = 127, 4554 _bcmFieldInternalEndStructControl = 128, 4555 _bcmFieldInternalPolicerPid = 129, 4556 _bcmFieldInternalPolicerSwRefCount = 130, 4557 _bcmFieldInternalPolicerHwRefCount = 131, 4558 _bcmFieldInternalPolicerLevel = 132, 4559 _bcmFieldInternalPolicerPoolIndex = 133, 4560 _bcmFieldInternalPolicerHwIndex = 134, 4561 _bcmFieldInternalPolicerHwFlags = 135, 4562 _bcmFieldInternalPolicerStageId = 136, 4563 _bcmFieldInternalEndStructPolicer = 137, 4564 _bcmFieldInternalStatsId = 138, 4565 _bcmFieldInternalStatSwRefCount = 139, 4566 _bcmFieldInternalStatHwRefCount = 140, 4567 _bcmFieldInternalStatOffsetMode = 141, 4568 _bcmFieldInternalStatPoolIndex = 142, 4569 _bcmFieldInternalStatHwIndex = 143, 4570 _bcmFieldInternalStatHwFlags = 144, 4571 _bcmFieldInternalEndStructStage = 145, 4572 _bcmFieldInternalStatnStat = 146, 4573 _bcmFieldInternalStatArr = 147, 4574 _bcmFieldInternalStatHwStat = 148, 4575 _bcmFieldInternalStatHwMode = 149, 4576 _bcmFieldInternalStatHwEntryCount = 150, 4577 _bcmFieldInternalStatGid = 151, 4578 _bcmFieldInternalStatStageId = 152, 4579 _bcmFieldInternalStatStatValues = 153, 4580 _bcmFieldInternalStatFlexMode = 154, 4581 _bcmFieldInternalEndStructStat = 155, 4582 _bcmFieldInternalHintHintid = 156, 4583 _bcmFieldInternalHintHints = 157, 4584 _bcmFieldInternalHintsHinttype = 158, 4585 _bcmFieldInternalHintsQual = 159, 4586 _bcmFieldInternalHintsMaxValues = 160, 4587 _bcmFieldInternalHintsStartbit = 161, 4588 _bcmFieldInternalHintsEndbit = 162, 4589 _bcmFieldInternalHintsFlags = 163, 4590 _bcmFieldInternalHintsMaxGrpSize = 164, 4591 _bcmFieldInternalEndStructHints = 165, 4592 _bcmFieldInternalHintGrpRefCount = 166, 4593 _bcmFieldInternalHintCount = 167, 4594 _bcmFieldInternalEndStructHint = 168, 4595 _bcmFieldInternalPolicerCfgFlags = 169, 4596 _bcmFieldInternalPolicerCfgMode = 170, 4597 _bcmFieldInternalPolicerCfgCkbitsSec = 171, 4598 _bcmFieldInternalPolicerCfgMaxCkbitsSec = 172, 4599 _bcmFieldInternalPolicerCfgCkbitsBurst = 173, 4600 _bcmFieldInternalPolicerCfgPkbitsSec = 174, 4601 _bcmFieldInternalPolicerCfgMaxPkbitsSec = 175, 4602 _bcmFieldInternalPolicerCfgPkbitsBurst = 176, 4603 _bcmFieldInternalPolicerCfgKbitsCurrent = 177, 4604 _bcmFieldInternalPolicerCfgActionId = 178, 4605 _bcmFieldInternalPolicerCfgSharingMode = 179, 4606 _bcmFieldInternalPolicerCfgEntropyId = 180, 4607 _bcmFieldInternalPolicerCfgPoolId = 181, 4608 _bcmFieldInternalControlEndStructUdf = 182, 4609 _bcmFieldInternalHintHintsHintType = 183, 4610 _bcmFieldInternalHintHintsQual = 184, 4611 _bcmFieldInternalHintHintsMaxValues = 185, 4612 _bcmFieldInternalHintHintsStartBit = 186, 4613 _bcmFieldInternalHintHintsEndBit = 187, 4614 _bcmFieldInternalHintHintsFlags = 188, 4615 _bcmFieldInternalHintHintsMaxGrpSize = 189, 4616 _bcmFieldInternalEndStructHintHints = 190, 4617 _bcmFieldInternalStageStageid = 191, 4618 _bcmFieldInternalStageFlags = 192, 4619 _bcmFieldInternalStageTcamSz = 193, 4620 _bcmFieldInternalStageTcamSlices = 194, 4621 _bcmFieldInternalStageNumInstances = 195, 4622 _bcmFieldInternalStageNumPipes = 196, 4623 _bcmFieldInternalStageRanges = 197, 4624 _bcmFieldInternalStageRangeId = 198, 4625 _bcmFieldInternalStageNumMeterPools = 199, 4626 _bcmFieldInternalStageMeterPool = 200, 4627 _bcmFieldInternalStageNumCntrPools = 201, 4628 _bcmFieldInternalStageCntrPools = 202, 4629 _bcmFieldInternalStageLtTcamSz = 203, 4630 _bcmFieldInternalStageNumLogicalTables = 204, 4631 _bcmFieldInternalStageLtInfo = 205, 4632 _bcmFieldInternalStageExtLevels = 206, 4633 _bcmFieldInternalStageOperMode = 207, 4634 _bcmFieldInternalRangeFlags = 208, 4635 _bcmFieldInternalRangeRid = 209, 4636 _bcmFieldInternalRangeMin = 210, 4637 _bcmFieldInternalRangeMax = 211, 4638 _bcmFieldInternalRangeHwIndex = 212, 4639 _bcmFieldInternalRangeStyle = 213, 4640 _bcmFieldInternalMeterLevel = 214, 4641 _bcmFieldInternalMeterSliceId = 215, 4642 _bcmFieldInternalMeterSize = 216, 4643 _bcmFieldInternalMeterPoolSize = 217, 4644 _bcmFieldInternalMeterFreeMeters = 218, 4645 _bcmFieldInternalMeterNumMeterPairs = 219, 4646 _bcmFieldInternalMeterBmp = 220, 4647 _bcmFieldInternalCntrSliceId = 221, 4648 _bcmFieldInternalCntrSize = 222, 4649 _bcmFieldInternalCntrFreeCntrs = 223, 4650 _bcmFieldInternalCntrBmp = 224, 4651 _bcmFieldInternalLtConfigValid = 225, 4652 _bcmFieldInternalLtConfigLtId = 226, 4653 _bcmFieldInternalLtConfigLtPartPri = 227, 4654 _bcmFieldInternalLtConfigLtPartMap = 228, 4655 _bcmFieldInternalLtConfigLtActionPri = 229, 4656 _bcmFieldInternalLtConfigPri = 230, 4657 _bcmFieldInternalLtConfigFlags = 231, 4658 _bcmFieldInternalLtConfigEntry = 232, 4659 _bcmFieldInternalEndStructRanges = 233, 4660 _bcmFieldInternalEndStructMeter = 234, 4661 _bcmFieldInternalEndStructCntr = 235, 4662 _bcmFieldInternalEndStructLtConfig = 236, 4663 _bcmFieldInternalSlice = 237, 4664 _bcmFieldInternalSliceStartTcamIdx = 238, 4665 _bcmFieldInternalSliceNumber = 239, 4666 _bcmFieldInternalSliceEntryCount = 240, 4667 _bcmFieldInternalSliceFreeCount = 241, 4668 _bcmFieldInternalSliceCountersCount = 242, 4669 _bcmFieldInternalSliceMetersCount = 243, 4670 _bcmFieldInternalSliceInstalledEntriesCount = 244, 4671 _bcmFieldInternalSliceCounterBmp = 245, 4672 _bcmFieldInternalSliceMeterBmp = 246, 4673 _bcmFieldInternalSliceStageId = 247, 4674 _bcmFieldInternalSlicePortPbmp = 248, 4675 _bcmFieldInternalSliceEntriesInfo = 249, 4676 _bcmFieldInternalSliceNextSlice = 250, 4677 _bcmFieldInternalSlicePrevSlice = 251, 4678 _bcmFieldInternalSliceFlags = 252, 4679 _bcmFieldInternalSliceGroupFlags = 253, 4680 _bcmFieldInternalSliceLtMap = 254, 4681 _bcmFieldInternalEndStructSlice = 255, 4682 _bcmFieldInternalEndStructExtractor = 256, 4683 _bcmFieldInternalLtSliceSliceNum = 257, 4684 _bcmFieldInternalLtSliceStartTcamIdx = 258, 4685 _bcmFieldInternalLtSliceEntryCount = 259, 4686 _bcmFieldInternalLtSliceFreeCount = 260, 4687 _bcmFieldInternalLtSliceStageid = 261, 4688 _bcmFieldInternalLtSliceEntryinfo = 262, 4689 _bcmFieldInternalLtSliceNextSlice = 263, 4690 _bcmFieldInternalLtSlicePrevSlice = 264, 4691 _bcmFieldInternalLtSliceFlags = 265, 4692 _bcmFieldInternalLtSliceGroupFlags = 266, 4693 _bcmFieldInternalDataControlStart = 267, 4694 _bcmFieldInternalDataControlUsageBmp = 268, 4695 _bcmFieldInternalDataControlDataQualStruct = 269, 4696 _bcmFieldInternalDataControlDataQualQid = 270, 4697 _bcmFieldInternalDataControlDataQualUdfSpec = 271, 4698 _bcmFieldInternalDataControlDataQualOffsetBase = 272, 4699 _bcmFieldInternalDataControlDataQualOffset = 273, 4700 _bcmFieldInternalDataControlDataQualByteOffset = 274, 4701 _bcmFieldInternalDataControlDataQualHwBmp = 275, 4702 _bcmFieldInternalDataControlDataQualFlags = 276, 4703 _bcmFieldInternalDataControlDataQualElemCount = 277, 4704 _bcmFieldInternalDataControlDataQualLength = 278, 4705 _bcmFieldInternalDataControlEndStructDataQual = 279, 4706 _bcmFieldInternalDataControlEthertypeStruct = 280, 4707 _bcmFieldInternalDataControlEthertypeRefCount = 281, 4708 _bcmFieldInternalDataControlEthertypeL2 = 282, 4709 _bcmFieldInternalDataControlEthertypeVlanTag = 283, 4710 _bcmFieldInternalDataControlEthertypePortEt = 284, 4711 _bcmFieldInternalDataControlEthertypeRelOffset = 285, 4712 _bcmFieldInternalDataControlProtStart = 286, 4713 _bcmFieldInternalDataControlProtIp4RefCount = 287, 4714 _bcmFieldInternalDataControlProtIp6RefCount = 288, 4715 _bcmFieldInternalDataControlProtFlags = 289, 4716 _bcmFieldInternalDataControlProtIp = 290, 4717 _bcmFieldInternalDataControlProtL2 = 291, 4718 _bcmFieldInternalDataControlProtVlanTag = 292, 4719 _bcmFieldInternalDataControlProtRelOffset = 293, 4720 _bcmFieldInternalDataControlTcamStruct = 294, 4721 _bcmFieldInternalDataControlTcamRefCount = 295, 4722 _bcmFieldInternalDataControlTcamPriority = 296, 4723 _bcmFieldInternalDataControlElemSize = 297, 4724 _bcmFieldInternalDataControlNumElem = 298, 4725 _bcmFieldInternalEndStructDataControl = 299, 4726 _bcmFieldInternalControlUdfValid = 300, 4727 _bcmFieldInternalControlUdfUseCount = 301, 4728 _bcmFieldInternalControlUdfNum = 302, 4729 _bcmFieldInternalControlUdfUserNum = 303, 4730 _bcmFieldInternalControlUdfDetails = 304, 4731 _bcmFieldInternalDataControlEndStructEtype = 305, 4732 _bcmFieldInternalDataControlEndStructProt = 306, 4733 _bcmFieldInternalDataControlEndStructTcam = 307, 4734 _bcmFieldInternalEntryStatSid = 308, 4735 _bcmFieldInternalEntryStatExtendedSid = 309, 4736 _bcmFieldInternalEntryStatFlags = 310, 4737 _bcmFieldInternalEntryStatAction = 311, 4738 _bcmFieldInternalEndStructLtEntryDetails = 312, 4739 _bcmFieldInternalSliceLtPartitionPri = 313, 4740 _bcmFieldInternalEntryPolicerPid = 314, 4741 _bcmFieldInternalEntryPolicerFlags = 315, 4742 _bcmFieldInternalEndStructEntPolicer = 316, 4743 _bcmFieldInternalEndStructIFP = 317, 4744 _bcmFieldInternalStageClass = 318, 4745 _bcmFieldInternalClassFlags = 319, 4746 _bcmFieldInternalClassEntUsed = 320, 4747 _bcmFieldInternalClassBmp = 321, 4748 _bcmFieldInternalEndStructClass = 322, 4749 _bcmFieldInternalClassOperMode = 323, 4750 _bcmFieldInternalEntryTcamIptype = 324, 4751 _bcmFieldInternalEndStageClass = 325, 4752 _bcmFieldInternalEntryPbmpFullData = 326, 4753 _bcmFieldInternalEntryPbmpFullMask = 327, 4754 _bcmFieldInternalStageLtActionPri = 328, 4755 _bcmFieldInternalStagePreselQset = 329, 4756 _bcmFieldInternalControlPreselInfo = 330, 4757 _bcmFieldInternalGroupPreselQual = 331, 4758 _bcmFieldInternalPreselId = 332, 4759 _bcmFieldInternalPreselFlags = 333, 4760 _bcmFieldInternalPreselPri = 334, 4761 _bcmFieldInternalPreselHwIndex = 335, 4762 _bcmFieldInternalPreselSliceIndex = 336, 4763 _bcmFieldInternalPreselTcamIndex = 337, 4764 _bcmFieldInternalPreselClassAction = 338, 4765 _bcmFieldInternalPreselLtDataSize = 339, 4766 _bcmFieldInternalPreselQset = 340, 4767 _bcmFieldInternalEndStructPreselInfo = 341, 4768 _bcmFieldInternalPreselInfoLimit = 342, 4769 _bcmFieldInternalPreselLastAllocatedId = 343, 4770 _bcmFieldInternalPreselSet = 344, 4771 _bcmFieldInternalPreselOperationalSet = 345, 4772 _bcmFieldInternalPreselKeySize = 346, 4773 _bcmFieldInternalPreselEntrySlice = 347, 4774 _bcmFieldInternalPreselEntryGroup = 348, 4775 _bcmFieldInternalEMOperMode = 349, 4776 _bcmFieldInternalEndStageEM = 350, 4777 _bcmFieldInternalEMEntryarr = 351, 4778 _bcmFieldInternalEMGroupMode = 352, 4779 _bcmFieldInternalEMGroupAset = 353, 4780 _bcmFieldInternalPreselPbmp = 354, 4781 _bcmFieldInternalQualOffsetQualWidth16 = 355, 4782 _bcmFieldInternalStatBmp = 356, 4783 _bcmFieldInternalQsetQual = 357, 4784 _bcmFieldInternalQsetUdf = 358, 4785 _bcmFieldInternalQualifyCount = 359, 4786 _bcmFieldInternalHintHintsPri = 360, 4787 /* _bcmFieldInternalEMGroupAset was not storing length. 4788 Bug fixed through this enum */ 4789 _bcmFieldInternalEMGroupAset2 = 361, 4790 _bcmFieldInternalEntrySvpType = 362, 4791 /* bcmFieldActionParam was not storing parameters 4792 * for copytocpu and timetsamptocpu, 4793 * Bug fixed through this Enum */ 4794 _bcmFieldInternalActionParam1 = 363, 4795 _bcmFieldInternalGroupActionProfIdx = 364, 4796 _bcmFieldInternalGroupFlagsMsb16 = 365, 4797 _bcmFieldInternalSliceFlagsMsb24 = 366, 4798 _bcmFieldInternalExtAltTtlFnSel = 367, 4799 _bcmFieldInternalStageClassInfo = 368, 4800 _bcmFieldInternalControlMeterInUse = 369, 4801 _bcmFieldInternalHintHintsDosAttackEventFlags = 370, 4802 _bcmFieldInternalFTOperMode = 371, 4803 _bcmFieldInternalFTEntryArr = 372, 4804 _bcmFieldInternalEndStageFT = 373, 4805 _bcmFieldInternalStageAuxTagIBusContStatus = 374, 4806 _bcmFieldInternalAuxTagIbusContVal = 375, 4807 _bcmFieldInternalAuxTagIbusRefCount = 376, 4808 _bcmFieldInternalEndStructAuxTagIbus = 377, 4809 _bcmFieldInternalStageGrpRunningPrio = 378, 4810 _bcmFieldInternalEMActionPbmOpaqueObject1 = 379, 4811 _bcmFieldInternalEMActionPbmOpaqueObject2 = 380, 4812 _bcmFieldInternalEMActionPbmGbpSrcIdNew = 381, 4813 _bcmFieldInternalEMActionPbmGbpDstIdNew = 382, 4814 _bcmFieldInternalEMActionPbmEgressFlowControlEnable = 383, 4815 _bcmFieldInternalEMActionPbmOpaqueObject3 = 384, 4816 _bcmFieldInternalEMActionPbmAssignNatClassId = 385, 4817 _bcmFieldInternalEMActionPbmAssignChangeL2FieldsClassId = 386, 4818 _bcmFieldInternalElementCount = 387 4819 } _bcm_field_internal_element_t; 4820 4821 #define BCM_FIELD_TYPE_ENUM_PROPERTIES 0xabcdef12 4822 4823 #endif /* BCM_TOMAHAWK_SUPPORT */ 4824 4825 /* 4826 * Typedef: 4827 * _field_action_bmp_t 4828 * Purpose: 4829 * Action bit map for tracking configured actions for each entry, 4830 * used only in WB. 4831 */ 4832 typedef struct _field_action_bmp_s { 4833 SHR_BITDCL *w; 4834 } _field_action_bmp_t; 4835 4836 #define _FP_ACTION_BMP_FREE(bmp) sal_free((bmp).w) 4837 #define _FP_ACTION_BMP_ADD(bmp, ctr) SHR_BITSET(((bmp).w), (ctr)) 4838 #define _FP_ACTION_BMP_REMOVE(bmp, ctr) SHR_BITCLR(((bmp).w), (ctr)) 4839 #define _FP_ACTION_BMP_TEST(bmp, ctr) SHR_BITGET(((bmp).w), (ctr)) 4840 4841 /* 4842 * Typedef: 4843 * _field_selector_bmp_t 4844 * Purpose: 4845 * Action bit map for tracking configured actions for each entry, 4846 * used only in WB. 4847 */ 4848 typedef struct _field_selector_bmp_s { 4849 SHR_BITDCL *w; 4850 } _field_selector_bmp_t; 4851 4852 #define _FP_SEL_BMP_FREE(bmp) sal_free((bmp).w) 4853 #define _FP_SEL_BMP_ADD(bmp, ctr) SHR_BITSET(((bmp).w), (ctr)) 4854 #define _FP_SEL_BMP_REMOVE(bmp, ctr) SHR_BITCLR(((bmp).w), (ctr)) 4855 #define _FP_SEL_BMP_TEST(bmp, ctr) SHR_BITGET(((bmp).w), (ctr)) 4856 4857 typedef struct _field_slice_sel_info_s { 4858 bcm_field_group_t gid; 4859 _field_selector_bmp_t slice_sel[_FP_MAX_ENTRY_WIDTH]; 4860 uint8 slice_sel_count; 4861 } _field_slice_sel_info_t; 4862 4863 typedef struct _field_slice_group_info_s { 4864 bcm_field_group_t gid; /* Temp recovered GID */ 4865 int instance; /* Temp recovered Pipe Instance. */ 4866 int priority; /* Temp recovered group priority */ 4867 bcm_field_qset_t qset; /* Temp QSET retrieved */ 4868 bcm_pbmp_t pbmp; /* Temp recovered rep. port */ 4869 int found; /* Group has been found */ 4870 int flags; /* Group flags */ 4871 int action_res_id; /* Group Action Resolution id */ 4872 int8 efp_pri_key; /* EFP primary fpf3 value */ 4873 int8 efp_sec_key; /* EFP secondary fpf3 value */ 4874 int8 sel_ingress_entity[_FP_MAX_ENTRY_WIDTH]; 4875 int8 sel_dst_fwd_entity[_FP_MAX_ENTRY_WIDTH]; 4876 int8 sel_src_entity[_FP_MAX_ENTRY_WIDTH]; 4877 int8 sel_loopback_type[_FP_MAX_ENTRY_WIDTH]; 4878 struct _field_slice_group_info_s *next; 4879 } _field_slice_group_info_t; 4880 4881 typedef struct _field_hw_qual_info_s { 4882 _field_sel_t pri_slice[2]; /* Potentially intraslice */ 4883 _field_sel_t sec_slice[2]; /* Potentially intraslice */ 4884 } _field_hw_qual_info_t; 4885 4886 typedef struct _meter_config_s { 4887 uint8 meter_mode; 4888 uint8 meter_mode_modifier; 4889 uint16 meter_idx; 4890 uint8 meter_update_odd; 4891 uint8 meter_test_odd; 4892 uint8 meter_update_even; 4893 uint8 meter_test_even; 4894 } _meter_config_t; 4895 typedef struct _field_table_pointers_s { 4896 char *fp_global_mask_tcam_buf; 4897 char *fp_gm_tcam_x_buf; 4898 char *fp_gm_tcam_y_buf; 4899 uint32 *fp_tcam_buf; 4900 uint32 *fp_tcam_x_buf; 4901 uint32 *fp_tcam_y_buf; 4902 } _field_table_pointers_t; 4903 4904 4905 /* Flags for is_present_bmp in _field_entry_oam_wb_t */ 4906 #define _FP_OAM_STAT_ACTION_WB_SYNC (1 << 0) 4907 #define _FP_EXTENDED_STATS_WB_SYNC (1 << 1) 4908 4909 typedef struct _field_oam_stat_action_wb_s { 4910 bcm_stat_object_t stat_object; 4911 uint32 stat_mode_id; 4912 } _field_oam_stat_action_wb_t; 4913 4914 typedef struct _field_oam_action_recover_s { 4915 int8 flex_pool_id; 4916 bcm_field_stat_action_t action; 4917 }_field_oam_action_recover_t; 4918 4919 typedef struct _field_extended_stat_wb_s { 4920 uint32 flex_mode; 4921 int hw_flags; 4922 uint8 flex_stat_map; 4923 bcm_field_stat_t stat_id; 4924 } _field_extended_stat_wb_t; 4925 4926 /* Per entry data that can be synced and recovered */ 4927 typedef struct _field_entry_oam_wb_s { 4928 uint32 is_present_bmp; /* Bitmap to notify if data present */ 4929 /* Oam Lm Stat Actions */ 4930 uint8 oam_stat_action_count; /* Number of oam stat actions */ 4931 _field_oam_stat_action_wb_t *oam_stat_action_wb; 4932 /* Oam Stat Action */ 4933 /* Extended Stats */ 4934 _field_extended_stat_wb_t *extended_stat_wb; 4935 /* Extended Stats */ 4936 } _field_entry_oam_wb_t; 4937 4938 /* per Entry facricQueue param uinfo to be synced and recovered */ 4939 typedef struct _field_action_fabricQueue_wb_s { 4940 uint32 cosq_gport; 4941 #if defined(BCM_KATANA_SUPPORT) 4942 uint32 profile_idx; 4943 #endif 4944 } _field_action_fabricQueue_wb_t; 4945 /* Per entry policer data that can be synced and recovered */ 4946 typedef struct _field_entry_policer_wb_s { 4947 uint16 policer_delta_rates[_FP_POLICER_LEVEL_COUNT][4]; 4948 /* Delta rates between actual hw and configured 4949 Committed rate, Committed burst, 4950 Peak rate, Peak burst at each level of policer.*/ 4951 } _field_entry_policer_wb_t; 4952 4953 typedef struct _field_action_redir_wb_s { 4954 bcm_field_redirect_config_t params; 4955 uint8 valid; 4956 } _field_action_redir_wb_t; 4957 4958 typedef struct _field_action_copytocpu_wb_s { 4959 bcm_field_CopyToCpu_config_t params; 4960 uint8 valid; 4961 } _field_action_copytocpu_wb_t; 4962 4963 typedef struct _field_action_OamStatObjSId_wb_s { 4964 bcm_stat_object_t stat_object; 4965 uint8 valid; 4966 } _field_action_OamStatObjSId_wb_t; 4967 4968 typedef struct _field_entry_wb_info_s { 4969 bcm_field_entry_t eid; /* Entry id */ 4970 int prio; /* Entry Priority */ 4971 bcm_field_stat_t sid; /* Entry stat id */ 4972 bcm_policer_t pid; /* Entry level-0 policer id */ 4973 bcm_policer_t pid1; /* Entry level-1 policer id */ 4974 uint8 dvp_type[_FP_MAX_ENTRY_WIDTH]; /* Entry DVP type */ 4975 uint8 svp_type[_FP_MAX_ENTRY_WIDTH]; /* Entry SVP type */ 4976 uint8 color_independent; /* Entry Color flag */ 4977 _field_entry_oam_wb_t *f_ent_oam_wb; /* Entry OAM info */ 4978 _field_action_bmp_t *action_bmp; /* Entry action param bit-map */ 4979 uint8 ing_gport_type; /* Entry action Ingress Gport Type. */ 4980 uint32 port_prio_int_gport; /* Entry action Prio int CosQ Gport*/ 4981 uint32 yp_port_prio_int_gport; /* Entry action Prio int CosQ Gport*/ 4982 uint32 rp_port_prio_int_gport; /* Entry action Prio int CosQ Gport*/ 4983 bcm_gport_t ingress_mirror[4]; /* Ingress Mirror Gport */ 4984 bcm_gport_t egress_mirror[4]; /* Egress Mirror Gport */ 4985 #ifdef BCM_APACHE_SUPPORT 4986 uint8 ingress_oam_mep_type[4]; /* Entry OAM Drop Control */ 4987 _field_action_redir_wb_t action_redir_wb; /* Entry Redirect Action Info */ 4988 _field_action_copytocpu_wb_t action_copytocpu_wb; /* Entry CopyToCpu Action Info */ 4989 _field_action_OamStatObjSId_wb_t action_StatObjSId_wb; /* Entry Stat Object Action Info */ 4990 #endif 4991 _field_entry_policer_wb_t *f_ent_policer_wb; /* Entry Policer info */ 4992 _field_action_fabricQueue_wb_t action_fabricQueue_wb; /*hold params for fabricQueue action */ 4993 } _field_entry_wb_info_t; 4994 4995 #ifdef BCM_TOMAHAWK_SUPPORT 4996 /* Type of elements that are being stored */ 4997 typedef enum _bcm_field_internal_type_e { 4998 _bcmFieldInternalVariable = 0, 4999 _bcmFieldInternalArray = 1, 5000 _bcmFieldInternalTypeCount = 2 5001 } _bcm_field_internal_type_t; 5002 5003 5004 typedef struct _field_tlv_s { 5005 _bcm_field_internal_element_t type; 5006 _bcm_field_internal_type_t basic_type; 5007 uint32 length; 5008 void *value; 5009 } _field_tlv_t; 5010 5011 5012 typedef struct _field_type_map_s { 5013 _bcm_field_internal_element_t element; 5014 int size; 5015 uint32 flags; 5016 } _field_type_map_t; 5017 5018 typedef struct _field_wb_entry_s { 5019 _field_action_bmp_t act_bmp; 5020 int *hw_idx_array; 5021 /* This is used to store port larger than 5022 * 128 for actions like EgressPortsAdd.*/ 5023 int *val_array0; 5024 int *val_array; 5025 uint32 flags[_FP_TH_MAX_ENTRY_WIDTH]; 5026 uint32 action_count; 5027 uint8 action_param_type; 5028 } _field_wb_entry_t; 5029 5030 /* 5031 * Structure to maintain the list of entries and actions 5032 * dependent on Mirror module and are to be recovered after 5033 * Mirror module reinit. 5034 */ 5035 typedef struct _bcm_field_mirror_actions_recover_s { 5036 _field_entry_t *f_ent; 5037 bcm_field_action_t action; 5038 bcm_gport_t mtp_gport; 5039 struct _bcm_field_mirror_actions_recover_s *next; 5040 } _bcm_field_mirror_actions_recover_t; 5041 #endif /* BCM_TOMAHAWK_SUPPORT */ 5042 5043 #if defined INCLUDE_L3 5044 /* 5045 * Structure to maintain the list of entries and actions 5046 * dependent on L3 module and are to be recovered after 5047 * L3 module reinit. 5048 */ 5049 typedef struct _bcm_field_l3_callback_recover_s { 5050 _field_entry_t *f_ent; 5051 bcm_field_action_t action; 5052 int param0; 5053 int hw_index; 5054 struct _bcm_field_l3_callback_recover_s *next; 5055 } _bcm_field_l3_callback_recover_t; 5056 extern _bcm_field_l3_callback_recover_t *_field_l3_cb; 5057 5058 extern int _bcm_field_l3_recover_callback(int unit); 5059 #endif /* INCLUDE_L3 */ 5060 #endif /* BCM_WARM_BOOT_SUPPORT */ 5061 5062 /* This reflects the 64,000bps granularity */ 5063 #define _FP_POLICER_REFRESH_RATE 64 5064 5065 typedef struct _field_stage_funct_s { 5066 int (*fp_stages_add)(int unit, _field_control_t *fc); 5067 int (*fp_stages_delete)(int unit, _field_control_t *fc); 5068 } _field_stage_funct_t; 5069 5070 /* 5071 * Typedef: 5072 * _field_sliceidx_bmp_t 5073 * Purpose: 5074 * Bitmap to store the slice indexes of disabled entries. 5075 */ 5076 typedef struct _field_sliceidx_bmp_s{ 5077 SHR_BITDCL *w; 5078 } _field_sliceidx_bmp_t; 5079 5080 #define _FP_SLICEIDX_BMP_ADD(bmp, sliceidx) SHR_BITSET(((bmp).w), (sliceidx)) 5081 #define _FP_SLICEIDX_BMP_REMOVE(bmp, sliceidx) SHR_BITCLR(((bmp).w), (sliceidx)) 5082 #define _FP_SLICEIDX_BMP_TEST(bmp, sliceidx) SHR_BITGET(((bmp).w), (sliceidx)) 5083 5084 5085 5086 /* 5087 * Typedef: 5088 * _field_hintid_bmp_t 5089 * Purpose: 5090 * Hint bit map for tracking allocation of hintids. 5091 */ 5092 typedef struct _field_hintid_bmp_s{ 5093 SHR_BITDCL *w; 5094 } _field_hintid_bmp_t; 5095 5096 #define _FP_HINTID_BMP_ADD(bmp, hintid) SHR_BITSET(((bmp).w), (hintid)) 5097 #define _FP_HINTID_BMP_REMOVE(bmp, hintid) SHR_BITCLR(((bmp).w), (hintid)) 5098 #define _FP_HINTID_BMP_TEST(bmp, hintid) SHR_BITGET(((bmp).w), (hintid)) 5099 5100 typedef struct _field_hint_s { 5101 bcm_field_hint_t *hint; /* hint datastructure */ 5102 struct _field_hint_s *next; /* Next pointer to hint structure */ 5103 }_field_hint_t; 5104 5105 typedef struct _field_hints_s { 5106 bcm_field_hintid_t hintid; /* hint id */ 5107 _field_hint_t *hints; /* List of hints linked to hintid */ 5108 uint16 grp_ref_count; /* Count of groups linked to a hintid */ 5109 uint16 hint_count; /* Count of hints linked to a hintid */ 5110 struct _field_hints_s *next; /* Pointer to next hint_id present 5111 in the hash_index */ 5112 }_field_hints_t; 5113 5114 /* 5115 * Typedef: 5116 * _field_control_t 5117 * Purpose: 5118 * One structure for each StrataSwitch Device that holds the global 5119 * field processor metadata for one device. 5120 */ 5121 struct _field_control_s { 5122 int init; /* TRUE if field module has been */ 5123 /* initialized */ 5124 uint8 flags; /* Module specific flags, as follows */ 5125 #define _FP_COLOR_INDEPENDENT (1 << 0) 5126 #define _FP_INTRASLICE_ENABLE (1 << 1) 5127 #define _FP_EXTERNAL_PRESENT (1 << 2) 5128 #ifdef BCM_WARM_BOOT_SUPPORT 5129 #define _FP_STABLE_SAVE_LONG_IDS (1 << 3) 5130 #endif 5131 #define _FP_STAT_SYNC_ENABLE (1 << 4) 5132 #define _FP_POLICER_GROUP_SHARE_ENABLE (1 << 5) 5133 #define _FP_EXACTMATCH_STAGE_SKIP_DETACH (1 << 6) /* If set EM stage won't be disturbed during bcm_field_init */ 5134 5135 /* This is enabled or disabled through fieldControl 5136 * EgressAutoExpandWithPolicer 5137 */ 5138 #define _FP_AUTOEXPAND_WITH_POLICER (1 << 7) 5139 5140 bcm_field_stage_t stage; /* Default FP pipeline stage. */ 5141 int tcam_ext_numb; /* Slice number for external. */ 5142 /* TCAM (-1 if not present). */ 5143 _field_udf_t *udf; /* field_status->group_total */ 5144 /* elements indexed by priority. */ 5145 struct _field_group_s *groups; /* List of groups in unit. */ 5146 struct _field_stage_s *stages; /* Pipeline stage FP info. */ 5147 _field_funct_t functions; /* Device specific functions. */ 5148 _field_policer_t **policer_hash;/* Policer lookup hash. */ 5149 uint32 policer_count; /* Number of active policers. */ 5150 #ifdef BCM_TRIUMPH3_SUPPORT 5151 uint8 ingress_logical_policer_pools_mode; 5152 #endif 5153 _field_stat_t **stat_hash; /* Counter lookup hash. */ 5154 uint32 stat_count; /* Number of active counters. */ 5155 _field_hintid_bmp_t hintid_bmp; /* Bitmap of Created Hint Ids */ 5156 _field_hints_t **hints_hash; /* Hints lookup hash */ 5157 #ifdef BCM_WARM_BOOT_SUPPORT 5158 #define _FIELD_SCACHE_PART_COUNT 0x2 5159 /* Size of Level2 warm boot cache */ 5160 uint32 scache_size[_FIELD_SCACHE_PART_COUNT]; 5161 uint32 scache_usage; /* Actual scache usage */ 5162 uint32 scache_pos; /* Current position of scache 5163 pointer in _FIELD_ACACHE_PART_0 */ 5164 uint32 scache_pos1; /* Current position of scache 5165 pointer in _FIELD_ACACHE_PART_1 */ 5166 /* Pointer to scache section */ 5167 uint8 *scache_ptr[_FIELD_SCACHE_PART_COUNT]; 5168 uint8 l2warm; /* Use the stored scache data */ 5169 _field_slice_group_info_t *group_arr; /* Temp recovered group info */ 5170 #endif 5171 #if defined(BCM_TOMAHAWK_SUPPORT) 5172 uint32 last_allocated_lt_eid; /* Last allocated LT ID. */ 5173 struct _field_presel_entry_s **presel_db; /* Presel Entry lookup database.*/ 5174 struct _field_presel_info_s *presel_info; /* Preselector information. */ 5175 _field_lt_config_t *lt_info[_FP_MAX_NUM_PIPES][_FP_MAX_NUM_LT]; 5176 5177 /* all number of possible combinations of _bcmFieldQualifyData0~9 */ 5178 #define _EXTD_QSET_COMB_SIZE (1023) 5179 /* number_of_qualify, _bcmFieldQualifyData0~9 */ 5180 #define _EXTD_QSET_DATA_NUM (11) 5181 /* qset for Tomahawk and later devices */ 5182 int extd_qset_comb[_EXTD_QSET_COMB_SIZE][_EXTD_QSET_DATA_NUM]; 5183 int extd_qset_comb_init; 5184 #endif /* !BCM_TOMAHAWK_SUPPORT */ 5185 _field_stage_funct_t stage_func; /* Stage Init and Destroy functions. */ 5186 #if defined(BCM_TRIUMPH3_SUPPORT) 5187 int _fp_egr_ifp_mod_fields_size; 5188 _field_action_l2mod_index_bmp_t field_action_l2mod_index_bmp; 5189 #endif /* (BCM_TRIUMPH3_SUPPORT) */ 5190 5191 #if defined (BCM_KATANA_SUPPORT) 5192 _field_fabricQueue_action_t *field_fabricQueue_action_list; /* fabricQ action list*/ 5193 #endif /* (BCM_KATANA_SUPPORT)*/ 5194 uint32 last_allocated_eid; 5195 #ifdef BCM_WARM_BOOT_SUPPORT 5196 uint16 wb_current_version; 5197 uint16 wb_recovered_version; 5198 #endif 5199 uint32 pipe_map; 5200 #if defined(BCM_TOMAHAWK_SUPPORT) 5201 uint8 ifp_em_meter_in_use[_FP_MAX_NUM_PIPES][_FIELD_MAX_METER_POOLS]; 5202 soc_profile_mem_t eh_mask_profile; /* HiGiG2 extended Header 5203 * Mask Profile. 5204 */ 5205 #endif 5206 soc_profile_mem_t redirect_profile; /* Redirect action memory profile.*/ 5207 #if defined(BCM_TOMAHAWK3_SUPPORT) 5208 soc_profile_mem_t redirect_profile1; /* Redirect action memory profile.*/ 5209 #endif 5210 soc_profile_mem_t ddrop_profile; /* MatchPbmpDrop action memory profile.*/ 5211 soc_profile_mem_t dredirect_profile; /* MatchPbmpDrop action memory profile.*/ 5212 }; 5213 5214 5215 /* 5216 * _field_group_add_fsm struct. 5217 * Field group creation state machine. 5218 * Handles sanity checks, resources selection, allocation. 5219 */ 5220 typedef struct _field_group_add_fsm_s { 5221 /* State machine data. */ 5222 uint8 fsm_state; /* FSM state. */ 5223 uint8 fsm_state_prev;/* Previous FSM state. */ 5224 uint32 flags; /* State specific flags. */ 5225 int rv; /* Error code. */ 5226 5227 /* Field control info. */ 5228 _field_control_t *fc; /* Field control structure. */ 5229 _field_stage_t *stage_fc; /* Field stage control structure. */ 5230 5231 5232 /* Group information. */ 5233 int priority; /* New group priority. */ 5234 bcm_field_group_t group_id; /* SW Group id. */ 5235 bcm_pbmp_t pbmp; /* Input port bitmap. */ 5236 bcm_field_qset_t qset; /* Qualifiers set. */ 5237 bcm_field_aset_t aset; /* Action set. */ 5238 bcm_field_group_mode_t mode; /* Group mode. */ 5239 bcm_field_presel_set_t preselset; /* set of preselector Ids. */ 5240 uint16 aset_size; /* Group's Aset size */ 5241 /* Allocated data structures. */ 5242 _field_group_t *fg; /* Allocated group structure. */ 5243 bcm_field_hintid_t hintid; /* HintId to be linked to a group */ 5244 int action_res_id; /* Action resolution id */ 5245 } _field_group_add_fsm_t; 5246 5247 #define _BCM_FP_GROUP_ADD_STATE_START (0x1) 5248 #define _BCM_FP_GROUP_ADD_STATE_ALLOC (0x2) 5249 #define _BCM_FP_GROUP_ADD_STATE_QSET_UPDATE (0x3) 5250 #define _BCM_FP_GROUP_ADD_STATE_ASET_VALIDATE (0x4) 5251 #define _BCM_FP_GROUP_ADD_STATE_SEL_CODES_GET (0x5) 5252 #define _BCM_FP_GROUP_ADD_STATE_QSET_ALTERNATE (0x6) 5253 #define _BCM_FP_GROUP_ADD_STATE_SLICE_ALLOCATE (0x7) 5254 #define _BCM_FP_GROUP_ADD_STATE_HW_QUAL_LIST_GET (0x8) 5255 #define _BCM_FP_GROUP_ADD_STATE_UDF_UPDATE (0x9) 5256 #define _BCM_FP_GROUP_ADD_STATE_ADJUST_VIRTUAL_MAP (0xa) 5257 #define _BCM_FP_GROUP_ADD_STATE_EXTERNAL_GROUP_CREATE (0xb) 5258 #define _BCM_FP_GROUP_ADD_STATE_CAM_COMPRESS (0xc) 5259 #define _BCM_FP_GROUP_ADD_STATE_SLICE_ALIGN (0xd) 5260 #define _BCM_FP_GROUP_ADD_STATE_END (0xe) 5261 5262 #define _BCM_FIELD_PIPE0_GROUP (0x0) 5263 #define _BCM_FIELD_PIPE1_GROUP (0x1) 5264 #define _BCM_FIELD_PIPE2_GROUP (0x2) 5265 #define _BCM_FIELD_PIPE3_GROUP (0x3) 5266 #define _BCM_FIELD_PIPE4_GROUP (0x4) 5267 #define _BCM_FIELD_PIPE5_GROUP (0x5) 5268 #define _BCM_FIELD_PIPE6_GROUP (0x6) 5269 #define _BCM_FIELD_PIPE7_GROUP (0x7) 5270 #define _BCM_FIELD_GLOBAL_GROUP (0xf) 5271 5272 #define _BCM_FP_GROUP_ADD_STATE_STRINGS \ 5273 { \ 5274 "None", \ 5275 "GroupAddStart", \ 5276 "GroupAddAlloc", \ 5277 "GroupAddStateQsetUpdate", \ 5278 "GroupAddSelCodesGet", \ 5279 "GroupAddQsetAlternate", \ 5280 "GroupAddSliceAllocate", \ 5281 "GroupAddHwQualListGet", \ 5282 "GroupAddUdfUpdate", \ 5283 "GroupAddAdjustVirtualMap", \ 5284 "GroupAddExternalGroupCreate", \ 5285 "GroupAddCamCompress", \ 5286 "GroupAddEnd" \ 5287 } 5288 5289 #define _BCM_FP_GROUP_ADD_INTRA_SLICE (1 << 0) 5290 #define _BCM_FP_GROUP_ADD_INTRA_SLICE_ONLY (1 << 1) 5291 #define _BCM_FP_GROUP_ADD_WLAN (1 << 2) 5292 #define _BCM_FP_GROUP_ADD_SMALL_SLICE (1 << 3) 5293 #define _BCM_FP_GROUP_ADD_LARGE_SLICE (1 << 4) 5294 5295 /* _bcm_field_DestType_e - Destination types. */ 5296 typedef enum _bcm_field_DestType_e { 5297 _bcmFieldDestTypeNhi, /* Next Hop Interface */ 5298 _bcmFieldDestTypeL3mc, /* IPMC group */ 5299 _bcmFieldDestTypeL2mc, /* L2 Multicast group */ 5300 _bcmFieldDestTypeDvp, /* Virtual Port */ 5301 _bcmFieldDestTypeDglp, /* Mod/Port/Trunk */ 5302 _bcmFieldDestTypeNone, /* None */ 5303 _bcmFieldDestTypeEcmp, /* ECMP group */ 5304 _bcmFieldDestTypeCount /* Always Last. Not a usable value. */ 5305 } _bcm_field_DestType_t; 5306 5307 #define _FIELD_D_TYPE_MASK (0x7) 5308 #define _FIELD_D_TYPE_POS \ 5309 ((SOC_IS_TRIDENT2X(unit) || SOC_IS_TITAN2X(unit) || \ 5310 SOC_IS_TRIUMPH3(unit)) ? (18) : \ 5311 ((SOC_IS_TD_TT(unit) || SOC_IS_KATANAX(unit) || \ 5312 SOC_IS_GREYHOUND2(unit)) ? (16) : \ 5313 ((SOC_IS_HURRICANE3(unit)) ? (15) : (14)))) 5314 #define _FIELD_D_TYPE_INSERT(_d_, _dtype_) \ 5315 ((_d_) |= ((uint32) (_dtype_) << _FIELD_D_TYPE_POS)) 5316 #define _FIELD_D_TYPE_RESET(_d_) \ 5317 ((_d_) &= ~(_FIELD_D_TYPE_MASK << _FIELD_D_TYPE_POS)) 5318 #define _FIELD_D_TYPE_MASK_INSERT(_d_) \ 5319 ((_d_) |= (_FIELD_D_TYPE_MASK << _FIELD_D_TYPE_POS)) 5320 5321 /* Insert destination type value at specific bit offset */ 5322 #define _FIELD_D_TYPE_INSERT_BITPOS(_d_, _dtype_, _bitpos_) \ 5323 ((_d_) |= ((uint32) (_dtype_) << (_bitpos_))) 5324 #define _FIELD_D_TYPE_RESET_BITPOS(_d_, _bitpos_) \ 5325 ((_d_) &= ~(_FIELD_D_TYPE_MASK << (_bitpos_))) 5326 #define _FIELD_D_TYPE_MASK_INSERT_BITPOS(_d_, _bitpos_) \ 5327 ((_d_) |= (_FIELD_D_TYPE_MASK << (_bitpos_))) 5328 5329 extern soc_field_t _trx_src_class_id_sel[], _trx_dst_class_id_sel[], 5330 _trx_interface_class_id_sel[]; 5331 5332 #define COPY_TO_CPU_CANCEL 0x2 5333 #define SWITCH_TO_CPU_CANCEL 0x3 5334 #define COPY_AND_SWITCH_TO_CPU_CANCEL 0x6 5335 5336 /* 5337 * Prototypes of Field Processor utility funtions 5338 */ 5339 extern int _bcm_field_meter_free_get(const _field_stage_t *stage_fc, 5340 const _field_group_t *fg, const _field_slice_t *fs); 5341 extern int _bcm_field_meters_total_get(const _field_stage_t *stage_fc, 5342 int instance, const _field_slice_t *fs); 5343 extern int _bcm_field_counter_free_get(const _field_stage_t *stage_fc, 5344 const _field_slice_t *fs); 5345 extern int _bcm_field_counters_total_get(const _field_stage_t *stage_fc, 5346 const _field_slice_t *fs); 5347 extern int _bcm_field_entries_free_get(int unit, _field_slice_t *fs, 5348 _field_group_t *fg, int *free_cnt); 5349 extern char * _field_action_name(bcm_field_action_t action); 5350 5351 extern int _bcm_field_qualifiers_info_get(int unit, _field_stage_t *stage_fc, 5352 bcm_field_qset_t *qset_req, 5353 _bcm_field_qual_info_t ***f_qual_arr, 5354 uint16 *qual_arr_size); 5355 extern void _bcm_field_selcode_qual_arr_free(int unit, 5356 _bcm_field_qual_info_t ***f_qual_arr, 5357 uint16 qual_count); 5358 extern int _bcm_field_group_linked_list_insert(int unit, 5359 _field_group_add_fsm_t *fsm_ptr); 5360 extern int _bcm_field_group_linked_list_remove(int unit, _field_group_t *fg); 5361 extern int _bcm_field_group_add(int unit, _field_group_add_fsm_t *fsm_ptr); 5362 extern int _bcm_field_group_stage_get(int unit, bcm_field_qset_t *qset_p, 5363 _field_stage_id_t *stage); 5364 extern int _bcm_field_group_stage_validate(int unit, _field_stage_id_t stage); 5365 extern int _bcm_field_control_set(int unit, _field_control_t *fc, 5366 bcm_field_control_t control, uint32 state); 5367 extern int _bcm_field_control_get(int unit, _field_control_t *fc, 5368 bcm_field_control_t control, uint32 *state); 5369 extern int _bcm_field_stage_fpf_destroy(int unit, _field_stage_t *stage_fc); 5370 extern int _bcm_field_stage_fpf_init(int unit, _field_stage_t *stage_fc); 5371 extern int _bcm_field_data_qualifier_destroy(int unit, int qid); 5372 extern int _bcm_field_group_slice_count_get(uint32 flags, int *count); 5373 extern int _field_egr_ports_recovery_control_get(int unit, 5374 _field_egr_ports_recovery_t **f_egr_recovery); 5375 extern int _bcm_trx_field_egr_ports_recovery_add (int unit, 5376 bcm_field_entry_t entry, 5377 bcm_pbmp_t pbmp); 5378 extern int _bcm_trx_field_egr_ports_recovery_search (int unit, int port, 5379 bcm_field_entry_t entry); 5380 extern int _bcm_trx_field_egr_ports_recovery_print (int unit); 5381 extern int _bcm_trx_field_egr_ports_recovery_entry_ids_list_get (int unit, 5382 _field_egr_ports_entry_ids_list_t **entries, 5383 int *entry_count); 5384 extern int _bcm_trx_field_egr_ports_recovery_entry_list_destroy (int unit, 5385 _field_egr_ports_entry_ids_list_t **entries); 5386 extern int _bcm_trx_field_egr_ports_recovery_entry_remove (int unit, 5387 bcm_field_entry_t entry); 5388 extern int _bcm_trx_field_egr_ports_recovery_entry_pbmp_get (int unit, 5389 bcm_field_entry_t entry, 5390 bcm_pbmp_t *redirectPbmp); 5391 extern int _field_egr_ports_recovery_scache_recover (int unit, 5392 _field_control_t *fc, _field_stage_t *stage_fc, 5393 uint8 *scache_ptr); 5394 extern int _field_egr_ports_recovery_scache_sync(int unit, _field_control_t *fc, 5395 _field_stage_t *stage_fc, uint8 *scache_ptr); 5396 extern int _field_egr_ports_recovery_wb_upgrade_add (int unit, 5397 _field_group_t *fg); 5398 extern int _field_hints_control_get (int unit, bcm_field_hintid_t hint_id, 5399 _field_hints_t **f_ht); 5400 extern int _bcm_field_hints_group_info_update (int unit,_field_group_t *fg); 5401 extern int _bcm_field_hints_group_count_update (int unit, 5402 bcm_field_hintid_t hintid, 5403 uint8 action); 5404 extern int _bcm_field_hints_add (int unit, bcm_field_hintid_t hint_id, 5405 bcm_field_hint_t *hint); 5406 extern int _bcm_field_hints_node_get (int unit, _field_hint_t *hint_list, 5407 bcm_field_hint_t *hint, _field_hint_t **hint_node); 5408 extern int _bcm_field_hints_get(int unit, bcm_field_hintid_t hint_id, 5409 bcm_field_hint_t *hint); 5410 extern int _bcm_field_hints_delete (int unit, bcm_field_hintid_t hint_id, 5411 bcm_field_hint_t *hint); 5412 extern int _bcm_field_hints_delete_all (int unit, bcm_field_hintid_t hint_id); 5413 extern int _bcm_field_hints_dump (int unit); 5414 extern int _bcm_field_hints_display (int unit, bcm_field_hintid_t hint_id); 5415 extern int _bcm_field_hints_scache_sync (int unit, _field_control_t *fc, 5416 _field_stage_t *stage_fc, uint8 *scache_ptr); 5417 extern int _bcm_field_hints_scache_recover (int unit, _field_control_t *fc, 5418 _field_stage_t *stage_fc, uint8 *scache_ptr); 5419 extern int _bcm_hints_scache_hintid_sync (int unit, _field_stage_t *stage_fc, uint8 *scache_ptr); 5420 extern int _bcm_hints_scache_hintid_recover (int unit, _field_stage_t *stage_fc, _field_control_t *fc, 5421 uint8 *scache_ptr); 5422 extern int _field_group_slice_selectors_sync (int unit, uint8 *scache_ptr, 5423 _field_stage_id_t stage_id); 5424 extern int _field_group_slice_selectors_recover (int unit, uint8 *scache_ptr, 5425 _field_stage_id_t stage_id); 5426 extern int _bcm_field_slice_group_get_next(int unit, 5427 int instance, 5428 _field_stage_id_t stage_id, 5429 int slice_id, 5430 _field_group_t **curr_group, 5431 _field_group_t **next_group); 5432 extern int _field_fill_slice_array(int unit, _field_group_t *fg, uint8 *slice_array); 5433 extern int _field_control_get(int unit, _field_control_t **fc); 5434 extern int _field_stage_control_get(int unit, _field_stage_id_t stage, 5435 _field_stage_t **stage_fc); 5436 extern int _bcm_field_stat_hw_alloc(int unit, _field_entry_t *f_ent); 5437 extern int _bcm_field_stat_array_init(int unit, _field_control_t *fc, 5438 _field_stat_t *f_st, int nstat, 5439 bcm_field_stat_t *stat_arr); 5440 extern int _field_stat_destroy(int unit, int sid); 5441 extern int _bcm_field_stage_slice_count_get( 5442 int unit, 5443 bcm_field_stage_t stage_id, 5444 int *slice_count); 5445 extern int _bcm_field_stage_slice_info_get(int unit, 5446 bcm_field_stage_t stage_id, 5447 bcm_pbmp_t pbmp, 5448 int slice_no, 5449 bcm_field_stage_slice_info_t *slice_info); 5450 extern int _field_group_get(int unit, bcm_field_group_t gid, 5451 _field_group_t **group_p); 5452 extern int _bcm_field_group_id_generate(int unit, bcm_field_group_t *group); 5453 extern int _bcm_field_group_default_aset_set(int unit, _field_group_t *fg); 5454 extern int _field_entry_get(int unit, bcm_field_entry_t eid, uint32 flags, 5455 _field_entry_t **enty_p); 5456 extern int _field_group_entry_add (int unit, _field_group_t *fg, 5457 _field_entry_t *f_ent); 5458 extern int _field_group_entry_delete (int unit, _field_group_t *fg, 5459 _field_entry_t *f_ent); 5460 extern int _bcm_field_entry_tcam_parts_count (int unit, 5461 _field_stage_id_t stage_id, 5462 uint32 group_flags, 5463 int *part_count); 5464 extern int _bcm_field_lt_entry_tcam_parts_count (int unit, 5465 _field_stage_id_t stage_id, 5466 uint32 group_flags, 5467 int *part_count); 5468 extern int _bcm_field_entry_flags_to_tcam_part (int unit, uint32 entry_flags, 5469 _field_group_t *fg, 5470 uint8 *entry_part); 5471 extern int _bcm_field_tcam_part_to_entry_flags(int unit, int entry_part, 5472 _field_group_t *fg, 5473 uint32 *entry_flags); 5474 extern int 5475 _field_udf_hints_present_get(int unit, bcm_field_entry_t eid, 5476 bcm_udf_id_t udf_id, 5477 uint8 *hints_present); 5478 extern int _field_port_filter_enable_set(int unit, _field_control_t *fc, 5479 uint32 state); 5480 extern int _field_meter_refresh_enable_set(int unit, _field_control_t *fc, 5481 uint32 state); 5482 extern int _field_qual_info_create(bcm_field_qualify_t qid, soc_mem_t mem, 5483 soc_field_t fpf, int offset, int width, 5484 _qual_info_t **fq_p); 5485 extern int _field_qualify32(int unit, bcm_field_entry_t entry, 5486 int qual, uint32 data, uint32 mask); 5487 extern int _field_qual_offset_get(int unit, _field_entry_t *f_ent, int qid, 5488 _bcm_field_qual_offset_t **offset); 5489 extern int _bcm_field_qualify_trunk(int unit, 5490 bcm_field_entry_t entry, 5491 bcm_field_qualify_t qual, 5492 bcm_trunk_t data, 5493 bcm_trunk_t mask); 5494 extern int _bcm_field_qualify_trunk_get(int unit, 5495 bcm_field_entry_t entry, 5496 bcm_field_qualify_t qual, 5497 bcm_trunk_t *data, 5498 bcm_trunk_t *mask); 5499 extern int _bcm_field_qualify_InPorts(int unit, 5500 bcm_field_entry_t entry, 5501 bcm_field_qualify_t qual, 5502 bcm_pbmp_t data, 5503 bcm_pbmp_t mask); 5504 extern int _field_qset_union(const bcm_field_qset_t *qset1, 5505 const bcm_field_qset_t *qset2, 5506 bcm_field_qset_t *qset_union); 5507 extern int _field_qset_is_subset(const bcm_field_qset_t *qset1, 5508 const bcm_field_qset_t *qset2); 5509 extern bcm_field_qset_t _field_qset_diff(const bcm_field_qset_t qset_1, 5510 const bcm_field_qset_t qset_2); 5511 extern int _field_qset_is_empty(const bcm_field_qset_t qset); 5512 extern int 5513 _field_selector_diff(int unit, _field_sel_t *sel_arr, int part_idx, 5514 _bcm_field_selector_t *selector, 5515 uint8 *diff_count); 5516 5517 extern int _field_trans_flags_to_index(int unit, int flags, uint8 *tbl_idx); 5518 extern int _field_qual_add (_field_fpf_info_t *fpf_info, int qid, int offset, 5519 int width, int code); 5520 extern int _bcm_field_tpid_hw_encode(int unit, uint16 tpid, uint32 *hw_code); 5521 extern int _field_tpid_hw_decode(int unit, uint32 hw_code, uint16 *tpid); 5522 extern int _field_entry_prio_cmp(int prio_first, int prio_second); 5523 extern int _bcm_field_prio_mgmt_init(int unit, _field_stage_t *stage_fc); 5524 extern int _bcm_field_prio_mgmt_deinit(int unit, _field_stage_t *stage_fc); 5525 extern int _bcm_field_entry_prio_mgmt_update(int unit, _field_entry_t *f_ent, 5526 int flag, uint32 old_location); 5527 extern int 5528 _bcm_field_prio_mgmt_slice_reinit(int unit, 5529 _field_stage_t *stage_fc, 5530 _field_slice_t *fs); 5531 extern int _bcm_field_entry_target_location(int unit, _field_stage_t *stage_fc, 5532 _field_entry_t *f_ent, int new_prio, uint32 *new_location); 5533 extern int _bcm_field_entry_counters_move(int unit, _field_stage_t *stage_fc, 5534 int old_index, int new_index); 5535 extern int _bcm_field_sw_counter_update(int unit, _field_stage_t *stage_fc, 5536 soc_mem_t mem, int idx_min, int idx_max, 5537 char *buf, int flags); 5538 extern int _bcm_field_counter_mem_get(int unit, 5539 _field_stage_t *stage_fc, 5540 soc_mem_t *counter_x_mem, 5541 soc_mem_t *counter_y_mem 5542 ); 5543 extern int _bcm_field_counter_hw_alloc(int unit, 5544 _field_entry_t *f_ent, 5545 _field_slice_t *fs 5546 ); 5547 extern int _bcm_field_stat_hw_free(int unit, _field_entry_t *f_ent); 5548 extern int _bcm_field_entry_stat_detach(int unit, _field_entry_t *f_ent, int stat_id); 5549 #ifdef INCLUDE_L3 5550 #if defined (BCM_KATANA_SUPPORT) || defined (BCM_TRIDENT_SUPPORT) \ 5551 || defined (BCM_TRIUMPH3_SUPPORT) || defined (BCM_GREYHOUND_SUPPORT) 5552 extern int _field_nh_ref_count_incr (int unit, _field_entry_t *f_ent); 5553 #endif /* BCM_KATANA_SUPPORT || BCM_TRIDENT_SUPPORT || BCM_TRIUMPH3_SUPPORT \ 5554 || BCM_GREYHOUND_SUPPORT */ 5555 5556 #endif 5557 extern int _field_control_free(int unit, _field_control_t *fc); 5558 extern int _field_egr_ports_recovery_control_free (int unit, 5559 _field_egr_ports_recovery_t *f_egr_recovery); 5560 extern int _field_stages_init(int unit, _field_control_t *fc); 5561 extern int _field_stages_destroy(int unit, _field_control_t *fc); 5562 extern int _field_stage_delete(int unit, _field_control_t *fc, _field_stage_t *stage_fc); 5563 5564 extern void _bcm_esw_fp_counters_collect(int unit); 5565 #ifdef BCM_WARM_BOOT_SUPPORT 5566 extern int _field_scache_pointer_init_wb(int unit, _field_control_t *fc); 5567 extern int _field_scache_pointer_init(int unit, _field_control_t *fc); 5568 #endif 5569 extern int _field_hints_id_alloc (int unit, bcm_field_hintid_t *hint_id); 5570 5571 extern unsigned _field_stage_action_support_check(int unit, 5572 _field_group_t *fg, 5573 unsigned action); 5574 extern int _field_aset_install(int unit, _field_group_t *fg); 5575 extern int _bcm_esw_field_group_mode_get(uint32 flags, bcm_field_group_mode_t *mode); 5576 extern int _field_group_qset_update(int unit, _field_group_t *fg); 5577 extern void _field_udf_usecount_update(_field_udf_t *udf, 5578 bcm_field_qset_t *qset_old, 5579 bcm_field_qset_t *qset_new); 5580 extern int _field_group_vmap_delete(int unit, _field_stage_t *stage_fc, 5581 _field_group_t *fg, int install); 5582 extern int _field_group_compress(int unit, _field_group_t *fg, 5583 _field_stage_t *stage_fc); 5584 extern int _field_group_vmap_add(int unit, _field_stage_t *stage_fc, 5585 _field_group_t *fg); 5586 extern int _field_fb_entries_enable_set(int unit, _field_group_t *fg, 5587 _field_slice_t *fs, int enable); 5588 extern int _field_range_flags_check(int unit, uint32 flags); 5589 extern int _field_fb_er_range_check_set(int unit, int range, uint32 flags, int enable, 5590 bcm_l4_port_t min, bcm_l4_port_t max); 5591 extern int _bcm_field_modify_range_checker(int unit, _field_stage_id_t stage_id, 5592 int range_id, uint32 flags, bcm_l4_port_t min, bcm_l4_port_t max); 5593 extern int _field_action_delete(int unit, bcm_field_entry_t entry, 5594 bcm_field_action_t action, 5595 uint32 param0, uint32 param1); 5596 extern void _bcm_field_linkscan_update(int unit, bcm_port_t port, 5597 bcm_port_info_t *portInfo); 5598 extern int _field_group_deinit(int unit, _field_group_t *fg); 5599 5600 extern int _field_range_create(int unit, bcm_field_range_t *range, 5601 uint32 flags, bcm_l4_port_t min, 5602 bcm_l4_port_t max, bcm_if_group_t group); 5603 extern int 5604 _field_entry_create_id(int unit, bcm_field_group_t group, 5605 bcm_field_entry_t entry); 5606 extern int 5607 _bcm_field_entry_create_id(int unit, 5608 bcm_field_group_t group, 5609 bcm_field_entry_t entry); 5610 extern int 5611 _bcm_esw_field_detach(int unit); 5612 extern int 5613 _bcm_esw_field_init(int unit); 5614 extern int 5615 _field_entry_phys_destroy (int unit, _field_entry_t *f_ent); 5616 extern int 5617 _field_group_free_unused_slices(int unit, _field_stage_t *stage_fc, 5618 _field_group_t *fg); 5619 extern int 5620 _field_entry_action_dirty(int unit, _field_entry_t *f_ent, int *dirty); 5621 extern int 5622 _field_entry_dirty(int unit, _field_entry_t *f_ent, int *dirty); 5623 extern int 5624 _field_tcam_policy_reinstall(int unit, bcm_field_entry_t entry); 5625 extern int 5626 _field_entry_remove(int unit, _field_control_t *fc, bcm_field_entry_t entry); 5627 extern int 5628 _field_entry_prio_set(int unit, bcm_field_entry_t entry, int prio); 5629 extern int 5630 _field_entry_qualifiers_init(int unit, _field_entry_t *f_ent); 5631 extern int 5632 _field_qual_offset_get_by_entry_type(int unit, _field_entry_t *f_ent, int qid, 5633 uint8 entry_type, 5634 _bcm_field_qual_offset_t **offset); 5635 extern int 5636 _field_efp_key_match_type_set_on_qual_delete(int unit, bcm_field_entry_t entry); 5637 extern int _field_qualifier_gport_resolve(int unit, bcm_gport_t gport, int mask, 5638 int *out_p, int *out_m, int *out_t); 5639 extern int _field_qualify_Port(int unit, bcm_field_entry_t entry, 5640 bcm_module_t data_modid, bcm_module_t mask_modid, 5641 bcm_port_t data_port, bcm_port_t mask_port, 5642 bcm_field_qualify_t qual); 5643 extern int _field_qualify_L2PayloadFirstEightBytes_get(int unit, 5644 bcm_field_entry_t entry, 5645 bcm_field_qualify_t qual, 5646 uint32 *data1, uint32 *data2, 5647 uint32 *mask1, uint32 *mask2); 5648 extern int _field_qualify_L2PayloadFirstEightBytes(int unit, 5649 bcm_field_entry_t entry, 5650 bcm_field_qualify_t qual, 5651 uint32 data1, uint32 data2, 5652 uint32 mask1, uint32 mask2); 5653 extern int _field_efp_qualify32(int unit, bcm_field_entry_t entry, 5654 int qual, uint32 *data, uint32 *mask); 5655 extern int _field_dest_type_qualify(int unit, bcm_field_entry_t entry, 5656 bcm_field_qualify_t qual, uint32 *data, uint32 *mask, 5657 uint32 flags); 5658 extern int 5659 _field_qualify_VlanTranslationHit(int unit, 5660 bcm_field_entry_t entry, 5661 uint8 *data, 5662 uint8 *mask 5663 ); 5664 extern int 5665 _field_qualify_PacketRes(int unit, 5666 bcm_field_entry_t entry, 5667 uint32 *data, 5668 uint32 *mask 5669 ); 5670 extern int _field_qualify_ip6(int unit, bcm_field_entry_t entry, 5671 bcm_field_qualify_t qual, 5672 bcm_ip6_t data, bcm_ip6_t mask); 5673 extern int _field_qualify_macaddr(int unit, bcm_field_entry_t entry, 5674 bcm_field_qualify_t qual, 5675 bcm_mac_t data, bcm_mac_t mask); 5676 extern int _bcm_field_entry_group_find(int unit, bcm_field_entry_t eid, 5677 _field_group_t **group_p); 5678 extern int _field_qualify_source_virtual_port(int unit, bcm_field_entry_t entry, 5679 int qual, uint32 data, uint32 mask, int ingress_entity); 5680 extern int _field_qualify_VlanFormat(int unit, bcm_field_entry_t entry, 5681 bcm_field_qualify_t qual_id, 5682 uint8 data, uint8 mask); 5683 extern int _field_qualify_VlanFormat_get(int unit, bcm_field_entry_t entry, 5684 bcm_field_qualify_t qual_id, 5685 uint8 *data, uint8 *mask); 5686 extern int _field_qualify_IpProtocolCommon(int unit, bcm_field_entry_t entry, 5687 bcm_field_qualify_t qual_id, 5688 bcm_field_IpProtocolCommon_t protocol); 5689 extern int _field_qualify_IpProtocolCommon_get(int unit, 5690 bcm_field_entry_t entry, 5691 bcm_field_qualify_t qual_id, 5692 bcm_field_IpProtocolCommon_t *protocol); 5693 extern int _field_qualify_IpFrag(int unit, bcm_field_entry_t entry, 5694 bcm_field_qualify_t qual_id, 5695 bcm_field_IpFrag_t frag_info); 5696 extern int _field_params_api_to_hw_adapt(int unit, bcm_field_action_t action, 5697 uint32 *param0, uint32 *param1); 5698 extern int _field_action_add(int unit, _field_control_t *fc, 5699 bcm_field_entry_t entry, _field_action_t *fa); 5700 extern int _bcm_field_action_ports_add(int unit, 5701 bcm_field_entry_t entry, 5702 bcm_field_action_t action, 5703 uint32 param0, uint32 param1, 5704 uint32 param2, uint32 param3, 5705 uint32 param4, uint32 param5); 5706 extern int _field_params_hw_to_api_adapt(int unit, bcm_field_action_t action, 5707 uint32 *param0, uint32 *param1); 5708 extern int 5709 _bcm_esw_field_qualify_aux_tag(int unit, 5710 bcm_field_entry_t entry, 5711 bcm_field_qualify_t qual, 5712 uint32 data, 5713 uint32 mask 5714 ); 5715 extern int _field_stat_create(int unit, bcm_field_group_t group, int nstat, 5716 bcm_field_stat_t *stat_arr, uint32 flags, int *stat_id); 5717 extern int _field_entry_stat_attach(int unit, _field_entry_t *f_ent, 5718 int stat_id); 5719 extern int _field_policer_hw_flags_set(int unit, _field_policer_t *f_pl, uint32 flags); 5720 extern int _field_policer_mode_support(int unit, _field_entry_t *f_ent, 5721 int level, _field_policer_t *f_pl); 5722 extern int _field_entry_policer_detach(int unit, _field_entry_t *f_ent, int level); 5723 extern int _field_policer_destroy2(int unit, _field_control_t *fc, 5724 _field_policer_t *f_pl); 5725 extern int _field_policer_destroy(int unit, bcm_policer_t pid); 5726 5727 extern int _field_data_qualifier_create(int unit, 5728 bcm_field_data_qualifier_t *data_qualifier); 5729 extern void _field_data_qualifier_debug(int unit, 5730 _field_stage_t *stage_fc, 5731 _field_data_qualifier_t *f_dq); 5732 extern int _field_data_qualifier_destroy_all(int unit); 5733 extern int _field_qualify_data (int unit, bcm_field_entry_t eid, int qual_id, 5734 uint8 *data, uint8 *mask, uint16 length); 5735 extern int _field_dest_type_clear(int unit, bcm_field_entry_t entry, 5736 bcm_field_qualify_t qual, uint32 *data, uint32 *mask); 5737 extern int _field_qualify_Port_get(int unit, bcm_field_entry_t entry, 5738 bcm_module_t *data_modid, 5739 bcm_module_t *mask_modid, 5740 bcm_port_t *data_port, 5741 bcm_port_t *mask_port, 5742 bcm_field_qualify_t qual); 5743 extern int _bcm_field_action_ports_get(int unit, 5744 bcm_field_entry_t entry, 5745 bcm_field_action_t action, 5746 uint32 *param0, uint32 *param1, 5747 uint32 *param2, uint32 *param3, 5748 uint32 *param4, uint32 *param5); 5749 extern int _field_policer_create(int unit, bcm_policer_config_t *pol_cfg, 5750 uint32 flags, bcm_policer_t *pid); 5751 extern int _field_qualify_ip6_get(int unit, bcm_field_entry_t entry, 5752 bcm_field_qualify_t qual, 5753 bcm_ip6_t *data, bcm_ip6_t *mask); 5754 extern int _field_qualify_macaddr_get(int unit, bcm_field_entry_t entry, 5755 bcm_field_qualify_t qual, 5756 bcm_mac_t *data, bcm_mac_t *mask); 5757 extern int _field_qualify_IpFrag_get(int unit, bcm_field_entry_t entry, 5758 bcm_field_qualify_t qual_id, 5759 bcm_field_IpFrag_t *frag_info); 5760 extern int _field_qualify_cpu_queue(int unit, bcm_field_entry_t entry, 5761 int qual, uint32 data, uint32 mask); 5762 extern int _field_qualify_cpu_queue_get(int unit, bcm_field_entry_t entry, 5763 int qual, uint8 *data, uint8 *mask); 5764 extern int _field_invalid_actions_remove(int unit, _field_entry_t *f_ent); 5765 extern int _field_entry_prio_set(int unit, bcm_field_entry_t entry, int prio); 5766 extern int _field_qualifier32_input_range_check (int unit, int qual, 5767 bcm_field_entry_t entry, uint8 *data, int size); 5768 extern int 5769 _bcm_esw_field_stat_counter_get(int unit, int sync_mode, uint32 stat_id, 5770 bcm_field_stat_t stat, uint32 num_entries, 5771 uint32 *counter_indexes, 5772 bcm_stat_value_t *counter_values); 5773 extern int 5774 _bcm_esw_field_stat_get(int unit, int sync_mode, int stat_id, 5775 bcm_field_stat_t stat, uint64 *value); 5776 extern int 5777 _bcm_esw_field_stat_get32(int unit, int sync_mode, int stat_id, 5778 bcm_field_stat_t stat, uint32 *value); 5779 extern int 5780 _bcm_field_qualify_InPorts_get(int unit, bcm_field_entry_t entry, 5781 bcm_field_qualify_t qual, 5782 bcm_pbmp_t *data, 5783 bcm_pbmp_t *mask); 5784 extern int 5785 _field_qualify_VlanTranslationHit_get(int unit, 5786 bcm_field_entry_t entry, 5787 uint8 *data, 5788 uint8 *mask); 5789 extern int 5790 _bcm_esw_field_udf_chunks_to_int_qset(int unit, uint32 udf_chunks_bmap, 5791 bcm_field_qset_t *qset); 5792 extern int 5793 _bcm_xgs4_field_qualify_udf_data_elem(int unit, bcm_field_entry_t eid, 5794 bcmi_xgs4_udf_offset_info_t *offset_info, 5795 int data_idx, uint32 data, uint32 mask); 5796 5797 extern int 5798 _bcm_esw_field_group_config_create(int unit, 5799 bcm_field_group_config_t *group_config, 5800 uint32 flags); 5801 extern int 5802 _bcm_esw_field_group_config_destroy(int unit, 5803 bcm_field_group_t group, 5804 uint32 flags); 5805 extern void _field_range_dump(const char *pfx, _field_range_t *fr); 5806 extern void _field_entry_phys_dump(int unit, _field_entry_t *f_ent, 5807 uint8 entry_part); 5808 extern void _field_action_dump(const _field_action_t *fa); 5809 extern void _field_policers_dump(int unit, _field_entry_t *f_ent); 5810 extern int _field_stat_dump(int unit, const _field_entry_t *f_ent); 5811 extern void _field_qual_list_dump(char *prefix, _field_group_t *fg, 5812 uint8 entry_part, char *suffix); 5813 extern void _field_selcode_dump(int unit, char *prefix, _field_sel_t *sel_codes, 5814 char *suffix, _field_stage_id_t stage_id); 5815 extern void _field_slice_dump(int unit, char *prefix, _field_group_t *fg, 5816 _field_slice_t *fs, char *suffix); 5817 extern void _field_group_status_dump(const bcm_field_group_status_t *gstat); 5818 extern int _field_action_delete(int unit, bcm_field_entry_t entry, 5819 bcm_field_action_t action, 5820 uint32 param0, uint32 param1); 5821 extern int _bcm_field_is_entry_stage_valid(int unit, bcm_field_entry_t entry, 5822 _field_stage_id_t stage); 5823 extern int _field_stat_destroy_all(int unit); 5824 extern int _bcm_field_entry_backup(int unit, bcm_field_entry_t entry_id); 5825 extern int _bcm_field_entry_restore(int unit, bcm_field_entry_t entry_id); 5826 extern int _bcm_field_entry_cleanup(int unit, bcm_field_entry_t entry_id); 5827 extern int _field_qualify_PacketRes_get(int unit, bcm_field_entry_t entry, 5828 uint32 *data, uint32 *mask); 5829 extern int 5830 _field_virtual_priority_support(int unit, _field_stage_t *stage_fc, 5831 int *support); 5832 extern int 5833 _field_state_cleanup(int unit, _field_control_t *fc); 5834 #if defined(BCM_TRX_SUPPORT) 5835 extern int 5836 _bcm_field_flex_port_detach(int unit, bcm_port_t port); 5837 extern int 5838 _bcm_field_flex_port_attach(int unit, bcm_port_t port); 5839 extern int 5840 _bcm_field_flex_port_update(int unit, 5841 bcm_pbmp_t detached_pbmp, 5842 bcm_pbmp_t attached_pbmp); 5843 extern int 5844 _bcm_esw_field_group_ports_add( 5845 int unit, 5846 bcm_field_group_t group, 5847 bcm_pbmp_t pbmp); 5848 extern int 5849 _bcm_esw_field_group_ports_remove( 5850 int unit, 5851 bcm_field_group_t group, 5852 bcm_pbmp_t pbmp); 5853 5854 extern int _bcm_field_pfs_entry_clear(int unit, 5855 _field_group_t *fg, 5856 bcm_port_t port); 5857 #endif 5858 extern int _bcm_esw_field_group_config_validate( 5859 int unit, 5860 bcm_field_group_config_t *group_config, 5861 bcm_field_group_mode_t *group_mode); 5862 #if defined (BCM_TRIUMPH2_SUPPORT) 5863 extern int 5864 bcmi_xgs4_field_qset_udf_id_multi_set( 5865 int unit, 5866 int num_objects, 5867 int objects_list[], 5868 bcm_field_qset_t *qset 5869 ); 5870 extern int 5871 bcmi_xgs4_field_qset_udf_id_multi_get( 5872 int unit, 5873 bcm_field_qset_t qset, 5874 int max, 5875 int objects_list[], 5876 int *actual 5877 ); 5878 extern int 5879 bcmi_xgs4_field_qset_udf_id_multi_delete( 5880 int unit, 5881 int num_objects, 5882 int objects_list[], 5883 bcm_field_qset_t *qset 5884 ); 5885 extern int 5886 bcmi_xgs4_field_qualify_udf_data (int unit, bcm_field_entry_t eid, 5887 bcm_udf_id_t udf_id, int length, uint8 *data, uint8 *mask); 5888 extern int 5889 bcmi_xgs4_field_qualify_udf_get(int unit, bcm_field_entry_t eid, 5890 bcm_udf_id_t udf_id, int max_length, 5891 uint8 *data, uint8 *mask, int *actual_length); 5892 #endif 5893 5894 #if defined BCM_TRX_SUPPORT 5895 extern int _bcm_field_action_stat_flag_update (int unit, _field_entry_t *f_ent, 5896 _field_action_t *fa, 5897 uint8 is_action_added); 5898 extern int _bcm_field_action_stat_conflict_check (int unit, _field_entry_t *f_ent, 5899 _field_action_t *fa); 5900 #endif 5901 extern int _bcm_field_stat_destroy(int unit, int sid); 5902 extern int _bcm_field_stat_hw_mode_get(int unit, _field_stat_t *f_st, 5903 _field_stage_id_t stage_id); 5904 extern int _bcm_field_stat_array_to_bmap(int unit, 5905 _field_stat_t *f_st, 5906 uint32 *bmap); 5907 extern int _bcm_field_stages_supported_qset_init(int unit, 5908 _field_control_t *fc); 5909 extern int _bcm_field_policer_get(int unit, bcm_policer_t pid, 5910 _field_policer_t **policer_p); 5911 extern int _bcm_field_group_stat_destroy(int unit, bcm_field_group_t group); 5912 extern int _bcm_field_stat_get(int unit, int sid, _field_stat_t **stat_p); 5913 extern int _bcm_field_stat_id_alloc(int unit, int *sid); 5914 extern int _field_stat_array_init(int unit, _field_control_t *fc, _field_stat_t *f_st, 5915 int nstat, bcm_field_stat_t *stat_arr); 5916 extern int _bcm_field_meter_pair_mode_get(int unit, _field_policer_t *f_pl, 5917 uint32 *mode); 5918 extern int _field_policer_id_alloc(int unit, bcm_policer_t *pid); 5919 extern int _field_meter_pool_free(int unit, _field_stage_t *stage_fc, 5920 int instance, uint8 pool_idx); 5921 extern int _bcm_field_29bit_counter_update(int unit, uint32 *new_val, 5922 _field_counter32_collect_t *result); 5923 5924 #if defined BCM_KATANA2_SUPPORT 5925 extern int _bcm_field_kt2_entry_stat_extended_attach (int unit, 5926 _field_entry_t *f_ent, int stat_id, 5927 bcm_field_stat_action_t stat_action); 5928 extern int _bcm_field_kt2_entry_stat_extended_get (int unit, 5929 _field_entry_t *f_ent, int *stat_id, 5930 bcm_field_stat_action_t *stat_action); 5931 extern int _bcm_field_kt2_entry_stat_detach (int unit, 5932 _field_entry_t *f_ent, int stat_id); 5933 extern int _bcm_field_kt2_extended_stat_hw_free (int unit, _field_entry_t *f_ent); 5934 #endif 5935 #if defined BCM_TRIDENT2PLUS_SUPPORT 5936 extern int _field_td2plus_qualifiers_init(int unit, _field_stage_t *stage_fc); 5937 extern int _bcm_field_oam_stat_action_add (int unit, bcm_field_entry_t entry, 5938 bcm_field_oam_stat_action_t *oam_stat_action); 5939 extern int _bcm_field_oam_stat_action_delete (int unit, bcm_field_entry_t entry, 5940 bcm_field_oam_stat_action_t *oam_stat_action); 5941 extern int _bcm_field_oam_stat_action_delete_all (int unit, 5942 bcm_field_entry_t entry); 5943 extern int _bcm_field_oam_stat_action_get (int unit, bcm_field_entry_t entry, 5944 bcm_field_oam_stat_action_t *oam_stat_action); 5945 extern int _bcm_field_oam_stat_action_get_all(int unit, 5946 bcm_field_entry_t entry, int oam_stat_max, 5947 bcm_field_oam_stat_action_t *oam_stat_action, 5948 int *oam_stat_count); 5949 extern int _bcm_field_oam_stat_action_set (int unit, _field_entry_t *f_ent, 5950 soc_mem_t policy_mem, uint32 *policy_buf); 5951 extern int _bcm_field_oam_stat_invalid_actions_remove (int unit, 5952 _field_entry_t *f_ent); 5953 extern int _field_oam_stat_action_dump (int unit, _field_entry_t *f_ent); 5954 extern int _field_oam_stat_action_display (int unit); 5955 extern int _bcm_field_oam_stat_actions_destroy (int unit, _field_entry_t *f_ent); 5956 extern int _bcm_field_td2plus_entry_stat_extended_attach (int unit, 5957 _field_entry_t *f_ent, int stat_id, 5958 bcm_field_stat_action_t stat_action); 5959 extern int _bcm_field_td2plus_entry_stat_extended_get (int unit, 5960 _field_entry_t *f_ent, int *stat_id, 5961 bcm_field_stat_action_t *stat_action); 5962 extern void _field_td2plus_functions_init (_field_funct_t *functions); 5963 extern int _bcm_field_td2plus_entry_stat_detach (int unit, 5964 _field_entry_t *f_ent, int stat_id); 5965 extern int _bcm_field_td2plus_extended_stat_action_set (int unit, 5966 _field_entry_t *f_ent, soc_mem_t mem, 5967 int tcam_idx, uint32 *buf); 5968 extern int _bcm_field_td2plus_extended_stat_hw_free (int unit, _field_entry_t *f_ent); 5969 extern int _bcm_field_td2plus_stat_hw_alloc (int unit, _field_entry_t *f_ent); 5970 extern int _bcm_field_td2plus_stat_hw_free (int unit, _field_entry_t *f_ent); 5971 extern int _field_oam_lm_stat_pool_id_get (int unit, bcm_stat_object_t stat_object, 5972 uint32 stat_mode_id, int8 *flex_stat_pool_id); 5973 #if defined BCM_WARM_BOOT_SUPPORT 5974 extern int _field_oam_stat_action_count_get (int unit, 5975 uint8 oam_pool_instance, int8 *oam_stat_count); 5976 extern int _field_oam_stat_action_wb_add (int unit, _field_entry_t *f_ent, 5977 _field_oam_action_recover_t *oam_action); 5978 extern int _field_oam_stat_action_scache_sync (int unit, _field_stage_t *stage_fc, 5979 _field_entry_t *f_ent,_field_entry_oam_wb_t *f_ent_oam_wb); 5980 extern int _field_oam_stat_action_scache_recover (int unit, _field_stage_t *stage_fc, 5981 _field_entry_t *f_ent, _field_entry_oam_wb_t *f_ent_oam_wb); 5982 extern int _field_extended_stat_scache_sync (int unit, _field_stage_t *stage_fc, 5983 _field_entry_t *f_ent, _field_entry_oam_wb_t *f_ent_oam_wb); 5984 extern int _field_extended_flex_counter_recover(int unit, _field_entry_t *f_ent, 5985 int part, bcm_field_stat_t sid, 5986 _field_entry_oam_wb_t *f_ent_oam_wb, 5987 bcm_field_stat_action_t action); 5988 #endif /* BCM_WARM_BOOT_SUPPORT */ 5989 #endif /* BCM_TRIDENT2PLUS_SUPPORT */ 5990 #if defined BCM_APACHE_SUPPORT 5991 extern void _field_apache_functions_init (_field_funct_t *functions); 5992 extern int _field_apache_qualifiers_init(int unit, _field_stage_t *stage_fc); 5993 extern int _bcm_field_apache_qualify_OamDropReason(int unit, 5994 bcm_field_entry_t entry, int qual_id, 5995 bcm_field_oam_drop_mep_type_t mep_type); 5996 extern int _bcm_field_apache_qualify_OamDropReason_get(int unit, 5997 bcm_field_entry_t entry, int qual_id, 5998 bcm_field_oam_drop_mep_type_t *mep_type); 5999 extern int _bcm_field_apache_qualify_OamDropReason_delete(int unit, 6000 bcm_field_entry_t entry, int qual_id); 6001 extern int _bcm_field_apache_sat_macsa_add(int unit, bcm_mac_t mac, 6002 uint32 class_id); 6003 extern int _bcm_field_apache_sat_macsa_get(int unit, bcm_mac_t mac, 6004 uint32 *class_id, int *idx); 6005 extern int _bcm_field_apache_sat_macsa_delete(int unit, bcm_mac_t mac); 6006 extern int _bcm_field_apache_sat_macsa_delete_all(int unit); 6007 #if defined BCM_WARM_BOOT_SUPPORT 6008 extern int _field_apache_entry_info_sync(int unit, 6009 _field_control_t *fc, 6010 _field_stage_t *stage_fc, 6011 _field_entry_t *f_ent); 6012 extern int _field_apache_entry_info_recovery(int unit, 6013 _field_control_t *fc, 6014 _field_stage_t *stage_fc, 6015 _field_entry_wb_info_t *f_ent_wb_info); 6016 extern int _field_apache_actions_recovery(int unit, 6017 soc_mem_t policy_mem, 6018 uint32 *policy_entry, 6019 _field_entry_t *f_ent, 6020 _field_entry_wb_info_t *f_ent_wb_info); 6021 6022 #endif /* BCM_WARM_BOOT_SUPPORT */ 6023 #endif /* BCM_APACHE_SUPPORT */ 6024 #if defined(BCM_TRIDENT_SUPPORT) || defined(BCM_TRIUMPH3_SUPPORT) 6025 extern int _bcm_field_30bit_counter_update(int unit, uint32 *new_val, 6026 _field_counter32_collect_t *result); 6027 #endif /* BCM_TRIDENT_SUPPORT || BCM_TRIUMPH3_SUPPORT */ 6028 6029 extern int _bcm_field_32bit_counter_update(int unit, uint32 *new_val, 6030 _field_counter32_collect_t *result); 6031 #if defined(BCM_BRADLEY_SUPPORT) || defined(BCM_TRIUMPH3_SUPPORT) 6032 extern int _bcm_field_36bit_counter_update(int unit, uint32 *new_val, 6033 _field_counter64_collect_t *result); 6034 #endif /* BCM_BRADLEY_SUPPORT||BCM_TRIUMPH3_SUPPORT*/ 6035 #ifdef BCM_TRIDENT_SUPPORT 6036 extern int _bcm_field_37bit_counter_update(int unit, uint32 *new_val, 6037 _field_counter64_collect_t *result); 6038 #endif 6039 #if defined(BCM_TOMAHAWK_SUPPORT) 6040 extern int _bcm_field_26bit_counter_update(int unit, uint32 *new_val, 6041 _field_counter32_collect_t *result); 6042 extern int _bcm_field_34bit_counter_update(int unit, uint32 *new_val, 6043 _field_counter64_collect_t *result); 6044 #if defined (BCM_WARM_BOOT_SUPPORT) 6045 extern int _bcm_field_th_stage_ingress_reinit(int unit, 6046 _field_control_t *fc, 6047 _field_stage_t *stage_fc); 6048 extern int _bcm_field_th_stage_lookup_reinit(int unit, 6049 _field_control_t *fc, 6050 _field_stage_t *stage_fc); 6051 extern int _bcm_field_th_stage_egress_reinit(int unit, 6052 _field_control_t *fc, 6053 _field_stage_t *stage_fc); 6054 extern int _bcm_field_th_stage_ingress_sync(int unit, 6055 _field_stage_t *stage_fc); 6056 extern int _bcm_field_th_stage_class_sync(int unit, _field_control_t *fc, 6057 _field_stage_t *stage_fc); 6058 extern int _bcm_field_th_stage_class_reinit(int unit, _field_control_t *fc, 6059 _field_stage_t *stage_fc); 6060 extern int _bcm_field_th_stage_em_sync(int unit, _field_control_t *fc, 6061 _field_stage_t *stage_fc); 6062 extern int _bcm_field_th_stage_em_reinit(int unit, _field_control_t *fc, 6063 _field_stage_t *stage_fc); 6064 extern int _bcm_field_scache_th_pointer_init(int unit, _field_control_t *fc); 6065 extern int _bcm_field_scache_th_pointer_realloc(int unit, 6066 _field_control_t *fc); 6067 extern void _bcm_field_th_tlv_recovery_map_free(int unit); 6068 extern int _bcm_field_action_val_get(int unit, 6069 _field_entry_t *f_ent, 6070 uint32 *entbuf, 6071 _bcm_field_internal_action_t action, 6072 uint32 flags, 6073 _bcm_field_action_offset_t *a_offset); 6074 #endif 6075 #endif 6076 extern int _bcm_field_entry_counter_move(int unit, _field_stage_t *stage_fc, 6077 uint8 old_slice, int old_hw_index, 6078 _field_stat_t *f_st_old, 6079 _field_stat_t *f_st); 6080 extern int _bcm_field_qset_test(bcm_field_qualify_t qid, 6081 bcm_field_qset_t *qset, uint8 *result); 6082 extern int _bcm_field_entry_get_by_id(int unit, bcm_field_entry_t eid, 6083 _field_entry_t **f_ent); 6084 extern int _field_qual_tcam_key_mask_get(int unit, _field_entry_t *f_ent, 6085 _field_tcam_t *tcam, int ipbm_overlay); 6086 extern int _bcm_field_qual_tcam_key_mask_get(int unit, _field_entry_t *f_ent); 6087 extern int _bcm_field_qual_list_append(_field_group_t *fg, uint8 entry_part, 6088 _qual_info_t *fq_src, int offset); 6089 extern int _bcm_field_qual_value_set(int unit, _bcm_field_qual_offset_t *q_offset, 6090 _field_entry_t *f_ent, 6091 uint32 *p_data, uint32 *p_mask); 6092 extern int _bcm_field_qual_value_set_by_entry_type(int unit, 6093 _bcm_field_qual_offset_t *q_offset, 6094 _field_entry_t *f_ent, 6095 uint32 *p_data, 6096 uint32 *p_mask, 6097 uint8 idx); 6098 extern int _bcm_field_qual_value_get(int unit, 6099 _bcm_field_qual_offset_t *q_offset, 6100 _field_entry_t *f_ent, _bcm_field_qual_data_t p_data, 6101 _bcm_field_qual_data_t p_mask); 6102 extern int _bcm_field_qual_partial_data_get(uint32 *in_data, uint8 start_pos, 6103 uint16 len, uint32 *out_data); 6104 extern int _bcm_field_qual_partial_data_set(uint32 *in_data, uint8 start_pos, 6105 uint16 len, uint32 *out_data); 6106 extern int _bcm_field_stages_supported_qset_init(int unit, _field_control_t *fc); 6107 extern int _bcm_field_group_qualifiers_free(_field_group_t *fg, int idx); 6108 extern int _bcm_field_group_default_entry_set(int unit, bcm_field_group_t group, 6109 bcm_field_entry_t entry, int enable); 6110 extern int _bcm_field_group_default_entry_get(int unit, bcm_field_group_t group, 6111 bcm_field_entry_t *entry); 6112 extern int _bcm_field_qual_insert (int unit, _field_stage_t *stage_fc, 6113 int qual_type, int qual_id, 6114 _bcm_field_qual_conf_t *ptr); 6115 extern int _bcm_field_tcam_part_to_slice_number(int unit, int entry_part, 6116 _field_group_t *fg, 6117 uint8 *slice_number); 6118 extern int _bcm_field_group_status_init(int unit, 6119 bcm_field_group_status_t *entry); 6120 extern int _bcm_field_group_status_calc(int unit, _field_group_t *fg); 6121 extern int _bcm_field_stage_entries_free(int unit, 6122 _field_stage_t *stage_fc); 6123 extern int _bcm_field_selcode_get(int unit, _field_stage_t *stage_fc, 6124 bcm_field_qset_t *qset_req, 6125 _field_group_t *fg); 6126 6127 extern int _field_selcode_assign(int unit, bcm_field_qset_t qset, 6128 int selcode_clear,_field_group_t *fg); 6129 extern int 6130 _field_entry_qualifier_key_get(int unit, 6131 bcm_field_entry_t entry, 6132 int qual_id, 6133 _bcm_field_qual_data_t q_data, 6134 _bcm_field_qual_data_t q_mask); 6135 6136 extern void _bcm_field_qual_conf_t_init(_bcm_field_qual_conf_t *ptr); 6137 extern void _bcm_field_qual_info_t_init(_bcm_field_qual_info_t *ptr); 6138 extern int _bcm_field_selcode_to_qset(int unit, _field_stage_t *stage_fc, 6139 _field_group_t *fg, int code_id, 6140 bcm_field_qset_t *qset); 6141 extern int _bcm_field_qual_lists_get(int unit, _field_stage_t *stage_fc, 6142 _field_group_t *fg); 6143 extern int _bcm_field_entry_part_tcam_idx_get(int unit, _field_entry_t *f_ent, 6144 uint32 idx_pri, uint8 ent_part, 6145 int *idx_out); 6146 extern int _bcm_field_data_qualifier_get(int unit, _field_stage_t *stage_fc, 6147 int qid, 6148 _field_data_qualifier_t **data_qual); 6149 extern int _bcm_field_data_qualifier_alloc(int unit, 6150 _field_data_qualifier_t **qual); 6151 extern int _bcm_field_data_qualifier_free(int unit, 6152 _field_data_qualifier_t *qual); 6153 extern int _bcm_field_entry_qualifier_uint32_get(int unit, 6154 bcm_field_entry_t entry, 6155 int qual_id, uint32 *data, 6156 uint32 *mask); 6157 extern int _bcm_field_entry_qualifier_uint64_get(int unit, 6158 bcm_field_entry_t entry, 6159 int qual_id, uint64 *data, 6160 uint64 *mask); 6161 extern int _bcm_field_entry_qualifier_uint16_get(int unit, 6162 bcm_field_entry_t entry, 6163 int qual_id, uint16 *data, 6164 uint16 *mask); 6165 extern int _bcm_field_entry_qualifier_uint8_get(int unit, 6166 bcm_field_entry_t entry, 6167 int qual_id, uint8 *data, 6168 uint8 *mask); 6169 extern int _bcm_field_qual_tcam_key_mask_free(int unit, _field_entry_t *f_ent); 6170 extern int _bcm_field_action_dest_check(int unit, _field_action_t *fa); 6171 extern int _bcm_field_policy_set_l3_nh_resolve(int unit, int value, 6172 uint32 *flags, int *nh_ecmp_id); 6173 extern int _bcm_field_virtual_map_size_get(int unit, _field_stage_t *stage_fc, 6174 int *size); 6175 extern int _bcm_field_entry_tcam_idx_get(int unit,_field_entry_t *f_ent, 6176 int *tcam_idx); 6177 extern int _bcm_field_tcam_idx_to_slice_offset(int unit, 6178 _field_stage_t *stage_fc, 6179 int instance, int tcam_idx, 6180 int *slice, int *offset); 6181 extern int _bcm_field_slice_offset_to_tcam_idx(int unit, 6182 _field_stage_t *stage_fc, 6183 int instance, int slice, 6184 int offset, int *tcam_idx); 6185 extern int _field_action_alloc(int unit, bcm_field_action_t action, 6186 uint32 param0, uint32 param1, 6187 uint32 param2, uint32 param3, 6188 uint32 param4, uint32 param5, 6189 _field_action_t **fa); 6190 6191 extern void _bcm_field_action_conf_t_init(_bcm_field_action_conf_t *ptr); 6192 extern int _bcm_field_action_insert(int unit, _field_stage_t *stage_fc, 6193 int action, _bcm_field_action_offset_t *ptr); 6194 6195 extern int _bcm_field_th_action_set(int unit, soc_mem_t mem, 6196 _field_entry_t *f_ent, int tcam_idx, 6197 _field_action_t *fa, uint32 *entbuf); 6198 extern int _field_th_ingress_actions_init(int unit, _field_stage_t *stage_fc); 6199 6200 extern int 6201 _field_qualify_VlanFormat_get(int unit, 6202 bcm_field_entry_t entry, 6203 bcm_field_qualify_t qual_id, 6204 uint8 *data, 6205 uint8 *mask 6206 ); 6207 extern int 6208 _field_data_qualifier_get(int unit, int qual_id, 6209 _field_data_qualifier_t *data_qual); 6210 extern int 6211 _field_data_qualifier_id_alloc(int unit, _field_stage_t *stage_fc, 6212 bcm_field_data_qualifier_t *data_qualifier); 6213 extern int 6214 _field_data_qualifier_init(int unit, 6215 _field_stage_t *stage_fc, 6216 _field_data_qualifier_t *f_dq, 6217 bcm_field_data_qualifier_t *data_qualifier 6218 ); 6219 extern int 6220 _field_data_qualifier_init2(int unit, 6221 _field_stage_t *stage_fc, 6222 _field_data_qualifier_t *f_dq 6223 ); 6224 extern int 6225 _field_data_qual_recover(int unit, 6226 _field_control_t *fc, 6227 _field_stage_t *stage_fc 6228 ); 6229 extern void 6230 _field_qset_udf_bmap_reinit(int unit, 6231 _field_stage_t *stage_fc, 6232 bcm_field_qset_t *qset, 6233 int qual_id 6234 ); 6235 extern int 6236 _field_trx2_udf_tcam_entry_l3_parse(int unit, uint32 *hw_buf, 6237 bcm_field_data_packet_format_t *pkt_fmt); 6238 6239 extern int 6240 _field_trx2_udf_tcam_entry_flags_parse(int unit, uint32 *hw_buf, 6241 uint32 *flags); 6242 6243 extern int 6244 _field_trx2_udf_tcam_entry_misc_parse(int unit, uint32 *hw_buf, 6245 bcm_field_data_packet_format_t *pkt_fmt); 6246 extern int 6247 _field_trx2_udf_tcam_entry_vlanformat_parse(int unit, uint32 *hw_buf, 6248 uint16 *vlanformat); 6249 extern int 6250 _field_trx2_udf_tcam_entry_l2format_parse(int unit, uint32 *hw_buf, 6251 uint16 *l2format); 6252 6253 extern void 6254 _field_scache_sync_data_quals_write(_field_control_t *fc, _field_data_control_t *data_ctrl); 6255 6256 extern int 6257 _field_counter_mem_get(int unit, _field_stage_t *stage_fc, 6258 soc_mem_t *counter_x_mem, soc_mem_t *counter_y_mem); 6259 6260 extern int 6261 _bcm_field_counter32_collect_alloc(int unit, soc_mem_t mem, char *descr, 6262 _field_counter32_collect_t **ptr); 6263 extern int 6264 _bcm_field_counter_collect_deinit(int unit, _field_stage_t *stage_fc); 6265 6266 extern int _bcm_field_policer_mode_support(int unit, 6267 _field_entry_t *f_ent, 6268 int level, 6269 _field_policer_t *f_pl 6270 ); 6271 extern int _field_stat_value_set(int unit, 6272 _field_stat_t *f_st, 6273 bcm_field_stat_t stat, 6274 uint64 value); 6275 6276 extern int _field_stat_value_get(int unit, 6277 int sync_mode, 6278 _field_stat_t *f_st, 6279 bcm_field_stat_t stat, 6280 uint64 *value); 6281 extern int _field_flex_counter_free(int unit, _field_entry_t *f_ent, 6282 _field_stat_t *f_st); 6283 extern int _field_group_default_aset_set(int unit, 6284 _field_group_t *fg); 6285 extern int _bcm_field_trx_egress_mode_get(int unit, _field_group_t *fg, 6286 uint8 *slice_mode); 6287 extern int _field_group_slice_vmap_recovery(int unit, 6288 _field_control_t *fc, 6289 _field_stage_t *stage_fc); 6290 6291 extern int _field_slice_map_write(int unit, 6292 _field_control_t *fc, 6293 _field_stage_t *stage_fc); 6294 6295 extern int _bcm_field_is_stage_range_check_exist (int unit, 6296 _field_stage_id_t stage); 6297 6298 #if defined(BCM_FIREBOLT2_SUPPORT) || defined(BCM_TRX_SUPPORT) 6299 extern int _bcm_field_egress_key_attempt(int unit, _field_stage_t *stage_fc, 6300 bcm_field_qset_t *qset_req, 6301 uint8 key_pri, uint8 key_sec, 6302 _field_group_t *fg); 6303 #endif /* BCM_FIREBOLT2_SUPPORT || BCM_TRX_SUPPORT */ 6304 #if defined(BCM_TRX_SUPPORT) 6305 extern int _bcm_field_35bit_counter_update(int unit, uint32 *new_val, 6306 _field_counter64_collect_t *result); 6307 extern int _field_trx_action_copy_to_cpu(int unit, soc_mem_t mem, 6308 _field_entry_t *f_ent, 6309 _field_action_t *fa, uint32 *buf); 6310 extern int 6311 _bcm_field_counter64_collect_alloc(int unit, soc_mem_t mem, char *descr, 6312 _field_counter64_collect_t **ptr); 6313 6314 #endif /* BCM_TRX_SUPPORT */ 6315 6316 extern int _bcm_esw_field_qset_udf_offsets_alloc(int unit, 6317 _field_stage_id_t stage, bcm_field_qset_t qset, 6318 int req_offsets, int offset_array[], int *max_chunks, 6319 int pipe_num); 6320 6321 extern int _bcm_esw_field_qual_udf_offsets_get(int unit, int qid, _field_group_t *fg, 6322 int chunk_order[], int *num_chunks, 6323 int pipe_num); 6324 6325 #if defined BCM_TRIDENT2_SUPPORT 6326 extern int _field_td2_group_install(int unit, _field_group_t *fg); 6327 extern int _field_td2_selcodes_install(int unit, _field_group_t *fg, 6328 uint8 slice_num, bcm_pbmp_t pbmp, int selcode_idx); 6329 extern int _field_td2_slice_clear(int unit, _field_group_t *fg, 6330 _field_slice_t *fs); 6331 extern int _field_td2_entry_move(int unit, _field_entry_t *f_ent, 6332 int parts_count, int *tcam_idx_old, int *tcam_idx_new); 6333 extern int _field_td2_action_support_check(int unit, _field_entry_t *f_ent, 6334 bcm_field_action_t action, int *result); 6335 extern int _bcm_field_td2_action_conflict_check (int unit, _field_entry_t *f_ent, 6336 bcm_field_action_t action1, bcm_field_action_t action); 6337 extern int _field_td2_action_params_check (int unit, _field_entry_t *f_ent, 6338 _field_action_t *fa); 6339 extern int _field_td2_selcode_get(int unit, _field_stage_t *stage_fc, 6340 bcm_field_qset_t *qset_req, 6341 _field_group_t *fg); 6342 6343 extern int _bcm_field_td2_hash_select_profile_alloc_reserve_entry(int unit, 6344 _field_stage_t *stage_fc); 6345 #endif 6346 6347 #ifdef BCM_WARM_BOOT_SUPPORT 6348 #define _FIELD_IFP_DATA_START 0xDEADBEE0 6349 #define _FIELD_IFP_DATA_END 0XDEADBEEF 6350 #define _FIELD_EFP_DATA_START 0xDEADBEE1 6351 #define _FIELD_EFP_DATA_END 0XDEADBEEE 6352 #define _FIELD_VFP_DATA_START 0xDEADBEE2 6353 #define _FIELD_VFP_DATA_END 0XDEADBEED 6354 #define _FIELD_EXTFP_DATA_START 0xDEADBEE3 6355 #define _FIELD_EXTFP_DATA_END 0XDEADBEEC 6356 #define _FIELD_CLASS_DATA_START 0xDEADBEE4 6357 #define _FIELD_CLASS_DATA_END 0xDEADBEED 6358 #define _FIELD_EM_DATA_START 0xDEADBEE5 6359 #define _FIELD_EM_DATA_END 0xDEADBEEA 6360 #define _FIELD_FT_DATA_START 0xDEADBEE6 6361 #define _FIELD_FT_DATA_END 0xDEADBEE9 6362 #define _FIELD_SCACHE_PART_0 0x0 6363 #define _FIELD_SCACHE_PART_1 0x1 6364 6365 #define _FIELD_GROUP_NEXT_GROUP_VALID (0x1 << 0) /* Next group is valid 6366 * in scache 6367 */ 6368 #define _FIELD_GROUP_LOOKUP_ENABLED (0x1 << 5) /* Indicated group 6369 * is lookup enabled 6370 * in scache 6371 */ 6372 #define _FIELD_GROUP_WLAN (0x1 << 6) /* Indicated group 6373 * is WLAN Group 6374 * in scache 6375 */ 6376 #define _FIELD_GROUP_AUTO_EXPANSION (0x1 << 7) /* Indicates group can be 6377 * expanded to multiple slices 6378 */ 6379 6380 #define _FIELD_QSET_ITER(qset, q) \ 6381 for ((q) = 0; (q) < (int)bcmFieldQualifyCount; (q)++) \ 6382 if (BCM_FIELD_QSET_TEST((qset), (q))) 6383 #define _FIELD_QSET_INCL_INTERNAL_ITER(qset, q) \ 6384 for ((q) = 0; (q) < (int)_bcmFieldQualifyCount; (q)++) \ 6385 if (BCM_FIELD_QSET_TEST((qset), (q))) 6386 6387 #define _FIELD_WB_ENTRY_ACTION_OAM_STATOBJECT_SESSION_ID (0x1 << 0) /* Indicates OamStatObjectSessionId */ 6388 #define _FIELD_WB_ENTRY_ACTION_COPYTOCPU (0x1 << 1) /* Indicates ActionCopyToCpu */ 6389 #define _FIELD_WB_ENTRY_ACTION_REDIRECT (0x1 << 2) /* Indicates ActionRedirect */ 6390 #define _FIELD_WB_ENTRY_ACTION_REDIRECT_TRUNK (0x1 << 3) /* Indicates ActionRedirect 6391 as trunkid instead of gport */ 6392 #define _FIELD_WB_ENTRY_ACTION_REDIRECT_SOURCE_GPORT (0x1 << 4) /* Indicates ActionRedirect 6393 source gport type present */ 6394 6395 extern int _field_table_read(int unit, soc_mem_t mem, char **buffer_p, 6396 const char *buffer_name_p); 6397 extern void _bcm_field_last_alloc_eid_incr(int unit); 6398 extern int _bcm_field_last_alloc_eid_get(int unit); 6399 extern int _field_slice_expanded_status_get(int unit, _field_control_t *fc, _field_stage_t *stage_fc, 6400 int *expanded, int *slice_master_idx); 6401 extern int _mask_is_set(int unit, _bcm_field_qual_offset_t *offset, uint32 *buf, 6402 _field_stage_id_t stage_id); 6403 extern int _field_physical_to_virtual(int unit, int instance, int slice_idx, 6404 _field_stage_t *stage_fc); 6405 extern int _bcm_esw_field_scache_sync(int unit); 6406 extern int _bcm_esw_field_tr2_ext_scache_size(int unit, 6407 unsigned part_idx 6408 ); 6409 extern int _field_trx_redirect_profile_get(int unit, soc_profile_mem_t 6410 **redirect_profile); 6411 extern unsigned _field_trx_ext_scache_size(int unit, 6412 unsigned part_idx, 6413 soc_mem_t *mems 6414 ); 6415 extern int _field_group_info_retrieve(int unit, 6416 bcm_port_t port, 6417 int instance, 6418 bcm_field_group_t *gid, 6419 int *priority, 6420 int *action_res_id, 6421 bcm_pbmp_t *group_pbmp, 6422 int8 *efp_key_info, 6423 int *group_flags, 6424 bcm_field_qset_t *qset, 6425 _field_control_t *fc 6426 ); 6427 extern int _field_scache_slice_group_recover(int unit, _field_control_t *fc, 6428 int slice_num, int *multigroup); 6429 extern int _field_entry_info_retrieve(int unit, _field_control_t *fc, _field_stage_t *stage_fc, 6430 int multigroup, int *prev_prio, _field_entry_wb_info_t *f_ent_wb_info); 6431 extern void _field_scache_slice_group_free(int unit, _field_control_t *fc, 6432 int slice_num); 6433 extern void _field_scache_stage_hdr_save(_field_control_t *fc, 6434 uint32 header 6435 ); 6436 extern int _field_scache_stage_hdr_chk(_field_control_t *fc, 6437 uint32 header 6438 ); 6439 extern int _field_range_check_reinit(int unit, _field_stage_t *stage_fc, 6440 _field_control_t *fc); 6441 6442 extern int _field_table_pointers_init(int unit, 6443 _field_table_pointers_t *field_tables); 6444 6445 #ifdef BCM_FIREBOLT_SUPPORT 6446 extern int 6447 _field_fb_meter_recover(int unit, 6448 _field_entry_t *f_ent, 6449 _meter_config_t *meter_conf, 6450 int part, 6451 bcm_policer_t pid 6452 ); 6453 extern int _field_fb_stage_reinit(int unit, _field_control_t *fc, 6454 _field_stage_t *stage_fc); 6455 extern int _field_scache_sync(int unit, _field_control_t *fc, 6456 _field_stage_t *stage_fc); 6457 extern int _field_fb_slice_is_primary(int unit, int slice_index, 6458 int *is_primary_p, int *slice_mode_p); 6459 #endif /* BCM_FIREBOLT_SUPPORT */ 6460 6461 #if defined(BCM_FIREBOLT2_SUPPORT) 6462 extern int _field_fb2_stage_ingress_reinit(int unit, _field_control_t *fc, 6463 _field_stage_t *stage_fc); 6464 extern int _field_fb2_stage_egress_reinit(int unit, _field_control_t *fc, 6465 _field_stage_t *stage_fc); 6466 extern int _field_fb2_stage_lookup_reinit(int unit, _field_control_t *fc, 6467 _field_stage_t *stage_fc); 6468 #endif 6469 #if defined(BCM_RAVEN_SUPPORT) 6470 extern int _field_raven_stage_reinit(int unit, _field_control_t *fc, 6471 _field_stage_t *stage_fc); 6472 #endif 6473 6474 6475 #if defined(BCM_TRX_SUPPORT) 6476 extern int _field_tr2_stage_ingress_reinit(int unit, _field_control_t *fc, 6477 _field_stage_t *stage_fc); 6478 extern int _field_tr2_stage_egress_reinit(int unit, _field_control_t *fc, 6479 _field_stage_t *stage_fc); 6480 extern int _field_tr2_stage_lookup_reinit(int unit, _field_control_t *fc, 6481 _field_stage_t *stage_fc); 6482 extern int _field_tr2_stage_external_reinit(int unit, _field_control_t *fc, 6483 _field_stage_t *stage_fc); 6484 extern int _field_tr2_scache_sync(int unit, _field_control_t *fc, 6485 _field_stage_t *stage_fc); 6486 extern int _field_tr2_ifp_slice_expanded_status_get(int unit, _field_control_t *fc, 6487 _field_stage_t *stage_fc, 6488 int *expanded, int *slice_master_idx); 6489 extern int _bcm_field_trx_egress_secondary_selcodes_set(int unit, 6490 _field_group_t *fg, 6491 int slice_idx, 6492 uint8 part_idx); 6493 extern int _field_trx_scache_slice_group_recover(int unit, 6494 _field_control_t *fc, 6495 int instance, 6496 int slice_num, 6497 int *multigroup, 6498 _field_stage_t *stage_fc, 6499 int recovered_count); 6500 extern int _field_tr2_slice_key_control_entry_recover(int unit, 6501 unsigned slice_num, 6502 _field_sel_t *sel); 6503 extern int _field_tr2_group_construct_alloc(int unit, _field_group_t **pfg); 6504 extern void _field_tr2_ingress_entity_get(int unit, 6505 int slice_idx, 6506 uint32 *fp_tcam_buf, 6507 int slice_ent_cnt, 6508 _field_stage_t *stage_fc, 6509 int8 *ingress_entity_sel); 6510 extern int _field_tr2_group_construct(int unit, int inst, 6511 _field_hw_qual_info_t *hw_sel, 6512 int intraslice, 6513 int paired, 6514 _field_control_t *fc, 6515 bcm_port_t port, 6516 _field_stage_id_t stage_id, 6517 int slice_idx); 6518 extern int _field_tr2_group_construct_quals_with_sel_update(int unit, 6519 _field_control_t *fc, 6520 _field_stage_t *stage_fc); 6521 extern int _field_trx_entry_info_retrieve(int unit, 6522 _field_control_t *fc, 6523 _field_stage_t *stage_fc, 6524 int multigroup, 6525 int *prev_prio, 6526 _field_entry_wb_info_t *f_ent_wb_info); 6527 extern int _field_tr2_actions_recover(int unit, 6528 soc_mem_t policy_mem, 6529 uint32 *policy_entry, 6530 _field_entry_t *f_ent, 6531 int part, 6532 _field_entry_wb_info_t *f_ent_wb_info); 6533 extern int 6534 _field_trx_group_construct_quals_add(int unit, 6535 _field_control_t *fc, 6536 _field_group_t *fg, 6537 uint8 fg_entry_type, 6538 bcm_field_qset_t *new_qset, 6539 int8 pri_key1, 6540 int8 pri_key2); 6541 extern int 6542 _field_trx_actions_recover_action_add(int unit, 6543 _field_entry_t *f_ent, 6544 bcm_field_action_t action, 6545 uint32 param0, uint32 param1, 6546 uint32 param2, uint32 param3, 6547 uint32 param4, uint32 param5, 6548 uint32 hw_index); 6549 extern int _field_tr2_stage_reinit_all_groups_cleanup(int unit, 6550 _field_control_t *fc, 6551 unsigned stage_id, 6552 _field_table_pointers_t *fp_table_pointers); 6553 extern int _field_tr2_group_entry_write(int unit, int instance, int slice_idx, 6554 _field_slice_t *fs, 6555 _field_control_t *fc, 6556 _field_stage_t *stage_fc); 6557 6558 extern int _bcm_field_trx_meter_rate_burst_recover(uint32 unit, 6559 uint32 meter_table, 6560 uint32 mem_idx, 6561 uint32 *prate, 6562 uint32 *pburst, 6563 uint32 *cfg_flags 6564 ); 6565 extern int _field_trx_meter_recover_configured_rates(int unit, _field_entry_t *f_ent, 6566 uint32 level, _field_entry_wb_info_t *f_ent_wb_info); 6567 extern int _field_adv_flex_stat_info_retrieve(int unit, int stat_id); 6568 extern int _field_flex_counter_recover(int unit, _field_entry_t *f_ent, 6569 int part, int sid); 6570 extern int _field_entry_oam_wb_free (int unit, _field_entry_oam_wb_t **f_ent_oam_wb); 6571 #endif 6572 #if defined(BCM_FIREBOLT2_SUPPORT) || defined(BCM_TRX_SUPPORT) 6573 extern void _field_extract(uint32 *buf, int offset, int width, uint32 *value); 6574 #endif 6575 6576 #if defined(BCM_TRIUMPH3_SUPPORT) 6577 extern int _bcm_field_tr3_stage_lookup_reinit(int unit, 6578 _field_control_t *fc, 6579 _field_stage_t *stage_fc); 6580 extern int _bcm_field_tr3_stage_ingress_reinit(int unit, 6581 _field_control_t *fc, 6582 _field_stage_t *stage_fc); 6583 extern int _bcm_field_tr3_stage_egress_reinit(int unit, 6584 _field_control_t *fc, 6585 _field_stage_t *stage_fc); 6586 extern int _bcm_field_tr3_stage_external_reinit(int unit, 6587 _field_control_t *fc, 6588 _field_stage_t *stage_fc); 6589 extern int _bcm_field_tr3_counter_recover(int unit, 6590 _field_entry_t *f_ent, 6591 uint32 *policy_entry, 6592 int part, 6593 bcm_field_stat_t sid); 6594 extern int _bcm_field_tr3_scache_sync(int unit, 6595 _field_control_t *fc, 6596 _field_stage_t *stage_fc); 6597 extern int _bcm_field_tr3_meter_recover(int unit, 6598 _field_entry_t *f_ent, 6599 int part, 6600 bcm_policer_t pid, 6601 uint32 level, 6602 soc_mem_t policy_mem, 6603 uint32 *policy_buf, 6604 uint8 *already_recovered 6605 ); 6606 6607 extern int _field_tr3_actions_recover_replaceL2Fields(int unit, 6608 int index, 6609 _field_entry_t *f_ent 6610 ); 6611 #endif 6612 6613 #if defined(BCM_TRIDENT2_SUPPORT) 6614 extern int _bcm_field_td2_scache_sync(int unit, 6615 _field_control_t *fc, 6616 _field_stage_t *stage_fc); 6617 extern int _bcm_field_td2_stage_lookup_reinit(int unit, 6618 _field_control_t *fc, 6619 _field_stage_t *stage_fc); 6620 #endif /* BCM_TRIDENT2_SUPPORT */ 6621 6622 #if defined(BCM_KATANA2_SUPPORT) 6623 extern int _field_kt2_stage_lookup_reinit(int unit, _field_control_t *fc, 6624 _field_stage_t *stage_fc); 6625 #endif /* BCM_KATANA2_SUPPORT */ 6626 6627 extern int _field_entry_no_param_actions_scache_sync(int unit, 6628 _field_stage_t *stage_fc, 6629 _field_control_t *fc, 6630 _field_entry_t *f_ent, 6631 uint8 *scache_buf); 6632 6633 #if defined(BCM_HELIX5_SUPPORT) 6634 extern int 6635 _bcm_field_stage_ft_sync(int unit, 6636 _field_control_t *fc, 6637 _field_stage_t *stage_fc); 6638 6639 extern int 6640 _bcm_field_stage_ft_reinit(int unit, 6641 _field_control_t *fc, 6642 _field_stage_t *stage_fc); 6643 #endif /* BCM_HELIX5_SUPPORT */ 6644 6645 #endif /* BCM_WARM_BOOT_SUPPORT */ 6646 6647 #if defined(BCM_TRIUMPH3_SUPPORT) 6648 extern int _bcm__field_tr3_action_replaceL2Fields(int unit, 6649 _field_action_t *fa); 6650 extern int _bcm__field_tr3_action_replaceL2Fields_remove_HWEntries( int unit, 6651 _field_entry_t *f_ent, 6652 _field_action_t *fa); 6653 #endif 6654 6655 #ifdef BCM_FIREBOLT_SUPPORT 6656 extern int _bcm_field_fb_slice_enable_set(int unit, 6657 _field_group_t *fg, 6658 uint8 slice, 6659 int enable 6660 ); 6661 #endif 6662 6663 #if defined(INCLUDE_L3) 6664 extern 6665 int _bcm_field_l3_egr_object_ifp_type_index_get(int unit, bcm_if_t nh_index, 6666 int *ifp_type, uint32 *nh_flags, 6667 int *nh_ecmp_id); 6668 extern int 6669 _field_trx_policy_set_l3_info(int unit, soc_mem_t mem, int value, uint32 *buf); 6670 #endif /* INCLUDE_L3 */ 6671 6672 extern int 6673 _bcm_field_initialized_status_get(int unit, uint8 *status); 6674 6675 #ifdef BCM_WARM_BOOT_SUPPORT 6676 extern int _bcm_field_cleanup(int unit); 6677 #else 6678 #define _bcm_field_cleanup(u) (BCM_E_NONE) 6679 #endif /* BCM_WARM_BOOT_SUPPORT */ 6680 6681 extern uint8 wb_write_disable; 6682 6683 extern void _field_qset_debug(bcm_field_qset_t qset); 6684 extern void _field_qset_dump(char *prefix, bcm_field_qset_t qset, char* suffix); 6685 #if defined(BCM_TOMAHAWK_SUPPORT) 6686 extern void _field_aset_dump(char *prefix, _bcm_field_aset_t aset, char* suffix); 6687 #else 6688 extern void _field_aset_dump(char *prefix, bcm_field_aset_t aset, char* suffix); 6689 #endif /* BCM_TOMAHAWK_SUPPORT */ 6690 extern int _field_group_dump_brief(int unit, bcm_field_group_t group); 6691 extern int _field_dump_brief(int unit, const char *pfx); 6692 extern int _field_dump_class(int unit, const char *pfx, int flag); 6693 extern int _bcm_field_presel_dump(int unit, bcm_field_presel_t presel_id, int stage); 6694 #if defined(BCM_TOMAHAWK_SUPPORT) 6695 extern int 6696 _bcm_field_presel_qualifiers_dump(int unit, bcm_field_presel_t presel_id); 6697 #endif /* BCM_TOMAHAWK_SUPPORT */ 6698 extern int _field_calc_cache_size(int unit); 6699 extern char *_field_qual_name(bcm_field_qualify_t qid); 6700 6701 extern int _field_is_inited(int unit); 6702 extern int _bcm_field_stage_qualifiers_free(int unit, _field_stage_t *stage_fc); 6703 6704 /* User-Defined Field (UDF) L2 Flags. (0 to 2 bits) */ 6705 #define _BCM_FIELD_USER_L2_MASK 0x00000003 6706 #define _BCM_FIELD_USER_L2_ETHERNET2 (0 << 0) 6707 #define _BCM_FIELD_USER_L2_SNAP (1 << 0) 6708 #define _BCM_FIELD_USER_L2_LLC (2 << 0) 6709 #define _BCM_FIELD_USER_L2_OTHER (3 << 0) 6710 6711 /* User-Defined Field (UDF) VLAN Flags. (3 to 4 bits) */ 6712 #define _BCM_FIELD_USER_VLAN_MASK 0x00000018 6713 #define _BCM_FIELD_USER_VLAN_NOTAG (0 << 3) 6714 #define _BCM_FIELD_USER_VLAN_ONETAG (1 << 3) 6715 #define _BCM_FIELD_USER_VLAN_TWOTAG (2 << 3) 6716 #define _BCM_FIELD_USER_VLAN_NOTUSED (3 << 3) 6717 6718 /* User-Defined Field (UDF) IP Flags. (6 to 10 bits) */ 6719 #define _BCM_FIELD_USER_IP_MASK 0x000007c0 6720 #define _BCM_FIELD_USER_IP4_HDR_ONLY (0 << 6) 6721 #define _BCM_FIELD_USER_IP6_HDR_ONLY (1 << 6) 6722 #define _BCM_FIELD_USER_IP6_FRAGMENT (2 << 6) 6723 #define _BCM_FIELD_USER_IP4_OVER_IP4 (3 << 6) 6724 #define _BCM_FIELD_USER_IP6_OVER_IP4 (4 << 6) 6725 #define _BCM_FIELD_USER_IP4_OVER_IP6 (5 << 6) 6726 #define _BCM_FIELD_USER_IP6_OVER_IP6 (6 << 6) 6727 #define _BCM_FIELD_USER_GRE_IP4_OVER_IP4 (7 << 6) 6728 #define _BCM_FIELD_USER_GRE_IP6_OVER_IP4 (8 << 6) 6729 #define _BCM_FIELD_USER_GRE_IP4_OVER_IP6 (9 << 6) 6730 #define _BCM_FIELD_USER_GRE_IP6_OVER_IP6 (10 << 6) 6731 #define _BCM_FIELD_USER_ONE_MPLS_LABEL (11 << 6) 6732 #define _BCM_FIELD_USER_TWO_MPLS_LABELS (12 << 6) 6733 #define _BCM_FIELD_USER_IP6_FRAGMENT_OVER_IP4 (13 << 6) 6734 #define _BCM_FIELD_USER_IP_NOTUSED (14 << 6) 6735 #define _BCM_FIELD_USER_ANY_MPLS_LABELS (15 << 6) 6736 #define _BCM_FIELD_USER_ONE_FCOE_HEADER (16 << 6) 6737 #define _BCM_FIELD_USER_TWO_FCOE_HEADER (17 << 6) 6738 6739 /* Flags for Auto Adjust Offset with IP options length. */ 6740 #define _BCM_FIELD_USER_OPTION_ADJUST (1 << 30) 6741 6742 /* Flags for Auto Adjust Offset with GRE header options length. */ 6743 #define _BCM_FIELD_USER_GRE_OPTION_ADJUST (1 << 29) 6744 6745 /* User-Defined Field (UDF) Miscellaneous Flags (13 to 21 bits) */ 6746 #define _BCM_FIELD_USER_F_ENCAP_STACK_ANY (0 << 13) 6747 #define _BCM_FIELD_USER_F_NO_ENCAP_STACK (1 << 13) 6748 #define _BCM_FIELD_USER_F_ENCAP_STACK (2 << 13) 6749 6750 #define _BCM_FIELD_USER_F_VNTAG_ANY (0 << 15) 6751 #define _BCM_FIELD_USER_F_NO_VNTAG (1 << 15) 6752 #define _BCM_FIELD_USER_F_VNTAG (2 << 15) 6753 6754 #define _BCM_FIELD_USER_F_CNTAG_ANY (0 << 17) 6755 #define _BCM_FIELD_USER_F_NO_CNTAG (1 << 17) 6756 #define _BCM_FIELD_USER_F_CNTAG (2 << 17) 6757 6758 #define _BCM_FIELD_USER_F_ETAG_ANY (0 << 19) 6759 #define _BCM_FIELD_USER_F_NO_ETAG (1 << 19) 6760 #define _BCM_FIELD_USER_F_ETAG (2 << 19) 6761 6762 #define _BCM_FIELD_USER_F_ICNM_ANY (0 << 21) 6763 #define _BCM_FIELD_USER_F_NO_ICNM (1 << 21) 6764 #define _BCM_FIELD_USER_F_ICNM (2 << 21) 6765 6766 #if defined(BCM_WARM_BOOT_SUPPORT) 6767 typedef enum _bcmFieldActionNoParam_e { 6768 _bcmFieldActionNoParamPrioPktNoColor = 0, 6769 _bcmFieldActionNoParamPrioIntNoColor = 1, 6770 _bcmFieldActionNoParamCopyToCpuNoColor = 2, 6771 _bcmFieldActionNoParamDropNoColor = 3, 6772 _bcmFieldActionNoParamOamUpMep = 4, 6773 _bcmFieldActionNoParamOamTx = 5, 6774 _bcmFieldActionNoParamOamLmepEnable = 6, 6775 _bcmFieldActionNoParamOamLmEnable = 7, 6776 _bcmFieldActionNoParamOamDmEnable = 8, 6777 _bcmFieldActionNoParamOamLmepMdl = 9, 6778 _bcmFieldActionNoParamOamLmBasePtr = 10, 6779 _bcmFieldActionNoParamOamServicePriMappingPtr = 11, 6780 _bcmFieldActionNoParamOamPbbteLookupEnable = 12, 6781 _bcmFieldActionNoParamOamLmDmSampleEnable = 13, 6782 _bcmFieldActionNoParamCopyToCpuZeroParam1 = 14, 6783 _bcmFieldActionNoParamYpCopyToCpuZeroParam1 = 15, 6784 _bcmFieldActionNoParamRpCopyToCpuZeroParam1 = 16, 6785 _bcmFieldActionNoParamNewClassId = 17, 6786 _bcmFieldActionNoParamDscpNoColor = 18, 6787 _bcmFieldActionNoParamInnerVlanPriNewNoColor = 19, 6788 _bcmFieldActionNoParamOuterVlanPriNewNoColor = 20, 6789 _bcmFieldActionNoParamInnerVlanCfiNewNoColor = 21, 6790 _bcmFieldActionNoParamOuterVlanCfiNewNoColor = 22, 6791 _bcmFieldActionNoParamEcnNewNoColor = 23, 6792 _bcmFieldActionNoParamDropPrecedenceNoColor = 24, 6793 _bcmFieldActionNoParamGpDropPrecedence = 25, 6794 _bcmFieldActionNoParamYpDropPrecedence = 26, 6795 _bcmFieldActionNoParamRpDropPrecedence = 27, 6796 _bcmFieldActionNoParamIngressGportSet = 28, 6797 _bcmFieldActionNoParamRedirectIpmcWlan = 29, 6798 _bcmFieldActionNoParamRedirectIpmcVpls = 30, 6799 _bcmFieldActionNoParamRedirectIpmcL3 = 31, 6800 _bcmFieldActionNoParamIncomingMplsPortSet = 32, 6801 _bcmFieldActionNoParamPortPrioIntCosQNew = 33, 6802 _bcmFieldActionNoParamRpPortPrioIntCosQNew = 34, 6803 _bcmFieldActionNoParamYpPortPrioIntCosQNew = 35, 6804 _bcmFieldActionNoParamGpPortPrioIntCosQNew = 36, 6805 _bcmFieldActionNoParamMirrorIngress = 37, 6806 _bcmFieldActionNoParamMirrorEgress = 38, 6807 _bcmFieldActionNoParamRedirDropPrecedenceNoColor = 39, 6808 _bcmFieldActionNoParamFabricQueue = 40, 6809 _bcmFieldActionNoParamMirrorIngress1 = 41, /* Each enty can have atmost 4 IngressMirror Actions per entry */ 6810 _bcmFieldActionNoParamMirrorIngress2 = 42, 6811 _bcmFieldActionNoParamMirrorIngress3 = 43, 6812 _bcmFieldActionNoParamMirrorEgress1 = 44, /* Each enty can have atmost 4 EngressMirror Actions per entry */ 6813 _bcmFieldActionNoParamMirrorEgress2 = 45, 6814 _bcmFieldActionNoParamMirrorEgress3 = 46, 6815 _bcmFieldActionNoParamEnableVlanCheck = 47, 6816 _bcmFieldActionNoParamHiGigIntPriNew = 48, 6817 _bcmFieldActionNoParamHiGigDropPrecedenceNew = 49, 6818 _bcmFieldActionNoParamRedirectIpmcVlan = 50, 6819 _bcmFieldActionNoParamRedirectMpls = 51, 6820 _bcmFieldActionNoParamRedirectMim = 52, 6821 _bcmFieldActionNoParamRedirectNiv = 53, 6822 _bcmFieldActionNoParamRedirectTrill = 54, 6823 _bcmFieldActionNoParamRedirectL2Gre = 55, 6824 _bcmFieldActionNoParamRedirectVxLan = 56, 6825 _bcmFieldActionNoParamRedirectTrunk = 57, 6826 _bcmFieldActionNoParamMacSecSubPortEncrypt = 58, 6827 _bcmFieldActionNoParamMacSecSubPortDecrypt = 59, 6828 _bcmFieldActionNoParamSRNetIdSource = 60, 6829 _bcmFieldActionNoParamOamLmCounterPoolId = 61, 6830 _bcmFieldActionNoParamCount /* 62 */ 6831 } _bcmFieldActionNoParam_t; 6832 6833 6834 typedef enum _bcmFieldGroupSliceSelectors_e { 6835 _bcmFieldGroupSliceSrcClassSel = 0, 6836 _bcmFieldGroupSliceDstClassSel = 1, 6837 _bcmFieldGroupSliceIntfClassSel = 2, 6838 _bcmFieldGroupSliceIngressEntitySel = 3, 6839 _bcmFieldGroupSliceSrcEntitySel = 4, 6840 _bcmFieldGroupSliceDstFwdEntitySel = 5, 6841 _bcmFieldGroupSliceFwdFieldSel = 6, 6842 _bcmFieldGroupSliceLoopbackTypeSel = 7, 6843 _bcmFieldGroupSliceIpHeaderSel = 8, 6844 _bcmFieldGroupSliceIp6AddrSel = 9, 6845 _bcmFieldGroupSliceAuxTag1Sel = 10, 6846 _bcmFieldGroupSliceAuxTag2Sel = 11, 6847 _bcmFieldGroupSliceNormalizeIpSel = 12, 6848 _bcmFieldGroupSliceNormalizeMacSel = 13, 6849 _bcmFieldGroupSliceTtlClassSelect= 14, 6850 _bcmFieldGroupSliceTosClassSelect= 15, 6851 _bcmFieldGroupSliceTcpClassSelect= 16, 6852 _bcmFieldGroupSliceCount = 17, 6853 }_bcmFieldGroupSliceSelectors_t; 6854 6855 #define _BCM_FIELD_ACTION_NO_PARAM_STRINGS \ 6856 { \ 6857 "NoParamPrioPktNoColor" \ 6858 "NoParamPrioIntNoColor", \ 6859 "NoParamCopyToCpuNoColor", \ 6860 "NoParamDropNoColor", \ 6861 "NoParamOamUpMep", \ 6862 "NoParamOamTx", \ 6863 "NoParamOamLmepEnable", \ 6864 "NoParamOamLmEnable", \ 6865 "NoParamOamDmEnable", \ 6866 "NoParamOamLmepMdl", \ 6867 "NoParamOamLmBasePtr", \ 6868 "NoParamOamServicePriMappingPtr", \ 6869 "NoParamOamPbbteLookupEnable", \ 6870 "NoParamOamLmDmSampleEnable", \ 6871 "NoParamCopyToCpuZeroParam1", \ 6872 "NoParamYpCopyToCpuZeroParam1", \ 6873 "NoParamRpCopyToCpuZeroParam1", \ 6874 "NoParamNewClassId", \ 6875 "NoParamDscpNoColor", \ 6876 "NoParamInnerVlanPriNewNoColor", \ 6877 "NoParamOuterVlanPriNewNoColor", \ 6878 "NoParamInnerVlanCfiNewNoColor", \ 6879 "NoParamOuterVlanCfiNewNoColor", \ 6880 "NoParamEcnNewNoColor", \ 6881 "NoParamDropPrecedenceNoColor", \ 6882 "NoParamGpDropPrecedence", \ 6883 "NoParamYpDropPrecedence", \ 6884 "NoParamRpDropPrecedence", \ 6885 "NoParamIngressGportSet", \ 6886 "NoParamRedirectIpmcWlan", \ 6887 "NoParamRedirectIpmcVpls" \ 6888 "NoParamRedirectIpmcL3" \ 6889 } 6890 6891 #define _FP_WB_END_OF_SLICES 0xAB 6892 6893 #endif /* BCM_WARM_BOOT_SUPPORT */ 6894 6895 #if defined(BCM_TOMAHAWK_SUPPORT) 6896 6897 6898 /* 6899 * Reserved Source Class ID to be SET along with CopyToCpu 6900 * action for Lookup/VFP stage. 6901 */ 6902 #define _BCM_FIELD_COPYTOCPU_WAR_RESERVED_CLASSID 0x3FF 6903 6904 /* Memory Types */ 6905 #define _BCM_FIELD_MEM_TYPE_IFP_LT 1 6906 #define _BCM_FIELD_MEM_TYPE_EM_LT 2 6907 #define _BCM_FIELD_MEM_TYPE_FT_LT 3 6908 6909 /* Memory View Type flags */ 6910 #define _BCM_FIELD_MEM_VIEW_TYPE_TCAM 1 /* TCAM view */ 6911 #define _BCM_FIELD_MEM_VIEW_TYPE_DATA 2 /* DATA view */ 6912 #define _BCM_FIELD_MEM_VIEW_TYPE_TCAM_DATA_COMB 4 /* TCAM_DATA combined view */ 6913 6914 6915 /* ---- Macros/Enums/Structures related to Preselector Module ---- */ 6916 6917 /* Max Preselector Entries Per Pipe */ 6918 #define _FP_FIELD_PRESEL_ENTRIES_PER_PIPE 31 6919 6920 /* Max Presel IDs possible value. */ 6921 #define _BCM_FIELD_PRESEL_ID_MAX BCM_FIELD_PRESEL_SEL_MAX 6922 6923 /* Validate the Presel ID range */ 6924 #define _BCM_FIELD_IS_PRESEL_VALID(_id) \ 6925 ((_id < 0 || _id >= _BCM_FIELD_PRESEL_ID_MAX) ? FALSE:TRUE) 6926 6927 /* Validate the Presel ID */ 6928 #define _BCM_FIELD_IS_PRESEL_ENTRY(_e) \ 6929 (((_e & 0xf0000000) == BCM_FIELD_QUALIFY_PRESEL) ? TRUE:FALSE) 6930 6931 /* Retrieve the Presel ID from the Entry ID */ 6932 #define _BCM_FIELD_PRESEL_FROM_ENTRY(_e) \ 6933 (_e & ~(BCM_FIELD_QUALIFY_PRESEL)) 6934 6935 /* 6936 * Typedef: 6937 * _field_class_cmp_info_s 6938 * Purpose: 6939 * Field Class Compare information. 6940 */ 6941 typedef struct _field_class_cmp_info_s { 6942 _field_entry_t *f_ent; 6943 uint32 new_entry_idx; 6944 uint32 cur_entry_idx; 6945 int entry_prio; 6946 } _field_class_cmp_info_t; 6947 6948 /* Enums related to Preselector Flags */ 6949 typedef enum _bcm_field_presel_flags_e { 6950 _bcmFieldPreselCreateWithId = 1, /* Indicates Presel creation with id. */ 6951 _bcmFieldPreselCount /* Indicates Last entry - not in use. */ 6952 } _bcm_field_presel_flags_t; 6953 6954 /* Structure related to Preselector */ 6955 typedef struct _field_presel_info_s { 6956 uint32 presel_limit; /* max preselectors */ 6957 uint32 last_allocated_id; /* Last allocated id */ 6958 bcm_field_presel_set_t presel_set; /* set of preselectors created */ 6959 bcm_field_presel_set_t operational_set; /* Indicates Operational status 6960 of a presel IDs */ 6961 } _field_presel_info_t; 6962 6963 /* Add qualifier to Preselector stage qualifiers set. */ 6964 #define _FP_PRESEL_QUAL_INSERT(_unit_, _stage_fc_, _qual_id_, \ 6965 _flags_, \ 6966 _pri_slice_sel_, _pri_slice_sel_val_, \ 6967 _qual_type, \ 6968 _num_offsets_, \ 6969 _offset_0_, _width_0_, \ 6970 _offset_1_, _width_1_) \ 6971 do { \ 6972 _bcm_field_qual_conf_t_init(&_fp_qual_conf_); \ 6973 (_fp_qual_conf_).offset.field = (_key_fld_); \ 6974 (_fp_qual_conf_).offset.num_offsets = _num_offsets_; \ 6975 (_fp_qual_conf_).offset.offset[0] = _offset_0_; \ 6976 (_fp_qual_conf_).offset.width[0] = _width_0_; \ 6977 (_fp_qual_conf_).offset.offset[1] = _offset_1_; \ 6978 (_fp_qual_conf_).offset.width[1] = _width_1_; \ 6979 (_fp_qual_conf_).offset.flags = _flags_; \ 6980 _rv_ =_bcm_field_qual_insert((_unit_), (_stage_fc_), \ 6981 (_qual_type), (_qual_id_), \ 6982 &(_fp_qual_conf_)); \ 6983 BCM_IF_ERROR_RETURN(_rv_); \ 6984 } while (0) 6985 6986 6987 #define _FP_PRESEL_QUAL_ADD(_u_, _stage_fc_, _qual_id_, \ 6988 _flags_, \ 6989 _pri_slice_sel_, _pri_slice_sel_val_, \ 6990 _qual_type, \ 6991 _offset_0_, _width_0_) \ 6992 _FP_PRESEL_QUAL_INSERT(_u_, _stage_fc_, _qual_id_, \ 6993 _flags_, \ 6994 _pri_slice_sel_, _pri_slice_sel_val_, \ 6995 _qual_type, \ 6996 1, \ 6997 _offset_0_, _width_0_, \ 6998 0, 0) \ 6999 7000 7001 #define _FP_PRESEL_QUAL_TWO_ADD(_u_, _stage_fc_, _qual_id_, \ 7002 _flags_, \ 7003 _pri_slice_sel_, _pri_slice_sel_val_, \ 7004 _qual_type, \ 7005 _offset_0_, _width_0_, \ 7006 _offset_1_, _width_1_) \ 7007 _FP_PRESEL_QUAL_INSERT(_u_, _stage_fc_, _qual_id_, \ 7008 _flags_, \ 7009 _pri_slice_sel_, _pri_slice_sel_val_, \ 7010 _qual_type, \ 7011 2, \ 7012 _offset_0_, _width_0_, \ 7013 _offset_1_, _width_1_) \ 7014 7015 7016 /* Preselector TCAM Info */ 7017 typedef struct _field_presel_tcam_s { 7018 uint32 *key; /* HW entry key replica. */ 7019 uint32 *mask; /* HW entry mask replica. */ 7020 uint16 key_size; /* HW entry Key size. */ 7021 } _field_presel_tcam_t; 7022 7023 7024 /* Preselector HW Data */ 7025 typedef struct _field_presel_data_s { 7026 uint32 *data; /* HW entry data replica. */ 7027 uint16 data_size; /* HW entry Data size. */ 7028 } _field_presel_data_t; 7029 7030 /* Preselector Entry Structure */ 7031 typedef struct _field_presel_entry_s { 7032 bcm_field_presel_t presel_id; /* Unique Identifier */ 7033 uint32 flags; /* Entry flags _FP_ENTRY_XXX */ 7034 int priority; /* Entry Priority */ 7035 int hw_index; /* Allocated hw resource index. */ 7036 int slice_index; /* Entry Presel slice index. */ 7037 _field_presel_tcam_t lt_tcam; /* Fields to be written in LT TCAM */ 7038 _field_presel_data_t lt_data; /* Fields to be written in LT DATA */ 7039 bcm_field_qset_t p_qset; /* Contains Preselector Qualifiers 7040 associated with the presel entry */ 7041 _field_action_t *actions; /* Reference to lined list of Actions 7042 associate with entry. */ 7043 _field_group_t *group; /* Reference to the Group with this 7044 the entry is associated */ 7045 _field_lt_slice_t *lt_fs; /* LT slice where entry lives. */ 7046 bcm_pbmp_t mixed_src_class_pbmp; /* Ports in use by entry. */ 7047 7048 struct _field_presel_entry_s *next; /* Reference to next presel entry */ 7049 } _field_presel_entry_t; 7050 7051 extern int 7052 _bcm_field_th_stage_preselector_init(int unit, 7053 _field_control_t *fc, 7054 _field_stage_t *stage_fc); 7055 extern int 7056 _field_th_lt_config_init(int unit, _field_control_t *fc); 7057 7058 extern int 7059 _bcm_field_th_preselector_deinit(int unit, 7060 _field_control_t *fc, 7061 _field_stage_t *stage_fc); 7062 extern int 7063 _bcm_field_th_presel_create(int unit, 7064 _bcm_field_presel_flags_t flags, 7065 bcm_field_presel_t *presel); 7066 extern int 7067 _bcm_field_th_presel_destroy(int unit, 7068 bcm_field_presel_t presel_id); 7069 extern int 7070 _bcm_field_presel_entry_get(int unit, 7071 bcm_field_presel_t presel_id, 7072 _field_presel_entry_t **presel); 7073 extern int 7074 _bcm_field_presel_qualify_set(int unit, 7075 bcm_field_entry_t eid, 7076 bcm_field_qualify_t qual, 7077 uint32 *data, 7078 uint32 *mask); 7079 extern int 7080 _bcm_field_th_lt_tcam_policy_mem_get(int unit, _field_stage_t *stage_fc, 7081 int instance, int mem_type, int view_type, 7082 soc_mem_t *tcam_mem, soc_mem_t *data_mem); 7083 extern int 7084 _bcm_field_presel_qualifier_get(int unit, 7085 bcm_field_entry_t entry, 7086 int qual_id, 7087 _bcm_field_qual_data_t q_data, 7088 _bcm_field_qual_data_t q_mask); 7089 extern int 7090 _bcm_field_presel_action_add(int unit, _field_control_t *fc, 7091 bcm_field_entry_t entry, _field_action_t *fa); 7092 extern int 7093 _bcm_field_presel_action_delete(int unit, bcm_field_entry_t entry, 7094 bcm_field_action_t action, 7095 uint32 param0, uint32 param1); 7096 extern int 7097 _bcm_field_presel_action_get(int unit, 7098 bcm_field_entry_t entry, 7099 bcm_field_action_t action, 7100 uint32 *param0, 7101 uint32 *param1); 7102 extern int 7103 _bcm_field_presel_group_add(int unit, _field_group_t *fg, 7104 bcm_field_presel_t presel); 7105 extern int 7106 _bcm_field_presel_entry_prio_set(int unit, bcm_field_entry_t entry, int prio); 7107 extern int 7108 _bcm_field_presel_entry_prio_get(int unit, bcm_field_entry_t entry, int *prio); 7109 extern int 7110 _bcm_field_presel_entry_tcam_idx_get(int unit, _field_presel_entry_t *f_presel, 7111 _field_lt_slice_t *lt_fs, int *tcam_idx); 7112 extern int 7113 _bcm_field_th_presel_tcam_key_mask_get(int unit, 7114 _field_stage_t *stage_fc, 7115 int inst, 7116 _field_presel_entry_t *f_presel, 7117 _field_presel_tcam_t *tcam); 7118 extern int 7119 _bcm_field_th_presel_mem_data_get(int unit, 7120 _field_stage_t *stage_fc, 7121 int inst, 7122 _field_presel_entry_t *f_presel, 7123 _field_presel_data_t *p_data); 7124 extern int 7125 _bcm_field_presel_entry_actions_set(int unit, soc_mem_t data_mem, 7126 _field_presel_entry_t *f_presel, 7127 uint32 *buf); 7128 extern int 7129 _bcm_field_th_lt_entry_config_set(int unit, _field_stage_t *stage_fc, 7130 _field_group_t *fg, _field_lt_slice_t *lt_fs, 7131 _field_presel_entry_t *f_presel); 7132 extern int 7133 _field_th_lt_entry_data_config_set(int unit, _field_stage_t *stage_fc, 7134 _field_presel_entry_t *f_presel); 7135 extern int 7136 _bcm_field_th_lt_entry_hw_install(int unit, soc_mem_t lt_tcam_mem, int tcam_idx, 7137 uint32 *key, uint32 *mask, uint32 *data, 7138 uint8 valid); 7139 extern int 7140 _bcm_field_th_lt_entry_parts_install(int unit, _field_presel_entry_t *f_presel); 7141 extern int 7142 _bcm_field_th_lt_entry_install(int unit, _field_presel_entry_t *f_presel, 7143 _field_lt_slice_t *lt_fs); 7144 extern int 7145 _bcm_field_th_group_keygen_profiles_index_alloc(int unit, 7146 _field_stage_t *stage_fc, 7147 _field_group_t *fg, int part_index); 7148 extern int 7149 _bcm_field_th_lt_entry_data_value_set(int unit, _field_stage_t *stage_fc, 7150 _field_group_t *fg, int index, 7151 soc_mem_t lt_data_mem, uint32 *data); 7152 extern int 7153 _bcm_field_th_lt_entry_part_tcam_idx_get(int unit, _field_group_t *fg, 7154 uint32 idx_pri, uint8 ent_part, 7155 int *idx_out); 7156 extern int 7157 _bcm_field_th_lt_entry_phys_destroy(int unit, _field_presel_entry_t *f_presel); 7158 extern int 7159 _bcm_field_th_group_presel_set(int unit, bcm_field_group_t group, 7160 bcm_field_presel_set_t *presel); 7161 extern int 7162 _bcm_field_th_group_presel_get(int unit, bcm_field_group_t group, 7163 bcm_field_presel_set_t *presel); 7164 extern int 7165 _bcm_field_th_ingress_logical_table_map_write(int unit, 7166 _field_stage_t *stage_fc, 7167 _field_group_t *fg); 7168 extern int 7169 _bcm_field_th_ingress_lt_action_prio_install(int unit, 7170 _field_stage_t *stage_fc, 7171 _field_group_t *fg); 7172 extern int 7173 _bcm_field_th_ingress_lt_partition_prio_write(int unit, 7174 _field_stage_t *stage_fc, 7175 _field_group_t *fg, int lt_id, 7176 int slice); 7177 extern int 7178 _bcm_field_th_lt_part_prio_value_get(int unit, _field_group_t *fg, 7179 int *lt_part_prio); 7180 extern int 7181 _bcm_field_th_lt_part_prio_reset(int unit, _field_stage_t *stage_fc, 7182 _field_group_t *fg, _field_slice_t *fs); 7183 extern int 7184 _bcm_field_th_presel_entry_hw_remove(int unit, _field_presel_entry_t *f_presel); 7185 extern int 7186 _bcm_field_th_tcam_policy_mem_get(int unit, 7187 _field_entry_t *f_ent, 7188 soc_mem_t *tcam_mem, 7189 soc_mem_t *policy_mem); 7190 extern int 7191 _bcm_field_th_group_instance_set(int unit, _field_group_t *fg); 7192 extern int 7193 _bcm_field_th_tcam_policy_clear(int unit, _field_entry_t *f_ent, int tcam_idx); 7194 extern int 7195 _field_th_ext_code_assign(int unit, 7196 int salcode_clear, _field_group_add_fsm_t *fsm_ptr); 7197 typedef struct _field_counter_hw_mode_s { 7198 uint32 hw_bmap; 7199 uint8 hw_entry_count; 7200 _field_stat_color_t color; 7201 } _field_counter_hw_mode_t; 7202 7203 extern _field_counter_hw_mode_t th_ingress_cntr_hw_mode_tbl[]; 7204 extern int th_ingress_cntr_hw_mode_tbl_size; 7205 extern int _bcm_field_th_group_compress(int unit, _field_group_t *fg, 7206 _field_stage_t *stage_fc); 7207 extern int _bcm_field_th_resync(int unit, _field_stage_t *stage_fc); 7208 extern int _bcm_field_th_class_qual_support_check(int unit, int qual); 7209 extern int 7210 _field_th_entry_action_profile_data_set(int unit, 7211 _field_entry_t *f_ent, 7212 uint32 *ap_idx, 7213 soc_mem_t policy_mem, 7214 uint32 *abuf); 7215 extern int 7216 _bcm_field_th_flex_stat_action_set(int unit, 7217 _field_entry_t *f_ent, 7218 soc_mem_t mem, 7219 int tcam_idx, 7220 uint32 *buf); 7221 extern void 7222 _bcm_field_th_functions_init(_field_funct_t *functions); 7223 extern int 7224 _bcm_field_th_entry_flags_to_tcam_part(int unit, uint32 entry_flags, 7225 uint32 group_flags, 7226 uint8 *entry_part); 7227 extern int 7228 _bcm_field_action_val_set(int unit, _field_entry_t *f_ent, uint32 *entbuf, 7229 _bcm_field_action_offset_t *a_offset); 7230 extern int 7231 _bcm_field_action_offset_get(int unit, _field_stage_t *stage_fc, 7232 _bcm_field_internal_action_t action, 7233 _bcm_field_action_offset_t *ptr, 7234 uint32 flags); 7235 7236 extern int 7237 _bcm_field_action_profile_hw_stat_fields_get(int unit, int index, 7238 soc_mem_t mem, 7239 uint32 *offset_mode, 7240 uint32 *pool_number, 7241 uint32 *base_idx); 7242 extern int _field_th_class_max_entries(int unit, 7243 int cpipe, 7244 _field_class_type_t ctype, 7245 int *max_entries); 7246 extern int 7247 _field_th_em_entry_set(int unit, 7248 _field_entry_t *f_ent, 7249 soc_mem_t mem, 7250 uint32 *bufp, int search_entry); 7251 extern int 7252 _field_td3_em_entry_set(int unit, 7253 _field_entry_t *f_ent, 7254 soc_mem_t mem, 7255 uint32 *bufp, int search_entry); 7256 extern int 7257 _bcm_field_th_em_entry_tcam_idx_get(int unit, 7258 _field_entry_t *f_ent, int *hw_index); 7259 extern int 7260 _field_th3_em_entry_set(int unit, 7261 _field_entry_t *f_ent, 7262 soc_mem_t mem, 7263 uint32 *bufp, int search_entry); 7264 7265 #endif /* BCM_TOMAHAWK_SUPPORT */ 7266 #if defined(BCM_HELIX5_SUPPORT) 7267 extern int 7268 _bcm_field_hx5_ingress_lt_partition_prio_write(int unit, 7269 _field_stage_t *stage_fc, 7270 _field_group_t *fg, int lt_id, 7271 int slice); 7272 #endif /* BCM_HELIX5_SUPPORT */ 7273 #if defined(BCM_TRIDENT3_SUPPORT) 7274 extern int _field_td3_ingress_action_profiles_init(int unit, 7275 _field_stage_t *stage_fc); 7276 7277 extern int _field_td3_common_actions_init(int unit, 7278 _field_stage_t *stage_fc); 7279 extern int 7280 _field_td3_ingress_entry_policy_mem_install(int unit, _field_entry_t *f_ent, 7281 soc_mem_t policy_mem, int tcam_idx); 7282 extern int 7283 _field_td3_field_group_aset_update(int unit, _field_group_t *fg, 7284 bcm_field_aset_t *aset); 7285 extern void _bcm_field_td3_functions_init(_field_funct_t *functions); 7286 extern int _bcm_field_td3_action_get(int unit, soc_mem_t mem, _field_entry_t *f_ent, 7287 int tcam_idx, _field_action_t *fa, uint32 *buf); 7288 extern int _bcm_field_td3_vlan_action_hw_alloc(int unit, _field_entry_t *f_ent); 7289 extern int _bcm_field_td3_vlan_action_hw_free(int unit, _field_entry_t *f_ent, uint32 flags); 7290 extern int _bcm_field_td3_vlan_action_profile_entry_get(int unit, 7291 soc_mem_t policy_mem, 7292 uint32 *policy_entry, 7293 uint32 profile_index, 7294 bcm_vlan_action_set_t *actions); 7295 extern int _bcm_field_action_vlan_actions_add(int unit, 7296 bcm_field_entry_t entry, 7297 bcm_field_action_t action, 7298 bcm_vlan_action_set_t *vlan_action_set); 7299 extern int _bcm_field_action_vlan_actions_get(int unit, 7300 bcm_field_entry_t entry, 7301 bcm_field_action_t action, 7302 bcm_vlan_action_set_t *vlan_action_set); 7303 extern int _field_td3_stage_quals_ibus_map_init(int unit, 7304 _field_stage_t *stage_fc); 7305 extern int 7306 _field_td3_egress_qualifiers_init(int unit, _field_stage_t *stage_fc); 7307 7308 extern int 7309 _field_td3_presel_qualifiers_init(int unit, _field_stage_t *stage_fc); 7310 7311 extern int 7312 _bcm_field_td3_em_key_attributes_init(int unit, 7313 _field_stage_t *stage_fc); 7314 7315 extern int 7316 _field_td3_egress_selcodes_install(int unit, _field_group_t *fg, 7317 uint8 slice_num, int selcode_idx); 7318 extern int 7319 _bcm_field_td3_egress_secondary_selcodes_set(int unit, _field_group_t *fg, 7320 int slice_idx, uint8 part_idx); 7321 extern int 7322 _bcm_field_td3_forwardingType_set(int unit, _field_stage_id_t stage_id, 7323 bcm_field_entry_t entry, 7324 bcm_field_ForwardingType_t type, 7325 uint32 *data, uint32 *mask); 7326 extern int 7327 _bcm_field_td3_forwardingType_get(int unit, _field_stage_id_t stage_id, 7328 bcm_field_entry_t entry, 7329 uint32 data, uint32 mask, 7330 bcm_field_ForwardingType_t *type); 7331 extern int 7332 _bcm_field_td3_tpid_hw_encode(int unit, uint16 tpid, uint16 outer_tpid, 7333 uint32 *hw_code); 7334 extern int 7335 _bcm_field_td3_tpid_hw_decode(int unit, uint32 hw_code, uint16 outer_tpid, 7336 uint16 *tpid); 7337 extern int 7338 _bcm_field_td3_drop_vector_mask_init(int unit); 7339 extern int 7340 _bcm_field_td3_qualify_PktType(int unit, bcm_field_pkt_type_t type, 7341 uint32 *tcam_data, 7342 uint32 *tcam_mask); 7343 extern int 7344 _bcm_field_td3_qualify_PktType_get(int unit, uint32 tcam_data, uint32 tcam_mask, 7345 bcm_field_pkt_type_t *type); 7346 extern int 7347 _bcm_field_td3_qualify_IpOptionHdrType(int unit, bcm_field_qualify_t qual_id, 7348 bcm_field_ip_option_hdr_type_t type, 7349 uint8 *data, uint8 *mask); 7350 extern int 7351 _bcm_field_td3_qualify_IpOptionHdrType_get(int unit, bcm_field_qualify_t qual_id, 7352 uint8 data, 7353 uint8 mask, 7354 bcm_field_ip_option_hdr_type_t *type); 7355 extern int 7356 _bcm_field_td3_qualify_L2PktType(int unit, bcm_field_l2_pkt_type_t type, 7357 uint8 *data, 7358 uint8 *mask); 7359 extern int 7360 _bcm_field_td3_qualify_L2PktType_get(int unit, uint8 data, uint8 mask, 7361 bcm_field_l2_pkt_type_t *type); 7362 extern int 7363 _bcm_field_td3_qualify_NetworkTagType(int unit, bcm_field_network_tag_type_t type, 7364 uint8 *data, uint8 *mask); 7365 extern int 7366 _bcm_field_td3_qualify_NetworkTagType_get(int unit, uint8 data, uint8 mask, 7367 bcm_field_network_tag_type_t *type); 7368 extern int 7369 _bcm_field_td3_qualify_SysHdrType(int unit, bcm_field_sys_hdr_type_t type, 7370 uint8 *data, uint8 *mask); 7371 extern int 7372 _bcm_field_td3_qualify_SysHdrType_get(int unit, uint8 data, uint8 mask, 7373 bcm_field_sys_hdr_type_t *type); 7374 extern int 7375 _bcm_field_td3_qualify_TimeStampTxPktType(int unit, 7376 bcm_field_timestamp_transmit_pkt_type_t ts_pkt_type, 7377 uint16 *data, 7378 uint16 *mask); 7379 extern int 7380 _bcm_field_td3_qualify_TimeStampTxPktType_get(int unit, 7381 uint16 data, 7382 uint16 mask, 7383 bcm_field_timestamp_transmit_pkt_type_t *ts_pkt_type); 7384 extern int 7385 _bcm_field_td3_qualify_TunnelType(int unit, bcm_field_TunnelType_t tunnel_type, 7386 uint32 *tcam_data, uint32 *tcam_mask); 7387 extern int 7388 _bcm_field_td3_qualify_TunnelType_get(int unit, uint8 tcam_data, uint8 tcam_mask, 7389 bcm_field_TunnelType_t *tunnel_type); 7390 extern int 7391 _bcm_field_td3_qualify_LoopbackType(bcm_field_LoopbackType_t loopback_type, 7392 uint32 *tcam_data, 7393 uint32 *tcam_mask); 7394 extern int 7395 _bcm_field_td3_qualify_LoopbackType_get(uint8 tcam_data, 7396 uint8 tcam_mask, 7397 bcm_field_LoopbackType_t *loopback_type); 7398 extern int 7399 _bcm_field_td3_qualify_flow_type(int unit, int qual_id, uint8 data, uint8 mask, 7400 uint8 *tcam_data, uint8 *tcam_mask); 7401 extern int 7402 _bcm_field_td3_qualify_flow_type_get(int unit, int qual_id, uint8 tcam_data, 7403 uint8 tcam_mask, uint8 *data, uint8 *mask); 7404 extern int 7405 _bcm_field_td3_qualify_HiGigProxyTunnelType(bcm_field_higig_proxy_tunnel_type_t type, 7406 uint8 *tcam_data, uint8 *tcam_mask); 7407 extern int 7408 _bcm_field_td3_qualify_HiGigProxyTunnelType_get(uint8 tcam_data, uint8 tcam_mask, 7409 bcm_field_higig_proxy_tunnel_type_t *type); 7410 extern int 7411 _bcm_field_td3_qualify_InterfaceClassL2Type(bcm_field_interface_class_l2_type_t type, 7412 uint8 *tcam_data, uint8 *tcam_mask); 7413 extern int 7414 _bcm_field_td3_qualify_InterfaceClassL2Type_get(uint8 tcam_data, uint8 tcam_mask, 7415 bcm_field_interface_class_l2_type_t *type); 7416 extern int 7417 _bcm_field_td3_zone_match_id_partition_init(int unit, 7418 _field_stage_t *stage_fc); 7419 extern int 7420 _bcm_field_td3_internal_action_profile_data_set(int unit, 7421 _field_entry_t *f_ent, 7422 _field_action_t *fa, 7423 _field_em_action_set_t *acts_buf); 7424 extern int 7425 _field_td3_flex_action_set(int unit, 7426 _field_action_t *fa, 7427 _bcm_field_action_offset_t *a_offset); 7428 extern int 7429 _bcm_field_td3_qualify_LoopbackSubtype(int unit, 7430 bcm_field_loopback_subtype_t subtype, 7431 uint32 *hw_data, uint32 *hw_mask); 7432 extern int 7433 _bcm_field_td3_qualify_LoopbackSubtype_get(int unit, 7434 uint8 tcam_data, 7435 uint8 tcam_mask, 7436 bcm_field_loopback_subtype_t *subtype); 7437 extern int 7438 _bcm_field_td3_qualify_TunnelSubType(int unit, bcm_field_TunnelSubType_t type, 7439 uint32 *tcam_data, uint32 *tcam_mask); 7440 extern int 7441 _bcm_field_td3_qualify_TunnelSubType_get(int unit, uint8 tcam_data, uint8 tcam_mask, 7442 bcm_field_TunnelSubType_t *type); 7443 extern int 7444 _bcm_field_td3_qualify_VlanFormat(int unit, 7445 bcm_field_qualify_t qual_id, 7446 uint8 data, 7447 uint8 mask, 7448 uint8 *hw_data, 7449 uint8 *hw_mask); 7450 extern int 7451 _bcm_field_td3_qualify_VlanFormat_get(int unit, 7452 bcm_field_qualify_t qual_id, 7453 uint8 hw_data, 7454 uint8 hw_mask, 7455 uint8 *data, 7456 uint8 *mask); 7457 extern int 7458 _bcm_field_td3_qualify_MplsType(int unit, bcm_field_qualify_t qual_id, 7459 uint8 data, uint8 mask, 7460 uint8 *hw_data, uint8 *hw_mask); 7461 extern int 7462 _bcm_field_td3_qualify_MplsType_get(int unit, bcm_field_qualify_t qual_id, 7463 uint8 hw_data, uint8 hw_mask, 7464 uint8 *data, uint8 *mask); 7465 extern int 7466 _bcm_field_td3_flex_qual_ceh_db_init(int unit); 7467 extern int 7468 _bcm_field_td3_flex_qual_ceh_db_clear(int unit); 7469 extern int 7470 _bcm_field_td3_ifp_inports_entry_tcam_install(int unit, _field_entry_t *f_ent, 7471 int tcam_idx, uint8 set_pbmp, 7472 _field_pbmp_t *_f_pbmp, 7473 int num_pipe); 7474 extern int 7475 _bcm_field_td3_inports_flex_init(int unit); 7476 #endif /* BCM_TRIDENT3_SUPPORT */ 7477 7478 #if defined (BCM_TOMAHAWK3_SUPPORT) 7479 extern int 7480 _bcm_field_th3_em_key_attributes_init(int unit, 7481 _field_stage_t *stage_fc, 7482 _field_control_t *fc); 7483 #endif /* BCM_TOMAHAWK3_SUPPORT */ 7484 7485 extern int 7486 _bcm_field_valid_pbmp_get(int unit, bcm_pbmp_t *pbm); 7487 7488 7489 extern int 7490 _bcm_esw_field_class_map_set( 7491 int unit, 7492 bcm_field_qualify_t qual, 7493 uint32 num_entries, 7494 uint32 *orig_values_array, 7495 uint32 *map_values_array); 7496 7497 extern int 7498 _bcm_esw_field_class_map_get( 7499 int unit, 7500 bcm_field_qualify_t qual, 7501 uint32 num_entries, 7502 uint32 *orig_values_array, 7503 uint32 *map_values_array); 7504 extern int 7505 _bcm_esw_field_entry_dump(int unit, bcm_field_entry_t entry, int stage); 7506 extern int 7507 _bcm_esw_field_group_dump(int unit, bcm_field_group_t group, int stage); 7508 extern int 7509 _bcm_esw_field_show(int unit, const char *pfx, int stage); 7510 extern int 7511 _bcm_esw_field_range_show(int unit, const char *pfx, int stage); 7512 extern int 7513 _bcm_esw_field_udf_show(int unit, const char *pfx); 7514 extern int 7515 _bcm_esw_field_group_info_key_get(int unit, 7516 bcm_field_group_t group, 7517 int max_parts_count, 7518 _bcm_field_group_qual_t **qual_arr, 7519 int *num_parts_count); 7520 7521 extern int 7522 _bcm_field_reg_instance_get(int unit, soc_reg_t reg, 7523 int inst, soc_reg_t *reg_out); 7524 7525 extern int 7526 _bcm_field_mem_instance_get(int unit, soc_mem_t mem, 7527 int inst, soc_mem_t *mem_out); 7528 7529 #if defined (BCM_TOMAHAWK_SUPPORT) 7530 extern int 7531 _bcm_th_qual_hint_bmp_get(int unit, int qual, 7532 uint8 em_keygen_mask, 7533 _field_hint_t *hint_node, 7534 uint32 *qual_bitmap, 7535 uint8 partial, 7536 bcm_field_qset_t *qset, 7537 bcmi_keygen_qual_info_t *qual_info); 7538 extern int 7539 _bcm_field_th_class_ctype_supported(int unit, 7540 _field_class_type_t ctype); 7541 extern int 7542 _bcm_field_max_lt_part_prio_get(int unit); 7543 7544 extern int 7545 _bcm_field_th_max_lt_parts_get(int unit); 7546 7547 #ifdef BCM_WARM_BOOT_SUPPORT 7548 extern int 7549 _bcm_field_wb_slice_index_bmp_write (int unit, 7550 _field_control_t *fc, 7551 _field_stage_t *stage_fc); 7552 #endif /*BCM_WARM_BOOT_SUPPORT*/ 7553 extern int 7554 _bcm_field_th_group_presel_enable_set(int unit, 7555 _field_stage_t *stage_fc, 7556 _field_group_t *fg, 7557 uint32 valid); 7558 extern int 7559 _bcm_field_th_slice_enable_set(int unit, 7560 _field_group_t *fg, 7561 _field_slice_t *fs, 7562 uint8 enable); 7563 #endif /*BCM_TOMAHAWK_SUPPORT */ 7564 7565 #if defined(BCM_FLOWTRACKER_SUPPORT) 7566 extern int 7567 _bcm_field_hx5_qualify_PktDstAddrType(int unit, 7568 bcm_field_qualify_t qual, 7569 uint32 dst_addr_type, 7570 uint32 *hw_data, 7571 uint32 *hw_mask); 7572 extern int 7573 _bcm_field_hx5_qualify_PktDstAddrType_get(int unit, 7574 bcm_field_qualify_t qual, 7575 uint32 hw_data, 7576 uint32 hw_mask, 7577 uint32 *dst_addr_type); 7578 7579 extern int 7580 _bcm_field_hx5_dosattack_event_qual_bitmap(int unit, 7581 _field_hint_t *hint_node, 7582 bcmi_keygen_qual_info_t *qual_info); 7583 7584 extern int 7585 _bcm_field_hx5_ft_group_aset_update(int unit, 7586 _field_group_t *fg, 7587 bcm_field_aset_t *aset); 7588 7589 #endif /* BCM_FLOWTRACKER_SUPPORT */ 7590 7591 extern int _field_action_match_config_alloc (int unit, 7592 bcm_field_action_match_config_t *match_config, 7593 _field_action_t *fa); 7594 7595 extern int 7596 _bcm_field_ddrop_profile_get(int unit, 7597 soc_profile_mem_t **ddrop_profile); 7598 extern int 7599 _bcm_field_ddrop_profile_ref_count_get(int unit, 7600 int index, 7601 int *ref_count); 7602 extern int 7603 _bcm_field_ddrop_profile_delete(int unit, int index); 7604 extern int 7605 _bcm_field_dredirect_profile_get(int unit, 7606 soc_profile_mem_t **dredirect_profile); 7607 extern int 7608 _bcm_field_dredirect_profile_ref_count_get(int unit, 7609 int index, 7610 int *ref_count); 7611 extern int 7612 _bcm_field_dredirect_profile_delete(int unit, int index); 7613 7614 extern int 7615 _field_delayed_profile_hw_alloc(int unit, _field_entry_t *f_ent); 7616 7617 extern int 7618 _field_delayed_profile_hw_free(int unit, _field_entry_t *f_ent, uint32 flags); 7619 #if defined (BCM_TRIDENT3_SUPPORT) 7620 extern int 7621 _bcm_field_td3_qualify_VlanTranslationHit(int unit, 7622 bcm_field_entry_t entry, 7623 uint8 *data, 7624 uint8 *mask); 7625 extern int 7626 _bcm_field_td3_em_udf_keygen_mask_get(int unit, 7627 _field_group_t *fg, 7628 uint16 qid, uint32 *mask); 7629 extern int 7630 _bcm_field_qual_cfg_info_db_update(int unit, 7631 int instance, 7632 bcm_field_qualify_t qual, 7633 _field_stage_t *stage_fc); 7634 extern int 7635 _bcm_field_td3_field_bus_cont_sel_install(int unit, 7636 int instance, 7637 _field_stage_t *stage_fc, 7638 _field_group_t *fg, 7639 bcm_field_qualify_t qual); 7640 extern int 7641 _bcm_field_td3_field_bus_cont_sel_remove(int unit, 7642 int instance, 7643 _field_stage_t *stage_fc, 7644 _field_group_t *fg, 7645 bcm_field_qualify_t qual); 7646 #endif /* BCM_TRIDENT3_SUPPORT */ 7647 extern int 7648 _bcm_field_priority_group_get_next(int unit, 7649 int instance, 7650 _field_stage_id_t stage_id, 7651 int priority, 7652 uint32 group_mode, 7653 _field_group_t **curr_group, 7654 _field_group_t **next_group); 7655 extern int 7656 _bcm_field_group_count_get(int unit, 7657 int instance, 7658 _field_stage_t *stage_fc, 7659 int group_priority, 7660 uint32 group_mode, 7661 uint16 *group_count); 7662 #endif /* BCM_FIELD_SUPPORT */ 7663 #endif /* !_BCM_INT_FIELD_H */