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