field.c (1645463B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * File: field.c 8 * Purpose: Field Processor module routines specific to BCM56960 9 */ 10 11 #include <shared/bsl.h> 12 #include <soc/defs.h> 13 #if defined(BCM_TOMAHAWK_SUPPORT) && defined(BCM_FIELD_SUPPORT) 14 #include <soc/drv.h> 15 #include <soc/scache.h> 16 #include <soc/trident2.h> 17 #include <soc/tomahawk.h> 18 #include <soc/format.h> 19 20 #include <bcm/error.h> 21 #include <bcm/l3.h> 22 #include <bcm/field.h> 23 #include <bcm/tunnel.h> 24 #include <bcm/stat.h> 25 #include <shared/bsl.h> 26 27 #include <bcm_int/common/multicast.h> 28 #include <bcm_int/esw_dispatch.h> 29 #include <bcm_int/esw/field.h> 30 #include <bcm_int/esw/l3.h> 31 #include <bcm_int/esw/nat.h> 32 #include <bcm_int/esw/policer.h> 33 #include <bcm_int/esw/trx.h> 34 #include <bcm_int/esw/triumph.h> 35 #include <bcm_int/esw/trident.h> 36 #include <bcm_int/esw/trident2.h> 37 #include <bcm_int/esw/tomahawk.h> 38 #include <bcm_int/esw/tomahawk3.h> 39 #include <bcm_int/esw/mirror.h> 40 #include <bcm_int/esw/trunk.h> 41 #include <bcm_int/esw/xgs4.h> 42 #include <bcm_int/esw/range.h> 43 #include <bcm_int/esw/virtual.h> 44 #if defined(BCM_TRIDENT3_SUPPORT) 45 #include <bcm_int/esw/trident3.h> 46 #include <bcm_int/esw/udf.h> 47 #endif 48 #if defined(BCM_TOMAHAWK2_SUPPORT) 49 #include <soc/tomahawk2.h> 50 #endif 51 #if defined(BCM_TOMAHAWK3_SUPPORT) 52 #include <soc/tomahawk3.h> 53 #endif 54 #if defined(BCM_HELIX5_SUPPORT) 55 #include <bcm_int/esw/helix5.h> 56 #endif 57 #include <soc/esw/cancun.h> 58 59 #ifndef ALIGN32 60 #define ALIGN32(x) (((x) + 31) & ~31) 61 #endif 62 63 #ifndef BIT 64 #define BIT(n) (1U << (n)) 65 #endif 66 67 static char *action_name[bcmFieldActionCount] = BCM_FIELD_ACTION_STRINGS; 68 69 /* IFP_TCAM modes */ 70 #define _IFP_SLICE_MODE_NARROW 0 /* 80-bit Mode */ 71 #define _IFP_SLICE_MODE_WIDE 1 /* 160-bit Mode */ 72 #define _FP_LT_ID_BASE 0 73 #define _FP_LT_ID_MAX (0x1F) 74 75 /* IFP meter types */ 76 #define _FIELD_METER_TYPE_EVEN 0x1 77 #define _FIELD_METER_TYPE_ODD 0x2 78 79 /* Valid PortBitmap */ 80 #define _BCM_FIELD_VALID_PIPE_PBMP_GET(_unit_, _inst_, _pbm_) \ 81 { \ 82 int _ct_; \ 83 int _min_p_, _max_p_; \ 84 if (_inst_ == _BCM_FIELD_GLOBAL_GROUP) { \ 85 _max_p_ = (_FP_MAX_NUM_PIPES * _FP_TCAM_IPBMP_SIZE(_unit_)); \ 86 _min_p_ = 0; \ 87 } else { \ 88 _max_p_ = ((_inst_ + 1) * _FP_TCAM_IPBMP_SIZE(_unit_)); \ 89 _min_p_ = (_inst_ * _FP_TCAM_IPBMP_SIZE(_unit_)); \ 90 } \ 91 for (_ct_ = _min_p_; _ct_ < _max_p_; _ct_++) { \ 92 BCM_PBMP_PORT_ADD(_pbm_, _ct_); \ 93 } \ 94 } 95 96 #define _UDF_CHUNK_WIDTH_ 16 97 98 #define _FIELD_UDF_START_CHUNK_OFFSET_GET(_chunk1_, _chunk2_) do { \ 99 start_second_chunk = 0; \ 100 if ((NULL != qset) && (SHR_BITGET(qset->udf_map, _chunk1_)) \ 101 && (SHR_BITGET(qset->udf_map, _chunk2_))) { \ 102 if ((0 == (chunk_bmap & (1 << _chunk1_))) && ((chunk_bmap & (1 << _chunk2_)))) { \ 103 start_bit = hint_node->hint->start_bit%(_UDF_CHUNK_WIDTH_); \ 104 start_width = (_UDF_CHUNK_WIDTH_) - start_bit; \ 105 start_second_chunk = 1; \ 106 } else if ((chunk_bmap & (1 << _chunk1_)) && (0 == (chunk_bmap & (1 << _chunk2_)))) { \ 107 start_bit = hint_node->hint->start_bit%(_UDF_CHUNK_WIDTH_); \ 108 start_bit = _UDF_CHUNK_WIDTH_ + start_bit; \ 109 start_second_chunk = 1; \ 110 } else { \ 111 start_bit = hint_node->hint->start_bit%(2 * _UDF_CHUNK_WIDTH_); \ 112 start_width = (2 * _UDF_CHUNK_WIDTH_) - start_bit; \ 113 } \ 114 } else { \ 115 if ((0 == (chunk_bmap & (1 << _chunk1_))) && ((chunk_bmap & (1 << _chunk2_)))) { \ 116 start_bit = hint_node->hint->start_bit%(_UDF_CHUNK_WIDTH_); \ 117 start_width = (_UDF_CHUNK_WIDTH_) - start_bit; \ 118 } else if ((chunk_bmap & (1 << _chunk1_)) && (0 == (chunk_bmap & (1 << _chunk2_)))) { \ 119 start_bit = hint_node->hint->start_bit%(_UDF_CHUNK_WIDTH_); \ 120 start_bit = _UDF_CHUNK_WIDTH_ + start_bit; \ 121 start_width = (2 * _UDF_CHUNK_WIDTH_) - start_bit; \ 122 } else { \ 123 start_bit = hint_node->hint->start_bit%(2 * _UDF_CHUNK_WIDTH_); \ 124 start_width = (2 * _UDF_CHUNK_WIDTH_) - start_bit; \ 125 } \ 126 } \ 127 } while(0); 128 129 #define _FIELD_UDF_END_CHUNK_OFFSET_GET(_chunk1_, _chunk2_) do { \ 130 end_second_chunk = 0; \ 131 if ((NULL != qset) && (SHR_BITGET(qset->udf_map, _chunk1_)) \ 132 && (SHR_BITGET(qset->udf_map, _chunk2_))) { \ 133 if ((0 == (chunk_bmap & (1 << _chunk1_))) && ((chunk_bmap & (1 << _chunk2_)))) { \ 134 end_bit = 0; \ 135 end_width = hint_node->hint->end_bit%(_UDF_CHUNK_WIDTH_); \ 136 end_second_chunk = 1; \ 137 } else if ((chunk_bmap & (1 << _chunk1_)) && (0 == (chunk_bmap & (1 << _chunk2_)))) { \ 138 end_bit = _UDF_CHUNK_WIDTH_; \ 139 end_width = hint_node->hint->end_bit%(_UDF_CHUNK_WIDTH_); \ 140 end_width = end_width + _UDF_CHUNK_WIDTH_; \ 141 end_second_chunk = 1; \ 142 } else { \ 143 end_bit = 0; \ 144 end_width = hint_node->hint->end_bit%(2 * _UDF_CHUNK_WIDTH_); \ 145 } \ 146 } else { \ 147 if ((0 == (chunk_bmap & (1 << _chunk1_))) && ((chunk_bmap & (1 << _chunk2_)))) { \ 148 end_bit = 0; \ 149 end_width = hint_node->hint->end_bit%(_UDF_CHUNK_WIDTH_); \ 150 } else if ((chunk_bmap & (1 << _chunk1_)) && (0 == (chunk_bmap & (1 << _chunk2_)))) { \ 151 end_bit = _UDF_CHUNK_WIDTH_; \ 152 end_width = hint_node->hint->end_bit%(_UDF_CHUNK_WIDTH_); \ 153 end_width = end_width + _UDF_CHUNK_WIDTH_; \ 154 } else { \ 155 end_bit = 0; \ 156 end_width = hint_node->hint->end_bit%(2 * _UDF_CHUNK_WIDTH_); \ 157 } \ 158 } \ 159 } while(0); 160 161 static soc_field_t _th_efp_slice_mode[4][2] = { 162 {SLICE_0_MODEf, SLICE_0_IPV6_KEY_MODEf}, 163 {SLICE_1_MODEf, SLICE_1_IPV6_KEY_MODEf}, 164 {SLICE_2_MODEf, SLICE_2_IPV6_KEY_MODEf}, 165 {SLICE_3_MODEf, SLICE_3_IPV6_KEY_MODEf} 166 }; 167 static soc_field_t classfldtbl[][7] = { 168 {SLICE_0_F1f, SLICE_0_F2f, SLICE_0_F3f, SLICE_0_F4f, 169 SLICE_0_F6f, SLICE_0_F7f, SLICE_0_F8f}, 170 {SLICE_1_F1f, SLICE_1_F2f, SLICE_1_F3f, SLICE_1_F4f, 171 SLICE_1_F6f, SLICE_1_F7f, SLICE_1_F8f}, 172 {SLICE_2_F1f, SLICE_2_F2f, SLICE_2_F3f, SLICE_2_F4f, 173 SLICE_2_F6f, SLICE_2_F7f, SLICE_2_F8f}, 174 {SLICE_3_F1f, SLICE_3_F2f, SLICE_3_F3f, SLICE_3_F4f, 175 SLICE_3_F6f, SLICE_3_F7f, SLICE_3_F8f} 176 }; 177 #if defined (BCM_TRIDENT3_SUPPORT) || defined (BCM_TOMAHAWK3_SUPPORT) 178 static soc_field_t classIdBfldtbl[4] = 179 { SLICE_0f, SLICE_1f, SLICE_2f, SLICE_3f }; 180 #endif 181 static soc_field_t dvpfldtbl[4] = 182 { SLICE_0f, SLICE_1f, SLICE_2f, SLICE_3f }; 183 184 static soc_field_t mdlfldtbl[4] = 185 { SLICE_0f, SLICE_1f, SLICE_2f, SLICE_3f }; 186 187 188 static const uint32 vfp_efp_virtual_to_physical_map[] = { 189 VIRTUAL_SLICE_0_PHYSICAL_SLICE_NUMBERf, 190 VIRTUAL_SLICE_1_PHYSICAL_SLICE_NUMBERf, 191 VIRTUAL_SLICE_2_PHYSICAL_SLICE_NUMBERf, 192 VIRTUAL_SLICE_3_PHYSICAL_SLICE_NUMBERf}; 193 static const int32 vfp_efp_virtual_to_group_map[] = { 194 VIRTUAL_SLICE_0_VIRTUAL_SLICE_GROUPf, 195 VIRTUAL_SLICE_1_VIRTUAL_SLICE_GROUPf, 196 VIRTUAL_SLICE_2_VIRTUAL_SLICE_GROUPf, 197 VIRTUAL_SLICE_3_VIRTUAL_SLICE_GROUPf}; 198 static const soc_field_t vfp_slice_wide_mode_flds[] = { 199 SLICE_0_DOUBLE_WIDE_MODEf, 200 SLICE_1_DOUBLE_WIDE_MODEf, 201 SLICE_2_DOUBLE_WIDE_MODEf, 202 SLICE_3_DOUBLE_WIDE_MODEf 203 }; 204 static const soc_field_t vfp_slice_pairing_flds[] = { 205 SLICE1_0_PAIRINGf, 206 SLICE3_2_PAIRINGf 207 }; 208 209 _bcm_field_action_set_t bcm_field_hx5_ifp_action_set[_FieldActionSetCount] = { 210 { 0, 0, 0}, /* for the actions which doesnt support aset */ 211 { 1, 0, PROTECTION_SWITCHING_DROP_OVERIDE_SETf}, 212 /* _FieldActionProtectionSwitchingDropOverrideSet */ 213 {10, 0, IFP_DLB_ALTERNATE_PATH_CONTROL_SETf}, 214 /* _FieldActionIfpDlbAlternatePathControlSet */ 215 { 2, 0, ECMP_DLB_ACTION_SETf}, 216 /* _FieldActionEcmpDlbActionSet */ 217 { 2, 0, HGT_LAG_DLB_ACTION_SETf}, 218 /* _FieldActionHgtLagDlbActionSet */ 219 { 2, 0, ECMP2_RH_ACTION_SETf}, 220 /* _FieldActionEcmp2RhActionSet */ 221 { 2, 0, ECMP1_RH_ACTION_SETf}, 222 /* _FieldActionEcmp1RhActionSet */ 223 { 2, 0, LAG_RH_ACTION_SETf}, 224 /* _FieldActionLagRhActionSet */ 225 { 2, 0, HGT_RH_ACTION_SETf}, 226 /* _FieldActionHgtRhActionSet */ 227 { 4, 0, LOOPBACK_PROFILE_ACTION_SETf}, 228 /* _FieldActionLoopbackProfileSet */ 229 {16, 0, EXTRACTION_CTRL_ID_ACTION_SETf}, /* _FieldActionExtractionCtrlId */ 230 {16, 0, OPAQUE_4_ACTION_SETf}, /* _FieldActionOpaque4Set */ 231 {16, 0, OPAQUE_3_ACTION_SETf}, /* _FieldActionOpaque3Set */ 232 {16, 0, OPAQUE_2_ACTION_SETf}, /* _FieldActionOpaque2Set */ 233 {16, 0, OPAQUE_1_ACTION_SETf}, /* _FieldActionOpaque1Set */ 234 { 2, 0, TX_TIMESTAMP_INSERTION_SETf}, 235 /*_FieldActionTxTimestampInsertionSet */ 236 { 2, 0, RX_TIMESTAMP_INSERTION_SETf}, 237 /*_FieldActionRxTimestampInsertionSet */ 238 { 1, 0, IGNORE_FCOE_ZONE_CHECK_SETf}, 239 /*_FieldActionIgnoreFCOEZoneCheckSet */ 240 { 1, 1, GREEN_TO_PID_SETf}, 241 /* _FieldActionGreenToPidSet */ 242 { 1, 0, MIRROR_OVERRIDE_SETf}, 243 /* _FieldActionMirrorOverrideSet */ 244 { 1, 0, NAT_OVERRIDE_SETf}, 245 /* _FieldActionNatOverrideSet*/ 246 { 1, 0, SFLOW_SETf}, 247 /* _FieldActionSflowSet */ 248 { 1, 0, CUT_THRU_OVERRIDE_SETf}, 249 /* _FieldActionCutThrOverrideSet */ 250 { 1, 0, URPF_OVERRIDE_SETf}, 251 /* _FieldActionUrpfOverrideSet */ 252 { 1, 0, TTL_OVERRIDE_SETf}, 253 /* _FieldActionTtlOverrideSet */ 254 { 3, 0, LB_CONTROLS_SETf}, 255 /* _FieldActionLbControlSet */ 256 { 6, 1, DROP_SETf}, 257 /* _FieldActionDropSet */ 258 { 8, 0, CHANGE_CPU_COS_SETf}, 259 /* _FieldActionChangeCpuCosSet */ 260 {12, 0, MIRROR_SETf}, 261 /* _FieldActionMirrorSet */ 262 {12, 0, NAT_SETf}, 263 /* _FieldActionNatSet ,*/ 264 {17, 1, COPY_TO_CPU_SETf}, 265 /* _FieldActionCopyToCpuSet */ 266 {23, 1, L3SW_CHANGE_L2_SETf}, 267 /* _FieldActionL3SwChangeL2Set */ 268 {38, 1, REDIRECT_SETf}, 269 /* IFP _FieldActionRedirectSet */ 270 {26, 1, COUNTER_SETf}, 271 /* _FieldActionCounterSet */ 272 { 9, 1, CHANGE_ECN_SETf}, 273 /* _FieldActionChangeEcnSet */ 274 {18, 1, CHANGE_PKT_PRI_SETf}, 275 /* _FieldActionChangePktPriSet */ 276 {25, 1, CHANGE_DSCP_TOS_SETf}, 277 /* _FieldActionChangeDscpTosSet */ 278 { 6, 1, CHANGE_DROP_PRECEDENCE_SETf}, 279 /*_FieldActionChangeDropPrecendenceSet */ 280 {42, 1, CHANGE_COS_OR_INT_PRI_SETf}, 281 /* _FieldActionChangeCosOrIntPriSet */ 282 { 9, 1, CHANGE_INT_CN_SETf}, 283 /* _FieldActionChangeIntCNSet */ 284 { 5, 0, CHANGE_INPUT_PRIORITY_SETf}, 285 /* _FieldActionChangeInputPrioritySet */ 286 { 1, 0, INSTRUMENTATION_SETf}, 287 /* _FieldActionInstrumentationSet */ 288 {16, 0, EDIT_CTRL_ID_ACTION_SETf}, /* _FieldActionEditCtrlIdSet */ 289 {16, 0, FCOE_VSAN_SETf}, /* _FieldActionFcoeVsanSet */ 290 {20, 1, METER_SETf}, /*_FieldActionMeterSet */ 291 { 0, 0, 0} /* _FieldActionTimestampInsertionSet */ 292 }; 293 294 _bcm_field_action_set_t bcm_field_td3_ifp_action_set[_FieldActionSetCount] = { 295 { 0, 0, 0}, /* for the actions which doesnt support aset */ 296 { 1, 0, PROTECTION_SWITCHING_DROP_OVERIDE_SETf}, 297 /* _FieldActionProtectionSwitchingDropOverrideSet */ 298 {10, 0, IFP_DLB_ALTERNATE_PATH_CONTROL_SETf}, 299 /* _FieldActionIfpDlbAlternatePathControlSet */ 300 { 2, 0, ECMP_DLB_ACTION_SETf}, 301 /* _FieldActionEcmpDlbActionSet */ 302 { 2, 0, HGT_LAG_DLB_ACTION_SETf}, 303 /* _FieldActionHgtLagDlbActionSet */ 304 { 2, 0, ECMP2_RH_ACTION_SETf}, 305 /* _FieldActionEcmp2RhActionSet */ 306 { 2, 0, ECMP1_RH_ACTION_SETf}, 307 /* _FieldActionEcmp1RhActionSet */ 308 { 2, 0, LAG_RH_ACTION_SETf}, 309 /* _FieldActionLagRhActionSet */ 310 { 2, 0, HGT_RH_ACTION_SETf}, 311 /* _FieldActionHgtRhActionSet */ 312 { 4, 0, LOOPBACK_PROFILE_ACTION_SETf}, 313 /* _FieldActionLoopbackProfileSet */ 314 {16, 0, EXTRACTION_CTRL_ID_ACTION_SETf}, /* _FieldActionExtractionCtrlId */ 315 {16, 0, OPAQUE_4_ACTION_SETf}, /* _FieldActionOpaque4Set */ 316 {16, 0, OPAQUE_3_ACTION_SETf}, /* _FieldActionOpaque3Set */ 317 {16, 0, OPAQUE_2_ACTION_SETf}, /* _FieldActionOpaque2Set */ 318 {16, 0, OPAQUE_1_ACTION_SETf}, /* _FieldActionOpaque1Set */ 319 { 2, 0, TX_TIMESTAMP_INSERTION_SETf}, 320 /*_FieldActionTxTimestampInsertionSet */ 321 { 2, 0, RX_TIMESTAMP_INSERTION_SETf}, 322 /*_FieldActionRxTimestampInsertionSet */ 323 { 1, 0, IGNORE_FCOE_ZONE_CHECK_SETf}, 324 /*_FieldActionIgnoreFCOEZoneCheckSet */ 325 { 1, 1, GREEN_TO_PID_SETf}, 326 /* _FieldActionGreenToPidSet */ 327 { 1, 0, MIRROR_OVERRIDE_SETf}, 328 /* _FieldActionMirrorOverrideSet */ 329 { 1, 0, NAT_OVERRIDE_SETf}, 330 /* _FieldActionNatOverrideSet*/ 331 { 1, 0, SFLOW_SETf}, 332 /* _FieldActionSflowSet */ 333 { 1, 0, CUT_THRU_OVERRIDE_SETf}, 334 /* _FieldActionCutThrOverrideSet */ 335 { 1, 0, URPF_OVERRIDE_SETf}, 336 /* _FieldActionUrpfOverrideSet */ 337 { 1, 0, TTL_OVERRIDE_SETf}, 338 /* _FieldActionTtlOverrideSet */ 339 { 3, 0, LB_CONTROLS_SETf}, 340 /* _FieldActionLbControlSet */ 341 { 6, 1, DROP_SETf}, 342 /* _FieldActionDropSet */ 343 { 8, 0, CHANGE_CPU_COS_SETf}, 344 /* _FieldActionChangeCpuCosSet */ 345 {12, 0, MIRROR_SETf}, 346 /* _FieldActionMirrorSet */ 347 {12, 0, NAT_SETf}, 348 /* _FieldActionNatSet ,*/ 349 {17, 1, COPY_TO_CPU_SETf}, 350 /* _FieldActionCopyToCpuSet */ 351 {23, 1, L3SW_CHANGE_L2_SETf}, 352 /* _FieldActionL3SwChangeL2Set */ 353 {38, 1, REDIRECT_SETf}, 354 /* IFP _FieldActionRedirectSet */ 355 {26, 1, COUNTER_SETf}, 356 /* _FieldActionCounterSet */ 357 { 9, 1, CHANGE_ECN_SETf}, 358 /* _FieldActionChangeEcnSet */ 359 {18, 1, CHANGE_PKT_PRI_SETf}, 360 /* _FieldActionChangePktPriSet */ 361 {25, 1, CHANGE_DSCP_TOS_SETf}, 362 /* _FieldActionChangeDscpTosSet */ 363 { 6, 1, CHANGE_DROP_PRECEDENCE_SETf}, 364 /*_FieldActionChangeDropPrecendenceSet */ 365 {36, 1, CHANGE_COS_OR_INT_PRI_SETf}, 366 /* _FieldActionChangeCosOrIntPriSet */ 367 { 9, 1, CHANGE_INT_CN_SETf}, 368 /* _FieldActionChangeIntCNSet */ 369 { 5, 0, CHANGE_INPUT_PRIORITY_SETf}, 370 /* _FieldActionChangeInputPrioritySet */ 371 { 1, 0, INSTRUMENTATION_SETf}, 372 /* _FieldActionInstrumentationSet */ 373 {16, 0, EDIT_CTRL_ID_ACTION_SETf}, /* _FieldActionEditCtrlIdSet */ 374 {16, 0, FCOE_VSAN_SETf}, /* _FieldActionFcoeVsanSet */ 375 {20, 1, METER_SETf}, /*_FieldActionMeterSet */ 376 { 0, 0, 0}, /* _FieldActionTimestampInsertionSet */ 377 { 0, 0, 0}, /* _FieldActionDelayedDropSet */ 378 { 0, 0, 0}, /* _FieldActionDelayedRedirectSet */ 379 { 0, 0, 0}, /* _FieldActionEcmpDlbMonitorSet */ 380 { 0, 0, 0}, /* _FieldActionElephantTrapSet */ 381 { 0, 0, 0} /* _FieldActionInbandTelemetrySet */ 382 }; 383 384 _bcm_field_action_set_t bcm_field_td3_em_action_set[_FieldActionSetCount] = { 385 { 0, 0, 0}, /* for the actions which doesnt support aset */ 386 { 1, 0, PROTECTION_SWITCHING_DROP_OVERIDE_SETf}, 387 /* _FieldActionProtectionSwitchingDropOverrideSet */ 388 {10, 0, IFP_DLB_ALTERNATE_PATH_CONTROL_SETf}, 389 /* _FieldActionIfpDlbAlternatePathControlSet */ 390 { 2, 0, ECMP_DLB_ACTION_SETf}, 391 /* _FieldActionEcmpDlbActionSet */ 392 { 2, 0, HGT_LAG_DLB_ACTION_SETf}, 393 /* _FieldActionHgtLagDlbActionSet */ 394 { 2, 0, ECMP2_RH_ACTION_SETf}, 395 /* _FieldActionEcmp2RhActionSet */ 396 { 2, 0, ECMP1_RH_ACTION_SETf}, 397 /* _FieldActionEcmp1RhActionSet */ 398 { 2, 0, LAG_RH_ACTION_SETf}, 399 /* _FieldActionLagRhActionSet */ 400 { 2, 0, HGT_RH_ACTION_SETf}, 401 /* _FieldActionHgtRhActionSet */ 402 { 4, 0, LOOPBACK_PROFILE_ACTION_SETf}, 403 /* _FieldActionLoopbackProfileSet */ 404 {16, 0, EXTRACTION_CTRL_ID_ACTION_SETf}, /* _FieldActionExtractionCtrlId */ 405 {16, 0, OPAQUE_4_ACTION_SETf}, /* _FieldActionOpaque4Set */ 406 {16, 0, OPAQUE_3_ACTION_SETf}, /* _FieldActionOpaque3Set */ 407 {16, 0, OPAQUE_2_ACTION_SETf}, /* _FieldActionOpaque2Set */ 408 {16, 0, OPAQUE_1_ACTION_SETf}, /* _FieldActionOpaque1Set */ 409 { 2, 0, TX_TIMESTAMP_INSERTION_SETf}, /*_FieldActionTxTimestampInsertionSet */ 410 { 2, 0, RX_TIMESTAMP_INSERTION_SETf}, /*_FieldActionRxTimestampInsertionSet */ 411 { 1, 0, IGNORE_FCOE_ZONE_CHECK_SETf}, /*_FieldActionIgnoreFCOEZoneCheckSet */ 412 { 1, 1, GREEN_TO_PID_SETf}, 413 /* _FieldActionGreenToPidSet */ 414 { 1, 0, MIRROR_OVERRIDE_SETf}, 415 /* _FieldActionMirrorOverrideSet */ 416 { 1, 0, NAT_OVERRIDE_SETf}, 417 /* _FieldActionNatOverrideSet */ 418 { 1, 0, SFLOW_SETf}, 419 /* _FieldActionSflowSet */ 420 { 1, 0, CUT_THRU_OVERRIDE_SETf}, 421 /* _FieldActionCutThrOverrideSet */ 422 { 1, 0, URPF_OVERRIDE_SETf}, 423 /* _FieldActionUrpfOverrideSet */ 424 { 1, 0, TTL_OVERRIDE_SETf}, 425 /* _FieldActionTtlOverrideSet */ 426 { 3, 0, LB_CONTROLS_SETf}, 427 /* _FieldActionLbControlSet */ 428 { 6, 1, DROP_SETf}, 429 /* _FieldActionDropSet */ 430 { 8, 0, CHANGE_CPU_COS_SETf}, 431 /* _FieldActionChangeCpuCosSet */ 432 {12, 0, MIRROR_SETf}, 433 /* _FieldActionMirrorSet */ 434 {12, 0, NAT_SETf}, 435 /* _FieldActionNatSet */ 436 {17, 1, COPY_TO_CPU_SETf}, 437 /* _FieldActionCopyToCpuSet */ 438 {23, 1, L3SW_CHANGE_L2_SETf}, 439 /* _FieldActionL3SwChangeL2Set */ 440 {25, 1, EXACT_MATCH_REDIRECT_SETf}, 441 /* EP _FieldActionRedirectSet */ 442 {26, 1, COUNTER_SETf}, 443 /* _FieldActionCounterSet */ 444 { 0, 0, 0}, /* _FieldActionChangeEcnSet */ 445 { 0, 0, 0}, /* _FieldActionChangePktPriSet */ 446 { 0, 0, 0}, /* _FieldActionChangeDscpTosSet */ 447 { 0, 0, 0}, /* _FieldActionChangeDropPrecendenceSet */ 448 { 0, 0, 0}, /* _FieldActionChangeCosOrIntPriSet */ 449 { 0, 0, 0}, /* _FieldActionChangeIntCNSet */ 450 { 0, 0, 0}, /* _FieldActionChangeInputPrioritySet */ 451 { 1, 0, INSTRUMENTATION_SETf}, /* _FieldActionInstrumentationSet */ 452 {16, 0, EDIT_CTRL_ID_ACTION_SETf}, /* _FieldActionEditCtrlIdSet */ 453 { 1, 0, FCOE_VSAN_SETf}, /* _FieldActionFcoeVsanSet */ 454 {20, 1, METER_SETf}, /*_FieldActionMeterSet */ 455 { 0, 0, 0}, /* _FieldActionTimestampInsertionSet */ 456 { 0, 0, 0}, /* _FieldActionDelayedDropSet */ 457 { 0, 0, 0}, /* _FieldActionDelayedRedirectSet */ 458 { 0, 0, 0}, /* _FieldActionEcmpDlbMonitorSet */ 459 { 0, 0, 0}, /* _FieldActionElephantTrapSet */ 460 { 0, 0, 0} /* _FieldActionInbandTelemetrySet */ 461 }; 462 463 _bcm_field_action_set_t bcm_field_th_em_action_set[_FieldActionSetCount] = { 464 { 0, 0, 0}, /* for the actions which doesnt support aset */ 465 { 0, 0, 0}, 466 /* _FieldActionProtectionSwitchingDropOverrideSet */ 467 { 0, 0, 0}, 468 /* _FieldActionIfpDlbAlternatePathControlSet */ 469 { 0, 0, 0}, 470 /* _FieldActionEcmpDlbActionSet */ 471 { 0, 0, 0}, 472 /* _FieldActionHgtLagDlbActionSet */ 473 { 0, 0, 0}, 474 /* _FieldActionEcmp2RhActionSet */ 475 { 0, 0, 0}, 476 /* _FieldActionEcmp1RhActionSet */ 477 { 0, 0, 0}, 478 /* _FieldActionLagRhActionSet */ 479 { 0, 0, 0}, 480 /* _FieldActionHgtRhActionSet */ 481 { 0, 0, 0}, /* _FieldActionLoopbackProfileSet = 1,*/ 482 { 0, 0, 0}, /* _FieldActionExtractionCtrlId = 2,*/ 483 { 0, 0, 0}, /* _FieldActionOpaque4Set = 3,*/ 484 { 0, 0, 0}, /* _FieldActionOpaque3Set = 4,*/ 485 { 0, 0, 0}, /* _FieldActionOpaque2Set = 5,*/ 486 { 0, 0, 0}, /* _FieldActionOpaque1Set = 6,*/ 487 { 0, 0, 0}, /* _FieldActionTxTimestampInsertionSet = 7,*/ 488 { 0, 0, 0}, /* _FieldActionRxTimestampInsertionSet = 8,*/ 489 { 0, 0, 0}, /* _FieldActionIgnoreFCOEZoneCheckSet = 9,*/ 490 { 1, 1, GREEN_TO_PID_SET_ENABLEf}, 491 /* _FieldActionGreenToPidSet = 10, */ 492 { 1, 0, MIRROR_OVERRIDE_SET_ENABLEf}, 493 /* _FieldActionMirrorOverrideSet = 11,*/ 494 { 1, 0, NAT_OVERRIDE_SET_ENABLEf}, 495 /* _FieldActionNatOverrideSet = 12,*/ 496 { 1, 0, SFLOW_SET_ENABLEf}, 497 /* _FieldActionSflowSet = 13,*/ 498 { 1, 0, CUT_THRU_OVERRIDE_SET_ENABLEf}, 499 /* _FieldActionCutThrOverrideSet = 14,*/ 500 { 1, 0, URPF_OVERRIDE_SET_ENABLEf}, 501 /* _FieldActionUrpfOverrideSet = 15, */ 502 { 1, 0, TTL_OVERRIDE_SET_ENABLEf}, 503 /* _FieldActionTtlOverrideSet = 16,*/ 504 { 3, 0, LB_CONTROLS_SET_ENABLEf}, 505 /* _FieldActionLbControlSet = 17,*/ 506 { 6, 1, DROP_SET_ENABLEf}, 507 /* _FieldActionDropSet = 18, */ 508 { 8, 0, CHANGE_CPU_COS_SET_ENABLEf}, 509 /* _FieldActionChangeCpuCosSet = 19, */ 510 {12, 0, MIRROR_SET_ENABLEf}, 511 /* _FieldActionMirrorSet = 20, */ 512 {12, 0, NAT_SET_ENABLEf}, 513 /* _FieldActionNatSet = 21,*/ 514 {17, 1, COPY_TO_CPU_SET_ENABLEf}, 515 /* _FieldActionCopyToCpuSet = 22,*/ 516 {23, 1, L3SW_CHANGE_L2_SET_ENABLEf}, 517 /* _FieldActionL3SwChangeL2Set = 23,*/ 518 {25, 1, EXACT_MATCH_REDIRECT_SET_ENABLEf}, 519 /* EM _FieldActionRedirectSet = 24,*/ 520 {25, 1, COUNTER_SET_ENABLEf}, 521 /* _FieldActionCounterSet */ 522 { 0, 0, 0}, /* _FieldActionChangeEcnSet */ 523 { 0, 0, 0}, /* _FieldActionChangePktPriSet */ 524 { 0, 0, 0}, /* _FieldActionChangeDscpTosSet */ 525 { 0, 0, 0}, /* _FieldActionChangeDropPrecendenceSet */ 526 { 0, 0, 0}, /* _FieldActionChangeCosOrIntPriSet */ 527 { 0, 0, 0}, /* _FieldActionChangeIntCNSet */ 528 { 0, 0, 0}, /* _FieldActionChangeInputPrioritySet */ 529 { 0, 0, 0}, /* _FieldActionInstrumentationSet */ 530 { 0, 0, 0}, /* _FieldActionEditCtrlIdSet */ 531 { 0, 0, 0}, /* _FieldActionFcoeVsanSet */ 532 {18, 1, METER_SET_ENABLEf}, /*_FieldActionMeterSet */ 533 { 0, 0, 0}, /* _FieldActionTimestampInsertionSet */ 534 { 0, 0, 0}, /* _FieldActionDelayedDropSet */ 535 { 0, 0, 0}, /* _FieldActionDelayedRedirectSet */ 536 { 0, 0, 0}, /* _FieldActionEcmpDlbMonitorSet */ 537 { 0, 0, 0}, /* _FieldActionElephantTrapSet */ 538 { 0, 0, 0} /* _FieldActionInbandTelemetrySet */ 539 }; 540 541 _bcm_field_action_set_t bcm_field_th2_em_action_set[_FieldActionSetCount] = { 542 { 0, 0, 0}, /* for the actions which doesnt support aset */ 543 { 1, 0, PROTECTION_SWITCHING_SET_ENABLEf}, /* _FieldActionProtectionSwitchingDropOverrideSet */ 544 { 10, 0, DLB_ALTERNATE_PATH_CONTROL_SET_ENABLEf}, 545 /* _FieldActionIfpDlbAlternatePathControlSet */ 546 { 2, 0, DLB_ECMP_SET_ENABLEf}, 547 /* _FieldActionEcmpDlbActionSet */ 548 { 2, 0, DLB_HGT_LAG_SET_ENABLEf}, 549 /* _FieldActionHgtLagDlbActionSet */ 550 { 0, 0, 0}, 551 /* _FieldActionEcmp2RhActionSet */ 552 { 0, 0, 0}, 553 /* _FieldActionEcmp1RhActionSet */ 554 { 0, 0, 0}, 555 /* _FieldActionLagRhActionSet */ 556 { 0, 0, 0}, 557 /* _FieldActionHgtRhActionSet */ 558 { 0, 0, 0}, /* _FieldActionLoopbackProfileSet = 1,*/ 559 { 0, 0, 0}, /* _FieldActionExtractionCtrlId = 2,*/ 560 { 0, 0, 0}, /* _FieldActionOpaque4Set = 3,*/ 561 { 0, 0, 0}, /* _FieldActionOpaque3Set = 4,*/ 562 { 0, 0, 0}, /* _FieldActionOpaque2Set = 5,*/ 563 { 0, 0, 0}, /* _FieldActionOpaque1Set = 6,*/ 564 { 0, 0, 0}, /* _FieldActionTxTimestampInsertionSet = 7,*/ 565 { 0, 0, 0}, /* _FieldActionRxTimestampInsertionSet = 8,*/ 566 { 0, 0, 0}, /* _FieldActionIgnoreFCOEZoneCheckSet = 9,*/ 567 { 1, 1, GREEN_TO_PID_SET_ENABLEf}, 568 /* _FieldActionGreenToPidSet = 10, */ 569 { 1, 0, MIRROR_OVERRIDE_SET_ENABLEf}, 570 /* _FieldActionMirrorOverrideSet = 11,*/ 571 { 1, 0, NAT_OVERRIDE_SET_ENABLEf}, 572 /* _FieldActionNatOverrideSet = 12,*/ 573 { 1, 0, SFLOW_SET_ENABLEf}, 574 /* _FieldActionSflowSet = 13,*/ 575 { 1, 0, CUT_THRU_OVERRIDE_SET_ENABLEf}, 576 /* _FieldActionCutThrOverrideSet = 14,*/ 577 { 1, 0, URPF_OVERRIDE_SET_ENABLEf}, 578 /* _FieldActionUrpfOverrideSet = 15, */ 579 { 1, 0, TTL_OVERRIDE_SET_ENABLEf}, 580 /* _FieldActionTtlOverrideSet = 16,*/ 581 { 3, 0, LB_CONTROLS_SET_ENABLEf}, 582 /* _FieldActionLbControlSet = 17,*/ 583 { 6, 1, DROP_SET_ENABLEf}, 584 /* _FieldActionDropSet = 18, */ 585 { 8, 0, CHANGE_CPU_COS_SET_ENABLEf}, 586 /* _FieldActionChangeCpuCosSet = 19, */ 587 {12, 0, MIRROR_SET_ENABLEf}, 588 /* _FieldActionMirrorSet = 20, */ 589 {12, 0, NAT_SET_ENABLEf}, 590 /* _FieldActionNatSet = 21,*/ 591 {17, 1, COPY_TO_CPU_SET_ENABLEf}, 592 /* _FieldActionCopyToCpuSet = 22,*/ 593 {23, 1, L3SW_CHANGE_L2_SET_ENABLEf}, 594 /* _FieldActionL3SwChangeL2Set = 23,*/ 595 {25, 1, EXACT_MATCH_REDIRECT_SET_ENABLEf}, 596 /* EM _FieldActionRedirectSet = 24,*/ 597 {26, 1, COUNTER_SET_ENABLEf}, 598 /* _FieldActionCounterSet */ 599 { 0, 0, 0}, /* _FieldActionChangeEcnSet */ 600 { 0, 0, 0}, /* _FieldActionChangePktPriSet */ 601 { 0, 0, 0}, /* _FieldActionChangeDscpTosSet */ 602 { 0, 0, 0}, /* _FieldActionChangeDropPrecendenceSet */ 603 { 0, 0, 0}, /* _FieldActionChangeCosOrIntPriSet */ 604 { 0, 0, 0}, /* _FieldActionChangeIntCNSet */ 605 { 0, 0, 0}, /* _FieldActionChangeInputPrioritySet */ 606 { 1, 0, INSTRUMENTATION_SET_ENABLEf}, /* _FieldActionInstrumentationSet */ 607 { 0, 0, 0}, /* _FieldActionEditCtrlIdSet */ 608 { 0, 0, 0}, /* _FieldActionFcoeVsanSet */ 609 {18, 1, METER_SET_ENABLEf}, /*_FieldActionMeterSet */ 610 { 4, 0, TIMESTAMP_SET_ENABLEf}, /*_FieldActionTimestampInsertionSet*/ 611 { 0, 0, 0}, /* _FieldActionDelayedDropSet */ 612 { 0, 0, 0}, /* _FieldActionDelayedRedirectSet */ 613 { 0, 0, 0}, /* _FieldActionEcmpDlbMonitorSet */ 614 { 0, 0, 0}, /* _FieldActionElephantTrapSet */ 615 { 0, 0, 0} /* _FieldActionInbandTelemetrySet */ 616 }; 617 618 _bcm_field_action_set_t bcm_field_th3_em_action_set[_FieldActionSetCount] = { 619 { 0, 0, 0}, /* for the actions which doesnt support aset */ 620 { 1, 0, PROTECTION_SWITCHING_SET_ENABLEf}, 621 /* _FieldActionProtectionSwitchingDropOverrideSet = 1 */ 622 { 10, 0, DLB_ALTERNATE_PATH_CONTROL_SET_ENABLEf}, 623 /* _FieldActionIfpDlbAlternatePathControlSet = 2 */ 624 { 2, 0, DLB_ECMP_SET_ENABLEf}, 625 /* _FieldActionEcmpDlbActionSet =3 */ 626 { 0, 0, 0}, 627 /* _FieldActionHgtLagDlbActionSet = 4 */ 628 { 0, 0, 0}, 629 /* _FieldActionEcmp2RhActionSet = 5 */ 630 { 0, 0, 0}, 631 /* _FieldActionEcmp1RhActionSet = 6 */ 632 { 0, 0, 0}, 633 /* _FieldActionLagRhActionSet = 7 */ 634 { 0, 0, 0}, 635 /* _FieldActionHgtRhActionSet = 8 */ 636 { 0, 0, 0}, /* _FieldActionLoopbackProfileSet = 9,*/ 637 { 0, 0, 0}, /* _FieldActionExtractionCtrlId = 10,*/ 638 { 0, 0, 0}, /* _FieldActionOpaque4Set = 11,*/ 639 { 0, 0, 0}, /* _FieldActionOpaque3Set = 12,*/ 640 { 0, 0, 0}, /* _FieldActionOpaque2Set = 13,*/ 641 { 0, 0, 0}, /* _FieldActionOpaque1Set = 14,*/ 642 { 0, 0, 0}, /* _FieldActionTxTimestampInsertionSet = 15,*/ 643 { 0, 0, 0}, /* _FieldActionRxTimestampInsertionSet = 16,*/ 644 { 0, 0, 0}, /* _FieldActionIgnoreFCOEZoneCheckSet = 17,*/ 645 { 1, 1, GREEN_TO_PID_SET_ENABLEf}, 646 /* _FieldActionGreenToPidSet = 18, */ 647 { 1, 0, MIRROR_OVERRIDE_SET_ENABLEf}, 648 /* _FieldActionMirrorOverrideSet = 19,*/ 649 { 0, 0, 0}, 650 /* _FieldActionNatOverrideSet = 20,*/ 651 { 1, 0, SFLOW_SET_ENABLEf}, 652 /* _FieldActionSflowSet = 21,*/ 653 { 1, 0, CUT_THRU_OVERRIDE_SET_ENABLEf}, 654 /* _FieldActionCutThrOverrideSet = 22,*/ 655 { 0, 0, 0}, 656 /* _FieldActionUrpfOverrideSet = 23, */ 657 { 1, 0, TTL_OVERRIDE_SET_ENABLEf}, 658 /* _FieldActionTtlOverrideSet = 24,*/ 659 { 2, 0, LB_CONTROLS_SET_ENABLEf}, 660 /* _FieldActionLbControlSet = 25,*/ 661 { 6, 1, DROP_SET_ENABLEf}, 662 /* _FieldActionDropSet = 26, */ 663 { 8, 0, CHANGE_CPU_COS_SET_ENABLEf}, 664 /* _FieldActionChangeCpuCosSet = 27, */ 665 {15, 0, MIRROR_SET_ENABLEf}, 666 /* _FieldActionMirrorSet = 28, */ 667 { 0, 0, 0}, 668 /* _FieldActionNatSet = 29,*/ 669 {17, 1, COPY_TO_CPU_SET_ENABLEf}, 670 /* _FieldActionCopyToCpuSet = 30,*/ 671 {23, 1, L3SW_CHANGE_L2_SET_ENABLEf}, 672 /* _FieldActionL3SwChangeL2Set = 31,*/ 673 {25, 1, EXACT_MATCH_REDIRECT_SET_ENABLEf}, 674 /* EM _FieldActionRedirectSet = 32,*/ 675 {25, 1, COUNTER_SET_ENABLEf}, 676 /* _FieldActionCounterSet = 33 */ 677 { 0, 0, 0}, /* _FieldActionChangeEcnSet = 34 */ 678 { 0, 0, 0}, /* _FieldActionChangePktPriSet = 35 */ 679 { 0, 0, 0}, /* _FieldActionChangeDscpTosSet = 36 */ 680 { 0, 0, 0}, /* _FieldActionChangeDropPrecendenceSet = 37 */ 681 { 0, 0, 0}, /* _FieldActionChangeCosOrIntPriSet = 38 */ 682 { 0, 0, 0}, /* _FieldActionChangeIntCNSet = 39 */ 683 { 0, 0, 0}, /* _FieldActionChangeInputPrioritySet = 40 */ 684 { 1, 0, INSTRUMENTATION_SET_ENABLEf}, 685 /* _FieldActionInstrumentationSet = 41 */ 686 { 0, 0, 0}, /* _FieldActionEditCtrlIdSet = 42 */ 687 { 0, 0, 0}, /* _FieldActionFcoeVsanSet = 43 */ 688 {16, 1, METER_SET_ENABLEf}, /*_FieldActionMeterSet = 44 */ 689 { 4, 0, TIMESTAMP_SET_ENABLEf}, /*_FieldActionTimestampInsertionSet = 45 */ 690 { 8, 0, DELAYED_DROP_SET_ENABLEf}, /* _FieldActionDelayedDropSet = 46 */ 691 {16, 0, DELAYED_REDIRECT_SET_ENABLEf}, /* _FieldActionDelayedRedirectSet = 47 */ 692 { 2, 0, DLB_ECMP_MONITOR_SET_ENABLEf}, /* _FieldActionEcmpDlbMonitorSet = 48 */ 693 { 6, 0, ELEPHANT_TRAP_SET_ENABLEf}, /* _FieldActionElephantTrapSet = 49 */ 694 { 2, 0, INBAND_TELEMETRY_SET_ENABLEf} /* _FieldActionInbandTelemetrySet = 50 */ 695 }; 696 697 698 /* Function declarations */ 699 STATIC int _field_th_stage_quals_ibus_map_init(int unit, 700 _field_stage_t *stage_fc); 701 702 STATIC int _field_th_stage_extractors_init(int unit, _field_stage_t *stage_fc); 703 704 STATIC int _field_ser_oper_mode_init(int unit, 705 int stage_id, 706 bcm_field_group_oper_mode_t mode); 707 STATIC int 708 _field_th_ingress_tcam_policy_clear(int unit, _field_entry_t *f_ent, 709 int tcam_idx); 710 711 extern int 712 _bcm_field_th_control_get(int unit, _field_control_t *fc, 713 bcm_field_control_t control, uint32 *state); 714 /* 715 * Function: _bcm_field_th_control_set 716 * 717 * Purpose: 718 * Set control status. 719 * 720 * Parameters: 721 * unit - (IN) BCM device number. 722 * control - (IN) Control element to set. 723 * state - (IN) State (0/1). 724 * 725 * Returns: 726 * BCM_E_NONE - Success 727 * BCM_E_INIT - BCM unit not initialized 728 * BCM_E_PARAM - Flag state not valid on device 729 */ 730 int 731 _bcm_field_th_control_set(int unit, _field_control_t *fc, 732 bcm_field_control_t control, uint32 state) 733 { 734 int rv = BCM_E_UNAVAIL; /* Operation return status. */ 735 uint32 reg_values[2]; /* Register value buffer. */ 736 soc_field_t reg_fields[2]; /* Register fields to modify. */ 737 int field_count = 2; /* Number of updated fields. */ 738 soc_reg_t ifp_dst_action_reg; 739 740 reg_values[0] = reg_values[1] = (state == TRUE) ? 1: 0; 741 742 if (NULL == fc) { 743 return BCM_E_PARAM; 744 } 745 746 #if defined (BCM_TOMAHAWK3_SUPPORT) 747 if (SOC_IS_TOMAHAWK3(unit)) { 748 ifp_dst_action_reg = SW_IFP_DST_ACTION_CONTROLr; 749 } else 750 #endif 751 { 752 ifp_dst_action_reg = SW2_IFP_DST_ACTION_CONTROLr; 753 } 754 755 switch (control) { 756 case bcmFieldControlRedirectIngressVlanCheck: 757 reg_fields[0] = VLAN_CHECK_ENf; 758 field_count = 1; 759 rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg, 760 REG_PORT_ANY, field_count, 761 reg_fields, reg_values); 762 break; 763 case bcmFieldControlRedirectNonUcastTrunkResolve: 764 reg_fields[0] = LAG_RES_ENf; 765 reg_fields[1] = HGTRUNK_RES_ENf; 766 field_count = 2; 767 rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg, 768 REG_PORT_ANY, field_count, 769 reg_fields, reg_values); 770 break; 771 case bcmFieldControlRedirectNonUcastEtherTrunkResolve: 772 reg_fields[0] = LAG_RES_ENf; 773 field_count = 1; 774 rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg, 775 REG_PORT_ANY, field_count, 776 reg_fields, reg_values); 777 break; 778 case bcmFieldControlRedirectNonUcastFabricTrunkResolve: 779 if (SOC_IS_TOMAHAWK3(unit)) { 780 return BCM_E_UNAVAIL; 781 } 782 reg_fields[0] = HGTRUNK_RES_ENf; 783 field_count = 1; 784 rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg, 785 REG_PORT_ANY, field_count, 786 reg_fields, reg_values); 787 break; 788 case bcmFieldControlRedirectExcludeSrcPort: 789 reg_fields[0] = HG_SRC_REMOVAL_ENf; 790 reg_fields[1] = SRC_REMOVAL_ENf; 791 field_count = 2; 792 rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg, 793 REG_PORT_ANY, field_count, 794 reg_fields, reg_values); 795 break; 796 case bcmFieldControlRedirectExcludeEtherSrcPort: 797 reg_fields[0] = SRC_REMOVAL_ENf; 798 field_count = 1; 799 rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg, 800 REG_PORT_ANY, field_count, 801 reg_fields, reg_values); 802 break; 803 case bcmFieldControlRedirectExcludeHiGigSrcPort: 804 reg_fields[0] = HG_SRC_REMOVAL_ENf; 805 field_count = 1; 806 rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg, 807 REG_PORT_ANY, field_count, 808 reg_fields, reg_values); 809 break; 810 case bcmFieldControlRedirectPortFloodBlock: 811 reg_fields[0] = PORT_BLOCK_ENf; 812 field_count = 1; 813 rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg, 814 REG_PORT_ANY, field_count, 815 reg_fields, reg_values); 816 break; 817 case bcmFieldControlRedirectVlanFloodBlock: 818 reg_fields[0] = VLAN_BLOCK_ENf; 819 field_count = 1; 820 rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg, 821 REG_PORT_ANY, field_count, 822 reg_fields, reg_values); 823 break; 824 case bcmFieldControlRedirectNextHopExcludeSrcPort: 825 reg_fields[0] = SRC_REMOVAL_EN_FOR_REDIRECT_TO_NHIf; 826 field_count = 1; 827 rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg, 828 REG_PORT_ANY, field_count, 829 reg_fields, reg_values); 830 break; 831 case bcmFieldControlEcmpHashOffset: 832 if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) { 833 return BCM_E_UNAVAIL; 834 } 835 rv = soc_reg_field32_modify(unit, IFP_ECMP_HASH_CONTROLr, 836 REG_PORT_ANY, 837 ECMP_HASH_SALTf, state); 838 break; 839 case bcmFieldControlEcmpHashUseCrc: 840 if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) { 841 return BCM_E_UNAVAIL; 842 } 843 rv = soc_reg_field32_modify(unit, IFP_ECMP_HASH_CONTROLr, 844 REG_PORT_ANY, 845 USE_CRCf, state); 846 break; 847 case bcmFieldControlEcmpHashUseUpper5Bits: 848 if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) { 849 return BCM_E_UNAVAIL; 850 } 851 rv = soc_reg_field32_modify(unit, IFP_ECMP_HASH_CONTROLr, 852 REG_PORT_ANY, 853 USE_UPPERf, state); 854 break; 855 case bcmFieldControlEcmpHashEnable: 856 if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) { 857 return BCM_E_UNAVAIL; 858 } 859 rv = soc_reg_field32_modify(unit, IFP_ECMP_HASH_CONTROLr, 860 REG_PORT_ANY, 861 ENABLEf, state); 862 break; 863 864 case bcmFieldControlDlbMonitorIngressRandomSeed: 865 if(SOC_REG_IS_VALID(unit, DLB_ECMP_MONITOR_IFP_CONTROLr)) { 866 uint32 seed; 867 seed = (1 << soc_reg_field_length(unit, 868 DLB_ECMP_MONITOR_IFP_CONTROLr, SEEDf)) - 1; 869 if (state >= seed) { 870 return BCM_E_PARAM; 871 } 872 if (0 == state) { 873 /* Restore to default */ 874 BCM_IF_ERROR_RETURN(_bcm_field_th_control_get(unit, fc, control, &seed)); 875 if (seed == 0) { 876 return BCM_E_PARAM; 877 } 878 } 879 rv = WRITE_DLB_ECMP_MONITOR_IFP_CONTROLr(unit, state); 880 } 881 break; 882 case bcmFieldControlGbpSrcMacMcastBitSet: 883 #if defined(BCM_TRIDENT3_SUPPORT) 884 if (SOC_REG_IS_VALID(unit, EGR_GBP_CONTROLr)) { 885 if (state > BCM_FIELD_GBP_SRC_ID_EQ_DST_ID) { 886 return BCM_E_PARAM; 887 } 888 rv = soc_reg_field32_modify(unit, EGR_GBP_CONTROLr, 889 REG_PORT_ANY, 890 GBP_SID_DID_CHECK_POLICYf, state); 891 } 892 #endif /* (BCM_TRIDENT3_SUPPORT) */ 893 break; 894 default: 895 rv = _bcm_field_control_set(unit, fc, control, state); 896 } 897 898 return rv; 899 } 900 /* 901 * Function: _bcm_field_th_control_get 902 * 903 * Purpose: 904 * Get control status info. 905 * 906 * Parameters: 907 * unit - (IN) BCM device number. 908 * control - (IN) Control element to get. 909 * status - (OUT) Status of field element. 910 * 911 * Returns: 912 * BCM_E_UNAVAIL - field control is not available 913 * BCM_E_PARAM - *state pointing to NULL 914 * BCM_E_NONE - Success 915 */ 916 int 917 _bcm_field_th_control_get(int unit, _field_control_t *fc, 918 bcm_field_control_t control, uint32 *state) 919 { 920 921 uint32 reg_val; /* Register value buffer. */ 922 int rv = BCM_E_UNAVAIL; /* Operation return status. */ 923 soc_reg_t ifp_dst_action_reg; 924 925 if (NULL == state || NULL == fc) { 926 return BCM_E_PARAM; 927 } 928 929 #if defined (BCM_TOMAHAWK3_SUPPORT) 930 if (SOC_IS_TOMAHAWK3(unit)) { 931 ifp_dst_action_reg = SW_IFP_DST_ACTION_CONTROLr; 932 } else 933 #endif 934 { 935 ifp_dst_action_reg = SW2_IFP_DST_ACTION_CONTROLr; 936 } 937 938 switch (control) { 939 case bcmFieldControlRedirectIngressVlanCheck: 940 #if defined (BCM_TOMAHAWK3_SUPPORT) 941 if (SOC_IS_TOMAHAWK3(unit)) { 942 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, ®_val); 943 } else 944 #endif 945 { 946 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, ®_val); 947 } 948 if (BCM_SUCCESS(rv)) { 949 *state = soc_reg_field_get(unit, 950 ifp_dst_action_reg, 951 reg_val, 952 VLAN_CHECK_ENf); 953 } 954 break; 955 case bcmFieldControlRedirectNonUcastTrunkResolve: 956 #if defined (BCM_TOMAHAWK3_SUPPORT) 957 if (SOC_IS_TOMAHAWK3(unit)) { 958 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, ®_val); 959 } else 960 #endif 961 { 962 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, ®_val); 963 } 964 if (BCM_SUCCESS(rv)) { 965 *state = soc_reg_field_get(unit, 966 ifp_dst_action_reg, 967 reg_val, 968 LAG_RES_ENf); 969 } 970 break; 971 case bcmFieldControlRedirectNonUcastEtherTrunkResolve: 972 #if defined (BCM_TOMAHAWK3_SUPPORT) 973 if (SOC_IS_TOMAHAWK3(unit)) { 974 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, ®_val); 975 } else 976 #endif 977 { 978 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, ®_val); 979 } 980 if (BCM_SUCCESS(rv)) { 981 *state = soc_reg_field_get(unit, 982 ifp_dst_action_reg, 983 reg_val, 984 LAG_RES_ENf); 985 } 986 break; 987 case bcmFieldControlRedirectNonUcastFabricTrunkResolve: 988 if (SOC_IS_TOMAHAWK3(unit)) { 989 return BCM_E_UNAVAIL; 990 } 991 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, ®_val); 992 if (BCM_SUCCESS(rv)) { 993 *state = soc_reg_field_get(unit, 994 ifp_dst_action_reg, 995 reg_val, 996 HGTRUNK_RES_ENf); 997 } 998 break; 999 case bcmFieldControlRedirectExcludeSrcPort: 1000 #if defined (BCM_TOMAHAWK3_SUPPORT) 1001 if (SOC_IS_TOMAHAWK3(unit)) { 1002 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1003 } else 1004 #endif 1005 { 1006 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1007 } 1008 if (BCM_SUCCESS(rv)) { 1009 *state = soc_reg_field_get(unit, 1010 ifp_dst_action_reg, 1011 reg_val, 1012 SRC_REMOVAL_ENf); 1013 } 1014 break; 1015 case bcmFieldControlRedirectExcludeEtherSrcPort: 1016 #if defined (BCM_TOMAHAWK3_SUPPORT) 1017 if (SOC_IS_TOMAHAWK3(unit)) { 1018 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1019 } else 1020 #endif 1021 { 1022 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1023 } 1024 if (BCM_SUCCESS(rv)) { 1025 *state = soc_reg_field_get(unit, 1026 ifp_dst_action_reg, 1027 reg_val, 1028 SRC_REMOVAL_ENf); 1029 } 1030 break; 1031 case bcmFieldControlRedirectExcludeHiGigSrcPort: 1032 #if defined (BCM_TOMAHAWK3_SUPPORT) 1033 if (SOC_IS_TOMAHAWK3(unit)) { 1034 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1035 } else 1036 #endif 1037 { 1038 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1039 } 1040 if (BCM_SUCCESS(rv)) { 1041 *state = soc_reg_field_get(unit, 1042 ifp_dst_action_reg, 1043 reg_val, 1044 HG_SRC_REMOVAL_ENf); 1045 } 1046 break; 1047 case bcmFieldControlRedirectPortFloodBlock: 1048 #if defined (BCM_TOMAHAWK3_SUPPORT) 1049 if (SOC_IS_TOMAHAWK3(unit)) { 1050 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1051 } else 1052 #endif 1053 { 1054 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1055 } 1056 if (BCM_SUCCESS(rv)) { 1057 *state = soc_reg_field_get(unit, 1058 ifp_dst_action_reg, 1059 reg_val, 1060 PORT_BLOCK_ENf); 1061 } 1062 break; 1063 case bcmFieldControlRedirectVlanFloodBlock: 1064 #if defined (BCM_TOMAHAWK3_SUPPORT) 1065 if (SOC_IS_TOMAHAWK3(unit)) { 1066 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1067 } else 1068 #endif 1069 { 1070 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1071 } 1072 if (BCM_SUCCESS(rv)) { 1073 *state = soc_reg_field_get(unit, 1074 ifp_dst_action_reg, 1075 reg_val, 1076 VLAN_BLOCK_ENf); 1077 } 1078 break; 1079 case bcmFieldControlRedirectNextHopExcludeSrcPort: 1080 #if defined (BCM_TOMAHAWK3_SUPPORT) 1081 if (SOC_IS_TOMAHAWK3(unit)) { 1082 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1083 } else 1084 #endif 1085 { 1086 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, ®_val); 1087 } 1088 if (BCM_SUCCESS(rv)) { 1089 *state = soc_reg_field_get(unit, 1090 ifp_dst_action_reg, 1091 reg_val, 1092 SRC_REMOVAL_EN_FOR_REDIRECT_TO_NHIf); 1093 } 1094 break; 1095 case bcmFieldControlEcmpHashOffset: 1096 if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) { 1097 return BCM_E_UNAVAIL; 1098 } 1099 rv = READ_IFP_ECMP_HASH_CONTROLr(unit, ®_val); 1100 if (BCM_SUCCESS(rv)) { 1101 *state = soc_reg_field_get(unit, IFP_ECMP_HASH_CONTROLr, 1102 reg_val, ECMP_HASH_SALTf); 1103 } 1104 break; 1105 case bcmFieldControlEcmpHashUseCrc: 1106 if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) { 1107 return BCM_E_UNAVAIL; 1108 } 1109 rv = READ_IFP_ECMP_HASH_CONTROLr(unit, ®_val); 1110 if (BCM_SUCCESS(rv)) { 1111 *state = soc_reg_field_get(unit, IFP_ECMP_HASH_CONTROLr, 1112 reg_val, USE_CRCf); 1113 } 1114 break; 1115 case bcmFieldControlEcmpHashUseUpper5Bits: 1116 if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) { 1117 return BCM_E_UNAVAIL; 1118 } 1119 rv = READ_IFP_ECMP_HASH_CONTROLr(unit, ®_val); 1120 if (BCM_SUCCESS(rv)) { 1121 *state = soc_reg_field_get(unit, IFP_ECMP_HASH_CONTROLr, 1122 reg_val, USE_UPPERf); 1123 } 1124 break; 1125 case bcmFieldControlEcmpHashEnable: 1126 if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) { 1127 return BCM_E_UNAVAIL; 1128 } 1129 rv = READ_IFP_ECMP_HASH_CONTROLr(unit, ®_val); 1130 if (BCM_SUCCESS(rv)) { 1131 *state = soc_reg_field_get(unit, IFP_ECMP_HASH_CONTROLr, 1132 reg_val, ENABLEf); 1133 } 1134 break; 1135 1136 case bcmFieldControlDlbMonitorIngressRandomSeed: 1137 if(SOC_REG_IS_VALID(unit, DLB_ECMP_MONITOR_IFP_CONTROLr)) { 1138 rv = READ_DLB_ECMP_MONITOR_IFP_CONTROLr(unit, ®_val); 1139 if (BCM_SUCCESS(rv)) { 1140 *state = soc_reg_field_get(unit, DLB_ECMP_MONITOR_IFP_CONTROLr, 1141 reg_val, SEEDf); 1142 } 1143 } 1144 break; 1145 case bcmFieldControlGbpSrcMacMcastBitSet: 1146 #if defined(BCM_TRIDENT3_SUPPORT) 1147 if(SOC_REG_IS_VALID(unit, EGR_GBP_CONTROLr)) { 1148 rv = READ_EGR_GBP_CONTROLr(unit, ®_val); 1149 if (BCM_SUCCESS(rv)) { 1150 *state = soc_reg_field_get(unit, EGR_GBP_CONTROLr, 1151 reg_val, GBP_SID_DID_CHECK_POLICYf); 1152 } 1153 } 1154 #endif /* (BCM_TRIDENT3_SUPPORT) */ 1155 break; 1156 default: 1157 rv = _bcm_field_control_get(unit, fc, control, state); 1158 } 1159 1160 return rv; 1161 1162 } 1163 /* 1164 * Function: 1165 * _field_th_instance_counters_deinit 1166 * 1167 * Purpose: 1168 * Free instance counter usage bitmap resource. 1169 * 1170 * Parameters: 1171 * unit - (IN) BCM device number. 1172 * stage_fc - (IN/OUT) Stage field control structure. 1173 * inst - (IN) Device stage instance information. 1174 * 1175 * Returns: 1176 * BCM_E_PARAM - Invalid instance number. 1177 * BCM_E_NONE - Success. 1178 */ 1179 STATIC int 1180 _field_th_instance_counters_deinit(int unit, _field_stage_t *stage_fc, int inst) 1181 { 1182 int slice; /* Slice iterator. */ 1183 1184 /* Input parameter check. */ 1185 if (NULL == stage_fc) { 1186 return (BCM_E_NONE); 1187 } 1188 1189 /* Validate instance value. */ 1190 if (inst < 0 || inst >= stage_fc->num_instances) { 1191 return (BCM_E_PARAM); 1192 } 1193 1194 /* Make sure slices array is initialized.*/ 1195 if (NULL == stage_fc->slices[inst]) { 1196 return (BCM_E_NONE); 1197 } 1198 1199 /* Destroy 64 bit counters. */ 1200 _bcm_field_counter_collect_deinit(unit, stage_fc); 1201 1202 if (_BCM_FIELD_STAGE_EGRESS == stage_fc->stage_id) { 1203 if (NULL != stage_fc->slices[inst][0].counter_bmp.w) { 1204 sal_free(stage_fc->slices[inst][0].counter_bmp.w); 1205 } 1206 1207 for (slice = 0; slice < stage_fc->tcam_slices; slice++) { 1208 stage_fc->slices[inst][slice].counter_bmp.w = NULL; 1209 } 1210 } 1211 1212 return (BCM_E_NONE); 1213 } 1214 1215 _field_counter_hw_mode_t th_ingress_cntr_hw_mode_tbl[] = { 1216 /* (R_COUNTER_OFS = 0, Y_COUNTER_OFS = 0, G_COUNTER_OFS = 1) */ 1217 { BIT(bcmFieldStatGreenPackets) | BIT(bcmFieldStatGreenBytes), 1218 1, _bcmFieldStatColorGreen 1219 }, 1220 /* (R_COUNTER_OFS = 0, Y_COUNTER_OFS = 1, G_COUNTER_OFS = 0) */ 1221 { BIT(bcmFieldStatYellowPackets) | BIT(bcmFieldStatYellowBytes), 1222 1, _bcmFieldStatColorYellow 1223 }, 1224 /* (R_COUNTER_OFS = 0, Y_COUNTER_OFS = 1, G_COUNTER_OFS = 1) */ 1225 { BIT(bcmFieldStatNotRedPackets) | BIT(bcmFieldStatNotRedBytes), 1226 1, _bcmFieldStatColorNotRed 1227 }, 1228 /* (R_COUNTER_OFS = 0, Y_COUNTER_OFS = 2, G_COUNTER_OFS = 1) */ 1229 { BIT(bcmFieldStatYellowPackets) | BIT(bcmFieldStatYellowBytes) 1230 | BIT(bcmFieldStatGreenPackets) | BIT(bcmFieldStatGreenBytes) 1231 | BIT(bcmFieldStatNotRedPackets) | BIT(bcmFieldStatNotRedBytes), 1232 2, _bcmFieldStatColorGreenYellow 1233 }, 1234 /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 0, G_COUNTER_OFS = 0) */ 1235 { BIT(bcmFieldStatRedPackets) | BIT(bcmFieldStatRedBytes), 1236 1, _bcmFieldStatColorRed 1237 }, 1238 /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 0, G_COUNTER_OFS = 1) */ 1239 { BIT(bcmFieldStatNotYellowPackets) | BIT(bcmFieldStatNotYellowBytes), 1240 1, _bcmFieldStatColorNotYellow 1241 }, 1242 /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 0, G_COUNTER_OFS = 2) */ 1243 { BIT(bcmFieldStatRedPackets) | BIT(bcmFieldStatRedBytes) 1244 | BIT(bcmFieldStatGreenPackets) | BIT(bcmFieldStatGreenBytes) 1245 | BIT(bcmFieldStatNotYellowPackets) | BIT(bcmFieldStatNotYellowBytes), 1246 2, _bcmFieldStatColorGreenRed 1247 }, 1248 /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 1, G_COUNTER_OFS = 0) */ 1249 { BIT(bcmFieldStatNotGreenPackets) | BIT(bcmFieldStatNotGreenBytes), 1250 1, _bcmFieldStatColorNotGreen 1251 }, 1252 /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 1, G_COUNTER_OFS = 1) */ 1253 { BIT(bcmFieldStatPackets) | BIT(bcmFieldStatBytes), 1254 1, _bcmFieldStatColorNoColor 1255 }, 1256 /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 1, G_COUNTER_OFS = 2) */ 1257 { BIT(bcmFieldStatNotGreenPackets) | BIT(bcmFieldStatNotGreenBytes) 1258 | BIT(bcmFieldStatGreenPackets) | BIT(bcmFieldStatGreenBytes) 1259 | BIT(bcmFieldStatPackets) | BIT(bcmFieldStatBytes), 1260 2, _bcmFieldStatColorGreenNotGreen 1261 }, 1262 /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 2, G_COUNTER_OFS = 0) */ 1263 { BIT(bcmFieldStatRedPackets) | BIT(bcmFieldStatRedBytes) 1264 | BIT(bcmFieldStatYellowPackets) | BIT(bcmFieldStatYellowBytes) 1265 | BIT(bcmFieldStatNotGreenPackets) | BIT(bcmFieldStatNotGreenBytes), 1266 2, _bcmFieldStatColorYellowRed 1267 }, 1268 /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 2, G_COUNTER_OFS = 1) */ 1269 { BIT(bcmFieldStatNotYellowPackets) | BIT(bcmFieldStatNotYellowBytes) 1270 | BIT(bcmFieldStatYellowPackets) | BIT(bcmFieldStatYellowBytes) 1271 | BIT(bcmFieldStatPackets) | BIT(bcmFieldStatBytes), 1272 2, _bcmFieldStatColorYellowNotYellow 1273 }, 1274 /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 2, G_COUNTER_OFS = 2) */ 1275 { BIT(bcmFieldStatRedPackets) | BIT(bcmFieldStatRedBytes) 1276 | BIT(bcmFieldStatNotRedPackets) | BIT(bcmFieldStatNotRedBytes) 1277 | BIT(bcmFieldStatPackets) | BIT(bcmFieldStatBytes), 1278 2, _bcmFieldStatColorRedNotRed 1279 }, 1280 /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 2, G_COUNTER_OFS = 3) */ 1281 { BIT(bcmFieldStatRedPackets) | BIT(bcmFieldStatRedBytes) 1282 | BIT(bcmFieldStatYellowPackets) | BIT(bcmFieldStatYellowBytes) 1283 | BIT(bcmFieldStatGreenPackets) | BIT(bcmFieldStatGreenBytes) 1284 | BIT(bcmFieldStatNotRedPackets) | BIT(bcmFieldStatNotRedBytes) 1285 | BIT(bcmFieldStatNotYellowPackets) | BIT(bcmFieldStatNotYellowBytes) 1286 | BIT(bcmFieldStatNotGreenPackets) | BIT(bcmFieldStatNotGreenBytes) 1287 | BIT(bcmFieldStatPackets) | BIT(bcmFieldStatBytes), 1288 3, _bcmFieldStatColorGreenYellowRed 1289 } 1290 }; 1291 1292 int th_ingress_cntr_hw_mode_tbl_size = COUNTOF(th_ingress_cntr_hw_mode_tbl); 1293 1294 #ifdef BCM_TOMAHAWK_SUPPORT 1295 STATIC int 1296 _field_stage_meter_pool_clean(int unit, _field_stage_id_t stage_id, 1297 int pipe, int pool) { 1298 1299 _field_stage_t *stage_ptr = NULL; 1300 int meter_pairs_per_pool = 0; 1301 int size = 0; 1302 1303 if (soc_feature(unit, soc_feature_td3_style_fp)) { 1304 meter_pairs_per_pool = BCM_FIELD_INGRESS_TD3_NUM_METER_PAIRS_PER_POOL; 1305 } else { 1306 meter_pairs_per_pool = BCM_FIELD_INGRESS_TH_NUM_METER_PAIRS_PER_POOL; 1307 } 1308 1309 /* Initialize number of meter per pool.*/ 1310 size = SHR_BITALLOCSIZE(meter_pairs_per_pool << 1); 1311 1312 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, 1313 stage_id , &stage_ptr)); 1314 1315 sal_memset(stage_ptr->meter_pool[pipe][pool]->meter_bmp.w, 1316 0, size); 1317 stage_ptr->meter_pool[pipe][pool]->level = 0; 1318 stage_ptr->meter_pool[pipe][pool]->slice_id = 0; 1319 stage_ptr->meter_pool[pipe][pool]->size = 0; 1320 stage_ptr->meter_pool[pipe][pool]->pool_size = 0; 1321 stage_ptr->meter_pool[pipe][pool]->free_meters = 0; 1322 stage_ptr->meter_pool[pipe][pool]->num_meter_pairs = 0; 1323 1324 return BCM_E_NONE; 1325 1326 } 1327 1328 STATIC int 1329 _field_stage_meter_pool_copy(int unit, _field_stage_id_t stage_id_from, 1330 _field_stage_t *stage_ptr_to, int pipe, 1331 int pool) { 1332 1333 _field_stage_t *stage_ptr_from = NULL; 1334 int meter_pairs_per_pool = 0; 1335 int size = 0; 1336 1337 if (soc_feature(unit, soc_feature_td3_style_fp)) { 1338 meter_pairs_per_pool = BCM_FIELD_INGRESS_TD3_NUM_METER_PAIRS_PER_POOL; 1339 } else { 1340 meter_pairs_per_pool = BCM_FIELD_INGRESS_TH_NUM_METER_PAIRS_PER_POOL; 1341 } 1342 1343 /* Initialize number of meter per pool.*/ 1344 size = SHR_BITALLOCSIZE(meter_pairs_per_pool << 1); 1345 1346 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, 1347 stage_id_from , &stage_ptr_from)); 1348 1349 sal_memcpy(stage_ptr_to->meter_pool[pipe][pool]->meter_bmp.w, 1350 stage_ptr_from->meter_pool[pipe][pool]->meter_bmp.w, 1351 size); 1352 stage_ptr_to->meter_pool[pipe][pool]->level = 1353 stage_ptr_from->meter_pool[pipe][pool]->level; 1354 stage_ptr_to->meter_pool[pipe][pool]->slice_id = 1355 stage_ptr_from->meter_pool[pipe][pool]->slice_id; 1356 stage_ptr_to->meter_pool[pipe][pool]->size = 1357 stage_ptr_from->meter_pool[pipe][pool]->size; 1358 stage_ptr_to->meter_pool[pipe][pool]->pool_size = 1359 stage_ptr_from->meter_pool[pipe][pool]->pool_size; 1360 stage_ptr_to->meter_pool[pipe][pool]->free_meters = 1361 stage_ptr_from->meter_pool[pipe][pool]->free_meters; 1362 stage_ptr_to->meter_pool[pipe][pool]->num_meter_pairs = 1363 stage_ptr_from->meter_pool[pipe][pool]->num_meter_pairs; 1364 1365 return BCM_E_NONE; 1366 1367 } 1368 #endif 1369 1370 /* 1371 * Function: 1372 * _field_th_instance_global_meters_deinit 1373 * 1374 * Purpose: 1375 * Free instance meters usage bitmap. 1376 * 1377 * Parameters: 1378 * unit - (IN) BCM device number. 1379 * stage_fc - (IN/OUT) Stage field control structure. 1380 * inst - (IN) Device stage instance information. 1381 * 1382 * Returns: 1383 * BCM_E_PARAM - Invalid instance number. 1384 * BCM_E_NONE - Success. 1385 */ 1386 STATIC int 1387 _field_th_instance_global_meters_deinit(int unit, _field_stage_t *stage_fc, int inst) 1388 { 1389 int pipe = -1; 1390 int pool = -1; 1391 int rv = 0; 1392 _field_meter_pool_t *mp; /* Meter pool structure pointer. */ 1393 _field_control_t *fc; /* Field Control Structure */ 1394 1395 for (pipe = 0; pipe < _FP_MAX_NUM_PIPES; pipe++) { 1396 1397 if ((stage_fc->oper_mode == bcmFieldGroupOperModePipeLocal) 1398 && (pipe != inst)) { 1399 continue; 1400 } 1401 for (pool = 0; pool < stage_fc->num_meter_pools; pool++) { 1402 /* Get the pipeance meter pool structure pointer. */ 1403 mp = stage_fc->meter_pool[pipe][pool]; 1404 if (NULL != mp) { 1405 if (NULL != mp->meter_bmp.w) { 1406 sal_free(mp->meter_bmp.w); 1407 } 1408 sal_free(mp); 1409 stage_fc->meter_pool[pipe][pool] = NULL; 1410 } 1411 } 1412 1413 /* Get field control structure. */ 1414 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 1415 1416 for (pool = 0; pool < _FIELD_MAX_METER_POOLS; pool++) { 1417 1418 if ((stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) && 1419 (fc->ifp_em_meter_in_use[pipe][pool] == 1420 BCM_FIELD_METER_POOL_USED_BY_IFP)) { 1421 /* Clean up meter pools used by IFP */ 1422 rv = (_field_stage_meter_pool_clean 1423 (unit, _BCM_FIELD_STAGE_EXACTMATCH, 1424 pipe, pool)); 1425 if (BCM_SUCCESS(rv) && (!(SOC_WARM_BOOT(unit)))) { 1426 fc->ifp_em_meter_in_use[pipe][pool] = 1427 BCM_FIELD_METER_POOL_USED_BY_NONE; 1428 } else { 1429 return rv; 1430 } 1431 } else if ((stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) && 1432 (fc->ifp_em_meter_in_use[pipe][pool] == 1433 BCM_FIELD_METER_POOL_USED_BY_EM)) { 1434 /* Clean up meter pools used by EM */ 1435 rv = (_field_stage_meter_pool_clean 1436 (unit, _BCM_FIELD_STAGE_INGRESS, 1437 pipe, pool)); 1438 if (BCM_SUCCESS(rv) && (!(SOC_WARM_BOOT(unit)))) { 1439 fc->ifp_em_meter_in_use[pipe][pool] = 1440 BCM_FIELD_METER_POOL_USED_BY_NONE; 1441 } else { 1442 return rv; 1443 } 1444 } 1445 } 1446 } 1447 return (BCM_E_NONE); 1448 1449 } 1450 1451 1452 /* 1453 * Function: 1454 * _field_th_instance_meters_deinit 1455 * 1456 * Purpose: 1457 * Free instance meters usage bitmap. 1458 * 1459 * Parameters: 1460 * unit - (IN) BCM device number. 1461 * stage_fc - (IN/OUT) Stage field control structure. 1462 * inst - (IN) Device stage instance information. 1463 * 1464 * Returns: 1465 * BCM_E_PARAM - Invalid instance number. 1466 * BCM_E_NONE - Success. 1467 */ 1468 STATIC int 1469 _field_th_instance_meters_deinit(int unit, _field_stage_t *stage_fc, int inst) 1470 { 1471 int slice; /* Slice iterator. */ 1472 _field_slice_t *fs; /* Slice configuration structure. */ 1473 1474 /* Input parameter check. */ 1475 if (NULL == stage_fc) { 1476 return (BCM_E_NONE); 1477 } 1478 1479 /* Validate instance value. */ 1480 if (inst < 0 || inst >= stage_fc->num_instances) { 1481 return (BCM_E_PARAM); 1482 } 1483 1484 /* Make sure slices array is initialized.*/ 1485 if (NULL == stage_fc->slices[inst]) { 1486 return (BCM_E_NONE); 1487 } 1488 1489 /* Free IFP meter pools belonging to instance. */ 1490 if (stage_fc->flags & _FP_STAGE_GLOBAL_METER_POOLS) { 1491 return (_field_th_instance_global_meters_deinit(unit, 1492 stage_fc, 1493 inst)); 1494 } 1495 1496 /* Free EFP meter usage bitmap resources belonging to an instance. */ 1497 for (slice = 0; slice < stage_fc->tcam_slices; slice++) { 1498 fs = stage_fc->slices[inst] + slice; 1499 if (NULL != fs->meter_bmp.w) { 1500 sal_free(fs->meter_bmp.w); 1501 } 1502 fs->meter_bmp.w = NULL; 1503 } 1504 return (BCM_E_NONE); 1505 } 1506 1507 /* 1508 * Function: 1509 * _field_th_instance_entries_free 1510 * 1511 * Purpose: 1512 * Free entries array for all slices in an instance. 1513 * 1514 * Parameters: 1515 * unit - (IN) BCM device number. 1516 * stage_fc - (IN) Stage field control structure. 1517 * inst - (IN) Device stage instance number information. 1518 * 1519 * Returns: 1520 * BCM_E_PARAM - Device stage control information is NULL. 1521 * BCM_E_NONE - Success. 1522 */ 1523 STATIC int 1524 _field_th_instance_entries_free(int unit, 1525 _field_stage_t *stage_fc, 1526 int inst) 1527 { 1528 _field_slice_t *fs; /* Field Slice Pointer. */ 1529 int slice; /* Slice iterator. */ 1530 1531 /* Input parameters check. */ 1532 if (NULL == stage_fc) { 1533 return (BCM_E_PARAM); 1534 } 1535 1536 /* Validate instance value. */ 1537 if (inst < 0 || inst >= stage_fc->num_instances) { 1538 return (BCM_E_PARAM); 1539 } 1540 1541 /* Deallocate instance entry pointers. */ 1542 for (slice = 0; slice < stage_fc->tcam_slices; slice++) { 1543 fs = stage_fc->slices[inst] + slice; 1544 if (NULL != fs->entries) { 1545 sal_free(fs->entries); 1546 fs->entries = NULL; 1547 } 1548 } 1549 return (BCM_E_NONE); 1550 } 1551 1552 /* 1553 * Function: 1554 * _field_th_instance_prio_mgmt_deinit 1555 * 1556 * Purpose: 1557 * Free memory used by priority management in an instance. 1558 * 1559 * Parameters: 1560 * unit - (IN) BCM device number. 1561 * stage_fc - (IN) Stage field control structure. 1562 * inst - (IN) Device stage instance number information. 1563 * 1564 * Returns: 1565 * BCM_E_PARAM - Stage control null or invalid instance. 1566 * BCM_E_NONE - Success. 1567 */ 1568 STATIC int 1569 _field_th_instance_prio_mgmt_deinit(int unit, 1570 _field_stage_t *stage_fc, 1571 int inst) 1572 { 1573 int slice; /* Slice iterator. */ 1574 _field_prio_mgmt_t *prio1, *prio2; 1575 1576 /* Input parameters check. */ 1577 if (NULL == stage_fc) { 1578 return (BCM_E_PARAM); 1579 } 1580 1581 /* Validate instance value. */ 1582 if (inst < 0 || inst >= stage_fc->num_instances) { 1583 return (BCM_E_PARAM); 1584 } 1585 1586 if (_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) { 1587 /* To be handled as part of IFP Group implementation. */ 1588 return (BCM_E_NONE); 1589 } 1590 1591 for (slice = 0; slice < stage_fc->tcam_slices; slice++) { 1592 prio1 = stage_fc->slices[inst][slice].prio_mgmt; 1593 while (prio1 != NULL) { 1594 prio2 = prio1->next; 1595 sal_free(prio1); 1596 prio1 = prio2; 1597 } 1598 stage_fc->slices[inst][slice].prio_mgmt = NULL; 1599 } 1600 1601 return (BCM_E_NONE); 1602 } 1603 /* 1604 * Function: 1605 * _bcm_field_th_eh_mask_profile_hw_alloc 1606 * 1607 * Purpose: 1608 * Allocate hw resources for HiGiG2 extended header mask. 1609 * 1610 * Parameters: 1611 * unit - (IN) BCM device number. 1612 * f_ent - (IN) Field entry control structure. 1613 * Returns: 1614 * BCM_E_XXX 1615 */ 1616 int 1617 _bcm_field_th_eh_mask_profile_hw_alloc(int unit, _field_entry_t *f_ent) 1618 { 1619 int rv = BCM_E_NONE; /* Operational Status. */ 1620 int ref_count; /* eh mask profile reference count. */ 1621 _field_action_t *fa; /* Field actions pointer */ 1622 void *entry_ptr; /* pointer to EH_MASK_PROFILE table entry. */ 1623 _field_control_t *fc = NULL; /* Field Control Structure */ 1624 1625 /* parameters check. */ 1626 if (NULL == f_ent) { 1627 return BCM_E_PARAM; 1628 } 1629 1630 /* HiGiG2 extended header mask profile table isonly valid for IFP. */ 1631 if (_BCM_FIELD_STAGE_INGRESS != f_ent->group->stage_id) { 1632 return BCM_E_NONE; 1633 } 1634 1635 /* Go through all the actions in field entry. */ 1636 for (fa = f_ent->actions; 1637 NULL != fa && _FP_ACTION_VALID & fa->flags; 1638 fa = fa->next) { 1639 1640 if (bcmFieldActionFabricEHAddOrUpdate == fa->action) { 1641 1642 /* 1643 * Store previous hardware index value in old_index. 1644 */ 1645 fa->old_index = fa->hw_index; 1646 1647 /* Get field control structure. */ 1648 rv = _field_control_get(unit, &fc); 1649 BCM_IF_ERROR_RETURN(rv); 1650 1651 /* EH mask will come as action parameter 1 for which 1652 * profile entry needs to be created. */ 1653 entry_ptr = fa->param + 1; 1654 1655 rv = soc_profile_mem_add(unit, 1656 &fc->eh_mask_profile, 1657 &entry_ptr, 1, 1658 (uint32 *)&fa->hw_index); 1659 if ((BCM_E_RESOURCE == rv) && 1660 (_FP_INVALID_INDEX != fa->old_index)) { 1661 /* Destroy old profile ONLY 1662 * if it is not used by other entries. 1663 */ 1664 1665 rv = soc_profile_mem_ref_count_get(unit, 1666 &fc->eh_mask_profile, 1667 fa->old_index, &ref_count); 1668 1669 BCM_IF_ERROR_RETURN(rv); 1670 1671 if (ref_count > 1) { 1672 return (BCM_E_RESOURCE); 1673 } 1674 1675 rv = soc_profile_mem_delete(unit, 1676 &fc->eh_mask_profile, 1677 fa->old_index); 1678 BCM_IF_ERROR_RETURN(rv); 1679 1680 /* Destroy old profile is no longer required. */ 1681 fa->old_index = _FP_INVALID_INDEX; 1682 1683 /* Reallocate profile for new action. */ 1684 rv = soc_profile_mem_add(unit, 1685 &fc->eh_mask_profile, 1686 &entry_ptr, 1, 1687 (uint32*)&fa->hw_index); 1688 BCM_IF_ERROR_RETURN(rv); 1689 } 1690 break; 1691 } 1692 } 1693 1694 return rv; 1695 } 1696 /* 1697 * Function: 1698 * _bcm_field_th_eh_mask_profile_hw_free 1699 * 1700 * Purpose: 1701 * Free hw resources created for HiGiG2 extended header mask used in 1702 * bcmFieldActionFabricEHAddOrUpdate action. 1703 * 1704 * Parameters: 1705 * unit - (IN) BCM device number. 1706 * f_ent - (IN) field entry control. 1707 * fflags - (IN) field entry action flags to free the h/w resources. 1708 * Returns: 1709 * BCM_E_XXX 1710 */ 1711 int 1712 _bcm_field_th_eh_mask_profile_hw_free(int unit, 1713 _field_entry_t *f_ent, uint32 flags) 1714 { 1715 int rv = BCM_E_NONE; /* Operational Status */ 1716 _field_action_t *fa; /* Field actions pointer */ 1717 _field_control_t *fc = NULL; /* Field Control Structure */ 1718 1719 /* Parameters check. */ 1720 if (NULL == f_ent) { 1721 return BCM_E_PARAM; 1722 } 1723 1724 /* HiGiG2 extended header mask profile table isonly valid for IFP. */ 1725 if (_BCM_FIELD_STAGE_INGRESS != f_ent->group->stage_id) { 1726 return BCM_E_NONE; 1727 } 1728 1729 /* Go through all actions in the entry. */ 1730 for (fa = f_ent->actions; NULL != fa; fa = fa->next) { 1731 /* Clear h/w resource only if the action is 1732 * bcmFieldActionFabricEHAddOrUpdate */ 1733 if (bcmFieldActionFabricEHAddOrUpdate == fa->action) { 1734 1735 /* Get field control structure. */ 1736 rv = _field_control_get(unit, &fc); 1737 BCM_IF_ERROR_RETURN(rv); 1738 1739 /* Free current resources. */ 1740 if ((flags & _FP_ACTION_RESOURCE_FREE) && 1741 (_FP_INVALID_INDEX != fa->hw_index)) { 1742 rv = soc_profile_mem_delete(unit, 1743 &fc->eh_mask_profile, 1744 fa->hw_index); 1745 BCM_IF_ERROR_RETURN(rv); 1746 fa->hw_index = _FP_INVALID_INDEX; 1747 } 1748 1749 /* Free Old resources. */ 1750 if ((flags & _FP_ACTION_OLD_RESOURCE_FREE) && 1751 (_FP_INVALID_INDEX != fa->old_index)) { 1752 rv = soc_profile_mem_delete(unit, 1753 &fc->eh_mask_profile, 1754 fa->old_index); 1755 BCM_IF_ERROR_RETURN(rv); 1756 fa->old_index = _FP_INVALID_INDEX; 1757 } 1758 break; 1759 } 1760 } 1761 1762 return rv; 1763 } 1764 /* 1765 * Function: 1766 * _bcm_field_th_data_qualifier_hw_alloc 1767 * 1768 * Purpose: 1769 * Allocate hw resources for data qualifier installation 1770 * 1771 * Parameters: 1772 * unit - (IN) BCM device number. 1773 * stage_fc - (IN) Stage field control. 1774 * f_dq - (IN) Field data qualifier descriptor. 1775 * Returns: 1776 * BCM_E_XXX 1777 */ 1778 1779 int 1780 _bcm_field_th_data_qualifier_hw_alloc(int unit, 1781 _field_stage_t *stage_fc, 1782 _field_data_qualifier_t *f_dq) 1783 { 1784 int idx; /* Data qualifier word iterator. */ 1785 int elem_count; /* Number of elements allocated. */ 1786 int temp_elem_count = 0; /* Number of elements allocated. */ 1787 uint32 *usage_bmap; /* Offset usage bitmap. */ 1788 SHR_BITDCL bit16_chunks_free; /* Bitmap of free 16 bit chunks */ 1789 SHR_BITDCL bit32_chunks_free; /* Bitmap of free 32 bit chunks */ 1790 SHR_BITDCL bit32_chunks_free_partially; /* Bitmap of 32 bit chunks free partially */ 1791 1792 /* Input parameters check. */ 1793 if ((NULL == f_dq) || (NULL == stage_fc)) { 1794 return (BCM_E_PARAM); 1795 } 1796 1797 memset(&bit16_chunks_free, 0x0, sizeof(bit16_chunks_free)); 1798 memset(&bit32_chunks_free, 0x0, sizeof(bit32_chunks_free)); 1799 memset(&bit32_chunks_free_partially, 0x0, sizeof(bit32_chunks_free_partially)); 1800 1801 elem_count = 0; 1802 /* coverity[assign]: FALSE*/ 1803 usage_bmap = &stage_fc->data_ctrl->usage_bmap; 1804 1805 /* Loop through the usage_bmap and calculate the number of elements 1806 * which are free to be allocated*/ 1807 for (idx = 0; idx <= 15; idx++) { 1808 if (0 == ((*usage_bmap) & (1 << idx))) { 1809 elem_count++; 1810 } 1811 } 1812 1813 /* Loop through the usage_bmap and identify which of the 16_bit(Chunks 0,1,8,9) 1814 * chunks are free to be allocated and set the corresponding idx in 1815 * bit16_chunks_free*/ 1816 1817 for (idx =0; idx <= 15; idx++) { 1818 if (idx == 0x0 || idx == 0x1 || idx == 0x8 || idx == 0x9) { 1819 if (SHR_BITGET(usage_bmap, idx) == 0) { 1820 /* coverity[ptr_arith] we check only from 0 to 15 idx and 1821 * there are only 16 elements in UDF currently*/ 1822 SHR_BITSET(&bit16_chunks_free, idx); 1823 } 1824 } 1825 } 1826 1827 /* Loop through the usage_bmap and identify which of the 32_bit chunks (Chunks 1828 * other than 0,1,8,9) are free to be allocated. For a 32 bit chunk to be free fully 1829 * both elems in idx and idx+1 should be free. If either one of them is free, then 1830 * it is taken as a partially free 32 bit chunk*/ 1831 1832 for (idx =0; idx < 15; idx += 2) { 1833 if (idx != 0x0 && idx != 0x1 && idx != 0x8 && idx != 0x9) { 1834 if ((SHR_BITGET(usage_bmap, idx) == 0) && 1835 (SHR_BITGET(usage_bmap, idx + 1) == 0)) { 1836 /* coverity[ptr_arith] we check only from 0 to 15 idx and 1837 * there are only 16 elements in UDF currently*/ 1838 SHR_BITSET(&bit32_chunks_free, idx); 1839 /* coverity[ptr_arith] we check only from 0 to 15 idx and 1840 * there are only 16 elements in UDF currently*/ 1841 SHR_BITSET(&bit32_chunks_free, (idx+1)); 1842 } else if (SHR_BITGET(usage_bmap, idx) == 0) { 1843 /* coverity[ptr_arith] we check only from 0 to 15 idx and 1844 * there are only 16 elements in UDF currently*/ 1845 SHR_BITSET(&bit32_chunks_free_partially, idx); 1846 } else if (SHR_BITGET(usage_bmap, idx + 1) == 0) { 1847 /* coverity[ptr_arith] we check only from 0 to 15 idx and 1848 * there are only 16 elements in UDF currently*/ 1849 SHR_BITSET(&bit32_chunks_free_partially, (idx+1)); 1850 } 1851 } 1852 } 1853 1854 /* Check whether the requested elem count is available. Only if the count 1855 * requested can be allocated, proceed. */ 1856 if (elem_count >= f_dq->elem_count) { 1857 1858 if (1 == f_dq->elem_count) { 1859 1860 /*Only UDF2.4 through UDF2.7 chunks are specific to Flex Hash Rtag7. 1861 *Hence only the data qualifiers - Data8 and Data9 can be allocated for 1862 *Flex Hash. If only one element is requested, the order 1863 *of allocation is as follows: 1864 * 1. If any 32 bit chunk is partially free, allocate it. 1865 * 2. If any 32 bit chunk is free as a whole, allocate it. */ 1866 1867 if (f_dq->flags == BCM_FIELD_DATA_QUALIFIER_OFFSET_FLEX_HASH) { 1868 for (idx = 12; idx <= 15; idx++) { 1869 if (0 != ((bit32_chunks_free_partially) & (1 << idx))) { 1870 f_dq->hw_bmap |= (1 << idx); 1871 (*usage_bmap) |= (1 << idx); 1872 return BCM_E_NONE; 1873 } 1874 } 1875 1876 for (idx = 12; idx <= 15; idx++) { 1877 if (0 != ((bit32_chunks_free) & (1 << idx))) { 1878 f_dq->hw_bmap |= (1 << idx); 1879 (*usage_bmap) |= (1 << idx); 1880 return BCM_E_NONE; 1881 } 1882 } 1883 return BCM_E_RESOURCE; 1884 } 1885 1886 /*If only one element is requested, then the order of allocation is as follows: 1887 * 1. If any 16_bit chunk is free, allocate it. 1888 * 2. Else If any 32 bit chunk is partially free, allocate it. 1889 * 3. Else If any 32 bit chunk is free as a whole, allocate it. 1890 * (UDF2.4 thro UDF2.7 chunks are specific to RTAG7). Hence, in all the above 1891 * cases, give first preference to chunks other than those used for RTAGS. 1892 */ 1893 1894 for (idx = 0; idx <= 15; idx++) { 1895 if (0 != ((bit16_chunks_free) & (1 << idx))) { 1896 f_dq->hw_bmap |= (1 << idx); 1897 (*usage_bmap) |= (1 << idx); 1898 return BCM_E_NONE; 1899 } 1900 1901 } 1902 1903 for (idx = 0; idx <= 11; idx++) { 1904 if (0 != ((bit32_chunks_free_partially) & (1 << idx))) { 1905 f_dq->hw_bmap |= (1 << idx); 1906 (*usage_bmap) |= (1 << idx); 1907 return BCM_E_NONE; 1908 } 1909 } 1910 1911 for (idx = 0; idx <= 11; idx++) { 1912 if (0 != ((bit32_chunks_free) & (1 << idx))) { 1913 f_dq->hw_bmap |= (1 << idx); 1914 (*usage_bmap) |= (1 << idx); 1915 return BCM_E_NONE; 1916 } 1917 } 1918 1919 for (idx = 12; idx <= 15; idx++) { 1920 if (0 != ((bit32_chunks_free_partially) & (1 << idx))) { 1921 f_dq->hw_bmap |= (1 << idx); 1922 (*usage_bmap) |= (1 << idx); 1923 return BCM_E_NONE; 1924 } 1925 } 1926 1927 for (idx = 12; idx <= 15; idx++) { 1928 if (0 != ((bit32_chunks_free) & (1 << idx))) { 1929 f_dq->hw_bmap |= (1 << idx); 1930 (*usage_bmap) |= (1 << idx); 1931 return BCM_E_NONE; 1932 } 1933 } 1934 1935 } else { 1936 1937 temp_elem_count = f_dq->elem_count; 1938 1939 /*Only UDF2.4 through UDF2.7 chunks are specific to Flex Hash Rtag7. 1940 *Hence only the data qualifiers - Data8 and Data9 can be allocated for 1941 *Flex Hash. */ 1942 1943 if (f_dq->flags == BCM_FIELD_DATA_QUALIFIER_OFFSET_FLEX_HASH) { 1944 /*If more than one element is requested, then the order of allocation is as follows: 1945 * Save elem_count requested in temp_elem_count and keep decreasing it as we allocate 1946 *1. Until temp_elem_count is not 1, allocate 32_bit chunks as much as possible 1947 *2. If more chunks are needed, allocate from 32_bit chunks partially free 1948 *3. If more chunks are needed, allocate partially from 32_bit chunks fully free 1949 */ 1950 for (idx = 12; idx < 15; idx += 2) { 1951 if (1 != temp_elem_count) { 1952 if ((0 != ((bit32_chunks_free) & (1 << idx))) && 1953 (0 != ((bit32_chunks_free) & (1 << (idx + 1))))) { 1954 f_dq->hw_bmap |= (1 << idx); 1955 (*usage_bmap) |= (1 << idx); 1956 f_dq->hw_bmap |= (1 << (idx + 1)); 1957 (*usage_bmap) |= (1 << (idx + 1)); 1958 SHR_BITCLR(&bit32_chunks_free, idx); 1959 SHR_BITCLR(&bit32_chunks_free, idx+1); 1960 temp_elem_count = temp_elem_count - 2; 1961 } 1962 } 1963 1964 if (0 == temp_elem_count) { 1965 return BCM_E_NONE; 1966 } 1967 } 1968 1969 for (idx = 12; idx <= 15; idx++) { 1970 if (0 != ((bit32_chunks_free_partially) & (1 << idx))) { 1971 f_dq->hw_bmap |= (1 << idx); 1972 (*usage_bmap) |= (1 << idx); 1973 temp_elem_count = temp_elem_count - 1; 1974 } 1975 1976 if (0 == temp_elem_count) { 1977 return BCM_E_NONE; 1978 } 1979 } 1980 1981 for (idx = 12; idx <= 15; idx++) { 1982 if (0 != ((bit32_chunks_free) & (1 << idx))) { 1983 f_dq->hw_bmap |= (1 << idx); 1984 (*usage_bmap) |= (1 << idx); 1985 temp_elem_count = temp_elem_count - 1; 1986 } 1987 1988 if (0 == temp_elem_count) { 1989 return BCM_E_NONE; 1990 } 1991 } 1992 return BCM_E_RESOURCE; 1993 } 1994 1995 /*If more than one element is requested, then the order of allocation is as follows: 1996 * Save elem_count requested in temp_elem_count and keep decreasing it as we allocate 1997 *1. Until temp_elem_count is not 1, allocate 32_bit chunks as much as possible 1998 *2. If more chunks are needed, allocate from 16_bit chunks 1999 *3. If more chunks are needed, allocate from 32_bit chunks partially free 2000 *4. If more chunks are needed, allocate partially from 32_bit chunks fully free 2001 */ 2002 2003 for (idx = 0; idx < 11; idx += 2) { 2004 if (1 != temp_elem_count) { 2005 if ((0 != ((bit32_chunks_free) & (1 << idx))) && 2006 (0 != ((bit32_chunks_free) & (1 << (idx + 1))))) { 2007 f_dq->hw_bmap |= (1 << idx); 2008 (*usage_bmap) |= (1 << idx); 2009 f_dq->hw_bmap |= (1 << (idx + 1)); 2010 (*usage_bmap) |= (1 << (idx + 1)); 2011 SHR_BITCLR(&bit32_chunks_free, idx); 2012 SHR_BITCLR(&bit32_chunks_free, idx+1); 2013 temp_elem_count = temp_elem_count - 2; 2014 } 2015 2016 if (0 == temp_elem_count) { 2017 return BCM_E_NONE; 2018 } 2019 } 2020 } 2021 2022 for (idx = 0; idx <= 15; idx++) { 2023 if (0 != ((bit16_chunks_free) & (1 << idx))) { 2024 f_dq->hw_bmap |= (1 << idx); 2025 (*usage_bmap) |= (1 << idx); 2026 temp_elem_count = temp_elem_count - 1; 2027 } 2028 2029 if (0 == temp_elem_count) { 2030 return BCM_E_NONE; 2031 } 2032 } 2033 2034 for (idx = 0; idx <= 11; idx++) { 2035 if (0 != ((bit32_chunks_free_partially) & (1 << idx))) { 2036 f_dq->hw_bmap |= (1 << idx); 2037 (*usage_bmap) |= (1 << idx); 2038 temp_elem_count = temp_elem_count - 1; 2039 } 2040 2041 if (0 == temp_elem_count) { 2042 return BCM_E_NONE; 2043 } 2044 } 2045 2046 for (idx = 0; idx <= 11; idx++) { 2047 if (0 != ((bit32_chunks_free) & (1 << idx))) { 2048 f_dq->hw_bmap |= (1 << idx); 2049 (*usage_bmap) |= (1 << idx); 2050 temp_elem_count = temp_elem_count - 1; 2051 } 2052 2053 if (0 == temp_elem_count) { 2054 return BCM_E_NONE; 2055 } 2056 } 2057 2058 /*Give last preference to data qualifiers Data8 and Data9 (marking UDF2.4 2059 *through UDF2.7) chunks as they are specific to RTAG7*/ 2060 for (idx = 12; idx < 15; idx += 2) { 2061 if (1 != temp_elem_count) { 2062 if ((0 != ((bit32_chunks_free) & (1 << idx))) && 2063 (0 != ((bit32_chunks_free) & (1 << (idx + 1))))) { 2064 f_dq->hw_bmap |= (1 << idx); 2065 (*usage_bmap) |= (1 << idx); 2066 f_dq->hw_bmap |= (1 << (idx + 1)); 2067 (*usage_bmap) |= (1 << (idx + 1)); 2068 SHR_BITCLR(&bit32_chunks_free, idx); 2069 SHR_BITCLR(&bit32_chunks_free, idx+1); 2070 temp_elem_count = temp_elem_count - 2; 2071 } 2072 2073 if (0 == temp_elem_count) { 2074 return BCM_E_NONE; 2075 } 2076 } 2077 } 2078 2079 for (idx = 12; idx <= 15; idx++) { 2080 if (0 != ((bit32_chunks_free_partially) & (1 << idx))) { 2081 f_dq->hw_bmap |= (1 << idx); 2082 (*usage_bmap) |= (1 << idx); 2083 temp_elem_count = temp_elem_count - 1; 2084 } 2085 2086 if (0 == temp_elem_count) { 2087 return BCM_E_NONE; 2088 } 2089 } 2090 2091 for (idx = 12; idx <= 15; idx++) { 2092 if (0 != ((bit32_chunks_free) & (1 << idx))) { 2093 f_dq->hw_bmap |= (1 << idx); 2094 (*usage_bmap) |= (1 << idx); 2095 temp_elem_count = temp_elem_count - 1; 2096 } 2097 2098 if (0 == temp_elem_count) { 2099 return BCM_E_NONE; 2100 } 2101 } 2102 } 2103 } 2104 2105 return (BCM_E_RESOURCE); 2106 2107 } 2108 2109 /* 2110 * Function: 2111 * _bcm_field_th_field_qset_data_qualifier_add 2112 * 2113 * Purpose: 2114 * Add field data qualifier to group qset. 2115 * 2116 * Parameters: 2117 * unit - (IN) bcm device. 2118 * qset - (IN/OUT) Group qualifier set. 2119 * qualifier_id - (IN) Data qualifier id. 2120 * 2121 * Returns: 2122 * BCM_E_XXX 2123 */ 2124 int _bcm_field_th_field_qset_data_qualifier_add(int unit, 2125 bcm_field_qset_t *qset, 2126 int qual_id) 2127 { 2128 _field_stage_t *stage_fc; /* Stage field control. */ 2129 _field_data_qualifier_t *f_dq; /* Data qualifier descriptor. */ 2130 int idx; /* HW bitmap iteration index. */ 2131 int rv; /* Operation return status. */ 2132 int offset_2_3 = 0; /* HW offset 0 and 1 usage status. */ 2133 int offset_4_5 = 0; /* HW offset 2 and 3 usage status. */ 2134 int offset_6_7 = 0; /* HW offset 4 and 5 usage status. */ 2135 int offset_a_b = 0; /* HW offset 8 and 9 usage status. */ 2136 int offset_c_d = 0; /* HW offset a and b usage status. */ 2137 int offset_e_f = 0; /* HW offset c and d usage status. */ 2138 int byte_index; 2139 int byte_count; 2140 2141 FP_LOCK(unit); 2142 2143 /* Get stage field control structure. */ 2144 rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc); 2145 if (BCM_FAILURE(rv)) { 2146 FP_UNLOCK(unit); 2147 return (rv); 2148 } 2149 2150 /*Get data qualifier info. */ 2151 rv = _bcm_field_data_qualifier_get(unit, stage_fc, qual_id, &f_dq); 2152 if (BCM_FAILURE(rv)) { 2153 FP_UNLOCK(unit); 2154 return (rv); 2155 } 2156 2157 2158 /*--------------------------------------------------------------------------------------* 2159 * Each chunk or chunk pair corresponds to the data qualifier as marked below: 2160 * 2161 * 15 -- 14 13 -- 12 11 -- 10 9 8 7 -- 6 5 -- 4 3 -- 2 1 0 2162 *{________} {_______} {_______} {___}{___} {______} {______} {_____} {___}{___} 2163 * Data9 Data8 Data7 Data6 Data5 Data4 Data3 Data2 Data1 Data0 2164 * (32bit) (32bit) (32bit) (16bit)(16bit) (32bit) (32bit) (32bit)(16bit)(16bit) 2165 * {_________________________________________} {___________________________________} 2166 * || || 2167 * UDF_2 UDF_1 2168 *--------------------------------------------------------------------------------------*/ 2169 2170 /* Loop through the hw_map and set the correspoding bit in qset's udf_map*/ 2171 2172 for (idx = 0; idx <= 15; idx++) { 2173 if (f_dq->hw_bmap & (1 << idx)) { 2174 SHR_BITSET(qset->udf_map, idx); 2175 } 2176 } 2177 2178 /* Add the qualifiers corresponding to the bit in qset->udf_map. Like, 2179 * 16_bit qualifiers are _bcmFieldQualifyData0, _bcmFieldQualifyData1, 2180 *_bcmFieldQualifyData5,_bcmFieldQualifyData6 and map 0,1,8,9 respectively*/ 2181 2182 if (SHR_BITGET(qset->udf_map, 0x0)) { 2183 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData0); 2184 } 2185 if (SHR_BITGET(qset->udf_map, 0x1)) { 2186 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData1); 2187 } 2188 if (SHR_BITGET(qset->udf_map, 0x8)) { 2189 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData5); 2190 } 2191 if (SHR_BITGET(qset->udf_map, 0x9)) { 2192 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData6); 2193 } 2194 2195 /* 32_bit qualifiers are over a range of udf_map and hence 2196 * get HW offsets usage status. */ 2197 2198 SHR_BITTEST_RANGE(qset->udf_map, 0x2, 2, offset_2_3); 2199 SHR_BITTEST_RANGE(qset->udf_map, 0x4, 2, offset_4_5); 2200 SHR_BITTEST_RANGE(qset->udf_map, 0x6, 2, offset_6_7); 2201 SHR_BITTEST_RANGE(qset->udf_map, 0xa, 2, offset_a_b); 2202 SHR_BITTEST_RANGE(qset->udf_map, 0xc, 2, offset_c_d); 2203 SHR_BITTEST_RANGE(qset->udf_map, 0xe, 2, offset_e_f); 2204 2205 if (offset_2_3) { 2206 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData2); 2207 } 2208 if (offset_4_5) { 2209 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData3); 2210 } 2211 if (offset_6_7) { 2212 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData4); 2213 } 2214 if (offset_a_b) { 2215 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData7); 2216 } 2217 if (offset_c_d) { 2218 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData8); 2219 } 2220 if (offset_e_f) { 2221 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData9); 2222 } 2223 2224 /* SDK builds key gen mask for exact match group during group create. 2225 * group control structure has information only about data qualifiers 2226 * (_bcmFieldQualifyData0 - _bcmFieldQualifyData9) and chunks allocated 2227 * in groups qset.But no information is available about which bytes of 2228 * the chunk is actually allocated. 2229 * But we need which bytes of chunk is allocated for the data qualifier to 2230 * properly build the EM key gen mask, in case of partially allocated chunks. 2231 * So updating the unused bits of udf_map in bcm_field_qset_t to hold the 2232 * bytes allocated in chunks allocated for the data qualifier.*/ 2233 2234 byte_count = f_dq->length; 2235 for (idx = 0; idx <= stage_fc->data_ctrl->num_elems * 2; idx++) { 2236 if (f_dq->hw_bmap & (1 << idx)) { 2237 byte_index = (stage_fc->data_ctrl->num_elems * 2) + (idx * 2); 2238 if (byte_count) { 2239 if (byte_count > 1) { 2240 SHR_BITSET_RANGE(qset->udf_map, byte_index, 2); 2241 byte_count = byte_count - 2; 2242 } else { 2243 SHR_BITSET_RANGE(qset->udf_map, byte_index, 1); 2244 byte_count = byte_count - 1; 2245 } 2246 } 2247 } 2248 } 2249 2250 FP_UNLOCK(unit); 2251 return (BCM_E_NONE); 2252 } 2253 2254 /* 2255 * Function: 2256 * _bcm_field_th_field_qset_data_qualifier_delete 2257 * Purpose: 2258 * Delete field data qualifier from group qset. 2259 * Parameters: 2260 * unit - (IN) bcm device. 2261 * qset - (IN/OUT) Group qualifier set. 2262 * qualifier_id - (IN) Data qualifier id. 2263 * Returns: 2264 * BCM_E_XXX 2265 */ 2266 int _bcm_field_th_field_qset_data_qualifier_delete (int unit, bcm_field_qset_t *qset, 2267 int qual_id) 2268 { 2269 _field_stage_t *stage_fc; /* Stage field control. */ 2270 _field_data_qualifier_t *f_dq; /* Data qualifier descriptor. */ 2271 int idx; /* HW bitmap iteration index. */ 2272 int rv; /* Operation return status. */ 2273 int offset_2_3 = 0; /* HW offset 0 and 1 usage status. */ 2274 int offset_4_5 = 0; /* HW offset 2 and 3 usage status. */ 2275 int offset_6_7 = 0; /* HW offset 4 and 5 usage status. */ 2276 int offset_a_b = 0; /* HW offset 8 and 9 usage status. */ 2277 int offset_c_d = 0; /* HW offset a and b usage status. */ 2278 int offset_e_f = 0; /* HW offset c and d usage status. */ 2279 2280 FP_LOCK(unit); 2281 2282 /* Get stage field control structure. */ 2283 rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc); 2284 if (BCM_FAILURE(rv)) { 2285 FP_UNLOCK(unit); 2286 return (rv); 2287 } 2288 2289 /*Get data qualifier info. */ 2290 rv = _bcm_field_data_qualifier_get(unit, stage_fc, qual_id, &f_dq); 2291 if (BCM_FAILURE(rv)) { 2292 FP_UNLOCK(unit); 2293 return (rv); 2294 } 2295 2296 /* Loop through the hw_map and clear the correspoding bit in qset's udf_map*/ 2297 for (idx = 0; idx <= 15; idx++) 2298 { 2299 if (f_dq->hw_bmap & (1 << idx)) { 2300 SHR_BITCLR(qset->udf_map, idx); 2301 } 2302 } 2303 2304 if (!SHR_BITGET(qset->udf_map, 0x0)) { 2305 BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData0); 2306 } 2307 2308 if (!SHR_BITGET(qset->udf_map, 0x1)) { 2309 BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData1); 2310 } 2311 2312 if (!SHR_BITGET(qset->udf_map, 0x8)) { 2313 BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData5); 2314 } 2315 2316 if (!SHR_BITGET(qset->udf_map, 0x9)) { 2317 BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData6); 2318 } 2319 2320 /* Get HW offsets usage status. */ 2321 SHR_BITTEST_RANGE(qset->udf_map, 0x2, 2, offset_2_3); 2322 SHR_BITTEST_RANGE(qset->udf_map, 0x4, 2, offset_4_5); 2323 SHR_BITTEST_RANGE(qset->udf_map, 0x6, 2, offset_6_7); 2324 SHR_BITTEST_RANGE(qset->udf_map, 0xa, 2, offset_a_b); 2325 SHR_BITTEST_RANGE(qset->udf_map, 0xc, 2, offset_c_d); 2326 SHR_BITTEST_RANGE(qset->udf_map, 0xe, 2, offset_e_f); 2327 2328 if (!offset_2_3) { 2329 BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData2); 2330 } 2331 if (!offset_4_5) { 2332 BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData3); 2333 } 2334 if (!offset_6_7) { 2335 BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData4); 2336 } 2337 if (!offset_a_b) { 2338 BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData7); 2339 } 2340 if (!offset_c_d) { 2341 BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData8); 2342 } 2343 if (!offset_e_f) { 2344 BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData9); 2345 } 2346 2347 FP_UNLOCK(unit); 2348 return (BCM_E_NONE); 2349 } 2350 2351 /* 2352 * Function: 2353 * _bcm_field_th_field_qset_data_qualifier_get 2354 * Purpose: 2355 * Fetch the data qualifier that maps the index 2356 * Parameters: 2357 * idx - (IN) Index of the element 2358 * qset - (IN) Group qualifier set. 2359 * qualifier_id - (OUT) Data qualifier id. 2360 * Returns: 2361 * BCM_E_XXX 2362 */ 2363 int _bcm_field_th_field_qset_data_qualifier_get(int idx, 2364 bcm_field_qset_t qset, 2365 bcm_field_qualify_t *qid) 2366 { 2367 if (idx < 0 || idx > 15) { 2368 return (BCM_E_PARAM); 2369 } 2370 2371 if (NULL == qid) { 2372 return (BCM_E_PARAM); 2373 } 2374 2375 /* Return the qualifier id, if the qualifier_id is set in the Qset 2376 * and its corresponding index value is the same mapped with it*/ 2377 if ((idx == 0) && 2378 BCM_FIELD_QSET_TEST_INTERNAL(qset, 2379 _bcmFieldQualifyData0)) { 2380 *qid = _bcmFieldQualifyData0; 2381 } else if ((idx == 1) && 2382 BCM_FIELD_QSET_TEST_INTERNAL(qset, 2383 _bcmFieldQualifyData1)) { 2384 *qid = _bcmFieldQualifyData1; 2385 } else if (((idx == 2) || (idx == 3)) && 2386 BCM_FIELD_QSET_TEST_INTERNAL(qset, 2387 _bcmFieldQualifyData2)) { 2388 *qid = _bcmFieldQualifyData2; 2389 } else if (((idx == 4) || (idx == 5)) && 2390 BCM_FIELD_QSET_TEST_INTERNAL(qset, 2391 _bcmFieldQualifyData3)) { 2392 *qid = _bcmFieldQualifyData3; 2393 } else if (((idx == 6) || (idx == 7)) && 2394 BCM_FIELD_QSET_TEST_INTERNAL(qset, 2395 _bcmFieldQualifyData4)) { 2396 *qid = _bcmFieldQualifyData4; 2397 } else if ((idx == 8) && 2398 BCM_FIELD_QSET_TEST_INTERNAL(qset, 2399 _bcmFieldQualifyData5)) { 2400 *qid = _bcmFieldQualifyData5; 2401 } else if ((idx == 9) && 2402 BCM_FIELD_QSET_TEST_INTERNAL(qset, 2403 _bcmFieldQualifyData6)) { 2404 *qid = _bcmFieldQualifyData6; 2405 } else if (((idx == 0xa) || (idx == 0xb)) && 2406 BCM_FIELD_QSET_TEST_INTERNAL(qset, 2407 _bcmFieldQualifyData7)) { 2408 *qid = _bcmFieldQualifyData7; 2409 } else if (((idx == 0xc) || (idx == 0xd)) && 2410 BCM_FIELD_QSET_TEST_INTERNAL(qset, 2411 _bcmFieldQualifyData8)) { 2412 *qid = _bcmFieldQualifyData8; 2413 } else if (((idx == 0xe) || (idx == 0xf)) && 2414 BCM_FIELD_QSET_TEST_INTERNAL(qset, 2415 _bcmFieldQualifyData9)) { 2416 *qid = _bcmFieldQualifyData9; 2417 } else { 2418 return (BCM_E_INTERNAL); 2419 } 2420 2421 return BCM_E_NONE; 2422 } 2423 /* 2424 * Function: _bcm_field_th_field_qualify_data_elem 2425 * 2426 * Purpose: 2427 * 2428 * Parameters: 2429 * unit - (IN) BCM device number. 2430 * eid - (IN) Entry ID. 2431 * f_dq - (IN) Data qualifier descriptor. 2432 * qual_elem_idx - (IN) Data qualifier element index. 2433 * data - (IN) Data bytes for the indicated data qualifier. 2434 * Network byte ordered. 2435 * mask - Mask bytes for the indicated data qualifier. 2436 * Network byte ordered. 2437 * Returns: 2438 * BCM_E_XXX 2439 */ 2440 int 2441 _bcm_field_th_field_qualify_data_elem(int unit, bcm_field_entry_t eid, 2442 _field_data_qualifier_t *f_dq, 2443 uint8 qual_elem_idx, 2444 uint32 data, uint32 mask) 2445 { 2446 _field_stage_t *stage_fc; /* Stage field control. */ 2447 _field_entry_t *f_ent = NULL; /* Field entry structure. */ 2448 int idx; /* HW bitmap iteration index. */ 2449 int rv; /* Operation return status. */ 2450 int elem_idx = 0; /* Qualifier Element Index. */ 2451 bcm_field_qualify_t qid = 0; /* Qualifier id. */ 2452 uint32 q_data = 0; /* Qualifier data */ 2453 uint32 q_mask = 0; /* Qualifier mask */ 2454 int bit32_chunk = 0; /* Chunk is 32bit or 16bit */ 2455 2456 /* Input parameters check. */ 2457 if (NULL == f_dq) { 2458 return (BCM_E_PARAM); 2459 } 2460 2461 BCM_IF_ERROR_RETURN 2462 (_field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc)); 2463 2464 /* Find a proper element to insert the data. */ 2465 for (idx = 0; idx <= 15; idx ++) { 2466 if (f_dq->hw_bmap & (1 << idx)) { 2467 if (elem_idx == qual_elem_idx) { 2468 break; 2469 } else { 2470 elem_idx++; 2471 } 2472 } 2473 } 2474 2475 if (idx != 0x0 && idx != 0x1 && idx != 0x8 && idx != 0x9) 2476 { 2477 bit32_chunk = 1; 2478 } 2479 2480 /* Get entry info. */ 2481 BCM_IF_ERROR_RETURN 2482 (_field_entry_get(unit, eid, _FP_ENTRY_PRIMARY, &f_ent)); 2483 2484 BCM_IF_ERROR_RETURN(_bcm_field_th_field_qset_data_qualifier_get(idx, f_ent->group->qset,&qid)); 2485 2486 if(bit32_chunk) { 2487 /*Since a 32 bit chunk can be allocated even partially, 2488 do not overwrite existing data in 32bit chunk.*/ 2489 rv = _bcm_field_entry_qualifier_uint32_get(unit, f_ent->eid, qid, &q_data, &q_mask); 2490 2491 if ((rv != BCM_E_NOT_FOUND) && (BCM_FAILURE(rv))) { 2492 return rv; 2493 } 2494 2495 if (rv == BCM_E_NONE) { 2496 if((idx % 2) == 0) { 2497 /* Idx is even => Upper 16 bits need to be written.Hence,mask the lower 2498 *16 bits of the q_data fetched from tcam and add the data*/ 2499 q_data &= ((1 << 16) - 1); 2500 q_mask &= ((1 << 16) - 1); 2501 2502 data = data << 16 | q_data; 2503 mask = mask << 16 | q_mask; 2504 } else { 2505 /* Idx is odd => Lower 16 bits need to be written.Hence,mask the upper 2506 *16 bits of the q_data fetched from tcam and add the data*/ 2507 q_data &= ~((1 << 16) - 1); 2508 q_mask &= ~((1 << 16) - 1); 2509 2510 data |= q_data; 2511 mask |= q_mask; 2512 } 2513 } 2514 } 2515 2516 /* If device supports per-pipe FP configuration, */ 2517 if (soc_feature(unit, soc_feature_field_multi_pipe_support) && 2518 ((f_ent->group->stage_id == _BCM_FIELD_STAGE_INGRESS) || 2519 (f_ent->group->stage_id == _BCM_FIELD_STAGE_EXACTMATCH))) { 2520 /* coverity[callee_ptr_arith : FALSE] */ 2521 return (_bcm_field_th_qualify_set(unit, eid, qid, 2522 &data, &mask, _FP_QUALIFIER_ADD)); 2523 } else if ((f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP)) { 2524 _bcm_field_qual_offset_t *q_offset; 2525 int rv_sec = BCM_E_NONE; 2526 /* Get entry qualifier offset in tcam. */ 2527 rv = _field_qual_offset_get(unit, f_ent, qid, &q_offset); 2528 if (BCM_E_NOT_FOUND == rv) { 2529 /* If offset is not found in first */ 2530 rv_sec = (_field_entry_get(unit, eid, _FP_ENTRY_SECONDARY, &f_ent)); 2531 if (BCM_FAILURE(rv_sec)) { 2532 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 2533 "Entry %d Second part get failed with error %d\n "), 2534 eid, rv_sec)); 2535 return rv; 2536 } 2537 rv_sec = _field_qual_offset_get(unit, f_ent, qid, &q_offset); 2538 if (BCM_SUCCESS(rv_sec)) { 2539 rv = BCM_E_NONE; 2540 } else { 2541 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 2542 "Entry %d Qual %d Offset get failed with error %d\n "), 2543 eid, qid, rv_sec)); 2544 } 2545 } 2546 BCM_IF_ERROR_RETURN(rv); 2547 rv = _bcm_field_qual_value_set(unit, q_offset, f_ent, &data, &mask); 2548 BCM_IF_ERROR_RETURN(rv); 2549 2550 f_ent->flags |= _FP_ENTRY_DIRTY; 2551 } 2552 return BCM_E_NONE; 2553 } 2554 2555 /* 2556 * Function: 2557 * _bcm_field_th_field_qualify_data_get 2558 * Purpose: 2559 * Get data/mask in the search engine for entry field data qualifier. 2560 * Parameters: 2561 * unit - (IN) bcm device. 2562 * eid - (IN) Entry id. 2563 * qual_id - (IN) Data qualifier id. 2564 * length_max - (IN) Length of data & mask arrays. 2565 * data - (OUT) Match data. 2566 * mask - (OUT) Match mask. 2567 * length - (OUT) Length of data & mask arrays. 2568 * Returns: 2569 * BCM_E_XXX 2570 */ 2571 int 2572 _bcm_field_th_field_qualify_data_get(int unit, bcm_field_entry_t eid, int qual_id, 2573 uint16 length_max, uint8 *data, uint8 *mask, 2574 uint16 *length) 2575 { 2576 _field_stage_t *stage_fc; /* Stage field control. */ 2577 _field_data_qualifier_t *f_dq; /* Data qualifier descriptor. */ 2578 _field_entry_t *f_ent = NULL; /* Field entry structure. */ 2579 uint32 data1; /* 32 bit qualifier data. */ 2580 uint32 mask1; /* 32 bit qualifier mask. */ 2581 uint16 data2; /* 16 bit qualifier data. */ 2582 uint16 mask2; /* 16 bit qualifier mask. */ 2583 uint8 *p_data1 = (uint8 *) &data1; /* 32bit qualifier data pointer */ 2584 uint8 *p_mask1 = (uint8 *) &mask1; /* 32bit qualifier mask pointer */ 2585 uint8 *p_data2 = (uint8 *) &data2; /* 16bit qualifier data pointer */ 2586 uint8 *p_mask2 = (uint8 *) &mask2; /* 16bit qualifier mask pointer */ 2587 int bit32_chunk = 0; /* Chunk is 32bit or 16bit */ 2588 bcm_field_qualify_t qid = 0; /* Qualifier id. */ 2589 int idx; /* HW bitmap iteration index. */ 2590 int rv; /* Operation return status. */ 2591 int shift = 0; 2592 int copy_len; 2593 int len = 0; 2594 #ifdef LE_HOST 2595 uint32 data_swap, mask_swap; 2596 #endif /* LE_HOST */ 2597 2598 /* Input parameters check. */ 2599 if ((NULL == data) || (NULL == mask) || 2600 (NULL == length) || (length_max == 0)) { 2601 return (BCM_E_PARAM); 2602 } 2603 2604 memset(&data1, 0, sizeof(data1)); 2605 memset(&mask1, 0, sizeof(mask1)); 2606 2607 FP_LOCK(unit); 2608 2609 /* Get stage field control structure. */ 2610 rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc); 2611 if (BCM_FAILURE(rv)) { 2612 FP_UNLOCK(unit); 2613 return (rv); 2614 } 2615 2616 /* Get data qualifier info. */ 2617 rv = _bcm_field_data_qualifier_get(unit, stage_fc, qual_id, &f_dq); 2618 if (BCM_FAILURE(rv)) { 2619 FP_UNLOCK(unit); 2620 return (rv); 2621 } 2622 2623 /* 2624 * If provided entry data length is greater than data length used 2625 * to create qualifier then return error 2626 */ 2627 2628 if (length_max > f_dq->length) { 2629 FP_UNLOCK(unit); 2630 return (BCM_E_PARAM); 2631 } 2632 2633 rv = _bcm_field_entry_get_by_id(unit, eid, &f_ent); 2634 if (BCM_FAILURE(rv)) { 2635 FP_UNLOCK(unit); 2636 return (rv); 2637 } 2638 2639 for (idx = 0; idx <= 15; idx++) { 2640 if (!(f_dq->hw_bmap & (1 << idx))) { 2641 continue; 2642 } 2643 2644 if (idx != 0x0 && idx != 0x1 && idx != 0x8 && idx != 0x9) { 2645 bit32_chunk = 1; 2646 } else { 2647 bit32_chunk = 0; 2648 } 2649 2650 /*Get the qualifier id matching the idx from the Group's qset*/ 2651 rv = _bcm_field_th_field_qset_data_qualifier_get(idx, f_ent->group->qset,&qid); 2652 if (BCM_FAILURE(rv)) { 2653 FP_UNLOCK(unit); 2654 return (rv); 2655 } 2656 2657 /*Fetch the data from the Tcam.*/ 2658 if(bit32_chunk) { 2659 rv = _bcm_field_entry_qualifier_uint32_get(unit, eid, qid, 2660 &data1, &mask1); 2661 } else { 2662 rv = _bcm_field_entry_qualifier_uint16_get(unit, eid, qid, 2663 &data2, &mask2); 2664 } 2665 if (BCM_FAILURE(rv)) { 2666 FP_UNLOCK(unit); 2667 return (rv); 2668 } 2669 #ifdef LE_HOST 2670 data_swap = _shr_swap32(data1); 2671 data1 = data_swap; 2672 mask_swap = _shr_swap32(mask1); 2673 mask1 = mask_swap; 2674 data_swap = _shr_swap16(data2); 2675 data2 = data_swap; 2676 mask_swap = _shr_swap16(mask2); 2677 mask2 = mask_swap; 2678 #endif /* LE_HOST */ 2679 2680 if (len < f_dq->length) { 2681 if(bit32_chunk) { 2682 /* Idx is even => Lower 16 bits need to be copied. Hence, 2683 * start from offset 0. Idx is odd => Upper 16 bits need to be 2684 * copied, hence start from offset 2 of the 32bit chunk's data.*/ 2685 shift = (idx % 2 == 0) ? 0 : 2 ; 2686 copy_len = ((f_dq->length - len) == 1)? 1 : 2; 2687 sal_memcpy((data + len), p_data1 + shift, copy_len); 2688 sal_memcpy((mask + len), p_mask1 + shift, copy_len); 2689 len+= copy_len; 2690 } else { 2691 copy_len = ((f_dq->length - len) == 1)? 1 : 2; 2692 sal_memcpy((data + len), p_data2, copy_len); 2693 sal_memcpy((mask + len), p_mask2, copy_len); 2694 len+= copy_len; 2695 } 2696 } 2697 } 2698 2699 *length = f_dq->length; 2700 2701 FP_UNLOCK(unit); 2702 return BCM_E_NONE; 2703 } 2704 /* 2705 * Function: 2706 * _field_th_data_qualifier_destroy_all 2707 * 2708 * Purpose: 2709 * Destroy all data/offset based qualifiers. 2710 * 2711 * Parameters: 2712 * unit - (IN) BCM device number 2713 * 2714 * Returns: 2715 * BCM_E_INIT - Stage is not initialized. 2716 * BCM_E_UNAVAIL - function not supported for this stage. 2717 * BCM_E_NONE - Success. 2718 */ 2719 STATIC int 2720 _field_th_data_qualifier_destroy_all(int unit) 2721 { 2722 _field_data_qualifier_t *f_dq; /* Internal data qualifier descriptor. */ 2723 _field_stage_t *stage_fc; /* Stage field control. */ 2724 2725 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, 2726 _BCM_FIELD_STAGE_INGRESS, &stage_fc)); 2727 2728 while (NULL != stage_fc->data_ctrl->data_qual) { 2729 f_dq = stage_fc->data_ctrl->data_qual; 2730 BCM_IF_ERROR_RETURN(_bcm_field_data_qualifier_destroy(unit, f_dq->qid)); 2731 } 2732 return (BCM_E_NONE); 2733 } 2734 2735 /* 2736 * Function: 2737 * _field_th_stage_data_ctrl_deinit 2738 * 2739 * Purpose: 2740 * De-allocate data qualifiers control structure. 2741 * 2742 * Parameters: 2743 * unit - (IN) BCM device number 2744 * stage_fc - (IN/OUT) Stage for which data qualifier need to be freed. 2745 * 2746 * Returns: 2747 * BCM_E_PARAM - NULL Stage control data structure pointer. 2748 * BCM_E_NONE - Success 2749 */ 2750 STATIC int 2751 _field_th_stage_data_ctrl_deinit(int unit, _field_stage_t *stage_fc) 2752 { 2753 _field_data_control_t *data_ctrl; /* Data qualifiers control structure 2754 pointer. */ 2755 2756 /* Input parameters check. */ 2757 if (NULL == stage_fc) { 2758 return (BCM_E_PARAM); 2759 } 2760 2761 /* Free the data qualifiers control structure only for IFP. */ 2762 if (_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) { 2763 return (BCM_E_NONE); 2764 } 2765 2766 /* If data qualifiers control structure is already freed, return SUCCESS. */ 2767 data_ctrl = stage_fc->data_ctrl; 2768 if (NULL == data_ctrl) { 2769 return (BCM_E_NONE); 2770 } 2771 2772 /* Delete all data qualifiers. */ 2773 _field_th_data_qualifier_destroy_all(unit); 2774 2775 /* Free control structures. */ 2776 if (NULL != data_ctrl->tcam_entry_arr) { 2777 sal_free(data_ctrl->tcam_entry_arr); 2778 } 2779 2780 /* Free data qualifiers control structure memory. */ 2781 if (NULL != data_ctrl) { 2782 sal_free(data_ctrl); 2783 } 2784 2785 /* Initialize stage data qualifier control structure pointer to NULL. */ 2786 stage_fc->data_ctrl = NULL; 2787 return (BCM_E_NONE); 2788 } 2789 2790 /* 2791 * Function: 2792 * _field_th_stage_keygen_extractors_deinit 2793 * 2794 * Purpose: 2795 * Deinitialize field stage keygen extractors information. 2796 * 2797 * Parameters: 2798 * unit - (IN) BCM device number 2799 * stage_fc - (IN) stage control structure. 2800 * 2801 * Returns: 2802 * BCM_E_PARAM - Device Stage field control structure pointer is NULL. 2803 * BCM_E_NONE - Success 2804 */ 2805 STATIC int 2806 _field_th_stage_keygen_extractors_deinit(int unit, _field_stage_t *stage_fc) 2807 { 2808 bcm_error_t rv = BCM_E_NONE; 2809 bcmi_keygen_mode_t emode; /* Extractor mode. */ 2810 bcmi_keygen_ext_cfg_db_t *ext_cfg_db; /* Extractor configuration. */ 2811 2812 /* Input parameters check. */ 2813 if (NULL == stage_fc) { 2814 return (BCM_E_PARAM); 2815 } 2816 2817 /* Do nothing for Non-IFP stages. */ 2818 if ((_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) && 2819 (_BCM_FIELD_STAGE_FLOWTRACKER != stage_fc->stage_id)) { 2820 return (BCM_E_NONE); 2821 } 2822 2823 /* Do nothing if it's already freed. */ 2824 if (NULL == stage_fc->ext_cfg_db_arr) { 2825 return (BCM_E_NONE); 2826 } 2827 2828 for (emode = 0; emode < BCMI_KEYGEN_MODE_COUNT; emode++) { 2829 2830 /* Get extractor config array pointer. */ 2831 ext_cfg_db = stage_fc->ext_cfg_db_arr[emode]; 2832 if (NULL == ext_cfg_db) { 2833 continue; 2834 } 2835 2836 rv = bcmi_keygen_ext_cfg_db_free(unit, ext_cfg_db); 2837 if (BCM_FAILURE(rv)) { 2838 return rv; 2839 } 2840 stage_fc->ext_cfg_db_arr[emode] = NULL; 2841 } 2842 2843 sal_free(stage_fc->ext_cfg_db_arr); 2844 /* Mark extractor configuration array as unused. */ 2845 stage_fc->ext_cfg_db_arr = NULL; 2846 2847 return (BCM_E_NONE); 2848 } 2849 2850 /* 2851 * Function: 2852 * _field_th_stage_keygen_qual_db_deinit 2853 * 2854 * Purpose: 2855 * Deinitialize field stage keygen qualifiers config information database. 2856 * 2857 * Parameters: 2858 * unit - (IN) BCM device number 2859 * stage_fc - (IN) stage control structure. 2860 * 2861 * Returns: 2862 * BCM_E_PARAM - Device Stage field control structure pointer is NULL. 2863 * BCM_E_NONE - Success 2864 */ 2865 STATIC int 2866 _field_th_stage_keygen_qual_db_deinit(int unit, _field_stage_t *stage_fc) 2867 { 2868 bcm_error_t rv = BCM_E_NONE; 2869 2870 /* Input parameters check. */ 2871 if (NULL == stage_fc) { 2872 return (BCM_E_PARAM); 2873 } 2874 2875 /* Do nothing for Non-IFP stages. */ 2876 if ((_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) && 2877 (_BCM_FIELD_STAGE_FLOWTRACKER != stage_fc->stage_id)) { 2878 return (BCM_E_NONE); 2879 } 2880 2881 /* Do nothing if already freed. */ 2882 if (NULL == stage_fc->qual_cfg_info_db) { 2883 return (BCM_E_NONE); 2884 } 2885 2886 rv = bcmi_keygen_qual_cfg_info_db_free(unit, stage_fc->qual_cfg_info_db); 2887 if (BCM_FAILURE(rv)) { 2888 return rv; 2889 } 2890 2891 /* Deallocate qualifiers sections pointers memory. */ 2892 sal_free(stage_fc->qual_cfg_info_db); 2893 2894 /* Mark qualifier list as unused. */ 2895 stage_fc->qual_cfg_info_db = NULL; 2896 2897 return (BCM_E_NONE); 2898 } 2899 2900 /* 2901 * Function: 2902 * _field_th_stage_actions_deinit 2903 * 2904 * Purpose: 2905 * Deinitialize field stage actions configuration array. 2906 * 2907 * Parameters: 2908 * unit - (IN) BCM device number 2909 * stage_fc - (IN) stage control structure. 2910 * 2911 * Returns: 2912 * BCM_E_PARAM - Device Stage field control structure pointer is NULL. 2913 * BCM_E_NONE - Success 2914 */ 2915 STATIC int 2916 _field_th_stage_actions_deinit(int unit, _field_stage_t *stage_fc) 2917 { 2918 int idx; /* Index to loop through all field actions */ 2919 _bcm_field_action_offset_t *offset; /* Offset Information. */ 2920 2921 /* Input parameters check. */ 2922 if (NULL == stage_fc) { 2923 return (BCM_E_PARAM); 2924 } 2925 2926 /* Do nothing for Non-IFP stages. */ 2927 if ((_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) && 2928 (_BCM_FIELD_STAGE_EXACTMATCH != stage_fc->stage_id)) { 2929 return (BCM_E_NONE); 2930 } 2931 2932 2933 if (NULL != stage_fc->f_action_arr) { 2934 2935 for (idx = 0; idx < _bcmFieldActionCount; idx++) { 2936 if (NULL != stage_fc->f_action_arr[idx]) { 2937 2938 if (NULL != stage_fc->f_action_arr[idx]->offset) { 2939 do { 2940 offset = stage_fc->f_action_arr[idx]->offset; 2941 stage_fc->f_action_arr[idx]->offset = 2942 stage_fc->f_action_arr[idx]->offset->next; 2943 /* Deallocate different offset information for same action. */ 2944 sal_free(offset); 2945 } while(stage_fc->f_action_arr[idx]->offset); 2946 } 2947 /* Deallocate action configuration */ 2948 sal_free(stage_fc->f_action_arr[idx]); 2949 } 2950 } 2951 2952 /* Deallocate action configuration pointer array */ 2953 sal_free(stage_fc->f_action_arr); 2954 } 2955 2956 return BCM_E_NONE; 2957 } 2958 /* 2959 * Function: 2960 * _field_th_stage_delete 2961 * 2962 * Purpose: 2963 * Deinitialize a field stage. 2964 * 2965 * Parameters: 2966 * unit - (IN) BCM device number 2967 * fc - (IN/OUT) Field control info of device. 2968 * stage_fc - (IN) stage control structure. 2969 * 2970 * Returns: 2971 * BCM_E_PARAM - Device field control information is NULL. 2972 * BCM_E_NONE - Success 2973 */ 2974 STATIC int 2975 _field_th_stage_delete(int unit, _field_control_t *fc, _field_stage_t *stage_fc) 2976 { 2977 _field_stage_t *stage_iter; /* Device stages iterator. */ 2978 int inst; /* Stage instance iterator. */ 2979 2980 /* Input parameters check. */ 2981 if (NULL == fc) { 2982 return (BCM_E_PARAM); 2983 } 2984 2985 /* Stage already destroyed. */ 2986 if (NULL == stage_fc) { 2987 return (BCM_E_NONE); 2988 } 2989 2990 2991 /* First Exact Match Stage Specific delete */ 2992 if (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id) { 2993 _field_th_emstage_deinit(unit, stage_fc); 2994 } 2995 #if defined(BCM_FLOWTRACKER_SUPPORT) 2996 if ((soc_feature(unit, soc_feature_field_flowtracker_support)) && 2997 (_BCM_FIELD_STAGE_FLOWTRACKER == stage_fc->stage_id)) { 2998 _field_hx5_ftstage_deinit(unit, stage_fc); 2999 } 3000 #endif 3001 3002 /* Destroy data qualifiers control structure. */ 3003 if (!soc_feature(unit, soc_feature_td3_style_fp)) { 3004 _field_th_stage_data_ctrl_deinit(unit, stage_fc); 3005 } 3006 3007 /* Free memory alloacted for stage qualifiers */ 3008 _bcm_field_stage_qualifiers_free(unit, stage_fc); 3009 3010 /* Free memory allocated for extractors configuration table. */ 3011 _field_th_stage_keygen_extractors_deinit(unit, stage_fc); 3012 3013 /* Free memory allocated for qualifiers input bus mapping table. */ 3014 _field_th_stage_keygen_qual_db_deinit(unit, stage_fc); 3015 3016 /* Free memory allocated for actions configurations. */ 3017 _field_th_stage_actions_deinit(unit, stage_fc); 3018 3019 if (_BCM_FIELD_STAGE_LOOKUP == stage_fc->stage_id) { 3020 soc_profile_mem_destroy(unit, &stage_fc->hash_select[0]); 3021 soc_profile_mem_destroy(unit, &stage_fc->hash_select[1]); 3022 } 3023 3024 /* Free stage per-instance information. */ 3025 for (inst = 0; inst < stage_fc->num_instances; inst++) { 3026 if (!(fc->pipe_map & (1 << inst))) { 3027 continue; 3028 } 3029 /* 3030 * Check if slices were initialized for current instance in the 3031 * stage. 3032 */ 3033 if (NULL != stage_fc->slices[inst]) { 3034 /* Deallocate counters usage bitmap. */ 3035 _field_th_instance_counters_deinit(unit, stage_fc, inst); 3036 3037 /* Deallocate instance meters usage bitmap. */ 3038 _field_th_instance_meters_deinit(unit, stage_fc, inst); 3039 3040 /* Deallocate instance entry pointers. */ 3041 _field_th_instance_entries_free(unit, stage_fc, inst); 3042 3043 /* Deallocate instance priority management structures. */ 3044 _field_th_instance_prio_mgmt_deinit(unit, stage_fc, inst); 3045 3046 sal_free(stage_fc->slices[inst]); 3047 stage_fc->slices[inst] = NULL; 3048 } 3049 3050 /* Destroy keygen program profiles for valid instances. */ 3051 if ((_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) || 3052 (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id)) { 3053 soc_profile_mem_destroy(unit, 3054 &stage_fc->keygen_profile[inst].profile); 3055 } 3056 3057 /* Destroy action profiles for TD3 Ingress */ 3058 if (soc_feature(unit, soc_feature_ifp_action_profiling) && 3059 (_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id)) { 3060 soc_profile_mem_destroy(unit, 3061 &stage_fc->action_profile[inst]); 3062 } 3063 /* Destroy action profiles for valid instances. */ 3064 if (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id) { 3065 soc_profile_mem_destroy(unit, 3066 &stage_fc->action_profile[inst]); 3067 soc_profile_mem_destroy(unit, 3068 &stage_fc->qos_action_profile[inst]); 3069 } 3070 } 3071 3072 /* Deallocate Preselector resources for IFP and EM Stage. */ 3073 _bcm_field_th_preselector_deinit(unit, fc, stage_fc); 3074 3075 /* Destroy all valid range checkers. */ 3076 while (stage_fc->ranges != NULL) { 3077 bcm_esw_field_range_destroy(unit, stage_fc->ranges->rid); 3078 } 3079 3080 /* Destroy class status info struct */ 3081 if (stage_fc->stage_id == _BCM_FIELD_STAGE_CLASS) { 3082 _bcm_field_th_class_stage_status_deinit(unit, stage_fc); 3083 } 3084 3085 /* Remove stage from stages linked list. */ 3086 stage_iter = fc->stages; 3087 while (NULL != stage_iter) { 3088 if (stage_iter == stage_fc) { 3089 fc->stages = stage_fc->next; 3090 break; 3091 } else if (stage_iter->next == stage_fc) { 3092 stage_iter->next = stage_fc->next; 3093 break; 3094 } 3095 stage_iter = stage_iter->next; 3096 } 3097 3098 /* Free stage info. */ 3099 sal_free(stage_fc); 3100 stage_fc = NULL; 3101 3102 return (BCM_E_NONE); 3103 } 3104 3105 /* 3106 * Function: 3107 * _field_th_instance_slices_init 3108 * 3109 * Purpose: 3110 * Allocate memory for slices and initialize slice specific flags & 3111 * parameters for a specific instance. 3112 * 3113 * Parameters: 3114 * unit - (IN) BCM device number. 3115 * stage_fc - (IN/OUT) Stage field control structure. 3116 * inst - (IN) Stage instance information. 3117 * 3118 * Returns: 3119 * BCM_E_PARAM - NULL stage control pointer. 3120 * BCM_E_MEMORY - Allocation failure. 3121 * BCM_E_NONE - Success. 3122 */ 3123 STATIC int 3124 _field_th_instance_slices_init(int unit, _field_stage_t *stage_fc, int inst) 3125 { 3126 struct _field_slice_s *fs; /* Slice info. */ 3127 int slice; /* Slice iterator. */ 3128 int mem_sz; /* Memory allocation buffer size. */ 3129 3130 /* Input parameters check. */ 3131 if (NULL == stage_fc) { 3132 return (BCM_E_PARAM); 3133 } 3134 3135 /* Validate instance value. */ 3136 if (inst < 0 || inst >= stage_fc->num_instances) { 3137 return (BCM_E_PARAM); 3138 } 3139 3140 /* Allocate slices info. */ 3141 mem_sz = stage_fc->tcam_slices * sizeof(_field_slice_t); 3142 fs = sal_alloc(mem_sz, "stage slices info"); 3143 if (NULL == fs) { 3144 return (BCM_E_MEMORY); 3145 } 3146 3147 /* Initialze stage slice data structure. */ 3148 sal_memset(fs, 0, mem_sz); 3149 3150 /* Initialize stage instance slices pointer. */ 3151 stage_fc->slices[inst] = fs; 3152 3153 /* Initialize stage slices info. */ 3154 for (slice = 0; slice < stage_fc->tcam_slices; slice++) { 3155 fs[slice].slice_number = slice; 3156 fs[slice].stage_id = stage_fc->stage_id; 3157 fs[slice].next = NULL; 3158 fs[slice].prev = NULL; 3159 3160 /* Set legacy slice selector settings to don't care. */ 3161 fs[slice].doublewide_key_select = _FP_SELCODE_DONT_CARE; 3162 fs[slice].src_class_sel = _FP_SELCODE_DONT_CARE; 3163 fs[slice].dst_class_sel = _FP_SELCODE_DONT_CARE; 3164 fs[slice].intf_class_sel = _FP_SELCODE_DONT_CARE; 3165 fs[slice].loopback_type_sel = _FP_SELCODE_DONT_CARE; 3166 fs[slice].ingress_entity_sel = _FP_SELCODE_DONT_CARE; 3167 fs[slice].src_entity_sel = _FP_SELCODE_DONT_CARE; 3168 fs[slice].dst_fwd_entity_sel = _FP_SELCODE_DONT_CARE; 3169 fs[slice].fwd_field_sel = _FP_SELCODE_DONT_CARE; 3170 3171 /* Both IFP and VFP support Intra Slice Double Wide mode. */ 3172 if ((_BCM_FIELD_STAGE_EGRESS != stage_fc->stage_id) && 3173 (_BCM_FIELD_STAGE_EXACTMATCH != stage_fc->stage_id) && 3174 (_BCM_FIELD_STAGE_FLOWTRACKER != stage_fc->stage_id)) { 3175 fs[slice].slice_flags |= _BCM_FIELD_SLICE_INTRASLICE_CAPABLE; 3176 } 3177 #if defined(BCM_FLOWTRACKER_SUPPORT) 3178 if (_BCM_FIELD_STAGE_FLOWTRACKER == stage_fc->stage_id) { 3179 fs[slice].slice_flags |= _BCM_FIELD_SLICE_MULTIMODE_ENTRIES; 3180 } 3181 #endif 3182 } 3183 3184 return (BCM_E_NONE); 3185 } 3186 3187 /* 3188 * Function: 3189 * _field_th_slices_init 3190 * 3191 * Purpose: 3192 * Allocate memory for slices per-instance in a stage. 3193 * 3194 * Parameters: 3195 * unit - (IN) BCM device number. 3196 * stage_fc - (IN/OUT) Stage field control structure. 3197 * fc - (IN/OUT) Field control structure. 3198 * 3199 * Returns: 3200 * BCM_E_PARAM - NULL stage control pointer or field control. 3201 * BCM_E_MEMORY - Allocation failure. 3202 * BCM_E_NONE - Success. 3203 */ 3204 STATIC int 3205 _field_th_slices_init(int unit, _field_stage_t *stage_fc, _field_control_t *fc) 3206 { 3207 int inst; /* Stage instance iterator. */ 3208 int rv; /* Operation return value. */ 3209 3210 /* Input parameters check. */ 3211 if (NULL == fc || NULL == stage_fc) { 3212 return (BCM_E_PARAM); 3213 } 3214 3215 /* For all valid instances, initialize slices information. */ 3216 for (inst = 0; inst < stage_fc->num_instances; inst++) { 3217 if (!(fc->pipe_map & (1 << inst))) { 3218 continue; 3219 } 3220 rv = _field_th_instance_slices_init(unit, stage_fc, inst); 3221 if (BCM_FAILURE(rv)) { 3222 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 3223 "FP(unit %d) Error: _field_th_instance_slices_init=%d\n"), 3224 unit, rv)); 3225 return (rv); 3226 } 3227 } 3228 3229 return (BCM_E_NONE); 3230 } 3231 3232 /* 3233 * Function: 3234 * _field_th_stage_entries_free 3235 * 3236 * Purpose: 3237 * Free entries array for all stage slices for all instances. 3238 * 3239 * Parameters: 3240 * unit - (IN) BCM device number. 3241 * stage_fc - (IN/OUT) Stage field control. 3242 * 3243 * Returns: 3244 * BCM_E_PARAM - NULL stage control pointer 3245 * BCM_E_NONE - Success. 3246 */ 3247 STATIC int 3248 _field_th_stage_entries_free(int unit, _field_stage_t *stage_fc) 3249 { 3250 _field_slice_t *fs; /* Field slice pointer. */ 3251 int slice; /* Slice iterator. */ 3252 int inst; /* Instance iterator. */ 3253 _field_control_t *fc; /* Field control structure. */ 3254 3255 /* Input prameters check. */ 3256 if (NULL == stage_fc) { 3257 return (BCM_E_PARAM); 3258 } 3259 3260 /* Get field control structure. */ 3261 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 3262 3263 /* Deallocate instance entry pointers. */ 3264 for (inst = 0; inst < stage_fc->num_instances; inst++) { 3265 if (!(fc->pipe_map & (1 << inst))) { 3266 continue; 3267 } 3268 for (slice = 0; slice < stage_fc->tcam_slices; slice++) { 3269 fs = stage_fc->slices[inst] + slice; 3270 if (NULL != fs->entries) { 3271 sal_free(fs->entries); 3272 fs->entries = NULL; 3273 } 3274 } 3275 } 3276 3277 return (BCM_E_NONE); 3278 } 3279 3280 /* 3281 * Function: 3282 * _field_th_instance_entries_init 3283 * Purpose: 3284 * Initialize Logical Table slice entries for a StageIngress instance. 3285 * Parameters: 3286 * unit - (IN) BCM device number. 3287 * stage_fc - (IN) stage control structure pointer. 3288 * inst - (IN) Field Pipe Instance for which Logical tables must be 3289 * deinitialized. 3290 * Returns: 3291 * BCM_E_PARAM - Device stage field control information is NULL 3292 * or Invalid instance specified. 3293 * BCM_E_NONE - Success 3294 */ 3295 STATIC int 3296 _field_th_instance_entries_init(int unit, _field_stage_t *stage_fc, int inst) 3297 { 3298 int slice; /* Slice iterator. */ 3299 int tcam_idx; /* Slice first entry tcam index tracker. */ 3300 int mem_sz; /* Allocation size. */ 3301 _field_slice_t *fs; /* Slice config structure. */ 3302 int entry_ratio = 1; /* Valid entries ratio.*/ 3303 3304 /* Input parameters check. */ 3305 if (NULL == stage_fc) { 3306 return (BCM_E_PARAM); 3307 } 3308 3309 /* Check if instance is in valid range. */ 3310 if (inst < 0 || inst >= stage_fc->num_instances) { 3311 return (BCM_E_PARAM); 3312 } 3313 3314 /* Make sure slices array is initialized. */ 3315 if (NULL == stage_fc->slices[inst]) { 3316 return (BCM_E_INTERNAL); 3317 } 3318 if (soc_feature(unit, soc_feature_field_stage_half_slice)) { 3319 entry_ratio = 2; 3320 } else if (soc_feature(unit, soc_feature_field_stage_quarter_slice)) { 3321 entry_ratio = 4; 3322 } 3323 3324 /* Iterate over all stage's slices and allocate entries for each slice. */ 3325 for (slice = 0, tcam_idx = 0; slice < stage_fc->tcam_slices; slice++) { 3326 /* Get Pipe slice control structure pointer. */ 3327 fs = stage_fc->slices[inst] + slice; 3328 3329 #if defined(BCM_TOMAHAWK3_SUPPORT) 3330 /* Initialize entries per-slice count. */ 3331 if ((SOC_IS_TOMAHAWK3(unit)) && 3332 (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS)) { 3333 if (slice < _BCM_FIELD_TH3_INGRESS_MAX_SMALL_SLICES) { 3334 fs->entry_count = _BCM_FIELD_TH3_INGRESS_SMALL_SLICE_SZ; 3335 if (soc_feature(unit, soc_feature_field_ingress_two_slice_types)) { 3336 fs->slice_flags |= _BCM_FIELD_SLICE_SIZE_SMALL; 3337 } 3338 } else { 3339 fs->entry_count = _BCM_FIELD_TH3_INGRESS_LARGE_SLICE_SZ; 3340 if (soc_feature(unit, soc_feature_field_ingress_two_slice_types)) { 3341 fs->slice_flags |= _BCM_FIELD_SLICE_SIZE_LARGE; 3342 } 3343 } 3344 } else 3345 #endif /* BCM_TOMAHAWK3_SUPPORT */ 3346 { 3347 fs->entry_count = stage_fc->tcam_sz / stage_fc->tcam_slices; 3348 } 3349 /* Calculate size for total entry pointers. */ 3350 mem_sz = fs->entry_count * sizeof(void *); 3351 3352 /* Allocate slice entries pointers array. */ 3353 _FP_XGS3_ALLOC(fs->entries, mem_sz, "array of entry pointers."); 3354 if (NULL == fs->entries) { 3355 /* Allocation failed free all previously allocated entries. */ 3356 _field_th_stage_entries_free(unit, stage_fc); 3357 return (BCM_E_MEMORY); 3358 } 3359 3360 fs->start_tcam_idx = tcam_idx; 3361 tcam_idx += fs->entry_count * entry_ratio; 3362 fs->free_count = fs->entry_count; 3363 } 3364 3365 return (BCM_E_NONE); 3366 } 3367 3368 /* 3369 * Function: 3370 * _field_th_entries_init 3371 * 3372 * Purpose: 3373 * Allocate the memory for entries in all the slices in all instances for a 3374 * stage. 3375 * 3376 * Parameters: 3377 * unit - (IN) BCM device number. 3378 * stage_fc - (IN/OUT) Stage field control. 3379 * 3380 * Returns: 3381 * BCM_E_PARAM - NULL stage control pointer 3382 * BCM_E_MEMORY - Allocation failure 3383 * BCM_E_NONE - Success 3384 */ 3385 STATIC int 3386 _field_th_entries_init(int unit, _field_stage_t *stage_fc, 3387 _field_control_t *fc) 3388 { 3389 int inst; /* Instance iterator. */ 3390 3391 /* Input parameters check. */ 3392 if (NULL == stage_fc) { 3393 return (BCM_E_PARAM); 3394 } 3395 3396 /* Iterate over all instances. */ 3397 for (inst = 0; inst < stage_fc->num_instances; inst++) { 3398 if (!(fc->pipe_map & (1 << inst))) { 3399 continue; 3400 } 3401 BCM_IF_ERROR_RETURN(_field_th_instance_entries_init(unit, stage_fc, 3402 inst)); 3403 } 3404 3405 return (BCM_E_NONE); 3406 } 3407 3408 /* 3409 * Function: 3410 * _field_th_meters_deinit 3411 * 3412 * Purpose: 3413 * Deinitialize merter usage bitmap for all instances in a stage. 3414 * 3415 * Parameters: 3416 * unit - (IN) BCM device number. 3417 * stage_fc - (IN/OUT) Stage field control. 3418 * 3419 * Returns: 3420 * BCM_E_PARAM - NULL stage control pointer. 3421 * BCM_E_NONE - Success. 3422 */ 3423 STATIC int 3424 _field_th_meters_deinit(int unit, _field_stage_t *stage_fc) 3425 { 3426 int inst; /* Instance iterator. */ 3427 _field_control_t *fc; /* Field control structure. */ 3428 3429 /* Input parameters check. */ 3430 if (NULL == stage_fc) { 3431 return (BCM_E_PARAM); 3432 } 3433 3434 /* Get field control structure. */ 3435 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 3436 3437 /* Free instance meter resources. */ 3438 for (inst = 0; inst < stage_fc->num_instances; inst++) { 3439 if (!(fc->pipe_map & (1 << inst))) { 3440 continue; 3441 } 3442 _field_th_instance_meters_deinit(unit, stage_fc, inst); 3443 } 3444 3445 return (BCM_E_NONE); 3446 } 3447 3448 /* 3449 * Function: 3450 * _field_th_meter_pools_init 3451 * 3452 * Purpose: 3453 * Initialize field meter pools usage bitmap for all instances in a stage. 3454 * 3455 * Parameters: 3456 * unit - (IN) BCM device number 3457 * stage_fc - (IN/OUT) Stage field control structure. 3458 * 3459 * Returns: 3460 * BCM_E_PARAM - NULL stage control pointer. 3461 * BCM_E_MEMORY - Allocation failure. 3462 * BCM_E_NONE - Success. 3463 */ 3464 STATIC int 3465 _field_th_meter_pools_init(int unit, _field_stage_t *stage_fc, 3466 _field_control_t *fc) 3467 { 3468 int inst; /* Instance iterator. */ 3469 int pool_idx; /* Meter pools iterator. */ 3470 int size; /* Number of meters in a pool. */ 3471 _field_meter_pool_t *mp; /* Meter pool pointer. */ 3472 int meter_pairs_per_pool =0; 3473 int pipe = -1, pool = -1; 3474 int rv = 0; 3475 3476 /* Input parameters check. */ 3477 if (NULL == stage_fc) { 3478 return (BCM_E_PARAM); 3479 } 3480 3481 /* Initialize number of meter pools. */ 3482 if (SOC_IS_TOMAHAWK3(unit)) { 3483 stage_fc->num_meter_pools = BCM_FIELD_INGRESS_TH3_NUM_METER_POOLS; 3484 } else { 3485 stage_fc->num_meter_pools = BCM_FIELD_INGRESS_TH_NUM_METER_POOLS; 3486 } 3487 3488 if (soc_feature(unit, soc_feature_td3_style_fp)) { 3489 meter_pairs_per_pool = BCM_FIELD_INGRESS_TD3_NUM_METER_PAIRS_PER_POOL; 3490 } else { 3491 meter_pairs_per_pool = BCM_FIELD_INGRESS_TH_NUM_METER_PAIRS_PER_POOL; 3492 } 3493 /* Initialize number of meter per pool.*/ 3494 size = SHR_BITALLOCSIZE(meter_pairs_per_pool << 1); 3495 3496 /* Initialize meter pools in all instances. */ 3497 for (inst = 0; inst < _FP_MAX_NUM_PIPES; inst++) { 3498 if (!(fc->pipe_map & (1 << inst))) { 3499 continue; 3500 } 3501 for (pool_idx = 0; pool_idx < stage_fc->num_meter_pools; pool_idx++) { 3502 /* Allocate Pipe meter pool memory. */ 3503 stage_fc->meter_pool[inst][pool_idx] = 3504 sal_alloc(sizeof(_field_meter_pool_t), "fp_meter_pool"); 3505 if (NULL == stage_fc->meter_pool[inst][pool_idx]) { 3506 _field_th_meters_deinit(unit, stage_fc); 3507 return (BCM_E_MEMORY); 3508 } 3509 3510 /* Initialize stage instance meter pool info. */ 3511 mp = stage_fc->meter_pool[inst][pool_idx]; 3512 mp->slice_id = -1; 3513 mp->level = -1; 3514 mp->pool_size = (meter_pairs_per_pool * 2); 3515 mp->size = (meter_pairs_per_pool * 2); 3516 mp->free_meters = (meter_pairs_per_pool * 2); 3517 mp->num_meter_pairs = (meter_pairs_per_pool); 3518 3519 /* Allocate instance Per-Pool meter usage bitmap memory. */ 3520 mp->meter_bmp.w = sal_alloc(size, "fp_meters_map"); 3521 if (NULL == mp->meter_bmp.w) { 3522 _field_th_meters_deinit(unit, stage_fc); 3523 return (BCM_E_MEMORY); 3524 } 3525 /* Clear pool meter usage bitmap. */ 3526 sal_memset(mp->meter_bmp.w, 0, size); 3527 } 3528 } 3529 3530 if (!(SOC_WARM_BOOT(unit))) { 3531 for (pipe = 0; pipe < _FP_MAX_NUM_PIPES; pipe++) { 3532 for (pool = 0; pool < _FIELD_MAX_METER_POOLS; pool++) { 3533 if ((stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) && 3534 (fc->ifp_em_meter_in_use[pipe][pool] == 3535 BCM_FIELD_METER_POOL_USED_BY_EM)) { 3536 /* Copy from EM to IFP */ 3537 rv = (_field_stage_meter_pool_copy 3538 (unit, _BCM_FIELD_STAGE_EXACTMATCH, 3539 stage_fc, pipe, pool)); 3540 BCM_IF_ERROR_RETURN(rv); 3541 } else if ((stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) && 3542 (fc->ifp_em_meter_in_use[pipe][pool] == 3543 BCM_FIELD_METER_POOL_USED_BY_IFP)) { 3544 /* Copy from IFP to EM */ 3545 rv = (_field_stage_meter_pool_copy 3546 (unit, _BCM_FIELD_STAGE_INGRESS, 3547 stage_fc, pipe, pool)); 3548 BCM_IF_ERROR_RETURN(rv); 3549 } 3550 } 3551 } 3552 } 3553 return (BCM_E_NONE); 3554 } 3555 3556 /* 3557 * Function: 3558 * _field_th_slice_meters_init 3559 * 3560 * Purpose: 3561 * Initialize field slice meters usage bitmap for all instances in a stage. 3562 * 3563 * Parameters: 3564 * unit - (IN) BCM device number 3565 * stage_fc - (IN/OUT) Stage field control structure. 3566 * 3567 * Returns: 3568 * BCM_E_PARAM - NULL stage control pointer. 3569 * BCM_E_MEMORY - Allocation failure. 3570 * BCM_E_NONE - Success. 3571 */ 3572 STATIC int 3573 _field_th_slice_meters_init(int unit, _field_stage_t *stage_fc, 3574 _field_control_t *fc) 3575 { 3576 _field_slice_t *fs; /* Slice config structure. */ 3577 int inst; /* Instance iterator. */ 3578 int size; /* Allocation size. */ 3579 int slice; /* Slice iterator. */ 3580 3581 /* Input parameters check. */ 3582 if (NULL == stage_fc) { 3583 return (BCM_E_PARAM); 3584 } 3585 3586 /* Iterate over all instances and slices and initialize meter information.*/ 3587 for (inst = 0; inst < stage_fc->num_instances; inst++) { 3588 if (!(fc->pipe_map & (1 << inst))) { 3589 continue; 3590 } 3591 for (slice = 0; slice <stage_fc->tcam_slices; slice++) { 3592 3593 /* Get the slice pointer. */ 3594 fs = stage_fc->slices[inst] + slice; 3595 3596 size = SHR_BITALLOCSIZE(_BCM_FIELD_SLICE_SIZE(stage_fc, inst, 0)); 3597 /* Allocate meter usage bitmap. */ 3598 fs->meter_bmp.w = sal_alloc(size, "fp_meters_map"); 3599 if (NULL == fs->meter_bmp.w) { 3600 _field_th_meters_deinit(unit, stage_fc); 3601 return (BCM_E_MEMORY); 3602 } 3603 3604 /* Set slice meter count and clear usage bitmap. */ 3605 fs->meters_count = _BCM_FIELD_SLICE_SIZE(stage_fc, inst, 0); 3606 sal_memset(fs->meter_bmp.w, 0, size); 3607 } 3608 } 3609 return (BCM_E_NONE); 3610 } 3611 3612 /* 3613 * Function: 3614 * _field_th_meters_init 3615 * 3616 * Purpose: 3617 * Initialize field meter usage bitmap for the sage. 3618 * 3619 * Parameters: 3620 * unit - (IN) BCM device number 3621 * stage_fc - (IN/OUT) Stage field control structure. 3622 * 3623 * Returns: 3624 * BCM_E_PARAM - NULL stage control pointer. 3625 * BCM_E_MEMORY - Allocation failure. 3626 * BCM_E_NONE - Success. 3627 */ 3628 STATIC int 3629 _field_th_meters_init(int unit, _field_stage_t *stage_fc, 3630 _field_control_t *fc) 3631 { 3632 /* Input parameters check. */ 3633 if (NULL == stage_fc) { 3634 return (BCM_E_PARAM); 3635 } 3636 3637 /* Lookup stage has no dedicated meter support. 3638 * Exact stage uses IFP meter table. 3639 */ 3640 if ((_BCM_FIELD_STAGE_LOOKUP == stage_fc->stage_id) || 3641 (_BCM_FIELD_STAGE_FLOWTRACKER == stage_fc->stage_id)) { 3642 return (BCM_E_NONE); 3643 } 3644 3645 /* Initialize Global meter pools information for IFP. */ 3646 if (stage_fc->flags & _FP_STAGE_GLOBAL_METER_POOLS) { 3647 return (_field_th_meter_pools_init(unit, stage_fc, fc)); 3648 } 3649 3650 /* Initialize slice meters for EFP. */ 3651 return (_field_th_slice_meters_init(unit, stage_fc, fc)); 3652 } 3653 3654 /* 3655 * Function: 3656 * _field_th_stage_data_ctrl_init 3657 * 3658 * Purpose: 3659 * Allocate and initialize data qualifiers control structure. 3660 * 3661 * Parameters: 3662 * unit - (IN) BCM device number. 3663 * stage_fc - (IN/OUT) Stage field control structure. 3664 * 3665 * Returns: 3666 * BCM_E_PARAM - NULL stage control pointer. 3667 * BCM_E_MEMORY - Allocation failure. 3668 * BCM_E_NONE - Success. 3669 */ 3670 STATIC int 3671 _field_th_stage_data_ctrl_init(int unit, _field_stage_t *stage_fc) 3672 { 3673 int mem_sz; /* Memory size. */ 3674 _field_data_control_t *data_ctrl = NULL; 3675 3676 /* Input prameters check. */ 3677 if (NULL == stage_fc) { 3678 return (BCM_E_PARAM); 3679 } 3680 3681 /* Allocate data control structure. */ 3682 mem_sz = sizeof(_field_data_control_t); 3683 _FP_XGS3_ALLOC(data_ctrl, mem_sz, "Data qualification control"); 3684 if (NULL == data_ctrl) { 3685 return (BCM_E_MEMORY); 3686 } 3687 3688 /* Allocate data TCAM entry control structure. */ 3689 mem_sz = sizeof(_field_data_tcam_entry_t) * 3690 soc_mem_index_count(unit, FP_UDF_TCAMm); 3691 _FP_XGS3_ALLOC(data_ctrl->tcam_entry_arr, mem_sz, "UDF tcam entry array"); 3692 if (NULL == data_ctrl->tcam_entry_arr) { 3693 sal_free(data_ctrl); 3694 return (BCM_E_MEMORY); 3695 } 3696 3697 /* Initialize UDF offset geometry. */ 3698 data_ctrl->elem_size = 2; 3699 data_ctrl->num_elems = 8; 3700 3701 /* Initialize stage data control structure. */ 3702 stage_fc->data_ctrl = data_ctrl; 3703 return (BCM_E_NONE); 3704 } 3705 3706 /* 3707 * Function: 3708 * _field_th_instance_slice_counters_alloc 3709 * 3710 * Purpose: 3711 * Allocate counters usage bitmap for a slice in an instance. 3712 * 3713 * Parameters: 3714 * unit - (IN) BCM device number. 3715 * fs - (IN/OUT) Slice control structure. 3716 * 3717 * Returns: 3718 * BCM_E_PARAM - NULL slice structure pointer. 3719 * BCM_E_MEMORY - Allocation failure. 3720 * BCM_E_NONE - Success. 3721 */ 3722 STATIC int 3723 _field_th_instance_slice_counters_alloc(int unit, _field_slice_t *fs) 3724 { 3725 int size; /* Allocation size. */ 3726 3727 /* Input parameters check. */ 3728 if (NULL == fs) { 3729 return (BCM_E_PARAM); 3730 } 3731 3732 /* Determine the counter bit array size. */ 3733 size = SHR_BITALLOCSIZE(fs->counters_count); 3734 3735 /* Allocate counter usage map memory. */ 3736 fs->counter_bmp.w = sal_alloc(size, "fp_counter_map"); 3737 if (NULL == fs->counter_bmp.w) { 3738 return (BCM_E_MEMORY); 3739 } 3740 sal_memset(fs->counter_bmp.w, 0, size); 3741 return (BCM_E_NONE); 3742 } 3743 3744 /* 3745 * Function: 3746 * _field_th_counters_deinit 3747 * 3748 * Purpose: 3749 * Deinitialize slice counter usage bitmap for all instances in a stage. 3750 * 3751 * Parameters: 3752 * unit - (IN) BCM device number 3753 * stage_fc - (IN/OUT) Stage field control structure. 3754 * 3755 * Returns: 3756 * BCM_E_NONE - Success 3757 */ 3758 STATIC int 3759 _field_th_counters_deinit(int unit, _field_stage_t *stage_fc) 3760 { 3761 int slice; /* Slice iterator. */ 3762 int inst; /* Instance iterator. */ 3763 _field_control_t *fc; /* Field control structure. */ 3764 3765 /* Input parameters check. */ 3766 if (NULL == stage_fc) { 3767 return (BCM_E_NONE); 3768 } 3769 3770 /* Get field control structure. */ 3771 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 3772 3773 /* 3774 * VFP and IFP use Flex counter pools, skip per-slice 3775 * counter bitmap allocation. 3776 */ 3777 if (_BCM_FIELD_STAGE_LOOKUP == stage_fc->stage_id 3778 || _BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) { 3779 return (BCM_E_NONE); 3780 } 3781 3782 /* Counters usage bitmap is maintained only for slice_0 in EFP. */ 3783 for (inst = 0; inst < stage_fc->num_instances; inst++) { 3784 if (!(fc->pipe_map & (1 << inst))) { 3785 continue; 3786 } 3787 /* Free counter usage bitmap in slice_0 for each instance. */ 3788 if (NULL != stage_fc->slices[inst][0].counter_bmp.w) { 3789 sal_free(stage_fc->slices[inst][0].counter_bmp.w); 3790 } 3791 3792 /* Initialize counter usage bitmap pointer value to NULL. */ 3793 for (slice = 0; slice < stage_fc->tcam_slices; slice++) { 3794 stage_fc->slices[inst][slice].counter_bmp.w = NULL; 3795 } 3796 } 3797 3798 return (BCM_E_NONE); 3799 } 3800 3801 /* 3802 * Function: 3803 * _field_th_counters_init 3804 * 3805 * Purpose: 3806 * Initialize slice counter usage bitmap for all slices in a stage. 3807 * 3808 * Parameters: 3809 * unit - (IN) BCM device number. 3810 * fc - (IN) Field control structure. 3811 * stage_fc - (IN/OUT) Stage field control structure. 3812 * 3813 * Returns: 3814 * BCM_E_PARAM - Null field control structure or stage control parameter. 3815 * BCM_E_INTERNAL - Null stage slice control structure. 3816 * BCM_E_MEMORY - Allocation failure. 3817 * BCM_E_NONE - Success. 3818 */ 3819 STATIC int 3820 _field_th_counters_init(int unit, 3821 _field_control_t *fc, 3822 _field_stage_t *stage_fc) 3823 { 3824 _field_slice_t *fs; /* Slice config structure. */ 3825 int slice; /* Slice iterator. */ 3826 int inst; /* Instance iterator. */ 3827 int rv; /* Operation return value. */ 3828 int cntr_share = FALSE; /* Share counter with slice_0 */ 3829 3830 3831 /* Input parameters check. */ 3832 if (NULL == stage_fc || NULL == fc) { 3833 return (BCM_E_PARAM); 3834 } 3835 3836 for (inst = 0; inst < stage_fc->num_instances; inst++) { 3837 if (!(fc->pipe_map & (1 << inst))) { 3838 continue; 3839 } 3840 for (slice = 0; slice < stage_fc->tcam_slices; slice++) { 3841 3842 /* Get the slice pointer. */ 3843 fs = stage_fc->slices[inst] + slice; 3844 3845 /* 3846 * VFP and IFP use flex counter resources hence slice 3847 * counters count is zero. 3848 */ 3849 if ((_BCM_FIELD_STAGE_LOOKUP == stage_fc->stage_id) 3850 || (_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) 3851 || (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id) 3852 || (_BCM_FIELD_STAGE_FLOWTRACKER == stage_fc->stage_id)) { 3853 fs->counters_count = 0; 3854 continue; 3855 } 3856 3857 /* Initialize counters for EFP stage. */ 3858 fs->counters_count = soc_mem_index_count(unit, EFP_COUNTER_TABLEm); 3859 3860 /* 3861 * All EFP slices share the same global counter pool. 3862 * For slices > 0, counter sharing is TRUE. 3863 */ 3864 if (slice) { 3865 cntr_share = TRUE; 3866 } 3867 3868 /* Share counters with slice zero (Global counter pool). */ 3869 if (cntr_share) { 3870 stage_fc->slices[inst][slice].counter_bmp.w = 3871 stage_fc->slices[inst][0].counter_bmp.w; 3872 } else { 3873 /* Allocate new set of counters for the slice. */ 3874 rv = _field_th_instance_slice_counters_alloc(unit, fs); 3875 if (BCM_FAILURE(rv)) { 3876 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 3877 "FP(unit %d) Error: " 3878 "_field_th_instance_slice_counters_alloc=%d\n"), 3879 unit, rv)); 3880 _field_th_counters_deinit(unit, stage_fc); 3881 return (rv); 3882 } 3883 } 3884 } 3885 cntr_share = FALSE; 3886 } 3887 3888 return (BCM_E_NONE); 3889 } 3890 3891 /* 3892 * Function: 3893 * _field_th_keygen_profiles_init 3894 * Purpose: 3895 * Initialize keygen program profiles based on group operational mode. 3896 * Parameters: 3897 * unit - (IN) BCM device number. 3898 * stage_fc - (IN/OUT) Stage field control structure. 3899 * 3900 * Returns: 3901 * BCM_E_PARAM - Null field control structure or stage control parameter. 3902 * BCM_E_INTERNAL - Null stage slice control structure. 3903 * BCM_E_MEMORY - Allocation failure. 3904 * BCM_E_NONE - Success. 3905 */ 3906 int 3907 _field_th_keygen_profiles_init(int unit, _field_stage_t *stage_fc, 3908 _field_control_t *fc) 3909 { 3910 soc_mem_t mem[2]; /* SOC memory names. */ 3911 int entry_words[2]; /* Entry size in words. */ 3912 int inst; /* Instance iterator. */ 3913 int rv; /* Operation return status. */ 3914 3915 /* Input parameter check. */ 3916 if (NULL == stage_fc) { 3917 return (BCM_E_PARAM); 3918 } 3919 3920 switch (stage_fc->oper_mode) { 3921 /* Field Groups operational in Global mode. */ 3922 case bcmFieldGroupOperModeGlobal: 3923 3924 if (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) { 3925 /* Initialize profile1 memory name. */ 3926 mem[0] = IFP_KEY_GEN_PROGRAM_PROFILEm; 3927 3928 /* Initialize profile2 memory name. */ 3929 mem[1] = IFP_KEY_GEN_PROGRAM_PROFILE2m; 3930 3931 /* Determine keygen profile entry size in number of words. */ 3932 entry_words[0] = soc_mem_entry_words(unit, mem[0]); 3933 3934 /* Determine post mux profile entry size in number of words. */ 3935 entry_words[1] = soc_mem_entry_words(unit, mem[1]); 3936 3937 /* Create keygen program profile table. */ 3938 rv = soc_profile_mem_create(unit, mem, entry_words, 2, 3939 &stage_fc->keygen_profile[_FP_DEF_INST].profile); 3940 if (BCM_FAILURE(rv)) { 3941 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 3942 "FP(unit %d) Error: Ingress " 3943 "Keygen profile creation failed." 3944 "=%d\n"), unit, rv)); 3945 return (rv); 3946 } 3947 } else if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 3948 3949 /* Initialize profile memory name. */ 3950 mem[0] = EXACT_MATCH_KEY_GEN_PROGRAM_PROFILEm; 3951 3952 /* Initialize keygen mask profile memory name */ 3953 mem[1] = EXACT_MATCH_KEY_GEN_MASKm; 3954 3955 /* Determine keygen profile entry size in number of words. */ 3956 entry_words[0] = soc_mem_entry_words(unit, mem[0]); 3957 3958 /* Determine keygen mask profile entry size in words. */ 3959 entry_words[1] = soc_mem_entry_words(unit, mem[1]); 3960 3961 /* Create keygen program profile table. */ 3962 rv = soc_profile_mem_create(unit, mem, entry_words, 2, 3963 &stage_fc->keygen_profile[_FP_DEF_INST].profile); 3964 3965 if (BCM_FAILURE(rv)) { 3966 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 3967 "FP(unit %d) Error: Exact Match " 3968 "Keygen profile creation failed." 3969 "=%d\n"), unit, rv)); 3970 return (rv); 3971 } 3972 } else { 3973 /* Invalid stage id */ 3974 return (BCM_E_INTERNAL); 3975 } 3976 break; 3977 3978 /* Field Groups operational in Per-Pipe mode. */ 3979 case bcmFieldGroupOperModePipeLocal: 3980 3981 if (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) { 3982 /* Determine keygen profiles entry size in number of words. */ 3983 entry_words[0] = soc_mem_entry_words(unit, 3984 IFP_KEY_GEN_PROGRAM_PROFILE_PIPE0m); 3985 entry_words[1] = soc_mem_entry_words(unit, 3986 IFP_KEY_GEN_PROGRAM_PROFILE2_PIPE0m); 3987 3988 for (inst = 0; inst < stage_fc->num_instances; inst++) { 3989 if (!(fc->pipe_map & (1 << inst))) { 3990 continue; 3991 } 3992 /* Initialize keygen program profile1 memory name. */ 3993 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 3994 IFP_KEY_GEN_PROGRAM_PROFILEm, 3995 inst, 3996 &mem[0])); 3997 /* Initialize keygen program profile2 memory name. */ 3998 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 3999 IFP_KEY_GEN_PROGRAM_PROFILE2m, 4000 inst, 4001 &mem[1])); 4002 4003 /* Create keygen program profile table. */ 4004 rv = soc_profile_mem_create(unit, mem, entry_words, 2, 4005 &stage_fc->keygen_profile[inst].profile); 4006 if (BCM_FAILURE(rv)) { 4007 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4008 "FP(unit %d) Error: Ingress " 4009 "KeyGen profile creation failed." 4010 "=%d\n"), unit, rv)); 4011 return (rv); 4012 } 4013 } 4014 } else if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 4015 4016 /* Determine keygen profiles entry size in number of words. */ 4017 entry_words[0] = soc_mem_entry_words(unit, 4018 EXACT_MATCH_KEY_GEN_PROGRAM_PROFILE_PIPE0m); 4019 entry_words[1] = soc_mem_entry_words(unit, 4020 EXACT_MATCH_KEY_GEN_MASK_PIPE0m); 4021 4022 for (inst = 0; inst < stage_fc->num_instances; inst++) { 4023 if (!(fc->pipe_map & (1 << inst))) { 4024 continue; 4025 } 4026 /* Initialize keygen program profile memory name. */ 4027 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 4028 EXACT_MATCH_KEY_GEN_PROGRAM_PROFILEm, 4029 inst, 4030 &mem[0])); 4031 /* Initialize keygen mask memory name. */ 4032 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 4033 EXACT_MATCH_KEY_GEN_MASKm, 4034 inst, 4035 &mem[1])); 4036 /* Create keygen program profile table. */ 4037 rv = soc_profile_mem_create(unit, mem, entry_words, 2, 4038 &stage_fc->keygen_profile[inst].profile); 4039 4040 if (BCM_FAILURE(rv)) { 4041 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4042 "FP(unit %d) Error: Exact Match " 4043 "KeyGen profile creation failed." 4044 "=%d\n"), unit, rv)); 4045 return (rv); 4046 } 4047 } 4048 } else { 4049 /* Invalid stage id */ 4050 return (BCM_E_INTERNAL); 4051 } 4052 break; 4053 4054 default: 4055 /* 4056 * Invalid Group Operational mode, should never hit this condition. 4057 */ 4058 return (BCM_E_INTERNAL); 4059 } 4060 4061 return (BCM_E_NONE); 4062 } 4063 4064 /* 4065 * Function: 4066 * _field_th_stage_core_init 4067 * Purpose: 4068 * Initialize all data structures related to a Field Pipeline stage. 4069 * Parameters: 4070 * unit - (IN) BCM device number. 4071 * fc - (IN/OUT) Field control structure. 4072 * stage_fc - (IN/OUT) Stage field control structure. 4073 * 4074 * Returns: 4075 * BCM_E_PARAM - Null field control structure or stage control parameter. 4076 * BCM_E_INTERNAL - Invalid CAP stage detected. 4077 * BCM_E_MEMORY - Allocation failure. 4078 * BCM_E_NONE - Success. 4079 */ 4080 STATIC int 4081 _field_th_stage_core_init(int unit, 4082 _field_control_t *fc, 4083 _field_stage_t *stage_fc) 4084 { 4085 int rv = BCM_E_INTERNAL; /* Operation return value. */ 4086 int entry_words; /* Redirection profile entry size. */ 4087 soc_mem_t mem; /* SOC Memory name variable. */ 4088 int map_id; /* Virtual Group entry iterator. */ 4089 int idx; /* Virtual priority iterator. */ 4090 int inst; /* Pipe Instance. */ 4091 4092 /* Input prameters check. */ 4093 if ((NULL == fc) || (NULL == stage_fc)) { 4094 return (BCM_E_PARAM); 4095 } 4096 4097 /* Initialize stage slices information. */ 4098 rv = _field_th_slices_init(unit, stage_fc, fc); 4099 if (BCM_FAILURE(rv)) { 4100 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4101 "FP(unit %d) Error: _field_th_slices_init=%d\n"), unit, rv)); 4102 _field_th_stage_delete(unit, fc, stage_fc); 4103 return (rv); 4104 } 4105 4106 /* Initialize stage slices entries information. */ 4107 rv = _field_th_entries_init(unit, stage_fc, fc); 4108 if (BCM_FAILURE(rv)) { 4109 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4110 "FP(unit %d) Error: _field_th_entries_init=%d\n"), unit, rv)); 4111 _field_th_stage_delete(unit, fc, stage_fc); 4112 return (rv); 4113 } 4114 4115 /* Initialize Meters. */ 4116 rv = _field_th_meters_init(unit, stage_fc, fc); 4117 if (BCM_FAILURE(rv)) { 4118 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4119 "FP(unit %d) Error: _field_th_meters_init=%d\n"), unit, rv)); 4120 _field_th_stage_delete(unit, fc, stage_fc); 4121 return (rv); 4122 } 4123 4124 /* Initialize counters usage bitmap. */ 4125 rv = _field_th_counters_init(unit, fc, stage_fc); 4126 if (BCM_FAILURE(rv)) { 4127 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4128 "FP(unit %d) Error: _field_th_counters_init=%d\n"), unit, rv)); 4129 _field_th_stage_delete(unit, fc, stage_fc); 4130 return (rv); 4131 } 4132 4133 /* Action profile; will be setup in chip-specific init */ 4134 soc_profile_mem_t_init(&stage_fc->ext_act_profile); 4135 4136 /* Redirection action profile table initialization. */ 4137 if (_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) { 4138 4139 /* Initialize regular keygen and post mux keygen program profiles. */ 4140 rv = _field_th_keygen_profiles_init(unit, stage_fc, fc); 4141 if (BCM_FAILURE(rv)) { 4142 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4143 "FP(unit %d) Error: _field_th_keygen_profiles_init=%d\n"), 4144 unit, rv)); 4145 _field_th_stage_delete(unit, fc, stage_fc); 4146 return (rv); 4147 } 4148 4149 /* Initialize range checker seed ID value. */ 4150 stage_fc->range_id = 1; 4151 if (soc_feature(unit, soc_feature_udf_support)) { 4152 /* Initialize stage data control information. */ 4153 rv = _field_th_stage_data_ctrl_init(unit, stage_fc); 4154 if (BCM_FAILURE(rv)) { 4155 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4156 "FP(unit %d) Error: _field_th_stage_data_ctrl_init=%d\n"), 4157 unit, rv)); 4158 _field_th_stage_delete(unit, fc, stage_fc); 4159 return (rv); 4160 } 4161 } 4162 } 4163 4164 switch (stage_fc->stage_id) { 4165 4166 case _BCM_FIELD_STAGE_LOOKUP: 4167 /* hash select action memory profile initialization. */ 4168 soc_profile_mem_t_init(&stage_fc->hash_select[0]); 4169 soc_profile_mem_t_init(&stage_fc->hash_select[1]); 4170 4171 /* Hash select 0 action profile table initialization. */ 4172 if (SOC_MEM_IS_VALID(unit, VFP_HASH_FIELD_BMAP_TABLE_Am)) { 4173 mem = VFP_HASH_FIELD_BMAP_TABLE_Am; 4174 entry_words = sizeof(vfp_hash_field_bmap_table_a_entry_t) / 4175 sizeof(uint32); 4176 rv = soc_profile_mem_create(unit, &mem, &entry_words, 1, 4177 &stage_fc->hash_select[0]); 4178 4179 if (BCM_FAILURE(rv)) { 4180 _field_th_stage_delete(unit, fc, stage_fc); 4181 return (rv); 4182 } 4183 } 4184 /* Hash select 1 action profile table initialization. */ 4185 if (SOC_MEM_IS_VALID(unit, VFP_HASH_FIELD_BMAP_TABLE_Bm)) { 4186 mem = VFP_HASH_FIELD_BMAP_TABLE_Bm; 4187 entry_words = sizeof(vfp_hash_field_bmap_table_a_entry_t) / 4188 sizeof(uint32); 4189 rv = soc_profile_mem_create(unit, &mem, &entry_words, 1, 4190 &stage_fc->hash_select[1]); 4191 4192 if (BCM_FAILURE(rv)) { 4193 _field_th_stage_delete(unit, fc, stage_fc); 4194 return (rv); 4195 } 4196 } 4197 /* 4198 * Index 0 of vfp_hash_field_bmap_table_a/b is invalid as the 4199 * hardware will consider hash bitmap selection from VFP only 4200 * if HASH_FIELD_BITMAP_PTR_A and HASH_FIELD_BITMAP_PTR_B are non-zero. 4201 * Making the entry to NULL. 4202 */ 4203 rv = _bcm_field_td2_hash_select_profile_alloc_reserve_entry(unit, 4204 stage_fc); 4205 if (BCM_FAILURE(rv)) { 4206 _field_th_stage_delete(unit, fc, stage_fc); 4207 return (rv); 4208 } 4209 /* passthru */ 4210 /* coverity[MISSING_BREAK: FALSE] */ 4211 case _BCM_FIELD_STAGE_EGRESS: 4212 /* Initializing supported Qset*/ 4213 sal_memset(&stage_fc->_field_supported_qset, 0, sizeof(bcm_field_qset_t)); 4214 /* 4215 * Initialize the FP_SLICE_MAP for VFP and EFP. 4216 * Physical_slice and virtual_group are H/W initial values 4217 */ 4218 for (inst = 0; inst < stage_fc->num_instances; inst++) { 4219 if (!(fc->pipe_map & (1 << inst))) { 4220 continue; 4221 } 4222 for (map_id = 0; map_id < _FP_VMAP_CNT; map_id++) { 4223 for (idx = 0; idx < _FP_VMAP_SIZE; idx++) { 4224 stage_fc->vmap[inst][map_id][idx].valid = FALSE; 4225 stage_fc->vmap[inst][map_id][idx].vmap_key = idx; 4226 stage_fc->vmap[inst][map_id][idx].virtual_group = idx; 4227 stage_fc->vmap[inst][map_id][idx].flags = 0; 4228 } 4229 } 4230 } 4231 break; 4232 4233 case _BCM_FIELD_STAGE_INGRESS: 4234 /* Initialize group running priority */ 4235 stage_fc->group_running_prio = BCM_FIELD_GROUP_PRIO_ANY; 4236 4237 /* Initializing supported Qset*/ 4238 sal_memset(&stage_fc->_field_supported_qset, 0, sizeof(bcm_field_qset_t)); 4239 /* Initialize stage Preselector information. */ 4240 rv = _bcm_field_th_stage_preselector_init(unit, fc, stage_fc); 4241 if (BCM_FAILURE(rv)) { 4242 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4243 "FP(unit %d) Error: _bcm_field_th_stage_preselector_init=%d" 4244 "\n"), unit, rv)); 4245 _field_th_stage_delete(unit, fc, stage_fc); 4246 return (rv); 4247 } 4248 4249 /* 4250 * Initialize stage's extractor configuration for various slice 4251 * modes. 4252 */ 4253 #if defined (BCM_TOMAHAWK3_SUPPORT) 4254 if (soc_feature(unit, soc_feature_th3_style_fp)) { 4255 rv = _bcm_field_th3_extractors_init(unit, stage_fc); 4256 } else 4257 #endif /* BCM_TOMAHAWK3_SUPPORT */ 4258 { 4259 rv = _field_th_stage_extractors_init(unit, stage_fc); 4260 } 4261 4262 if (BCM_FAILURE(rv)) { 4263 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4264 "FP(unit %d) Error: _field_th_stage_extractors_init=%d\n"), 4265 unit, rv)); 4266 _field_th_stage_delete(unit, fc, stage_fc); 4267 return (rv); 4268 } 4269 #if defined(BCM_TRIDENT3_SUPPORT) 4270 if (soc_feature(unit, soc_feature_td3_style_fp)) { 4271 /* Intialize IFP_EM_DROP_VECTOR_MASK with default value */ 4272 rv = _bcm_field_td3_drop_vector_mask_init(unit); 4273 if (BCM_FAILURE(rv)) { 4274 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4275 "FP(unit %d) Error: _bcm_field_td3_drop_vector_mask_init=%d\n"), 4276 unit, rv)); 4277 _field_th_stage_delete(unit, fc, stage_fc); 4278 return (rv); 4279 } 4280 4281 /* Initialize InPorts flex support. */ 4282 rv = _bcm_field_td3_inports_flex_init(unit); 4283 if (BCM_FAILURE(rv)) { 4284 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4285 "FP(unit %d) Error: _bcm_field_td3_inports_flex_init=%d\n"), 4286 unit, rv)); 4287 _field_th_stage_delete(unit, fc, stage_fc); 4288 return (rv); 4289 } 4290 /* Initialize IFP qualifers to HW input bus fields & offsets. */ 4291 rv = _field_td3_stage_quals_ibus_map_init(unit, stage_fc); 4292 } else 4293 #endif 4294 #if defined(BCM_TOMAHAWK3_SUPPORT) 4295 if (soc_feature(unit, soc_feature_th3_style_fp)) { 4296 rv = _bcm_field_th3_qualifiers_init(unit, stage_fc); 4297 } else 4298 #endif /* BCM_TOMAHAWK3_SUPPORT */ 4299 { 4300 rv = _field_th_stage_quals_ibus_map_init(unit, stage_fc); 4301 } 4302 4303 if (BCM_FAILURE(rv)) { 4304 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4305 "FP(unit %d) Error: _field_th_stage_extractors_init=%d\n"), 4306 unit, rv)); 4307 _field_th_stage_delete(unit, fc, stage_fc); 4308 return (rv); 4309 } 4310 #if defined(BCM_TRIDENT3_SUPPORT) 4311 /* Initialize action profiles */ 4312 if (soc_feature(unit, soc_feature_ifp_action_profiling)) { 4313 _field_td3_ingress_action_profiles_init(unit, stage_fc); 4314 } 4315 #endif 4316 break; 4317 case _BCM_FIELD_STAGE_EXACTMATCH: 4318 /* Initialize stage control for exact match */ 4319 rv = _field_th_emstage_init(unit, fc, stage_fc); 4320 if (BCM_FAILURE(rv)) { 4321 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4322 "FP(unit %d) Error: _field_th_emstage_init=%d\n"), 4323 unit, rv)); 4324 _field_th_stage_delete(unit, fc, stage_fc); 4325 return (rv); 4326 } 4327 break; 4328 #if defined(BCM_FLOWTRACKER_SUPPORT) 4329 case _BCM_FIELD_STAGE_FLOWTRACKER: 4330 /* Initalize stage control for Flowtracker */ 4331 rv = _field_hx5_ftstage_init(unit, fc, stage_fc); 4332 if (BCM_FAILURE(rv)) { 4333 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4334 "FP(unit %d) Error: _field_hx5_ftstage_init=%d" 4335 "\n"), unit, rv)); 4336 _field_th_stage_delete(unit, fc, stage_fc); 4337 return (rv); 4338 } 4339 break; 4340 #endif 4341 default: 4342 /* Should never hit this condition. */ 4343 return (BCM_E_INTERNAL); 4344 } 4345 4346 FP_LOCK(unit); 4347 4348 /* Add stage to Field Control structure. */ 4349 stage_fc->next = fc->stages; 4350 fc->stages = stage_fc; 4351 4352 FP_UNLOCK(unit); 4353 4354 return (rv); 4355 } 4356 4357 /* 4358 * Function: 4359 * _field_th_stage_add 4360 * 4361 * Purpose: 4362 * Initialize all data structures related to a field stage. 4363 * 4364 * Parameters: 4365 * unit - (IN) BCM device number. 4366 * fc - (IN/OUT) Field control structure. 4367 * stage_id - (IN) Field processor stage ID. 4368 * 4369 * Returns: 4370 * BCM_E_PARAM - Null field control structure. 4371 * BCM_E_INTERNAL - Null stage slice control structure. 4372 * BCM_E_MEMORY - Allocation failure. 4373 * BCM_E_NONE - Success. 4374 */ 4375 STATIC int 4376 _field_th_stage_add(int unit, 4377 _field_control_t *fc, 4378 _field_stage_id_t stage_id, 4379 bcm_field_group_oper_mode_t mode) 4380 { 4381 int rv = BCM_E_INTERNAL; /* Operation return value. */ 4382 _field_stage_t *stage_fc; /* Stage information. */ 4383 int entry_ratio = 1; /* Valid entries ratio.*/ 4384 4385 /* Input parameter check. */ 4386 if (NULL == fc) { 4387 return (BCM_E_PARAM); 4388 } 4389 4390 /* Allocate field stage structure instance memory. */ 4391 stage_fc = sal_alloc(sizeof(_field_stage_t), "FP stage info."); 4392 if (NULL == stage_fc) { 4393 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4394 "FP(unit %d) Error: Allocation failure for stage info\n"), unit)); 4395 return (BCM_E_MEMORY); 4396 } 4397 4398 /* Clear contents of allocated buffer. */ 4399 sal_memset(stage_fc, 0, sizeof(_field_stage_t)); 4400 4401 /* Initialize FP stage. */ 4402 stage_fc->stage_id = stage_id; 4403 4404 /* By default all CAP stages come up in Global mode (Legacy TD2). */ 4405 if (bcmFieldGroupOperModeCount == mode) { 4406 if ((stage_id == _BCM_FIELD_STAGE_INGRESS) || 4407 (stage_id == _BCM_FIELD_STAGE_LOOKUP) || 4408 (stage_id == _BCM_FIELD_STAGE_EGRESS)) { 4409 /* Initialize the SER during init for the given default mode. */ 4410 rv = (_field_ser_oper_mode_init(unit, stage_id, 4411 bcmFieldGroupOperModeGlobal)); 4412 if (BCM_FAILURE(rv)) { 4413 if (NULL != stage_fc) { 4414 sal_free(stage_fc); 4415 } 4416 return (rv); 4417 } 4418 } 4419 stage_fc->oper_mode = bcmFieldGroupOperModeGlobal; 4420 } else { 4421 /* Default Group oper mode modified using Group oper mode API. */ 4422 stage_fc->oper_mode = mode; 4423 } 4424 4425 /* 4426 * Initialize number of FP data structure instances to be supported 4427 * per-stage. 4428 */ 4429 stage_fc->num_pipes = NUM_PIPE(unit); 4430 4431 if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) { 4432 /* 4433 * Initialize number of FP instances to number of pipes supported in 4434 * hardware. 4435 */ 4436 stage_fc->num_instances = stage_fc->num_pipes; 4437 } else { 4438 /* Initialize to legacy TD2 mode - Global mode (single instance). */ 4439 stage_fc->num_instances = 1; 4440 } 4441 4442 switch (stage_fc->stage_id) { 4443 case _BCM_FIELD_STAGE_LOOKUP: 4444 /* Flags */ 4445 stage_fc->flags |= (_FP_STAGE_SLICE_ENABLE 4446 | _FP_STAGE_AUTO_EXPANSION 4447 | _FP_STAGE_GLOBAL_COUNTERS); 4448 /* Slice geometry */ 4449 stage_fc->tcam_sz = soc_mem_index_count(unit, VFP_TCAMm); 4450 stage_fc->tcam_slices = 4; 4451 break; 4452 4453 case _BCM_FIELD_STAGE_INGRESS: 4454 /* Flags */ 4455 stage_fc->flags |= (_FP_STAGE_SLICE_ENABLE 4456 | _FP_STAGE_AUTO_EXPANSION 4457 | _FP_STAGE_GLOBAL_METER_POOLS 4458 | _FP_STAGE_GLOBAL_COUNTERS 4459 | _FP_STAGE_MULTI_PIPE_COUNTERS); 4460 4461 /* 4462 * Initialize Slice geometry. 4463 * Number of entries in TCAM remains the same for both duplicate 4464 * and unique views. Use duplicate view to calculate TCAM size. 4465 * Initialize to maximum entries supported per-slice (80bit 4466 * mode). 4467 */ 4468 if (soc_feature(unit, soc_feature_field_stage_half_slice)) { 4469 entry_ratio = 2; 4470 } else if (soc_feature(unit, soc_feature_field_stage_quarter_slice)) { 4471 entry_ratio = 4; 4472 } 4473 stage_fc->tcam_sz = soc_mem_index_count(unit, IFP_TCAMm) / entry_ratio; 4474 4475 /* Number of hardware slices is equal to maximum number of LT parts. */ 4476 stage_fc->tcam_slices = _FP_MAX_LT_PARTS(unit); 4477 4478 /* Initialize number of logical tables supported by device. */ 4479 if (SOC_IS_TOMAHAWK3(unit)) { 4480 stage_fc->num_logical_tables = 16; 4481 } else { 4482 stage_fc->num_logical_tables = 32; 4483 } 4484 4485 /* 4486 * Initialize number of valid entries in Logical Table selection 4487 * TCAM. 4488 */ 4489 stage_fc->lt_tcam_sz = stage_fc->tcam_slices 4490 * stage_fc->num_logical_tables; 4491 /* Initialize number of extractor levels */ 4492 stage_fc->num_ext_levels = 4; 4493 /* Initialize the action set pointer. */ 4494 if (soc_feature(unit, soc_feature_ifp_action_profiling)) { 4495 stage_fc->action_set_ptr = SOC_IS_HELIX5(unit) \ 4496 ? bcm_field_hx5_ifp_action_set \ 4497 : bcm_field_td3_ifp_action_set; 4498 } 4499 break; 4500 4501 case _BCM_FIELD_STAGE_EGRESS: 4502 /* Flags */ 4503 stage_fc->flags |= (_FP_STAGE_SLICE_ENABLE 4504 | _FP_STAGE_GLOBAL_COUNTERS 4505 | _FP_STAGE_SEPARATE_PACKET_BYTE_COUNTERS 4506 | _FP_STAGE_AUTO_EXPANSION 4507 | _FP_STAGE_MULTI_PIPE_COUNTERS); 4508 /* Slice geometry */ 4509 stage_fc->tcam_sz = soc_mem_index_count(unit, EFP_TCAMm); 4510 stage_fc->tcam_slices = 4; 4511 break; 4512 case _BCM_FIELD_STAGE_CLASS: 4513 rv = _bcm_field_th_class_stage_add(unit, fc, stage_fc); 4514 if (BCM_FAILURE(rv)) { 4515 sal_free(stage_fc); 4516 } 4517 return (rv); 4518 case _BCM_FIELD_STAGE_EXACTMATCH: 4519 stage_fc->flags |= (_FP_STAGE_SLICE_ENABLE 4520 | _FP_STAGE_GLOBAL_METER_POOLS 4521 | _FP_STAGE_GLOBAL_COUNTERS 4522 | _FP_STAGE_MULTI_PIPE_COUNTERS); 4523 stage_fc->tcam_sz = soc_mem_index_count(unit, EXACT_MATCH_2m); 4524 stage_fc->tcam_slices = 2; 4525 if (SOC_IS_TOMAHAWK3(unit)) { 4526 stage_fc->num_logical_tables = 16; 4527 } else { 4528 stage_fc->num_logical_tables = _FP_MAX_NUM_LT; 4529 } 4530 stage_fc->lt_tcam_sz = stage_fc->tcam_slices 4531 * stage_fc->num_logical_tables; 4532 stage_fc->num_ext_levels = 4; 4533 /* Initialize the action set pointer. */ 4534 if (soc_feature(unit, soc_feature_ifp_action_profiling)) { 4535 stage_fc->action_set_ptr = bcm_field_td3_em_action_set; 4536 } else if (soc_feature(unit, soc_feature_th3_style_fp)) { 4537 stage_fc->action_set_ptr = bcm_field_th3_em_action_set; 4538 } else if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced)) { 4539 stage_fc->action_set_ptr = bcm_field_th2_em_action_set; 4540 } else { 4541 stage_fc->action_set_ptr = bcm_field_th_em_action_set; 4542 } 4543 break; 4544 #if defined(BCM_FLOWTRACKER_SUPPORT) 4545 case _BCM_FIELD_STAGE_FLOWTRACKER: 4546 if (soc_feature(unit, soc_feature_field_flowtracker_support)) { 4547 stage_fc->flags |= (_FP_STAGE_SLICE_ENABLE); 4548 stage_fc->tcam_slices = 1; 4549 stage_fc->num_logical_tables = 1; 4550 stage_fc->tcam_sz = 4551 soc_mem_index_max(unit, BSK_FTFP_TCAMm) - 4552 soc_mem_index_min(unit, BSK_FTFP_TCAMm) + 1; 4553 stage_fc->lt_tcam_sz = 4554 soc_mem_index_max(unit, BSK_FTFP_LTS_LOGICAL_TBL_SEL_TCAMm) - 4555 soc_mem_index_min(unit, BSK_FTFP_LTS_LOGICAL_TBL_SEL_TCAMm) + 1; 4556 } 4557 break; 4558 #endif 4559 default: 4560 if (NULL != stage_fc) { 4561 sal_free(stage_fc); 4562 } 4563 return (rv); 4564 } 4565 4566 /* 4567 * Initialize Field Stage attributes. On error condition, memory location 4568 * pointed by "stage_fc" pointer is freed inside this routine in error 4569 * return section. So, no need to free again in the error return section. 4570 * No need to do stage core init for stage class as it is a pseudo stage. 4571 */ 4572 rv = _field_th_stage_core_init(unit, fc, stage_fc); 4573 if (BCM_FAILURE(rv)) { 4574 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4575 "FP(unit %d) Error: _field_th_stage_core_init=%d\n"), unit, rv)); 4576 } 4577 4578 return (rv); 4579 } 4580 4581 /* 4582 * Function: 4583 * _bcm_field_th_stages_delete 4584 * 4585 * Purpose: 4586 * Deinitialize a field stage. 4587 * 4588 * Parameters: 4589 * unit - (IN) BCM device number. 4590 * fc - (IN/OUT)Field control info for device. 4591 * 4592 * Returns: 4593 * BCM_E_PARAM - Null field control structure. 4594 * BCM_E_NONE - Success. 4595 */ 4596 int 4597 _bcm_field_th_stages_delete(int unit, _field_control_t *fc) 4598 { 4599 int rv = BCM_E_NONE; 4600 _field_stage_t *stage_fc = NULL; /* Stage field control structure. */ 4601 _field_stage_t *stage_fc_next = NULL; /* Stage field control structure. */ 4602 4603 /* Input parameters check. */ 4604 if (NULL == fc) { 4605 return (BCM_E_PARAM); 4606 } 4607 4608 FP_LOCK(unit); 4609 4610 stage_fc = fc->stages; 4611 /* Free stages slices structures. */ 4612 while (NULL != stage_fc) { 4613 stage_fc_next = stage_fc->next; 4614 /* 4615 * Retaining retaining ExactMatch stage during bcm_field_init. 4616 */ 4617 if ((fc->flags & _FP_EXACTMATCH_STAGE_SKIP_DETACH) && 4618 (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id)) { 4619 stage_fc = stage_fc_next; 4620 continue; 4621 } 4622 _field_th_stage_delete(unit, fc, stage_fc); 4623 stage_fc = stage_fc_next; 4624 } 4625 4626 #if defined(BCM_TRIDENT3_SUPPORT) 4627 if (soc_feature(unit, soc_feature_td3_style_fp)) { 4628 rv = (_bcm_field_td3_flex_qual_ceh_db_clear(unit)); 4629 } 4630 #endif /* BCM_TRIDENT3_SUPPORT */ 4631 4632 FP_UNLOCK(unit); 4633 return (rv); 4634 } 4635 4636 /* 4637 * Function: 4638 * _bcm_field_th_stages_add 4639 * 4640 * Purpose: 4641 * Initialize all Field Processor stages of the device. 4642 * 4643 * Parameters: 4644 * unit - (IN) BCM device number 4645 * fc - (IN/OUT) Field control structure. 4646 * 4647 * Returns: 4648 * BCM_E_PARAM - Null field control structure. 4649 * BCM_E_NONE - Success. 4650 */ 4651 int 4652 _bcm_field_th_stages_add(int unit, _field_control_t *fc) 4653 { 4654 int rv; /* Operation return value. */ 4655 4656 /* Input parameters check. */ 4657 if (NULL == fc) { 4658 return (BCM_E_PARAM); 4659 } 4660 4661 #if defined(BCM_TRIDENT3_SUPPORT) 4662 if (soc_feature(unit, soc_feature_td3_style_fp)) { 4663 BCM_IF_ERROR_RETURN(_bcm_field_td3_flex_qual_ceh_db_init(unit)); 4664 } 4665 #endif /* BCM_TRIDENT3_SUPPORT */ 4666 4667 /* Initialize CAP stages. */ 4668 if (soc_feature(unit, soc_feature_field_multi_stage)) { 4669 int latency; 4670 4671 /* Add VFP Stage. */ 4672 rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_LOOKUP, 4673 bcmFieldGroupOperModeCount); 4674 if (BCM_FAILURE(rv)) { 4675 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4676 "FP(unit %d) Error: _field_th_stage_add(Lookup)=%d\n"), unit, rv)); 4677 _bcm_field_th_stages_delete(unit, fc); 4678 return (rv); 4679 } 4680 4681 /* Add EFP Stage. */ 4682 latency = soc_property_get(unit, spn_SWITCH_BYPASS_MODE, 4683 SOC_SWITCH_BYPASS_MODE_NONE); 4684 if (SOC_SWITCH_BYPASS_MODE_EFP != latency) { 4685 rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_EGRESS, 4686 bcmFieldGroupOperModeCount); 4687 if (BCM_FAILURE(rv)) { 4688 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4689 "FP(unit %d) Error: _field_th_stage_add(Egress)=%d\n"), unit, rv)); 4690 _bcm_field_th_stages_delete(unit, fc); 4691 return (rv); 4692 } 4693 } 4694 } 4695 4696 /* Add IFP Stage. */ 4697 rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_INGRESS, 4698 bcmFieldGroupOperModeCount); 4699 if (BCM_FAILURE(rv)) { 4700 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4701 "FP(unit %d) Error: _field_th_stage_add(Ingress)=%d\n"), unit, rv)); 4702 /* 4703 * Delete all previous stages initialized on this device in case of 4704 * error. 4705 */ 4706 _bcm_field_th_stages_delete(unit, fc); 4707 return (rv); 4708 } 4709 4710 /* Add Class Stage. */ 4711 if (soc_feature(unit, soc_feature_field_compression)) { 4712 rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_CLASS, 4713 bcmFieldGroupOperModeCount); 4714 if (BCM_FAILURE(rv)) { 4715 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4716 "FP(unit %d) Error: " 4717 "_field_th_stage_add(Class)=%d\n"), unit, rv)); 4718 /* 4719 * Delete all previous stages initialized on this device in case of 4720 * error. 4721 */ 4722 _bcm_field_th_stages_delete(unit, fc); 4723 return (rv); 4724 } 4725 } 4726 4727 /* 4728 * _field_detach doesn't clear Exact Match groups created by Flow Tracker. 4729 * As ExactMatch stage is not freed no need to initialize it again. 4730 */ 4731 if (0 == (fc->flags & _FP_EXACTMATCH_STAGE_SKIP_DETACH)) { 4732 if (soc_feature(unit, soc_feature_field_exact_match_support)) { 4733 /* Add Exact Match Stage */ 4734 rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_EXACTMATCH, 4735 bcmFieldGroupOperModeCount); 4736 if (BCM_FAILURE(rv)) { 4737 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4738 "FP(unit %d) Error: " 4739 "_field_th_stage_add(Exact Match)=%d\n"), unit, rv)); 4740 _bcm_field_th_stages_delete(unit, fc); 4741 return (rv); 4742 } 4743 } 4744 } else { 4745 _field_stage_t *stage_ing = NULL; 4746 4747 /* Get IFP stage structure */ 4748 for (stage_ing = fc->stages; 4749 (NULL != stage_ing) && (_BCM_FIELD_STAGE_INGRESS != stage_ing->stage_id); 4750 stage_ing = stage_ing->next); 4751 4752 if ((NULL != stage_ing) && soc_feature(unit, soc_feature_field_exact_match_support)) { 4753 /* 4754 * ExactMatch Ibus database points to the Ibus database of IFP. 4755 * Update ExactMacth Ibus database as IFP has been reinitialized 4756 */ 4757 rv = _field_th_emstage_update(unit, stage_ing); 4758 if (BCM_FAILURE(rv)) { 4759 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4760 "FP(unit %d) Error: " 4761 "_field_th_stage_add(Exact Match)=%d\n"), unit, rv)); 4762 _bcm_field_th_stages_delete(unit, fc); 4763 return (rv); 4764 } 4765 } 4766 } 4767 4768 #if defined(BCM_FLOWTRACKER_SUPPORT) 4769 if (soc_feature(unit, soc_feature_field_flowtracker_support)) { 4770 rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_FLOWTRACKER, 4771 bcmFieldGroupOperModeCount); 4772 if (BCM_FAILURE(rv)) { 4773 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 4774 "FP(unit %d) Error: " 4775 "_field_th_stage_add(Flowtracker)=%d\n"), unit, rv)); 4776 _bcm_field_th_stages_delete(unit, fc); 4777 return (rv); 4778 } 4779 } 4780 #endif 4781 4782 /* Initialize field control color independent flag by default. */ 4783 fc->flags |= _FP_COLOR_INDEPENDENT; 4784 4785 /* Initialize device LT entry allocation ID variable. */ 4786 fc->last_allocated_lt_eid = 0; 4787 4788 #if defined(BCM_TRIDENT3_SUPPORT) 4789 if (soc_feature(unit, soc_feature_td3_style_fp)) { 4790 rv = (_bcm_field_td3_flex_qual_ceh_db_clear(unit)); 4791 } 4792 #endif /* BCM_TRIDENT3_SUPPORT */ 4793 4794 return (rv); 4795 } 4796 4797 /* 4798 * Function: 4799 * _bcm_field_action_insert 4800 * Purpose: 4801 * Add action to stage actions list. 4802 * Parameters: 4803 * unit - (IN) BCM device number. 4804 * stage_fc - (IN) Stage field control strucutre. 4805 * action - (IN) Field Action. 4806 * ptr - (IN) FP action info. 4807 * Returns: 4808 * BCM_E_XXX 4809 */ 4810 int 4811 _bcm_field_action_insert(int unit, _field_stage_t *stage_fc, 4812 int action, _bcm_field_action_offset_t *ptr) 4813 { 4814 int flag_first; /* action allocation flag. */ 4815 int alloc_size; /* Memory allocation size. */ 4816 uint32 i = 0; 4817 _bcm_field_action_conf_t *f_action; /* Action configuration. */ 4818 _bcm_field_action_offset_t *offset_info; /* Offset Information. */ 4819 _bcm_field_action_offset_t *new_offset_info; /* New Offset Information. */ 4820 4821 /* Input parameters check. */ 4822 if ((NULL == ptr) || (NULL == stage_fc) || 4823 (action < 0) || (action > _bcmFieldActionCount)) { 4824 return BCM_E_PARAM; 4825 } 4826 4827 if ((_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) && 4828 (ptr->flags & _BCM_FIELD_ACTION_NO_IFP_SUPPORT)) { 4829 return BCM_E_NONE; 4830 } 4831 if ((_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id) && 4832 (ptr->flags & _BCM_FIELD_ACTION_NO_EM_SUPPORT)) { 4833 return BCM_E_NONE; 4834 } 4835 4836 f_action = NULL; 4837 offset_info = NULL; 4838 new_offset_info = NULL; 4839 4840 f_action = stage_fc->f_action_arr[action]; 4841 /* Allocate Action descriptor. */ 4842 flag_first = 0; 4843 if (NULL == f_action) { 4844 alloc_size = sizeof(_bcm_field_action_conf_t); 4845 _FP_XGS3_ALLOC(f_action, alloc_size, "FP Action info"); 4846 if (NULL == f_action) { 4847 return (BCM_E_MEMORY); 4848 } 4849 f_action->action = action; 4850 flag_first = 1; 4851 } else { 4852 offset_info = f_action->offset; 4853 while (NULL != offset_info) { 4854 if (offset_info->flags & ptr->flags) { 4855 return BCM_E_EXISTS; 4856 } 4857 offset_info = offset_info->next; 4858 } 4859 } 4860 4861 alloc_size = sizeof(_bcm_field_action_offset_t); 4862 _FP_XGS3_ALLOC(new_offset_info, alloc_size, "FP Action offset info"); 4863 if (NULL == new_offset_info) { 4864 if (flag_first) { 4865 if (NULL != f_action) { 4866 sal_free(f_action); 4867 } 4868 } 4869 return (BCM_E_MEMORY); 4870 } 4871 4872 /* Copy new configuration to configuration array. */ 4873 new_offset_info->flags |= ptr->flags; 4874 new_offset_info->offset[0] = ptr->offset[0]; 4875 new_offset_info->width[0] = ptr->width[0]; 4876 new_offset_info->value[0] = ptr->value[0]; 4877 new_offset_info->offset[1] = ptr->offset[1]; 4878 new_offset_info->width[1] = ptr->width[1]; 4879 new_offset_info->value[1] = ptr->value[1]; 4880 new_offset_info->offset[2] = ptr->offset[2]; 4881 new_offset_info->width[2] = ptr->width[2]; 4882 new_offset_info->value[2] = ptr->value[2]; 4883 new_offset_info->offset[3] = ptr->offset[3]; 4884 new_offset_info->width[3] = ptr->width[3]; 4885 new_offset_info->value[3] = ptr->value[3]; 4886 /* Update the bitmap of offsets which hold encodings */ 4887 for (i = 0; (i < _FP_ACTION_MAX_PARAM_ENC) && (ptr->width[i]); i++) { 4888 if (-1 != ptr->value[i]) { 4889 SHR_BITSET(&new_offset_info->encode_bmp, i); 4890 } else { 4891 SHR_BITSET(&new_offset_info->param_bmp, i); 4892 } 4893 } 4894 new_offset_info->aset = ptr->aset; 4895 new_offset_info->next = f_action->offset; 4896 f_action->offset = new_offset_info; 4897 4898 /* Install Action configuration into stage actions array. */ 4899 stage_fc->f_action_arr[action] = f_action; 4900 4901 return (BCM_E_NONE); 4902 } 4903 /* 4904 * Function: 4905 * _bcm_field_th_action_conflict_check 4906 * Purpose: 4907 * Check if action is conflicted with any other action in the entry. 4908 * Parameters: 4909 * unit - (IN) BCM device number. 4910 * f_ent - (IN) Field entry structure to get policy info from. 4911 * action1 - (IN) Action to check(bcmFieldActionXXX) 4912 * action - (IN) Action to check(bcmFieldActionXXX) 4913 * Returns: 4914 * BCM_E_XXX 4915 */ 4916 int 4917 _bcm_field_th_action_conflict_check(int unit, 4918 _field_entry_t *f_ent, 4919 bcm_field_action_t action1, 4920 bcm_field_action_t action) 4921 { 4922 /* Input parameters check */ 4923 if (NULL == f_ent) { 4924 return (BCM_E_PARAM); 4925 } 4926 if (NULL == f_ent->group) { 4927 return (BCM_E_PARAM); 4928 } 4929 4930 if (f_ent->group->stage_id == _BCM_FIELD_STAGE_INGRESS || 4931 f_ent->group->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 4932 switch (action1) { 4933 case bcmFieldActionUntaggedPacketPriorityNew: 4934 _FP_ACTIONS_CONFLICT(bcmFieldActionPfcClassNew); 4935 break; 4936 case bcmFieldActionPfcClassNew: 4937 _FP_ACTIONS_CONFLICT(bcmFieldActionUntaggedPacketPriorityNew); 4938 break; 4939 case bcmFieldActionCosMapNew: 4940 _FP_ACTIONS_CONFLICT(bcmFieldActionCosQNew); 4941 _FP_ACTIONS_CONFLICT(bcmFieldActionGpCosQNew); 4942 _FP_ACTIONS_CONFLICT(bcmFieldActionYpCosQNew); 4943 _FP_ACTIONS_CONFLICT(bcmFieldActionRpCosQNew); 4944 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCopy); 4945 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntCopy); 4946 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntCopy); 4947 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntCopy); 4948 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntNew); 4949 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntNew); 4950 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntNew); 4951 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntNew); 4952 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntTos); 4953 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntTos); 4954 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntTos); 4955 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntTos); 4956 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCancel); 4957 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntCancel); 4958 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntCancel); 4959 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntCancel); 4960 _FP_ACTIONS_CONFLICT(bcmFieldActionUcastCosQNew); 4961 _FP_ACTIONS_CONFLICT(bcmFieldActionGpUcastCosQNew); 4962 _FP_ACTIONS_CONFLICT(bcmFieldActionYpUcastCosQNew); 4963 _FP_ACTIONS_CONFLICT(bcmFieldActionRpUcastCosQNew); 4964 _FP_ACTIONS_CONFLICT(bcmFieldActionMcastCosQNew); 4965 _FP_ACTIONS_CONFLICT(bcmFieldActionGpMcastCosQNew); 4966 _FP_ACTIONS_CONFLICT(bcmFieldActionYpMcastCosQNew); 4967 _FP_ACTIONS_CONFLICT(bcmFieldActionRpMcastCosQNew); 4968 _FP_ACTIONS_CONFLICT(bcmFieldActionCosMapNew); 4969 _FP_ACTIONS_CONFLICT(bcmFieldActionGpCosMapNew); 4970 _FP_ACTIONS_CONFLICT(bcmFieldActionYpCosMapNew); 4971 _FP_ACTIONS_CONFLICT(bcmFieldActionRpCosMapNew); 4972 break; 4973 case bcmFieldActionGpCosMapNew: 4974 _FP_ACTIONS_CONFLICT(bcmFieldActionCosQNew); 4975 _FP_ACTIONS_CONFLICT(bcmFieldActionGpCosQNew); 4976 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCopy); 4977 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntCopy); 4978 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntNew); 4979 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntNew); 4980 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntTos); 4981 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntTos); 4982 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCancel); 4983 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntCancel); 4984 _FP_ACTIONS_CONFLICT(bcmFieldActionUcastCosQNew); 4985 _FP_ACTIONS_CONFLICT(bcmFieldActionGpUcastCosQNew); 4986 _FP_ACTIONS_CONFLICT(bcmFieldActionMcastCosQNew); 4987 _FP_ACTIONS_CONFLICT(bcmFieldActionGpMcastCosQNew); 4988 _FP_ACTIONS_CONFLICT(bcmFieldActionCosMapNew); 4989 _FP_ACTIONS_CONFLICT(bcmFieldActionGpCosMapNew); 4990 break; 4991 case bcmFieldActionYpCosMapNew: 4992 _FP_ACTIONS_CONFLICT(bcmFieldActionCosQNew); 4993 _FP_ACTIONS_CONFLICT(bcmFieldActionYpCosQNew); 4994 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCopy); 4995 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntCopy); 4996 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntNew); 4997 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntNew); 4998 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntTos); 4999 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntTos); 5000 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCancel); 5001 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntCancel); 5002 _FP_ACTIONS_CONFLICT(bcmFieldActionUcastCosQNew); 5003 _FP_ACTIONS_CONFLICT(bcmFieldActionYpUcastCosQNew); 5004 _FP_ACTIONS_CONFLICT(bcmFieldActionMcastCosQNew); 5005 _FP_ACTIONS_CONFLICT(bcmFieldActionYpMcastCosQNew); 5006 _FP_ACTIONS_CONFLICT(bcmFieldActionCosMapNew); 5007 _FP_ACTIONS_CONFLICT(bcmFieldActionYpCosMapNew); 5008 break; 5009 case bcmFieldActionRpCosMapNew: 5010 _FP_ACTIONS_CONFLICT(bcmFieldActionCosQNew); 5011 _FP_ACTIONS_CONFLICT(bcmFieldActionRpCosQNew); 5012 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCopy); 5013 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntCopy); 5014 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntNew); 5015 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntNew); 5016 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntTos); 5017 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntTos); 5018 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCancel); 5019 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntCancel); 5020 _FP_ACTIONS_CONFLICT(bcmFieldActionUcastCosQNew); 5021 _FP_ACTIONS_CONFLICT(bcmFieldActionRpUcastCosQNew); 5022 _FP_ACTIONS_CONFLICT(bcmFieldActionMcastCosQNew); 5023 _FP_ACTIONS_CONFLICT(bcmFieldActionRpMcastCosQNew); 5024 _FP_ACTIONS_CONFLICT(bcmFieldActionCosMapNew); 5025 _FP_ACTIONS_CONFLICT(bcmFieldActionRpCosMapNew); 5026 break; 5027 case bcmFieldActionGpIntCongestionNotificationNew: 5028 _FP_ACTIONS_CONFLICT(bcmFieldActionGpIntCongestionNotificationNew); 5029 break; 5030 case bcmFieldActionYpIntCongestionNotificationNew: 5031 _FP_ACTIONS_CONFLICT(bcmFieldActionYpIntCongestionNotificationNew); 5032 break; 5033 case bcmFieldActionRpIntCongestionNotificationNew: 5034 _FP_ACTIONS_CONFLICT(bcmFieldActionRpIntCongestionNotificationNew); 5035 break; 5036 case bcmFieldActionFabricEHAddOrUpdate: 5037 case bcmFieldActionRedirect: 5038 case bcmFieldActionRedirectTrunk: 5039 case bcmFieldActionRedirectPbmp: 5040 case bcmFieldActionRedirectVlan: 5041 case bcmFieldActionUnmodifiedPacketRedirectPort: 5042 case bcmFieldActionRedirectCancel: 5043 case bcmFieldActionRedirectBcastPbmp: 5044 case bcmFieldActionRedirectMcast: 5045 case bcmFieldActionEgressMask: 5046 case bcmFieldActionEgressPortsAdd: 5047 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirect); 5048 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectTrunk); 5049 _FP_ACTIONS_CONFLICT(bcmFieldActionUnmodifiedPacketRedirectPort); 5050 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop); 5051 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectCancel); 5052 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectVlan); 5053 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectBcastPbmp); 5054 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectMcast); 5055 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc); 5056 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressMask); 5057 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressPortsAdd); 5058 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricEHAddOrUpdate); 5059 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5060 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectPbmp); 5061 break; 5062 case bcmFieldActionRedirectIpmc: 5063 case bcmFieldActionRedirectEgrNextHop: 5064 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirect); 5065 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectTrunk); 5066 _FP_ACTIONS_CONFLICT(bcmFieldActionUnmodifiedPacketRedirectPort); 5067 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop); 5068 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectCancel); 5069 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectVlan); 5070 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectBcastPbmp); 5071 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectMcast); 5072 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc); 5073 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressMask); 5074 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressPortsAdd); 5075 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricEHAddOrUpdate); 5076 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5077 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5078 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew); 5079 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew); 5080 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5081 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew); 5082 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew); 5083 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete); 5084 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew); 5085 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete); 5086 _FP_ACTIONS_CONFLICT(bcmFieldActionL3ChangeVlan); 5087 _FP_ACTIONS_CONFLICT(bcmFieldActionL3ChangeVlanCancel); 5088 _FP_ACTIONS_CONFLICT(bcmFieldActionL3ChangeMacDa); 5089 _FP_ACTIONS_CONFLICT(bcmFieldActionL3ChangeMacDaCancel); 5090 if (action1 != bcmFieldActionRedirectIpmc) { 5091 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5092 } 5093 break; 5094 case bcmFieldActionChangeL2Fields: 5095 case bcmFieldActionChangeL2FieldsCancel: 5096 case bcmFieldActionFabricQueue: 5097 case bcmFieldActionBFDSessionIdNew: 5098 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew); 5099 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew); 5100 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew); 5101 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew); 5102 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete); 5103 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew); 5104 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete); 5105 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5106 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5107 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5108 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5109 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5110 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5111 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5112 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5113 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5114 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5115 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop); 5116 if (action1 != bcmFieldActionFabricQueue) { 5117 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc); 5118 } 5119 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5120 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5121 } 5122 break; 5123 case bcmFieldActionAddClassTag: 5124 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew); 5125 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew); 5126 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew); 5127 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew); 5128 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete); 5129 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew); 5130 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete); 5131 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5132 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5133 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5134 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5135 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5136 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5137 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5138 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5139 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5140 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5141 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5142 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5143 } 5144 break; 5145 case bcmFieldActionL3SwitchCancel: 5146 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew); 5147 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew); 5148 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew); 5149 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew); 5150 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete); 5151 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew); 5152 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete); 5153 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5154 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5155 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5156 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5157 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5158 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5159 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5160 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5161 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5162 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5163 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5164 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5165 } 5166 break; 5167 case bcmFieldActionNewClassId: 5168 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew); 5169 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew); 5170 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew); 5171 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew); 5172 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete); 5173 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew); 5174 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete); 5175 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5176 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5177 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5178 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5179 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5180 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5181 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5182 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5183 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5184 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5185 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5186 } 5187 break; 5188 case bcmFieldActionEgressClassSelect: 5189 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew); 5190 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew); 5191 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew); 5192 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew); 5193 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete); 5194 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew); 5195 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete); 5196 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5197 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5198 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5199 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5200 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5201 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5202 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5203 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5204 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5205 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5206 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5207 } 5208 break; 5209 case bcmFieldActionL3Switch: 5210 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew); 5211 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew); 5212 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew); 5213 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew); 5214 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete); 5215 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew); 5216 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete); 5217 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5218 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5219 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5220 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5221 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5222 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5223 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5224 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5225 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5226 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop); 5227 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc); 5228 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectPbmp); 5229 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5230 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5231 } 5232 break; 5233 case bcmFieldActionMultipathHash: 5234 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew); 5235 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew); 5236 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew); 5237 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew); 5238 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete); 5239 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew); 5240 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete); 5241 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5242 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5243 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5244 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5245 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5246 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5247 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5248 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5249 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5250 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5251 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5252 } 5253 break; 5254 case bcmFieldActionDstMacNew: 5255 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew); 5256 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5257 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5258 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5259 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5260 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5261 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5262 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5263 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5264 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5265 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5266 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop); 5267 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc); 5268 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5269 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5270 } 5271 break; 5272 case bcmFieldActionSrcMacNew: 5273 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew); 5274 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5275 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5276 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5277 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5278 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5279 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5280 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5281 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5282 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5283 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5284 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop); 5285 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc); 5286 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5287 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5288 } 5289 break; 5290 case bcmFieldActionOuterVlanNew: 5291 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew); 5292 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5293 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5294 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5295 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5296 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5297 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5298 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5299 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5300 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5301 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5302 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop); 5303 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc); 5304 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5305 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5306 } 5307 break; 5308 case bcmFieldActionVnTagNew: 5309 case bcmFieldActionVnTagDelete: 5310 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew); 5311 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5312 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5313 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5314 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5315 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5316 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5317 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5318 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5319 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5320 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5321 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete); 5322 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop); 5323 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc); 5324 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5325 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5326 } 5327 break; 5328 case bcmFieldActionEtagNew: 5329 case bcmFieldActionEtagDelete: 5330 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew); 5331 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete); 5332 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5333 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5334 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5335 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5336 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5337 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5338 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5339 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5340 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5341 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5342 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop); 5343 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc); 5344 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5345 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5346 } 5347 break; 5348 case bcmFieldActionMirrorEgress: 5349 if (SOC_INFO(unit).th_ctc_replace_enabled) { 5350 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew); 5351 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields); 5352 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel); 5353 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue); 5354 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag); 5355 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch); 5356 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash); 5357 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel); 5358 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect); 5359 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId); 5360 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew); 5361 _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress); 5362 } 5363 break; 5364 #ifdef INCLUDE_L3 5365 case bcmFieldActionDynamicEcmpEnable: 5366 case bcmFieldActionDynamicEcmpCancel: 5367 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicEcmpEnable); 5368 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicEcmpCancel); 5369 break; 5370 #endif /*INCLUDE_L3*/ 5371 case bcmFieldActionDynamicTrunkEnable: 5372 case bcmFieldActionDynamicTrunkCancel: 5373 case bcmFieldActionDynamicHgTrunkEnable: 5374 case bcmFieldActionDynamicHgTrunkCancel: 5375 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicTrunkEnable); 5376 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicTrunkCancel); 5377 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicHgTrunkEnable); 5378 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicHgTrunkCancel); 5379 break; 5380 case bcmFieldActionEgressTimeStampInsert: 5381 case bcmFieldActionEgressTimeStampInsertCancel: 5382 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressTimeStampInsert); 5383 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressTimeStampInsertCancel); 5384 break; 5385 case bcmFieldActionIngressTimeStampInsert: 5386 case bcmFieldActionIngressTimeStampInsertCancel: 5387 _FP_ACTIONS_CONFLICT(bcmFieldActionIngressTimeStampInsert); 5388 _FP_ACTIONS_CONFLICT(bcmFieldActionIngressTimeStampInsertCancel); 5389 break; 5390 case bcmFieldActionIntTurnAround: 5391 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignEditCtrlId); 5392 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressFlowEncapEnable); 5393 break; 5394 5395 case bcmFieldActionIntEncapEnable: 5396 case bcmFieldActionNshEncapEnable: 5397 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignEditCtrlId); 5398 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressFlowEncapEnable); 5399 /* Intentional fall through for Conflict check */ 5400 /* Fall through */ 5401 case bcmFieldActionIntEncapDisable: 5402 case bcmFieldActionIntEncapUpdate: 5403 case bcmFieldActionAddIngOuterVlanToEgrOuterVlan: 5404 case bcmFieldActionErspan3HdrVlanCosPktCopy: 5405 case bcmFieldActionGbpClassifierAdd: 5406 case bcmFieldActionGbpSrcMacMcastBitSet: 5407 case bcmFieldActionAssignExtractionCtrlId: 5408 case bcmFieldActionEgressFlowControlEnable: 5409 _FP_ACTIONS_CONFLICT(bcmFieldActionIntEncapEnable); 5410 _FP_ACTIONS_CONFLICT(bcmFieldActionNshEncapEnable); 5411 _FP_ACTIONS_CONFLICT(bcmFieldActionIntEncapDisable); 5412 _FP_ACTIONS_CONFLICT(bcmFieldActionIntEncapUpdate); 5413 _FP_ACTIONS_CONFLICT(bcmFieldActionAddIngOuterVlanToEgrOuterVlan); 5414 _FP_ACTIONS_CONFLICT(bcmFieldActionErspan3HdrVlanCosPktCopy); 5415 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpClassifierAdd); 5416 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpSrcMacMcastBitSet); 5417 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignExtractionCtrlId); 5418 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressFlowControlEnable); 5419 break; 5420 case bcmFieldActionHiGigTrunkResilientHashEnable: 5421 case bcmFieldActionHiGigTrunkResilientHashDisable: 5422 _FP_ACTIONS_CONFLICT(bcmFieldActionHiGigTrunkResilientHashEnable); 5423 _FP_ACTIONS_CONFLICT(bcmFieldActionHiGigTrunkResilientHashDisable); 5424 break; 5425 case bcmFieldActionTrunkResilientHashEnable: 5426 case bcmFieldActionTrunkResilientHashDisable: 5427 _FP_ACTIONS_CONFLICT(bcmFieldActionTrunkResilientHashEnable); 5428 _FP_ACTIONS_CONFLICT(bcmFieldActionTrunkResilientHashDisable); 5429 break; 5430 case bcmFieldActionEcmpResilientHashEnable: 5431 case bcmFieldActionEcmpResilientHashDisable: 5432 _FP_ACTIONS_CONFLICT(bcmFieldActionEcmpResilientHashEnable); 5433 _FP_ACTIONS_CONFLICT(bcmFieldActionEcmpResilientHashDisable); 5434 break; 5435 case bcmFieldActionElephantLookupEnable: 5436 case bcmFieldActionElephantLookupDisable: 5437 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantLookupEnable); 5438 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantLookupDisable); 5439 break; 5440 case bcmFieldActionElephantQueueEnable: 5441 case bcmFieldActionElephantQueueDisable: 5442 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantQueueEnable); 5443 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantQueueDisable); 5444 break; 5445 case bcmFieldActionElephantColorEnable: 5446 case bcmFieldActionElephantColorDisable: 5447 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantColorEnable); 5448 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantColorDisable); 5449 break; 5450 case bcmFieldActionNshServiceIndex: 5451 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject2); 5452 break; 5453 case bcmFieldActionNshServicePathId: 5454 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject2); 5455 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject1); 5456 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpSrcIdNew); 5457 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignNatClassId); 5458 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpDstIdNew); 5459 break; 5460 case bcmFieldActionAssignOpaqueObject1: 5461 case bcmFieldActionGbpSrcIdNew: 5462 case bcmFieldActionAssignNatClassId: 5463 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpSrcIdNew); 5464 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignNatClassId); 5465 _FP_ACTIONS_CONFLICT(bcmFieldActionNshServicePathId); 5466 break; 5467 case bcmFieldActionAssignOpaqueObject2: 5468 case bcmFieldActionGbpDstIdNew: 5469 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject2); 5470 _FP_ACTIONS_CONFLICT(bcmFieldActionNshServicePathId); 5471 _FP_ACTIONS_CONFLICT(bcmFieldActionNshServiceIndex); 5472 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpDstIdNew); 5473 break; 5474 case bcmFieldActionAssignOpaqueObject3: 5475 case bcmFieldActionLoopbackSubtype: 5476 case bcmFieldActionAssignChangeL2FieldsClassId: 5477 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject3); 5478 _FP_ACTIONS_CONFLICT(bcmFieldActionLoopbackSubtype); 5479 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignChangeL2FieldsClassId); 5480 break; 5481 case bcmFieldActionAssignOpaqueObject4: 5482 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject4); 5483 break; 5484 case bcmFieldActionAssignEditCtrlId: 5485 _FP_ACTIONS_CONFLICT(bcmFieldActionNshEncapEnable); 5486 _FP_ACTIONS_CONFLICT(bcmFieldActionIntEncapEnable); 5487 _FP_ACTIONS_CONFLICT(bcmFieldActionIntTurnAround); 5488 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressFlowEncapEnable); 5489 break; 5490 default: 5491 return _bcm_field_td2_action_conflict_check(unit, 5492 f_ent, 5493 action1, 5494 action); 5495 break; 5496 } 5497 #if defined(BCM_FLOWTRACKER_SUPPORT) 5498 } else if (f_ent->group->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) { 5499 switch(action1) { 5500 case bcmFieldActionFlowtrackerGroupId: 5501 _FP_ACTIONS_CONFLICT(bcmFieldActionFlowtrackerGroupId); 5502 break; 5503 case bcmFieldActionFlowtrackerEnable: 5504 _FP_ACTIONS_CONFLICT(bcmFieldActionFlowtrackerEnable); 5505 break; 5506 case bcmFieldActionFlowtrackerNewLearnEnable: 5507 _FP_ACTIONS_CONFLICT(bcmFieldActionFlowtrackerNewLearnEnable); 5508 break; 5509 default: 5510 break; 5511 } 5512 #endif 5513 } else { 5514 switch (action1) { 5515 case bcmFieldActionLatencyMonitorEnable: 5516 case bcmFieldActionLatencyMonitorDisable: 5517 _FP_ACTIONS_CONFLICT(bcmFieldActionLatencyMonitorEnable); 5518 _FP_ACTIONS_CONFLICT(bcmFieldActionLatencyMonitorDisable); 5519 return BCM_E_NONE; 5520 default: 5521 break; 5522 } 5523 return _bcm_field_td2_action_conflict_check(unit, 5524 f_ent, 5525 action1, 5526 action); 5527 } 5528 5529 5530 return (BCM_E_NONE); 5531 5532 } 5533 /* 5534 * Function: 5535 * _field_th_common_actions_init 5536 * Purpose: 5537 * Initialize device stage lookup qaualifiers 5538 * select codes & offsets 5539 * Parameters: 5540 * unit - (IN) BCM device number. 5541 * stage_fc - (IN) Field Processor stage control structure. 5542 * Returns: 5543 * BCM_E_NONE 5544 */ 5545 int 5546 _field_th_common_actions_init(int unit, _field_stage_t *stage_fc) 5547 { 5548 _FP_ACTION_DECL 5549 uint32 offset = 0; /* General variable to carry offset. */ 5550 uint32 profile_one_offset = 0; /* Offset of PROFILE_ONE_SET. */ 5551 uint32 profile_two_offset = 0; /* Offset of PROFILE_TWO_SET. */ 5552 uint32 redirect_offset = 0; /* Offset of REDIRECT_SET. */ 5553 uint32 l3swl2change_offset = 0; /* Offset of L3SW_CHANGE_L2_SET. */ 5554 uint32 nat_offset = 0; /* Offset of NAT_SET. */ 5555 uint32 mirror_offset = 0; /* Offset of MIRROR_SET. */ 5556 uint32 lb_offset = 0; /* Offset of LB_CONTROL_SET. */ 5557 uint32 nat_override_offset = 0; /* Offset of NAT_OVERRIDE_SET. */ 5558 uint32 copytocpu_offset = 0; /* Offset of COPY_TO_CPU_SET. */ 5559 uint32 cutthrough_offset = 0; /* Offset of CUT_THRU_OVERRIDE_SET. */ 5560 uint32 urpf_offset = 0; /* Offset of URPF_OVERRIDE_SET. */ 5561 uint32 ttl_offset = 0; /* Offset of TTL_SET. */ 5562 uint32 cpucos_offset = 0; /* Offset of CHANGE_CPU_COS_SET. */ 5563 uint32 drop_offset = 0; /* Offset of DROP_SET. */ 5564 uint32 mirror_override_offset = 0; /* Offset of MIRROR_OVERRIDE_SET. */ 5565 uint32 sflow_offset = 0; /* Offset of SFLOW_SET. */ 5566 uint32 debug_offset = 0; /* Offset of INSTRUMENTATION_TRIGGERS_ENABLE. */ 5567 5568 /* Input parameters check. */ 5569 if (NULL == stage_fc) { 5570 return (BCM_E_PARAM); 5571 } 5572 if (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) { 5573 profile_one_offset = 0; /* Start of the IFP_POLICY_TABLE */ 5574 mirror_offset = 56; /* IFP_PROFILE_SET_1(56b) */ 5575 lb_offset = 68; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) */ 5576 nat_override_offset = 71; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5577 * LB_CONTROLS_SET(3b) 5578 */ 5579 copytocpu_offset = 72; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5580 * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) 5581 */ 5582 cutthrough_offset = 89; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5583 * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) + 5584 * COPY_TO_CPU_SET(17b) 5585 */ 5586 urpf_offset = 90; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5587 * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) + 5588 * COPY_TO_CPU_SET(17b) + 5589 * CUT_THRU_OVERRIDE_SET(1b) 5590 */ 5591 ttl_offset = 91; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5592 * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) + 5593 * COPY_TO_CPU_SET(17b) + 5594 * CUT_THRU_OVERRIDE_SET(1b) + 5595 * URPF_OVERRIDE_SET(1b) 5596 */ 5597 profile_two_offset = 101; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5598 * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) + 5599 * COPY_TO_CPU_SET(17b) + 5600 * CUT_THRU_OVERRIDE_SET(1b) + 5601 * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) + 5602 * RESERVED_0(1b) + ECCP_0(8b) 5603 */ 5604 l3swl2change_offset = 153; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5605 * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) + 5606 * COPY_TO_CPU_SET(17b) + 5607 * CUT_THRU_OVERRIDE_SET(1b) + 5608 * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) + 5609 * RESERVED_0(1b) + ECCP_0(8b) + 5610 * PROFILE_SET_2(52b) 5611 */ 5612 cpucos_offset = 176; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5613 * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) + 5614 * COPY_TO_CPU_SET(17b) + 5615 * CUT_THRU_OVERRIDE_SET(1b) + 5616 * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) + 5617 * RESERVED_0(1b) + ECCP_0(8b) + 5618 * PROFILE_SET_2(52b) + L3SW_CHANGE_L2_SET(33b) 5619 */ 5620 drop_offset = 184; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5621 * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) + 5622 * COPY_TO_CPU_SET(17b) + 5623 * CUT_THRU_OVERRIDE_SET(1b) + 5624 * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) + 5625 * RESERVED_0(1b) + ECCP_0(8b) + 5626 * PROFILE_SET_2(52b) + L3SW_CHANGE_L2_SET(33b) 5627 * + CHANGE_CPU_COS_SET(8b) 5628 */ 5629 mirror_override_offset = 190; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5630 * LB_CONTROLS_SET(3b) + 5631 * NAT_OVERRIDE_SET(1b) + 5632 * COPY_TO_CPU_SET(17b) + 5633 * CUT_THRU_OVERRIDE_SET(1b) + 5634 * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) + 5635 * RESERVED_0(1b) + ECCP_0(8b) + 5636 * PROFILE_SET_2(52b) + 5637 * L3SW_CHANGE_L2_SET(33b) + 5638 * CHANGE_CPU_COS_SET(8b) + DROP_SET(6b) + 5639 */ 5640 sflow_offset = 192; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5641 * LB_CONTROLS_SET(3b) + 5642 * NAT_OVERRIDE_SET(1b) + 5643 * COPY_TO_CPU_SET(17b) + 5644 * CUT_THRU_OVERRIDE_SET(1b) + 5645 * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) + 5646 * RESERVED_0(1b) + ECCP_0(8b) + 5647 * PROFILE_SET_2(52b) + 5648 * L3SW_CHANGE_L2_SET(33b) + 5649 * CHANGE_CPU_COS_SET(8b) + DROP_SET(6b) + 5650 * MIRROR_OVERRIDE_SET(1b) + 5651 * GREEN_TO_PID_SET(1b) 5652 */ 5653 debug_offset = 193; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5654 * LB_CONTROLS_SET(3b) + 5655 * NAT_OVERRIDE_SET(1b) + 5656 * COPY_TO_CPU_SET(17b) + 5657 * CUT_THRU_OVERRIDE_SET(1b) + 5658 * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) + 5659 * RESERVED_0(1b) + ECCP_0(8b) + 5660 * PROFILE_SET_2(52b) + 5661 * L3SW_CHANGE_L2_SET(33b) + 5662 * CHANGE_CPU_COS_SET(8b) + DROP_SET(6b) + 5663 * MIRROR_OVERRIDE_SET(1b) + 5664 * GREEN_TO_PID_SET(1b) + SFLOW_SET(1b) 5665 */ 5666 redirect_offset = 202; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5667 * LB_CONTROLS_SET(3b) + 5668 * NAT_OVERRIDE_SET(1b) + 5669 * COPY_TO_CPU_SET(17b) + 5670 * CUT_THRU_OVERRIDE_SET(1b) + 5671 * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) + 5672 * RESERVED_0(1b) + ECCP_0(8b) + 5673 * PROFILE_SET_2(52b) + 5674 * L3SW_CHANGE_L2_SET(33b) + 5675 * CHANGE_CPU_COS_SET(8b) + DROP_SET(6b) + 5676 * MIRROR_OVERRIDE_SET(1b) + 5677 * GREEN_TO_PID_SET(1b) + SFLOW_SET(1b) + 5678 * INSTRUMENTATION_TRIGGERS_ENABLE(1b) + 5679 * ECCP_1(8b) 5680 */ 5681 nat_offset = 283; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) + 5682 * LB_CONTROLS_SET(3b) + 5683 * NAT_OVERRIDE_SET(1b) + 5684 * COPY_TO_CPU_SET(17b) + 5685 * CUT_THRU_OVERRIDE_SET(1b) + 5686 * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) + 5687 * RESERVED_0(1b) + ECCP_0(8b) + 5688 * PROFILE_SET_2(52b) + 5689 * L3SW_CHANGE_L2_SET(33b) + 5690 * CHANGE_CPU_COS_SET(8b) + DROP_SET(6b) + 5691 * MIRROR_OVERRIDE_SET(1b) + 5692 * GREEN_TO_PID_SET(1b) + SFLOW_SET(1b) + 5693 * INSTRUMENTATION_TRIGGERS_ENABLE(1b) + 5694 * ECCP_1(8b) + REDIRECT_SET(38b) + 5695 * COUNTER_SET(25b) + METER_SET(18b) 5696 */ 5697 } else if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 5698 profile_two_offset=56; 5699 } 5700 5701 /* IFP_PROFILE_SET_1(56b) */ 5702 offset = profile_one_offset; 5703 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionUntaggedPacketPriorityNew, 5704 0, offset + 52, 4, -1, offset + 51, 1, 1); 5705 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDropPrecedence, 5706 0, offset + 0, 2, -1); 5707 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDropPrecedence, 5708 0, offset + 2, 2, -1); 5709 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDropPrecedence, 5710 0, offset + 4, 2, -1); 5711 5712 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpCosQNew, 5713 0, offset + 6, 8, -1, 30, 4, 1); 5714 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpCosMapNew, 5715 0, offset + 6, 2, -1, 30, 4, 2); 5716 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntCopy, 5717 0, offset + 30, 4, 4); 5718 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpPrioIntNew, 5719 0, offset + 6, 8, -1, 30, 4, 5); 5720 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntTos, 5721 0, offset + 30, 4, 6); 5722 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntCancel, 5723 0, offset + 30, 4, 7); 5724 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpUcastCosQNew, 5725 0, offset + 6, 4, -1, 30, 4, 8); 5726 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpMcastCosQNew, 5727 0, offset + 10, 4, -1, 30, 4, 9); 5728 5729 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpCosQNew, 5730 0, offset + 14, 8, -1, 34, 4, 1); 5731 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpCosMapNew, 5732 0, offset + 14, 2, -1, 34, 4, 2); 5733 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntCopy, 5734 0, offset + 34, 4, 4); 5735 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpPrioIntNew, 5736 0, offset + 14, 8, -1, 34, 4, 5); 5737 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntTos, 5738 0, offset + 34, 4, 6); 5739 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntCancel, 5740 0, offset + 34, 4, 7); 5741 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpUcastCosQNew, 5742 0, offset + 14, 4, -1, 34, 4, 8); 5743 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpMcastCosQNew, 5744 0, offset + 18, 4, -1, 34, 4, 9); 5745 5746 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpCosQNew, 5747 0, offset + 22, 8, -1, 38, 4, 1); 5748 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpCosMapNew, 5749 0, offset + 22, 2, -1, 38, 4, 2); 5750 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntCopy, 5751 0, offset + 38, 4, 4); 5752 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpPrioIntNew, 5753 0, offset + 22, 8, -1, 38, 4, 5); 5754 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntTos, 5755 0, offset + 38, 4, 6); 5756 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntCancel, 5757 0, offset + 38, 4, 7); 5758 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpUcastCosQNew, 5759 0, offset + 22, 4, -1, 38, 4, 8); 5760 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpMcastCosQNew, 5761 0, offset + 26, 4, -1, 38, 4, 9); 5762 5763 if (soc_feature(unit, soc_feature_ecn_wred)) { 5764 _FP_ACTION_ADD_TWO(unit, stage_fc, 5765 bcmFieldActionGpIntCongestionNotificationNew, 5766 _BCM_FIELD_ACTION_NO_EM_SUPPORT, 5767 offset + 46, 2, -1, 50, 1, 1); 5768 _FP_ACTION_ADD_TWO(unit, stage_fc, 5769 bcmFieldActionYpIntCongestionNotificationNew, 5770 _BCM_FIELD_ACTION_NO_EM_SUPPORT 5771 , offset + 44, 2, -1, 49, 1, 1); 5772 _FP_ACTION_ADD_TWO(unit, stage_fc, 5773 bcmFieldActionRpIntCongestionNotificationNew, 5774 _BCM_FIELD_ACTION_NO_EM_SUPPORT 5775 , offset + 42, 2, -1, 48, 1, 1); 5776 } 5777 5778 if (soc_feature(unit, soc_feature_field_action_pfc_class)) { 5779 _FP_ACTION_ADD_TWO(unit, stage_fc, 5780 bcmFieldActionPfcClassNew, 5781 0, offset + 52, 4, -1, 51, 1, 1); 5782 } 5783 5784 /* IFP_MIRROR_SET(12b) */ 5785 offset = mirror_offset; 5786 5787 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMirrorIngress, 5788 0, _FieldActionMirrorSet, 5789 offset + 8, 4, 0, offset , 8, 0); 5790 5791 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMirrorEgress, 5792 0, _FieldActionMirrorSet, 5793 offset + 8, 4, 0, offset , 8, 0); 5794 5795 /* IFP_LB_CONTROLS_SET(3b) */ 5796 offset = lb_offset; 5797 5798 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, 5799 bcmFieldActionHgTrunkRandomRoundRobinHashCancel, 5800 0, _FieldActionLbControlSet, 5801 offset + 0, 1, 1); 5802 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, 5803 bcmFieldActionTrunkRandomRoundRobinHashCancel, 5804 0, _FieldActionLbControlSet, 5805 offset + 1, 1, 1); 5806 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, 5807 bcmFieldActionEcmpRandomRoundRobinHashCancel, 5808 0, _FieldActionLbControlSet, 5809 offset + 2, 1, 1); 5810 5811 /* IFP_NAT_OVERRIDE_SET(1b) */ 5812 offset = nat_override_offset; 5813 5814 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionNatCancel, 5815 0, _FieldActionNatOverrideSet, offset + 0, 1, 1); 5816 5817 /* IFP_COPY_TO_CPU_SET(17b) */ 5818 offset = copytocpu_offset; 5819 5820 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionRpCopyToCpu, 5821 0, _FieldActionCopyToCpuSet, 5822 offset + 9, 8, -1, offset + 0, 3, 1); 5823 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpCopyToCpuCancel, 5824 0, _FieldActionCopyToCpuSet, 5825 offset + 0, 3, 2); 5826 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpSwitchToCpuCancel, 5827 0, _FieldActionCopyToCpuSet, 5828 offset + 0, 3, 3); 5829 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpSwitchToCpuReinstate, 5830 0, _FieldActionCopyToCpuSet, 5831 offset + 0, 3, 4); 5832 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionRpTimeStampToCpu, 5833 0, _FieldActionCopyToCpuSet, 5834 offset + 9, 8, -1, offset + 0, 3, 5); 5835 5836 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionYpCopyToCpu, 5837 0, _FieldActionCopyToCpuSet, 5838 offset + 9, 8, -1, offset + 3, 3, 1); 5839 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpCopyToCpuCancel, 5840 0, _FieldActionCopyToCpuSet, 5841 offset + 3, 3, 2); 5842 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpSwitchToCpuCancel, 5843 0, _FieldActionCopyToCpuSet, 5844 offset + 3, 3, 3); 5845 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpSwitchToCpuReinstate, 5846 0, _FieldActionCopyToCpuSet, 5847 offset + 3, 3, 4); 5848 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionYpTimeStampToCpu, 5849 0, _FieldActionCopyToCpuSet, 5850 offset + 9, 8, -1, offset + 3, 3, 5); 5851 5852 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionGpCopyToCpu, 5853 0, _FieldActionCopyToCpuSet, 5854 offset + 9, 8, -1, offset + 6, 3, 1); 5855 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpCopyToCpuCancel, 5856 0, _FieldActionCopyToCpuSet, 5857 offset + 6, 3, 2); 5858 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpSwitchToCpuCancel, 5859 0, _FieldActionCopyToCpuSet, 5860 offset + 6, 3, 3); 5861 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpSwitchToCpuReinstate, 5862 0, _FieldActionCopyToCpuSet, 5863 offset + 6, 3, 4); 5864 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionGpTimeStampToCpu, 5865 0, _FieldActionCopyToCpuSet, 5866 offset + 9, 8, -1, offset + 6, 3, 5); 5867 5868 /* IFP_CUT_THRU_OVERRIDE_SET(1b) */ 5869 offset = cutthrough_offset; 5870 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotCutThrough, 5871 0, _FieldActionCutThrOverrideSet, offset + 0, 1, 1); 5872 5873 /* IFP_URPF_OVERRIDE_SET(1b) */ 5874 offset = urpf_offset; 5875 5876 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotCheckUrpf, 5877 0, _FieldActionUrpfOverrideSet, offset + 0, 1, 1); 5878 5879 /* IFP_TTL_SET(1b) */ 5880 offset = ttl_offset; 5881 5882 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotChangeTtl, 5883 0, _FieldActionTtlOverrideSet, offset + 0, 1, 1); 5884 5885 /* IFP_PROFILE_SET_2(52b) */ 5886 offset = profile_two_offset; 5887 5888 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpEcnNew, 5889 0, offset + 0, 2, -1, offset + 6, 1, 1); 5890 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpEcnNew, 5891 0, offset + 2, 2, -1, offset + 7, 1, 1); 5892 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpEcnNew, 5893 0, offset + 4, 2, -1, offset + 8, 1, 1); 5894 5895 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDot1pPreserve, 5896 0, offset + 18, 3, 3); 5897 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktCopy, 5898 0, offset + 18, 3, 4); 5899 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpPrioPktNew, 5900 0, offset + 9, 3, -1, offset + 18, 3, 5); 5901 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktTos, 5902 0, offset + 18, 3, 6); 5903 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktCancel, 5904 0, offset + 18, 3, 7); 5905 5906 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDot1pPreserve, 5907 0, offset + 21, 3, 3); 5908 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktCopy, 5909 0, offset + 21, 3, 4); 5910 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpPrioPktNew, 5911 0, offset + 12, 3, -1, offset + 21, 3, 5); 5912 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktTos, 5913 0, offset + 21, 3, 6); 5914 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktCancel, 5915 0, offset + 21, 3, 7); 5916 5917 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDot1pPreserve, 5918 0, offset + 24, 3, 3); 5919 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktCopy, 5920 0, offset + 24, 3, 4); 5921 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpPrioPktNew, 5922 0, offset + 15, 3, -1, offset + 24, 3, 5); 5923 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktTos, 5924 0, offset + 24, 3, 6); 5925 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktCancel, 5926 0, offset + 24, 3, 7); 5927 5928 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpDscpNew, 5929 0, offset + 40, 6, -1, offset + 27, 2, 1); 5930 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDscpCancel, 5931 0, offset + 27, 2, 2); 5932 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDscpPreserve, 5933 0, offset + 27, 2, 3); 5934 5935 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpDscpNew, 5936 0, offset + 34, 6, -1, offset + 29, 2, 1); 5937 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDscpCancel, 5938 0, offset + 29, 2, 2); 5939 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDscpPreserve, 5940 0, offset + 29, 2, 3); 5941 5942 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpDscpNew, 5943 0, offset + 46, 6, -1, offset + 31, 3, 3); 5944 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDscpCancel, 5945 0, offset + 31, 3, 4); 5946 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDscpPreserve, 5947 0, offset + 31, 3, 5); 5948 5949 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpTosPrecedenceNew, 5950 0, offset + 46, 6, -1, offset + 31, 3, 1); 5951 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpTosPrecedenceCopy, 5952 0, offset + 31, 3, 2); 5953 5954 /* IFP_L3SW_CHANGE_L2_SET(33b) */ 5955 offset = l3swl2change_offset; 5956 if (!soc_feature(unit, soc_feature_th3_style_fp)) { 5957 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionDstMacNew, 5958 0, _FieldActionL3SwChangeL2Set, 5959 offset + 0, 15, -1, offset + 19, 4, 1); 5960 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionSrcMacNew, 5961 0, _FieldActionL3SwChangeL2Set, 5962 offset + 0, 15, -1, offset + 19, 4, 1); 5963 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionOuterVlanNew, 5964 0, _FieldActionL3SwChangeL2Set, 5965 offset + 0, 15, -1, offset + 19, 4, 1); 5966 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionVnTagNew, 5967 0, _FieldActionL3SwChangeL2Set, 5968 offset + 0, 15, -1, offset + 19, 4, 1); 5969 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionVnTagDelete, 5970 0, _FieldActionL3SwChangeL2Set, 5971 offset + 0, 15, -1, offset + 19, 4, 1); 5972 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEtagNew, 5973 0, _FieldActionL3SwChangeL2Set, 5974 offset + 0, 15, -1, offset + 19, 4, 1); 5975 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEtagDelete, 5976 0, _FieldActionL3SwChangeL2Set, 5977 offset + 0, 15, -1, offset + 19, 4, 1); 5978 } 5979 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionChangeL2Fields, 5980 0, _FieldActionL3SwChangeL2Set, 5981 offset + 0, 15, -1, offset + 19, 4, 1); 5982 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, 5983 bcmFieldActionChangeL2FieldsCancel, 5984 0, _FieldActionL3SwChangeL2Set, 5985 offset + 19, 4, 2); 5986 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionFabricQueue, 5987 0, _FieldActionL3SwChangeL2Set, 5988 offset + 0, 2, -1, 5989 offset + 2, 16, -1, offset + 19, 4, 3); 5990 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionAddClassTag, 5991 0, _FieldActionL3SwChangeL2Set, 5992 offset + 0, 16, -1, offset + 19, 4, 4); 5993 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionL3Switch, 5994 _BCM_FIELD_ACTION_L3SWITCH_NEXT_HOP, 5995 _FieldActionL3SwChangeL2Set, 5996 offset + 0, 15, -1, 5997 offset + 17, 1, 0, offset + 19, 4, 6); 5998 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionL3Switch, 5999 _BCM_FIELD_ACTION_L3SWITCH_ECMP, 6000 _FieldActionL3SwChangeL2Set, 6001 offset + 0, 11, -1, 6002 offset + 17, 1, 1, offset + 19, 4, 6); 6003 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMultipathHash, 6004 0, _FieldActionL3SwChangeL2Set, 6005 offset + 11, 3, -1, offset + 19, 4, 6); 6006 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionL3SwitchCancel, 6007 0, _FieldActionL3SwChangeL2Set, 6008 offset + 19, 4, 7); 6009 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressClassSelect, 6010 0, _FieldActionL3SwChangeL2Set, 6011 offset + 0, 4, -1, offset + 19, 4, 8); 6012 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionHiGigClassSelect, 6013 0, _FieldActionL3SwChangeL2Set, 6014 offset + 4, 3, -1, offset + 19, 4, 8); 6015 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionNewClassId, 6016 0, _FieldActionL3SwChangeL2Set, 6017 offset + 7, 9, -1, offset + 19, 4, 8); 6018 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionBFDSessionIdNew, 6019 0, _FieldActionL3SwChangeL2Set, 6020 offset + 0, 12, -1, offset + 19, 4, 9); 6021 6022 /* IFP_CHANGE_CPU_COS_SET(8b) */ 6023 offset = cpucos_offset; 6024 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionCosQCpuNew, 6025 0, _FieldActionChangeCpuCosSet, 6026 offset + 0, 6, -1, offset + 6, 2, 1); 6027 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionServicePoolIdNew, 0, 6028 _FieldActionChangeCpuCosSet, 6029 offset + 2, 2, -1, 6030 offset + 4, 2, 2, 6031 offset + 6, 2, 2); 6032 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionServicePoolIdPrecedenceNew, 0, 6033 _FieldActionChangeCpuCosSet, 6034 offset + 2, 2, -1, 6035 offset + 0, 2, -1, 6036 offset + 4, 2, 3, 6037 offset + 6, 2, 2); 6038 /* IFP_DROP_SET(6b) */ 6039 offset = drop_offset; 6040 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpDrop, 6041 0, _FieldActionDropSet, offset + 0, 2, 1); 6042 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpDropCancel, 6043 0, _FieldActionDropSet, offset + 0, 2, 2); 6044 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpDrop, 6045 0, _FieldActionDropSet, offset + 2, 2, 1); 6046 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpDropCancel, 6047 0, _FieldActionDropSet, offset + 2, 2, 2); 6048 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpDrop, 6049 0, _FieldActionDropSet, offset + 4, 2, 1); 6050 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpDropCancel, 6051 0, _FieldActionDropSet, offset + 4, 2, 2); 6052 6053 /* IFP_MIRROR_OVERRIDE_SET(1b) */ 6054 offset = mirror_override_offset; 6055 6056 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionMirrorOverride, 6057 0, _FieldActionMirrorOverrideSet, offset + 0, 1, 1); 6058 6059 /* IFP_SFLOW_SET(1b) */ 6060 offset = sflow_offset; 6061 6062 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionIngSampleEnable, 6063 0, _FieldActionSflowSet, offset + 0, 1, 1); 6064 6065 /* IFP_INSTRUMENTATION_TRIGGERS_ENABLE_SET(1b)*/ 6066 offset = debug_offset; 6067 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionPacketTraceEnable, 6068 _BCM_FIELD_ACTION_NO_EM_SUPPORT, 6069 _FieldActionInstrumentationSet, 6070 offset + 0, 1, 1); 6071 6072 /* IFP_REDIRECT_SET(38b) */ 6073 offset = redirect_offset; 6074 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirect, 6075 _BCM_FIELD_ACTION_REDIRECT_DGLP, 6076 _FieldActionRedirectSet, 6077 offset + 6, 16, -1, offset + 22 , 1, 0, 6078 offset + 3, 3, 0, offset + 0, 3, 1); 6079 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirect, 6080 _BCM_FIELD_ACTION_REDIRECT_DVP, 6081 _FieldActionRedirectSet, 6082 offset + 6, 14, -1, 6083 offset + 3, 3, 6, offset + 0, 3, 1); 6084 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirect, 6085 _BCM_FIELD_ACTION_REDIRECT_TRUNK, 6086 _FieldActionRedirectSet, 6087 offset + 6, 16, -1, offset + 22, 1, 1, 6088 offset + 3, 3, 0, offset + 0, 3, 1); 6089 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirectTrunk, 6090 _BCM_FIELD_ACTION_REDIRECT_TRUNK, 6091 _FieldActionRedirectSet, 6092 offset + 6, 16, -1, offset + 22, 1, 1, 6093 offset + 3, 3, 0, offset + 0, 3, 1); 6094 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectTrunk, 6095 _BCM_FIELD_ACTION_REDIRECT_DVP, 6096 _FieldActionRedirectSet, 6097 offset + 6, 14, -1, 6098 offset + 3, 3, 6, offset + 0, 3, 1); 6099 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, 6100 bcmFieldActionUnmodifiedPacketRedirectPort, 6101 _BCM_FIELD_ACTION_REDIRECT_DGLP, 6102 _FieldActionRedirectSet, 6103 offset + 6, 16, -1, offset + 22, 1, 0, 6104 offset + 3, 3, 1, offset + 0, 3, 1); 6105 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectEgrNextHop, 6106 _BCM_FIELD_ACTION_REDIRECT_NEXT_HOP, 6107 _FieldActionRedirectSet, 6108 offset + 6, 16, -1, 6109 offset + 3, 3, 2, offset + 0, 3, 1); 6110 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectEgrNextHop, 6111 _BCM_FIELD_ACTION_REDIRECT_ECMP, 6112 _FieldActionRedirectSet, 6113 offset + 6, 16, -1, 6114 offset + 3, 3, 3, offset + 0, 3, 1); 6115 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRedirectCancel, 6116 0, _FieldActionRedirectSet, offset + 0, 3, 2); 6117 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectPbmp, 0, 6118 _FieldActionRedirectSet, 6119 offset + 6, 10, -1, 6120 offset + 23, 2, 0, offset + 0, 3, 3); 6121 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectVlan, 0, 6122 _FieldActionRedirectSet, 6123 offset + 17, 1, 0, 6124 offset + 23, 2, 1, offset + 0, 3, 3); 6125 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirectBcastPbmp, 0, 6126 _FieldActionRedirectSet, 6127 offset + 6, 10, -1, offset + 17, 1, 1, 6128 offset + 23, 2, 1, offset + 0, 3, 3); 6129 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectMcast, 0, 6130 _FieldActionRedirectSet, 6131 offset + 6, 14, -1, 6132 offset + 23, 2, 2, offset + 0, 3, 3); 6133 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectIpmc, 0, 6134 _FieldActionRedirectSet, 6135 offset + 6, 14, -1, 6136 offset + 23, 2, 3, offset + 0, 3, 3); 6137 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressMask, 0, 6138 _FieldActionRedirectSet, 6139 offset + 6, 10, -1, offset + 0, 3, 4); 6140 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressPortsAdd, 0, 6141 _FieldActionRedirectSet, 6142 offset + 6, 10, -1, offset + 0, 3, 5); 6143 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionFabricEHAddOrUpdate, 0, 6144 _FieldActionRedirectSet, 6145 offset + 3, 32, -1, 6146 offset + 35, 3, -1, offset + 0, 3, 6); 6147 6148 /* IFP_NAT_SET(12b) */ 6149 offset = nat_offset; 6150 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionNat, 6151 0, _FieldActionNatSet, offset + 11, 1, 1); 6152 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionNatEgressOverride, 6153 0, _FieldActionNatSet, 6154 offset + 0, 10, -1, offset + 10, 1, -1); 6155 6156 /* ExactMatch Action Class Id (12b) */ 6157 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionExactMatchClassId, 6158 _BCM_FIELD_ACTION_NO_IFP_SUPPORT, 0, 12, 0); 6159 6160 /* All actions which have corresponding Colored(Gp/Yp/Rp) Actions needs to be 6161 * initialized with some default configuration(offset = 0, width = 0, value = 0). 6162 */ 6163 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionCosQNew, 0, 0, 0, 0); 6164 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntCopy, 0, 0, 0, 0); 6165 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntNew, 0, 0, 0, 0); 6166 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntTos, 0, 0, 0, 0); 6167 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntCancel, 0, 0, 0, 0); 6168 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionUcastCosQNew, 0, 0, 0, 0); 6169 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionMcastCosQNew, 0, 0, 0, 0); 6170 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDropPrecedence, 0, 0, 0, 0); 6171 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionColorIndependent, 6172 0, _FieldActionGreenToPidSet, 0, 0, 0); 6173 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionEcnNew, 0, 0, 0, 0); 6174 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktCopy, 0, 0, 0, 0); 6175 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktNew, 0, 0, 0, 0); 6176 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktTos, 0, 0, 0, 0); 6177 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktCancel, 0, 0, 0, 0); 6178 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpNew, 0, 0, 0, 0); 6179 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpCancel, 0, 0, 0, 0); 6180 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionCopyToCpu, 6181 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6182 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionCopyToCpuCancel, 6183 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6184 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionSwitchToCpuCancel, 6185 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6186 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionSwitchToCpuReinstate, 6187 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6188 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionTimeStampToCpu, 6189 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6190 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionTimeStampToCpuCancel, 6191 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6192 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpTimeStampToCpuCancel, 6193 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6194 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpTimeStampToCpuCancel, 6195 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6196 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpTimeStampToCpuCancel, 6197 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6198 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDrop, 6199 0, _FieldActionDropSet, 0, 0, 0); 6200 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDropCancel, 6201 0, _FieldActionDropSet, 0, 0, 0); 6202 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntCopy, 0, 0, 0, 0); 6203 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntNew, 0, 0, 0, 0); 6204 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntTos, 0, 0, 0, 0); 6205 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntCancel, 0, 0, 0, 0); 6206 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntCopy, 0, 0, 0, 0); 6207 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntNew, 0, 0, 0, 0); 6208 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntTos, 0, 0, 0, 0); 6209 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntCancel, 0, 0, 0, 0); 6210 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntCopy, 0, 0, 0, 0); 6211 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntNew, 0, 0, 0, 0); 6212 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntTos, 0, 0, 0, 0); 6213 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntCancel, 0, 0, 0, 0); 6214 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntCopy, 0, 0, 0, 0); 6215 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntNew, 0, 0, 0, 0); 6216 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntTos, 0, 0, 0, 0); 6217 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntCancel, 0, 0, 0, 0); 6218 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionCosMapNew, 0, 0, 0, 0); 6219 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpPreserve, 0, 0, 0, 0); 6220 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDot1pPreserve, 0, 0, 0, 0); 6221 6222 return BCM_E_NONE; 6223 } 6224 6225 #ifdef BCM_TOMAHAWK2_SUPPORT 6226 /* 6227 * Function: 6228 * _field_th2_common_actions_init 6229 * Purpose: 6230 * Initialize device stage lookup qaualifiers 6231 * select codes & offsets 6232 * Parameters: 6233 * unit - (IN) BCM device number. 6234 * stage_fc - (IN) Field Processor stage control structure. 6235 * Returns: 6236 * BCM_E_NONE 6237 */ 6238 int 6239 _field_th2_common_actions_init(int unit, _field_stage_t *stage_fc) 6240 { 6241 _FP_ACTION_DECL 6242 uint32 offset = 0; /* General variable to carry offset. */ 6243 uint32 profile_one_offset = 0; /* Offset of PROFILE_ONE_SET. */ 6244 uint32 profile_two_offset = 0; /* Offset of PROFILE_TWO_SET. */ 6245 uint32 redirect_offset = 0; /* Offset of REDIRECT_SET. */ 6246 uint32 l3swl2change_offset = 0; /* Offset of L3SW_CHANGE_L2_SET. */ 6247 uint32 nat_offset = 0; /* Offset of NAT_SET. */ 6248 uint32 mirror_offset = 0; /* Offset of MIRROR_SET. */ 6249 uint32 lb_offset = 0; /* Offset of LB_CONTROL_SET. */ 6250 uint32 nat_override_offset = 0; /* Offset of NAT_OVERRIDE_SET. */ 6251 uint32 copytocpu_offset = 0; /* Offset of COPY_TO_CPU_SET. */ 6252 uint32 cutthrough_offset = 0; /* Offset of CUT_THRU_OVERRIDE_SET. */ 6253 uint32 urpf_offset = 0; /* Offset of URPF_OVERRIDE_SET. */ 6254 uint32 ttl_offset = 0; /* Offset of TTL_SET. */ 6255 uint32 cpucos_offset = 0; /* Offset of CHANGE_CPU_COS_SET. */ 6256 uint32 drop_offset = 0; /* Offset of DROP_SET. */ 6257 uint32 mirror_override_offset = 0; /* Offset of MIRROR_OVERRIDE_SET. */ 6258 uint32 sflow_offset = 0; /* Offset of SFLOW_SET. */ 6259 uint32 debug_offset = 0; /* Offset of INSTRUMENTATION_TRIGGERS_ENABLE. */ 6260 uint32 timestamp_offset = 0; /* Offset of TIMESTAMP_SET. */ 6261 uint32 dlb_hgt_lag_offset = 0; /* Offset of DLB_HGT_LAG_SET. */ 6262 #if defined(INCLUDE_L3) 6263 uint32 prot_switch_offset = 0; /* Offset of PROTECTION_SWITCHING_SET. */ 6264 uint32 dlb_ecmp_offset = 0; /* Offset of DLB_ECMP_SET. */ 6265 uint32 dlb_alternate_path_control_offset = 0; /* Offset of DLB_ALTERNATE_PATH_CONTROL_SET. */ 6266 #endif /* INCLUDE_L3 */ 6267 soc_field_info_t * f_info; 6268 6269 /* Input parameters check. */ 6270 if (NULL == stage_fc) { 6271 return (BCM_E_PARAM); 6272 } 6273 6274 if (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) { 6275 profile_one_offset = 0; 6276 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, MIRROR_SETf); 6277 mirror_offset = f_info->bp; 6278 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, LB_CONTROLS_SETf); 6279 lb_offset = f_info->bp; 6280 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, NAT_OVERRIDE_SETf); 6281 nat_override_offset = f_info->bp; 6282 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, COPY_TO_CPU_SETf); 6283 copytocpu_offset = f_info->bp; 6284 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, CUT_THRU_OVERRIDE_SETf); 6285 cutthrough_offset = f_info->bp; 6286 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, URPF_OVERRIDE_SETf); 6287 urpf_offset = f_info->bp; 6288 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, TTL_OVERRIDE_SETf); 6289 ttl_offset = f_info->bp; 6290 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, PROFILE_SET_2f); 6291 profile_two_offset = f_info->bp; 6292 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, L3SW_CHANGE_L2_SETf); 6293 l3swl2change_offset = f_info->bp; 6294 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, CHANGE_CPU_COS_SETf); 6295 cpucos_offset = f_info->bp; 6296 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, DROP_SETf); 6297 drop_offset = f_info->bp; 6298 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, MIRROR_OVERRIDE_SETf); 6299 mirror_override_offset = f_info->bp; 6300 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, SFLOW_SETf); 6301 sflow_offset = f_info->bp; 6302 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, INSTRUMENTATION_TRIGGERS_ENABLEf); 6303 debug_offset = f_info->bp; 6304 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, REDIRECT_SETf); 6305 redirect_offset = f_info->bp; 6306 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, NAT_SETf); 6307 nat_offset = f_info->bp; 6308 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, DLB_HGT_LAG_SETf); 6309 dlb_hgt_lag_offset = f_info->bp; 6310 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, TIMESTAMP_SETf); 6311 timestamp_offset = f_info->bp; 6312 #if defined(INCLUDE_L3) 6313 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, PROTECTION_SWITCHING_SETf); 6314 prot_switch_offset = f_info->bp; 6315 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, DLB_ECMP_SETf); 6316 dlb_ecmp_offset = f_info->bp; 6317 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, DLB_ALTERNATE_PATH_CONTROL_SETf); 6318 dlb_alternate_path_control_offset = f_info->bp; 6319 #endif /* INCLUDE_L3 */ 6320 } else if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 6321 f_info = soc_mem_fieldinfo_get(unit, EXACT_MATCH_QOS_ACTIONS_PROFILEm, PROFILE_SET_2f); 6322 profile_two_offset = f_info->bp; 6323 } 6324 6325 /* IFP_PROFILE_SET_1(56b) */ 6326 offset = profile_one_offset; 6327 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionUntaggedPacketPriorityNew, 6328 0, offset + 52, 4, -1, offset + 51, 1, 1); 6329 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDropPrecedence, 6330 0, offset + 0, 2, -1); 6331 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDropPrecedence, 6332 0, offset + 2, 2, -1); 6333 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDropPrecedence, 6334 0, offset + 4, 2, -1); 6335 6336 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpCosQNew, 6337 0, offset + 6, 8, -1, 30, 4, 1); 6338 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpCosMapNew, 6339 0, offset + 6, 2, -1, 30, 4, 2); 6340 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntCopy, 6341 0, offset + 30, 4, 4); 6342 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpPrioIntNew, 6343 0, offset + 6, 8, -1, 30, 4, 5); 6344 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntTos, 6345 0, offset + 30, 4, 6); 6346 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntCancel, 6347 0, offset + 30, 4, 7); 6348 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpUcastCosQNew, 6349 0, offset + 6, 4, -1, 30, 4, 8); 6350 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpMcastCosQNew, 6351 0, offset + 10, 4, -1, 30, 4, 9); 6352 6353 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpCosQNew, 6354 0, offset + 14, 8, -1, 34, 4, 1); 6355 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpCosMapNew, 6356 0, offset + 14, 2, -1, 34, 4, 2); 6357 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntCopy, 6358 0, offset + 34, 4, 4); 6359 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpPrioIntNew, 6360 0, offset + 14, 8, -1, 34, 4, 5); 6361 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntTos, 6362 0, offset + 34, 4, 6); 6363 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntCancel, 6364 0, offset + 34, 4, 7); 6365 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpUcastCosQNew, 6366 0, offset + 14, 4, -1, 34, 4, 8); 6367 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpMcastCosQNew, 6368 0, offset + 18, 4, -1, 34, 4, 9); 6369 6370 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpCosQNew, 6371 0, offset + 22, 8, -1, 38, 4, 1); 6372 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpCosMapNew, 6373 0, offset + 22, 2, -1, 38, 4, 2); 6374 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntCopy, 6375 0, offset + 38, 4, 4); 6376 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpPrioIntNew, 6377 0, offset + 22, 8, -1, 38, 4, 5); 6378 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntTos, 6379 0, offset + 38, 4, 6); 6380 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntCancel, 6381 0, offset + 38, 4, 7); 6382 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpUcastCosQNew, 6383 0, offset + 22, 4, -1, 38, 4, 8); 6384 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpMcastCosQNew, 6385 0, offset + 26, 4, -1, 38, 4, 9); 6386 6387 if (soc_feature(unit, soc_feature_ecn_wred)) { 6388 _FP_ACTION_ADD_TWO(unit, stage_fc, 6389 bcmFieldActionGpIntCongestionNotificationNew, 6390 _BCM_FIELD_ACTION_NO_EM_SUPPORT, 6391 offset + 46, 2, -1, 50, 1, 1); 6392 _FP_ACTION_ADD_TWO(unit, stage_fc, 6393 bcmFieldActionYpIntCongestionNotificationNew, 6394 _BCM_FIELD_ACTION_NO_EM_SUPPORT 6395 , offset + 44, 2, -1, 49, 1, 1); 6396 _FP_ACTION_ADD_TWO(unit, stage_fc, 6397 bcmFieldActionRpIntCongestionNotificationNew, 6398 _BCM_FIELD_ACTION_NO_EM_SUPPORT 6399 , offset + 42, 2, -1, 48, 1, 1); 6400 } 6401 6402 if (soc_feature(unit, soc_feature_field_action_pfc_class)) { 6403 _FP_ACTION_ADD_TWO(unit, stage_fc, 6404 bcmFieldActionPfcClassNew, 6405 0, offset + 52, 4, -1, 51, 1, 1); 6406 } 6407 6408 /* IFP_MIRROR_SET(12b) */ 6409 offset = mirror_offset; 6410 6411 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMirrorIngress, 6412 0, _FieldActionMirrorSet, 6413 offset + 8, 4, 0, offset , 8, 0); 6414 6415 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMirrorEgress, 6416 0, _FieldActionMirrorSet, 6417 offset + 8, 4, 0, offset , 8, 0); 6418 6419 /* IFP_LB_CONTROLS_SET(3b) */ 6420 offset = lb_offset; 6421 6422 6423 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, 6424 bcmFieldActionHgTrunkRandomRoundRobinHashCancel, 6425 0, _FieldActionLbControlSet, 6426 offset + 0, 1, 1); 6427 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, 6428 bcmFieldActionTrunkRandomRoundRobinHashCancel, 6429 0, _FieldActionLbControlSet, 6430 offset + 1, 1, 1); 6431 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, 6432 bcmFieldActionEcmpRandomRoundRobinHashCancel, 6433 0, _FieldActionLbControlSet, 6434 offset + 2, 1, 1); 6435 6436 /* IFP_NAT_OVERRIDE_SET(1b) */ 6437 offset = nat_override_offset; 6438 6439 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionNatCancel, 6440 0, _FieldActionNatOverrideSet, offset + 0, 1, 1); 6441 /* IFP_COPY_TO_CPU_SET(17b) */ 6442 offset = copytocpu_offset; 6443 6444 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionRpCopyToCpu, 6445 0, _FieldActionCopyToCpuSet, 6446 offset + 9, 8, -1, offset + 0, 3, 1); 6447 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpCopyToCpuCancel, 6448 0, _FieldActionCopyToCpuSet, 6449 offset + 0, 3, 2); 6450 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpSwitchToCpuCancel, 6451 0, _FieldActionCopyToCpuSet, 6452 offset + 0, 3, 3); 6453 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpSwitchToCpuReinstate, 6454 0, _FieldActionCopyToCpuSet, 6455 offset + 0, 3, 4); 6456 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionRpTimeStampToCpu, 6457 0, _FieldActionCopyToCpuSet, 6458 offset + 9, 8, -1, offset + 0, 3, 5); 6459 6460 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionYpCopyToCpu, 6461 0, _FieldActionCopyToCpuSet, 6462 offset + 9, 8, -1, offset + 3, 3, 1); 6463 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpCopyToCpuCancel, 6464 0, _FieldActionCopyToCpuSet, 6465 offset + 3, 3, 2); 6466 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpSwitchToCpuCancel, 6467 0, _FieldActionCopyToCpuSet, 6468 offset + 3, 3, 3); 6469 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpSwitchToCpuReinstate, 6470 0, _FieldActionCopyToCpuSet, 6471 offset + 3, 3, 4); 6472 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionYpTimeStampToCpu, 6473 0, _FieldActionCopyToCpuSet, 6474 offset + 9, 8, -1, offset + 3, 3, 5); 6475 6476 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionGpCopyToCpu, 6477 0, _FieldActionCopyToCpuSet, 6478 offset + 9, 8, -1, offset + 6, 3, 1); 6479 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpCopyToCpuCancel, 6480 0, _FieldActionCopyToCpuSet, 6481 offset + 6, 3, 2); 6482 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpSwitchToCpuCancel, 6483 0, _FieldActionCopyToCpuSet, 6484 offset + 6, 3, 3); 6485 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpSwitchToCpuReinstate, 6486 0, _FieldActionCopyToCpuSet, 6487 offset + 6, 3, 4); 6488 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionGpTimeStampToCpu, 6489 0, _FieldActionCopyToCpuSet, 6490 offset + 9, 8, -1, offset + 6, 3, 5); 6491 6492 /* IFP_CUT_THRU_OVERRIDE_SET(1b) */ 6493 offset = cutthrough_offset; 6494 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotCutThrough, 6495 0, _FieldActionCutThrOverrideSet, offset + 0, 1, 1); 6496 6497 /* IFP_URPF_OVERRIDE_SET(1b) */ 6498 offset = urpf_offset; 6499 6500 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotCheckUrpf, 6501 0, _FieldActionUrpfOverrideSet, offset + 0, 1, 1); 6502 6503 /* IFP_TTL_SET(1b) */ 6504 offset = ttl_offset; 6505 6506 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotChangeTtl, 6507 0, _FieldActionTtlOverrideSet, offset + 0, 1, 1); 6508 6509 /* IFP_PROFILE_SET_2(52b) */ 6510 offset = profile_two_offset; 6511 6512 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpEcnNew, 6513 0, offset + 0, 2, -1, offset + 6, 1, 1); 6514 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpEcnNew, 6515 0, offset + 2, 2, -1, offset + 7, 1, 1); 6516 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpEcnNew, 6517 0, offset + 4, 2, -1, offset + 8, 1, 1); 6518 6519 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDot1pPreserve, 6520 0, offset + 18, 3, 3); 6521 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktCopy, 6522 0, offset + 18, 3, 4); 6523 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpPrioPktNew, 6524 0, offset + 9, 3, -1, offset + 18, 3, 5); 6525 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktTos, 6526 0, offset + 18, 3, 6); 6527 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktCancel, 6528 0, offset + 18, 3, 7); 6529 6530 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDot1pPreserve, 6531 0, offset + 21, 3, 3); 6532 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktCopy, 6533 0, offset + 21, 3, 4); 6534 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpPrioPktNew, 6535 0, offset + 12, 3, -1, offset + 21, 3, 5); 6536 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktTos, 6537 0, offset + 21, 3, 6); 6538 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktCancel, 6539 0, offset + 21, 3, 7); 6540 6541 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDot1pPreserve, 6542 0, offset + 24, 3, 3); 6543 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktCopy, 6544 0, offset + 24, 3, 4); 6545 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpPrioPktNew, 6546 0, offset + 15, 3, -1, offset + 24, 3, 5); 6547 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktTos, 6548 0, offset + 24, 3, 6); 6549 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktCancel, 6550 0, offset + 24, 3, 7); 6551 6552 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpDscpNew, 6553 0, offset + 40, 6, -1, offset + 27, 2, 1); 6554 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDscpCancel, 6555 0, offset + 27, 2, 2); 6556 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDscpPreserve, 6557 0, offset + 27, 2, 3); 6558 6559 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpDscpNew, 6560 0, offset + 34, 6, -1, offset + 29, 2, 1); 6561 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDscpCancel, 6562 0, offset + 29, 2, 2); 6563 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDscpPreserve, 6564 0, offset + 29, 2, 3); 6565 6566 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpDscpNew, 6567 0, offset + 46, 6, -1, offset + 31, 3, 3); 6568 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDscpCancel, 6569 0, offset + 31, 3, 4); 6570 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDscpPreserve, 6571 0, offset + 31, 3, 5); 6572 6573 _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpTosPrecedenceNew, 6574 0, offset + 46, 6, -1, offset + 31, 3, 1); 6575 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpTosPrecedenceCopy, 6576 0, offset + 31, 3, 2); 6577 6578 /* IFP_L3SW_CHANGE_L2_SET(33b) */ 6579 offset = l3swl2change_offset; 6580 6581 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionDstMacNew, 6582 0, _FieldActionL3SwChangeL2Set, 6583 offset + 0, 16, -1, offset + 19, 4, 1); 6584 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionSrcMacNew, 6585 0, _FieldActionL3SwChangeL2Set, 6586 offset + 0, 16, -1, offset + 19, 4, 1); 6587 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionOuterVlanNew, 6588 0, _FieldActionL3SwChangeL2Set, 6589 offset + 0, 16, -1, offset + 19, 4, 1); 6590 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionVnTagNew, 6591 0, _FieldActionL3SwChangeL2Set, 6592 offset + 0, 16, -1, offset + 19, 4, 1); 6593 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionVnTagDelete, 6594 0, _FieldActionL3SwChangeL2Set, 6595 offset + 0, 16, -1, offset + 19, 4, 1); 6596 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEtagNew, 6597 0, _FieldActionL3SwChangeL2Set, 6598 offset + 0, 16, -1, offset + 19, 4, 1); 6599 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEtagDelete, 6600 0, _FieldActionL3SwChangeL2Set, 6601 offset + 0, 16, -1, offset + 19, 4, 1); 6602 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionChangeL2Fields, 6603 0, _FieldActionL3SwChangeL2Set, 6604 offset + 0, 16, -1, offset + 19, 4, 1); 6605 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionChangeL2FieldsCancel, 6606 0, _FieldActionL3SwChangeL2Set, 6607 offset + 19, 4, 2); 6608 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionFabricQueue, 0, 6609 _FieldActionL3SwChangeL2Set, 6610 offset + 0, 2, -1, offset + 2, 16, -1, offset + 19, 4, 3); 6611 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionAddClassTag, 6612 0, _FieldActionL3SwChangeL2Set, 6613 offset + 0, 16, -1, offset + 19, 4, 4); 6614 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionL3Switch, 6615 _BCM_FIELD_ACTION_L3SWITCH_NEXT_HOP, 6616 _FieldActionL3SwChangeL2Set, 6617 offset + 0, 16, -1, 6618 offset + 17, 1, 0, offset + 19, 4, 6); 6619 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionL3Switch, 6620 _BCM_FIELD_ACTION_L3SWITCH_ECMP, 6621 _FieldActionL3SwChangeL2Set, 6622 offset + 0, 12, -1, 6623 offset + 17, 1, 1, offset + 19, 4, 6); 6624 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMultipathHash, 6625 0, _FieldActionL3SwChangeL2Set, 6626 offset + 12, 3, -1, offset + 19, 4, 6); 6627 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionL3SwitchCancel, 6628 0, _FieldActionL3SwChangeL2Set, 6629 offset + 19, 4, 7); 6630 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressClassSelect, 6631 0, _FieldActionL3SwChangeL2Set, 6632 offset + 0, 4, -1, offset + 19, 4, 8); 6633 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionHiGigClassSelect, 6634 0, _FieldActionL3SwChangeL2Set, 6635 offset + 4, 3, -1, offset + 19, 4, 8); 6636 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionNewClassId, 6637 0, _FieldActionL3SwChangeL2Set, 6638 offset + 7, 9, -1, offset + 19, 4, 8); 6639 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionBFDSessionIdNew, 6640 0, _FieldActionL3SwChangeL2Set, 6641 offset + 0, 12, -1, offset + 19, 4, 9); 6642 6643 /* IFP_CHANGE_CPU_COS_SET(8b) */ 6644 offset = cpucos_offset; 6645 6646 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionCosQCpuNew, 6647 0, _FieldActionChangeCpuCosSet, 6648 offset + 0, 6, -1, offset + 6, 2, 1); 6649 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionServicePoolIdNew, 0, 6650 _FieldActionChangeCpuCosSet, 6651 offset + 2, 2, -1, 6652 offset + 4, 2, 2, 6653 offset + 6, 2, 2); 6654 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionServicePoolIdPrecedenceNew, 0, 6655 _FieldActionChangeCpuCosSet, 6656 offset + 2, 2, -1, 6657 offset + 0, 2, -1, 6658 offset + 4, 2, 3, 6659 offset + 6, 2, 2); 6660 6661 /* IFP_DROP_SET(6b) */ 6662 offset = drop_offset; 6663 6664 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpDrop, 6665 0, _FieldActionDropSet, offset + 0, 2, 1); 6666 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpDropCancel, 6667 0, _FieldActionDropSet, offset + 0, 2, 2); 6668 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpDrop, 6669 0, _FieldActionDropSet, offset + 2, 2, 1); 6670 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpDropCancel, 6671 0, _FieldActionDropSet, offset + 2, 2, 2); 6672 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpDrop, 6673 0, _FieldActionDropSet, offset + 4, 2, 1); 6674 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpDropCancel, 6675 0, _FieldActionDropSet, offset + 4, 2, 2); 6676 6677 /* IFP_MIRROR_OVERRIDE_SET(1b) */ 6678 offset = mirror_override_offset; 6679 6680 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionMirrorOverride, 6681 0, _FieldActionMirrorOverrideSet, offset + 0, 1, 1); 6682 6683 /* IFP_SFLOW_SET(1b) */ 6684 offset = sflow_offset; 6685 6686 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionIngSampleEnable, 6687 0, _FieldActionSflowSet, offset + 0, 1, 1); 6688 6689 /* IFP_INSTRUMENTATION_TRIGGERS_ENABLE_SET(1b)*/ 6690 offset = debug_offset; 6691 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionPacketTraceEnable, 6692 0, _FieldActionInstrumentationSet, offset + 0, 1, 1); 6693 6694 /* IFP_REDIRECT_SET(38b) */ 6695 offset = redirect_offset; 6696 6697 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirect, 6698 _BCM_FIELD_ACTION_REDIRECT_DGLP, 6699 _FieldActionRedirectSet, 6700 offset + 6, 16, -1, offset + 22 , 1, 0, 6701 offset + 3, 3, 0, offset + 0, 3, 1); 6702 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirect, 6703 _BCM_FIELD_ACTION_REDIRECT_DVP, 6704 _FieldActionRedirectSet, 6705 offset + 6, 14, -1, 6706 offset + 3, 3, 6, offset + 0, 3, 1); 6707 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirect, 6708 _BCM_FIELD_ACTION_REDIRECT_TRUNK, 6709 _FieldActionRedirectSet, 6710 offset + 6, 16, -1, offset + 22, 1, 1, 6711 offset + 3, 3, 0, offset + 0, 3, 1); 6712 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirectTrunk, 6713 _BCM_FIELD_ACTION_REDIRECT_TRUNK, 6714 _FieldActionRedirectSet, 6715 offset + 6, 16, -1, offset + 22, 1, 1, 6716 offset + 3, 3, 0, offset + 0, 3, 1); 6717 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectTrunk, 6718 _BCM_FIELD_ACTION_REDIRECT_DVP, 6719 _FieldActionRedirectSet, 6720 offset + 6, 14, -1, offset + 3, 3, 6, offset + 0, 3, 1); 6721 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, 6722 bcmFieldActionUnmodifiedPacketRedirectPort, 6723 _BCM_FIELD_ACTION_REDIRECT_DGLP, 6724 _FieldActionRedirectSet, 6725 offset + 6, 16, -1, offset + 22, 1, 0, 6726 offset + 3, 3, 1, offset + 0, 3, 1); 6727 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectEgrNextHop, 6728 _BCM_FIELD_ACTION_REDIRECT_NEXT_HOP, 6729 _FieldActionRedirectSet, 6730 offset + 6, 16, -1, offset + 3, 3, 2, offset + 0, 3, 1); 6731 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectEgrNextHop, 6732 _BCM_FIELD_ACTION_REDIRECT_ECMP, 6733 _FieldActionRedirectSet, 6734 offset + 6, 16, -1, offset + 3, 3, 3, offset + 0, 3, 1); 6735 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRedirectCancel, 6736 0, _FieldActionRedirectSet, 6737 offset + 0, 3, 2); 6738 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectPbmp, 0, 6739 _FieldActionRedirectSet, 6740 offset + 6, 10, -1, offset + 23, 2, 0, offset + 0, 3, 3); 6741 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectVlan, 0, 6742 _FieldActionRedirectSet, 6743 offset + 17, 1, 0, offset + 23, 2, 1, offset + 0, 3, 3); 6744 _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirectBcastPbmp, 0, 6745 _FieldActionRedirectSet, 6746 offset + 6, 10, -1, offset + 17, 1, 1, 6747 offset + 23, 2, 1, offset + 0, 3, 3); 6748 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectMcast, 0, 6749 _FieldActionRedirectSet, 6750 offset + 6, 14, -1, offset + 23, 2, 2, offset + 0, 3, 3); 6751 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectIpmc, 0, 6752 _FieldActionRedirectSet, 6753 offset + 6, 14, -1, offset + 23, 2, 3, offset + 0, 3, 3); 6754 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressMask, 0, 6755 _FieldActionRedirectSet, 6756 offset + 6, 10, -1, offset + 0, 3, 4); 6757 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressPortsAdd, 0, 6758 _FieldActionRedirectSet, 6759 offset + 6, 10, -1, offset + 0, 3, 5); 6760 _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionFabricEHAddOrUpdate, 0, 6761 _FieldActionRedirectSet, 6762 offset + 3, 32, -1, offset + 35, 3, -1, offset + 0, 3, 6); 6763 6764 /* IFP_NAT_SET(12b) */ 6765 offset = nat_offset; 6766 6767 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionNat, 6768 0, _FieldActionNatSet, offset + 11, 1, 1); 6769 _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionNatEgressOverride, 6770 0, _FieldActionNatSet, 6771 offset + 0, 10, -1, offset + 10, 1, -1); 6772 /* ExactMatch Action Class Id (12b) */ 6773 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionExactMatchClassId, 6774 _BCM_FIELD_ACTION_NO_IFP_SUPPORT, 0, 12, 0); 6775 6776 /* TIMESTAMP_SET(4b) */ 6777 offset = timestamp_offset; 6778 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionIngressTimeStampInsert, 6779 0, _FieldActionTimestampInsertionSet, 6780 offset + 0, 2, 1); 6781 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionIngressTimeStampInsertCancel, 6782 0, _FieldActionTimestampInsertionSet, 6783 offset + 0, 2, 2); 6784 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionEgressTimeStampInsert, 6785 0, _FieldActionTimestampInsertionSet, 6786 offset + 2, 2, 1); 6787 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionEgressTimeStampInsertCancel, 6788 0, _FieldActionTimestampInsertionSet, 6789 offset + 2, 2, 2); 6790 /* DLB_HGT_LAG_SET(2b) */ 6791 offset = dlb_hgt_lag_offset; 6792 if (soc_feature(unit, soc_feature_lag_dlb)) { 6793 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicTrunkEnable, 6794 0, _FieldActionHgtLagDlbActionSet, offset + 0, 1, 1); 6795 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicTrunkCancel, 6796 0, _FieldActionHgtLagDlbActionSet, offset + 1, 1, 1); 6797 } 6798 if (soc_feature(unit, soc_feature_hg_dlb)) { 6799 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicHgTrunkEnable, 6800 0, _FieldActionHgtLagDlbActionSet, offset + 0, 1, 1); 6801 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicHgTrunkCancel, 6802 0, _FieldActionHgtLagDlbActionSet, offset + 1, 1, 1); 6803 } 6804 6805 #if defined(INCLUDE_L3) 6806 /* PROTECTION_SWITCHING_SET(1b) */ 6807 offset = prot_switch_offset; 6808 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRecoverableDropCancel, 6809 0, _FieldActionProtectionSwitchingDropOverrideSet, 6810 offset + 0, 1, 1); 6811 6812 /* DLB_ECMP_SET(2b) */ 6813 offset = dlb_ecmp_offset; 6814 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicEcmpEnable, 6815 0, _FieldActionEcmpDlbActionSet, offset + 0, 1, 1); 6816 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicEcmpCancel, 6817 0, _FieldActionEcmpDlbActionSet, offset + 1, 1, 1); 6818 6819 /* DLB_ALTERNATE_PATH_CONTROL_SET(10b) */ 6820 offset = dlb_alternate_path_control_offset; 6821 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDgm, 6822 0, _FieldActionIfpDlbAlternatePathControlSet, 6823 offset + 0, 1, 1); 6824 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDgmThreshold, 6825 0, _FieldActionIfpDlbAlternatePathControlSet, 6826 offset + 7, 3, -1); 6827 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDgmBias, 6828 0, _FieldActionIfpDlbAlternatePathControlSet, 6829 offset + 4, 3, -1); 6830 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDgmCost, 6831 0, _FieldActionIfpDlbAlternatePathControlSet, 6832 offset + 1, 3, -1); 6833 #endif /* INCLUDE_L3 */ 6834 /* All actions which have corresponding Colored(Gp/Yp/Rp) Actions needs to be 6835 * initialized with some default configuration(offset = 0, width = 0, value = 0). 6836 */ 6837 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionCosQNew, 0, 0, 0, 0); 6838 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntCopy, 0, 0, 0, 0); 6839 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntNew, 0, 0, 0, 0); 6840 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntTos, 0, 0, 0, 0); 6841 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntCancel, 0, 0, 0, 0); 6842 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionUcastCosQNew, 0, 0, 0, 0); 6843 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionMcastCosQNew, 0, 0, 0, 0); 6844 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDropPrecedence, 0, 0, 0, 0); 6845 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionColorIndependent, 6846 0, _FieldActionGreenToPidSet, 0, 0, 0); 6847 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionEcnNew, 0, 0, 0, 0); 6848 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktCopy, 0, 0, 0, 0); 6849 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktNew, 0, 0, 0, 0); 6850 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktTos, 0, 0, 0, 0); 6851 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktCancel, 0, 0, 0, 0); 6852 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpNew, 0, 0, 0, 0); 6853 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpCancel, 0, 0, 0, 0); 6854 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionCopyToCpu, 6855 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6856 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionCopyToCpuCancel, 6857 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6858 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionSwitchToCpuCancel, 6859 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6860 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionSwitchToCpuReinstate, 6861 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6862 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionTimeStampToCpu, 6863 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6864 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionTimeStampToCpuCancel, 6865 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6866 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpTimeStampToCpuCancel, 6867 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6868 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpTimeStampToCpuCancel, 6869 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6870 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpTimeStampToCpuCancel, 6871 0, _FieldActionCopyToCpuSet, 0, 0, 0); 6872 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDrop, 6873 0, _FieldActionDropSet, 0, 0, 0); 6874 _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDropCancel, 6875 0, _FieldActionDropSet, 0, 0, 0); 6876 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntCopy, 0, 0, 0, 0); 6877 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntNew, 0, 0, 0, 0); 6878 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntTos, 0, 0, 0, 0); 6879 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntCancel, 0, 0, 0, 0); 6880 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntCopy, 0, 0, 0, 0); 6881 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntNew, 0, 0, 0, 0); 6882 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntTos, 0, 0, 0, 0); 6883 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntCancel, 0, 0, 0, 0); 6884 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntCopy, 0, 0, 0, 0); 6885 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntNew, 0, 0, 0, 0); 6886 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntTos, 0, 0, 0, 0); 6887 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntCancel, 0, 0, 0, 0); 6888 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntCopy, 0, 0, 0, 0); 6889 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntNew, 0, 0, 0, 0); 6890 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntTos, 0, 0, 0, 0); 6891 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntCancel, 0, 0, 0, 0); 6892 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionCosMapNew, 0, 0, 0, 0); 6893 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpPreserve, 0, 0, 0, 0); 6894 _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDot1pPreserve, 0, 0, 0, 0); 6895 6896 return BCM_E_NONE; 6897 } 6898 #endif /*BCM_TOMAHAWK2_SUPPORT*/ 6899 6900 6901 /* 6902 * Function: 6903 * _field_th_actionss_init 6904 * Purpose: 6905 * Initialize device actions offsets, widths and encodings. 6906 * Parameters: 6907 * unit - (IN) BCM device number. 6908 * stage_fc - (IN) Field Processor stage control structure. 6909 * 6910 * Returns: 6911 * BCM_E_NONE 6912 * Notes: 6913 */ 6914 STATIC int 6915 _field_th_actions_init(int unit, _field_stage_t *stage_fc) 6916 { 6917 switch (stage_fc->stage_id) { 6918 case _BCM_FIELD_STAGE_INGRESS: 6919 case _BCM_FIELD_STAGE_EXACTMATCH: 6920 /* Allocated stage qualifiers configuration array. */ 6921 _FP_XGS3_ALLOC(stage_fc->f_action_arr, 6922 (_bcmFieldActionCount * sizeof(_bcm_field_action_conf_t *)), 6923 "Field Actions"); 6924 if (NULL == stage_fc->f_action_arr) { 6925 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META( 6926 "TH Actions INIT Memory Resource Error\n"))); 6927 return (BCM_E_MEMORY); 6928 } 6929 #if defined(BCM_TRIDENT3_SUPPORT) 6930 if(soc_feature(unit, soc_feature_ifp_action_profiling)) { 6931 return (_field_td3_common_actions_init(unit, stage_fc)); 6932 } else 6933 #endif 6934 #ifdef BCM_TOMAHAWK2_SUPPORT 6935 if (SOC_IS_TOMAHAWK2(unit)) { 6936 return (_field_th2_common_actions_init(unit, stage_fc)); 6937 } else 6938 #endif 6939 #if defined(BCM_TOMAHAWK3_SUPPORT) 6940 if (SOC_IS_TOMAHAWK3(unit)) { 6941 return _bcm_field_th3_common_actions_init(unit, stage_fc); 6942 } else 6943 #endif /* BCM_TOMAHAWK3_SUPPORT */ 6944 { 6945 return (_field_th_common_actions_init(unit, stage_fc)); 6946 } 6947 break; 6948 default: 6949 break; 6950 } 6951 6952 return (BCM_E_NONE); 6953 } 6954 6955 /* 6956 * Function: 6957 * _field_th_lookup_qualifiers_init 6958 * Purpose: 6959 * Initialize device stage lookup qaualifiers 6960 * select codes & offsets 6961 * Parameters: 6962 * unit - (IN) BCM device number. 6963 * stage_fc - (IN) Field Processor stage control structure. 6964 * Returns: 6965 * BCM_E_NONE 6966 */ 6967 STATIC int 6968 _field_th_lookup_qualifiers_init(int unit, _field_stage_t *stage_fc) 6969 { 6970 uint32 cancun_ver; 6971 const unsigned f1_offset = 164, f2_offset = 36, f3_offset = 0; 6972 _FP_QUAL_DECL; 6973 6974 /* Input parameters check. */ 6975 if (NULL == stage_fc) { 6976 return (BCM_E_PARAM); 6977 } 6978 6979 /* Allocated stage qualifiers configuration array. */ 6980 _FP_XGS3_ALLOC(stage_fc->f_qual_arr, 6981 (_bcmFieldQualifyCount * sizeof(_bcm_field_qual_info_t *)), 6982 "Field qualifiers"); 6983 if (NULL == stage_fc->f_qual_arr) { 6984 return (BCM_E_MEMORY); 6985 } 6986 6987 /* Enable the overlay of Sender Ethernet Address onto MACSA 6988 * on ARP/RARP packets. 6989 */ 6990 BCM_IF_ERROR_RETURN 6991 (soc_reg_field32_modify(unit, ING_CONFIG_64r, REG_PORT_ANY, 6992 ARP_VALIDATION_ENf, 1)); 6993 6994 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyStageLookup, 6995 _bcmFieldSliceSelDisable, 0, 0, 0); 6996 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIp4, 6997 _bcmFieldSliceSelDisable, 0, 0, 0); 6998 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIp6, 6999 _bcmFieldSliceSelDisable, 0, 0, 0); 7000 7001 /* FPF1 */ 7002 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 7003 bcmFieldQualifyInnerIpProtocolCommon, 7004 _bcmFieldSliceSelFpf1, 0, 7005 _bcmFieldSliceIpHeaderSelect, 1, f1_offset, 3); 7006 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocolCommon, 7007 _bcmFieldSliceSelFpf1, 0, 7008 _bcmFieldSliceIpHeaderSelect, 0, f1_offset, 3); 7009 if (!soc_feature(unit, soc_feature_td3_style_fp)) { 7010 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTunnelTerminated, 7011 _bcmFieldSliceSelFpf1, 0, f1_offset + 3, 1); 7012 } 7013 /* 1-bit IpInfo is used to qualify on BCM_FIELD_IP_CHECKSUM_OK */ 7014 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpInfo, 7015 _bcmFieldSliceSelFpf1, 0, f1_offset + 4, 1); 7016 7017 if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) { 7018 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerTpid, 7019 _bcmFieldSliceSelFpf1, 0, f1_offset + 5, 2); 7020 } 7021 7022 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterTpid, 7023 _bcmFieldSliceSelFpf1, 0, f1_offset + 7, 2); 7024 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL2Format, 7025 _bcmFieldSliceSelFpf1, 0, f1_offset + 9, 2); 7026 7027 if (soc_feature(unit, soc_feature_higig_lookup)) { 7028 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy, 7029 _bcmFieldSliceSelFpf1, 0, f1_offset + 11, 1); 7030 } 7031 7032 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig, 7033 _bcmFieldSliceSelFpf1, 0, f1_offset + 12, 1); 7034 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlan, 7035 _bcmFieldSliceSelFpf1, 0, f1_offset + 13, 16); 7036 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanId, 7037 _bcmFieldSliceSelFpf1, 0, f1_offset + 13, 12); 7038 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanCfi, 7039 _bcmFieldSliceSelFpf1, 0, f1_offset + 25, 1); 7040 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanPri, 7041 _bcmFieldSliceSelFpf1, 0, f1_offset + 26, 3); 7042 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVlanFormat, 7043 _bcmFieldSliceSelFpf1, 0, f1_offset + 29, 2); 7044 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpType, 7045 _bcmFieldSliceSelFpf1, 0, 7046 _bcmFieldSliceIpHeaderSelect, 1, f1_offset + 31, 7047 5); 7048 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpType, 7049 _bcmFieldSliceSelFpf1, 0, 7050 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 31, 7051 5); 7052 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcPort, 7053 _bcmFieldDevSelDisable, 0, 7054 _bcmFieldSliceSelFpf1, 0, 7055 _bcmFieldSliceSrcEntitySelect, _bcmFieldFwdEntityGlp, 7056 0, 7057 f1_offset + 36, 8, /* Port value in SGLP */ 7058 f1_offset + 44, 8, /* Module value in SGLP */ 7059 f1_offset + 52, 1, /* Trunk bit in SGLP (should be 0) */ 7060 0 7061 ); 7062 7063 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcTrunk, 7064 _bcmFieldDevSelDisable, 0, 7065 _bcmFieldSliceSelFpf1, 0, 7066 _bcmFieldSliceSrcEntitySelect, _bcmFieldFwdEntityGlp, 7067 0, 7068 f1_offset + 36, 16, /* trunk id field of SGLP */ 7069 f1_offset + 52, 1, /* trunk bit of SGLP */ 7070 0, 0, 7071 0 7072 ); 7073 7074 if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) { 7075 7076 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcMplsGport, 7077 _bcmFieldDevSelDisable, 0, 7078 _bcmFieldSliceSelFpf1, 0, 7079 _bcmFieldSliceSrcEntitySelect, _bcmFieldFwdEntityMplsGport, 7080 0, 7081 f1_offset + 36, 17, /* S_FIELD */ 7082 f1_offset + 56, 1, /* SVP_VALID */ 7083 0, 0, 7084 0 7085 ); 7086 7087 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcMimGport, 7088 _bcmFieldDevSelDisable, 0, 7089 _bcmFieldSliceSelFpf1, 0, 7090 _bcmFieldSliceSrcEntitySelect, _bcmFieldFwdEntityMimGport, 7091 0, 7092 f1_offset + 36, 17, /* S_FIELD */ 7093 f1_offset + 56, 1, /* SVP_VALID */ 7094 0, 0, 7095 0 7096 ); 7097 7098 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcVxlanGport, 7099 _bcmFieldDevSelDisable, 0, 7100 _bcmFieldSliceSelFpf1, 0, 7101 _bcmFieldSliceSrcEntitySelect, 7102 _bcmFieldFwdEntityVxlanGport, 7103 0, 7104 f1_offset + 36, 17, /* S_FIELD */ 7105 f1_offset + 56, 1, /* SVP_VALID */ 7106 0, 0, 7107 0 7108 ); 7109 } 7110 7111 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcModPortGport, 7112 _bcmFieldDevSelDisable, 0, 7113 _bcmFieldSliceSelFpf1, 0, 7114 _bcmFieldSliceSrcEntitySelect, 7115 _bcmFieldFwdEntityModPortGport, 7116 0, 7117 f1_offset + 36, 16, /* mod + port field of unresolved SGLP */ 7118 0, 0, 7119 0, 0, 7120 0 7121 ); 7122 7123 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcModuleGport, 7124 _bcmFieldDevSelDisable, 0, 7125 _bcmFieldSliceSelFpf1, 0, 7126 _bcmFieldSliceSrcEntitySelect, 7127 _bcmFieldFwdEntityModPortGport, 7128 0, 7129 f1_offset + 36 + 8, 8, /* mod field of unresolved SGLP */ 7130 0, 0, 7131 0, 0, 7132 0 7133 ); 7134 7135 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyInPort, 7136 _bcmFieldDevSelDisable, 0, 7137 _bcmFieldSliceSelFpf1, 0, 7138 _bcmFieldSliceSrcEntitySelect, 7139 _bcmFieldFwdEntityPortGroupNum, 7140 0, 7141 f1_offset + 36, 8, /* ingress port field */ 7142 0, 0, 7143 0, 0, 7144 0 7145 ); 7146 7147 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort, 7148 _bcmFieldDevSelDisable, 0, 7149 _bcmFieldSliceSelFpf1, 0, 7150 _bcmFieldSliceSrcEntitySelect, 7151 _bcmFieldFwdEntityPortGroupNum, 7152 0, 7153 f1_offset + 36 + 8, 8, /* ingress port group field */ 7154 0, 0, 7155 0, 0, 7156 0 7157 ); 7158 7159 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4Ports, 7160 _bcmFieldSliceSelFpf1, 0, f1_offset + 57, 1); 7161 7162 #if defined (BCM_TOMAHAWK3_SUPPORT) 7163 if (soc_feature(unit, soc_feature_th3_style_fp)) { 7164 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOpaqueTagType, 7165 _bcmFieldSliceSelFpf1, 0, f1_offset + 58, 2); 7166 } 7167 #endif 7168 7169 /* F2_0 */ 7170 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerTtl, 7171 _bcmFieldSliceSelFpf2, 0, 7172 _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 8); 7173 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyTtl, 7174 _bcmFieldSliceSelFpf2, 0, 7175 _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 8); 7176 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTcpControl, 7177 _bcmFieldSliceSelFpf2, 0, f2_offset + 8, 6); 7178 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpFrag, 7179 _bcmFieldSliceSelFpf2, 0, 7180 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 14, 7181 2); 7182 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpFrag, 7183 _bcmFieldSliceSelFpf2, 0, 7184 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 14, 7185 2); 7186 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerTos, 7187 _bcmFieldSliceSelFpf2, 0, 7188 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 16, 7189 8); 7190 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyTos, 7191 _bcmFieldSliceSelFpf2, 0, 7192 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 16, 7193 8); 7194 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerL4DstPort, 7195 _bcmFieldSliceSelFpf2, 0, 7196 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 24, 7197 16); 7198 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyL4DstPort, 7199 _bcmFieldSliceSelFpf2, 0, 7200 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 24, 7201 16); 7202 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerL4SrcPort, 7203 _bcmFieldSliceSelFpf2, 0, 7204 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 40, 7205 16); 7206 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyL4SrcPort, 7207 _bcmFieldSliceSelFpf2, 0, 7208 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 40, 7209 16); 7210 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIcmpTypeCode, 7211 _bcmFieldSliceSelFpf2, 0, 7212 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 40, 7213 16); 7214 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol, 7215 _bcmFieldSliceSelFpf2, 0, 7216 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 56, 7217 8); 7218 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol, 7219 _bcmFieldSliceSelFpf2, 0, 7220 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 56, 7221 8); 7222 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp, 7223 _bcmFieldSliceSelFpf2, 0, 7224 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 64, 7225 32); 7226 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp, 7227 _bcmFieldSliceSelFpf2, 0, 7228 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 64, 7229 32); 7230 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp, 7231 _bcmFieldSliceSelFpf2, 0, 7232 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 96, 7233 32); 7234 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp, 7235 _bcmFieldSliceSelFpf2, 0, 7236 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 96, 7237 32); 7238 7239 /* F2_1 */ 7240 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp6, 7241 _bcmFieldSliceSelFpf2, 1, 7242 _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 128); 7243 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp6, 7244 _bcmFieldSliceSelFpf2, 1, 7245 _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 128); 7246 7247 /* F2_2 */ 7248 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp6, 7249 _bcmFieldSliceSelFpf2, 2, 7250 _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 128); 7251 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp6, 7252 _bcmFieldSliceSelFpf2, 2, 7253 _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 128); 7254 7255 /* F2_3 */ 7256 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyEtherType, 7257 _bcmFieldSliceSelFpf2, 3, f2_offset + 16, 16); 7258 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcMac, 7259 _bcmFieldSliceSelFpf2, 3, f2_offset + 32, 48); 7260 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstMac, 7261 _bcmFieldSliceSelFpf2, 3, f2_offset + 80, 48); 7262 7263 /* F2_4 */ 7264 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerTos, 7265 _bcmFieldSliceSelFpf2, 4, 7266 _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 8); 7267 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyTos, 7268 _bcmFieldSliceSelFpf2, 4, 7269 _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 8); 7270 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol, 7271 _bcmFieldSliceSelFpf2, 4, 7272 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 8, 7273 8); 7274 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol, 7275 _bcmFieldSliceSelFpf2, 4, 7276 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 8, 7277 8); 7278 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp, 7279 _bcmFieldSliceSelFpf2, 4, 7280 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 16, 7281 32); 7282 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp, 7283 _bcmFieldSliceSelFpf2, 4, 7284 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 16, 7285 32); 7286 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp, 7287 _bcmFieldSliceSelFpf2, 4, 7288 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 48, 7289 32); 7290 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp, 7291 _bcmFieldSliceSelFpf2, 4, 7292 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 48, 7293 32); 7294 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcMac, 7295 _bcmFieldSliceSelFpf2, 4, f2_offset + 80, 48); 7296 7297 /* F2_5 */ 7298 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerTos, 7299 _bcmFieldSliceSelFpf2, 5, 7300 _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 8); 7301 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyTos, 7302 _bcmFieldSliceSelFpf2, 5, 7303 _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 8); 7304 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol, 7305 _bcmFieldSliceSelFpf2, 5, 7306 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 8, 7307 8); 7308 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol, 7309 _bcmFieldSliceSelFpf2, 5, 7310 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 8, 7311 8); 7312 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp, 7313 _bcmFieldSliceSelFpf2, 5, 7314 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 16, 7315 32); 7316 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp, 7317 _bcmFieldSliceSelFpf2, 5, 7318 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 16, 7319 32); 7320 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp, 7321 _bcmFieldSliceSelFpf2, 5, 7322 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 48, 7323 32); 7324 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp, 7325 _bcmFieldSliceSelFpf2, 5, 7326 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 48, 7327 32); 7328 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstMac, 7329 _bcmFieldSliceSelFpf2, 5, f2_offset + 80, 48); 7330 7331 /* F2_6 */ 7332 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp6High, 7333 _bcmFieldSliceSelFpf2, 6, 7334 _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 64); 7335 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp6High, 7336 _bcmFieldSliceSelFpf2, 6, 7337 _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 64); 7338 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp6High, 7339 _bcmFieldSliceSelFpf2, 6, 7340 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 64, 7341 64); 7342 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp6High, 7343 _bcmFieldSliceSelFpf2, 6, 7344 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 64, 7345 64); 7346 7347 /* F2_7 */ 7348 7349 if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) { 7350 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVnTag, 7351 _bcmFieldSliceSelFpf2, 7, f2_offset + 0, 33); 7352 } 7353 if (soc_feature(unit, soc_feature_niv)) { 7354 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVnTag, 7355 _bcmFieldSliceSelFpf2, 7, f2_offset + 0, 33); 7356 } 7357 if (soc_feature(unit, soc_feature_snap)) { 7358 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySnap, 7359 _bcmFieldSliceSelFpf2, 7, f2_offset + 64, 40); 7360 } 7361 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLlc, 7362 _bcmFieldSliceSelFpf2, 7, f2_offset + 104, 24); 7363 7364 /* F2_8 */ 7365 if (soc_feature(unit, soc_feature_td3_style_fp)) { 7366 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData0, 7367 _bcmFieldSliceSelFpf2, 8, f2_offset + 0, 16); 7368 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData1, 7369 _bcmFieldSliceSelFpf2, 8, f2_offset + 16, 16); 7370 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData2, 7371 _bcmFieldSliceSelFpf2, 8, f2_offset + 32, 16); 7372 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData3, 7373 _bcmFieldSliceSelFpf2, 8, f2_offset + 48, 16); 7374 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData4, 7375 _bcmFieldSliceSelFpf2, 8, f2_offset + 64, 16); 7376 /* IP header Identifier field is mapped to UDF Chunk 4. */ 7377 BCM_IF_ERROR_RETURN(soc_cancun_version_get(unit, &cancun_ver)); 7378 if (SOC_CANCUN_VERSION_5_2_UNDER_SERIES(cancun_ver)) { 7379 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpIdentifier, 7380 _bcmFieldSliceSelFpf2, 8, f2_offset + 64, 16); 7381 } 7382 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData5, 7383 _bcmFieldSliceSelFpf2, 8, f2_offset + 80, 16); 7384 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData6, 7385 _bcmFieldSliceSelFpf2, 8, f2_offset + 96, 16); 7386 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData7, 7387 _bcmFieldSliceSelFpf2, 8, f2_offset + 112, 16); 7388 /* UDF2 Chunk 6 and 7 */ 7389 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyINTProbeMarker1, 7390 _bcmFieldSliceSelFpf2, 9, f2_offset + 96, 32); 7391 /* UDF2 Chunk 4 and 5 */ 7392 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyINTProbeMarker2, 7393 _bcmFieldSliceSelFpf2, 9, f2_offset + 64, 32); 7394 /* UDF2 Chunk 2 and 3 */ 7395 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyINTReserved4Bytes, 7396 _bcmFieldSliceSelFpf2, 8, f2_offset + 32, 32); 7397 #if defined(BCM_TOMAHAWK3_SUPPORT) 7398 } else if (soc_feature(unit, soc_feature_udf_selector_support)) { 7399 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData7, 7400 _bcmFieldSliceSelFpf2, 8, f2_offset + 0, 16); 7401 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData6, 7402 _bcmFieldSliceSelFpf2, 8, f2_offset + 16, 16); 7403 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData5, 7404 _bcmFieldSliceSelFpf2, 8, f2_offset + 32, 16); 7405 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData4, 7406 _bcmFieldSliceSelFpf2, 8, f2_offset + 48, 16); 7407 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData3, 7408 _bcmFieldSliceSelFpf2, 8, f2_offset + 64, 16); 7409 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData2, 7410 _bcmFieldSliceSelFpf2, 8, f2_offset + 80, 16); 7411 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData1, 7412 _bcmFieldSliceSelFpf2, 8, f2_offset + 96, 16); 7413 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData0, 7414 _bcmFieldSliceSelFpf2, 8, f2_offset + 112, 16); 7415 #endif 7416 } else { 7417 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData4, 7418 _bcmFieldSliceSelFpf2, 8, f2_offset + 0, 32); 7419 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData3, 7420 _bcmFieldSliceSelFpf2, 8, f2_offset + 32, 32); 7421 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData2, 7422 _bcmFieldSliceSelFpf2, 8, f2_offset + 64, 32); 7423 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData1, 7424 _bcmFieldSliceSelFpf2, 8, f2_offset + 96, 16); 7425 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData0, 7426 _bcmFieldSliceSelFpf2, 8, f2_offset + 112, 16); 7427 } 7428 7429 /* F2_9 */ 7430 if (soc_feature(unit, soc_feature_td3_style_fp)) { 7431 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData8, 7432 _bcmFieldSliceSelFpf2, 9, f2_offset + 0, 16); 7433 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData9, 7434 _bcmFieldSliceSelFpf2, 9, f2_offset + 16, 16); 7435 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData10, 7436 _bcmFieldSliceSelFpf2, 9, f2_offset + 32, 16); 7437 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData11, 7438 _bcmFieldSliceSelFpf2, 9, f2_offset + 48, 16); 7439 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData12, 7440 _bcmFieldSliceSelFpf2, 9, f2_offset + 64, 16); 7441 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData13, 7442 _bcmFieldSliceSelFpf2, 9, f2_offset + 80, 16); 7443 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData14, 7444 _bcmFieldSliceSelFpf2, 9, f2_offset + 96, 16); 7445 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData15, 7446 _bcmFieldSliceSelFpf2, 9, f2_offset + 112, 16); 7447 #if defined(BCM_TOMAHAWK3_SUPPORT) 7448 } else if (soc_feature(unit, soc_feature_udf_selector_support)) { 7449 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData15, 7450 _bcmFieldSliceSelFpf2, 9, f2_offset + 0, 16); 7451 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData14, 7452 _bcmFieldSliceSelFpf2, 9, f2_offset + 16, 16); 7453 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData13, 7454 _bcmFieldSliceSelFpf2, 9, f2_offset + 32, 16); 7455 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData12, 7456 _bcmFieldSliceSelFpf2, 9, f2_offset + 48, 16); 7457 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData11, 7458 _bcmFieldSliceSelFpf2, 9, f2_offset + 64, 16); 7459 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData10, 7460 _bcmFieldSliceSelFpf2, 9, f2_offset + 80, 16); 7461 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData9, 7462 _bcmFieldSliceSelFpf2, 9, f2_offset + 96, 16); 7463 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData8, 7464 _bcmFieldSliceSelFpf2, 9, f2_offset + 112, 16); 7465 #endif 7466 } else { 7467 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData9, 7468 _bcmFieldSliceSelFpf2, 9, f2_offset, 32); 7469 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData8, 7470 _bcmFieldSliceSelFpf2, 9, f2_offset + 32, 32); 7471 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData7, 7472 _bcmFieldSliceSelFpf2, 9, f2_offset + 64, 32); 7473 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData6, 7474 _bcmFieldSliceSelFpf2, 9, f2_offset + 96, 16); 7475 _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData5, 7476 _bcmFieldSliceSelFpf2, 9, f2_offset + 112, 16); 7477 } 7478 7479 /* F2_10 */ 7480 7481 if (soc_feature(unit, soc_feature_fcoe)) { 7482 7483 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanInner, 7484 _bcmFieldSliceSelFpf2, 10, f2_offset + 0, 3); 7485 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanOuter, 7486 _bcmFieldSliceSelFpf2, 10, f2_offset + 3, 3); 7487 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFcoeSOF, 7488 _bcmFieldSliceSelFpf2, 10, f2_offset + 6, 8); 7489 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanDFCtl, 7490 _bcmFieldSliceSelFpf2, 10, f2_offset + 14, 8); 7491 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanCSCtl, 7492 _bcmFieldSliceSelFpf2, 10, f2_offset + 22, 8); 7493 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanFCtl, 7494 _bcmFieldSliceSelFpf2, 10, f2_offset + 30, 24); 7495 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanType, 7496 _bcmFieldSliceSelFpf2, 10, f2_offset + 54, 8); 7497 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanDstId, 7498 _bcmFieldSliceSelFpf2, 10, f2_offset + 62, 24); 7499 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanSrcId, 7500 _bcmFieldSliceSelFpf2, 10, f2_offset + 86, 24); 7501 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanRCtl, 7502 _bcmFieldSliceSelFpf2, 10, f2_offset + 110, 8); 7503 } 7504 /* F3_0 */ 7505 7506 if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) { 7507 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlan, 7508 _bcmFieldSliceSelFpf3, 0, f3_offset + 0, 16); 7509 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId, 7510 _bcmFieldSliceSelFpf3, 0, f3_offset + 0, 12); 7511 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanCfi, 7512 _bcmFieldSliceSelFpf3, 0, f3_offset + 12, 1); 7513 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanPri, 7514 _bcmFieldSliceSelFpf3, 0, f3_offset + 13, 3); 7515 } 7516 7517 #if defined (BCM_TOMAHAWK3_SUPPORT) 7518 if (SOC_IS_TOMAHAWK3(unit)) { 7519 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyEtherType, 7520 _bcmFieldSliceSelFpf3, 0, f3_offset + 0, 16); 7521 } else 7522 #endif 7523 { 7524 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyEtherType, 7525 _bcmFieldSliceSelFpf3, 0, f3_offset + 16, 16); 7526 } 7527 7528 /* F3_1 */ 7529 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerL4DstPort, 7530 _bcmFieldSliceSelFpf3, 1, 7531 _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 0, 7532 16); 7533 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyL4DstPort, 7534 _bcmFieldSliceSelFpf3, 1, 7535 _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 0, 7536 16); 7537 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerL4SrcPort, 7538 _bcmFieldSliceSelFpf3, 1, 7539 _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 16, 7540 16); 7541 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyL4SrcPort, 7542 _bcmFieldSliceSelFpf3, 1, 7543 _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 16, 7544 16); 7545 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIcmpTypeCode, 7546 _bcmFieldSliceSelFpf3, 1, 7547 _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 16, 7548 16); 7549 7550 /* F3_2 */ 7551 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerTos, 7552 _bcmFieldSliceSelFpf3, 2, 7553 _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 0, 7554 8); 7555 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyTos, 7556 _bcmFieldSliceSelFpf3, 2, 7557 _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 0, 7558 8); 7559 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol, 7560 _bcmFieldSliceSelFpf3, 2, 7561 _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 8, 7562 8); 7563 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol, 7564 _bcmFieldSliceSelFpf3, 2, 7565 _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 8, 7566 8); 7567 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyExtensionHeaderSubCode, 7568 _bcmFieldSliceSelFpf3, 2, f3_offset + 16, 8); 7569 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyExtensionHeaderType, 7570 _bcmFieldSliceSelFpf3, 2, f3_offset + 24, 8); 7571 7572 7573 /* F3_3 */ 7574 #ifdef BCM_TRIDENT3_SUPPORT 7575 if (soc_feature(unit, soc_feature_td3_style_fp)) { 7576 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlan, 7577 _bcmFieldSliceSelFpf3, 3, f3_offset, 16); 7578 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId, 7579 _bcmFieldSliceSelFpf3, 3, f3_offset, 12); 7580 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanCfi, 7581 _bcmFieldSliceSelFpf3, 3, f3_offset + 12, 1); 7582 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanPri, 7583 _bcmFieldSliceSelFpf3, 3, f3_offset + 13, 3); 7584 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcModuleGport, 7585 _bcmFieldSliceSelFpf3, 3, f3_offset + 16, 8); 7586 } else 7587 #endif 7588 #ifdef BCM_TOMAHAWK2_SUPPORT 7589 if (SOC_IS_TOMAHAWK2(unit)) { 7590 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 7591 _bcmFieldSliceSelFpf3, 3, f3_offset + 0, 12); 7592 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlan, 7593 _bcmFieldSliceSelFpf3, 3, f3_offset + 12, 16); 7594 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId, 7595 _bcmFieldSliceSelFpf3, 3, f3_offset + 12, 12); 7596 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanCfi, 7597 _bcmFieldSliceSelFpf3, 3, f3_offset + 24, 1); 7598 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanPri, 7599 _bcmFieldSliceSelFpf3, 3, f3_offset + 25, 3); 7600 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcModuleGport, 7601 _bcmFieldSliceSelFpf3, 3, f3_offset + 28, 8); 7602 } else 7603 #endif /*BCM_TOMAHAWK2_SUPPORT*/ 7604 #ifdef BCM_TOMAHAWK3_SUPPORT 7605 if (SOC_IS_TOMAHAWK3(unit)) { 7606 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 7607 _bcmFieldSliceSelFpf3, 3, f3_offset + 0, 12); 7608 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcModuleGport, 7609 _bcmFieldSliceSelFpf3, 3, f3_offset + 28, 8); 7610 } else 7611 #endif /*BCM_TOMAHAWK3_SUPPORT*/ 7612 { 7613 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 7614 _bcmFieldSliceSelFpf3, 3, f3_offset + 0, 8); 7615 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlan, 7616 _bcmFieldSliceSelFpf3, 3, f3_offset + 8, 16); 7617 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId, 7618 _bcmFieldSliceSelFpf3, 3, f3_offset + 8, 12); 7619 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanCfi, 7620 _bcmFieldSliceSelFpf3, 3, f3_offset + 20, 1); 7621 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanPri, 7622 _bcmFieldSliceSelFpf3, 3, f3_offset + 21, 3); 7623 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcModuleGport, 7624 _bcmFieldSliceSelFpf3, 3, f3_offset + 24, 8); 7625 } 7626 7627 /* F3_4 ? */ 7628 7629 /* F3_5 */ 7630 if (soc_feature(unit, soc_feature_fcoe)) { 7631 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanVFTHopCount, 7632 _bcmFieldSliceSelFpf3, 5, f3_offset, 8); 7633 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanVFTVsanId, 7634 _bcmFieldSliceSelFpf3, 5, f3_offset + 8, 12); 7635 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanVFTVsanPri, 7636 _bcmFieldSliceSelFpf3, 5, f3_offset + 20, 3); 7637 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanVFTVersion, 7638 _bcmFieldSliceSelFpf3, 5, f3_offset + 23, 2); 7639 } 7640 7641 /* DWF3 */ 7642 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerTos, 7643 _bcmFieldSliceSelFpf3, 0, 7644 _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 0, 8); 7645 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTos, 7646 _bcmFieldSliceSelFpf3, 0, 7647 _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 0, 8); 7648 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerTtl, 7649 _bcmFieldSliceSelFpf3, 0, 7650 _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 8, 8); 7651 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTtl, 7652 _bcmFieldSliceSelFpf3, 0, 7653 _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 8, 8); 7654 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTcpControl, 7655 _bcmFieldSliceSelFpf3, 0, 7656 _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 16, 7657 6); 7658 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerIpFrag, 7659 _bcmFieldSliceSelFpf3, 0, 7660 _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 22, 7661 2); 7662 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyIpFrag, 7663 _bcmFieldSliceSelFpf3, 0, 7664 _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 22, 7665 2); 7666 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol, 7667 _bcmFieldSliceSelFpf3, 0, 7668 _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 24, 7669 8); 7670 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol, 7671 _bcmFieldSliceSelFpf3, 0, 7672 _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 24, 7673 8); 7674 7675 /* DWF2_0 */ 7676 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerTtl, 7677 _bcmFieldSliceSelFpf2, 0, 7678 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 0, 7679 8); 7680 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTtl, 7681 _bcmFieldSliceSelFpf2, 0, 7682 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 0, 7683 8); 7684 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTcpControl, 7685 _bcmFieldSliceSelFpf2, 0, 7686 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 8, 7687 6); 7688 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerIpFrag, 7689 _bcmFieldSliceSelFpf2, 0, 7690 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 14, 7691 2); 7692 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyIpFrag, 7693 _bcmFieldSliceSelFpf2, 0, 7694 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 14, 7695 2); 7696 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerTos, 7697 _bcmFieldSliceSelFpf2, 0, 7698 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 16, 7699 8); 7700 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTos, 7701 _bcmFieldSliceSelFpf2, 0, 7702 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 16, 7703 8); 7704 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerL4DstPort, 7705 _bcmFieldSliceSelFpf2, 0, 7706 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 24, 7707 16); 7708 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyL4DstPort, 7709 _bcmFieldSliceSelFpf2, 0, 7710 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 24, 7711 16); 7712 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerL4SrcPort, 7713 _bcmFieldSliceSelFpf2, 0, 7714 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 40, 7715 16); 7716 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyL4SrcPort, 7717 _bcmFieldSliceSelFpf2, 0, 7718 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 40, 7719 16); 7720 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyIcmpTypeCode, 7721 _bcmFieldSliceSelFpf2, 0, 7722 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 40, 7723 16); 7724 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol, 7725 _bcmFieldSliceSelFpf2, 0, 7726 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 56, 7727 8); 7728 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol, 7729 _bcmFieldSliceSelFpf2, 0, 7730 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 56, 7731 8); 7732 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp, 7733 _bcmFieldSliceSelFpf2, 0, 7734 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 64, 7735 32); 7736 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyDstIp, 7737 _bcmFieldSliceSelFpf2, 0, 7738 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 64, 7739 32); 7740 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp, 7741 _bcmFieldSliceSelFpf2, 0, 7742 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 96, 7743 32); 7744 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifySrcIp, 7745 _bcmFieldSliceSelFpf2, 0, 7746 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 96, 7747 32); 7748 7749 /* DWF2_1 */ 7750 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp6, 7751 _bcmFieldSliceSelFpf2, 1, 7752 _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 7753 128); 7754 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifySrcIp6, 7755 _bcmFieldSliceSelFpf2, 1, 7756 _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 7757 128); 7758 7759 if (!soc_feature(unit, soc_feature_td3_style_fp)) { 7760 /* DWF2_2 */ 7761 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, _bcmFieldQualifyData1, 7762 _bcmFieldSliceSelFpf2, 2, 7763 _bcmFieldSliceSelDisable, 0, 7764 f2_offset, 128); 7765 } 7766 7767 #if defined (BCM_TOMAHAWK3_SUPPORT) 7768 if (SOC_IS_TOMAHAWK3(unit)) { 7769 /* DWF2_3 */ 7770 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp6High, 7771 _bcmFieldSliceSelFpf2, 3, 7772 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 64, 7773 64); 7774 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyDstIp6High, 7775 _bcmFieldSliceSelFpf2, 3, 7776 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 64, 7777 64); 7778 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyDstMac, 7779 _bcmFieldSliceSelFpf2, 3, 7780 _bcmFieldSliceSelDisable, 0, 7781 f2_offset, 48); 7782 } 7783 #endif 7784 7785 /* DWF1 */ 7786 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, 7787 bcmFieldQualifyExtensionHeaderSubCode, 7788 _bcmFieldSliceSelFpf1, 0, 7789 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 0, 7790 8); 7791 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyExtensionHeaderType, 7792 _bcmFieldSliceSelFpf1, 0, 7793 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 8, 7794 8); 7795 #if defined (BCM_TOMAHAWK3_SUPPORT) 7796 if (soc_feature(unit, soc_feature_th3_style_fp)) { 7797 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 7798 _bcmFieldSliceSelFpf1, 0, 7799 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 16, 7800 12); 7801 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyEtherType, 7802 _bcmFieldSliceSelFpf1, 0, 7803 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 28, 7804 16); 7805 } else 7806 #endif 7807 #if defined (BCM_TRIDENT3_SUPPORT) 7808 if (soc_feature(unit, soc_feature_td3_style_fp)) { 7809 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyEtherType, 7810 _bcmFieldSliceSelFpf1, 0, 7811 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 16, 7812 16); 7813 } else 7814 #endif 7815 { 7816 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 7817 _bcmFieldSliceSelFpf1, 0, 7818 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 16, 7819 8); 7820 _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyEtherType, 7821 _bcmFieldSliceSelFpf1, 0, 7822 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 24, 7823 16); 7824 } 7825 7826 return (BCM_E_NONE); 7827 } 7828 7829 /* 7830 * Function: 7831 * _field_th_egress_qualifiers_init 7832 * Purpose: 7833 * Initialize device stage egress qaualifiers 7834 * select codes & offsets 7835 * Parameters: 7836 * unit - (IN) BCM device number. 7837 * stage_fc - (IN) Field Processor stage control structure. 7838 * 7839 * Returns: 7840 * BCM_E_NONE 7841 */ 7842 STATIC int 7843 _field_th_egress_qualifiers_init(int unit, _field_stage_t *stage_fc) 7844 { 7845 _FP_QUAL_DECL; 7846 _key_fld_ = KEYf; 7847 7848 /* Input parameters check. */ 7849 if (NULL == stage_fc) { 7850 return (BCM_E_PARAM); 7851 } 7852 7853 /* Allocated stage qualifiers configuration array. */ 7854 _FP_XGS3_ALLOC(stage_fc->f_qual_arr, 7855 (_bcmFieldQualifyCount * sizeof(_bcm_field_qual_info_t *)), 7856 "Field qualifiers"); 7857 if (NULL == stage_fc->f_qual_arr) { 7858 return (BCM_E_MEMORY); 7859 } 7860 7861 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyStageEgress, 7862 _bcmFieldSliceSelDisable, 0, 0, 0); 7863 7864 /* EFP_KEY4(L2 Key) Qualifiers */ 7865 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4Ports, 7866 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 0, 1); 7867 7868 7869 if (soc_feature(unit, soc_feature_fp_no_dvp_support)) { 7870 /* EG_NEXT_HOP_CLASS_ID */ 7871 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass, 7872 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7873 _bcmFieldSliceSelEgrClassKey4, 1, 7874 2, 12); 7875 /* EG_L3_INTF_CLASS_ID */ 7876 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 7877 bcmFieldQualifyEgressClassL3Interface, 7878 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7879 _bcmFieldSliceSelEgrClassKey4, 2, 7880 2, 12); 7881 } 7882 7883 if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) { 7884 /* EG_NEXT_HOP_CLASS_ID */ 7885 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass, 7886 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7887 _bcmFieldSliceSelEgrDvpKey4, 1, 7888 2, 12); 7889 /* EG_L3_INTF_CLASS_ID */ 7890 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 7891 bcmFieldQualifyEgressClassL3Interface, 7892 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7893 _bcmFieldSliceSelEgrDvpKey4, 2, 7894 2, 12); 7895 /* EG_DVP_CLASS_ID */ 7896 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill, 7897 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7898 _bcmFieldSliceSelEgrDvpKey4, 3, 7899 2, 12); 7900 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassWlan, 7901 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7902 _bcmFieldSliceSelEgrDvpKey4, 3, 7903 2, 12); 7904 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre, 7905 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7906 _bcmFieldSliceSelEgrDvpKey4, 3, 7907 2, 12); 7908 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan, 7909 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7910 _bcmFieldSliceSelEgrDvpKey4, 3, 7911 2, 12); 7912 7913 /* DVP_VALID + DVP + SPARE_DVP */ 7914 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMplsGport, 7915 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7916 _bcmFieldSliceSelEgrDvpKey4, 0, 7917 1, 17); 7918 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMimGport, 7919 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7920 _bcmFieldSliceSelEgrDvpKey4, 0, 7921 1, 17); 7922 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstVxlanGport, 7923 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7924 _bcmFieldSliceSelEgrDvpKey4, 0, 7925 1, 17); 7926 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 7927 bcmFieldQualifyDestVirtualPortValid, 7928 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7929 _bcmFieldSliceSelEgrDvpKey4, 0, 7930 1, 1); 7931 } 7932 7933 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntPriority, 7934 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 18, 4); 7935 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyColor, 7936 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 22, 2); 7937 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL2Format, 7938 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 24, 2); 7939 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyEtherType, 7940 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 26, 16); 7941 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcMac, 7942 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 42, 48); 7943 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstMac, 7944 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 90, 48); 7945 7946 if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) { 7947 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVlanTranslationHit, 7948 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 138, 1); 7949 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlan, 7950 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 141, 16); 7951 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanCfi, 7952 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 141, 1); 7953 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanPri, 7954 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 142, 3); 7955 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId, 7956 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 145, 12); 7957 } 7958 7959 if (soc_feature(unit, soc_feature_higig_lookup)) { 7960 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy, 7961 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 139, 1); 7962 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig, 7963 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 140, 1); 7964 } 7965 7966 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort, 7967 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 157, 8); 7968 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL3Routable, 7969 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 165, 1); 7970 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMirrorCopy, 7971 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 166, 1); 7972 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlan, 7973 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 167, 16); 7974 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanId, 7975 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 167, 12); 7976 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanCfi, 7977 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 179, 1); 7978 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanPri, 7979 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 180, 3); 7980 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVlanFormat, 7981 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 183, 2); 7982 7983 7984 if (soc_feature(unit, soc_feature_higig_lookup)) { 7985 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstHiGig, 7986 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 185, 1); 7987 } 7988 7989 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort, 7990 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 186, 8); 7991 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2, 7992 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7993 _bcmFieldSliceSelEgrClassF4, 0, 7994 194, 13 7995 ); 7996 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3, 7997 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 7998 _bcmFieldSliceSelEgrClassF4, 0, 7999 194, 13 8000 ); 8001 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField, 8002 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8003 _bcmFieldSliceSelEgrClassF4, 0, 8004 194, 13 8005 ); 8006 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField, 8007 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8008 _bcmFieldSliceSelEgrClassF4, 0, 8009 194, 13 8010 ); 8011 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2, 8012 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8013 _bcmFieldSliceSelEgrClassF4, 0, 8014 194, 13 8015 ); 8016 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3, 8017 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8018 _bcmFieldSliceSelEgrClassF4, 0, 8019 194, 13 8020 ); 8021 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2, 8022 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8023 _bcmFieldSliceSelEgrClassF4, 0, 8024 194, 13 8025 ); 8026 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 8027 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8028 _bcmFieldSliceSelEgrClassF4, 0, 8029 194, 13 8030 ); 8031 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyOutPort, 8032 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8033 _bcmFieldSliceSelEgrClassF4, 1, 8034 194, 8); 8035 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyCpuQueue, 8036 _bcmFieldDevSelDisable, 0, 8037 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8038 _bcmFieldSliceSelEgrClassF4, 2, 8039 0, 8040 194, 6, /* CpuCos - 6 bits */ 8041 0, 0, 8042 0, 0, 8043 0 8044 ); 8045 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField, 8046 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8047 _bcmFieldSliceSelEgrClassF4, 0, 8048 194, 13 8049 ); 8050 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8051 bcmFieldQualifyIngressInterfaceClassPort, 8052 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8053 _bcmFieldSliceSelEgrClassF4, 0, 8054 194, 13 8055 ); 8056 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8057 bcmFieldQualifyIngressInterfaceClassVPort, 8058 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 8059 _bcmFieldSliceSelEgrClassF4, 0, 8060 194, 12 8061 ); 8062 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpType, 8063 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 207, 5); 8064 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingVlanId, 8065 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 212, 12); 8066 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVrf, 8067 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 212, 13); 8068 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVpn, 8069 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 212, 8070 SOC_IS_HELIX5(unit) ? 12 : 13); 8071 8072 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingType, 8073 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 226, 2); 8074 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification, 8075 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 228, 2); 8076 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop, 8077 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 230, 1); 8078 8079 /* EFP_KEY1(IPv4 Key) Qualifiers */ 8080 8081 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4Ports, 8082 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 0, 1); 8083 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntPriority, 8084 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 1, 4); 8085 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyColor, 8086 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 5, 2); 8087 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpFrag, 8088 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 7, 2); 8089 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTcpControl, 8090 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 9, 8); 8091 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4DstPort, 8092 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 17, 16); 8093 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4SrcPort, 8094 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 33, 16); 8095 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIcmpTypeCode, 8096 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 33, 16); 8097 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTtl, 8098 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 49, 8); 8099 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol, 8100 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 57, 8); 8101 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstIp, 8102 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 65, 32); 8103 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcIp, 8104 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 97, 32); 8105 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTos, 8106 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 129, 8); 8107 8108 if (soc_feature(unit, soc_feature_higig_lookup)) { 8109 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy, 8110 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 137, 1); 8111 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig, 8112 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 138, 1); 8113 } 8114 8115 if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) { 8116 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId, 8117 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 139, 12); 8118 } 8119 8120 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort, 8121 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 151, 8); 8122 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL3Routable, 8123 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 159, 1); 8124 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMirrorCopy, 8125 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 160, 1); 8126 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlan, 8127 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 161, 16); 8128 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanId, 8129 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 161, 12); 8130 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanCfi, 8131 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 173, 1); 8132 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanPri, 8133 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 174, 3); 8134 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVlanFormat, 8135 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 177, 2); 8136 8137 8138 if (soc_feature(unit, soc_feature_higig_lookup)) { 8139 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstHiGig, 8140 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 179, 1); 8141 } 8142 8143 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort, 8144 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 180, 8); 8145 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOutPort, 8146 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 188, 8); 8147 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpType, 8148 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 196, 5); 8149 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2, 8150 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8151 _bcmFieldSliceSelEgrClassF1, 0, 8152 201, 13 8153 ); 8154 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3, 8155 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8156 _bcmFieldSliceSelEgrClassF1, 0, 8157 201, 13 8158 ); 8159 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField, 8160 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8161 _bcmFieldSliceSelEgrClassF1, 0, 8162 201, 13 8163 ); 8164 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField, 8165 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8166 _bcmFieldSliceSelEgrClassF1, 0, 8167 201, 13 8168 ); 8169 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2, 8170 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8171 _bcmFieldSliceSelEgrClassF1, 0, 8172 201, 13 8173 ); 8174 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3, 8175 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8176 _bcmFieldSliceSelEgrClassF1, 0, 8177 201, 13 8178 ); 8179 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2, 8180 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8181 _bcmFieldSliceSelEgrClassF1, 0, 8182 201, 13 8183 ); 8184 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 8185 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8186 _bcmFieldSliceSelEgrClassF1, 0, 8187 201, 13 8188 ); 8189 8190 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass, 8191 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8192 _bcmFieldSliceSelEgrClassF1, 1, 8193 201, 12 8194 ); 8195 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8196 bcmFieldQualifyEgressClassL3Interface, 8197 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8198 _bcmFieldSliceSelEgrClassF1, 2, 8199 201, 12 8200 ); 8201 if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) { 8202 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill, 8203 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8204 _bcmFieldSliceSelEgrClassF1, 3, 8205 201, 12 8206 ); 8207 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre, 8208 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8209 _bcmFieldSliceSelEgrClassF1, 3, 8210 201, 12 8211 ); 8212 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan, 8213 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8214 _bcmFieldSliceSelEgrClassF1, 3, 8215 201, 12 8216 ); 8217 } 8218 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField, 8219 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8220 _bcmFieldSliceSelEgrClassF1, 0, 8221 201, 13 8222 ); 8223 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8224 bcmFieldQualifyIngressInterfaceClassPort, 8225 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8226 _bcmFieldSliceSelEgrClassF1, 0, 8227 201, 13 8228 ); 8229 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8230 bcmFieldQualifyIngressInterfaceClassVPort, 8231 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 8232 _bcmFieldSliceSelEgrClassF1, 0, 8233 201, 13 8234 ); 8235 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingVlanId, 8236 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 214, 12); 8237 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVrf, 8238 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 214, 13); 8239 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVpn, 8240 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 214, 13); 8241 8242 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingType, 8243 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 228, 2); 8244 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification, 8245 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 230, 2); 8246 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop, 8247 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 232, 1); 8248 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIp4, 8249 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 0, 0); 8250 8251 /* EFP_KEY2 (IPv6 Singlewide Key) Qualifiers */ 8252 8253 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4Ports, 8254 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 0, 1); 8255 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol, 8256 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 1, 8); 8257 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp6, 8258 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8259 _bcmFieldSliceIp6AddrSelect, 8260 _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_SIP6, 8261 9, 128); 8262 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp6, 8263 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8264 _bcmFieldSliceIp6AddrSelect, 8265 _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_DIP6, 8266 9, 128); 8267 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp6High, 8268 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8269 _bcmFieldSliceIp6AddrSelect, 8270 _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_SIP_DIP_64, 8271 9, 64); 8272 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp6High, 8273 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8274 _bcmFieldSliceIp6AddrSelect, 8275 _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_SIP_DIP_64, 8276 73, 64); 8277 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTos, 8278 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 137, 8); 8279 8280 if (soc_feature(unit, soc_feature_higig_lookup)) { 8281 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy, 8282 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 145, 1); 8283 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig, 8284 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 146, 1); 8285 } 8286 8287 if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) { 8288 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId, 8289 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 147, 12); 8290 } 8291 8292 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort, 8293 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 159, 8); 8294 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL3Routable, 8295 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 167, 1); 8296 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMirrorCopy, 8297 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 168, 1); 8298 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlan, 8299 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 169, 16); 8300 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanId, 8301 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 169, 12); 8302 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanCfi, 8303 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 181, 1); 8304 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanPri, 8305 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 182, 3); 8306 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVlanFormat, 8307 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 185, 2); 8308 8309 if (soc_feature(unit, soc_feature_higig_lookup)) { 8310 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstHiGig, 8311 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 187, 1); 8312 } 8313 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort, 8314 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 188, 8); 8315 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2, 8316 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8317 _bcmFieldSliceSelEgrClassF2, 0, 8318 196, 13 8319 ); 8320 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3, 8321 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8322 _bcmFieldSliceSelEgrClassF2, 0, 8323 196, 13 8324 ); 8325 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField, 8326 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8327 _bcmFieldSliceSelEgrClassF2, 0, 8328 196, 13 8329 ); 8330 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField, 8331 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8332 _bcmFieldSliceSelEgrClassF2, 0, 8333 196, 13 8334 ); 8335 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2, 8336 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8337 _bcmFieldSliceSelEgrClassF2, 0, 8338 196, 13 8339 ); 8340 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3, 8341 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8342 _bcmFieldSliceSelEgrClassF2, 0, 8343 196, 13 8344 ); 8345 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2, 8346 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8347 _bcmFieldSliceSelEgrClassF2, 0, 8348 196, 13 8349 ); 8350 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 8351 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8352 _bcmFieldSliceSelEgrClassF2, 0, 8353 196, 13 8354 ); 8355 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField, 8356 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8357 _bcmFieldSliceSelEgrClassF2, 0, 8358 196, 13 8359 ); 8360 8361 if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) { 8362 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill, 8363 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8364 _bcmFieldSliceSelEgrClassF2, 4, 8365 196, 12 8366 ); 8367 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre, 8368 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8369 _bcmFieldSliceSelEgrClassF2, 4, 8370 196, 12 8371 ); 8372 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan, 8373 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8374 _bcmFieldSliceSelEgrClassF2, 4, 8375 196, 12 8376 ); 8377 } 8378 8379 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass, 8380 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8381 _bcmFieldSliceSelEgrClassF2, 1, 8382 196, 12 8383 ); 8384 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8385 bcmFieldQualifyEgressClassL3Interface, 8386 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8387 _bcmFieldSliceSelEgrClassF2, 2, 8388 196, 12 8389 ); 8390 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyOutPort, 8391 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8392 _bcmFieldSliceSelEgrClassF2, 3, 8393 196, 8 8394 ); 8395 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField, 8396 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8397 _bcmFieldSliceSelEgrClassF2, 0, 8398 196, 13 8399 ); 8400 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8401 bcmFieldQualifyIngressInterfaceClassPort, 8402 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8403 _bcmFieldSliceSelEgrClassF2, 0, 8404 196, 13 8405 ); 8406 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8407 bcmFieldQualifyIngressInterfaceClassVPort, 8408 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 8409 _bcmFieldSliceSelEgrClassF2, 0, 8410 196, 13 8411 ); 8412 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpType, 8413 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 209, 5); 8414 8415 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingVlanId, 8416 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 214, 12); 8417 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVrf, 8418 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 214, 13); 8419 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVpn, 8420 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 214, 13); 8421 8422 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingType, 8423 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 228, 2); 8424 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification, 8425 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 230, 2); 8426 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop, 8427 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 232, 1); 8428 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIp6, 8429 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 0, 0); 8430 8431 /* EFP_KEY3 (IPv6 Double Wide Key) Qualifiers */ 8432 8433 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4Ports, 8434 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 0, 1); 8435 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntPriority, 8436 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 1, 4); 8437 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyColor, 8438 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 5, 2); 8439 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpFrag, 8440 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 7, 2); 8441 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTcpControl, 8442 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 9, 8); 8443 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4DstPort, 8444 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 17, 16); 8445 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4SrcPort, 8446 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 33, 16); 8447 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIcmpTypeCode, 8448 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 33, 16); 8449 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTtl, 8450 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 49, 8); 8451 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstIp6, 8452 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 57, 128); 8453 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyExtensionHeaderSubCode, 8454 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 185, 8); 8455 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyExtensionHeaderType, 8456 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 193, 8); 8457 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpType, 8458 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 201, 5); 8459 8460 8461 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass, 8462 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 8463 _bcmFieldSliceSelEgrClassF3, 0, 8464 206, 12); 8465 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8466 bcmFieldQualifyEgressClassL3Interface, 8467 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 8468 _bcmFieldSliceSelEgrClassF3, 1, 8469 206, 12); 8470 8471 if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) { 8472 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill, 8473 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 8474 _bcmFieldSliceSelEgrClassF3, 3, 8475 206, 12); 8476 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre, 8477 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 8478 _bcmFieldSliceSelEgrClassF3, 3, 8479 206, 12); 8480 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan, 8481 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 8482 _bcmFieldSliceSelEgrClassF3, 3, 8483 206, 12); 8484 } 8485 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification, 8486 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 218, 2); 8487 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop, 8488 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 220, 1); 8489 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIp6, 8490 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 0, 0); 8491 #if defined(BCM_TOMAHAWK2_SUPPORT) 8492 if (SOC_IS_TOMAHAWK2(unit)) { 8493 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelExp, 8494 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 231, 3); 8495 } 8496 #endif /* BCM_TOMAHAWK2_SUPPORT */ 8497 8498 /*EFP_KEY6 (HiGiG Key) Qualifiers*/ 8499 if (soc_feature(unit, soc_feature_higig_lookup)) { 8500 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFabricQueueTag, 8501 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 0, 32); 8502 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstMulticast, 8503 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 148, 1); 8504 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstMulticastGroupId, 8505 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 128, 16); 8506 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigTrafficClass, 8507 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 144, 4); 8508 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstModuleGport, 8509 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 136, 8); 8510 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstPortGport, 8511 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 128, 8); 8512 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstModPortGport, 8513 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 128, 16); 8514 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcModuleGport, 8515 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 120, 8); 8516 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcPortGport, 8517 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 112, 8); 8518 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcModPortGport, 8519 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 112, 16); 8520 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigLoadBalanceID, 8521 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 104, 8); 8522 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigColor, 8523 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 102, 2); 8524 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigExtendedHeaderPresent, 8525 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 101, 1); 8526 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigIntCongestionNotification, 8527 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 99, 2); 8528 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigMirrorOrSwitchPkt, 8529 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 88, 1); 8530 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigIngressTagged, 8531 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 91, 1); 8532 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstTrunk, 8533 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 95, 1); 8534 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstTrunkId, 8535 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 92, 3); 8536 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigIngressL3SwitchPkt, 8537 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 85, 1); 8538 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigLabelType, 8539 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 86, 2); 8540 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigMplsPkt, 8541 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 84, 1); 8542 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigLabel, 8543 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 64, 20); 8544 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigReplicationId, 8545 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 64, 19); 8546 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigVlan, 8547 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 48, 16); 8548 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigPortFilteringMode, 8549 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 46, 2); 8550 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcTrunk, 8551 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 45, 1); 8552 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigPreserveFlags, 8553 _bcmFieldDevSelDisable, 0, 8554 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8555 _bcmFieldDevSelDisable, 0, 8556 0, 8557 44, 1, 8558 43, 1, 8559 0, 0, 8560 0); 8561 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigIngressClassificationTag, 8562 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 80, 16); 8563 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigEgressMcast, 8564 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 95, 1); 8565 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigForwardingType, 8566 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 90, 5); 8567 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigVni, 8568 _bcmFieldDevSelDisable, 0, 8569 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8570 _bcmFieldDevSelDisable, 0, 8571 0, 8572 80, 10, 8573 36, 4, 8574 0, 0, 8575 0); 8576 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstGport, 8577 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 64, 16); 8578 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigMulticastIndex, 8579 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 64, 16); 8580 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigVpReplicationId, 8581 _bcmFieldDevSelDisable, 0, 8582 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8583 _bcmFieldDevSelDisable, 0, 8584 0, 8585 64, 16, 8586 40, 3, 8587 0, 0, 8588 0); 8589 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcGport, 8590 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 48, 16); 8591 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigDoNotFlags, 8592 _bcmFieldDevSelDisable, 0, 8593 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8594 _bcmFieldDevSelDisable, 0, 8595 0, 8596 46, 1, 8597 45, 1, 8598 0, 0, 8599 0); 8600 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigVpLagFailoverPacket, 8601 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 44, 1); 8602 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProtectionSwitchingStatus, 8603 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 43, 1); 8604 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigMirrorToVp, 8605 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 47, 1); 8606 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigVpPreserveFlags, 8607 _bcmFieldDevSelDisable, 0, 8608 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8609 _bcmFieldDevSelDisable, 0, 8610 0, 8611 35, 1, 8612 34, 1, 8613 0, 0, 8614 0); 8615 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstType, 8616 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 33, 1); 8617 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcType, 8618 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 32, 1); 8619 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEngineClassificationTag, 8620 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 80, 16); 8621 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEngineDeferredFlags, 8622 _bcmFieldDevSelDisable, 0, 8623 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8624 _bcmFieldDevSelDisable, 0, 8625 0, 8626 79, 1, 8627 76, 1, 8628 72, 1, 8629 0); 8630 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEngineVxltStatus, 8631 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 77, 2); 8632 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEnginePktPriNew, 8633 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 73, 3); 8634 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEngineDscpNew, 8635 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 66, 6); 8636 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEnginePreserveDscp, 8637 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 47, 1); 8638 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEnginePreserveDot1p, 8639 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 46, 1); 8640 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEngineSrcType, 8641 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 43, 1); 8642 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMHOpcode, 8643 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 40, 3); 8644 8645 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy, 8646 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 160, 1); 8647 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig, 8648 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 161, 1); 8649 8650 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort, 8651 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 162, 8); 8652 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort, 8653 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 170, 8); 8654 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOutPort, 8655 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 178, 8); 8656 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2, 8657 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8658 _bcmFieldSliceSelEgrClassF6, 0, 8659 186, 13 8660 ); 8661 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3, 8662 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8663 _bcmFieldSliceSelEgrClassF6, 0, 8664 186, 13 8665 ); 8666 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField, 8667 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8668 _bcmFieldSliceSelEgrClassF6, 0, 8669 186, 13 8670 ); 8671 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField, 8672 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8673 _bcmFieldSliceSelEgrClassF6, 0, 8674 186, 13 8675 ); 8676 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2, 8677 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8678 _bcmFieldSliceSelEgrClassF6, 0, 8679 186, 13 8680 ); 8681 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3, 8682 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8683 _bcmFieldSliceSelEgrClassF6, 0, 8684 186, 13 8685 ); 8686 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2, 8687 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8688 _bcmFieldSliceSelEgrClassF6, 0, 8689 186, 13 8690 ); 8691 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 8692 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8693 _bcmFieldSliceSelEgrClassF6, 0, 8694 186, 13 8695 ); 8696 8697 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8698 bcmFieldQualifyIngressInterfaceClassPort, 8699 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8700 _bcmFieldSliceSelEgrClassF6, 0, 8701 186, 13 8702 ); 8703 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8704 bcmFieldQualifyIngressInterfaceClassVPort, 8705 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8706 _bcmFieldSliceSelEgrClassF6, 0, 8707 186, 13 8708 ); 8709 8710 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField, 8711 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8712 _bcmFieldSliceSelEgrClassF6, 0, 8713 186, 13 8714 ); 8715 8716 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification, 8717 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 199, 2); 8718 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop, 8719 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 201, 1); 8720 } 8721 8722 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass, 8723 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8724 _bcmFieldSliceSelEgrClassF3, 0, 8725 186, 12); 8726 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8727 bcmFieldQualifyEgressClassL3Interface, 8728 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 8729 _bcmFieldSliceSelEgrClassF6, 1, 8730 186, 12); 8731 8732 /* EFP_KEY7(Loopback Key) qualifiers */ 8733 8734 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackQueue, 8735 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 116, 4); 8736 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopbackType, 8737 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 111, 5); 8738 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackSrcGport, 8739 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 94, 16); 8740 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyPktIsVisible, 8741 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 93, 1); 8742 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackCpuMasqueradePktProfile, 8743 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 90, 3); 8744 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackColor, 8745 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 4, 2); 8746 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackTrafficClass, 8747 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 0, 4); 8748 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackPacketProcessingPort, 8749 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 0, 8); 8750 8751 8752 if (soc_feature(unit, soc_feature_higig_lookup)) { 8753 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy, 8754 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 128, 1); 8755 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig, 8756 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 129, 1); 8757 } 8758 8759 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort, 8760 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 130, 8); 8761 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort, 8762 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 138, 8); 8763 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOutPort, 8764 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 146, 8); 8765 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntPriority, 8766 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 154, 4); 8767 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyColor, 8768 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 158, 2); 8769 8770 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2, 8771 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8772 _bcmFieldSliceSelEgrClassF7, 0, 8773 160, 13 8774 ); 8775 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3, 8776 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8777 _bcmFieldSliceSelEgrClassF7, 0, 8778 160, 13 8779 ); 8780 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField, 8781 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8782 _bcmFieldSliceSelEgrClassF7, 0, 8783 160, 13 8784 ); 8785 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField, 8786 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8787 _bcmFieldSliceSelEgrClassF7, 0, 8788 160, 13 8789 ); 8790 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2, 8791 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8792 _bcmFieldSliceSelEgrClassF7, 0, 8793 160, 13 8794 ); 8795 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3, 8796 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8797 _bcmFieldSliceSelEgrClassF7, 0, 8798 160, 13 8799 ); 8800 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2, 8801 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8802 _bcmFieldSliceSelEgrClassF7, 0, 8803 160, 13 8804 ); 8805 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 8806 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8807 _bcmFieldSliceSelEgrClassF7, 0, 8808 160, 13 8809 ); 8810 8811 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8812 bcmFieldQualifyIngressInterfaceClassPort, 8813 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8814 _bcmFieldSliceSelEgrClassF7, 0, 8815 160, 13 8816 ); 8817 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8818 bcmFieldQualifyIngressInterfaceClassVPort, 8819 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8820 _bcmFieldSliceSelEgrClassF7, 0, 8821 160, 13 8822 ); 8823 8824 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField, 8825 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8826 _bcmFieldSliceSelEgrClassF7, 0, 8827 160, 13 8828 ); 8829 8830 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass, 8831 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8832 _bcmFieldSliceSelEgrClassF7, 1, 8833 160, 12); 8834 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8835 bcmFieldQualifyEgressClassL3Interface, 8836 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8837 _bcmFieldSliceSelEgrClassF7, 2, 8838 160, 12); 8839 8840 if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) { 8841 8842 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill, 8843 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8844 _bcmFieldSliceSelEgrClassF7, 3, 8845 160, 12); 8846 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre, 8847 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8848 _bcmFieldSliceSelEgrClassF7, 3, 8849 160, 12); 8850 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan, 8851 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8852 _bcmFieldSliceSelEgrClassF7, 3, 8853 160, 12); 8854 8855 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMplsGport, 8856 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8857 _bcmFieldSliceSelEgrClassF7, 4, 8858 0, 16); 8859 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMimGport, 8860 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8861 _bcmFieldSliceSelEgrClassF7, 4, 8862 0, 16); 8863 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstVxlanGport, 8864 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 8865 _bcmFieldSliceSelEgrClassF7, 4, 8866 0, 16); 8867 } 8868 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification, 8869 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 173, 2); 8870 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop, 8871 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 175, 1); 8872 8873 /* EFP_KEY8(Bytes After L2 Key) Qualifiers */ 8874 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyL2PayLoad, 8875 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8876 _bcmFieldSliceSelDisable, 0, 59, 144); 8877 8878 8879 /* DVP_VALID + DVP + SPARE_DVP */ 8880 if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) { 8881 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMplsGport, 8882 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8883 _bcmFieldSliceSelEgrDvpKey8, 0, 8884 0, 16); 8885 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMimGport, 8886 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8887 _bcmFieldSliceSelEgrDvpKey8, 0, 8888 0, 16); 8889 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstVxlanGport, 8890 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8891 _bcmFieldSliceSelEgrDvpKey8, 0, 8892 0, 16); 8893 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8894 bcmFieldQualifyDestVirtualPortValid, 8895 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8896 _bcmFieldSliceSelEgrDvpKey8, 0, 8897 0, 1); 8898 8899 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill, 8900 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8901 _bcmFieldSliceSelEgrDvpKey8, 3, 8902 1, 12); 8903 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre, 8904 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8905 _bcmFieldSliceSelEgrDvpKey8, 3, 8906 1, 12); 8907 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan, 8908 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8909 _bcmFieldSliceSelEgrDvpKey8, 3, 8910 1, 12); 8911 } 8912 8913 if (soc_feature(unit, soc_feature_fp_no_dvp_support)) { 8914 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass, 8915 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8916 _bcmFieldSliceSelEgrClassKey8, 1, 8917 1, 12); 8918 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8919 bcmFieldQualifyEgressClassL3Interface, 8920 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8921 _bcmFieldSliceSelEgrClassKey8, 2, 8922 1, 12); 8923 } else { 8924 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass, 8925 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8926 _bcmFieldSliceSelEgrDvpKey8, 1, 8927 1, 12); 8928 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 8929 bcmFieldQualifyEgressClassL3Interface, 8930 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8931 _bcmFieldSliceSelEgrDvpKey8, 2, 8932 1, 12); 8933 } 8934 8935 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntPriority, 8936 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 17, 4); 8937 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyColor, 8938 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 21, 2); 8939 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyEtherType, 8940 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 23, 16); 8941 8942 8943 if (soc_feature(unit, soc_feature_higig_lookup)) { 8944 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy, 8945 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 39, 1); 8946 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig, 8947 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 40, 1); 8948 } 8949 8950 8951 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort, 8952 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 41, 8); 8953 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMirrorCopy, 8954 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 49, 1); 8955 8956 if (soc_feature(unit, soc_feature_higig_lookup)) { 8957 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstHiGig, 8958 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 50, 1); 8959 } 8960 8961 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort, 8962 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 51, 8); 8963 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyOutPort, 8964 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8965 _bcmFieldSliceSelEgrClassF8, 1, 8966 203, 8); 8967 _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyCpuQueue, 8968 _bcmFieldDevSelDisable, 0, 8969 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8970 _bcmFieldSliceSelEgrClassF8, 2, 8971 0, 8972 203, 6, /* CpuCos - 6 bits */ 8973 0, 0, 8974 0, 0, 8975 0 8976 ); 8977 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2, 8978 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8979 _bcmFieldSliceSelEgrClassF8, 0, 8980 203, 13 8981 ); 8982 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3, 8983 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8984 _bcmFieldSliceSelEgrClassF8, 0, 8985 203, 13 8986 ); 8987 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField, 8988 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8989 _bcmFieldSliceSelEgrClassF8, 0, 8990 203, 13 8991 ); 8992 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField, 8993 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8994 _bcmFieldSliceSelEgrClassF8, 0, 8995 203, 13 8996 ); 8997 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2, 8998 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 8999 _bcmFieldSliceSelEgrClassF8, 0, 9000 203, 13 9001 ); 9002 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3, 9003 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 9004 _bcmFieldSliceSelEgrClassF8, 0, 9005 203, 13 9006 ); 9007 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2, 9008 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 9009 _bcmFieldSliceSelEgrClassF8, 0, 9010 203, 13 9011 ); 9012 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 9013 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 9014 _bcmFieldSliceSelEgrClassF8, 0, 9015 203, 13 9016 ); 9017 9018 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 9019 bcmFieldQualifyIngressInterfaceClassPort, 9020 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 9021 _bcmFieldSliceSelEgrClassF8, 0, 9022 203, 13 9023 ); 9024 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, 9025 bcmFieldQualifyIngressInterfaceClassVPort, 9026 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 9027 _bcmFieldSliceSelEgrClassF8, 0, 9028 203, 13 9029 ); 9030 _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField, 9031 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 9032 _bcmFieldSliceSelEgrClassF8, 0, 9033 203, 13 9034 ); 9035 9036 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingVlanId, 9037 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 216, 12); 9038 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVrf, 9039 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 216, 14); 9040 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVpn, 9041 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 216, 14); 9042 9043 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingType, 9044 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 230, 2); 9045 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification, 9046 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 232, 2); 9047 _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop, 9048 _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 234, 1); 9049 9050 return (BCM_E_NONE); 9051 } 9052 9053 /* 9054 * Function: 9055 * _bcm_field_th_egress_mode_get 9056 * 9057 * Purpose: 9058 * Helper function to get the mode of a slice in a 9059 * register value that is to be used for FP_SLICE_CONFIGr. 9060 * 9061 * Parameters: 9062 * unit - (IN) BCM device number. 9063 * fg - (IN) Installed group structure. 9064 * slice_mode - (IN/OUT) Slice mode for the group. 9065 * 9066 * Returns: 9067 * BCM_E_XXX 9068 */ 9069 9070 int 9071 _bcm_field_th_egress_mode_get(int unit, 9072 _field_group_t *fg, 9073 uint8 *slice_mode) 9074 { 9075 int inst; 9076 uint32 reg_value; 9077 uint32 slice_num; 9078 _field_stage_t *stage_fc; 9079 soc_field_t _th_efp_slice_mode[4] = {SLICE_0_MODEf, SLICE_1_MODEf, 9080 SLICE_2_MODEf, SLICE_3_MODEf}; 9081 soc_reg_t efp_slice_control_reg; 9082 9083 /* Input parameters check. */ 9084 if ((NULL == fg) || (NULL == slice_mode)) { 9085 return (BCM_E_PARAM); 9086 } 9087 9088 if (_BCM_FIELD_STAGE_EGRESS != fg->stage_id) { 9089 return BCM_E_PARAM; 9090 } 9091 9092 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id, 9093 &stage_fc)); 9094 9095 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 9096 inst = _FP_GLOBAL_INST; 9097 } else { 9098 inst = fg->instance; 9099 } 9100 9101 slice_num = fg->slices->slice_number; 9102 9103 if (slice_num >= COUNTOF(_th_efp_slice_mode)) { 9104 return (BCM_E_PARAM); 9105 } 9106 9107 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, EFP_SLICE_CONTROLr, 9108 inst, 9109 &efp_slice_control_reg)); 9110 BCM_IF_ERROR_RETURN(soc_reg32_get(unit, 9111 efp_slice_control_reg, 9112 REG_PORT_ANY, 0, ®_value)); 9113 9114 *slice_mode = soc_reg_field_get(unit, 9115 efp_slice_control_reg, 9116 reg_value, 9117 _th_efp_slice_mode[slice_num]); 9118 return BCM_E_NONE; 9119 } 9120 /* 9121 * Function: 9122 * _bcm_field_th_egress_mode_set 9123 * 9124 * Purpose: 9125 * Helper function to _bcm_field_th_mode_install that sets the mode of a 9126 * slice in a register value that is to be used for FP_SLICE_CONFIGr. 9127 * 9128 * Parameters: 9129 * unit - (IN) BCM device number. 9130 * slice_numb - (IN) Slice number to set mode for. 9131 * fg - (IN) Installed group structure. 9132 * flags - (IN) New group/slice mode. 9133 * 9134 * Returns: 9135 * BCM_E_XXX 9136 */ 9137 int 9138 _bcm_field_th_egress_mode_set(int unit, uint8 slice_numb, 9139 _field_group_t *fg, uint8 flags) 9140 { 9141 int inst; 9142 uint32 mode_val[2]; 9143 _field_stage_t *stage_fc; 9144 soc_reg_t efp_slice_control_reg; 9145 9146 /* Input parameters check. */ 9147 if ((NULL == fg) || (slice_numb >= COUNTOF(_th_efp_slice_mode))) { 9148 return (BCM_E_PARAM); 9149 } 9150 9151 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id, 9152 &stage_fc)); 9153 9154 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 9155 inst = _FP_GLOBAL_INST; 9156 } else { 9157 inst = fg->instance; 9158 } 9159 9160 mode_val[1] = _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_SIP6; 9161 9162 if (flags & _FP_GROUP_SPAN_DOUBLE_SLICE) { 9163 9164 /* DstIP6 + SrcIp6 or IPv4 + L2 Double wide key. */ 9165 if (((_BCM_FIELD_EFP_KEY3 == fg->sel_codes[0].fpf3) && 9166 (_BCM_FIELD_EFP_KEY2 == fg->sel_codes[1].fpf3))) { 9167 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE; 9168 if (_FP_SELCODE_DONT_CARE != fg->sel_codes[1].ip6_addr_sel) { 9169 mode_val[1] =fg->sel_codes[1].ip6_addr_sel; 9170 } 9171 } 9172 9173 #if defined(BCM_TRIDENT3_SUPPORT) 9174 /* FCOE Double wide key. */ 9175 if ((_BCM_FIELD_EFP_KEY5 == fg->sel_codes[0].fpf3) && \ 9176 (_BCM_FIELD_EFP_KEY4 == fg->sel_codes[1].fpf3)) { 9177 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_FCOE; 9178 } else 9179 #endif 9180 if (_BCM_FIELD_EFP_KEY4 == fg->sel_codes[1].fpf3) { 9181 if ((_BCM_FIELD_EFP_KEY1 == fg->sel_codes[0].fpf3) && 9182 (BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyIp4))) { 9183 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE; 9184 } else if (_BCM_FIELD_EFP_KEY2 == fg->sel_codes[0].fpf3) { 9185 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6; 9186 if (_FP_SELCODE_DONT_CARE != fg->sel_codes[0].ip6_addr_sel) { 9187 mode_val[1] =fg->sel_codes[0].ip6_addr_sel; 9188 } 9189 } else if (_BCM_FIELD_EFP_KEY8 == fg->sel_codes[0].fpf3) { 9190 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE; 9191 } else { 9192 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY; 9193 } 9194 } 9195 } else { 9196 if (_BCM_FIELD_EFP_KEY4 == fg->sel_codes[0].fpf3) { 9197 /* L2 - Slice mode. */ 9198 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L2; 9199 9200 } else if ((_BCM_FIELD_EFP_KEY1 == fg->sel_codes[0].fpf3) && 9201 BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyIp4)) { 9202 /* L3 - IPv4 single wide key. */ 9203 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3; 9204 9205 } else if ((_BCM_FIELD_EFP_KEY2 == fg->sel_codes[0].fpf3)) { 9206 /* L3 - IPv6 single wide key. */ 9207 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3; 9208 if (_FP_SELCODE_DONT_CARE != fg->sel_codes[0].ip6_addr_sel) { 9209 mode_val[1] =fg->sel_codes[0].ip6_addr_sel; 9210 } 9211 } 9212 #if defined(BCM_TRIDENT3_SUPPORT) 9213 else if ((_BCM_FIELD_EFP_KEY5 == fg->sel_codes[0].fpf3)) { 9214 /* FCOE single wide key. */ 9215 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3; 9216 } 9217 #endif 9218 else { 9219 /* L3 common key. */ 9220 mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3_ANY; 9221 } 9222 } 9223 9224 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, EFP_SLICE_CONTROLr, 9225 inst, &efp_slice_control_reg)); 9226 BCM_IF_ERROR_RETURN(soc_reg_fields32_modify(unit, 9227 efp_slice_control_reg, REG_PORT_ANY, 2, 9228 _th_efp_slice_mode[slice_numb], mode_val)); 9229 9230 return (BCM_E_NONE); 9231 } 9232 9233 /* 9234 * Function: 9235 * _field_th_lookup_mode_set 9236 * 9237 * Purpose: 9238 * Auxiliary routine used to set group pairing mode. 9239 * Parameters: 9240 * unit - (IN) BCM device number. 9241 * slice_numb - (IN) Slice number to set mode for. 9242 * fg - (IN) Installed group structure. 9243 * flags - (IN) New group/slice mode. 9244 * 9245 * Returns: 9246 * BCM_E_XXX 9247 */ 9248 STATIC int 9249 _field_th_lookup_mode_set(int unit, 9250 uint8 slice_num, 9251 _field_group_t *fg, 9252 uint8 flags) 9253 { 9254 int inst; 9255 uint64 vfp_key_control_1_buf; 9256 _field_stage_t *stage_fc; 9257 soc_reg_t vfp_control_1_reg; 9258 9259 /* Input parameters check. */ 9260 if (NULL == fg) { 9261 return (BCM_E_PARAM); 9262 } 9263 9264 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id, 9265 &stage_fc)); 9266 9267 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 9268 inst = _FP_GLOBAL_INST; 9269 } else { 9270 inst = fg->instance; 9271 } 9272 9273 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_1r, 9274 inst, &vfp_control_1_reg)); 9275 9276 BCM_IF_ERROR_RETURN(soc_reg64_get(unit, 9277 vfp_control_1_reg, 9278 REG_PORT_ANY, 9279 0, 9280 &vfp_key_control_1_buf)); 9281 9282 soc_reg64_field32_set(unit, 9283 vfp_control_1_reg, 9284 &vfp_key_control_1_buf, 9285 vfp_slice_pairing_flds[slice_num >> 1], 9286 flags & _FP_GROUP_SPAN_DOUBLE_SLICE ? 1 : 0 9287 ); 9288 soc_reg64_field32_set(unit, 9289 vfp_control_1_reg, 9290 &vfp_key_control_1_buf, 9291 vfp_slice_wide_mode_flds[slice_num], 9292 flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE ? 1 : 0 9293 ); 9294 9295 9296 return (soc_reg64_set(unit, 9297 vfp_control_1_reg, 9298 REG_PORT_ANY, 9299 0, 9300 vfp_key_control_1_buf)); 9301 } 9302 9303 9304 /* 9305 * Function: 9306 * _field_th_mode_set 9307 * 9308 * Purpose: 9309 * Auxiliary routine used to set group pairing mode. 9310 * Parameters: 9311 * unit - (IN) BCM device number. 9312 * slice_numb - (IN) Slice number to set mode for. 9313 * fg - (IN) Installed group structure. 9314 * flags - (IN) New group/slice mode. 9315 * 9316 * Returns: 9317 * BCM_E_XXX 9318 */ 9319 int 9320 _bcm_field_th_mode_set(int unit, uint8 slice_numb, 9321 _field_group_t *fg, uint8 flags) 9322 { 9323 int rv; /* Operation return status. */ 9324 9325 /* Input parameter check. */ 9326 if (NULL == fg) { 9327 return (BCM_E_PARAM); 9328 } 9329 9330 switch (fg->stage_id) { 9331 case _BCM_FIELD_STAGE_INGRESS: 9332 case _BCM_FIELD_STAGE_EXACTMATCH: 9333 rv = BCM_E_NONE; /* Mode and select codes programmed together. */ 9334 break; 9335 case _BCM_FIELD_STAGE_LOOKUP: 9336 rv = _field_th_lookup_mode_set(unit, slice_numb, fg, flags); 9337 break; 9338 case _BCM_FIELD_STAGE_EGRESS: 9339 rv = _bcm_field_th_egress_mode_set(unit, slice_numb, fg, flags); 9340 break; 9341 case _BCM_FIELD_STAGE_FLOWTRACKER: 9342 rv = BCM_E_NONE; 9343 break; 9344 default: 9345 rv = BCM_E_PARAM; 9346 } 9347 return (rv); 9348 } 9349 /* 9350 * Function: 9351 * _field_th_egress_selcodes_install 9352 * 9353 * Purpose: 9354 * Writes the field egress secondary select codes. 9355 * 9356 * Parameters: 9357 * unit - (IN) BCM device number 9358 * fg - (IN) Installed group structure. 9359 * slice_numb - (IN) Slice number to set mode for. 9360 * selcode_index - (IN) Index to group slecodes. 9361 * 9362 * 9363 * Returns: 9364 * BCM_E_INTERNAL - On read/write errors 9365 * BCM_E_NONE - Success 9366 * 9367 * Note: 9368 * Unit lock should be held by calling function. 9369 */ 9370 9371 STATIC int 9372 _field_th_egress_selcodes_install(int unit, 9373 _field_group_t *fg, 9374 uint8 slice_num, 9375 int selcode_idx 9376 ) 9377 { 9378 int inst; 9379 uint8 idx; /* Index to EFP keys. */ 9380 _field_sel_t *sel; 9381 _field_stage_t *stage_fc; 9382 soc_reg_t efp_classid_sel_reg; 9383 soc_reg_t efp_key4_dvp_reg; 9384 soc_reg_t efp_key4_mdl_reg; 9385 soc_reg_t efp_key8_dvp_reg; 9386 soc_reg_t efp_key4_class_reg; 9387 soc_reg_t efp_key8_class_reg; 9388 9389 9390 if (NULL == fg) { 9391 return BCM_E_PARAM; 9392 } 9393 9394 /* Max number of slices on Tomahawk for EFP is 4(slice 0 - slice 3) */ 9395 if (slice_num >= 4) { 9396 return BCM_E_INTERNAL; 9397 } 9398 9399 sel = &fg->sel_codes[selcode_idx]; 9400 if (sel == NULL) { 9401 return BCM_E_INTERNAL; 9402 } 9403 9404 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id, 9405 &stage_fc)); 9406 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 9407 inst = _FP_GLOBAL_INST; 9408 } else { 9409 inst = fg->instance; 9410 } 9411 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 9412 EFP_CLASSID_SELECTORr, 9413 inst, 9414 &efp_classid_sel_reg)); 9415 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 9416 EFP_KEY4_DVP_SELECTORr, 9417 inst, 9418 &efp_key4_dvp_reg)); 9419 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 9420 EFP_KEY4_MDL_SELECTORr, 9421 inst, 9422 &efp_key4_mdl_reg)); 9423 9424 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 9425 EFP_KEY8_DVP_SELECTORr, 9426 inst, 9427 &efp_key8_dvp_reg)); 9428 9429 if (soc_feature(unit, soc_feature_fp_no_dvp_support)) { 9430 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 9431 EFP_KEY4_L3_CLASSID_SELECTORr, 9432 inst, 9433 &efp_key4_class_reg)); 9434 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 9435 EFP_KEY8_L3_CLASSID_SELECTORr, 9436 inst, 9437 &efp_key8_class_reg)); 9438 } 9439 9440 idx = 0; 9441 /* Class Id Selector codes for different EFP keys (KEY1 - KEY8) */ 9442 if (sel->egr_class_f1_sel != _FP_SELCODE_DONT_CARE) { 9443 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9444 efp_classid_sel_reg, 9445 REG_PORT_ANY, 9446 classfldtbl[slice_num][idx], 9447 sel->egr_class_f1_sel 9448 )); 9449 } 9450 9451 idx++; 9452 if (sel->egr_class_f2_sel != _FP_SELCODE_DONT_CARE) { 9453 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9454 efp_classid_sel_reg, 9455 REG_PORT_ANY, 9456 classfldtbl[slice_num][idx], 9457 sel->egr_class_f2_sel 9458 )); 9459 } 9460 9461 idx++; 9462 if (sel->egr_class_f3_sel != _FP_SELCODE_DONT_CARE) { 9463 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9464 efp_classid_sel_reg, 9465 REG_PORT_ANY, 9466 classfldtbl[slice_num][idx], 9467 sel->egr_class_f3_sel 9468 )); 9469 } 9470 9471 idx++; 9472 if (sel->egr_class_f4_sel != _FP_SELCODE_DONT_CARE) { 9473 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9474 efp_classid_sel_reg, 9475 REG_PORT_ANY, 9476 classfldtbl[slice_num][idx], 9477 sel->egr_class_f4_sel 9478 )); 9479 } 9480 9481 idx++; 9482 if (sel->egr_class_f6_sel != _FP_SELCODE_DONT_CARE) { 9483 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9484 efp_classid_sel_reg, 9485 REG_PORT_ANY, 9486 classfldtbl[slice_num][idx], 9487 sel->egr_class_f6_sel 9488 )); 9489 } 9490 9491 idx++; 9492 if (sel->egr_class_f7_sel != _FP_SELCODE_DONT_CARE) { 9493 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9494 efp_classid_sel_reg, 9495 REG_PORT_ANY, 9496 classfldtbl[slice_num][idx], 9497 sel->egr_class_f7_sel 9498 )); 9499 } 9500 9501 idx++; 9502 if (sel->egr_class_f8_sel != _FP_SELCODE_DONT_CARE) { 9503 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9504 efp_classid_sel_reg, 9505 REG_PORT_ANY, 9506 classfldtbl[slice_num][idx], 9507 sel->egr_class_f8_sel 9508 )); 9509 } 9510 9511 /* SELECTOR CODES for EFP_KEY4_DVP_SELECTOR register */ 9512 if (sel->egr_key4_dvp_sel != _FP_SELCODE_DONT_CARE) { 9513 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9514 efp_key4_dvp_reg, 9515 REG_PORT_ANY, 9516 dvpfldtbl[slice_num], 9517 sel->egr_key4_dvp_sel 9518 )); 9519 } 9520 /* SELECTOR CODES for EFP_KEY8_DVP_SELECTOR register */ 9521 if (sel->egr_key8_dvp_sel != _FP_SELCODE_DONT_CARE) { 9522 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9523 efp_key8_dvp_reg, 9524 REG_PORT_ANY, 9525 dvpfldtbl[slice_num], 9526 sel->egr_key8_dvp_sel 9527 )); 9528 } 9529 9530 /* SELECTOR CODES for EFP_KEY4_MDL_SELECTOR register */ 9531 if (sel->egr_key4_mdl_sel != _FP_SELCODE_DONT_CARE) { 9532 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9533 efp_key4_mdl_reg, 9534 REG_PORT_ANY, 9535 mdlfldtbl[slice_num], 9536 sel->egr_key4_mdl_sel 9537 )); 9538 } 9539 9540 #if defined (BCM_TOMAHAWK3_SUPPORT) 9541 if (soc_feature(unit, soc_feature_fp_no_dvp_support)) { 9542 /* SELECTOR CODES for EFP_KEY4_L3_CLASSID_SELECTOR register */ 9543 if (sel->egr_key4_l3_classId_sel != _FP_SELCODE_DONT_CARE) { 9544 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9545 efp_key4_class_reg, 9546 REG_PORT_ANY, 9547 classIdBfldtbl[slice_num], 9548 sel->egr_key4_l3_classId_sel 9549 )); 9550 } 9551 /* SELECTOR CODES for EFP_KEY8_L3_CLASSID_SELECTOR register */ 9552 if (sel->egr_key8_l3_classId_sel != _FP_SELCODE_DONT_CARE) { 9553 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, 9554 efp_key8_class_reg, 9555 REG_PORT_ANY, 9556 classIdBfldtbl[slice_num], 9557 sel->egr_key8_l3_classId_sel 9558 )); 9559 } 9560 } 9561 #endif 9562 9563 return (BCM_E_NONE); 9564 } 9565 9566 /* 9567 * Function: 9568 * _bcm_field_th_lookup_selcodes_install 9569 * 9570 * Purpose: 9571 * Writes the field select codes (ie. FPFx). 9572 * for VFP (_BCM_FIELD_STAGE_LOOKUP) lookup stage. 9573 * 9574 * Parameters: 9575 * unit - BCM device number 9576 * fs - slice that needs its select codes written 9577 * 9578 * Returns: 9579 * BCM_E_XXX 9580 */ 9581 9582 int 9583 _bcm_field_th_lookup_selcodes_install(int unit, 9584 _field_group_t *fg, 9585 uint8 slice_num, 9586 int selcode_idx) 9587 { 9588 static const soc_field_t s_type_fld_tbl[] = { 9589 SLICE_0_S_TYPE_SELf, 9590 SLICE_1_S_TYPE_SELf, 9591 SLICE_2_S_TYPE_SELf, 9592 SLICE_3_S_TYPE_SELf 9593 }; 9594 9595 _field_sel_t * const sel = &fg->sel_codes[selcode_idx]; 9596 int errcode = BCM_E_NONE; 9597 uint64 regval; 9598 uint64 val; 9599 int inst; 9600 _field_stage_t *stage_fc; 9601 soc_reg_t vfp_control_1_reg; 9602 soc_reg_t vfp_control_2_reg; 9603 9604 /* Input parameters check. */ 9605 if (NULL == fg) { 9606 return (BCM_E_PARAM); 9607 } 9608 9609 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id, 9610 &stage_fc)); 9611 9612 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 9613 inst = _FP_GLOBAL_INST; 9614 } else { 9615 inst = fg->instance; 9616 } 9617 9618 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_1r, 9619 inst, &vfp_control_1_reg)); 9620 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_2r, 9621 inst, &vfp_control_2_reg)); 9622 9623 BCM_IF_ERROR_RETURN(soc_reg64_get(unit, 9624 vfp_control_1_reg, 9625 REG_PORT_ANY, 9626 0, 9627 ®val 9628 )); 9629 9630 if ((fg->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) 9631 && (selcode_idx & 1) 9632 ) { 9633 if (sel->fpf2 != _FP_SELCODE_DONT_CARE) { 9634 COMPILER_64_SET(val, 0, sel->fpf2); 9635 soc_reg64_field_set(unit, 9636 vfp_control_1_reg, 9637 ®val, 9638 _bcm_field_trx_vfp_double_wide_sel[slice_num], 9639 val 9640 ); 9641 } 9642 } else { 9643 if (sel->fpf2 != _FP_SELCODE_DONT_CARE) { 9644 COMPILER_64_SET(val, 0, sel->fpf2); 9645 soc_reg64_field_set(unit, 9646 vfp_control_1_reg, 9647 ®val, 9648 _bcm_field_trx_vfp_field_sel[slice_num][0], 9649 val 9650 ); 9651 } 9652 if (sel->fpf3 != _FP_SELCODE_DONT_CARE) { 9653 COMPILER_64_SET(val, 0, sel->fpf3); 9654 soc_reg64_field_set(unit, 9655 vfp_control_1_reg, 9656 ®val, 9657 _bcm_field_trx_vfp_field_sel[slice_num][1], 9658 val 9659 ); 9660 } 9661 } 9662 9663 9664 if (sel->src_entity_sel != _FP_SELCODE_DONT_CARE) { 9665 uint32 value; 9666 9667 9668 switch (sel->src_entity_sel) { 9669 case _bcmFieldFwdEntityPortGroupNum: 9670 value = 4; 9671 break; 9672 case _bcmFieldFwdEntityMplsGport: 9673 case _bcmFieldFwdEntityNivGport: 9674 case _bcmFieldFwdEntityMimGport: 9675 case _bcmFieldFwdEntityWlanGport: 9676 case _bcmFieldFwdEntityVxlanGport: 9677 case _bcmFieldFwdEntityVlanGport: 9678 value = 0; 9679 break; 9680 case _bcmFieldFwdEntityModPortGport: 9681 value = 2; 9682 break; 9683 case _bcmFieldFwdEntityGlp: 9684 value = 1; 9685 break; 9686 default: 9687 return (BCM_E_INTERNAL); 9688 } 9689 COMPILER_64_SET(val, 0, value); 9690 soc_reg64_field_set(unit, 9691 vfp_control_1_reg, 9692 ®val, 9693 s_type_fld_tbl[slice_num], 9694 val 9695 ); 9696 } 9697 9698 BCM_IF_ERROR_RETURN(soc_reg64_set(unit, 9699 vfp_control_1_reg, 9700 REG_PORT_ANY, 9701 0, 9702 regval 9703 ) 9704 ); 9705 9706 /* Set inner/outer ip header selection. */ 9707 /* In TD3, vfp_key_control_2 register is not avaliable. 9708 * we cannot match on Inner Ip header fields */ 9709 if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support) && 9710 sel->ip_header_sel != _FP_SELCODE_DONT_CARE) { 9711 errcode = soc_reg_field32_modify( 9712 unit, 9713 vfp_control_2_reg, 9714 REG_PORT_ANY, 9715 _bcm_field_trx_vfp_ip_header_sel[slice_num], 9716 sel->ip_header_sel 9717 ); 9718 } 9719 9720 return (errcode); 9721 } 9722 9723 /* 9724 * Function: 9725 * _field_th_lookup_slice_clear 9726 * 9727 * Purpose: 9728 * Reset slice configuraton on group deletion event. 9729 * 9730 * Parameters: 9731 * unit - BCM device number 9732 * fg - Field group slice belongs to 9733 * fs - Field slice structure. 9734 * 9735 * Returns: 9736 * BCM_E_NONE - Success 9737 * 9738 * Note: 9739 * Unit lock should be held by calling function. 9740 */ 9741 STATIC int 9742 _field_th_lookup_slice_clear(int unit, _field_group_t *fg, _field_slice_t *fs) 9743 { 9744 uint64 reg_val; 9745 int rv; 9746 int inst; 9747 int slice_num; 9748 _field_stage_t *stage_fc; 9749 soc_reg_t vfp_control_1_reg; 9750 soc_reg_t vfp_control_2_reg; 9751 9752 /* Input parameters check. */ 9753 if (NULL == fg || NULL == fs) { 9754 return (BCM_E_PARAM); 9755 } 9756 9757 rv = _field_stage_control_get(unit, fg->stage_id, &stage_fc); 9758 BCM_IF_ERROR_RETURN(rv); 9759 9760 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 9761 inst = _FP_GLOBAL_INST; 9762 } else { 9763 inst = fg->instance; 9764 } 9765 9766 slice_num = fs->slice_number; 9767 9768 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_1r, 9769 inst, &vfp_control_1_reg)); 9770 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_2r, 9771 inst, &vfp_control_2_reg)); 9772 9773 BCM_IF_ERROR_RETURN(soc_reg64_get(unit, 9774 vfp_control_1_reg, 9775 REG_PORT_ANY, 9776 0, 9777 ®_val 9778 ) 9779 ); 9780 soc_reg64_field32_set(unit, 9781 vfp_control_1_reg, 9782 ®_val, 9783 _bcm_field_trx_vfp_double_wide_sel[slice_num], 9784 0 9785 ); 9786 soc_reg64_field32_set(unit, 9787 vfp_control_1_reg, 9788 ®_val, 9789 _bcm_field_trx_vfp_field_sel[slice_num][0], 9790 0 9791 ); 9792 soc_reg64_field32_set(unit, 9793 vfp_control_1_reg, 9794 ®_val, 9795 _bcm_field_trx_vfp_field_sel[slice_num][1], 9796 0 9797 ); 9798 soc_reg64_field32_set(unit, 9799 vfp_control_1_reg, 9800 ®_val, 9801 _bcm_field_trx_slice_pairing_field[slice_num >> 1], 9802 0 9803 ); 9804 BCM_IF_ERROR_RETURN(soc_reg64_set(unit, 9805 vfp_control_1_reg, 9806 REG_PORT_ANY, 9807 0, 9808 reg_val 9809 ) 9810 ); 9811 /* In TD3, vfp_key_control_2 register is not avaliable. 9812 * we cannot match on Inner Ip header fields */ 9813 if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) { 9814 rv = soc_reg_field32_modify(unit, 9815 vfp_control_2_reg, 9816 REG_PORT_ANY, 9817 _bcm_field_trx_vfp_ip_header_sel[slice_num], 9818 0 9819 ); 9820 } 9821 return rv; 9822 } 9823 /* 9824 * Function: 9825 * _bcm_field_th_selcodes_install 9826 * 9827 * Purpose: 9828 * Writes the field select codes (ie. FPFx). 9829 * 9830 * Parameters: 9831 * unit - BCM device number 9832 * fs - slice that needs its select codes written 9833 * 9834 * Returns: 9835 * BCM_E_INTERNAL - On read/write errors 9836 * BCM_E_NONE - Success 9837 * 9838 * Note: 9839 * Unit lock should be held by calling function. 9840 */ 9841 int 9842 _bcm_field_th_selcodes_install(int unit, _field_group_t *fg, 9843 uint8 slice_numb, bcm_pbmp_t pbmp, 9844 int selcode_index) 9845 { 9846 int rv; /* Operation return status. */ 9847 9848 /* Input parameters check. */ 9849 if (NULL == fg) { 9850 return (BCM_E_PARAM); 9851 } 9852 9853 /* Set slice mode. Single/Double/Triple, Intraslice */ 9854 rv = _bcm_field_th_mode_set(unit, slice_numb, fg, fg->flags); 9855 BCM_IF_ERROR_RETURN(rv); 9856 switch (fg->stage_id) { 9857 case _BCM_FIELD_STAGE_LOOKUP: 9858 rv = _bcm_field_th_lookup_selcodes_install(unit, fg, slice_numb, 9859 selcode_index); 9860 break; 9861 case _BCM_FIELD_STAGE_EGRESS: 9862 #if defined(BCM_TRIDENT3_SUPPORT) 9863 if (soc_feature(unit, soc_feature_td3_style_fp)) { 9864 rv = _field_td3_egress_selcodes_install(unit, fg, slice_numb, 9865 selcode_index); 9866 } else 9867 #endif 9868 { 9869 rv = _field_th_egress_selcodes_install(unit, fg, slice_numb, 9870 selcode_index); 9871 } 9872 break; 9873 case _BCM_FIELD_STAGE_EXTERNAL: 9874 case _BCM_FIELD_STAGE_INGRESS: 9875 case _BCM_FIELD_STAGE_EXACTMATCH: 9876 case _BCM_FIELD_STAGE_FLOWTRACKER: 9877 rv = (BCM_E_NONE); 9878 break; 9879 default: 9880 rv = (BCM_E_PARAM); 9881 } 9882 return (rv); 9883 } 9884 9885 /* 9886 * Function: 9887 * _bcm_field_action_conf_get 9888 * Purpose: 9889 * Get configuration structure of a field action in the given stage. 9890 * Parameters: 9891 * unit - (IN) BCM device number. 9892 * stage_fc - (IN) Stage field control strucutre. 9893 * action - (IN) Field Action. 9894 * ptr - (OUT) FP action info. 9895 * Returns: 9896 * BCM_E_XXX 9897 */ 9898 int 9899 _bcm_field_action_config_get(int unit, _field_stage_t *stage_fc, 9900 int action, _bcm_field_action_conf_t **ptr) 9901 { 9902 9903 /* Input parameters check. */ 9904 if (NULL == stage_fc || NULL == ptr || 9905 (action < 0) || (action > _bcmFieldActionCount)) { 9906 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 9907 return BCM_E_PARAM; 9908 } 9909 9910 if ((_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) && 9911 (_BCM_FIELD_STAGE_EXACTMATCH != stage_fc->stage_id)) { 9912 return BCM_E_INTERNAL; 9913 } 9914 9915 *ptr = stage_fc->f_action_arr[action]; 9916 if (NULL == *ptr) { 9917 return BCM_E_UNAVAIL; 9918 } 9919 9920 return BCM_E_NONE; 9921 } 9922 /* 9923 * Function: 9924 * _bcm_field_action_offset_get 9925 * Purpose: 9926 * Get offset info of a field action for the given stage and flags. 9927 * Parameters: 9928 * unit - (IN) BCM device number. 9929 * stage_fc - (IN) Stage field control strucutre. 9930 * action - (IN) Field Action. 9931 * ptr - (OUT) FP action offset info. 9932 * flags - (IN) Field Actions Flags of type _BCM_FIELD_ACTION_XXX. 9933 * Returns: 9934 * BCM_E_XXX 9935 */ 9936 int 9937 _bcm_field_action_offset_get(int unit, _field_stage_t *stage_fc, 9938 _bcm_field_internal_action_t action, 9939 _bcm_field_action_offset_t *ptr, 9940 uint32 flags) 9941 { 9942 uint32 found; /* Indicates action offset existance.*/ 9943 _bcm_field_action_conf_t *aconf; /* Action config structure. */ 9944 _bcm_field_action_offset_t *offset; /* Field Action Offset Iformation. */ 9945 9946 /* Input parameters check. */ 9947 if (NULL == stage_fc || NULL == ptr || 9948 (action < 0) || (action > _bcmFieldActionCount)) { 9949 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 9950 return BCM_E_PARAM; 9951 } 9952 9953 if ((_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) && 9954 (_BCM_FIELD_STAGE_EXACTMATCH != stage_fc->stage_id)) { 9955 return BCM_E_INTERNAL; 9956 } 9957 9958 aconf = stage_fc->f_action_arr[action]; 9959 if (NULL == aconf) { 9960 return BCM_E_UNAVAIL; 9961 } 9962 9963 found = 0; 9964 offset = aconf->offset; 9965 do { 9966 if (flags == (offset->flags & flags)) { 9967 sal_memset(ptr, 0, sizeof(_bcm_field_action_offset_t)); 9968 sal_memcpy(ptr, offset, sizeof(_bcm_field_action_offset_t)); 9969 found = 1; 9970 break; 9971 } 9972 offset = offset->next; 9973 } while (NULL != offset); 9974 9975 if (!found) { 9976 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 9977 "Action offset info for flags %d is not available.\n"), flags)); 9978 return BCM_E_UNAVAIL; 9979 } 9980 9981 return BCM_E_NONE; 9982 } 9983 9984 STATIC int 9985 _field_th_ingress_action_support_check(int unit, unsigned stage, 9986 bcm_field_action_t action) 9987 { 9988 int rv; /* Operation return status. */ 9989 _field_stage_t *stage_fc; /* Field Stage Structure. */ 9990 _bcm_field_action_conf_t *aconf; /* Field Action config structure. */ 9991 9992 rv = _field_stage_control_get(unit, stage, &stage_fc); 9993 BCM_IF_ERROR_RETURN(rv); 9994 9995 return _bcm_field_action_config_get(unit, stage_fc, action, &aconf); 9996 } 9997 9998 /* 9999 * Function: 10000 * _field_th_stage_action_support_check 10001 * Purpose: 10002 * Check if action is supported by tomahawk for the given stage. 10003 * Parameters: 10004 * unit - (IN) BCM device number. 10005 * stage - (IN) Field processor stage. 10006 * action - (IN) Action to check(bcmFieldActionXXX) 10007 * result - (OUT) 10008 * TRUE - action is supported by device 10009 * FALSE - action is NOT supported by device 10010 * Returns: 10011 * BCM_E_XXX 10012 */ 10013 int 10014 _field_th_stage_action_support_check(int unit, 10015 unsigned stage, 10016 bcm_field_action_t action, 10017 int *result) 10018 { 10019 10020 if (NULL == result) { 10021 return BCM_E_PARAM; 10022 } 10023 10024 if ((_BCM_FIELD_STAGE_INGRESS == stage) || 10025 (_BCM_FIELD_STAGE_EXACTMATCH == stage)) { 10026 10027 if (BCM_SUCCESS(_field_th_ingress_action_support_check(unit, stage, action))) { 10028 *result = TRUE; 10029 } else { 10030 *result = FALSE; 10031 } 10032 10033 return BCM_E_NONE; 10034 } 10035 10036 switch (action) { 10037 case bcmFieldActionHiGigDstModuleGportNew: 10038 case bcmFieldActionHiGigDstPortGportNew: 10039 case bcmFieldActionHiGigDstGportNew: 10040 case bcmFieldActionGpHiGigDropPrecedenceNew: 10041 case bcmFieldActionYpHiGigDropPrecedenceNew: 10042 case bcmFieldActionRpHiGigDropPrecedenceNew: 10043 case bcmFieldActionHiGigDropPrecedenceNew: 10044 case bcmFieldActionGpHiGigIntPriNew: 10045 case bcmFieldActionYpHiGigIntPriNew: 10046 case bcmFieldActionRpHiGigIntPriNew: 10047 case bcmFieldActionHiGigIntPriNew: 10048 case bcmFieldActionLoopbackSrcModuleGportNew: 10049 case bcmFieldActionLoopbackSrcPortGportNew: 10050 case bcmFieldActionLoopbackSrcGportNew: 10051 case bcmFieldActionLoopbackCpuMasqueradePktProfileNew: 10052 case bcmFieldActionLoopBackTypeNew: 10053 *result = (stage == _BCM_FIELD_STAGE_EGRESS); 10054 return (BCM_E_NONE); 10055 case bcmFieldActionLoopbackPacketProcessingPortNew: 10056 *result = ((0 == soc_feature(unit, soc_feature_td3_style_fp)) && (stage == _BCM_FIELD_STAGE_EGRESS)); 10057 return (BCM_E_NONE); 10058 case bcmFieldActionClassZero: 10059 case bcmFieldActionClassOne: 10060 *result = (stage == _BCM_FIELD_STAGE_CLASS); 10061 return (BCM_E_NONE); 10062 case bcmFieldActionHashSelect0: 10063 case bcmFieldActionHashSelect1: 10064 *result = (stage == _BCM_FIELD_STAGE_LOOKUP); 10065 return (BCM_E_NONE); 10066 case bcmFieldActionMplsLabel1ExpNew: 10067 if (SOC_IS_TOMAHAWK2(unit) || 10068 SOC_IS_TOMAHAWK3(unit) || SOC_IS_TRIDENT3X(unit)) { 10069 *result = (stage == _BCM_FIELD_STAGE_EGRESS); 10070 } else { 10071 *result = FALSE; 10072 } 10073 return BCM_E_NONE; 10074 #if defined(BCM_FLOWTRACKER_SUPPORT) 10075 case bcmFieldActionFlowtrackerGroupId: 10076 case bcmFieldActionFlowtrackerEnable: 10077 case bcmFieldActionFlowtrackerNewLearnEnable: 10078 *result = (stage == _BCM_FIELD_STAGE_FLOWTRACKER); 10079 return BCM_E_NONE; 10080 #endif 10081 default: 10082 ; 10083 } 10084 10085 return (_bcm_field_td2_stage_action_support_check(unit, stage, 10086 action, result)); 10087 } 10088 10089 /* 10090 * Function: 10091 * _bcm_field_th_stage_action_support_check 10092 * Purpose: 10093 * Check if action is supported by tomahawk for the given stage. 10094 * Parameters: 10095 * unit - (IN) BCM device number. 10096 * stage - (IN) Field processor stage. 10097 * action - (IN) Action to check(bcmFieldActionXXX) 10098 * result - (OUT) 10099 * TRUE - action is supported by device 10100 * FALSE - action is NOT supported by device 10101 * Returns: 10102 * BCM_E_XXX 10103 */ 10104 int 10105 _bcm_field_th_stage_action_support_check(int unit, 10106 unsigned stage, 10107 bcm_field_action_t action, 10108 int *result) 10109 { 10110 #if defined (BCM_TOMAHAWK3_SUPPORT) 10111 if (SOC_IS_TOMAHAWK3(unit)) { 10112 return (_field_th3_stage_action_support_check(unit, 10113 stage, 10114 action, 10115 result)); 10116 } 10117 #endif 10118 return _field_th_stage_action_support_check(unit, stage, action, result); 10119 } 10120 10121 /* 10122 * Function: 10123 * _bcm_field_th_action_support_check 10124 * Purpose: 10125 * Check if action is supported by tomahawk for the given stage. 10126 * Parameters: 10127 * unit - (IN) BCM device number. 10128 * f_ent - (IN) Field entry structure to get policy info from. 10129 * action - (IN) Action to check(bcmFieldActionXXX) 10130 * result - (OUT) 10131 * TRUE - action is supported by device 10132 * FALSE - action is NOT supported by device 10133 * Returns: 10134 * BCM_E_XXX 10135 */ 10136 int 10137 _bcm_field_th_action_support_check(int unit, 10138 _field_entry_t *f_ent, 10139 bcm_field_action_t action, 10140 int *result) 10141 { 10142 return _bcm_field_th_stage_action_support_check(unit, 10143 f_ent->group->stage_id, 10144 action, result); 10145 } 10146 10147 /* 10148 * Function: 10149 * _bcm_field_th_mirror_resolve 10150 * Purpose: 10151 * Resolve mirroring destination & enable mirroring for rule matching 10152 * packets. 10153 * Parameters: 10154 * unit - (IN) BCM device number 10155 * f_ent - (IN) Entry structure to get policy info from 10156 * fa - (IN) field action 10157 * params - (OUT) Field Action params structure. 10158 * Returns: 10159 * BCM_E_XXX 10160 */ 10161 int 10162 _bcm_field_th_mirror_resolve(int unit, 10163 _field_entry_t *f_ent, 10164 _field_action_t *fa, 10165 _field_action_params_t *params) 10166 { 10167 int rv; /* Operation return status. */ 10168 int mtp_index; /* Index to IM_MIRROR_CONTROL. */ 10169 int mtp_type_index; /* Bit position in MIRROR field. */ 10170 int flexibleMirror; /* Flag to indicate flexible mirroring status. */ 10171 int directedMirror; /* Flag to indicate directed mirroring status. */ 10172 10173 /* Input parameters check. */ 10174 if (NULL == f_ent || NULL == fa || NULL == params) { 10175 return (BCM_E_PARAM); 10176 } 10177 10178 mtp_index = fa->hw_index; 10179 mtp_type_index = mtp_index; 10180 10181 /* shifting the index back since flexible slot shift was done 10182 * prior to this 10183 */ 10184 rv = bcm_esw_switch_control_get(unit,bcmSwitchFlexibleMirrorDestinations, 10185 &flexibleMirror); 10186 BCM_IF_ERROR_RETURN(rv); 10187 10188 rv = bcm_esw_switch_control_get(unit,bcmSwitchDirectedMirroring, 10189 &directedMirror); 10190 BCM_IF_ERROR_RETURN(rv); 10191 10192 if (soc_feature(unit, soc_feature_mirror_flexible) 10193 && flexibleMirror && directedMirror) { 10194 mtp_index = (fa->hw_index & BCM_MIRROR_MTP_FLEX_SLOT_MASK); 10195 mtp_type_index = ((fa->hw_index >> BCM_MIRROR_MTP_FLEX_SLOT_SHIFT) 10196 & BCM_MIRROR_MTP_FLEX_SLOT_MASK); 10197 } 10198 10199 /* For Tomahawk Ingress and Egress Mirror together supports 4 MTP's. */ 10200 if (mtp_type_index >= 4) { 10201 fa->hw_index = _FP_INVALID_INDEX; 10202 return (BCM_E_INTERNAL); 10203 } 10204 10205 10206 params->mtp_index = mtp_index; 10207 params->mtp_type_index = mtp_type_index; 10208 10209 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters: "))); 10210 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10211 "MTP Index = %d, "), params->mtp_index)); 10212 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10213 "MTP Type Index = %d, "), params->mtp_type_index)); 10214 10215 return (BCM_E_NONE); 10216 } 10217 /* 10218 * Function: 10219 * _bcm_field_th_cosq_resolve 10220 * Purpose: 10221 * Resolve field action parameters for cosq actions. 10222 * Parameters: 10223 * unit - (IN) BCM device number 10224 * f_ent - (IN) Field entry structure. 10225 * fa - (IN) Field action structure. 10226 * params - (OUT) Field Action params structure. 10227 * Returns: 10228 * BCM_E_XXX 10229 */ 10230 int 10231 _bcm_field_th_cosq_resolve(int unit, _field_entry_t *f_ent, 10232 _field_action_t *fa, 10233 _field_action_params_t *params) 10234 { 10235 int rv; /* Operation return status. */ 10236 int cosq_new; /* New Cosq Value. */ 10237 uint32 cosq; /* Cosq Value passed by User. */ 10238 10239 if (NULL == f_ent || NULL == fa || NULL == params) { 10240 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 10241 return BCM_E_PARAM; 10242 } 10243 10244 cosq = fa->param[0]; 10245 cosq_new = -1; 10246 switch (fa->action) { 10247 case bcmFieldActionCosQNew: 10248 case bcmFieldActionGpCosQNew: 10249 case bcmFieldActionYpCosQNew: 10250 case bcmFieldActionRpCosQNew: 10251 case bcmFieldActionUcastCosQNew: 10252 case bcmFieldActionGpUcastCosQNew: 10253 case bcmFieldActionYpUcastCosQNew: 10254 case bcmFieldActionRpUcastCosQNew: 10255 if (BCM_GPORT_IS_UCAST_QUEUE_GROUP(cosq)) { 10256 rv = _bcm_th_cosq_index_resolve(unit, cosq, 0, 10257 _BCM_TH_COSQ_INDEX_STYLE_UCAST_QUEUE, NULL, 10258 &cosq_new, NULL); 10259 BCM_IF_ERROR_RETURN(rv); 10260 } else { 10261 cosq_new = cosq; 10262 } 10263 break; 10264 case bcmFieldActionMcastCosQNew: 10265 case bcmFieldActionGpMcastCosQNew: 10266 case bcmFieldActionYpMcastCosQNew: 10267 case bcmFieldActionRpMcastCosQNew: 10268 if (BCM_GPORT_IS_MCAST_QUEUE_GROUP(cosq)) { 10269 rv = _bcm_th_cosq_index_resolve(unit, cosq, 0, 10270 _BCM_TH_COSQ_INDEX_STYLE_MCAST_QUEUE, NULL, 10271 &cosq_new, NULL); 10272 BCM_IF_ERROR_RETURN(rv); 10273 } else { 10274 cosq_new = cosq; 10275 } 10276 break; 10277 case bcmFieldActionCosMapNew: 10278 case bcmFieldActionGpCosMapNew: 10279 case bcmFieldActionYpCosMapNew: 10280 case bcmFieldActionRpCosMapNew: 10281 if (_BCM_COSQ_CLASSIFIER_IS_FIELD(cosq)) { 10282 cosq_new = _BCM_COSQ_CLASSIFIER_FIELD_GET(cosq); 10283 } 10284 break; 10285 default: 10286 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10287 "%s can't be resolved.\n"), action_name[fa->action])); 10288 return BCM_E_UNAVAIL; 10289 } 10290 10291 if (-1 == cosq_new) { 10292 return BCM_E_PARAM; 10293 } 10294 10295 params->cosq_new = cosq_new; 10296 10297 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10298 "Resolved Parameters:\n cosq_new = %d \n"), params->cosq_new)); 10299 return BCM_E_NONE; 10300 } 10301 /* 10302 * Function: 10303 * _bcm_field_th_fabric_tag_resolve 10304 * Purpose: 10305 * Resolve field action parameters for action bcmFieldActionFabricQueue. 10306 * Parameters: 10307 * unit - (IN) BCM device number 10308 * f_ent - (IN) Field entry structure. 10309 * fa - (IN) Field action structure. 10310 * params - (OUT) Field Action params structure. 10311 * Returns: 10312 * BCM_E_XXX 10313 */ 10314 int _bcm_field_th_fabric_tag_resolve(int unit, _field_entry_t *f_ent, 10315 _field_action_t *fa, 10316 _field_action_params_t *params) 10317 { 10318 uint8 fabric_tag_type; /* Fabric Tag Type. */ 10319 uint32 in_flags; /* Incoming Fabric Queue Flags. */ 10320 uint32 fabric_tag; /* Fabric Tag Value. */ 10321 10322 if (NULL == f_ent || NULL == fa || NULL == params) { 10323 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 10324 return BCM_E_PARAM; 10325 } 10326 10327 in_flags = fa->param[0]; 10328 10329 if ((in_flags & BCM_FABRIC_QUEUE_QOS_BASE) && 10330 (in_flags & BCM_FABRIC_QUEUE_DEST_OFFSET)) { 10331 return (BCM_E_PARAM); 10332 } 10333 10334 if (in_flags & 10335 ~(BCM_FABRIC_QUEUE_CUSTOMER | 10336 BCM_FABRIC_QUEUE_QOS_BASE | 10337 BCM_FABRIC_QUEUE_DEST_OFFSET | 10338 0xffff)) { 10339 return (BCM_E_PARAM); 10340 } 10341 10342 /* Tag type resolution. */ 10343 if (in_flags & BCM_FABRIC_QUEUE_QOS_BASE) { 10344 fabric_tag_type = 0x3; /* Offset to base queue number from the 10345 QUEUE_MAP Table. Index into QUEUE_MAP 10346 Table is {DST_MODID, DST_PID} */ 10347 } else if (in_flags & BCM_FABRIC_QUEUE_DEST_OFFSET) { 10348 fabric_tag_type = 0x2; /* Index into QUEUE_MAP Table used 10349 for lookup.*/ 10350 } else { 10351 fabric_tag_type = 0x1; /* Explicit queue number. */ 10352 } 10353 10354 fabric_tag = in_flags & 0xffff; 10355 10356 params->fabric_tag_type = fabric_tag_type; 10357 params->fabric_tag = fabric_tag; 10358 10359 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters:\n"))); 10360 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10361 "fabric_tag_type = %d \n fabric_tag = %d\n"), 10362 params->fabric_tag_type, params->fabric_tag)); 10363 return BCM_E_NONE; 10364 } 10365 /* 10366 * Function: 10367 * _bcm_field_th_i2e_class_resolve 10368 * Purpose: 10369 * Resolve field action parameters for action 10370 * bcmFieldActionEgressClassSelect. 10371 * Parameters: 10372 * unit - (IN) BCM device number 10373 * f_ent - (IN) Field entry structure. 10374 * fa - (IN) Field action structure. 10375 * params - (OUT) Field Action params structure. 10376 * Returns: 10377 * BCM_E_XXX 10378 */ 10379 int 10380 _bcm_field_th_i2e_class_resolve(int unit, _field_entry_t *f_ent, 10381 _field_action_t *fa, 10382 _field_action_params_t *params) 10383 { 10384 uint32 i2e_cl_sel; /* Ingress to Egress Class Selector. */ 10385 10386 if (NULL == f_ent || NULL == fa || NULL == params) { 10387 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 10388 return BCM_E_PARAM; 10389 } 10390 10391 switch (fa->param[0]) { 10392 case BCM_FIELD_EGRESS_CLASS_SELECT_PORT: 10393 i2e_cl_sel = 0x1; 10394 break; 10395 case BCM_FIELD_EGRESS_CLASS_SELECT_SVP: 10396 i2e_cl_sel = 0x2; 10397 break; 10398 case BCM_FIELD_EGRESS_CLASS_SELECT_L3_IIF: 10399 i2e_cl_sel = 0x3; 10400 break; 10401 case BCM_FIELD_EGRESS_CLASS_SELECT_FIELD_SRC: 10402 i2e_cl_sel = 0x4; /* VFP hi */ 10403 break; 10404 case BCM_FIELD_EGRESS_CLASS_SELECT_FIELD_DST: 10405 i2e_cl_sel = 0x5; /* VFP lo */ 10406 break; 10407 case BCM_FIELD_EGRESS_CLASS_SELECT_L2_SRC: 10408 i2e_cl_sel = 0x6; 10409 break; 10410 case BCM_FIELD_EGRESS_CLASS_SELECT_L2_DST: 10411 i2e_cl_sel = 0x7; 10412 break; 10413 case BCM_FIELD_EGRESS_CLASS_SELECT_L3_SRC: 10414 i2e_cl_sel = 0x8; 10415 break; 10416 case BCM_FIELD_EGRESS_CLASS_SELECT_L3_DST: 10417 i2e_cl_sel = 0x9; 10418 break; 10419 case BCM_FIELD_EGRESS_CLASS_SELECT_VLAN: 10420 i2e_cl_sel = 0xa; 10421 break; 10422 case BCM_FIELD_EGRESS_CLASS_SELECT_VRF: 10423 i2e_cl_sel = 0xb; 10424 break; 10425 case BCM_FIELD_EGRESS_CLASS_SELECT_NEW: 10426 i2e_cl_sel = 0xf; 10427 break; 10428 default: 10429 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10430 "Invalid i2e class selector: %d.\n"), fa->param[0])); 10431 return (BCM_E_PARAM); 10432 } 10433 10434 params->i2e_cl_sel = i2e_cl_sel; 10435 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10436 "Resolved Parameters:\n i2e_cl_sel = %d \n"), params->i2e_cl_sel)); 10437 return BCM_E_NONE; 10438 } 10439 /* 10440 * Function: 10441 * _bcm_field_th_i2e_hg_class_resolve 10442 * Purpose: 10443 * Resolve field action parameters for action bcmFieldActionHiGigClassSelect 10444 * Parameters: 10445 * unit - (IN) BCM device number 10446 * f_ent - (IN) Field entry structure. 10447 * fa - (IN) Field action structure. 10448 * params - (OUT) Field Action params structure. 10449 * Returns: 10450 * BCM_E_XXX 10451 */ 10452 int 10453 _bcm_field_th_i2e_hg_class_resolve(int unit, _field_entry_t *f_ent, 10454 _field_action_t *fa, 10455 _field_action_params_t *params) 10456 { 10457 uint32 i2e_hg_cl_sel; /* Ingress to Egress HiGiG Class selector. */ 10458 10459 if (NULL == f_ent || NULL == fa || NULL == params) { 10460 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 10461 return BCM_E_PARAM; 10462 } 10463 10464 switch (fa->param[0]) { 10465 case BCM_FIELD_HIGIG_CLASS_SELECT_EGRESS: 10466 i2e_hg_cl_sel = 1; 10467 break; 10468 case BCM_FIELD_HIGIG_CLASS_SELECT_PORT: 10469 i2e_hg_cl_sel = 4; 10470 break; 10471 default: 10472 /* Invalid parameter should have been caught earlier */ 10473 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10474 "Invalid i2e higig class selector: %d.\n"), fa->param[0])); 10475 return (BCM_E_PARAM); 10476 } 10477 10478 params->i2e_hg_cl_sel = i2e_hg_cl_sel; 10479 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters:\n"))); 10480 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10481 "i2e_hg_cl_sel = %d \n"), params->i2e_hg_cl_sel)); 10482 return BCM_E_NONE; 10483 } 10484 #ifdef INCLUDE_L3 10485 /* 10486 * Function: 10487 * _bcm_field_th_nat_resolve 10488 * Purpose: 10489 * Resolve field action parameters for actions in IFP_NAT_SET. 10490 * Parameters: 10491 * unit - (IN) BCM device number 10492 * f_ent - (IN) Field entry structure. 10493 * fa - (IN) Field action structure. 10494 * params - (OUT) Field Action params structure. 10495 * Returns: 10496 * BCM_E_XXX 10497 */ 10498 int 10499 _bcm_field_th_nat_resolve(int unit, _field_entry_t *f_ent, 10500 _field_action_t *fa, 10501 _field_action_params_t *params) 10502 { 10503 int32 hw_idx; 10504 int32 hw_half; 10505 10506 if (NULL == f_ent || NULL == fa || NULL == params) { 10507 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 10508 return BCM_E_PARAM; 10509 } 10510 10511 hw_idx = hw_half = 0; 10512 BCM_L3_NAT_EGRESS_HW_IDX_GET(fa->param[0], hw_idx, hw_half); 10513 if ((hw_idx < 0) || (hw_idx > soc_mem_index_max(unit, 10514 EGR_NAT_PACKET_EDIT_INFOm))) { 10515 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Invalid Parameters.\n"))); 10516 return BCM_E_PARAM; 10517 } 10518 10519 params->hw_idx = hw_idx; 10520 params->hw_half = hw_half; 10521 10522 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters:\n"))); 10523 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10524 "hw_idx = %d \n hw_half = %d \n"), 10525 params->hw_idx, params->hw_half)); 10526 return BCM_E_NONE; 10527 10528 } 10529 #endif 10530 /* 10531 * Function: 10532 * _bcm_field_th_redirect_resolve 10533 * Purpose: 10534 * Resolve field action parameters for actions in IFP_REDIRECT_SET. 10535 * Parameters: 10536 * unit - (IN) BCM device number 10537 * f_ent - (IN) Field entry structure. 10538 * fa - (IN) Field action structure. 10539 * params - (OUT) Field Action params structure. 10540 * Returns: 10541 * BCM_E_XXX 10542 */ 10543 int 10544 _bcm_field_th_redirect_resolve(int unit, _field_entry_t *f_ent, 10545 _field_action_t *fa, 10546 _field_action_params_t *params) 10547 { 10548 int nh_ecmp_id; /* Next Hop or ECMP Id. */ 10549 uint8 is_dvp; /* Redirect to DVP. */ 10550 uint8 is_trunk; /* Redirect to Trunk. */ 10551 uint8 eh_tag_mask_index; /* Pointer to the EH_MASK_PROFILE_TABLE. */ 10552 uint8 ucast_redirect_control; /* Unicast Redirection Control. */ 10553 uint8 mcast_redirect_control; /* Multicast Redirection Control. */ 10554 uint32 flags; /* Field Action Flags. */ 10555 uint32 redir_field; /* Dest object to redirect the packet. */ 10556 uint32 eh_tag; /* HiGiG extended header. */ 10557 #ifdef INCLUDE_L3 10558 int ifp_type = 0; /* Egress object entry type. */ 10559 #endif 10560 10561 if (NULL == fa || NULL == f_ent || NULL == params) { 10562 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 10563 return (BCM_E_PARAM); 10564 } 10565 10566 nh_ecmp_id = -1; 10567 is_dvp = 0; 10568 is_trunk = 0; 10569 ucast_redirect_control = 0; 10570 mcast_redirect_control = 0; 10571 flags = 0; 10572 redir_field = 0; 10573 eh_tag = 0; 10574 eh_tag_mask_index = 0; 10575 10576 switch (fa->action) { 10577 case bcmFieldActionRedirect: /* param0 = modid, param1 = port*/ 10578 ucast_redirect_control = 0x6; 10579 if (BCM_GPORT_IS_MPLS_PORT(fa->param[1])) { 10580 redir_field = BCM_GPORT_MPLS_PORT_ID_GET((int)fa->param[1]); 10581 is_dvp = 1; 10582 } else if (BCM_GPORT_IS_MIM_PORT(fa->param[1])) { 10583 redir_field = BCM_GPORT_MIM_PORT_ID_GET((int)fa->param[1]); 10584 is_dvp = 1; 10585 } else if (BCM_GPORT_IS_VXLAN_PORT(fa->param[1])) { 10586 redir_field = BCM_GPORT_VXLAN_PORT_ID_GET((int)fa->param[1]); 10587 is_dvp = 1; 10588 } else if (BCM_GPORT_IS_FLOW_PORT(fa->param[1])) { 10589 redir_field = BCM_GPORT_FLOW_PORT_ID_GET((int)fa->param[1]); 10590 is_dvp = 1; 10591 } else if (BCM_GPORT_IS_TRILL_PORT(fa->param[1])) { 10592 redir_field = BCM_GPORT_TRILL_PORT_ID_GET((int)fa->param[1]); 10593 is_dvp = 1; 10594 } else if (BCM_GPORT_IS_L2GRE_PORT(fa->param[1])) { 10595 redir_field = BCM_GPORT_L2GRE_PORT_ID_GET((int)fa->param[1]); 10596 is_dvp = 1; 10597 } else if (BCM_GPORT_IS_NIV_PORT(fa->param[1])) { 10598 redir_field = BCM_GPORT_NIV_PORT_ID_GET((int)fa->param[1]); 10599 is_dvp = 1; 10600 } else { 10601 redir_field = ((fa->param[0] & 0xff) << 8); 10602 redir_field |= (fa->param[1] & 0xff); 10603 ucast_redirect_control = 0x0; 10604 is_trunk = 0; 10605 } 10606 break; 10607 case bcmFieldActionRedirectTrunk: /* param0 = trunk ID */ 10608 #if defined(BCM_TRIDENT2_SUPPORT) && defined(INCLUDE_L3) 10609 if (soc_feature(unit, soc_feature_vp_lag)) { 10610 int tid_is_vp_lag = 0; 10611 int vp = -1; 10612 int vp_id_min = -1; 10613 int rv = BCM_E_NONE; 10614 rv = _bcm_esw_trunk_id_is_vp_lag(unit, fa->param[0], 10615 &tid_is_vp_lag); 10616 BCM_IF_ERROR_RETURN(rv); 10617 10618 if (tid_is_vp_lag) { 10619 10620 rv = _bcm_esw_trunk_tid_to_vp_lag_vp(unit, 10621 fa->param[0], &vp); 10622 BCM_IF_ERROR_RETURN(rv); 10623 10624 if (_bcm_vp_used_get(unit, vp, _bcmVpTypeVpLag)) { 10625 rv =_bcm_esw_trunk_chip_info_vp_resource_get(unit, 10626 &vp_id_min, 10627 NULL, NULL); 10628 BCM_IF_ERROR_RETURN(rv); 10629 redir_field = fa->param[0] - vp_id_min; 10630 is_dvp = 1; 10631 } else { 10632 return BCM_E_PARAM; 10633 } 10634 } else { 10635 redir_field = fa->param[0]; 10636 } 10637 } else 10638 #endif 10639 { 10640 redir_field = fa->param[0]; 10641 } 10642 ucast_redirect_control = 0; 10643 is_trunk = 1; 10644 break; 10645 case bcmFieldActionRedirectCancel: 10646 break; 10647 case bcmFieldActionRedirectPbmp: 10648 redir_field = fa->hw_index; 10649 mcast_redirect_control = 0x0; 10650 break; 10651 case bcmFieldActionEgressMask: 10652 redir_field = fa->hw_index; 10653 break; 10654 case bcmFieldActionEgressPortsAdd: 10655 redir_field = fa->hw_index; 10656 break; 10657 case bcmFieldActionFabricEHAddOrUpdate: 10658 eh_tag = fa->param[0]; 10659 eh_tag_mask_index = fa->hw_index; 10660 break; 10661 #ifdef INCLUDE_L3 10662 case bcmFieldActionRedirectIpmc: 10663 if (soc_feature(unit, soc_feature_field_action_redirect_ipmc)) { 10664 if (_BCM_MULTICAST_IS_SET(fa->param[0])) { 10665 redir_field = _BCM_MULTICAST_ID_GET(fa->param[0]); 10666 } else { 10667 redir_field = fa->param[0]; 10668 } 10669 } else { 10670 redir_field = fa->hw_index; 10671 } 10672 mcast_redirect_control = 0x3; 10673 break; 10674 case bcmFieldActionRedirectEgrNextHop: 10675 if ((!soc_feature(unit, soc_feature_nh_for_ifp_actions)) && 10676 (fa->param[1] == bcmFieldRedirectTypeAll)) { 10677 return BCM_E_UNAVAIL; 10678 } 10679 10680 /* Get next hop info from Egress Object ID param */ 10681 BCM_IF_ERROR_RETURN 10682 (_bcm_field_l3_egr_object_ifp_type_index_get(unit, fa->param[0], 10683 &ifp_type, &flags, &nh_ecmp_id)); 10684 /* Valid redirect type param */ 10685 if (!(((fa->param[1] == bcmFieldRedirectTypeAll) && 10686 (ifp_type == TRUE)) || 10687 ((fa->param[1] == bcmFieldRedirectTypeL3) && 10688 (ifp_type == FALSE)))) { 10689 return BCM_E_PARAM; 10690 } 10691 10692 if (flags & BCM_L3_MULTIPATH) { 10693 /* Param0 - ECMP next hop */ 10694 if (0 == soc_feature(unit, 10695 soc_feature_field_action_redirect_ecmp)) { 10696 return (BCM_E_PARAM); 10697 } 10698 ucast_redirect_control = 0x3; 10699 } else { 10700 ucast_redirect_control = 0x2; 10701 } 10702 break; 10703 #endif /* INCLUDE_L3 */ 10704 case bcmFieldActionRedirectMcast: 10705 if (soc_feature(unit, soc_feature_field_action_redirect_ipmc)) { 10706 if (_BCM_MULTICAST_IS_SET(fa->param[0])) { 10707 if (0 == _BCM_MULTICAST_IS_L2(fa->param[0])) { 10708 return (BCM_E_PARAM); 10709 } 10710 redir_field = _BCM_MULTICAST_ID_GET(fa->param[0]); 10711 } else { 10712 redir_field = fa->param[0]; 10713 } 10714 } else { 10715 redir_field = fa->hw_index; 10716 } 10717 mcast_redirect_control = 0x2; 10718 break; 10719 case bcmFieldActionRedirectVlan: 10720 mcast_redirect_control = 0x1; 10721 break; 10722 case bcmFieldActionRedirectBcastPbmp: 10723 redir_field = fa->hw_index; 10724 mcast_redirect_control = 0x1; 10725 break; 10726 case bcmFieldActionUnmodifiedPacketRedirectPort: 10727 if (BCM_GPORT_IS_MODPORT(fa->param[0])) { 10728 redir_field = ((BCM_GPORT_MODPORT_MODID_GET( 10729 fa->param[0]) & 0xff) << 8); 10730 redir_field |= (BCM_GPORT_MODPORT_PORT_GET( 10731 fa->param[0]) & 0xff); 10732 is_trunk = 0; 10733 } else if (BCM_GPORT_IS_TRUNK(fa->param[0])) { 10734 redir_field = 0x1 << 17; 10735 redir_field |= BCM_GPORT_TRUNK_GET(fa->param[0]); 10736 is_trunk = 1; 10737 } else { 10738 redir_field = ((fa->param[0] & 0xff) << 8); 10739 redir_field |= (fa->param[1] & 0xff); 10740 is_trunk = 0; 10741 } 10742 ucast_redirect_control = 0x1; 10743 break; 10744 default: 10745 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10746 "%s can't be resolved.\n"), action_name[fa->action])); 10747 return (BCM_E_UNAVAIL); 10748 } 10749 10750 params->flags |= flags; 10751 params->is_dvp = is_dvp; 10752 params->is_trunk = is_trunk; 10753 params->nh_ecmp_id = nh_ecmp_id; 10754 params->redirect_value = redir_field; 10755 params->ucast_redirect_control = ucast_redirect_control; 10756 params->mcast_redirect_control = mcast_redirect_control; 10757 params->eh_tag = eh_tag; 10758 params->eh_tag_mask_index = eh_tag_mask_index; 10759 10760 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters:\n"))); 10761 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10762 "is_dvp = %d \n"), params->is_dvp)); 10763 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10764 "is_trunk = %d \n"), params->is_trunk)); 10765 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10766 "nh_ecmp_id = %d \n"), params->nh_ecmp_id)); 10767 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10768 "redirect_value = %d \n"), params->redirect_value)); 10769 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10770 "ucast_redirect_control = %d \n"), 10771 params->ucast_redirect_control)); 10772 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10773 "mcast_redirect_control = %d \n"), 10774 params->mcast_redirect_control)); 10775 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10776 "HiGiG Extended Header = %d \n"), 10777 params->eh_tag)); 10778 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10779 "HiGiG Extended Header Mask Index = %d \n"), 10780 params->eh_tag_mask_index)); 10781 10782 return (BCM_E_NONE); 10783 } 10784 /* 10785 * Function: 10786 * _bcm_field_th_l3swl2change_resolve 10787 * Purpose: 10788 * Resolve field action parameters for actions in IFP_L3SW_L2_CHANGE_SET. 10789 * Parameters: 10790 * unit - (IN) BCM device number 10791 * f_ent - (IN) Field entry structure. 10792 * fa - (IN) Field action structure. 10793 * params - (OUT) Field Action params structure. 10794 * Returns: 10795 * BCM_E_XXX 10796 */ 10797 int 10798 _bcm_field_th_l3swl2change_resolve(int unit, 10799 _field_entry_t *f_ent, 10800 _field_action_t *fa, 10801 _field_action_params_t *params) 10802 { 10803 int rv; /* Operation return status. */ 10804 int nh_ecmp_id; /* Next Hop or ECMP Id. */ 10805 uint32 flags; /* Multippath Flags. */ 10806 #if defined INCLUDE_L3 10807 int ifp_type = 0; /* Egress object entry type. */ 10808 #endif 10809 10810 if (NULL == fa || NULL == f_ent || NULL == params) { 10811 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 10812 return (BCM_E_PARAM); 10813 } 10814 10815 #if defined INCLUDE_L3 10816 rv = _bcm_field_l3_egr_object_ifp_type_index_get(unit, fa->param[0], 10817 &ifp_type, &flags, &nh_ecmp_id); 10818 BCM_IF_ERROR_RETURN(rv); 10819 #endif /* INCLUDE_L3 */ 10820 10821 switch (fa->action) { 10822 case bcmFieldActionL3Switch: 10823 #if defined INCLUDE_L3 10824 if (ifp_type == TRUE) { 10825 return BCM_E_PARAM; 10826 } 10827 #else 10828 return BCM_E_UNAVAIL; 10829 #endif 10830 break; 10831 case bcmFieldActionChangeL2Fields: 10832 #if defined INCLUDE_L3 10833 if (ifp_type == FALSE) { 10834 return BCM_E_PARAM; 10835 } 10836 fa->hw_index = nh_ecmp_id; 10837 #else 10838 return BCM_E_UNAVAIL; 10839 #endif 10840 break; 10841 default: 10842 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10843 "%s can't be resolved.\n"), action_name[fa->action])); 10844 return BCM_E_UNAVAIL; 10845 } 10846 10847 params->flags |= flags; 10848 params->nh_ecmp_id = nh_ecmp_id; 10849 10850 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters:\n"))); 10851 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10852 "flags = %d \n nh_ecmp_id = %d \n"), 10853 params->flags, params->nh_ecmp_id)); 10854 return rv; 10855 } 10856 /* 10857 * Function: 10858 * _bcm_field_th_action_resolve 10859 * Purpose: 10860 * Resolve field action parameters. 10861 * Parameters: 10862 * unit - (IN) BCM device number 10863 * f_ent - (IN) Field entry structure. 10864 * fa - (IN) Field action structure. 10865 * params - (OUT) Field Action params structure. 10866 * Returns: 10867 * BCM_E_XXX 10868 */ 10869 int 10870 _bcm_field_action_resolve(int unit, _field_entry_t *f_ent, 10871 _field_action_t *fa, _field_action_params_t *params) 10872 { 10873 if (NULL == f_ent || NULL == fa || NULL == params) { 10874 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 10875 return BCM_E_PARAM; 10876 } 10877 10878 switch (fa->action) { 10879 /* Actions from PROFILE_SET_1 */ 10880 case bcmFieldActionCosQNew: 10881 case bcmFieldActionGpCosQNew: 10882 case bcmFieldActionYpCosQNew: 10883 case bcmFieldActionRpCosQNew: 10884 case bcmFieldActionUcastCosQNew: 10885 case bcmFieldActionGpUcastCosQNew: 10886 case bcmFieldActionYpUcastCosQNew: 10887 case bcmFieldActionRpUcastCosQNew: 10888 case bcmFieldActionMcastCosQNew: 10889 case bcmFieldActionGpMcastCosQNew: 10890 case bcmFieldActionYpMcastCosQNew: 10891 case bcmFieldActionRpMcastCosQNew: 10892 case bcmFieldActionCosMapNew: 10893 case bcmFieldActionGpCosMapNew: 10894 case bcmFieldActionYpCosMapNew: 10895 case bcmFieldActionRpCosMapNew: 10896 return _bcm_field_th_cosq_resolve(unit, f_ent, fa, params); 10897 case bcmFieldActionEgressClassSelect: 10898 return _bcm_field_th_i2e_class_resolve(unit, f_ent, fa, params); 10899 case bcmFieldActionHiGigClassSelect: 10900 return _bcm_field_th_i2e_hg_class_resolve(unit, f_ent, fa, params); 10901 case bcmFieldActionFabricQueue: 10902 return _bcm_field_th_fabric_tag_resolve(unit, f_ent, fa, params); 10903 #ifdef INCLUDE_L3 10904 case bcmFieldActionL3Switch: 10905 case bcmFieldActionChangeL2Fields: 10906 return _bcm_field_th_l3swl2change_resolve(unit, f_ent, fa, params); 10907 case bcmFieldActionNatEgressOverride: 10908 return _bcm_field_th_nat_resolve(unit, f_ent, fa, params); 10909 #endif 10910 case bcmFieldActionRedirect: 10911 case bcmFieldActionRedirectTrunk: 10912 case bcmFieldActionUnmodifiedPacketRedirectPort: 10913 case bcmFieldActionRedirectMcast: 10914 #ifdef INCLUDE_L3 10915 case bcmFieldActionRedirectEgrNextHop: 10916 case bcmFieldActionRedirectIpmc: 10917 #endif 10918 case bcmFieldActionRedirectCancel: 10919 case bcmFieldActionRedirectPbmp: 10920 case bcmFieldActionRedirectVlan: 10921 case bcmFieldActionRedirectBcastPbmp: 10922 case bcmFieldActionEgressMask: 10923 case bcmFieldActionEgressPortsAdd: 10924 case bcmFieldActionFabricEHAddOrUpdate: 10925 return _bcm_field_th_redirect_resolve(unit, f_ent, fa, params); 10926 case bcmFieldActionMirrorIngress: 10927 case bcmFieldActionMirrorEgress: 10928 return _bcm_field_th_mirror_resolve(unit, f_ent, fa, params); 10929 default: 10930 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 10931 "%s can't be resolved.\n"), action_name[fa->action])); 10932 return BCM_E_UNAVAIL; 10933 } 10934 10935 return BCM_E_NONE; 10936 } 10937 /* 10938 * Function: 10939 * _bcm_field_th_ingress_action_params_check 10940 * Purpose: 10941 * Check field action parameters. 10942 * Parameters: 10943 * unit - (IN) BCM device number 10944 * f_ent - (IN) Field entry structure. 10945 * fa - (IN) Field action structure. 10946 * action - (IN) Field Action of type bcmFieldActionXXX. 10947 * Returns: 10948 * BCM_E_XXX 10949 */ 10950 int 10951 _bcm_field_th_ingress_action_params_check(int unit, 10952 _field_entry_t *f_ent, 10953 _field_action_t *fa) 10954 { 10955 int rv; /* Operation return status. */ 10956 _field_stage_t *stage_fc; /* Field Stage Structure. */ 10957 _field_action_params_t params; /* Field Params Structutre. */ 10958 _bcm_field_action_offset_t a_offset; /* Field Offset Structure. */ 10959 bcm_field_action_t action; /* Field Action of Type bcmFieldActionXXX. */ 10960 #ifdef INCLUDE_L3 10961 int redir_field = -1; 10962 #endif 10963 #if defined (BCM_TOMAHAWK3_SUPPORT) 10964 int ref_count = -1; /* For Mirror Zeroing */ 10965 #endif 10966 10967 if (NULL == f_ent || 10968 NULL == fa) { 10969 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 10970 return BCM_E_PARAM; 10971 } 10972 10973 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 10974 BCM_IF_ERROR_RETURN(rv); 10975 10976 sal_memset(¶ms , 0, sizeof(params)); 10977 10978 action = fa->action; 10979 switch (action) { 10980 /* Actions from PROFILE_SET_1 */ 10981 case bcmFieldActionCosQNew: 10982 case bcmFieldActionGpCosQNew: 10983 case bcmFieldActionYpCosQNew: 10984 case bcmFieldActionRpCosQNew: 10985 /* For the xxcosQNew action, the param received is a 4 bit ucosq. 10986 * This value is set for both ucosq (lower 4 bits) and 10987 * mcosq(higher 4 bits) of G/Y/R_COS_INT_PRI. 10988 * Since, param received is only ucosq (4 bit value), it is 10989 * validated against bcmFieldActionGpUcastCosQNew. 10990 */ 10991 10992 action = bcmFieldActionGpUcastCosQNew; 10993 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 10994 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 10995 ACTION_CHECK(a_offset.width[0], params.cosq_new); 10996 break; 10997 case bcmFieldActionUcastCosQNew: 10998 case bcmFieldActionGpUcastCosQNew: 10999 case bcmFieldActionYpUcastCosQNew: 11000 case bcmFieldActionRpUcastCosQNew: 11001 action = bcmFieldActionGpUcastCosQNew; 11002 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11003 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11004 ACTION_CHECK(a_offset.width[0], params.cosq_new); 11005 break; 11006 case bcmFieldActionMcastCosQNew: 11007 case bcmFieldActionGpMcastCosQNew: 11008 case bcmFieldActionYpMcastCosQNew: 11009 case bcmFieldActionRpMcastCosQNew: 11010 action = bcmFieldActionGpMcastCosQNew; 11011 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11012 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11013 ACTION_CHECK(a_offset.width[0], params.cosq_new); 11014 break; 11015 case bcmFieldActionPrioIntNew: 11016 case bcmFieldActionGpPrioIntNew: 11017 case bcmFieldActionYpPrioIntNew: 11018 case bcmFieldActionRpPrioIntNew: 11019 case bcmFieldActionPrioPktAndIntNew: 11020 case bcmFieldActionRpPrioPktAndIntNew: 11021 case bcmFieldActionGpPrioPktAndIntNew: 11022 case bcmFieldActionYpPrioPktAndIntNew: 11023 action = bcmFieldActionGpPrioIntNew; 11024 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11025 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11026 break; 11027 case bcmFieldActionGpIntCongestionNotificationNew: 11028 case bcmFieldActionYpIntCongestionNotificationNew: 11029 case bcmFieldActionRpIntCongestionNotificationNew: 11030 case bcmFieldActionPfcClassNew: 11031 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11032 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11033 break; 11034 case bcmFieldActionDropPrecedence: 11035 case bcmFieldActionGpDropPrecedence: 11036 case bcmFieldActionYpDropPrecedence: 11037 case bcmFieldActionRpDropPrecedence: 11038 action = bcmFieldActionGpDropPrecedence; 11039 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11040 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11041 if ((BCM_FIELD_COLOR_GREEN != fa->param[0]) && (BCM_FIELD_COLOR_RED != fa->param[0]) && 11042 (BCM_FIELD_COLOR_YELLOW != fa->param[0])) { 11043 LOG_ERROR(BSL_LS_BCM_FP, 11044 (BSL_META_U(unit, 11045 "FP: Error: param0 " 11046 "is not a valid Color.\n"))); 11047 return BCM_E_PARAM; 11048 } 11049 break; 11050 case bcmFieldActionUntaggedPacketPriorityNew: 11051 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11052 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11053 break; 11054 case bcmFieldActionCosMapNew: 11055 case bcmFieldActionGpCosMapNew: 11056 case bcmFieldActionYpCosMapNew: 11057 case bcmFieldActionRpCosMapNew: 11058 action = bcmFieldActionGpCosMapNew; 11059 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11060 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11061 ACTION_CHECK(a_offset.width[0], params.cosq_new); 11062 break; 11063 case bcmFieldActionPrioIntCopy: 11064 case bcmFieldActionPrioIntTos: 11065 case bcmFieldActionPrioIntCancel: 11066 case bcmFieldActionGpPrioIntCopy: 11067 case bcmFieldActionGpPrioIntTos: 11068 case bcmFieldActionGpPrioIntCancel: 11069 case bcmFieldActionYpPrioIntCopy: 11070 case bcmFieldActionYpPrioIntTos: 11071 case bcmFieldActionYpPrioIntCancel: 11072 case bcmFieldActionRpPrioIntCopy: 11073 case bcmFieldActionRpPrioIntTos: 11074 case bcmFieldActionRpPrioIntCancel: 11075 break; 11076 /* Actions from PROFILE_SET_2 */ 11077 case bcmFieldActionEcnNew: 11078 case bcmFieldActionGpEcnNew: 11079 case bcmFieldActionYpEcnNew: 11080 case bcmFieldActionRpEcnNew: 11081 action = bcmFieldActionGpEcnNew; 11082 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11083 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11084 break; 11085 case bcmFieldActionPrioPktNew: 11086 case bcmFieldActionGpPrioPktNew: 11087 case bcmFieldActionYpPrioPktNew: 11088 case bcmFieldActionRpPrioPktNew: 11089 action = bcmFieldActionGpPrioPktNew; 11090 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11091 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11092 break; 11093 case bcmFieldActionGpTosPrecedenceNew: 11094 action = bcmFieldActionGpTosPrecedenceNew; 11095 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11096 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11097 break; 11098 case bcmFieldActionDscpNew: 11099 case bcmFieldActionGpDscpNew: 11100 case bcmFieldActionYpDscpNew: 11101 case bcmFieldActionRpDscpNew: 11102 action = bcmFieldActionGpDscpNew; 11103 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11104 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11105 break; 11106 case bcmFieldActionPrioPktCopy: 11107 case bcmFieldActionGpPrioPktCopy: 11108 case bcmFieldActionYpPrioPktCopy: 11109 case bcmFieldActionRpPrioPktCopy: 11110 case bcmFieldActionPrioPktTos: 11111 case bcmFieldActionGpPrioPktTos: 11112 case bcmFieldActionYpPrioPktTos: 11113 case bcmFieldActionRpPrioPktTos: 11114 case bcmFieldActionPrioPktCancel: 11115 case bcmFieldActionGpPrioPktCancel: 11116 case bcmFieldActionYpPrioPktCancel: 11117 case bcmFieldActionRpPrioPktCancel: 11118 case bcmFieldActionDot1pPreserve: 11119 case bcmFieldActionGpDot1pPreserve: 11120 case bcmFieldActionYpDot1pPreserve: 11121 case bcmFieldActionRpDot1pPreserve: 11122 case bcmFieldActionDscpCancel: 11123 case bcmFieldActionGpDscpCancel: 11124 case bcmFieldActionYpDscpCancel: 11125 case bcmFieldActionRpDscpCancel: 11126 case bcmFieldActionDscpPreserve: 11127 case bcmFieldActionGpDscpPreserve: 11128 case bcmFieldActionYpDscpPreserve: 11129 case bcmFieldActionRpDscpPreserve: 11130 case bcmFieldActionGpTosPrecedenceCopy: 11131 case bcmFieldActionPrioPktAndIntCopy: 11132 case bcmFieldActionPrioPktAndIntTos: 11133 case bcmFieldActionPrioPktAndIntCancel: 11134 case bcmFieldActionRpPrioPktAndIntCopy: 11135 case bcmFieldActionRpPrioPktAndIntTos: 11136 case bcmFieldActionRpPrioPktAndIntCancel: 11137 case bcmFieldActionGpPrioPktAndIntCopy: 11138 case bcmFieldActionGpPrioPktAndIntTos: 11139 case bcmFieldActionGpPrioPktAndIntCancel: 11140 case bcmFieldActionYpPrioPktAndIntCopy: 11141 case bcmFieldActionYpPrioPktAndIntTos: 11142 case bcmFieldActionYpPrioPktAndIntCancel: 11143 break; 11144 /* Actions from L3SW_CHANGE_L2_SWT */ 11145 case bcmFieldActionEgressClassSelect: 11146 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11147 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11148 ACTION_CHECK(a_offset.width[0], params.i2e_cl_sel); 11149 break; 11150 case bcmFieldActionHiGigClassSelect: 11151 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11152 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11153 ACTION_CHECK(a_offset.width[0], params.i2e_hg_cl_sel); 11154 break; 11155 case bcmFieldActionNewClassId: 11156 case bcmFieldActionMultipathHash: 11157 case bcmFieldActionAddClassTag: 11158 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11159 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11160 break; 11161 case bcmFieldActionFabricQueue: 11162 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11163 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11164 ACTION_CHECK(a_offset.width[0], params.fabric_tag_type); 11165 ACTION_CHECK(a_offset.width[1], params.fabric_tag); 11166 break; 11167 case bcmFieldActionL3Switch: 11168 #if defined INCLUDE_L3 11169 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11170 if (params.flags & BCM_L3_MULTIPATH) { 11171 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 11172 _BCM_FIELD_ACTION_L3SWITCH_ECMP); 11173 ACTION_CHECK(a_offset.width[0], params.nh_ecmp_id); 11174 } else { 11175 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 11176 _BCM_FIELD_ACTION_L3SWITCH_NEXT_HOP); 11177 ACTION_CHECK(a_offset.width[0], params.nh_ecmp_id); 11178 } 11179 break; 11180 #else 11181 return BCM_E_UNAVAIL; 11182 #endif /* INCLUDE_L3 */ 11183 case bcmFieldActionDstMacNew: 11184 case bcmFieldActionSrcMacNew: 11185 case bcmFieldActionOuterVlanNew: 11186 case bcmFieldActionVnTagNew: 11187 case bcmFieldActionVnTagDelete: 11188 case bcmFieldActionEtagNew: 11189 case bcmFieldActionEtagDelete: 11190 case bcmFieldActionL3SwitchCancel: 11191 case bcmFieldActionChangeL2FieldsCancel: 11192 break; 11193 case bcmFieldActionBFDSessionIdNew: 11194 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11195 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11196 break; 11197 /* Actions from IFP_LB_CONTROLS_SET */ 11198 case bcmFieldActionHgTrunkRandomRoundRobinHashCancel: 11199 case bcmFieldActionTrunkRandomRoundRobinHashCancel: 11200 case bcmFieldActionEcmpRandomRoundRobinHashCancel: 11201 break; 11202 /* Actions from IFP_NAT_OVERRIDE_SET */ 11203 case bcmFieldActionNatCancel: 11204 break; 11205 /* Actions from IFP_COPY_TO_CPU_SET */ 11206 case bcmFieldActionCopyToCpu: 11207 case bcmFieldActionGpCopyToCpu: 11208 case bcmFieldActionYpCopyToCpu: 11209 case bcmFieldActionRpCopyToCpu: 11210 case bcmFieldActionOamCopyToCpu: 11211 case bcmFieldActionGpOamCopyToCpu: 11212 case bcmFieldActionYpOamCopyToCpu: 11213 case bcmFieldActionRpOamCopyToCpu: 11214 if (0 != fa->param[0]) { 11215 action = bcmFieldActionGpCopyToCpu; 11216 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11217 ACTION_CHECK(a_offset.width[0], fa->param[1]); 11218 } 11219 break; 11220 case bcmFieldActionTimeStampToCpu: 11221 case bcmFieldActionGpTimeStampToCpu: 11222 case bcmFieldActionYpTimeStampToCpu: 11223 case bcmFieldActionRpTimeStampToCpu: 11224 if (0 != fa->param[0]) { 11225 action = bcmFieldActionGpTimeStampToCpu; 11226 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11227 ACTION_CHECK(a_offset.width[0], fa->param[1]); 11228 } 11229 break; 11230 case bcmFieldActionCopyToCpuCancel: 11231 case bcmFieldActionGpCopyToCpuCancel: 11232 case bcmFieldActionYpCopyToCpuCancel: 11233 case bcmFieldActionRpCopyToCpuCancel: 11234 case bcmFieldActionSwitchToCpuCancel: 11235 case bcmFieldActionGpSwitchToCpuCancel: 11236 case bcmFieldActionYpSwitchToCpuCancel: 11237 case bcmFieldActionRpSwitchToCpuCancel: 11238 case bcmFieldActionSwitchToCpuReinstate: 11239 case bcmFieldActionGpSwitchToCpuReinstate: 11240 case bcmFieldActionYpSwitchToCpuReinstate: 11241 case bcmFieldActionRpSwitchToCpuReinstate: 11242 case bcmFieldActionTimeStampToCpuCancel: 11243 case bcmFieldActionGpTimeStampToCpuCancel: 11244 case bcmFieldActionYpTimeStampToCpuCancel: 11245 case bcmFieldActionRpTimeStampToCpuCancel: 11246 11247 break; 11248 /* Actions from IFP_XXX_OVERRIDE_SET */ 11249 case bcmFieldActionDoNotCheckUrpf: 11250 case bcmFieldActionDoNotChangeTtl: 11251 case bcmFieldActionMirrorOverride: 11252 case bcmFieldActionDoNotCutThrough: 11253 break; 11254 /* Actions from IFP_INSTRUMENTATION_TRIGGERS_ENABLE_SET */ 11255 case bcmFieldActionPacketTraceEnable: 11256 break; 11257 /* Actions from IFP_CHANGE_CPU_COS_SET */ 11258 case bcmFieldActionCosQCpuNew: 11259 case bcmFieldActionServicePoolIdNew: 11260 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11261 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11262 break; 11263 case bcmFieldActionServicePoolIdPrecedenceNew: 11264 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11265 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11266 ACTION_CHECK(a_offset.width[1], fa->param[1]); 11267 if (!fa->param[1]) { 11268 return BCM_E_PARAM; 11269 } 11270 break; 11271 /* Actions from IFP_DROP_SET */ 11272 case bcmFieldActionDrop: 11273 case bcmFieldActionGpDrop: 11274 case bcmFieldActionYpDrop: 11275 case bcmFieldActionRpDrop: 11276 case bcmFieldActionDropCancel: 11277 case bcmFieldActionGpDropCancel: 11278 case bcmFieldActionYpDropCancel: 11279 case bcmFieldActionRpDropCancel: 11280 break; 11281 /* Actions from IFP_SFLOW_SET */ 11282 case bcmFieldActionIngSampleEnable: 11283 break; 11284 /* Actions from IFP_NAT_SET */ 11285 #ifdef INCLUDE_L3 11286 case bcmFieldActionNatEgressOverride: 11287 if (soc_feature(unit, soc_feature_nat)) { 11288 bcm_l3_nat_egress_t nat_info; 11289 nat_info.nat_id = fa->param[0]; 11290 11291 rv = bcm_esw_l3_nat_egress_get(unit, &nat_info); 11292 if(BCM_FAILURE(rv)){ 11293 return BCM_E_PARAM; 11294 } 11295 } 11296 else { 11297 return BCM_E_UNAVAIL; 11298 } 11299 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11300 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11301 ACTION_CHECK(a_offset.width[0], params.hw_idx); 11302 ACTION_CHECK(a_offset.width[1], params.hw_half); 11303 break; 11304 #endif 11305 case bcmFieldActionNat: 11306 break; 11307 /* Actions from REDIRECT_SET */ 11308 case bcmFieldActionRedirectTrunk: 11309 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11310 if (params.is_dvp) { 11311 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 11312 _BCM_FIELD_ACTION_REDIRECT_DVP); 11313 } else { 11314 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 11315 _BCM_FIELD_ACTION_REDIRECT_TRUNK); 11316 } 11317 ACTION_CHECK(a_offset.width[0], params.redirect_value); 11318 break; 11319 case bcmFieldActionRedirect: 11320 rv = _bcm_field_action_dest_check(unit, fa); 11321 BCM_IF_ERROR_RETURN(rv); 11322 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11323 if (params.is_dvp) { 11324 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 11325 _BCM_FIELD_ACTION_REDIRECT_DVP); 11326 } else if (params.is_trunk) { 11327 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 11328 _BCM_FIELD_ACTION_REDIRECT_TRUNK); 11329 } else { 11330 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 11331 _BCM_FIELD_ACTION_REDIRECT_DGLP); 11332 } 11333 ACTION_CHECK(a_offset.width[0], params.redirect_value); 11334 break; 11335 case bcmFieldActionUnmodifiedPacketRedirectPort: 11336 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 11337 _BCM_FIELD_ACTION_REDIRECT_DGLP); 11338 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11339 ACTION_CHECK(a_offset.width[0], params.redirect_value); 11340 break; 11341 #ifdef INCLUDE_L3 11342 case bcmFieldActionRedirectEgrNextHop: 11343 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11344 if (params.flags & BCM_L3_MULTIPATH) { 11345 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 11346 _BCM_FIELD_ACTION_REDIRECT_ECMP); 11347 } else { 11348 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 11349 _BCM_FIELD_ACTION_REDIRECT_NEXT_HOP); 11350 } 11351 ACTION_CHECK(a_offset.width[0], params.nh_ecmp_id); 11352 break; 11353 #endif 11354 case bcmFieldActionFabricEHAddOrUpdate: 11355 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11356 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11357 break; 11358 case bcmFieldActionRedirectCancel: 11359 case bcmFieldActionRedirectPbmp: 11360 case bcmFieldActionRedirectVlan: 11361 case bcmFieldActionRedirectBcastPbmp: 11362 case bcmFieldActionRedirectMcast: 11363 case bcmFieldActionEgressMask: 11364 case bcmFieldActionEgressPortsAdd: 11365 case bcmFieldActionColorIndependent: 11366 break; 11367 case bcmFieldActionRedirectIpmc: 11368 #ifdef INCLUDE_L3 11369 redir_field = fa->param[0]; 11370 if (soc_feature(unit, soc_feature_field_action_redirect_ipmc)) { 11371 if (_BCM_MULTICAST_IS_SET(fa->param[0])) { 11372 if ((0 == _BCM_MULTICAST_IS_L3(fa->param[0])) && 11373 (0 == _BCM_MULTICAST_IS_WLAN(fa->param[0])) && 11374 (0 == _BCM_MULTICAST_IS_VXLAN(fa->param[0])) && 11375 (0 == _BCM_MULTICAST_IS_VLAN(fa->param[0])) && 11376 (0 == _BCM_MULTICAST_IS_FLOW(fa->param[0])) && 11377 (0 == _BCM_MULTICAST_IS_VPLS(fa->param[0]))) { 11378 return (BCM_E_PARAM); 11379 } 11380 redir_field = _BCM_MULTICAST_ID_GET(fa->param[0]); 11381 } 11382 } 11383 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11384 ACTION_CHECK(a_offset.width[0], redir_field); 11385 #endif 11386 break; 11387 case bcmFieldActionMirrorIngress: 11388 case bcmFieldActionMirrorEgress: 11389 if((_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id) && 11390 (0 == BCM_GPORT_IS_MIRROR(fa->param[1]))) { 11391 LOG_ERROR(BSL_LS_BCM_FP, 11392 (BSL_META_U(unit, 11393 "FP(unit %d) Error: param1=0x%x " 11394 "is not a valid Mirror Destination ID.\n"), 11395 unit, fa->param[1])); 11396 return BCM_E_PARAM; 11397 } 11398 11399 rv = _bcm_field_action_dest_check(unit, fa); 11400 BCM_IF_ERROR_RETURN(rv); 11401 break; 11402 case bcmFieldActionChangeL2Fields: 11403 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 11404 break; 11405 case bcmFieldActionExactMatchClassId: 11406 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11407 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11408 break; 11409 /*Actions from TIMESTAMP_SET*/ 11410 case bcmFieldActionEgressTimeStampInsert: 11411 case bcmFieldActionIngressTimeStampInsert: 11412 case bcmFieldActionIngressTimeStampInsertCancel: 11413 case bcmFieldActionEgressTimeStampInsertCancel: 11414 break; 11415 /*Actions from DLB_HGT_LAG_SET*/ 11416 case bcmFieldActionDynamicTrunkEnable: 11417 case bcmFieldActionDynamicTrunkCancel: 11418 case bcmFieldActionDynamicHgTrunkEnable: 11419 case bcmFieldActionDynamicHgTrunkCancel: 11420 break; 11421 #if defined(INCLUDE_L3) 11422 /*Actions from DLB_ECMP_SET*/ 11423 case bcmFieldActionDynamicEcmpEnable: 11424 case bcmFieldActionDynamicEcmpCancel: 11425 break; 11426 /*Actions from DLB_ALTERNATE_PATH_CONTROL_SET*/ 11427 case bcmFieldActionDgm: 11428 break; 11429 case bcmFieldActionDgmThreshold: 11430 case bcmFieldActionDgmBias: 11431 case bcmFieldActionDgmCost: 11432 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11433 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11434 break; 11435 /*Actions from PROTECTION_SWITCHING_SET*/ 11436 case bcmFieldActionRecoverableDropCancel: 11437 break; 11438 #endif /* INCLUDE_L3 */ 11439 /* ECMP1_RH_ACTION_SET */ 11440 case bcmFieldActionEcmpResilientHashEnable: 11441 case bcmFieldActionEcmpResilientHashDisable: 11442 /* LAG_TH_ACTION_SET */ 11443 case bcmFieldActionTrunkResilientHashEnable: 11444 case bcmFieldActionTrunkResilientHashDisable: 11445 /* HGT_RH_ACTION_SET */ 11446 case bcmFieldActionHiGigTrunkResilientHashEnable: 11447 case bcmFieldActionHiGigTrunkResilientHashDisable: 11448 /* IGNORE_FCOE_ZONE_CHECK_SET */ 11449 case bcmFieldActionFibreChanZoneCheckActionCancel: 11450 break; 11451 /* LOOPBACK_PROFILE_ACTION_SET */ 11452 case bcmFieldActionLoopbackType: 11453 if ((bcmFieldLoopbackTypeMasquerade != fa->param[0]) && 11454 (bcmFieldLoopbackTypeRedirect != fa->param[0])){ 11455 return BCM_E_PARAM; 11456 } 11457 break; 11458 case bcmFieldActionFibreChanVsanId: 11459 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11460 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11461 break; 11462 case bcmFieldActionFibreChanIntVsanPri: 11463 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11464 ACTION_CHECK(a_offset.width[1], fa->param[0]); 11465 break; 11466 case bcmFieldActionAssignExtractionCtrlId: 11467 case bcmFieldActionAssignEditCtrlId: 11468 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11469 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11470 ACTION_CHECK(a_offset.width[1], fa->param[1]); 11471 break; 11472 case bcmFieldActionAssignOpaqueObject4: 11473 case bcmFieldActionAssignOpaqueObject3: 11474 case bcmFieldActionAssignOpaqueObject2: 11475 case bcmFieldActionAssignOpaqueObject1: 11476 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11477 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11478 break; 11479 case bcmFieldActionLoopbackSubtype: 11480 if (bcmFieldLoopbackSubtypeCount <= fa->param[0]) { 11481 return BCM_E_PARAM; 11482 } 11483 break; 11484 case bcmFieldActionEgressFlowControlEnable: 11485 if (bcmFieldEgressFlowControlCount <= fa->param[0]) { 11486 return BCM_E_PARAM; 11487 } 11488 break; 11489 case bcmFieldActionEgressFlowEncapEnable: 11490 if (bcmFieldEgressFlowEncapCount <= fa->param[0]) { 11491 return BCM_E_PARAM; 11492 } 11493 break; 11494 case bcmFieldActionIntEncapEnable: 11495 case bcmFieldActionIntEncapUpdate: 11496 case bcmFieldActionIntTurnAround: 11497 case bcmFieldActionAddIngOuterVlanToEgrOuterVlan: 11498 case bcmFieldActionErspan3HdrVlanCosPktCopy: 11499 case bcmFieldActionGbpClassifierAdd: 11500 case bcmFieldActionGbpSrcMacMcastBitSet: 11501 case bcmFieldActionNshEncapEnable: 11502 break; 11503 case bcmFieldActionErspan3HdrGbpSrcIdAdd: 11504 case bcmFieldActionErspan3HdrUdf2Add: 11505 case bcmFieldActionAssignChangeL2FieldsClassId: 11506 ACTION_OFFSET_GET(unit, stage_fc, _bcmFieldActionOpaque3, &a_offset, 0); 11507 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11508 break; 11509 case bcmFieldActionAssignNatClassId: 11510 case bcmFieldActionGbpSrcIdNew: 11511 ACTION_OFFSET_GET(unit, stage_fc, _bcmFieldActionOpaque1, &a_offset, 0); 11512 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11513 break; 11514 case bcmFieldActionGbpDstIdNew: 11515 ACTION_OFFSET_GET(unit, stage_fc, _bcmFieldActionOpaque2, &a_offset, 0); 11516 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11517 break; 11518 case bcmFieldActionIntEncapDisable: 11519 case bcmFieldActionElephantColorEnable: 11520 case bcmFieldActionElephantColorDisable: 11521 case bcmFieldActionElephantQueueEnable: 11522 case bcmFieldActionElephantQueueDisable: 11523 case bcmFieldActionElephantLookupEnable: 11524 case bcmFieldActionElephantLookupDisable: 11525 case bcmFieldActionMatchPbmpDrop: 11526 break; 11527 case bcmFieldActionMatchPbmpRedirect: 11528 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11529 ACTION_CHECK(a_offset.width[1], fa->param[0]); 11530 break; 11531 case bcmFieldActionDlbEcmpMonitorEnable: 11532 if ((fa->param[0] != BCM_FIELD_DLB_ECMP_MON_ENABLE) && 11533 (fa->param[0] != BCM_FIELD_DLB_ECMP_MON_DISABLE)) { 11534 return BCM_E_PARAM; 11535 } 11536 break; 11537 #if defined (BCM_TOMAHAWK3_SUPPORT) 11538 case bcmFieldActionMirrorZeroingEnable: 11539 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11540 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11541 /* Profile 0 is not supposed to be used */ 11542 if (fa->param[0] == 0) { 11543 return (BCM_E_PARAM); 11544 } 11545 BCM_IF_ERROR_RETURN( 11546 _bcm_esw_mirror_zero_profile_ref_count_get(unit, 11547 fa->param[0], &ref_count)); 11548 if (ref_count < 1) { 11549 return (BCM_E_PARAM); 11550 } 11551 #endif 11552 break; 11553 case bcmFieldActionNshServiceIndex: 11554 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11555 ACTION_CHECK(a_offset.width[0], fa->param[0]); 11556 break; 11557 case bcmFieldActionNshServicePathId: 11558 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 11559 ACTION_CHECK((a_offset.width[0] + a_offset.width[1]), fa->param[0]); 11560 break; 11561 default: 11562 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 11563 "Unsupported Action %s.\n"), action_name[fa->action])); 11564 return BCM_E_UNAVAIL; 11565 } 11566 return BCM_E_NONE; 11567 } 11568 /* 11569 * Function: 11570 * _bcm_field_th_action_params_check 11571 * Purpose: 11572 * Check field action parameters. 11573 * Parameters: 11574 * unit - BCM device number 11575 * f_ent - Field entry structure. 11576 * fa - field action 11577 * Returns: 11578 * BCM_E_XXX 11579 */ 11580 int 11581 _bcm_field_th_action_params_check(int unit, 11582 _field_entry_t *f_ent, 11583 _field_action_t *fa) 11584 { 11585 uint8 mod_id; /* Module Id. */ 11586 uint8 port_id; /* Port Id. */ 11587 soc_mem_t mem; /* Policy table memory id. */ 11588 soc_mem_t tcam_mem; /* Tcam memory id. */ 11589 11590 if (NULL == f_ent || 11591 NULL == fa) { 11592 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 11593 return BCM_E_PARAM; 11594 } 11595 11596 if (_BCM_FIELD_STAGE_EXTERNAL == f_ent->group->stage_id) { 11597 return BCM_E_INTERNAL; 11598 } 11599 11600 BCM_IF_ERROR_RETURN 11601 (_bcm_field_th_tcam_policy_mem_get(unit, f_ent, &tcam_mem, &mem)); 11602 11603 switch (f_ent->group->stage_id) { 11604 #if defined(BCM_TOMAHAWK3_SUPPORT) 11605 case _BCM_FIELD_STAGE_LOOKUP: 11606 switch (fa->action) { 11607 case bcmFieldActionMplsLookupEnable: 11608 if ((fa->param[0] != BCM_FIELD_MPLS_ENABLE) && 11609 (fa->param[0] != BCM_FIELD_MPLS_DISABLE)) { 11610 return BCM_E_PARAM; 11611 } 11612 return (BCM_E_NONE); 11613 case bcmFieldActionTerminationAllowed: 11614 if (fa->param[0] > BCM_FIELD_ARP_RARP_TERM_ALLOWED) { 11615 return BCM_E_PARAM; 11616 } 11617 return (BCM_E_NONE); 11618 default: 11619 ; 11620 } 11621 break; 11622 #endif 11623 case _BCM_FIELD_STAGE_EGRESS: 11624 switch (fa->action) { 11625 case bcmFieldActionHiGigDstModuleGportNew: 11626 if (BCM_GPORT_IS_MODPORT(fa->param[0])) { 11627 mod_id = BCM_GPORT_MODPORT_MODID_GET(fa->param[0]); 11628 } else { 11629 return BCM_E_PARAM; 11630 } 11631 PolicyCheck(unit, mem, HG_DST_MODID_NEWf, mod_id); 11632 return (BCM_E_NONE); 11633 case bcmFieldActionHiGigDstPortGportNew: 11634 if (BCM_GPORT_IS_MODPORT(fa->param[0])) { 11635 port_id = BCM_GPORT_MODPORT_PORT_GET(fa->param[0]); 11636 } else { 11637 return BCM_E_PARAM; 11638 } 11639 PolicyCheck(unit, mem, HG_DST_PORT_NEWf, port_id); 11640 return (BCM_E_NONE); 11641 case bcmFieldActionHiGigDstGportNew: 11642 if (BCM_GPORT_IS_MODPORT(fa->param[0])) { 11643 mod_id = BCM_GPORT_MODPORT_MODID_GET(fa->param[0]); 11644 port_id = BCM_GPORT_MODPORT_PORT_GET(fa->param[0]); 11645 } else { 11646 return BCM_E_PARAM; 11647 } 11648 PolicyCheck(unit, mem, HG_DST_MODID_NEWf, mod_id); 11649 PolicyCheck(unit, mem, HG_DST_PORT_NEWf, port_id); 11650 return (BCM_E_NONE); 11651 case bcmFieldActionGpHiGigDropPrecedenceNew: 11652 PolicyCheck(unit, mem, G_HG_DP_NEWf, fa->param[0]); 11653 return (BCM_E_NONE); 11654 case bcmFieldActionYpHiGigDropPrecedenceNew: 11655 PolicyCheck(unit, mem, Y_HG_DP_NEWf, fa->param[0]); 11656 return (BCM_E_NONE); 11657 case bcmFieldActionRpHiGigDropPrecedenceNew: 11658 PolicyCheck(unit, mem, R_HG_DP_NEWf, fa->param[0]); 11659 return (BCM_E_NONE); 11660 case bcmFieldActionHiGigDropPrecedenceNew: 11661 PolicyCheck(unit, mem, G_HG_DP_NEWf, fa->param[0]); 11662 PolicyCheck(unit, mem, Y_HG_DP_NEWf, fa->param[0]); 11663 PolicyCheck(unit, mem, R_HG_DP_NEWf, fa->param[0]); 11664 return (BCM_E_NONE); 11665 case bcmFieldActionGpHiGigIntPriNew: 11666 PolicyCheck(unit, mem, G_HG_INT_PRI_NEWf , fa->param[0]); 11667 return (BCM_E_NONE); 11668 case bcmFieldActionYpHiGigIntPriNew: 11669 PolicyCheck(unit, mem, Y_HG_INT_PRI_NEWf , fa->param[0]); 11670 return (BCM_E_NONE); 11671 case bcmFieldActionRpHiGigIntPriNew: 11672 PolicyCheck(unit, mem, R_HG_INT_PRI_NEWf , fa->param[0]); 11673 return (BCM_E_NONE); 11674 case bcmFieldActionHiGigIntPriNew: 11675 PolicyCheck(unit, mem, G_HG_INT_PRI_NEWf , fa->param[0]); 11676 PolicyCheck(unit, mem, Y_HG_INT_PRI_NEWf , fa->param[0]); 11677 PolicyCheck(unit, mem, R_HG_INT_PRI_NEWf , fa->param[0]); 11678 return (BCM_E_NONE); 11679 case bcmFieldActionLoopbackSrcModuleGportNew: 11680 if (BCM_GPORT_IS_MODPORT(fa->param[0])) { 11681 mod_id = BCM_GPORT_MODPORT_MODID_GET(fa->param[0]); 11682 } else { 11683 return BCM_E_PARAM; 11684 } 11685 PolicyCheck(unit, mem, LB_SRC_MODID_NEWf, mod_id); 11686 return (BCM_E_NONE); 11687 case bcmFieldActionLoopbackSrcPortGportNew: 11688 if (BCM_GPORT_IS_MODPORT(fa->param[0])) { 11689 port_id = BCM_GPORT_MODPORT_PORT_GET(fa->param[0]); 11690 } else { 11691 return BCM_E_PARAM; 11692 } 11693 PolicyCheck(unit, mem, LB_SRC_PORT_NEWf, port_id); 11694 return (BCM_E_NONE); 11695 case bcmFieldActionLoopbackSrcGportNew: 11696 if (BCM_GPORT_IS_MODPORT(fa->param[0])) { 11697 mod_id = BCM_GPORT_MODPORT_MODID_GET(fa->param[0]); 11698 port_id = BCM_GPORT_MODPORT_PORT_GET(fa->param[0]); 11699 } else { 11700 return BCM_E_PARAM; 11701 } 11702 PolicyCheck(unit, mem, LB_SRC_MODID_NEWf, mod_id); 11703 PolicyCheck(unit, mem, LB_SRC_PORT_NEWf, port_id); 11704 return (BCM_E_NONE); 11705 case bcmFieldActionLoopbackCpuMasqueradePktProfileNew: 11706 PolicyCheck(unit, mem, 11707 LB_PACKET_PROFILE_NEWf, 11708 fa->param[0]); 11709 return (BCM_E_NONE); 11710 case bcmFieldActionLoopbackPacketProcessingPortNew: 11711 PolicyCheck(unit, mem, LB_PP_PORT_NEWf , fa->param[0]); 11712 return (BCM_E_NONE); 11713 case bcmFieldActionLoopBackTypeNew: 11714 PolicyCheck(unit, mem, LB_TYPE_NEWf , fa->param[0]); 11715 return (BCM_E_NONE); 11716 case bcmFieldActionMplsLabel1ExpNew: 11717 PolicyCheck(unit, mem, EXPf, fa->param[0]); 11718 return (BCM_E_NONE); 11719 case bcmFieldActionLatencyMonitorEnable: 11720 PolicyCheck(unit, mem, LAT_MON_ENf, fa->param[0]); 11721 return (BCM_E_NONE); 11722 case bcmFieldActionLatencyMonitorDisable: 11723 PolicyCheck(unit, mem, LAT_MON_DISf, fa->param[0]); 11724 return (BCM_E_NONE); 11725 default: 11726 ; 11727 } 11728 break; 11729 case _BCM_FIELD_STAGE_INGRESS: 11730 case _BCM_FIELD_STAGE_EXACTMATCH: 11731 return _bcm_field_th_ingress_action_params_check(unit, f_ent, fa); 11732 #if defined(BCM_FLOWTRACKER_SUPPORT) 11733 case _BCM_FIELD_STAGE_FLOWTRACKER: 11734 return _bcm_field_hx5_ft_action_params_check(unit, f_ent, fa); 11735 #endif 11736 default: 11737 ; 11738 } 11739 11740 return _bcm_field_td2_action_params_check(unit, f_ent, fa); 11741 } 11742 /* 11743 * Function: 11744 * _bcm_field_th_val_set 11745 * Purpose: 11746 * Write the width size of data from p_data to p_fn_data at offset. 11747 * Parameters: 11748 * p_fn_data - (OUT) Field Policy table entry 11749 * p_data - (IN) Data to be written into p_fn_data 11750 * offset - (IN) Offset at which data has to be copied to p_fn_data 11751 * width - (IN) Size of the data to be written into p_fn_data 11752 * Returns: 11753 * BCM_E_XXX 11754 */ 11755 int 11756 _bcm_field_th_val_set(uint32 *p_fn_data, uint32 *p_data, 11757 uint32 offset, uint32 width) 11758 { 11759 uint32 u32_mask; 11760 int idx, wp, bp, len; 11761 11762 if (NULL == p_fn_data || NULL == p_data) { 11763 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 11764 return BCM_E_PARAM; 11765 } 11766 11767 wp = offset / 32; 11768 bp = offset & (32 - 1); 11769 idx = 0; 11770 11771 for (len = width; len > 0; len -= 32) { 11772 if (bp) { 11773 if (len < 32) { 11774 u32_mask = (1 << len) - 1; 11775 if ((p_data[idx] & ~u32_mask) != 0) { 11776 return (BCM_E_PARAM); 11777 } 11778 } else { 11779 u32_mask = 0xffffffff; 11780 } 11781 11782 p_fn_data[wp] &= ~(u32_mask << bp); 11783 p_fn_data[wp] |= p_data[idx] << bp; 11784 if (len > (32-bp)) { 11785 wp++; 11786 p_fn_data[wp] &= ~(u32_mask >> (32 - bp)); 11787 p_fn_data[wp] |= p_data[idx] >> (32 - bp) & ((1 << bp) - 1); 11788 } 11789 } else { 11790 if (len < 32) { 11791 u32_mask = (1 << len) - 1; 11792 if ((p_data[idx] & ~u32_mask) != 0) { 11793 return (BCM_E_PARAM); 11794 } 11795 p_fn_data[wp] &= ~u32_mask; 11796 p_fn_data[wp++] |= p_data[idx]; 11797 } else { 11798 p_fn_data[wp++] = p_data[idx]; 11799 } 11800 } 11801 11802 idx++; 11803 } 11804 11805 return BCM_E_NONE; 11806 } 11807 /* 11808 * Function: 11809 * _bcm_field_th_val_get 11810 * Purpose: 11811 * Write the width size of data to p_data from p_fn_data at offset. 11812 * Parameters: 11813 * p_fn_data - (IN) Field Policy table entry 11814 * p_data - (OUT) Data to be from p_fn_data 11815 * offset - (IN) Offset at which data has to be 11816 * copied from p_fn_data 11817 * width - (IN) Size of the data to be written into p_data 11818 * Returns: 11819 * BCM_E_XXX 11820 */ 11821 int 11822 _bcm_field_th_val_get(uint32 *p_fn_data, uint32 *p_data, 11823 uint32 offset, uint32 width) 11824 { 11825 int idx, wp, bp, len; 11826 11827 /* Input parameters check. */ 11828 if (NULL == p_fn_data || NULL == p_data) { 11829 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 11830 return (BCM_E_PARAM); 11831 } 11832 11833 wp = offset / 32; 11834 bp = offset & (32 - 1); 11835 idx = 0; 11836 11837 for (len = width; len > 0; len -= 32) { 11838 if (bp) { 11839 p_data[idx] = (p_fn_data[wp++] >> bp) & ((1 << (32 - bp)) - 1); 11840 p_data[idx] |= p_fn_data[wp] << (32 - bp); 11841 } else { 11842 p_data[idx] = p_fn_data[wp++]; 11843 } 11844 11845 if (len < 32) { 11846 p_data[idx] &= ((1 << len) - 1); 11847 } 11848 11849 idx++; 11850 } 11851 11852 return (BCM_E_NONE); 11853 } 11854 /* 11855 * Function: 11856 * _bcm_field_action_val_set 11857 * Purpose: 11858 * Get the actions to be written 11859 * Parameters: 11860 * unit - BCM device number 11861 * mem - Policy table memory 11862 * fa - field action 11863 * buf - (OUT) Field Policy table entry 11864 * Returns: 11865 * BCM_E_NONE 11866 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 11867 */ 11868 int 11869 _bcm_field_action_val_set(int unit, _field_entry_t *f_ent, uint32 *entbuf, 11870 _bcm_field_action_offset_t *a_offset) 11871 { 11872 int rv; 11873 uint32 idx; 11874 uint32 offset; 11875 uint32 width; 11876 uint32 value; 11877 11878 if (NULL == entbuf || NULL == f_ent || NULL == a_offset) { 11879 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 11880 return (BCM_E_PARAM); 11881 } 11882 11883 for (idx = 0; idx < _FP_ACTION_PARAM_SZ; idx++) { 11884 if (a_offset->width[idx] > 0 ) { 11885 offset = a_offset->offset[idx]; 11886 width = a_offset->width[idx]; 11887 value = a_offset->value[idx]; 11888 /* 11889 * COVERITY 11890 * 11891 * This flow takes care of the Out-of-bounds access issue 11892 * for data and mask. 11893 */ 11894 /* coverity[callee_ptr_arith : FALSE] */ 11895 rv = _bcm_field_th_val_set(entbuf, &value, offset, width); 11896 BCM_IF_ERROR_RETURN(rv); 11897 } 11898 } 11899 11900 return BCM_E_NONE; 11901 } 11902 /* 11903 * Function: 11904 * _bcm_field_action_val_get 11905 * Purpose: 11906 * Get the actions written into buffer 11907 * Parameters: 11908 * unit - (IN) BCM device number 11909 * f_ent - (IN) Field Entry 11910 * buf - (IN) Field Policy table entry 11911 * action - (IN) Field Action of type bcmFieldActionXXX 11912 * flags - (IN) flags to inform offset configuration 11913 * a_offset - (OUT) Action offset information 11914 * Returns: 11915 * BCM_E_NONE 11916 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 11917 */ 11918 int 11919 _bcm_field_action_val_get(int unit, 11920 _field_entry_t *f_ent, 11921 uint32 *entbuf, 11922 _bcm_field_internal_action_t action, 11923 uint32 flags, 11924 _bcm_field_action_offset_t *a_offset) 11925 { 11926 int rv; 11927 uint32 idx; 11928 uint32 value; 11929 _field_stage_t *stage_fc; 11930 11931 if (NULL == entbuf || NULL == a_offset || NULL == f_ent) { 11932 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 11933 return (BCM_E_PARAM); 11934 } 11935 11936 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 11937 BCM_IF_ERROR_RETURN(rv); 11938 11939 rv = _bcm_field_action_offset_get(unit, stage_fc, action, a_offset, flags); 11940 BCM_IF_ERROR_RETURN(rv); 11941 11942 11943 for (idx = 0; idx < _FP_ACTION_PARAM_SZ; idx++) { 11944 if (a_offset->width[idx] > 0 ) { 11945 value = 0; 11946 rv = _bcm_field_th_val_get(entbuf, &value, 11947 a_offset->offset[idx], 11948 a_offset->width[idx]); 11949 BCM_IF_ERROR_RETURN(rv); 11950 a_offset->value[idx] = value; 11951 } 11952 } 11953 11954 return BCM_E_NONE; 11955 } 11956 /* 11957 * Function: 11958 * _bcm_field_th_profile1_cd_action_set 11959 * Purpose: 11960 * Set the color dependent actions of IFP_PROFILE_ONE_SET 11961 * in entbuf which is to be written into POLICY table. 11962 * Parameters: 11963 * unit - BCM device number 11964 * action - Field Action of type bcmFieldActionXXX 11965 * f_ent - entry structure to get policy info from 11966 * fa - field action 11967 * entbuf - (OUT) Field Policy table entry 11968 * Returns: 11969 * BCM_E_NONE 11970 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 11971 * Notes: 11972 * This is a simple read/modify/write pattern. 11973 * FP unit lock should be held by calling function. 11974 */ 11975 int 11976 _bcm_field_th_profile1_cd_action_set(int unit, 11977 bcm_field_action_t action, 11978 _field_entry_t *f_ent, 11979 _field_action_t *fa, uint32 *entbuf) 11980 11981 { 11982 int rv; 11983 int ucosq = BCM_COS_INVALID; /* Current unicast queue value */ 11984 int mcosq = BCM_COS_INVALID; /* Current mcast queue value */ 11985 uint8 mcast_mode_set = 0; /* Multicast action is set */ 11986 uint8 ucast_mode_set = 0; /* Unicast action is set */ 11987 _field_stage_t *stage_fc; 11988 _field_action_t *f_ent_act; 11989 _field_action_params_t params; 11990 _bcm_field_action_offset_t a_offset; 11991 11992 if (NULL == f_ent || NULL == fa || NULL == entbuf) { 11993 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 11994 return BCM_E_PARAM; 11995 } 11996 11997 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 11998 BCM_IF_ERROR_RETURN(rv); 11999 12000 rv = _bcm_field_action_offset_get(unit, stage_fc, action, &a_offset, 0); 12001 BCM_IF_ERROR_RETURN(rv); 12002 12003 sal_memset(¶ms, 0, sizeof(params)); 12004 12005 switch (action) { 12006 case bcmFieldActionGpCosQNew: 12007 case bcmFieldActionYpCosQNew: 12008 case bcmFieldActionRpCosQNew: 12009 /* For the cosQNew action, the param received has to be set 12010 * for both ucast and mcast. 12011 * The lower 4 bits of G/Y/R_COS_INT_PRI should be set with ucosq 12012 * and the upper 4 bits should be set with mcosq. 12013 * For Helix5 Lower 5 bits is UcosQ and upper 5 mcosq. 12014 */ 12015 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12016 if (SOC_IS_HELIX5(unit)) { 12017 ucosq = (params.cosq_new) & (0x1f); 12018 mcosq = (((params.cosq_new) & 0x1f) << 5); 12019 } else { 12020 ucosq = (params.cosq_new) & (0xf); 12021 mcosq = (((params.cosq_new) & 0xf) << 4); 12022 } 12023 params.cosq_new = ucosq | mcosq; 12024 a_offset.value[0] = params.cosq_new; 12025 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12026 break; 12027 case bcmFieldActionGpCosMapNew: 12028 case bcmFieldActionYpCosMapNew: 12029 case bcmFieldActionRpCosMapNew: 12030 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12031 a_offset.value[0] = params.cosq_new; 12032 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12033 break; 12034 case bcmFieldActionGpPrioIntCopy: 12035 case bcmFieldActionYpPrioIntCopy: 12036 case bcmFieldActionRpPrioIntCopy: 12037 case bcmFieldActionGpPrioIntTos: 12038 case bcmFieldActionYpPrioIntTos: 12039 case bcmFieldActionRpPrioIntTos: 12040 case bcmFieldActionGpPrioIntCancel: 12041 case bcmFieldActionYpPrioIntCancel: 12042 case bcmFieldActionRpPrioIntCancel: 12043 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12044 break; 12045 case bcmFieldActionGpPrioIntNew: 12046 case bcmFieldActionYpPrioIntNew: 12047 case bcmFieldActionRpPrioIntNew: 12048 a_offset.value[0] = fa->param[0]; 12049 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12050 break; 12051 case bcmFieldActionGpIntCongestionNotificationNew: 12052 case bcmFieldActionYpIntCongestionNotificationNew: 12053 case bcmFieldActionRpIntCongestionNotificationNew: 12054 case bcmFieldActionPfcClassNew: 12055 a_offset.value[0] = fa->param[0]; 12056 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12057 break; 12058 case bcmFieldActionGpUcastCosQNew: 12059 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12060 ucosq = params.cosq_new; 12061 mcast_mode_set = 0; 12062 /* Check if corresponding multicast action is set for this entry */ 12063 for (f_ent_act = f_ent->actions; 12064 f_ent_act != NULL; 12065 f_ent_act = f_ent_act->next) { 12066 if (bcmFieldActionGpMcastCosQNew == f_ent_act->action || 12067 bcmFieldActionMcastCosQNew == f_ent_act->action) { 12068 sal_memset(¶ms, 0, sizeof(params)); 12069 /* Get current Mcast queue value */ 12070 mcast_mode_set = 1; 12071 ACTION_RESOLVE(unit, f_ent, f_ent_act, ¶ms); 12072 mcosq = params.cosq_new; 12073 break; 12074 } 12075 } 12076 if (0 == mcast_mode_set) { 12077 a_offset.value[0] = ucosq; 12078 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12079 } else { 12080 /* Since both ucast and mcast queue modes are to be set, 12081 * the offset info of action bcmFieldActionGpCosQNew is used 12082 * ie 8 bits of G_COS_INT_PRI and 12083 * value 1 for G_CHANGE_COS_OR_INT_PRI 12084 */ 12085 action = bcmFieldActionGpCosQNew; 12086 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 12087 if (SOC_IS_HELIX5(unit)) { 12088 a_offset.value[0] = ucosq | (mcosq << 5); 12089 } else { 12090 a_offset.value[0] = ucosq | (mcosq << 4); 12091 } 12092 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12093 } 12094 break; 12095 case bcmFieldActionYpUcastCosQNew: 12096 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12097 ucosq = params.cosq_new; 12098 mcast_mode_set = 0; 12099 /* Check if corresponding multicast action is set for this entry */ 12100 for (f_ent_act = f_ent->actions; 12101 f_ent_act != NULL; 12102 f_ent_act = f_ent_act->next) { 12103 if (bcmFieldActionYpMcastCosQNew == f_ent_act->action || 12104 bcmFieldActionMcastCosQNew == f_ent_act->action) { 12105 sal_memset(¶ms, 0, sizeof(params)); 12106 /* Get current Mcast queue value */ 12107 mcast_mode_set = 1; 12108 ACTION_RESOLVE(unit, f_ent, f_ent_act, ¶ms); 12109 mcosq = params.cosq_new; 12110 break; 12111 } 12112 } 12113 if (0 == mcast_mode_set) { 12114 a_offset.value[0] = ucosq; 12115 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12116 } else { 12117 /* Since both ucast and mcast queue modes are to be set, 12118 * the offset info of action bcmFieldActionYpCosQNew is used 12119 * ie 8 bits of Y_COS_INT_PRI and 12120 * value 1 for Y_CHANGE_COS_OR_INT_PRI 12121 */ 12122 action = bcmFieldActionYpCosQNew; 12123 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 12124 12125 if (SOC_IS_HELIX5(unit)) { 12126 a_offset.value[0] = ucosq | (mcosq << 5); 12127 } else { 12128 a_offset.value[0] = ucosq | (mcosq << 4); 12129 } 12130 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12131 } 12132 break; 12133 case bcmFieldActionRpUcastCosQNew: 12134 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12135 ucosq = params.cosq_new; 12136 mcast_mode_set = 0; 12137 /* Check if corresponding multicast action is set for this entry */ 12138 for (f_ent_act = f_ent->actions; 12139 f_ent_act != NULL; 12140 f_ent_act = f_ent_act->next) { 12141 if (bcmFieldActionRpMcastCosQNew == f_ent_act->action || 12142 bcmFieldActionMcastCosQNew == f_ent_act->action) { 12143 sal_memset(¶ms, 0, sizeof(params)); 12144 /* Get current Mcast queue value */ 12145 mcast_mode_set = 1; 12146 ACTION_RESOLVE(unit, f_ent, f_ent_act, ¶ms); 12147 mcosq = params.cosq_new; 12148 break; 12149 } 12150 } 12151 if (0 == mcast_mode_set) { 12152 a_offset.value[0] = ucosq; 12153 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12154 } else { 12155 /* Since both ucast and mcast queue modes are to be set, 12156 * the offset info of action bcmFieldActionRpCosQNew is used 12157 * ie 8 bits of R_COS_INT_PRI and 12158 * value 1 for R_CHANGE_COS_OR_INT_PRI 12159 */ 12160 12161 action = bcmFieldActionRpCosQNew; 12162 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 12163 12164 if (SOC_IS_HELIX5(unit)) { 12165 a_offset.value[0] = ucosq | (mcosq << 5); 12166 } else { 12167 a_offset.value[0] = ucosq | (mcosq << 4); 12168 } 12169 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12170 } 12171 break; 12172 case bcmFieldActionGpMcastCosQNew: 12173 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12174 mcosq = params.cosq_new; 12175 ucast_mode_set = 0; 12176 /* Check if corresponding multicast action is set for this entry */ 12177 for (f_ent_act = f_ent->actions; 12178 f_ent_act != NULL; 12179 f_ent_act = f_ent_act->next) { 12180 if (bcmFieldActionGpUcastCosQNew == f_ent_act->action || 12181 bcmFieldActionUcastCosQNew == f_ent_act->action) { 12182 sal_memset(¶ms, 0, sizeof(params)); 12183 /* Get current Mcast queue value */ 12184 ucast_mode_set = 1; 12185 ACTION_RESOLVE(unit, f_ent, f_ent_act, ¶ms); 12186 ucosq = params.cosq_new; 12187 break; 12188 } 12189 } 12190 if (0 == ucast_mode_set) { 12191 a_offset.value[0] = mcosq; 12192 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12193 } else { 12194 /* Since both ucast and mcast queue modes are to be set, 12195 * the offset info of action bcmFieldActionGpCosQNew is used 12196 * ie 8 bits of G_COS_INT_PRI and 12197 * value 1 for G_CHANGE_COS_OR_INT_PRI 12198 */ 12199 action = bcmFieldActionGpCosQNew; 12200 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 12201 12202 if (SOC_IS_HELIX5(unit)) { 12203 a_offset.value[0] = ucosq | (mcosq << 5); 12204 } else { 12205 a_offset.value[0] = ucosq | (mcosq << 4); 12206 } 12207 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12208 } 12209 break; 12210 case bcmFieldActionYpMcastCosQNew: 12211 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12212 mcosq = params.cosq_new; 12213 ucast_mode_set = 0; 12214 /* Check if corresponding multicast action is set for this entry */ 12215 for (f_ent_act = f_ent->actions; 12216 f_ent_act != NULL; 12217 f_ent_act = f_ent_act->next) { 12218 if (bcmFieldActionYpUcastCosQNew == f_ent_act->action || 12219 bcmFieldActionUcastCosQNew == f_ent_act->action) { 12220 sal_memset(¶ms, 0, sizeof(params)); 12221 /* Get current Mcast queue value */ 12222 ucast_mode_set = 1; 12223 ACTION_RESOLVE(unit, f_ent, f_ent_act, ¶ms); 12224 ucosq = params.cosq_new; 12225 break; 12226 } 12227 } 12228 12229 if (0 == ucast_mode_set) { 12230 a_offset.value[0] = mcosq; 12231 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12232 } else { 12233 /* Since both ucast and mcast queue modes are to be set, 12234 * the offset info of action bcmFieldActionYpCosQNew is used 12235 * ie 8 bits of Y_COS_INT_PRI and 12236 * value 1 for Y_CHANGE_COS_OR_INT_PRI 12237 */ 12238 action = bcmFieldActionYpCosQNew; 12239 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 12240 12241 if (SOC_IS_HELIX5(unit)) { 12242 a_offset.value[0] = ucosq | (mcosq << 5); 12243 } else { 12244 a_offset.value[0] = ucosq | (mcosq << 4); 12245 } 12246 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12247 } 12248 12249 break; 12250 case bcmFieldActionRpMcastCosQNew: 12251 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12252 mcosq = params.cosq_new; 12253 ucast_mode_set = 0; 12254 /* Check if corresponding multicast action is set for this entry */ 12255 for (f_ent_act = f_ent->actions; 12256 f_ent_act != NULL; 12257 f_ent_act = f_ent_act->next) { 12258 if (bcmFieldActionRpUcastCosQNew == f_ent_act->action || 12259 bcmFieldActionUcastCosQNew == f_ent_act->action) { 12260 sal_memset(¶ms, 0, sizeof(params)); 12261 /* Get current Mcast queue value */ 12262 ucast_mode_set = 1; 12263 ACTION_RESOLVE(unit, f_ent, f_ent_act, ¶ms); 12264 ucosq = params.cosq_new; 12265 break; 12266 } 12267 } 12268 12269 if (0 == ucast_mode_set) { 12270 a_offset.value[0] = mcosq; 12271 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12272 } else { 12273 /* Since both ucast and mcast queue modes are to be set, 12274 * the offset info of action bcmFieldActionRpCosQNew is used 12275 * ie 8 bits of R_COS_INT_PRI and 12276 * value 1 for R_CHANGE_COS_OR_INT_PRI 12277 */ 12278 action = bcmFieldActionRpCosQNew; 12279 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0); 12280 12281 if (SOC_IS_HELIX5(unit)) { 12282 a_offset.value[0] = ucosq | (mcosq << 5); 12283 } else { 12284 a_offset.value[0] = ucosq | (mcosq << 4); 12285 } 12286 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12287 } 12288 break; 12289 case bcmFieldActionGpDropPrecedence: 12290 case bcmFieldActionYpDropPrecedence: 12291 case bcmFieldActionRpDropPrecedence: 12292 a_offset.value[0] = fa->param[0]; 12293 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12294 break; 12295 case bcmFieldActionUntaggedPacketPriorityNew: 12296 a_offset.value[0] = fa->param[0]; 12297 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12298 break; 12299 default: 12300 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 12301 "%s is not found.\n"), action_name[action])); 12302 return BCM_E_UNAVAIL; 12303 } 12304 12305 return BCM_E_NONE; 12306 } 12307 /* 12308 * Function: 12309 * _bcm_field_th_profile1_action_set 12310 * Purpose: 12311 * Set the color independent actions of IFP_PROFILE_ONE_SET 12312 * in entbuf which is to be written into POLICY table. 12313 * Parameters: 12314 * unit - BCM device number 12315 * action - Field Action of type bcmFieldActionXXX 12316 * f_ent - entry structure to get policy info from 12317 * fa - field action 12318 * entbuf - (OUT) Field Policy table entry 12319 * Returns: 12320 * BCM_E_NONE 12321 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 12322 * Notes: 12323 * This is a simple read/modify/write pattern. 12324 * FP unit lock should be held by calling function. 12325 */ 12326 int 12327 _bcm_field_th_profile1_action_set(int unit, _field_entry_t *f_ent, 12328 _field_action_t *fa, uint32 *entbuf) 12329 12330 { 12331 int rv; 12332 12333 if (NULL == f_ent || NULL == fa || NULL == entbuf) { 12334 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 12335 return BCM_E_PARAM; 12336 } 12337 12338 switch (fa->action) { 12339 case bcmFieldActionCosQNew: 12340 rv = _bcm_field_th_profile1_cd_action_set(unit, 12341 bcmFieldActionGpCosQNew, 12342 f_ent, fa, entbuf); 12343 BCM_IF_ERROR_RETURN(rv); 12344 12345 rv = _bcm_field_th_profile1_cd_action_set(unit, 12346 bcmFieldActionYpCosQNew, 12347 f_ent, fa, entbuf); 12348 BCM_IF_ERROR_RETURN(rv); 12349 12350 rv = _bcm_field_th_profile1_cd_action_set(unit, 12351 bcmFieldActionRpCosQNew, 12352 f_ent, fa, entbuf); 12353 BCM_IF_ERROR_RETURN(rv); 12354 break; 12355 case bcmFieldActionCosMapNew: 12356 rv = _bcm_field_th_profile1_cd_action_set(unit, 12357 bcmFieldActionGpCosMapNew, 12358 f_ent, fa, entbuf); 12359 BCM_IF_ERROR_RETURN(rv); 12360 12361 rv = _bcm_field_th_profile1_cd_action_set(unit, 12362 bcmFieldActionYpCosMapNew, 12363 f_ent, fa, entbuf); 12364 BCM_IF_ERROR_RETURN(rv); 12365 12366 rv = _bcm_field_th_profile1_cd_action_set(unit, 12367 bcmFieldActionRpCosMapNew, 12368 f_ent, fa, entbuf); 12369 BCM_IF_ERROR_RETURN(rv); 12370 break; 12371 case bcmFieldActionPrioIntCopy: 12372 case bcmFieldActionPrioPktAndIntCopy: 12373 rv = _bcm_field_th_profile1_cd_action_set(unit, 12374 bcmFieldActionGpPrioIntCopy, 12375 f_ent, fa, entbuf); 12376 BCM_IF_ERROR_RETURN(rv); 12377 12378 rv = _bcm_field_th_profile1_cd_action_set(unit, 12379 bcmFieldActionYpPrioIntCopy, 12380 f_ent, fa, entbuf); 12381 BCM_IF_ERROR_RETURN(rv); 12382 12383 rv = _bcm_field_th_profile1_cd_action_set(unit, 12384 bcmFieldActionRpPrioIntCopy, 12385 f_ent, fa, entbuf); 12386 BCM_IF_ERROR_RETURN(rv); 12387 break; 12388 case bcmFieldActionRpPrioPktAndIntCopy: 12389 rv = _bcm_field_th_profile1_cd_action_set(unit, 12390 bcmFieldActionRpPrioIntCopy, 12391 f_ent, fa, entbuf); 12392 BCM_IF_ERROR_RETURN(rv); 12393 break; 12394 case bcmFieldActionYpPrioPktAndIntCopy: 12395 rv = _bcm_field_th_profile1_cd_action_set(unit, 12396 bcmFieldActionYpPrioIntCopy, 12397 f_ent, fa, entbuf); 12398 BCM_IF_ERROR_RETURN(rv); 12399 break; 12400 case bcmFieldActionGpPrioPktAndIntCopy: 12401 rv = _bcm_field_th_profile1_cd_action_set(unit, 12402 bcmFieldActionGpPrioIntCopy, 12403 f_ent, fa, entbuf); 12404 BCM_IF_ERROR_RETURN(rv); 12405 break; 12406 case bcmFieldActionPrioIntNew: 12407 case bcmFieldActionPrioPktAndIntNew: 12408 rv = _bcm_field_th_profile1_cd_action_set(unit, 12409 bcmFieldActionGpPrioIntNew, 12410 f_ent, fa, entbuf); 12411 BCM_IF_ERROR_RETURN(rv); 12412 12413 rv = _bcm_field_th_profile1_cd_action_set(unit, 12414 bcmFieldActionYpPrioIntNew, 12415 f_ent, fa, entbuf); 12416 BCM_IF_ERROR_RETURN(rv); 12417 12418 rv = _bcm_field_th_profile1_cd_action_set(unit, 12419 bcmFieldActionRpPrioIntNew, 12420 f_ent, fa, entbuf); 12421 BCM_IF_ERROR_RETURN(rv); 12422 break; 12423 case bcmFieldActionRpPrioPktAndIntNew: 12424 rv = _bcm_field_th_profile1_cd_action_set(unit, 12425 bcmFieldActionRpPrioIntNew, 12426 f_ent, fa, entbuf); 12427 BCM_IF_ERROR_RETURN(rv); 12428 break; 12429 case bcmFieldActionYpPrioPktAndIntNew: 12430 rv = _bcm_field_th_profile1_cd_action_set(unit, 12431 bcmFieldActionYpPrioIntNew, 12432 f_ent, fa, entbuf); 12433 BCM_IF_ERROR_RETURN(rv); 12434 break; 12435 case bcmFieldActionGpPrioPktAndIntNew: 12436 rv = _bcm_field_th_profile1_cd_action_set(unit, 12437 bcmFieldActionGpPrioIntNew, 12438 f_ent, fa, entbuf); 12439 BCM_IF_ERROR_RETURN(rv); 12440 break; 12441 case bcmFieldActionPrioIntTos: 12442 case bcmFieldActionPrioPktAndIntTos: 12443 rv = _bcm_field_th_profile1_cd_action_set(unit, 12444 bcmFieldActionGpPrioIntTos, 12445 f_ent, fa, entbuf); 12446 BCM_IF_ERROR_RETURN(rv); 12447 12448 rv = _bcm_field_th_profile1_cd_action_set(unit, 12449 bcmFieldActionYpPrioIntTos, 12450 f_ent, fa, entbuf); 12451 BCM_IF_ERROR_RETURN(rv); 12452 12453 rv = _bcm_field_th_profile1_cd_action_set(unit, 12454 bcmFieldActionRpPrioIntTos, 12455 f_ent, fa, entbuf); 12456 BCM_IF_ERROR_RETURN(rv); 12457 break; 12458 case bcmFieldActionRpPrioPktAndIntTos: 12459 rv = _bcm_field_th_profile1_cd_action_set(unit, 12460 bcmFieldActionRpPrioIntTos, 12461 f_ent, fa, entbuf); 12462 BCM_IF_ERROR_RETURN(rv); 12463 break; 12464 case bcmFieldActionYpPrioPktAndIntTos: 12465 rv = _bcm_field_th_profile1_cd_action_set(unit, 12466 bcmFieldActionYpPrioIntTos, 12467 f_ent, fa, entbuf); 12468 BCM_IF_ERROR_RETURN(rv); 12469 break; 12470 case bcmFieldActionGpPrioPktAndIntTos: 12471 rv = _bcm_field_th_profile1_cd_action_set(unit, 12472 bcmFieldActionGpPrioIntTos, 12473 f_ent, fa, entbuf); 12474 BCM_IF_ERROR_RETURN(rv); 12475 break; 12476 case bcmFieldActionPrioIntCancel: 12477 case bcmFieldActionPrioPktAndIntCancel: 12478 rv = _bcm_field_th_profile1_cd_action_set(unit, 12479 bcmFieldActionGpPrioIntCancel, 12480 f_ent, fa, entbuf); 12481 BCM_IF_ERROR_RETURN(rv); 12482 12483 rv = _bcm_field_th_profile1_cd_action_set(unit, 12484 bcmFieldActionYpPrioIntCancel, 12485 f_ent, fa, entbuf); 12486 BCM_IF_ERROR_RETURN(rv); 12487 12488 rv = _bcm_field_th_profile1_cd_action_set(unit, 12489 bcmFieldActionRpPrioIntCancel, 12490 f_ent, fa, entbuf); 12491 BCM_IF_ERROR_RETURN(rv); 12492 break; 12493 case bcmFieldActionRpPrioPktAndIntCancel: 12494 rv = _bcm_field_th_profile1_cd_action_set(unit, 12495 bcmFieldActionRpPrioIntCancel, 12496 f_ent, fa, entbuf); 12497 BCM_IF_ERROR_RETURN(rv); 12498 break; 12499 case bcmFieldActionYpPrioPktAndIntCancel: 12500 rv = _bcm_field_th_profile1_cd_action_set(unit, 12501 bcmFieldActionYpPrioIntCancel, 12502 f_ent, fa, entbuf); 12503 BCM_IF_ERROR_RETURN(rv); 12504 break; 12505 case bcmFieldActionGpPrioPktAndIntCancel: 12506 rv = _bcm_field_th_profile1_cd_action_set(unit, 12507 bcmFieldActionGpPrioIntCancel, 12508 f_ent, fa, entbuf); 12509 BCM_IF_ERROR_RETURN(rv); 12510 break; 12511 case bcmFieldActionUcastCosQNew: 12512 rv = _bcm_field_th_profile1_cd_action_set(unit, 12513 bcmFieldActionGpUcastCosQNew, 12514 f_ent, fa, entbuf); 12515 BCM_IF_ERROR_RETURN(rv); 12516 12517 rv = _bcm_field_th_profile1_cd_action_set(unit, 12518 bcmFieldActionYpUcastCosQNew, 12519 f_ent, fa, entbuf); 12520 BCM_IF_ERROR_RETURN(rv); 12521 12522 rv = _bcm_field_th_profile1_cd_action_set(unit, 12523 bcmFieldActionRpUcastCosQNew, 12524 f_ent, fa, entbuf); 12525 BCM_IF_ERROR_RETURN(rv); 12526 break; 12527 case bcmFieldActionMcastCosQNew: 12528 rv = _bcm_field_th_profile1_cd_action_set(unit, 12529 bcmFieldActionGpMcastCosQNew, 12530 f_ent, fa, entbuf); 12531 BCM_IF_ERROR_RETURN(rv); 12532 12533 rv = _bcm_field_th_profile1_cd_action_set(unit, 12534 bcmFieldActionYpMcastCosQNew, 12535 f_ent, fa, entbuf); 12536 BCM_IF_ERROR_RETURN(rv); 12537 12538 rv = _bcm_field_th_profile1_cd_action_set(unit, 12539 bcmFieldActionRpMcastCosQNew, 12540 f_ent, fa, entbuf); 12541 BCM_IF_ERROR_RETURN(rv); 12542 break; 12543 case bcmFieldActionDropPrecedence: 12544 rv = _bcm_field_th_profile1_cd_action_set(unit, 12545 bcmFieldActionGpDropPrecedence, 12546 f_ent, fa, entbuf); 12547 BCM_IF_ERROR_RETURN(rv); 12548 12549 rv = _bcm_field_th_profile1_cd_action_set(unit, 12550 bcmFieldActionYpDropPrecedence, 12551 f_ent, fa, entbuf); 12552 BCM_IF_ERROR_RETURN(rv); 12553 12554 rv = _bcm_field_th_profile1_cd_action_set(unit, 12555 bcmFieldActionRpDropPrecedence, 12556 f_ent, fa, entbuf); 12557 BCM_IF_ERROR_RETURN(rv); 12558 break; 12559 default: 12560 return _bcm_field_th_profile1_cd_action_set(unit, fa->action, 12561 f_ent, fa, entbuf); 12562 } 12563 12564 return BCM_E_NONE; 12565 } 12566 /* 12567 * Function: 12568 * _bcm_field_th_profile2_cd_action_set 12569 * Purpose: 12570 * Set the color dependent actions of IFP_PROFILE_TWO_SET 12571 * in entbuf which is to be written into POLICY table. 12572 * Parameters: 12573 * unit - BCM device number 12574 * action - Field Action of type bcmFieldActionXXX 12575 * f_ent - entry structure to get policy info from 12576 * fa - field action 12577 * entbuf - (OUT) Field Policy table entry 12578 * Returns: 12579 * BCM_E_NONE 12580 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 12581 * Notes: 12582 * This is a simple read/modify/write pattern. 12583 * FP unit lock should be held by calling function. 12584 */ 12585 int 12586 _bcm_field_th_profile2_cd_action_set(int unit, 12587 bcm_field_action_t action, 12588 _field_entry_t *f_ent, 12589 _field_action_t *fa, uint32 *entbuf) 12590 12591 { 12592 int rv; 12593 _field_stage_t *stage_fc; 12594 _bcm_field_action_offset_t a_offset; 12595 12596 12597 if (NULL == f_ent || NULL == fa || NULL == entbuf) { 12598 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 12599 return BCM_E_PARAM; 12600 } 12601 12602 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 12603 BCM_IF_ERROR_RETURN(rv); 12604 12605 rv = _bcm_field_action_offset_get(unit, stage_fc, action, &a_offset, 0); 12606 BCM_IF_ERROR_RETURN(rv); 12607 12608 switch (action) { 12609 case bcmFieldActionGpPrioPktNew: 12610 case bcmFieldActionYpPrioPktNew: 12611 case bcmFieldActionRpPrioPktNew: 12612 case bcmFieldActionGpTosPrecedenceNew: 12613 case bcmFieldActionGpDscpNew: 12614 case bcmFieldActionYpDscpNew: 12615 case bcmFieldActionRpDscpNew: 12616 case bcmFieldActionGpEcnNew: 12617 case bcmFieldActionYpEcnNew: 12618 case bcmFieldActionRpEcnNew: 12619 a_offset.value[0] = fa->param[0]; 12620 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12621 break; 12622 case bcmFieldActionGpPrioPktCopy: 12623 case bcmFieldActionGpPrioPktTos: 12624 case bcmFieldActionGpPrioPktCancel: 12625 case bcmFieldActionGpDot1pPreserve: 12626 case bcmFieldActionGpTosPrecedenceCopy: 12627 case bcmFieldActionGpDscpCancel: 12628 case bcmFieldActionGpDscpPreserve: 12629 case bcmFieldActionYpPrioPktCopy: 12630 case bcmFieldActionYpPrioPktTos: 12631 case bcmFieldActionYpPrioPktCancel: 12632 case bcmFieldActionYpDot1pPreserve: 12633 case bcmFieldActionYpDscpCancel: 12634 case bcmFieldActionYpDscpPreserve: 12635 case bcmFieldActionRpPrioPktCopy: 12636 case bcmFieldActionRpPrioPktTos: 12637 case bcmFieldActionRpPrioPktCancel: 12638 case bcmFieldActionRpDot1pPreserve: 12639 case bcmFieldActionRpDscpCancel: 12640 case bcmFieldActionRpDscpPreserve: 12641 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12642 break; 12643 default: 12644 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 12645 "%s is not found.\n"), action_name[action])); 12646 return BCM_E_UNAVAIL; 12647 } 12648 12649 return BCM_E_NONE; 12650 } 12651 /* 12652 * Function: 12653 * _bcm_field_th_profile2_action_set 12654 * Purpose: 12655 * Set the color independent actions of IFP_PROFILE_TWO_SET 12656 * in entbuf which is to be written into POLICY table. 12657 * Parameters: 12658 * unit - BCM device number 12659 * action - Field Action of type bcmFieldActionXXX 12660 * f_ent - entry structure to get policy info from 12661 * fa - field action 12662 * entbuf - (OUT) Field Policy table entry 12663 * Returns: 12664 * BCM_E_NONE 12665 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 12666 * Notes: 12667 * This is a simple read/modify/write pattern. 12668 * FP unit lock should be held by calling function. 12669 */ 12670 int 12671 _bcm_field_th_profile2_action_set(int unit, _field_entry_t *f_ent, 12672 _field_action_t *fa, uint32 *entbuf) 12673 12674 { 12675 int rv; 12676 12677 if (NULL == f_ent || NULL == fa || NULL == entbuf) { 12678 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 12679 return BCM_E_PARAM; 12680 } 12681 12682 switch (fa->action) { 12683 case bcmFieldActionEcnNew: 12684 rv = _bcm_field_th_profile2_cd_action_set(unit, 12685 bcmFieldActionGpEcnNew, 12686 f_ent, fa, entbuf); 12687 BCM_IF_ERROR_RETURN(rv); 12688 12689 rv = _bcm_field_th_profile2_cd_action_set(unit, 12690 bcmFieldActionYpEcnNew, 12691 f_ent, fa, entbuf); 12692 BCM_IF_ERROR_RETURN(rv); 12693 12694 rv = _bcm_field_th_profile2_cd_action_set(unit, 12695 bcmFieldActionRpEcnNew, 12696 f_ent, fa, entbuf); 12697 BCM_IF_ERROR_RETURN(rv); 12698 break; 12699 case bcmFieldActionPrioPktNew: 12700 case bcmFieldActionPrioPktAndIntNew: 12701 rv = _bcm_field_th_profile2_cd_action_set(unit, 12702 bcmFieldActionGpPrioPktNew, 12703 f_ent, fa, entbuf); 12704 BCM_IF_ERROR_RETURN(rv); 12705 12706 rv = _bcm_field_th_profile2_cd_action_set(unit, 12707 bcmFieldActionYpPrioPktNew, 12708 f_ent, fa, entbuf); 12709 BCM_IF_ERROR_RETURN(rv); 12710 12711 rv = _bcm_field_th_profile2_cd_action_set(unit, 12712 bcmFieldActionRpPrioPktNew, 12713 f_ent, fa, entbuf); 12714 BCM_IF_ERROR_RETURN(rv); 12715 break; 12716 case bcmFieldActionDscpNew: 12717 rv = _bcm_field_th_profile2_cd_action_set(unit, 12718 bcmFieldActionGpDscpNew, 12719 f_ent, fa, entbuf); 12720 BCM_IF_ERROR_RETURN(rv); 12721 12722 rv = _bcm_field_th_profile2_cd_action_set(unit, 12723 bcmFieldActionYpDscpNew, 12724 f_ent, fa, entbuf); 12725 BCM_IF_ERROR_RETURN(rv); 12726 12727 rv = _bcm_field_th_profile2_cd_action_set(unit, 12728 bcmFieldActionRpDscpNew, 12729 f_ent, fa, entbuf); 12730 BCM_IF_ERROR_RETURN(rv); 12731 break; 12732 case bcmFieldActionDscpCancel: 12733 rv = _bcm_field_th_profile2_cd_action_set(unit, 12734 bcmFieldActionGpDscpCancel, 12735 f_ent, fa, entbuf); 12736 BCM_IF_ERROR_RETURN(rv); 12737 12738 rv = _bcm_field_th_profile2_cd_action_set(unit, 12739 bcmFieldActionYpDscpCancel, 12740 f_ent, fa, entbuf); 12741 BCM_IF_ERROR_RETURN(rv); 12742 12743 rv = _bcm_field_th_profile2_cd_action_set(unit, 12744 bcmFieldActionRpDscpCancel, 12745 f_ent, fa, entbuf); 12746 BCM_IF_ERROR_RETURN(rv); 12747 break; 12748 case bcmFieldActionDscpPreserve: 12749 rv = _bcm_field_th_profile2_cd_action_set(unit, 12750 bcmFieldActionGpDscpPreserve, 12751 f_ent, fa, entbuf); 12752 BCM_IF_ERROR_RETURN(rv); 12753 12754 rv = _bcm_field_th_profile2_cd_action_set(unit, 12755 bcmFieldActionYpDscpPreserve, 12756 f_ent, fa, entbuf); 12757 BCM_IF_ERROR_RETURN(rv); 12758 12759 rv = _bcm_field_th_profile2_cd_action_set(unit, 12760 bcmFieldActionRpDscpPreserve, 12761 f_ent, fa, entbuf); 12762 BCM_IF_ERROR_RETURN(rv); 12763 break; 12764 case bcmFieldActionPrioPktCopy: 12765 case bcmFieldActionPrioPktAndIntCopy: 12766 rv = _bcm_field_th_profile2_cd_action_set(unit, 12767 bcmFieldActionGpPrioPktCopy, 12768 f_ent, fa, entbuf); 12769 BCM_IF_ERROR_RETURN(rv); 12770 12771 rv = _bcm_field_th_profile2_cd_action_set(unit, 12772 bcmFieldActionYpPrioPktCopy, 12773 f_ent, fa, entbuf); 12774 BCM_IF_ERROR_RETURN(rv); 12775 12776 rv = _bcm_field_th_profile2_cd_action_set(unit, 12777 bcmFieldActionRpPrioPktCopy, 12778 f_ent, fa, entbuf); 12779 BCM_IF_ERROR_RETURN(rv); 12780 break; 12781 case bcmFieldActionPrioPktTos: 12782 case bcmFieldActionPrioPktAndIntTos: 12783 rv = _bcm_field_th_profile2_cd_action_set(unit, 12784 bcmFieldActionGpPrioPktTos, 12785 f_ent, fa, entbuf); 12786 BCM_IF_ERROR_RETURN(rv); 12787 12788 rv = _bcm_field_th_profile2_cd_action_set(unit, 12789 bcmFieldActionYpPrioPktTos, 12790 f_ent, fa, entbuf); 12791 BCM_IF_ERROR_RETURN(rv); 12792 12793 rv = _bcm_field_th_profile2_cd_action_set(unit, 12794 bcmFieldActionRpPrioPktTos, 12795 f_ent, fa, entbuf); 12796 BCM_IF_ERROR_RETURN(rv); 12797 break; 12798 case bcmFieldActionPrioPktCancel: 12799 case bcmFieldActionPrioPktAndIntCancel: 12800 rv = _bcm_field_th_profile2_cd_action_set(unit, 12801 bcmFieldActionGpPrioPktCancel, 12802 f_ent, fa, entbuf); 12803 BCM_IF_ERROR_RETURN(rv); 12804 12805 rv = _bcm_field_th_profile2_cd_action_set(unit, 12806 bcmFieldActionYpPrioPktCancel, 12807 f_ent, fa, entbuf); 12808 BCM_IF_ERROR_RETURN(rv); 12809 12810 rv = _bcm_field_th_profile2_cd_action_set(unit, 12811 bcmFieldActionRpPrioPktCancel, 12812 f_ent, fa, entbuf); 12813 BCM_IF_ERROR_RETURN(rv); 12814 break; 12815 case bcmFieldActionDot1pPreserve: 12816 rv = _bcm_field_th_profile2_cd_action_set(unit, 12817 bcmFieldActionGpDot1pPreserve, 12818 f_ent, fa, entbuf); 12819 BCM_IF_ERROR_RETURN(rv); 12820 12821 rv = _bcm_field_th_profile2_cd_action_set(unit, 12822 bcmFieldActionYpDot1pPreserve, 12823 f_ent, fa, entbuf); 12824 BCM_IF_ERROR_RETURN(rv); 12825 12826 rv = _bcm_field_th_profile2_cd_action_set(unit, 12827 bcmFieldActionRpDot1pPreserve, 12828 f_ent, fa, entbuf); 12829 BCM_IF_ERROR_RETURN(rv); 12830 break; 12831 default: 12832 return _bcm_field_th_profile2_cd_action_set(unit, fa->action, 12833 f_ent, fa, entbuf); 12834 } 12835 12836 return BCM_E_NONE; 12837 } 12838 /* 12839 * Function: 12840 * _bcm_field_th_redirect_action_set 12841 * Purpose: 12842 * Set the actions of IFP_REDIRECT_SET in entbuf 12843 * which is to be written into POLICY table. 12844 * Parameters: 12845 * unit - BCM device number 12846 * action - Field Action of type bcmFieldActionXXX 12847 * f_ent - entry structure to get policy info from 12848 * fa - field action 12849 * entbuf - (OUT) Field Policy table entry 12850 * Returns: 12851 * BCM_E_NONE 12852 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 12853 * Notes: 12854 * This is a simple read/modify/write pattern. 12855 * FP unit lock should be held by calling function. 12856 */ 12857 int 12858 _bcm_field_th_redirect_action_set(int unit, 12859 _field_entry_t *f_ent, 12860 _field_action_t *fa, uint32 *entbuf) 12861 12862 { 12863 int rv; 12864 _field_stage_t *stage_fc; 12865 _field_action_params_t params; 12866 _bcm_field_action_offset_t a_offset; 12867 12868 12869 if (NULL == f_ent || NULL == fa || NULL == entbuf) { 12870 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 12871 return BCM_E_PARAM; 12872 } 12873 12874 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 12875 BCM_IF_ERROR_RETURN(rv); 12876 12877 sal_memset(¶ms, 0, sizeof(params)); 12878 12879 switch(fa->action) { 12880 case bcmFieldActionRedirectTrunk: 12881 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12882 if (params.is_dvp) { 12883 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 12884 _BCM_FIELD_ACTION_REDIRECT_DVP); 12885 } else { 12886 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 12887 _BCM_FIELD_ACTION_REDIRECT_TRUNK); 12888 } 12889 a_offset.value[0] = params.redirect_value; 12890 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12891 break; 12892 case bcmFieldActionRedirect: 12893 case bcmFieldActionUnmodifiedPacketRedirectPort: 12894 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12895 if (params.is_dvp) { 12896 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 12897 _BCM_FIELD_ACTION_REDIRECT_DVP); 12898 } else if (params.is_trunk) { 12899 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 12900 _BCM_FIELD_ACTION_REDIRECT_TRUNK); 12901 } else { 12902 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 12903 _BCM_FIELD_ACTION_REDIRECT_DGLP); 12904 } 12905 a_offset.value[0] = params.redirect_value; 12906 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12907 break; 12908 #ifdef INCLUDE_L3 12909 case bcmFieldActionRedirectEgrNextHop: 12910 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12911 if (params.flags & BCM_L3_MULTIPATH) { 12912 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 12913 _BCM_FIELD_ACTION_REDIRECT_ECMP); 12914 } else { 12915 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 12916 _BCM_FIELD_ACTION_REDIRECT_NEXT_HOP); 12917 } 12918 a_offset.value[0] = params.nh_ecmp_id; 12919 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12920 break; 12921 #endif 12922 case bcmFieldActionRedirectCancel: 12923 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 12924 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12925 break; 12926 case bcmFieldActionRedirectPbmp: 12927 case bcmFieldActionRedirectVlan: 12928 case bcmFieldActionRedirectBcastPbmp: 12929 case bcmFieldActionRedirectMcast: 12930 #ifdef INCLUDE_L3 12931 case bcmFieldActionRedirectIpmc: 12932 #endif 12933 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 12934 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12935 a_offset.value[0] = params.redirect_value; 12936 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12937 break; 12938 case bcmFieldActionEgressMask: 12939 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 12940 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12941 a_offset.value[0] = params.redirect_value; 12942 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12943 break; 12944 case bcmFieldActionEgressPortsAdd: 12945 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 12946 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12947 a_offset.value[0] = params.redirect_value; 12948 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12949 break; 12950 case bcmFieldActionFabricEHAddOrUpdate: 12951 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 12952 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 12953 a_offset.value[0] = params.eh_tag; 12954 a_offset.value[1] = params.eh_tag_mask_index; 12955 ACTION_SET(unit, f_ent, entbuf, &a_offset); 12956 break; 12957 default: 12958 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 12959 "%s is not found.\n"), action_name[fa->action])); 12960 return BCM_E_UNAVAIL; 12961 } 12962 12963 return BCM_E_NONE; 12964 } 12965 /* 12966 * Function: 12967 * _bcm_field_th_l3swl2change_action_set 12968 * Purpose: 12969 * Set the actions of IFP_REDIRECT_SET in entbuf 12970 * which is to be written into POLICY table. 12971 * Parameters: 12972 * unit - BCM device number 12973 * action - Field Action of type bcmFieldActionXXX 12974 * f_ent - entry structure to get policy info from 12975 * fa - field action 12976 * entbuf - (OUT) Field Policy table entry 12977 * Returns: 12978 * BCM_E_NONE 12979 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 12980 * Notes: 12981 * This is a simple read/modify/write pattern. 12982 * FP unit lock should be held by calling function. 12983 */ 12984 int 12985 _bcm_field_th_l3swl2change_action_set(int unit, 12986 _field_entry_t *f_ent, 12987 _field_action_t *fa, uint32 *entbuf) 12988 { 12989 int rv; 12990 _field_stage_t *stage_fc; 12991 _field_action_params_t params; 12992 _bcm_field_action_offset_t a_offset; 12993 12994 if (NULL == f_ent || NULL == fa || NULL == entbuf) { 12995 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 12996 return BCM_E_PARAM; 12997 } 12998 12999 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 13000 BCM_IF_ERROR_RETURN(rv); 13001 13002 sal_memset(¶ms, 0, sizeof(params)); 13003 13004 switch (fa->action) { 13005 case bcmFieldActionEgressClassSelect: 13006 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 13007 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 13008 a_offset.value[0] = params.i2e_cl_sel; 13009 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13010 break; 13011 case bcmFieldActionHiGigClassSelect: 13012 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 13013 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 13014 a_offset.value[0] = params.i2e_hg_cl_sel; 13015 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13016 break; 13017 case bcmFieldActionNewClassId: 13018 case bcmFieldActionAddClassTag: 13019 case bcmFieldActionMultipathHash: 13020 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 13021 a_offset.value[0] = fa->param[0]; 13022 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13023 break; 13024 case bcmFieldActionDstMacNew: 13025 case bcmFieldActionSrcMacNew: 13026 case bcmFieldActionOuterVlanNew: 13027 case bcmFieldActionVnTagNew: 13028 case bcmFieldActionVnTagDelete: 13029 case bcmFieldActionEtagNew: 13030 case bcmFieldActionEtagDelete: 13031 case bcmFieldActionChangeL2Fields: 13032 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 13033 a_offset.value[0] = fa->hw_index; 13034 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13035 break; 13036 case bcmFieldActionFabricQueue: 13037 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 13038 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 13039 a_offset.value[0] = params.fabric_tag_type; 13040 a_offset.value[1] = params.fabric_tag; 13041 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13042 break; 13043 case bcmFieldActionL3Switch: 13044 #ifdef INCLUDE_L3 13045 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 13046 if (params.flags & BCM_L3_MULTIPATH) { 13047 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 13048 _BCM_FIELD_ACTION_L3SWITCH_ECMP); 13049 a_offset.value[0] = params.nh_ecmp_id; 13050 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13051 } else { 13052 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 13053 _BCM_FIELD_ACTION_L3SWITCH_NEXT_HOP); 13054 a_offset.value[0] = params.nh_ecmp_id; 13055 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13056 } 13057 #else 13058 return BCM_E_UNAVAIL; 13059 #endif 13060 break; 13061 case bcmFieldActionL3SwitchCancel: 13062 case bcmFieldActionChangeL2FieldsCancel: 13063 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 13064 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13065 break; 13066 case bcmFieldActionBFDSessionIdNew: 13067 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0); 13068 a_offset.value[0] = fa->param[0]; 13069 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13070 break; 13071 default: 13072 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 13073 "%s is not found.\n"), action_name[fa->action])); 13074 return BCM_E_UNAVAIL; 13075 } 13076 13077 return BCM_E_NONE; 13078 } 13079 /* 13080 * Function: 13081 * _bcm_field_th_misc_cd_action_set 13082 * Purpose: 13083 * Set the miscellaneous color dependent actions in entbuf which is to be 13084 * written into POLICY table. 13085 * Parameters: 13086 * unit - BCM device number 13087 * action - Field Action of type bcmFieldActionXXX 13088 * f_ent - entry structure to get policy info from 13089 * fa - field action 13090 * entbuf - (OUT) Field Policy table entry 13091 * Returns: 13092 * BCM_E_NONE 13093 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 13094 * Notes: 13095 * This is a simple read/modify/write pattern. 13096 * FP unit lock should be held by calling function. 13097 */ 13098 int 13099 _bcm_field_th_misc_cd_action_set(int unit, 13100 bcm_field_action_t action, 13101 _field_entry_t *f_ent, 13102 _field_action_t *fa, uint32 *entbuf) 13103 { 13104 int rv; 13105 _field_stage_t *stage_fc; 13106 _field_action_params_t params; 13107 _bcm_field_action_offset_t a_offset; 13108 13109 if (NULL == f_ent || NULL == fa || NULL == entbuf) { 13110 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 13111 return BCM_E_PARAM; 13112 } 13113 13114 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 13115 BCM_IF_ERROR_RETURN(rv); 13116 13117 rv = _bcm_field_action_offset_get(unit, stage_fc, action, &a_offset, 0); 13118 BCM_IF_ERROR_RETURN(rv); 13119 13120 sal_memset(¶ms, 0, sizeof(params)); 13121 13122 switch (action) { 13123 case bcmFieldActionGpSwitchToCpuReinstate: 13124 case bcmFieldActionYpSwitchToCpuReinstate: 13125 case bcmFieldActionRpSwitchToCpuReinstate: 13126 case bcmFieldActionGpDrop: 13127 case bcmFieldActionYpDrop: 13128 case bcmFieldActionRpDrop: 13129 case bcmFieldActionGpDropCancel: 13130 case bcmFieldActionYpDropCancel: 13131 case bcmFieldActionRpDropCancel: 13132 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13133 break; 13134 case bcmFieldActionGpTimeStampToCpu: 13135 case bcmFieldActionYpTimeStampToCpu: 13136 case bcmFieldActionRpTimeStampToCpu: 13137 case bcmFieldActionGpCopyToCpu: 13138 case bcmFieldActionYpCopyToCpu: 13139 case bcmFieldActionRpCopyToCpu: 13140 case bcmFieldActionGpOamCopyToCpu: 13141 case bcmFieldActionYpOamCopyToCpu: 13142 case bcmFieldActionRpOamCopyToCpu: 13143 if (fa->param[0]) { 13144 a_offset.value[0] = fa->param[1]; 13145 } else { 13146 a_offset.value[0] = 0; 13147 } 13148 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13149 break; 13150 case bcmFieldActionGpCopyToCpuCancel: 13151 sal_memset(&a_offset, 0 , sizeof(a_offset)); 13152 action = bcmFieldActionGpSwitchToCpuCancel; 13153 ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset); 13154 if (a_offset.value[0] == 0x3) { 13155 a_offset.value[0] = 0x6; 13156 } else { 13157 a_offset.value[0] = 0x2; 13158 } 13159 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13160 break; 13161 case bcmFieldActionYpCopyToCpuCancel: 13162 sal_memset(&a_offset, 0 , sizeof(a_offset)); 13163 action = bcmFieldActionYpSwitchToCpuCancel; 13164 ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset); 13165 if (a_offset.value[0] == 0x3) { 13166 a_offset.value[0] = 0x6; 13167 } else { 13168 a_offset.value[0] = 0x2; 13169 } 13170 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13171 break; 13172 case bcmFieldActionRpCopyToCpuCancel: 13173 sal_memset(&a_offset, 0 , sizeof(a_offset)); 13174 action = bcmFieldActionRpSwitchToCpuCancel; 13175 ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset); 13176 if (a_offset.value[0] == 0x3) { 13177 a_offset.value[0] = 0x6; 13178 } else { 13179 a_offset.value[0] = 0x2; 13180 } 13181 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13182 break; 13183 case bcmFieldActionGpSwitchToCpuCancel: 13184 sal_memset(&a_offset, 0 , sizeof(a_offset)); 13185 action = bcmFieldActionGpCopyToCpuCancel; 13186 ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset); 13187 if (a_offset.value[0] == 0x2) { 13188 a_offset.value[0] = 0x6; 13189 } else { 13190 a_offset.value[0] = 0x3; 13191 } 13192 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13193 break; 13194 case bcmFieldActionYpSwitchToCpuCancel: 13195 sal_memset(&a_offset, 0 , sizeof(a_offset)); 13196 action = bcmFieldActionYpCopyToCpuCancel; 13197 ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset); 13198 if (a_offset.value[0] == 0x2) { 13199 a_offset.value[0] = 0x6; 13200 } else { 13201 a_offset.value[0] = 0x3; 13202 } 13203 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13204 break; 13205 case bcmFieldActionRpSwitchToCpuCancel: 13206 sal_memset(&a_offset, 0 , sizeof(a_offset)); 13207 action = bcmFieldActionRpCopyToCpuCancel; 13208 ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset); 13209 if (a_offset.value[0] == 0x2) { 13210 a_offset.value[0] = 0x6; 13211 } else { 13212 a_offset.value[0] = 0x3; 13213 } 13214 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13215 break; 13216 case bcmFieldActionRpPrioPktAndIntCopy: 13217 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13218 rv = _bcm_field_th_profile1_cd_action_set(unit, 13219 bcmFieldActionRpPrioIntCopy, 13220 f_ent, fa, entbuf); 13221 BCM_IF_ERROR_RETURN(rv); 13222 } 13223 rv = _bcm_field_th_profile2_cd_action_set(unit, 13224 bcmFieldActionRpPrioPktCopy, 13225 f_ent, fa, entbuf); 13226 BCM_IF_ERROR_RETURN(rv); 13227 break; 13228 case bcmFieldActionRpPrioPktAndIntNew: 13229 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13230 rv = _bcm_field_th_profile1_cd_action_set(unit, 13231 bcmFieldActionRpPrioIntNew, 13232 f_ent, fa, entbuf); 13233 BCM_IF_ERROR_RETURN(rv); 13234 } 13235 rv = _bcm_field_th_profile2_cd_action_set(unit, 13236 bcmFieldActionRpPrioPktNew, 13237 f_ent, fa, entbuf); 13238 BCM_IF_ERROR_RETURN(rv); 13239 break; 13240 case bcmFieldActionRpPrioPktAndIntTos: 13241 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13242 rv = _bcm_field_th_profile1_cd_action_set(unit, 13243 bcmFieldActionRpPrioIntTos, 13244 f_ent, fa, entbuf); 13245 BCM_IF_ERROR_RETURN(rv); 13246 } 13247 rv = _bcm_field_th_profile2_cd_action_set(unit, 13248 bcmFieldActionRpPrioPktTos, 13249 f_ent, fa, entbuf); 13250 BCM_IF_ERROR_RETURN(rv); 13251 break; 13252 case bcmFieldActionRpPrioPktAndIntCancel: 13253 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13254 rv = _bcm_field_th_profile1_cd_action_set(unit, 13255 bcmFieldActionRpPrioIntCancel, 13256 f_ent, fa, entbuf); 13257 BCM_IF_ERROR_RETURN(rv); 13258 } 13259 rv = _bcm_field_th_profile2_cd_action_set(unit, 13260 bcmFieldActionRpPrioPktCancel, 13261 f_ent, fa, entbuf); 13262 BCM_IF_ERROR_RETURN(rv); 13263 break; 13264 case bcmFieldActionGpPrioPktAndIntCopy: 13265 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13266 rv = _bcm_field_th_profile1_cd_action_set(unit, 13267 bcmFieldActionGpPrioIntCopy, 13268 f_ent, fa, entbuf); 13269 BCM_IF_ERROR_RETURN(rv); 13270 } 13271 rv = _bcm_field_th_profile2_cd_action_set(unit, 13272 bcmFieldActionGpPrioPktCopy, 13273 f_ent, fa, entbuf); 13274 BCM_IF_ERROR_RETURN(rv); 13275 break; 13276 case bcmFieldActionGpPrioPktAndIntNew: 13277 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13278 rv = _bcm_field_th_profile1_cd_action_set(unit, 13279 bcmFieldActionGpPrioIntNew, 13280 f_ent, fa, entbuf); 13281 BCM_IF_ERROR_RETURN(rv); 13282 } 13283 rv = _bcm_field_th_profile2_cd_action_set(unit, 13284 bcmFieldActionGpPrioPktNew, 13285 f_ent, fa, entbuf); 13286 BCM_IF_ERROR_RETURN(rv); 13287 break; 13288 case bcmFieldActionGpPrioPktAndIntTos: 13289 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13290 rv = _bcm_field_th_profile1_cd_action_set(unit, 13291 bcmFieldActionGpPrioIntTos, 13292 f_ent, fa, entbuf); 13293 BCM_IF_ERROR_RETURN(rv); 13294 } 13295 rv = _bcm_field_th_profile2_cd_action_set(unit, 13296 bcmFieldActionGpPrioPktTos, 13297 f_ent, fa, entbuf); 13298 BCM_IF_ERROR_RETURN(rv); 13299 break; 13300 case bcmFieldActionGpPrioPktAndIntCancel: 13301 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13302 rv = _bcm_field_th_profile1_cd_action_set(unit, 13303 bcmFieldActionGpPrioIntCancel, 13304 f_ent, fa, entbuf); 13305 BCM_IF_ERROR_RETURN(rv); 13306 } 13307 rv = _bcm_field_th_profile2_cd_action_set(unit, 13308 bcmFieldActionGpPrioPktCancel, 13309 f_ent, fa, entbuf); 13310 BCM_IF_ERROR_RETURN(rv); 13311 break; 13312 case bcmFieldActionYpPrioPktAndIntCopy: 13313 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13314 rv = _bcm_field_th_profile1_cd_action_set(unit, 13315 bcmFieldActionYpPrioIntCopy, 13316 f_ent, fa, entbuf); 13317 BCM_IF_ERROR_RETURN(rv); 13318 } 13319 rv = _bcm_field_th_profile2_cd_action_set(unit, 13320 bcmFieldActionYpPrioPktCopy, 13321 f_ent, fa, entbuf); 13322 BCM_IF_ERROR_RETURN(rv); 13323 break; 13324 case bcmFieldActionYpPrioPktAndIntNew: 13325 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13326 rv = _bcm_field_th_profile1_cd_action_set(unit, 13327 bcmFieldActionYpPrioIntNew, 13328 f_ent, fa, entbuf); 13329 BCM_IF_ERROR_RETURN(rv); 13330 } 13331 rv = _bcm_field_th_profile2_cd_action_set(unit, 13332 bcmFieldActionYpPrioPktNew, 13333 f_ent, fa, entbuf); 13334 BCM_IF_ERROR_RETURN(rv); 13335 break; 13336 case bcmFieldActionYpPrioPktAndIntTos: 13337 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13338 rv = _bcm_field_th_profile1_cd_action_set(unit, 13339 bcmFieldActionYpPrioIntTos, 13340 f_ent, fa, entbuf); 13341 BCM_IF_ERROR_RETURN(rv); 13342 } 13343 rv = _bcm_field_th_profile2_cd_action_set(unit, 13344 bcmFieldActionYpPrioPktTos, 13345 f_ent, fa, entbuf); 13346 BCM_IF_ERROR_RETURN(rv); 13347 break; 13348 case bcmFieldActionYpPrioPktAndIntCancel: 13349 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13350 rv = _bcm_field_th_profile1_cd_action_set(unit, 13351 bcmFieldActionYpPrioIntCancel, 13352 f_ent, fa, entbuf); 13353 BCM_IF_ERROR_RETURN(rv); 13354 } 13355 rv = _bcm_field_th_profile2_cd_action_set(unit, 13356 bcmFieldActionYpPrioPktCancel, 13357 f_ent, fa, entbuf); 13358 BCM_IF_ERROR_RETURN(rv); 13359 break; 13360 13361 default: 13362 LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, 13363 "%s is not found.\n"), action_name[action])); 13364 return BCM_E_UNAVAIL; 13365 } 13366 13367 return BCM_E_NONE; 13368 13369 } 13370 13371 /* 13372 * Function: 13373 * _bcm_field_th_misc_action_set 13374 * Purpose: 13375 * Set the miscellaneous actions in entbuf which is to be 13376 * written into POLICY table. 13377 * Parameters: 13378 * unit - BCM device number 13379 * action - Field Action of type bcmFieldActionXXX 13380 * f_ent - entry structure to get policy info from 13381 * fa - field action 13382 * entbuf - (OUT) Field Policy table entry 13383 * Returns: 13384 * BCM_E_NONE 13385 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 13386 * Notes: 13387 * This is a simple read/modify/write pattern. 13388 * FP unit lock should be held by calling function. 13389 */ 13390 int 13391 _bcm_field_th_misc_action_set(int unit, 13392 _field_entry_t *f_ent, 13393 _field_action_t *fa, uint32 *entbuf) 13394 { 13395 int rv; 13396 _field_stage_t *stage_fc; 13397 _field_action_params_t params; 13398 _bcm_field_action_offset_t a_offset; 13399 13400 13401 if (NULL == f_ent || NULL == fa || NULL == entbuf) { 13402 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 13403 return BCM_E_PARAM; 13404 } 13405 13406 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 13407 BCM_IF_ERROR_RETURN(rv); 13408 13409 rv = _bcm_field_action_offset_get(unit, stage_fc, fa->action, &a_offset, 0); 13410 BCM_IF_ERROR_RETURN(rv); 13411 13412 sal_memset(¶ms, 0, sizeof(params)); 13413 13414 switch (fa->action) { 13415 case bcmFieldActionHgTrunkRandomRoundRobinHashCancel: 13416 case bcmFieldActionTrunkRandomRoundRobinHashCancel: 13417 case bcmFieldActionEcmpRandomRoundRobinHashCancel: 13418 case bcmFieldActionNatCancel: 13419 case bcmFieldActionDoNotCheckUrpf: 13420 case bcmFieldActionDoNotChangeTtl: 13421 case bcmFieldActionMirrorOverride: 13422 case bcmFieldActionIngSampleEnable: 13423 case bcmFieldActionNat: 13424 case bcmFieldActionPacketTraceEnable: 13425 case bcmFieldActionDoNotCutThrough: 13426 case bcmFieldActionEgressTimeStampInsert: 13427 case bcmFieldActionIngressTimeStampInsert: 13428 case bcmFieldActionIngressTimeStampInsertCancel: 13429 case bcmFieldActionEgressTimeStampInsertCancel: 13430 case bcmFieldActionDynamicTrunkEnable: 13431 case bcmFieldActionDynamicTrunkCancel: 13432 case bcmFieldActionDynamicHgTrunkEnable: 13433 case bcmFieldActionDynamicHgTrunkCancel: 13434 #if defined(INCLUDE_L3) 13435 case bcmFieldActionDynamicEcmpEnable: 13436 case bcmFieldActionDynamicEcmpCancel: 13437 case bcmFieldActionRecoverableDropCancel: 13438 #endif /* INCLUDE_L3 */ 13439 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13440 break; 13441 #ifdef INCLUDE_L3 13442 case bcmFieldActionNatEgressOverride: 13443 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 13444 a_offset.value[0] = params.hw_idx; 13445 a_offset.value[1] = params.hw_half; 13446 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13447 break; 13448 #endif 13449 case bcmFieldActionCosQCpuNew: 13450 case bcmFieldActionServicePoolIdNew: 13451 a_offset.value[0] = fa->param[0]; 13452 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13453 break; 13454 case bcmFieldActionServicePoolIdPrecedenceNew: 13455 a_offset.value[0] = fa->param[0]; 13456 a_offset.value[1] = ((BCM_FIELD_COLOR_GREEN == fa->param[1]) ? 0 : \ 13457 ((BCM_FIELD_COLOR_YELLOW == fa->param[1]) ? 3 : 1)); 13458 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13459 break; 13460 case bcmFieldActionMirrorIngress: 13461 case bcmFieldActionMirrorEgress: 13462 sal_memset(&a_offset, 0 , sizeof(a_offset)); 13463 ACTION_GET(unit, f_ent, entbuf, fa->action, 0, &a_offset); 13464 ACTION_RESOLVE(unit, f_ent, fa, ¶ms); 13465 a_offset.value[0] |= (0x1 << params.mtp_type_index); 13466 a_offset.value[1] |= (0x3 & params.mtp_index) << (2 * params.mtp_type_index); 13467 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13468 if ((fa->flags & _BCM_FIELD_ACTION_CTC_MANIPULATE_FLAG) && 13469 (fa->param[2] == 1)) { 13470 int matched_rule = fa->param[3]; 13471 13472 sal_memset(&a_offset, 0 , sizeof(a_offset)); 13473 ACTION_GET(unit, f_ent, entbuf, bcmFieldActionFabricQueue, 0, &a_offset); 13474 a_offset.value[0] = 0; 13475 a_offset.value[1] = matched_rule; 13476 a_offset.value[2] = 0x3; 13477 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13478 } 13479 13480 break; 13481 case bcmFieldActionDrop: 13482 rv = _bcm_field_th_misc_cd_action_set(unit, 13483 bcmFieldActionGpDrop, 13484 f_ent, fa, entbuf); 13485 BCM_IF_ERROR_RETURN(rv); 13486 13487 rv = _bcm_field_th_misc_cd_action_set(unit, 13488 bcmFieldActionYpDrop, 13489 f_ent, fa, entbuf); 13490 BCM_IF_ERROR_RETURN(rv); 13491 13492 rv = _bcm_field_th_misc_cd_action_set(unit, 13493 bcmFieldActionRpDrop, 13494 f_ent, fa, entbuf); 13495 BCM_IF_ERROR_RETURN(rv); 13496 break; 13497 case bcmFieldActionDropCancel: 13498 rv = _bcm_field_th_misc_cd_action_set(unit, 13499 bcmFieldActionGpDropCancel, 13500 f_ent, fa, entbuf); 13501 BCM_IF_ERROR_RETURN(rv); 13502 13503 rv = _bcm_field_th_misc_cd_action_set(unit, 13504 bcmFieldActionYpDropCancel, 13505 f_ent, fa, entbuf); 13506 BCM_IF_ERROR_RETURN(rv); 13507 13508 rv = _bcm_field_th_misc_cd_action_set(unit, 13509 bcmFieldActionRpDropCancel, 13510 f_ent, fa, entbuf); 13511 BCM_IF_ERROR_RETURN(rv); 13512 break; 13513 case bcmFieldActionOamCopyToCpu: 13514 rv = _bcm_field_th_misc_cd_action_set(unit, 13515 bcmFieldActionGpOamCopyToCpu, 13516 f_ent, fa, entbuf); 13517 BCM_IF_ERROR_RETURN(rv); 13518 13519 rv = _bcm_field_th_misc_cd_action_set(unit, 13520 bcmFieldActionYpOamCopyToCpu, 13521 f_ent, fa, entbuf); 13522 BCM_IF_ERROR_RETURN(rv); 13523 13524 rv = _bcm_field_th_misc_cd_action_set(unit, 13525 bcmFieldActionRpOamCopyToCpu, 13526 f_ent, fa, entbuf); 13527 BCM_IF_ERROR_RETURN(rv); 13528 break; 13529 case bcmFieldActionCopyToCpu: 13530 rv = _bcm_field_th_misc_cd_action_set(unit, 13531 bcmFieldActionGpCopyToCpu, 13532 f_ent, fa, entbuf); 13533 BCM_IF_ERROR_RETURN(rv); 13534 13535 rv = _bcm_field_th_misc_cd_action_set(unit, 13536 bcmFieldActionYpCopyToCpu, 13537 f_ent, fa, entbuf); 13538 BCM_IF_ERROR_RETURN(rv); 13539 13540 rv = _bcm_field_th_misc_cd_action_set(unit, 13541 bcmFieldActionRpCopyToCpu, 13542 f_ent, fa, entbuf); 13543 BCM_IF_ERROR_RETURN(rv); 13544 break; 13545 case bcmFieldActionCopyToCpuCancel: 13546 rv = _bcm_field_th_misc_cd_action_set(unit, 13547 bcmFieldActionGpCopyToCpuCancel, 13548 f_ent, fa, entbuf); 13549 BCM_IF_ERROR_RETURN(rv); 13550 13551 rv = _bcm_field_th_misc_cd_action_set(unit, 13552 bcmFieldActionYpCopyToCpuCancel, 13553 f_ent, fa, entbuf); 13554 BCM_IF_ERROR_RETURN(rv); 13555 13556 rv = _bcm_field_th_misc_cd_action_set(unit, 13557 bcmFieldActionRpCopyToCpuCancel, 13558 f_ent, fa, entbuf); 13559 BCM_IF_ERROR_RETURN(rv); 13560 break; 13561 case bcmFieldActionSwitchToCpuCancel: 13562 rv = _bcm_field_th_misc_cd_action_set(unit, 13563 bcmFieldActionGpSwitchToCpuCancel, 13564 f_ent, fa, entbuf); 13565 BCM_IF_ERROR_RETURN(rv); 13566 13567 rv = _bcm_field_th_misc_cd_action_set(unit, 13568 bcmFieldActionYpSwitchToCpuCancel, 13569 f_ent, fa, entbuf); 13570 BCM_IF_ERROR_RETURN(rv); 13571 13572 rv = _bcm_field_th_misc_cd_action_set(unit, 13573 bcmFieldActionRpSwitchToCpuCancel, 13574 f_ent, fa, entbuf); 13575 BCM_IF_ERROR_RETURN(rv); 13576 break; 13577 case bcmFieldActionSwitchToCpuReinstate: 13578 rv = _bcm_field_th_misc_cd_action_set(unit, 13579 bcmFieldActionGpSwitchToCpuReinstate, 13580 f_ent, fa, entbuf); 13581 BCM_IF_ERROR_RETURN(rv); 13582 13583 rv = _bcm_field_th_misc_cd_action_set(unit, 13584 bcmFieldActionYpSwitchToCpuReinstate, 13585 f_ent, fa, entbuf); 13586 BCM_IF_ERROR_RETURN(rv); 13587 13588 rv = _bcm_field_th_misc_cd_action_set(unit, 13589 bcmFieldActionRpSwitchToCpuReinstate, 13590 f_ent, fa, entbuf); 13591 BCM_IF_ERROR_RETURN(rv); 13592 break; 13593 case bcmFieldActionTimeStampToCpu: 13594 rv = _bcm_field_th_misc_cd_action_set(unit, 13595 bcmFieldActionGpTimeStampToCpu, 13596 f_ent, fa, entbuf); 13597 BCM_IF_ERROR_RETURN(rv); 13598 13599 rv = _bcm_field_th_misc_cd_action_set(unit, 13600 bcmFieldActionYpTimeStampToCpu, 13601 f_ent, fa, entbuf); 13602 BCM_IF_ERROR_RETURN(rv); 13603 13604 rv = _bcm_field_th_misc_cd_action_set(unit, 13605 bcmFieldActionRpTimeStampToCpu, 13606 f_ent, fa, entbuf); 13607 BCM_IF_ERROR_RETURN(rv); 13608 break; 13609 case bcmFieldActionGpTimeStampToCpu: 13610 rv = _bcm_field_th_misc_cd_action_set(unit, 13611 bcmFieldActionGpTimeStampToCpu, 13612 f_ent, fa, entbuf); 13613 BCM_IF_ERROR_RETURN(rv); 13614 break; 13615 case bcmFieldActionYpTimeStampToCpu: 13616 rv = _bcm_field_th_misc_cd_action_set(unit, 13617 bcmFieldActionYpTimeStampToCpu, 13618 f_ent, fa, entbuf); 13619 BCM_IF_ERROR_RETURN(rv); 13620 break; 13621 case bcmFieldActionRpTimeStampToCpu: 13622 rv = _bcm_field_th_misc_cd_action_set(unit, 13623 bcmFieldActionRpTimeStampToCpu, 13624 f_ent, fa, entbuf); 13625 BCM_IF_ERROR_RETURN(rv); 13626 break; 13627 case bcmFieldActionTimeStampToCpuCancel: 13628 rv = _bcm_field_th_misc_cd_action_set(unit, 13629 bcmFieldActionGpCopyToCpuCancel, 13630 f_ent, fa, entbuf); 13631 BCM_IF_ERROR_RETURN(rv); 13632 13633 rv = _bcm_field_th_misc_cd_action_set(unit, 13634 bcmFieldActionYpCopyToCpuCancel, 13635 f_ent, fa, entbuf); 13636 BCM_IF_ERROR_RETURN(rv); 13637 13638 rv = _bcm_field_th_misc_cd_action_set(unit, 13639 bcmFieldActionRpCopyToCpuCancel, 13640 f_ent, fa, entbuf); 13641 BCM_IF_ERROR_RETURN(rv); 13642 break; 13643 case bcmFieldActionGpTimeStampToCpuCancel: 13644 rv = _bcm_field_th_misc_cd_action_set(unit, 13645 bcmFieldActionGpCopyToCpuCancel, 13646 f_ent, fa, entbuf); 13647 BCM_IF_ERROR_RETURN(rv); 13648 break; 13649 case bcmFieldActionYpTimeStampToCpuCancel: 13650 rv = _bcm_field_th_misc_cd_action_set(unit, 13651 bcmFieldActionYpCopyToCpuCancel, 13652 f_ent, fa, entbuf); 13653 BCM_IF_ERROR_RETURN(rv); 13654 break; 13655 case bcmFieldActionRpTimeStampToCpuCancel: 13656 rv = _bcm_field_th_misc_cd_action_set(unit, 13657 bcmFieldActionRpCopyToCpuCancel, 13658 f_ent, fa, entbuf); 13659 BCM_IF_ERROR_RETURN(rv); 13660 break; 13661 case bcmFieldActionPrioPktAndIntCopy: 13662 case bcmFieldActionPrioPktAndIntNew: 13663 case bcmFieldActionPrioPktAndIntTos: 13664 case bcmFieldActionPrioPktAndIntCancel: 13665 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 13666 rv = _bcm_field_th_profile1_action_set(unit, 13667 f_ent, fa, entbuf); 13668 13669 BCM_IF_ERROR_RETURN(rv); 13670 } 13671 rv = _bcm_field_th_profile2_action_set(unit, 13672 f_ent, fa, entbuf); 13673 BCM_IF_ERROR_RETURN(rv); 13674 break; 13675 #ifdef INCLUDE_L3 13676 case bcmFieldActionDgm: 13677 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13678 break; 13679 case bcmFieldActionDgmThreshold: 13680 case bcmFieldActionDgmBias: 13681 case bcmFieldActionDgmCost: 13682 a_offset.value[0] = fa->param[0]; 13683 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13684 break; 13685 #endif /*INCLUDE_L3*/ 13686 case bcmFieldActionEcmpResilientHashEnable: 13687 case bcmFieldActionEcmpResilientHashDisable: 13688 case bcmFieldActionTrunkResilientHashEnable: 13689 case bcmFieldActionTrunkResilientHashDisable: 13690 case bcmFieldActionHiGigTrunkResilientHashEnable: 13691 case bcmFieldActionHiGigTrunkResilientHashDisable: 13692 case bcmFieldActionFibreChanZoneCheckActionCancel: 13693 case bcmFieldActionIntEncapEnable: 13694 case bcmFieldActionIntEncapDisable: 13695 case bcmFieldActionElephantColorEnable: 13696 case bcmFieldActionElephantColorDisable: 13697 case bcmFieldActionElephantQueueEnable: 13698 case bcmFieldActionElephantQueueDisable: 13699 case bcmFieldActionElephantLookupEnable: 13700 case bcmFieldActionElephantLookupDisable: 13701 case bcmFieldActionNshEncapEnable: 13702 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13703 break; 13704 case bcmFieldActionAssignExtractionCtrlId: 13705 case bcmFieldActionAssignEditCtrlId: 13706 a_offset.value[0] = fa->param[0]; 13707 a_offset.value[1] = fa->param[1]; 13708 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13709 break; 13710 case bcmFieldActionAssignOpaqueObject4: 13711 case bcmFieldActionAssignOpaqueObject3: 13712 case bcmFieldActionAssignOpaqueObject2: 13713 case bcmFieldActionAssignOpaqueObject1: 13714 a_offset.value[0] = fa->param[0]; 13715 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13716 break; 13717 #if defined (BCM_TRIDENT3_SUPPORT) 13718 case bcmFieldActionEgressFlowControlEnable: 13719 case bcmFieldActionEgressFlowEncapEnable: 13720 case bcmFieldActionLoopbackSubtype: 13721 case bcmFieldActionLoopbackType: 13722 case bcmFieldActionAssignChangeL2FieldsClassId: 13723 BCM_IF_ERROR_RETURN(_field_td3_flex_action_set(unit, fa, &a_offset)); 13724 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13725 break; 13726 #endif 13727 case bcmFieldActionFibreChanVsanId: 13728 a_offset.value[0] = fa->param[0]; 13729 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13730 break; 13731 case bcmFieldActionFibreChanIntVsanPri: 13732 a_offset.value[1] = fa->param[0]; 13733 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13734 break; 13735 case bcmFieldActionMatchPbmpDrop: 13736 a_offset.value[0] = fa->hw_index; 13737 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13738 break; 13739 case bcmFieldActionMatchPbmpRedirect: 13740 a_offset.value[0] = fa->hw_index; 13741 a_offset.value[1] = fa->param[0]; 13742 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13743 break; 13744 case bcmFieldActionDlbEcmpMonitorEnable: 13745 case bcmFieldActionMirrorZeroingEnable: 13746 a_offset.value[0] = fa->param[0]; 13747 ACTION_SET(unit, f_ent, entbuf, &a_offset); 13748 break; 13749 default: 13750 return _bcm_field_th_misc_cd_action_set(unit, fa->action, 13751 f_ent, fa, entbuf); 13752 } 13753 13754 return BCM_E_NONE; 13755 } 13756 13757 /* 13758 * Function: 13759 * _bcm_field_th_action_set 13760 * Purpose: 13761 * Set the actions in entbuf which is to be written into POLICY table. 13762 * Parameters: 13763 * unit - BCM device number 13764 * mem - Policy table memory 13765 * f_ent - entry structure to get policy info from 13766 * tcam_idx - index into TCAM 13767 * fa - field action 13768 * buf - (OUT) Field Policy table entry 13769 * Returns: 13770 * BCM_E_NONE 13771 * BCM_E_PARAM - Action parameter out-of-range or unrecognized action. 13772 * Notes: 13773 * This is a simple read/modify/write pattern. 13774 * FP unit lock should be held by calling function. 13775 */ 13776 int 13777 _bcm_field_th_action_set(int unit, soc_mem_t mem, _field_entry_t *f_ent, 13778 int tcam_idx, _field_action_t *fa, uint32 *entbuf) 13779 { 13780 int rv; 13781 13782 if (NULL == f_ent || NULL == fa || NULL == entbuf) { 13783 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 13784 return (BCM_E_PARAM); 13785 } 13786 13787 switch (fa->action) { 13788 case bcmFieldActionCosQNew: 13789 case bcmFieldActionGpCosQNew: 13790 case bcmFieldActionYpCosQNew: 13791 case bcmFieldActionRpCosQNew: 13792 case bcmFieldActionCosMapNew: 13793 case bcmFieldActionGpCosMapNew: 13794 case bcmFieldActionYpCosMapNew: 13795 case bcmFieldActionRpCosMapNew: 13796 case bcmFieldActionUcastCosQNew: 13797 case bcmFieldActionGpUcastCosQNew: 13798 case bcmFieldActionYpUcastCosQNew: 13799 case bcmFieldActionRpUcastCosQNew: 13800 case bcmFieldActionMcastCosQNew: 13801 case bcmFieldActionGpMcastCosQNew: 13802 case bcmFieldActionYpMcastCosQNew: 13803 case bcmFieldActionRpMcastCosQNew: 13804 case bcmFieldActionPrioIntNew: 13805 case bcmFieldActionGpPrioIntNew: 13806 case bcmFieldActionYpPrioIntNew: 13807 case bcmFieldActionRpPrioIntNew: 13808 case bcmFieldActionDropPrecedence: 13809 case bcmFieldActionGpDropPrecedence: 13810 case bcmFieldActionYpDropPrecedence: 13811 case bcmFieldActionRpDropPrecedence: 13812 case bcmFieldActionPrioIntCopy: 13813 case bcmFieldActionPrioIntTos: 13814 case bcmFieldActionPrioIntCancel: 13815 case bcmFieldActionGpPrioIntCopy: 13816 case bcmFieldActionGpPrioIntTos: 13817 case bcmFieldActionGpPrioIntCancel: 13818 case bcmFieldActionYpPrioIntCopy: 13819 case bcmFieldActionYpPrioIntTos: 13820 case bcmFieldActionYpPrioIntCancel: 13821 case bcmFieldActionRpPrioIntCopy: 13822 case bcmFieldActionRpPrioIntTos: 13823 case bcmFieldActionRpPrioIntCancel: 13824 case bcmFieldActionGpIntCongestionNotificationNew: 13825 case bcmFieldActionYpIntCongestionNotificationNew: 13826 case bcmFieldActionRpIntCongestionNotificationNew: 13827 case bcmFieldActionUntaggedPacketPriorityNew: 13828 rv = _bcm_field_th_profile1_action_set(unit, f_ent, fa, entbuf); 13829 BCM_IF_ERROR_RETURN(rv); 13830 break; 13831 case bcmFieldActionEcnNew: 13832 case bcmFieldActionGpEcnNew: 13833 case bcmFieldActionYpEcnNew: 13834 case bcmFieldActionRpEcnNew: 13835 case bcmFieldActionPrioPktNew: 13836 case bcmFieldActionGpPrioPktNew: 13837 case bcmFieldActionYpPrioPktNew: 13838 case bcmFieldActionRpPrioPktNew: 13839 case bcmFieldActionGpTosPrecedenceNew: 13840 case bcmFieldActionDscpNew: 13841 case bcmFieldActionGpDscpNew: 13842 case bcmFieldActionYpDscpNew: 13843 case bcmFieldActionRpDscpNew: 13844 case bcmFieldActionPrioPktCopy: 13845 case bcmFieldActionGpPrioPktCopy: 13846 case bcmFieldActionYpPrioPktCopy: 13847 case bcmFieldActionRpPrioPktCopy: 13848 case bcmFieldActionPrioPktTos: 13849 case bcmFieldActionGpPrioPktTos: 13850 case bcmFieldActionYpPrioPktTos: 13851 case bcmFieldActionRpPrioPktTos: 13852 case bcmFieldActionPrioPktCancel: 13853 case bcmFieldActionGpPrioPktCancel: 13854 case bcmFieldActionYpPrioPktCancel: 13855 case bcmFieldActionRpPrioPktCancel: 13856 case bcmFieldActionDot1pPreserve: 13857 case bcmFieldActionGpDot1pPreserve: 13858 case bcmFieldActionYpDot1pPreserve: 13859 case bcmFieldActionRpDot1pPreserve: 13860 case bcmFieldActionDscpCancel: 13861 case bcmFieldActionGpDscpCancel: 13862 case bcmFieldActionYpDscpCancel: 13863 case bcmFieldActionRpDscpCancel: 13864 case bcmFieldActionGpTosPrecedenceCopy: 13865 case bcmFieldActionDscpPreserve: 13866 case bcmFieldActionGpDscpPreserve: 13867 case bcmFieldActionYpDscpPreserve: 13868 case bcmFieldActionRpDscpPreserve: 13869 rv = _bcm_field_th_profile2_action_set(unit, f_ent, fa, entbuf); 13870 BCM_IF_ERROR_RETURN(rv); 13871 break; 13872 case bcmFieldActionRedirect: 13873 case bcmFieldActionRedirectTrunk: 13874 case bcmFieldActionUnmodifiedPacketRedirectPort: 13875 case bcmFieldActionRedirectMcast: 13876 case bcmFieldActionRedirectEgrNextHop: 13877 case bcmFieldActionRedirectCancel: 13878 case bcmFieldActionRedirectPbmp: 13879 case bcmFieldActionRedirectVlan: 13880 case bcmFieldActionRedirectBcastPbmp: 13881 case bcmFieldActionRedirectIpmc: 13882 case bcmFieldActionEgressMask: 13883 case bcmFieldActionEgressPortsAdd: 13884 case bcmFieldActionFabricEHAddOrUpdate: 13885 rv = _bcm_field_th_redirect_action_set(unit, f_ent, fa, entbuf); 13886 BCM_IF_ERROR_RETURN(rv); 13887 break; 13888 case bcmFieldActionEgressClassSelect: 13889 case bcmFieldActionHiGigClassSelect: 13890 case bcmFieldActionNewClassId: 13891 case bcmFieldActionMultipathHash: 13892 case bcmFieldActionAddClassTag: 13893 case bcmFieldActionFabricQueue: 13894 case bcmFieldActionL3Switch: 13895 case bcmFieldActionDstMacNew: 13896 case bcmFieldActionSrcMacNew: 13897 case bcmFieldActionOuterVlanNew: 13898 case bcmFieldActionVnTagNew: 13899 case bcmFieldActionVnTagDelete: 13900 case bcmFieldActionEtagNew: 13901 case bcmFieldActionEtagDelete: 13902 case bcmFieldActionL3SwitchCancel: 13903 case bcmFieldActionChangeL2Fields: 13904 case bcmFieldActionChangeL2FieldsCancel: 13905 case bcmFieldActionBFDSessionIdNew: 13906 rv = _bcm_field_th_l3swl2change_action_set(unit, f_ent, fa, entbuf); 13907 BCM_IF_ERROR_RETURN(rv); 13908 break; 13909 default: 13910 rv = _bcm_field_th_misc_action_set(unit, f_ent, fa, entbuf); 13911 BCM_IF_ERROR_RETURN(rv); 13912 } 13913 13914 fa->flags &= ~_FP_ACTION_DIRTY; /* Mark action as installed. */ 13915 13916 return (BCM_E_NONE); 13917 } 13918 13919 /* 13920 * Function: 13921 * _field_th_stage_quals_ibus_map_init 13922 * Purpose: 13923 * Initialize Field Ingress Stage Qualifiers to their extractors mapping. 13924 * Parameters: 13925 * unit - (IN) BCM device number. 13926 * stage_fc - (IN/OUT) Field Processor stage control structure. 13927 * 13928 * Returns: 13929 * BCM_E_PARAM - Null field stage control structure. 13930 * BCM_E_MEMORY - Allocation failure. 13931 * BCM_E_INTERNAL - Invalid CAP Stage ID. 13932 * BCM_E_NONE - Success. 13933 */ 13934 STATIC int 13935 _field_th_stage_quals_ibus_map_init(int unit, _field_stage_t *stage_fc) 13936 { 13937 bcmi_keygen_qual_flags_bmp_t qual_flags; 13938 bcmi_keygen_qual_cfg_info_db_t *db = NULL; 13939 BCMI_KEYGEN_QUAL_CFG_DECL; 13940 13941 BCMI_KEYGEN_FUNC_ENTER(unit); 13942 13943 /* L0 BUS extractor sections offset: 13944 * - 32bit extractor = 0 13945 * - 16bit extractor = 608 13946 * - 8bit extractor = 1120 13947 * - 4bit extractor = 1280 13948 * - 2bit extractor = 1400 13949 */ 13950 13951 /* Input parameters check. */ 13952 if (NULL == stage_fc) { 13953 return (BCM_E_PARAM); 13954 } 13955 13956 _FP_XGS3_ALLOC(stage_fc->qual_cfg_info_db, 13957 sizeof(bcmi_keygen_qual_cfg_info_db_t), 13958 "IFP qualifiers"); 13959 if (NULL == stage_fc->qual_cfg_info_db) { 13960 return (BCM_E_MEMORY); 13961 } 13962 db = stage_fc->qual_cfg_info_db; 13963 sal_memset(&qual_flags, 0, sizeof(bcmi_keygen_qual_flags_bmp_t)); 13964 13965 /* UDF Qualifiers. */ 13966 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 13967 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 8, 256, 32); 13968 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData4, qual_flags); 13969 13970 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 13971 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 9, 288, 32); 13972 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData3, qual_flags); 13973 13974 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 13975 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 10, 320, 32); 13976 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData2, qual_flags); 13977 13978 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 13979 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 8, 128, 16); 13980 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData1, qual_flags); 13981 13982 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 13983 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 9, 144, 16); 13984 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData0, qual_flags); 13985 13986 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 13987 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 5, 160, 32); 13988 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData9, qual_flags); 13989 13990 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 13991 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 6, 192, 32); 13992 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData8, qual_flags); 13993 13994 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 13995 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 7, 224, 32); 13996 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData7, qual_flags); 13997 13998 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 13999 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 6, 96, 16); 14000 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData6, qual_flags); 14001 14002 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14003 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 7, 112, 16); 14004 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData5, qual_flags); 14005 14006 /* Packet Fields */ 14007 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14008 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 25, 400, 16); 14009 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterVlan, qual_flags); 14010 14011 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14012 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 25, 400, 12); 14013 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterVlanId, qual_flags); 14014 14015 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14016 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 4, 32, 8); 14017 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 5, 20, 4); 14018 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterVlanId, qual_flags); 14019 14020 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14021 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 25, 412, 1); 14022 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterVlanCfi, qual_flags); 14023 14024 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14025 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 25, 413, 3); 14026 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterVlanPri, qual_flags); 14027 14028 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14029 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 26, 416, 16); 14030 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerVlan, qual_flags); 14031 14032 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14033 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 26, 416, 12); 14034 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerVlanId, qual_flags); 14035 14036 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14037 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 3, 24, 8); 14038 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 4, 16, 4); 14039 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerVlanId, qual_flags); 14040 14041 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14042 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 26, 428, 1); 14043 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerVlanCfi, qual_flags); 14044 14045 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14046 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 26, 429, 3); 14047 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerVlanPri, qual_flags); 14048 14049 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14050 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 2, 64, 32); 14051 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 30, 480, 16); 14052 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMac, qual_flags); 14053 14054 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14055 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 3, 96, 32); 14056 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 31, 496, 16); 14057 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstMac, qual_flags); 14058 14059 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14060 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 352, 32); 14061 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp, qual_flags); 14062 14063 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14064 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 480, 32); 14065 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp, qual_flags); 14066 14067 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14068 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 352, 32); 14069 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 12, 384, 32); 14070 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E32, 13, 416, 32); 14071 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(3, BCMI_KEYGEN_EXT_SECTION_L1E32, 14, 448, 32); 14072 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6, qual_flags); 14073 14074 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14075 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 352, 32); 14076 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 12, 384, 32); 14077 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6Low, qual_flags); 14078 14079 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14080 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 13, 416, 32); 14081 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 14, 448, 32); 14082 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6High, qual_flags); 14083 14084 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14085 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 480, 32); 14086 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 16, 512, 32); 14087 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E32, 17, 544, 32); 14088 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(3, BCMI_KEYGEN_EXT_SECTION_L1E32, 18, 576, 32); 14089 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6, qual_flags); 14090 14091 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14092 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 480, 32); 14093 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 16, 512, 32); 14094 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6Low, qual_flags); 14095 14096 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14097 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 17, 544, 32); 14098 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 18, 576, 32); 14099 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6High, qual_flags); 14100 14101 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14102 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 29, 464, 16); 14103 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyEtherType, qual_flags); 14104 14105 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14106 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 28, 448, 16); 14107 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4SrcPort, qual_flags); 14108 14109 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14110 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 28, 448, 16); 14111 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, 14112 bcmFieldQualifyIcmpTypeCode, qual_flags); 14113 14114 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14115 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 27, 432, 16); 14116 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4DstPort, qual_flags); 14117 14118 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14119 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 4, 128, 32); 14120 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyISid, qual_flags); 14121 14122 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14123 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 4, 128, 24); 14124 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2GreVsid, qual_flags); 14125 14126 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14127 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 24); 14128 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 7); 14129 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanNetworkId, qual_flags); 14130 14131 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14132 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 24); 14133 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 7); 14134 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanNetworkId, qual_flags); 14135 14136 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14137 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 4, 128, 24); 14138 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanNetworkId, qual_flags); 14139 14140 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14141 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14142 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 8); 14143 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 7); 14144 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanNetworkId, qual_flags); 14145 14146 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14147 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14148 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 8); 14149 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 7); 14150 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanNetworkId, qual_flags); 14151 14152 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14153 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 24, 8); 14154 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 7); 14155 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanFlags, qual_flags); 14156 14157 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14158 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 56, 8); 14159 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 7); 14160 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanFlags, qual_flags); 14161 14162 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14163 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 4, 152, 8); 14164 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanFlags, qual_flags); 14165 14166 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14167 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 56, 8); 14168 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 7); 14169 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanFlags, qual_flags); 14170 14171 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14172 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 88, 8); 14173 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 7); 14174 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanFlags, qual_flags); 14175 14176 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14177 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 24); 14178 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 8); 14179 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits8_31, qual_flags); 14180 14181 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14182 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 24); 14183 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 8); 14184 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits8_31, qual_flags); 14185 14186 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14187 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14188 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 8); 14189 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 8); 14190 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits8_31, qual_flags); 14191 14192 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14193 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14194 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 8); 14195 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 8); 14196 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits8_31, qual_flags); 14197 14198 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14199 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 24, 8); 14200 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 8); 14201 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits56_63, qual_flags); 14202 14203 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14204 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 56, 8); 14205 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 8); 14206 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits56_63, qual_flags); 14207 14208 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14209 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 56, 8); 14210 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 8); 14211 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits56_63, qual_flags); 14212 14213 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14214 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 88, 8); 14215 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 8); 14216 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits56_63, qual_flags); 14217 14218 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14219 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32); 14220 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 0); 14221 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyETag, qual_flags); 14222 14223 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14224 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32); 14225 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 0); 14226 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyETag, qual_flags); 14227 14228 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14229 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14230 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16); 14231 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 0); 14232 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyETag, qual_flags); 14233 14234 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14235 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14236 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16); 14237 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 0); 14238 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyETag, qual_flags); 14239 14240 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14241 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32); 14242 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 0); 14243 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVnTag, qual_flags); 14244 14245 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14246 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32); 14247 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 0); 14248 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVnTag, qual_flags); 14249 14250 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14251 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14252 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16); 14253 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 0); 14254 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVnTag, qual_flags); 14255 14256 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14257 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14258 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16); 14259 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 0); 14260 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVnTag, qual_flags); 14261 14262 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14263 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32); 14264 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 1); 14265 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyCnTag, qual_flags); 14266 14267 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14268 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32); 14269 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 1); 14270 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyCnTag, qual_flags); 14271 14272 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14273 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14274 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16); 14275 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 1); 14276 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyCnTag, qual_flags); 14277 14278 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14279 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14280 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16); 14281 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 1); 14282 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyCnTag, qual_flags); 14283 14284 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14285 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32); 14286 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 2); 14287 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFabricQueueTag, qual_flags); 14288 14289 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14290 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32); 14291 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 2); 14292 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFabricQueueTag, qual_flags); 14293 14294 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14295 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14296 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16); 14297 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 2); 14298 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFabricQueueTag, qual_flags); 14299 14300 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14301 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14302 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16); 14303 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 2); 14304 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFabricQueueTag, qual_flags); 14305 14306 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14307 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32); 14308 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3); 14309 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabel, qual_flags); 14310 14311 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14312 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32); 14313 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14314 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabel, qual_flags); 14315 14316 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14317 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14318 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16); 14319 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3); 14320 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabel, qual_flags); 14321 14322 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14323 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14324 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16); 14325 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14326 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabel, qual_flags); 14327 14328 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14329 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 12, 20); 14330 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3); 14331 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelId, qual_flags); 14332 14333 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14334 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 44, 20); 14335 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14336 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelId, qual_flags); 14337 14338 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14339 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 44, 4); 14340 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16); 14341 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3); 14342 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelId, qual_flags); 14343 14344 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14345 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 76, 4); 14346 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16); 14347 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14348 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelId, qual_flags); 14349 14350 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14351 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 8); 14352 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3); 14353 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelTtl, qual_flags); 14354 14355 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14356 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 8); 14357 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14358 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelTtl, qual_flags); 14359 14360 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14361 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 8); 14362 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14363 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelTtl, qual_flags); 14364 14365 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14366 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 8); 14367 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14368 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelTtl, qual_flags); 14369 14370 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14371 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 9, 3); 14372 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3); 14373 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelExp, qual_flags); 14374 14375 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14376 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 41, 3); 14377 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14378 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelExp, qual_flags); 14379 14380 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14381 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 41, 3); 14382 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3); 14383 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelExp, qual_flags); 14384 14385 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14386 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 73, 3); 14387 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14388 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelExp, qual_flags); 14389 14390 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14391 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 8, 1); 14392 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3); 14393 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelBos, qual_flags); 14394 14395 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14396 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 40, 1); 14397 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14398 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelBos, qual_flags); 14399 14400 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14401 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 40, 1); 14402 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3); 14403 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelBos, qual_flags); 14404 14405 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14406 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 72, 1); 14407 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3); 14408 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelBos, qual_flags); 14409 14410 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14411 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32); 14412 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 4); 14413 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsControlWord, qual_flags); 14414 14415 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14416 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32); 14417 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 4); 14418 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsControlWord, qual_flags); 14419 14420 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14421 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14422 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16); 14423 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 4); 14424 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsControlWord, qual_flags); 14425 14426 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14427 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14428 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16); 14429 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 4); 14430 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsControlWord, qual_flags); 14431 14432 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14433 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 20); 14434 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 9); 14435 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIp6FlowLabel, qual_flags); 14436 14437 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14438 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 20); 14439 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 9); 14440 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIp6FlowLabel, qual_flags); 14441 14442 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14443 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14444 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 4); 14445 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 9); 14446 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIp6FlowLabel, qual_flags); 14447 14448 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14449 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14450 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 4); 14451 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 9); 14452 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIp6FlowLabel, qual_flags); 14453 14454 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14455 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 13, 104, 8); 14456 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TTL_FN, 2); 14457 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTtl, qual_flags); 14458 14459 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14460 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 12, 96, 8); 14461 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TOS_FN, 2); 14462 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTos, qual_flags); 14463 14464 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14465 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 14, 112, 8); 14466 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpProtocol, qual_flags); 14467 14468 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14469 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 2, 8, 4); 14470 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 3, 12, 4); 14471 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TCP_FN, 2); 14472 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTcpControl, qual_flags); 14473 14474 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14475 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 27, 432, 16); 14476 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFcoeRxID, qual_flags); 14477 14478 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14479 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 28, 448, 16); 14480 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFcoeOxID, qual_flags); 14481 14482 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14483 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 16, 256, 5); 14484 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyExactMatchGroupClassIdLookup0, qual_flags); 14485 14486 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14487 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 16, 264, 5); 14488 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyExactMatchGroupClassIdLookup1, qual_flags); 14489 14490 /* The extractors are fixed for ltid and 14491 * ltid init is done along with pmux init 14492 */ 14493 14494 if (soc_feature(unit, soc_feature_fp_ltid_match_all_parts) && 14495 (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS)) { 14496 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14497 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 5, 40, 5); 14498 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_LTID, 1); 14499 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyPreLogicalTableId1, qual_flags); 14500 14501 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14502 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 5, 40, 5); 14503 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_LTID, 2); 14504 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyPreLogicalTableId2, qual_flags); 14505 } 14506 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14507 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 16, 128, 8); 14508 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyExtensionHeaderType, qual_flags); 14509 14510 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14511 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 15, 120, 8); 14512 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyExtensionHeader2Type, qual_flags); 14513 14514 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14515 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 17, 136, 8); 14516 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyExtensionHeaderSubCode, qual_flags); 14517 14518 SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM); 14519 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14520 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 28, 112, 4); 14521 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMHOpcode, qual_flags); 14522 SHR_BITCLR(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM); 14523 14524 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14525 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 18, 36, 2); 14526 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpFlags, qual_flags); 14527 14528 /*Packet Types*/ 14529 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14530 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 20, 41, 1); 14531 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyHiGig, qual_flags); 14532 14533 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14534 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 7, 15, 1); 14535 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyHiGigProxy, qual_flags); 14536 14537 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14538 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 7, 14, 1); 14539 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyCpuVisibilityPacket, qual_flags); 14540 14541 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14542 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 13, 54, 1); 14543 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDosAttack, qual_flags); 14544 14545 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14546 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 1, 1); 14547 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 0); 14548 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4Ports, qual_flags); 14549 14550 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14551 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 17, 1); 14552 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 0); 14553 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4Ports, qual_flags); 14554 14555 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14556 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 8, 17, 1); 14557 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4Ports, qual_flags); 14558 14559 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14560 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 20, 40, 1); 14561 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMirrorCopy, qual_flags); 14562 14563 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14564 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 19, 38, 2); 14565 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpFrag, qual_flags); 14566 14567 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14568 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 0, 0, 2); 14569 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyNatSrcRealmId, qual_flags); 14570 14571 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14572 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 8, 16, 1); 14573 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpFragNonOrFirst, qual_flags); 14574 14575 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14576 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 1); 14577 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 0); 14578 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpFragNonOrFirst, qual_flags); 14579 14580 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14581 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 1); 14582 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 0); 14583 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpFragNonOrFirst, qual_flags); 14584 14585 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14586 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 5, 10, 1); 14587 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIcmpError, qual_flags); 14588 14589 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14590 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 5, 11, 1); 14591 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRepCopy, qual_flags); 14592 14593 /*Table HIT/Lookup Status bits*/ 14594 SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM); 14595 /* not supported for EM */ 14596 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14597 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 11, 46, 1); 14598 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2SrcHit, qual_flags); 14599 14600 /* not supported for EM */ 14601 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14602 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 12, 48, 1); 14603 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2DestHit, qual_flags); 14604 14605 /* not supported for EM */ 14606 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14607 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 12, 50, 1); 14608 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL3SrcHostHit, qual_flags); 14609 14610 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14611 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 12, 50, 1); 14612 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpmcStarGroupHit, qual_flags); 14613 14614 /* not supported for EM */ 14615 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14616 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 12, 51, 1); 14617 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL3DestHostHit, qual_flags); 14618 14619 /* not supported for EM */ 14620 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14621 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 13, 52, 1); 14622 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL3DestRouteHit, qual_flags); 14623 14624 /* not supported for EM */ 14625 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14626 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 13, 53, 1); 14627 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2StationMove, qual_flags); 14628 14629 /* not supported for EM */ 14630 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14631 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 12, 49, 1); 14632 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2CacheHit, qual_flags); 14633 14634 /* not supported for EM */ 14635 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14636 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 11, 47, 1); 14637 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2SrcStatic, qual_flags); 14638 14639 SHR_BITCLR(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM); 14640 14641 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14642 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 13, 55, 1); 14643 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpTunnelHit, qual_flags); 14644 14645 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14646 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 10, 40, 3); 14647 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVlanTranslationHit, qual_flags); 14648 14649 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14650 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1); 14651 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsLabel1Hit, qual_flags); 14652 14653 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14654 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1); 14655 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTrillEgressRbridgeHit, qual_flags); 14656 14657 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14658 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1); 14659 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2GreSrcIpHit, qual_flags); 14660 14661 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14662 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1); 14663 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMimSrcGportHit, qual_flags); 14664 14665 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14666 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 57, 1); 14667 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsLabel2Hit, qual_flags); 14668 14669 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14670 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 57, 1); 14671 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTrillIngressRbridgeHit, qual_flags); 14672 14673 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14674 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1); 14675 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2GreVfiHit, qual_flags); 14676 14677 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14678 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1); 14679 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMimVfiHit, qual_flags); 14680 14681 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14682 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 9, 18, 2); 14683 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIntCongestionNotification, qual_flags); 14684 14685 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14686 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 17, 35, 1); 14687 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMyStationHit, qual_flags); 14688 14689 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14690 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 58, 1); 14691 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsTerminated, qual_flags); 14692 14693 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14694 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 16, 33, 1); 14695 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIpLocal, qual_flags); 14696 14697 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14698 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 17, 34, 1); 14699 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL3Routable, qual_flags); 14700 14701 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14702 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 16); 14703 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 3); 14704 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags); 14705 14706 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14707 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 16); 14708 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 3); 14709 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags); 14710 14711 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14712 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16); 14713 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 5); 14714 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags); 14715 14716 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14717 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16); 14718 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 5); 14719 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags); 14720 14721 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14722 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 16, 16); 14723 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 5); 14724 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags); 14725 14726 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14727 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 48, 16); 14728 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 5); 14729 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags); 14730 14731 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14732 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 16); 14733 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 5); 14734 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags); 14735 14736 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14737 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 16); 14738 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 5); 14739 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags); 14740 14741 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14742 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16); 14743 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 6); 14744 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags); 14745 14746 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14747 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16); 14748 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 6); 14749 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags); 14750 14751 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14752 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 16, 16); 14753 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 6); 14754 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags); 14755 14756 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14757 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 48, 16); 14758 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 6); 14759 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags); 14760 14761 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14762 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 16); 14763 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 4); 14764 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags); 14765 14766 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14767 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 16); 14768 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 4); 14769 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags); 14770 14771 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14772 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14773 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 5); 14774 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags); 14775 14776 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14777 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14778 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 5); 14779 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags); 14780 14781 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14782 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 16); 14783 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 5); 14784 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags); 14785 14786 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14787 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 16); 14788 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 5); 14789 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags); 14790 14791 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14792 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 16); 14793 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 6); 14794 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags); 14795 14796 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14797 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 16); 14798 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 6); 14799 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags); 14800 14801 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14802 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 14803 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 6); 14804 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags); 14805 14806 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14807 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 14808 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 6); 14809 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags); 14810 14811 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14812 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 16); 14813 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 6); 14814 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags); 14815 14816 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14817 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 16); 14818 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 6); 14819 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags); 14820 14821 /*Class Ids from different Tables*/ 14822 14823 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14824 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 12); 14825 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 0); 14826 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags); 14827 14828 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14829 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 12); 14830 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 0); 14831 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags); 14832 14833 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14834 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8); 14835 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 0); 14836 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags); 14837 14838 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14839 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8); 14840 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 0); 14841 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags); 14842 14843 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14844 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4); 14845 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 0); 14846 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags); 14847 14848 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14849 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4); 14850 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 0); 14851 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags); 14852 14853 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14854 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 12); 14855 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 1); 14856 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags); 14857 14858 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14859 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 12); 14860 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 1); 14861 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags); 14862 14863 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14864 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8); 14865 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 1); 14866 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags); 14867 14868 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14869 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8); 14870 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 1); 14871 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags); 14872 14873 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14874 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4); 14875 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 1); 14876 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags); 14877 14878 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14879 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4); 14880 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 1); 14881 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags); 14882 14883 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14884 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 12); 14885 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 2); 14886 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags); 14887 14888 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14889 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 12); 14890 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 2); 14891 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags); 14892 14893 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14894 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8); 14895 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 2); 14896 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags); 14897 14898 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14899 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8); 14900 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 2); 14901 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags); 14902 14903 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14904 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4); 14905 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 2); 14906 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags); 14907 14908 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14909 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4); 14910 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 2); 14911 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags); 14912 14913 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14914 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 12); 14915 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 3); 14916 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags); 14917 14918 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14919 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 12); 14920 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 3); 14921 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags); 14922 14923 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14924 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8); 14925 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 3); 14926 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags); 14927 14928 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14929 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8); 14930 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 3); 14931 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags); 14932 14933 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14934 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4); 14935 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 3); 14936 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags); 14937 14938 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14939 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4); 14940 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 3); 14941 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags); 14942 14943 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14944 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 10); 14945 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 4); 14946 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14947 14948 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14949 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 10); 14950 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 4); 14951 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14952 14953 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14954 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 8); 14955 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 4); 14956 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14957 14958 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14959 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 8); 14960 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 4); 14961 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14962 14963 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14964 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8); 14965 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 4); 14966 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14967 14968 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14969 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8); 14970 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 4); 14971 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14972 14973 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14974 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8); 14975 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 4); 14976 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14977 14978 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14979 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8); 14980 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 4); 14981 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14982 14983 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14984 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4); 14985 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 4); 14986 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14987 14988 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14989 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4); 14990 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 4); 14991 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14992 14993 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14994 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4); 14995 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 4); 14996 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 14997 14998 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 14999 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4); 15000 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 4); 15001 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags); 15002 15003 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15004 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 10); 15005 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 5); 15006 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags); 15007 15008 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15009 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 10); 15010 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 5); 15011 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags); 15012 15013 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15014 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 216, 8); 15015 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 4); 15016 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags); 15017 15018 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15019 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 200, 8); 15020 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 4); 15021 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags); 15022 15023 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15024 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8); 15025 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 5); 15026 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags); 15027 15028 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15029 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8); 15030 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 5); 15031 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags); 15032 15033 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15034 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4); 15035 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 5); 15036 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags); 15037 15038 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15039 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4); 15040 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 5); 15041 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags); 15042 15043 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15044 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 248, 8); 15045 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 6); 15046 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceLookupClassPort, qual_flags); 15047 15048 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15049 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 232, 8); 15050 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 6); 15051 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceLookupClassPort, qual_flags); 15052 15053 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15054 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 8); 15055 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 6); 15056 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags); 15057 15058 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15059 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 8); 15060 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 6); 15061 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags); 15062 15063 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15064 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8); 15065 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 6); 15066 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags); 15067 15068 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15069 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8); 15070 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 6); 15071 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags); 15072 15073 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15074 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4); 15075 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 6); 15076 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags); 15077 15078 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15079 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4); 15080 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 6); 15081 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags); 15082 15083 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15084 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 8); 15085 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 7); 15086 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags); 15087 15088 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15089 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 8); 15090 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 7); 15091 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags); 15092 15093 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15094 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8); 15095 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 7); 15096 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags); 15097 15098 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15099 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8); 15100 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 7); 15101 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags); 15102 15103 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15104 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4); 15105 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 7); 15106 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags); 15107 15108 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15109 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4); 15110 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 7); 15111 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags); 15112 15113 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15114 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 10); 15115 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 0); 15116 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags); 15117 15118 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15119 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 10); 15120 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 0); 15121 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags); 15122 15123 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15124 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 216, 8); 15125 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 5); 15126 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags); 15127 15128 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15129 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 200, 8); 15130 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 5); 15131 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags); 15132 15133 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15134 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8); 15135 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 0); 15136 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags); 15137 15138 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15139 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8); 15140 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 0); 15141 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags); 15142 15143 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15144 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4); 15145 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 0); 15146 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags); 15147 15148 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15149 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4); 15150 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 0); 15151 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags); 15152 15153 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15154 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 10); 15155 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 1); 15156 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15157 15158 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15159 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 10); 15160 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 1); 15161 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15162 15163 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15164 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 8); 15165 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 5); 15166 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15167 15168 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15169 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 8); 15170 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 5); 15171 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15172 15173 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15174 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8); 15175 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 1); 15176 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15177 15178 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15179 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8); 15180 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 5); 15181 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15182 15183 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15184 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8); 15185 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 1); 15186 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15187 15188 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15189 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8); 15190 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 5); 15191 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15192 15193 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15194 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4); 15195 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 1); 15196 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15197 15198 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15199 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4); 15200 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 5); 15201 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15202 15203 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15204 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4); 15205 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 1); 15206 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15207 15208 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15209 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4); 15210 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 5); 15211 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags); 15212 15213 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15214 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 12); 15215 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 2); 15216 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags); 15217 15218 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15219 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 12); 15220 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 2); 15221 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags); 15222 15223 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15224 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 216, 8); 15225 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 6); 15226 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags); 15227 15228 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15229 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 200, 8); 15230 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 6); 15231 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags); 15232 15233 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15234 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8); 15235 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 2); 15236 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags); 15237 15238 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15239 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8); 15240 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 2); 15241 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags); 15242 15243 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15244 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4); 15245 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 2); 15246 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags); 15247 15248 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15249 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4); 15250 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 2); 15251 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags); 15252 15253 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15254 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 10); 15255 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 3); 15256 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15257 15258 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15259 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 10); 15260 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 3); 15261 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15262 15263 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15264 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 8); 15265 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 6); 15266 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15267 15268 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15269 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 8); 15270 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 6); 15271 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15272 15273 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15274 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8); 15275 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 3); 15276 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15277 15278 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15279 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8); 15280 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 6); 15281 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15282 15283 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15284 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8); 15285 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 3); 15286 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15287 15288 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15289 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8); 15290 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 6); 15291 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15292 15293 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15294 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4); 15295 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 3); 15296 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15297 15298 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15299 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4); 15300 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 6); 15301 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15302 15303 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15304 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4); 15305 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 3); 15306 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15307 15308 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15309 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4); 15310 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 6); 15311 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags); 15312 15313 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15314 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 5, 46, 2); 15315 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyGroupClass, qual_flags); 15316 15317 /* Ingress/Egress Objects */ 15318 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15319 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 10, 43, 1); 15320 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyForwardingVlanValid, qual_flags); 15321 15322 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15323 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 11, 44, 2); 15324 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIngressStpState, qual_flags); 15325 15326 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15327 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 11, 44, 2); 15328 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyStpState, qual_flags); 15329 15330 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15331 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 17, 272, 12); 15332 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyForwardingVlanId, qual_flags); 15333 15334 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15335 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 10, 20, 1); 15336 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVirtualPortValid, qual_flags); 15337 15338 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15339 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 10, 21, 1); 15340 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDestVirtualPortValid, qual_flags); 15341 15342 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15343 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 16); 15344 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15345 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 0); 15346 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModPortGport, qual_flags); 15347 15348 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15349 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 16); 15350 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15351 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 0); 15352 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModPortGports, qual_flags); 15353 15354 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15355 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 16); 15356 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15357 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 0); 15358 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcPort, qual_flags); 15359 15360 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15361 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 16); 15362 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15363 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 0); 15364 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcTrunkMemberGport, qual_flags); 15365 15366 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15367 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 168, 8); 15368 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15369 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 0); 15370 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModuleGport, qual_flags); 15371 15372 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15373 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 16); 15374 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15375 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0); 15376 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModPortGport, qual_flags); 15377 15378 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15379 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 16); 15380 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15381 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0); 15382 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModPortGports, qual_flags); 15383 15384 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15385 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 16); 15386 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15387 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0); 15388 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcPort, qual_flags); 15389 15390 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15391 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 16); 15392 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15393 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0); 15394 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcTrunkMemberGport, qual_flags); 15395 15396 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15397 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 182, 8); 15398 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15399 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0); 15400 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModuleGport, qual_flags); 15401 15402 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15403 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 16); 15404 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15405 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 1); 15406 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcTrunk, qual_flags); 15407 15408 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15409 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15410 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15411 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 1); 15412 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcTrunk, qual_flags); 15413 15414 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15415 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15416 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15417 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15418 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMplsGport, qual_flags); 15419 15420 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15421 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15422 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15423 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15424 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMplsGport, qual_flags); 15425 15426 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15427 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15428 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15429 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15430 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMplsGports, qual_flags); 15431 15432 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15433 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15434 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15435 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15436 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMplsGports, qual_flags); 15437 15438 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15439 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15440 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15441 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15442 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMimGport, qual_flags); 15443 15444 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15445 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15446 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15447 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15448 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMimGport, qual_flags); 15449 15450 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15451 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15452 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15453 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15454 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMimGports, qual_flags); 15455 15456 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15457 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15458 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15459 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15460 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMimGports, qual_flags); 15461 15462 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15463 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15464 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15465 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15466 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcWlanGport, qual_flags); 15467 15468 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15469 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15470 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15471 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15472 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcWlanGport, qual_flags); 15473 15474 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15475 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15476 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15477 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15478 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcWlanGports, qual_flags); 15479 15480 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15481 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15482 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15483 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15484 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcWlanGports, qual_flags); 15485 15486 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15487 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15488 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15489 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15490 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcNivGport, qual_flags); 15491 15492 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15493 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15494 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15495 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15496 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcNivGport, qual_flags); 15497 15498 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15499 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15500 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15501 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15502 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcNivGports, qual_flags); 15503 15504 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15505 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15506 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15507 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15508 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcNivGports, qual_flags); 15509 15510 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15511 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15512 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15513 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15514 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVxlanGport, qual_flags); 15515 15516 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15517 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15518 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15519 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15520 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVxlanGport, qual_flags); 15521 15522 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15523 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15524 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15525 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15526 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVxlanGports, qual_flags); 15527 15528 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15529 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15530 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15531 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15532 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVxlanGports, qual_flags); 15533 15534 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15535 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15536 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15537 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15538 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVlanGport, qual_flags); 15539 15540 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15541 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15542 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15543 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15544 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVlanGport, qual_flags); 15545 15546 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15547 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14); 15548 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1); 15549 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2); 15550 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVlanGports, qual_flags); 15551 15552 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15553 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14); 15554 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15555 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2); 15556 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVlanGports, qual_flags); 15557 15558 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15559 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 2, 16, 8); 15560 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 29, 116, 4); 15561 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVrf, qual_flags); 15562 15563 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15564 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 17, 272, 12); 15565 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVrf, qual_flags); 15566 15567 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15568 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 1, 8, 8); 15569 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 0, 0, 4); 15570 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E2, 1, 2, 2); 15571 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVpn, qual_flags); 15572 15573 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15574 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 17, 274, 14); 15575 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVpn, qual_flags); 15576 15577 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15578 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 18, 288, 13); 15579 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL3Ingress, qual_flags); 15580 15581 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15582 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 0, 0, 8); 15583 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInPort, qual_flags); 15584 15585 /*Miscellaneous*/ 15586 SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM); 15587 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15588 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 27, 108, 4); 15589 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIntPriority, qual_flags); 15590 15591 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15592 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 26, 52, 2); 15593 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyColor, qual_flags); 15594 SHR_BITCLR(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM); 15595 15596 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15597 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 27, 55, 1); 15598 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, 15599 bcmFieldQualifyRouterAlertLabelValid, qual_flags); 15600 15601 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15602 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 27, 54, 1); 15603 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, 15604 bcmFieldQualifyGenericAssociatedChannelLabelValid, qual_flags); 15605 15606 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15607 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 28, 56, 2); 15608 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, 15609 bcmFieldQualifyMplsControlWordValid, qual_flags); 15610 15611 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15612 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 15, 30, 1); 15613 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_MAC_NORM, 1); 15614 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMacAddrsNormalized, qual_flags); 15615 15616 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15617 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 15, 31, 1); 15618 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_L3_L4_NORM, 1); 15619 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpAddrsNormalized, qual_flags); 15620 15621 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15622 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 22, 44, 2); 15623 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVlanFormat, qual_flags); 15624 15625 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15626 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 23, 46, 2); 15627 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTranslatedVlanFormat, qual_flags); 15628 15629 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15630 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 352, 32); 15631 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 12, 384, 32); 15632 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E32, 13, 416, 32); 15633 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(3, BCMI_KEYGEN_EXT_SECTION_L1E32, 14, 448, 32); 15634 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(4, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 480, 32); 15635 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(5, BCMI_KEYGEN_EXT_SECTION_L1E32, 16, 512, 32); 15636 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(6, BCMI_KEYGEN_EXT_SECTION_L1E32, 17, 544, 32); 15637 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(7, BCMI_KEYGEN_EXT_SECTION_L1E32, 18, 576, 32); 15638 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2PayLoad, qual_flags); 15639 15640 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15641 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 17, 544, 32); 15642 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 18, 576, 32); 15643 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, 15644 bcmFieldQualifyL2PayloadFirstEightBytes, qual_flags); 15645 15646 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15647 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 29, 58, 2); 15648 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpInfo, qual_flags); 15649 15650 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15651 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32); 15652 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 10); 15653 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyBfdYourDiscriminator, qual_flags); 15654 15655 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15656 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32); 15657 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 10); 15658 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyBfdYourDiscriminator, qual_flags); 15659 15660 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15661 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16); 15662 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16); 15663 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 10); 15664 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyBfdYourDiscriminator, qual_flags); 15665 15666 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15667 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16); 15668 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16); 15669 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 10); 15670 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyBfdYourDiscriminator, qual_flags); 15671 15672 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15673 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 16); 15674 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 2); 15675 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyPacketLength, qual_flags); 15676 15677 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15678 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 16); 15679 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 2); 15680 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyPacketLength, qual_flags); 15681 15682 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15683 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 23, 368, 16); 15684 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 24, 384, 16); 15685 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRangeCheck, qual_flags); 15686 15687 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15688 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 16); 15689 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1); 15690 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0); 15691 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcTrunkMemberGport, qual_flags); 15692 15693 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15694 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 26, 104, 4); 15695 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelAction, qual_flags); 15696 15697 SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM); 15698 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15699 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 11, 88, 6); 15700 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyPacketRes, qual_flags); 15701 SHR_BITCLR(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM); 15702 15703 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15704 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 10, 84, 1); 15705 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyLoopback, qual_flags); 15706 15707 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15708 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 10, 80, 5); 15709 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyLoopbackType, qual_flags); 15710 15711 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15712 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 10, 80, 5); 15713 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTunnelType, qual_flags); 15714 15715 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15716 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 1, 4, 4); 15717 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 4, 8, 1); 15718 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpType, qual_flags); 15719 15720 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15721 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 21, 42, 2); 15722 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2Format, qual_flags); 15723 15724 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15725 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 25, 50, 2); 15726 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerTpid, qual_flags); 15727 15728 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15729 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 24, 48, 2); 15730 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterTpid, qual_flags); 15731 15732 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15733 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 15, 60, 4); 15734 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyForwardingType, qual_flags); 15735 15736 /* Compression Qualifiers */ 15737 15738 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15739 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 17, 68, 4); 15740 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFcoeOxIDClass, qual_flags); 15741 15742 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15743 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 16, 64, 4); 15744 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFcoeRxIDClass, qual_flags); 15745 15746 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15747 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 17, 68, 4); 15748 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4SrcPortClass, qual_flags); 15749 15750 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15751 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 6, 4); 15752 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 0); 15753 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4SrcPortClass, qual_flags); 15754 15755 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15756 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 22, 4); 15757 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 0); 15758 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4SrcPortClass, qual_flags); 15759 15760 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15761 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 16, 64, 4); 15762 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4DstPortClass, qual_flags); 15763 15764 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15765 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 2, 4); 15766 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 0); 15767 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4DstPortClass, qual_flags); 15768 15769 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15770 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 18, 4); 15771 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 0); 15772 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4DstPortClass, qual_flags); 15773 15774 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15775 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 19, 76, 4); 15776 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpProtocolClass, qual_flags); 15777 15778 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15779 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 10, 4); 15780 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 0); 15781 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpProtocolClass, qual_flags); 15782 15783 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15784 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 26, 4); 15785 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 0); 15786 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpProtocolClass, qual_flags); 15787 15788 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15789 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 18, 72, 4); 15790 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyEtherTypeClass, qual_flags); 15791 15792 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15793 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 13, 104, 8); 15794 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TTL_FN, 0); 15795 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTtlClassZero, qual_flags); 15796 15797 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15798 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 13, 104, 8); 15799 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TTL_FN, 1); 15800 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTtlClassOne, qual_flags); 15801 15802 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15803 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 12, 96, 8); 15804 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TOS_FN, 0); 15805 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTosClassZero, qual_flags); 15806 15807 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15808 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 12, 96, 8); 15809 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TOS_FN, 1); 15810 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTosClassOne, qual_flags); 15811 15812 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15813 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 2, 8, 4); 15814 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 3, 12, 4); 15815 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TCP_FN, 0); 15816 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTcpClassZero, qual_flags); 15817 15818 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15819 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 2, 8, 4); 15820 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 3, 12, 4); 15821 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TCP_FN, 1); 15822 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTcpClassOne, qual_flags); 15823 15824 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15825 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16); 15826 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16); 15827 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4); 15828 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIpClass, qual_flags); 15829 15830 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15831 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16); 15832 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIpClassLower, qual_flags); 15833 15834 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15835 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16); 15836 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIpClassUpper, qual_flags); 15837 15838 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15839 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4); 15840 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIpClassMsbNibble, qual_flags); 15841 15842 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15843 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16); 15844 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16); 15845 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4); 15846 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6Class, qual_flags); 15847 15848 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15849 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16); 15850 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6ClassLower, qual_flags); 15851 15852 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15853 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16); 15854 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6ClassUpper, qual_flags); 15855 15856 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15857 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4); 15858 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6ClassMsbNibble, qual_flags); 15859 15860 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15861 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16); 15862 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16); 15863 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4); 15864 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIpClass, qual_flags); 15865 15866 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15867 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16); 15868 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIpClassLower, qual_flags); 15869 15870 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15871 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16); 15872 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIpClassUpper, qual_flags); 15873 15874 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15875 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4); 15876 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIpClassMsbNibble, qual_flags); 15877 15878 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15879 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16); 15880 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16); 15881 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4); 15882 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6Class, qual_flags); 15883 15884 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15885 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16); 15886 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6ClassLower, qual_flags); 15887 15888 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15889 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16); 15890 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6ClassUpper, qual_flags); 15891 15892 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15893 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4); 15894 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6ClassMsbNibble, qual_flags); 15895 15896 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15897 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16); 15898 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16); 15899 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4); 15900 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanSrcIdClass, qual_flags); 15901 15902 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15903 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16); 15904 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanSrcIdClassLower, qual_flags); 15905 15906 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15907 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16); 15908 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanSrcIdClassUpper, qual_flags); 15909 15910 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15911 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4); 15912 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanSrcIdClassMsbNibble, qual_flags); 15913 15914 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15915 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16); 15916 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16); 15917 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4); 15918 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDstIdClass, qual_flags); 15919 15920 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15921 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16); 15922 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDstIdClassLower, qual_flags); 15923 15924 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15925 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16); 15926 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDstIdClassUpper, qual_flags); 15927 15928 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15929 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4); 15930 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDstIdClassMsbNibble, qual_flags); 15931 15932 /*Fiber Channel Qualifiers */ 15933 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15934 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 360, 24); 15935 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanSrcId, qual_flags); 15936 15937 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15938 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 355, 3); 15939 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanInner, qual_flags); 15940 15941 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15942 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 352, 3); 15943 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanOuter, qual_flags); 15944 15945 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15946 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 12, 392, 24); 15947 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanFCtl, qual_flags); 15948 15949 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15950 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 12, 384, 8); 15951 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFcoeSOF, qual_flags); 15952 15953 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15954 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 488, 24); 15955 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDstId, qual_flags); 15956 15957 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15958 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 480, 8); 15959 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanRCtl, qual_flags); 15960 15961 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15962 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 12, 96, 8); 15963 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanCSCtl, qual_flags); 15964 15965 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15966 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 13, 104, 8); 15967 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanVFTHopCount, qual_flags); 15968 15969 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15970 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 12, 3); 15971 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 7); 15972 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanVFTPri, qual_flags); 15973 15974 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15975 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 12); 15976 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 7); 15977 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanVFTFabricId, qual_flags); 15978 15979 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15980 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 28, 3); 15981 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 7); 15982 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanVFTPri, qual_flags); 15983 15984 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15985 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 12); 15986 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 7); 15987 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanVFTFabricId, qual_flags); 15988 15989 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15990 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 14, 112, 8); 15991 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanType, qual_flags); 15992 15993 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 15994 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 16, 128, 8); 15995 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDFCtl, qual_flags); 15996 15997 #if defined(BCM_TOMAHAWK2_SUPPORT) 15998 if (SOC_IS_TOMAHAWK2(unit)) { 15999 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16000 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 6, 12, 1); 16001 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRecoverableDrop, qual_flags); 16002 } 16003 #endif /* BCM_TOMAHAWK2_SUPPORT */ 16004 16005 /* ltid is assigned fixed offset to avoid issues 16006 * with matching on ltid with value 0 16007 */ 16008 SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_PMUX); 16009 16010 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16011 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, 16012 BCMI_KEYGEN_EXT_SECTION_LTID, 0, 144, 4); 16013 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, 16014 BCMI_KEYGEN_EXT_SECTION_LTID, 1, 150, 1); 16015 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, 16016 _bcmFieldQualifyPreLogicalTableId, qual_flags); 16017 16018 SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM); 16019 /* Post Mux Qualifers */ 16020 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16021 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_DROP, 0, 159, 1); 16022 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDrop, qual_flags); 16023 16024 /* NAT Qualifiers */ 16025 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16026 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16027 (0, BCMI_KEYGEN_EXT_SECTION_NAT_NEEDED, 1, 158, 1); 16028 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyNatNeeded, qual_flags); 16029 16030 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16031 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16032 (0, BCMI_KEYGEN_EXT_SECTION_NAT_DST_REALMID, 2, 156, 2); 16033 BCMI_KEYGEN_QUAL_CFG_INSERT 16034 (unit, db, bcmFieldQualifyNatDstRealmId, qual_flags); 16035 16036 /* Exact Match Class Id and HIT status Qualifiers. */ 16037 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16038 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, 16039 BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_CLASSID_BITS_0_3, 8, 120, 4); 16040 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, 16041 BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_CLASSID_BITS_4_7, 9, 124, 4); 16042 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, 16043 BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_CLASSID_BITS_8_11, 10, 128, 4); 16044 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, 16045 _bcmFieldQualifyExactMatchActionClassIdLookup0, qual_flags); 16046 16047 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16048 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, 16049 BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_CLASSID_BITS_0_3, 5, 132, 4); 16050 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, 16051 BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_CLASSID_BITS_4_7, 6, 136, 4); 16052 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, 16053 BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_CLASSID_BITS_8_11, 7, 140, 4); 16054 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, 16055 _bcmFieldQualifyExactMatchActionClassIdLookup1, qual_flags); 16056 16057 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16058 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, 16059 BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_HIT, 3, 154, 1); 16060 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, 16061 _bcmFieldQualifyExactMatchHitStatusLookup0, qual_flags); 16062 16063 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16064 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, 16065 BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_HIT, 3, 155, 1); 16066 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, 16067 _bcmFieldQualifyExactMatchHitStatusLookup1, qual_flags); 16068 16069 /* Destination Port Object(PORT/LAG/VP/VPLAG) - 16070 * Any other Mode than SINGLE. 16071 */ 16072 SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_PMUX); 16073 SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_SINGLE); 16074 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16075 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16076 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16077 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16078 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16079 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 4); 16080 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstPort, qual_flags); 16081 16082 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16083 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16084 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16085 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16086 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16087 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 4); 16088 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstPort, qual_flags); 16089 16090 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16091 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16092 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16093 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16094 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16095 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 4); 16096 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstTrunk, qual_flags); 16097 16098 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16099 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16100 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16101 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16102 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16103 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 4); 16104 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstTrunk, qual_flags); 16105 16106 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16107 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16108 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16109 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16110 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16111 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16112 BCMI_KEYGEN_QUAL_CFG_INSERT 16113 (unit, db, bcmFieldQualifyDstMimGport, qual_flags); 16114 16115 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16116 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16117 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16118 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16119 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16120 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16121 BCMI_KEYGEN_QUAL_CFG_INSERT 16122 (unit, db, bcmFieldQualifyDstMimGport, qual_flags); 16123 16124 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16125 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16126 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16127 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16128 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16129 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16130 BCMI_KEYGEN_QUAL_CFG_INSERT 16131 (unit, db, bcmFieldQualifyDstMimGports, qual_flags); 16132 16133 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16134 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16135 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16136 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16137 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16138 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16139 BCMI_KEYGEN_QUAL_CFG_INSERT 16140 (unit, db, bcmFieldQualifyDstMimGports, qual_flags); 16141 16142 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16143 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16144 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16145 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16146 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16147 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16148 BCMI_KEYGEN_QUAL_CFG_INSERT 16149 (unit, db, bcmFieldQualifyDstNivGport, qual_flags); 16150 16151 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16152 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16153 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16154 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16155 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16156 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16157 BCMI_KEYGEN_QUAL_CFG_INSERT 16158 (unit, db, bcmFieldQualifyDstNivGport, qual_flags); 16159 16160 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16161 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16162 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16163 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16164 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16165 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16166 BCMI_KEYGEN_QUAL_CFG_INSERT 16167 (unit, db, bcmFieldQualifyDstNivGports, qual_flags); 16168 16169 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16170 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16171 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16172 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16173 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16174 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16175 BCMI_KEYGEN_QUAL_CFG_INSERT 16176 (unit, db, bcmFieldQualifyDstNivGports, qual_flags); 16177 16178 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16179 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16180 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16181 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16182 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16183 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16184 BCMI_KEYGEN_QUAL_CFG_INSERT 16185 (unit, db, bcmFieldQualifyDstVxlanGport, qual_flags); 16186 16187 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16188 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16189 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16190 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16191 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16192 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16193 BCMI_KEYGEN_QUAL_CFG_INSERT 16194 (unit, db, bcmFieldQualifyDstVxlanGport, qual_flags); 16195 16196 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16197 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16198 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16199 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16200 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16201 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16202 BCMI_KEYGEN_QUAL_CFG_INSERT 16203 (unit, db, bcmFieldQualifyDstVxlanGports, qual_flags); 16204 16205 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16206 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16207 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16208 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16209 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16210 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16211 BCMI_KEYGEN_QUAL_CFG_INSERT 16212 (unit, db, bcmFieldQualifyDstVxlanGports, qual_flags); 16213 16214 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16215 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16216 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16217 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16218 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16219 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16220 BCMI_KEYGEN_QUAL_CFG_INSERT 16221 (unit, db, bcmFieldQualifyDstVlanGport, qual_flags); 16222 16223 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16224 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16225 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16226 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16227 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16228 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16229 BCMI_KEYGEN_QUAL_CFG_INSERT 16230 (unit, db, bcmFieldQualifyDstVlanGport, qual_flags); 16231 16232 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16233 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16234 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16235 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16236 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16237 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16238 BCMI_KEYGEN_QUAL_CFG_INSERT 16239 (unit, db, bcmFieldQualifyDstVlanGports, qual_flags); 16240 16241 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16242 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16243 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16244 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16245 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16246 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16247 BCMI_KEYGEN_QUAL_CFG_INSERT 16248 (unit, db, bcmFieldQualifyDstVlanGports, qual_flags); 16249 16250 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16251 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16252 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16253 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16254 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16255 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16256 BCMI_KEYGEN_QUAL_CFG_INSERT 16257 (unit, db, bcmFieldQualifyDstMplsGport, qual_flags); 16258 16259 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16260 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16261 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16262 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16263 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16264 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16265 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstMplsGport, qual_flags); 16266 16267 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16268 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16269 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16270 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16271 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16272 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16273 BCMI_KEYGEN_QUAL_CFG_INSERT 16274 (unit, db, bcmFieldQualifyDstMplsGports, qual_flags); 16275 16276 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16277 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16278 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16279 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16280 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16281 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16282 BCMI_KEYGEN_QUAL_CFG_INSERT 16283 (unit, db, bcmFieldQualifyDstMplsGports, qual_flags); 16284 16285 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16286 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16287 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16288 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16289 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16290 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16291 BCMI_KEYGEN_QUAL_CFG_INSERT 16292 (unit, db, bcmFieldQualifyDstWlanGport, qual_flags); 16293 16294 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16295 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16296 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16297 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16298 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16299 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16300 BCMI_KEYGEN_QUAL_CFG_INSERT 16301 (unit, db, bcmFieldQualifyDstWlanGport, qual_flags); 16302 16303 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16304 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16305 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16306 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16307 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16308 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16309 BCMI_KEYGEN_QUAL_CFG_INSERT 16310 (unit, db, bcmFieldQualifyDstWlanGports, qual_flags); 16311 16312 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16313 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16314 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16315 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16316 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16317 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16318 BCMI_KEYGEN_QUAL_CFG_INSERT 16319 (unit, db, bcmFieldQualifyDstWlanGports, qual_flags); 16320 16321 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16322 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16323 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16324 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16325 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16326 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 9); 16327 BCMI_KEYGEN_QUAL_CFG_INSERT 16328 (unit, db, bcmFieldQualifyDstL3EgressNextHops, qual_flags); 16329 16330 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16331 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16332 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16333 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16334 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16335 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 9); 16336 BCMI_KEYGEN_QUAL_CFG_INSERT 16337 (unit, db, bcmFieldQualifyDstL3Egress, qual_flags); 16338 16339 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16340 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16341 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16342 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16343 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16344 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 9); 16345 BCMI_KEYGEN_QUAL_CFG_INSERT 16346 (unit, db, bcmFieldQualifyDstL3EgressNextHops, qual_flags); 16347 16348 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16349 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16350 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16351 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16352 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16353 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 9); 16354 BCMI_KEYGEN_QUAL_CFG_INSERT 16355 (unit, db, bcmFieldQualifyDstL3Egress, qual_flags); 16356 16357 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16358 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16359 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16360 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16361 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16362 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 7); 16363 BCMI_KEYGEN_QUAL_CFG_INSERT 16364 (unit, db, bcmFieldQualifyDstMultipath, qual_flags); 16365 16366 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16367 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16368 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16369 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16370 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16371 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 7); 16372 BCMI_KEYGEN_QUAL_CFG_INSERT 16373 (unit, db, bcmFieldQualifyDstMultipath, qual_flags); 16374 16375 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16376 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16377 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16378 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16379 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16380 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 7); 16381 BCMI_KEYGEN_QUAL_CFG_INSERT 16382 (unit, db, bcmFieldQualifyDstMultipathOverlay, qual_flags); 16383 16384 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16385 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16386 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16387 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16388 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16389 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 7); 16390 BCMI_KEYGEN_QUAL_CFG_INSERT 16391 (unit, db, bcmFieldQualifyDstMultipathOverlay, qual_flags); 16392 16393 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16394 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16395 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16396 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16397 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16398 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 8); 16399 BCMI_KEYGEN_QUAL_CFG_INSERT 16400 (unit, db, bcmFieldQualifyDstMultipathUnderlay, qual_flags); 16401 16402 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16403 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16404 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16405 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16406 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16407 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 8); 16408 BCMI_KEYGEN_QUAL_CFG_INSERT 16409 (unit, db, bcmFieldQualifyDstMultipathUnderlay, qual_flags); 16410 16411 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16412 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16413 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16414 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16415 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16416 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 10); 16417 BCMI_KEYGEN_QUAL_CFG_INSERT 16418 (unit, db, bcmFieldQualifyDstL3MulticastGroup, qual_flags); 16419 16420 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16421 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16422 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16423 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16424 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16425 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 10); 16426 BCMI_KEYGEN_QUAL_CFG_INSERT 16427 (unit, db, bcmFieldQualifyDstL3MulticastGroup, qual_flags); 16428 16429 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16430 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16431 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16); 16432 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16433 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16434 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 11); 16435 BCMI_KEYGEN_QUAL_CFG_INSERT 16436 (unit, db, bcmFieldQualifyDstL2MulticastGroup, qual_flags); 16437 16438 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16439 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16440 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16); 16441 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16442 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16443 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 11); 16444 BCMI_KEYGEN_QUAL_CFG_INSERT 16445 (unit, db, bcmFieldQualifyDstL2MulticastGroup, qual_flags); 16446 16447 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16448 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_IPBM, 0, 0, 34); 16449 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT, 0); 16450 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInPorts, qual_flags); 16451 16452 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16453 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_IPBM, 0, 0, 34); 16454 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT, 3); 16455 BCMI_KEYGEN_QUAL_CFG_INSERT 16456 (unit, db, bcmFieldQualifyDevicePortBitmap, qual_flags); 16457 16458 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16459 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_IPBM, 0, 0, 34); 16460 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT, 1); 16461 BCMI_KEYGEN_QUAL_CFG_INSERT 16462 (unit, db, bcmFieldQualifySystemPortBitmap, qual_flags); 16463 16464 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16465 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_IPBM, 0, 0, 34); 16466 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT, 2); 16467 BCMI_KEYGEN_QUAL_CFG_INSERT 16468 (unit, db, bcmFieldQualifySourceGportBitmap, qual_flags); 16469 16470 /* Destination Port Object(PORT/LAG/VP/VPLAG) - SINGLE Wide Mode */ 16471 SHR_BITCLR(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_SINGLE); 16472 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16473 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16474 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16475 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16476 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16477 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 4); 16478 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstPort, qual_flags); 16479 16480 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16481 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16482 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16483 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16484 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16485 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 4); 16486 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstPort, qual_flags); 16487 16488 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16489 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16490 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16491 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16492 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16493 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 4); 16494 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstTrunk, qual_flags); 16495 16496 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16497 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16498 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16499 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16500 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16501 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 4); 16502 BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstTrunk, qual_flags); 16503 16504 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16505 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16506 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16507 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16508 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16509 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16510 BCMI_KEYGEN_QUAL_CFG_INSERT 16511 (unit, db, bcmFieldQualifyDstMimGport, qual_flags); 16512 16513 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16514 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16515 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16516 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16517 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16518 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16519 BCMI_KEYGEN_QUAL_CFG_INSERT 16520 (unit, db, bcmFieldQualifyDstMimGport, qual_flags); 16521 16522 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16523 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16524 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16525 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16526 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16527 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16528 BCMI_KEYGEN_QUAL_CFG_INSERT 16529 (unit, db, bcmFieldQualifyDstMimGports, qual_flags); 16530 16531 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16532 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16533 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16534 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16535 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16536 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16537 BCMI_KEYGEN_QUAL_CFG_INSERT 16538 (unit, db, bcmFieldQualifyDstMimGports, qual_flags); 16539 16540 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16541 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16542 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16543 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16544 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16545 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16546 BCMI_KEYGEN_QUAL_CFG_INSERT 16547 (unit, db, bcmFieldQualifyDstNivGport, qual_flags); 16548 16549 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16550 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16551 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16552 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16553 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16554 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16555 BCMI_KEYGEN_QUAL_CFG_INSERT 16556 (unit, db, bcmFieldQualifyDstNivGport, qual_flags); 16557 16558 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16559 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16560 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16561 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16562 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16563 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16564 BCMI_KEYGEN_QUAL_CFG_INSERT 16565 (unit, db, bcmFieldQualifyDstNivGports, qual_flags); 16566 16567 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16568 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16569 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16570 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16571 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16572 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16573 BCMI_KEYGEN_QUAL_CFG_INSERT 16574 (unit, db, bcmFieldQualifyDstNivGports, qual_flags); 16575 16576 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16577 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16578 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16579 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16580 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16581 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16582 BCMI_KEYGEN_QUAL_CFG_INSERT 16583 (unit, db, bcmFieldQualifyDstVxlanGport, qual_flags); 16584 16585 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16586 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16587 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16588 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16589 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16590 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16591 BCMI_KEYGEN_QUAL_CFG_INSERT 16592 (unit, db, bcmFieldQualifyDstVxlanGport, qual_flags); 16593 16594 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16595 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16596 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16597 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16598 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16599 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16600 BCMI_KEYGEN_QUAL_CFG_INSERT 16601 (unit, db, bcmFieldQualifyDstVxlanGports, qual_flags); 16602 16603 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16604 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16605 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16606 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16607 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16608 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16609 BCMI_KEYGEN_QUAL_CFG_INSERT 16610 (unit, db, bcmFieldQualifyDstVxlanGports, qual_flags); 16611 16612 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16613 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16614 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16615 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16616 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16617 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16618 BCMI_KEYGEN_QUAL_CFG_INSERT 16619 (unit, db, bcmFieldQualifyDstVlanGport, qual_flags); 16620 16621 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16622 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16623 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16624 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16625 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16626 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16627 BCMI_KEYGEN_QUAL_CFG_INSERT 16628 (unit, db, bcmFieldQualifyDstVlanGport, qual_flags); 16629 16630 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16631 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16632 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16633 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16634 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16635 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16636 BCMI_KEYGEN_QUAL_CFG_INSERT 16637 (unit, db, bcmFieldQualifyDstVlanGports, qual_flags); 16638 16639 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16640 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16641 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16642 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16643 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16644 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16645 BCMI_KEYGEN_QUAL_CFG_INSERT 16646 (unit, db, bcmFieldQualifyDstVlanGports, qual_flags); 16647 16648 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16649 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16650 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16651 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16652 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16653 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16654 BCMI_KEYGEN_QUAL_CFG_INSERT 16655 (unit, db, bcmFieldQualifyDstWlanGport, qual_flags); 16656 16657 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16658 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16659 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16660 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16661 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16662 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16663 BCMI_KEYGEN_QUAL_CFG_INSERT 16664 (unit, db, bcmFieldQualifyDstWlanGport, qual_flags); 16665 16666 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16667 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16668 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16669 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16670 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16671 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16672 BCMI_KEYGEN_QUAL_CFG_INSERT 16673 (unit, db, bcmFieldQualifyDstWlanGports, qual_flags); 16674 16675 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16676 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16677 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16678 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16679 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16680 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16681 BCMI_KEYGEN_QUAL_CFG_INSERT 16682 (unit, db, bcmFieldQualifyDstWlanGports, qual_flags); 16683 16684 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16685 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16686 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16687 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16688 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16689 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16690 BCMI_KEYGEN_QUAL_CFG_INSERT 16691 (unit, db, bcmFieldQualifyDstMplsGport, qual_flags); 16692 16693 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16694 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16695 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16696 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16697 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16698 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16699 BCMI_KEYGEN_QUAL_CFG_INSERT 16700 (unit, db, bcmFieldQualifyDstMplsGport, qual_flags); 16701 16702 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16703 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16704 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16705 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16706 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16707 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5); 16708 BCMI_KEYGEN_QUAL_CFG_INSERT 16709 (unit, db, bcmFieldQualifyDstMplsGports, qual_flags); 16710 16711 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16712 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16713 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16714 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16715 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16716 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5); 16717 BCMI_KEYGEN_QUAL_CFG_INSERT 16718 (unit, db, bcmFieldQualifyDstMplsGports, qual_flags); 16719 16720 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16721 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16722 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16723 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16724 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16725 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 9); 16726 BCMI_KEYGEN_QUAL_CFG_INSERT 16727 (unit, db, bcmFieldQualifyDstL3EgressNextHops, qual_flags); 16728 16729 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16730 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16731 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16732 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16733 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16734 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 9); 16735 BCMI_KEYGEN_QUAL_CFG_INSERT 16736 (unit, db, bcmFieldQualifyDstL3Egress, qual_flags); 16737 16738 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16739 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16740 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16741 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16742 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16743 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 9); 16744 BCMI_KEYGEN_QUAL_CFG_INSERT 16745 (unit, db, bcmFieldQualifyDstL3EgressNextHops, qual_flags); 16746 16747 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16748 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16749 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16750 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16751 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16752 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 9); 16753 BCMI_KEYGEN_QUAL_CFG_INSERT 16754 (unit, db, bcmFieldQualifyDstL3Egress, qual_flags); 16755 16756 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16757 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16758 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16759 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16760 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16761 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 7); 16762 BCMI_KEYGEN_QUAL_CFG_INSERT 16763 (unit, db, bcmFieldQualifyDstMultipath, qual_flags); 16764 16765 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16766 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16767 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16768 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16769 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16770 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 7); 16771 BCMI_KEYGEN_QUAL_CFG_INSERT 16772 (unit, db, bcmFieldQualifyDstMultipath, qual_flags); 16773 16774 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16775 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16776 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16777 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16778 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16779 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 7); 16780 BCMI_KEYGEN_QUAL_CFG_INSERT 16781 (unit, db, bcmFieldQualifyDstMultipathOverlay, qual_flags); 16782 16783 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16784 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16785 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16786 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16787 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16788 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 7); 16789 BCMI_KEYGEN_QUAL_CFG_INSERT 16790 (unit, db, bcmFieldQualifyDstMultipathOverlay, qual_flags); 16791 16792 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16793 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16794 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16795 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16796 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16797 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 8); 16798 BCMI_KEYGEN_QUAL_CFG_INSERT 16799 (unit, db, bcmFieldQualifyDstMultipathUnderlay, qual_flags); 16800 16801 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16802 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16803 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16804 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16805 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16806 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 8); 16807 BCMI_KEYGEN_QUAL_CFG_INSERT 16808 (unit, db, bcmFieldQualifyDstMultipathUnderlay, qual_flags); 16809 16810 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16811 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16812 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16813 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16814 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16815 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 10); 16816 BCMI_KEYGEN_QUAL_CFG_INSERT 16817 (unit, db, bcmFieldQualifyDstL3MulticastGroup, qual_flags); 16818 16819 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16820 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16821 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16822 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16823 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16824 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 10); 16825 BCMI_KEYGEN_QUAL_CFG_INSERT 16826 (unit, db, bcmFieldQualifyDstL3MulticastGroup, qual_flags); 16827 16828 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16829 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16830 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16); 16831 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16832 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1); 16833 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 11); 16834 BCMI_KEYGEN_QUAL_CFG_INSERT 16835 (unit, db, bcmFieldQualifyDstL2MulticastGroup, qual_flags); 16836 16837 BCMI_KEYGEN_QUAL_CFG_INIT(unit); 16838 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16839 (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16); 16840 BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD 16841 (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1); 16842 BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 11); 16843 BCMI_KEYGEN_QUAL_CFG_INSERT 16844 (unit, db, bcmFieldQualifyDstL2MulticastGroup, qual_flags); 16845 16846 exit: 16847 BCMI_KEYGEN_FUNC_EXIT(); 16848 } 16849 16850 /* 16851 * Function: 16852 * _field_th_common_qualifiers_init 16853 * 16854 * Purpose: 16855 * Initialize Field Common Stage Qualifiers extractors and offsets. 16856 * 16857 * Parameters: 16858 * unit - (IN) BCM device number. 16859 * stage_fc - (IN/OUT) Field Processor stage control structure. 16860 * 16861 * Returns: 16862 * BCM_E_PARAM - Null field stage control structure. 16863 * BCM_E_MEMORY - Allocation failure. 16864 * BCM_E_INTERNAL - Invalid CAP Stage ID. 16865 * BCM_E_NONE - Success. 16866 */ 16867 STATIC int 16868 _field_th_common_qualifiers_init(int unit, _field_stage_t *stage_fc) 16869 { 16870 _FP_QUAL_DECL; 16871 16872 /* Allocated stage qualifiers configuration array. */ 16873 _FP_XGS3_ALLOC(stage_fc->f_qual_arr, 16874 (_bcmFieldQualifyCount * sizeof(_bcm_field_qual_info_t *)), 16875 "IFP qualifiers"); 16876 if (stage_fc->f_qual_arr == 0) { 16877 return (BCM_E_MEMORY); 16878 } 16879 16880 /* Pseudo Qualifiers. */ 16881 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyStage, 16882 0, 16883 _bcmFieldSliceSelDisable, 0, 16884 0, 0, 16885 0, 0); 16886 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyStageIngress, 16887 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16888 _bcmFieldSliceSelDisable, 0, 16889 0, 0, 16890 0, 0); 16891 if (soc_feature(unit, soc_feature_field_exact_match_support)) { 16892 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyStageIngressExactMatch, 16893 _BCM_FIELD_QUAL_OFFSET_NO_IFP_SUPPORT, 16894 _bcmFieldSliceSelDisable, 0, 16895 0, 0, 16896 0, 0); 16897 } 16898 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExactMatchHitStatus, 16899 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16900 _bcmFieldSliceSelDisable, 0, 16901 0, 0, 16902 0, 0); 16903 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExactMatchGroupClassId, 16904 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16905 _bcmFieldSliceSelDisable, 0, 16906 0, 0, 16907 0, 0); 16908 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExactMatchActionClassId, 16909 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16910 _bcmFieldSliceSelDisable, 0, 16911 0, 0, 16912 0, 0); 16913 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIp4, 16914 0, 16915 _bcmFieldSliceSelDisable, 0, 16916 0, 0, 16917 0, 0); 16918 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIp6, 16919 0, 16920 _bcmFieldSliceSelDisable, 0, 16921 0, 0, 16922 0, 0); 16923 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNormalizeIpAddrs, 16924 0, 16925 _bcmFieldSliceSelDisable, 0, 16926 0, 0, 16927 0, 0); 16928 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNormalizeMacAddrs, 16929 0, 16930 _bcmFieldSliceSelDisable, 0, 16931 0, 0, 16932 0, 0); 16933 16934 /* Post muxed qualifiers. */ 16935 if (!soc_feature(unit, soc_feature_ifp_no_inports_support)) { 16936 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInPorts, 16937 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16938 _bcmFieldSliceSelDisable, 0, 16939 0, 36, 16940 36, 0); 16941 } 16942 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDevicePortBitmap, 16943 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16944 _bcmFieldSliceSelDisable, 0, 16945 0, 36, 16946 36, 0); 16947 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySystemPortBitmap, 16948 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16949 _bcmFieldSliceSelDisable, 0, 16950 0, 36, 16951 36, 0); 16952 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySourceGportBitmap, 16953 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16954 _bcmFieldSliceSelDisable, 0, 16955 0, 36, 16956 36, 0); 16957 if (soc_feature(unit, soc_feature_nat)) { 16958 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNatDstRealmId, 16959 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16960 _bcmFieldSliceSelDisable, 0, 16961 156, 2, 16962 2, 156); 16963 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNatSrcRealmId, 16964 0, 16965 _bcmFieldSliceSelDisable, 0, 16966 0, 2, 16967 2, 0); 16968 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNatNeeded, 16969 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16970 _bcmFieldSliceSelDisable, 0, 16971 158, 1, 16972 1, 158); 16973 } 16974 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDrop, 16975 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16976 _bcmFieldSliceSelDisable, 0, 16977 159, 1, 16978 1, 159); 16979 /* Exact Match Chaining Post Mux Qualifier */ 16980 #if defined(BCM_TOMAHAWK3_SUPPORT) 16981 if (soc_feature(unit, soc_feature_th3_style_fp)) { 16982 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 16983 _bcmFieldQualifyExactMatchHitStatusLookup0, 16984 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16985 _bcmFieldSliceSelDisable, 0, 16986 158, 1, 16987 1, 158); 16988 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 16989 _bcmFieldQualifyExactMatchActionClassIdLookup0, 16990 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 16991 _bcmFieldSliceSelDisable, 0, 16992 84, 12, 16993 12, 84); 16994 16995 } else 16996 #endif 16997 { 16998 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 16999 _bcmFieldQualifyExactMatchHitStatusLookup0, 17000 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17001 _bcmFieldSliceSelDisable, 0, 17002 154, 1, 17003 1, 154); 17004 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 17005 _bcmFieldQualifyExactMatchHitStatusLookup1, 17006 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17007 _bcmFieldSliceSelDisable, 0, 17008 155, 1, 17009 1, 155); 17010 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 17011 _bcmFieldQualifyExactMatchActionClassIdLookup0, 17012 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17013 _bcmFieldSliceSelDisable, 0, 17014 120, 12, 17015 12, 120); 17016 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 17017 _bcmFieldQualifyExactMatchActionClassIdLookup1, 17018 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17019 _bcmFieldSliceSelDisable, 0, 17020 132, 12, 17021 12, 132); 17022 } 17023 /*Initailizing the offset values for below postmux qualifiers. 17024 Appropirate offsets will be updated during 17025 group creation depending on 80bit mode or 160bit mode*/ 17026 /*DGLP*/ 17027 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstPort, 17028 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17029 _bcmFieldDevSelDisable, 0, 17030 _bcmFieldDevSelDisable, 0, 17031 _bcmFieldDevSelDisable, 0, 17032 0, 17033 0, 16, 17034 0, 1, 17035 0, 0, 17036 0, 17037 17, 0); 17038 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstTrunk, 17039 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17040 _bcmFieldDevSelDisable, 0, 17041 _bcmFieldDevSelDisable, 0, 17042 _bcmFieldDevSelDisable, 0, 17043 0, 17044 0, 16, 17045 0, 1, 17046 0, 0, 17047 0, 17048 17, 0); 17049 /*DVP*/ 17050 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMplsGport, 17051 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17052 _bcmFieldDevSelDisable, 0, 17053 _bcmFieldDevSelDisable, 0, 17054 _bcmFieldDevSelDisable, 0, 17055 0, 17056 0, 16, 17057 0, 1, 17058 0, 0, 17059 0, 17060 17, 0); 17061 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMplsGports, 17062 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17063 _bcmFieldDevSelDisable, 0, 17064 _bcmFieldDevSelDisable, 0, 17065 _bcmFieldDevSelDisable, 0, 17066 0, 17067 0, 16, 17068 0, 1, 17069 0, 0, 17070 0, 17071 17, 0); 17072 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMimGport, 17073 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17074 _bcmFieldDevSelDisable, 0, 17075 _bcmFieldDevSelDisable, 0, 17076 _bcmFieldDevSelDisable, 0, 17077 0, 17078 0, 16, 17079 0, 1, 17080 0, 0, 17081 0, 17082 17,0); 17083 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMimGports, 17084 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17085 _bcmFieldDevSelDisable, 0, 17086 _bcmFieldDevSelDisable, 0, 17087 _bcmFieldDevSelDisable, 0, 17088 0, 17089 0, 16, 17090 0, 1, 17091 0, 0, 17092 0, 17093 17, 0); 17094 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstWlanGport, 17095 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17096 _bcmFieldDevSelDisable, 0, 17097 _bcmFieldDevSelDisable, 0, 17098 _bcmFieldDevSelDisable, 0, 17099 0, 17100 0, 16, 17101 0, 1, 17102 0, 0, 17103 0, 17104 17, 0); 17105 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstWlanGports, 17106 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17107 _bcmFieldDevSelDisable, 0, 17108 _bcmFieldDevSelDisable, 0, 17109 _bcmFieldDevSelDisable, 0, 17110 0, 17111 0, 16, 17112 0, 1, 17113 0, 0, 17114 0, 17115 17, 0); 17116 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstVlanGport, 17117 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17118 _bcmFieldDevSelDisable, 0, 17119 _bcmFieldDevSelDisable, 0, 17120 _bcmFieldDevSelDisable, 0, 17121 0, 17122 0, 16, 17123 0, 1, 17124 0, 0, 17125 0, 17126 17, 0); 17127 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstVlanGports, 17128 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17129 _bcmFieldDevSelDisable, 0, 17130 _bcmFieldDevSelDisable, 0, 17131 _bcmFieldDevSelDisable, 0, 17132 0, 17133 0, 16, 17134 0, 1, 17135 0, 0, 17136 0, 17137 17, 0); 17138 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstVxlanGport, 17139 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17140 _bcmFieldDevSelDisable, 0, 17141 _bcmFieldDevSelDisable, 0, 17142 _bcmFieldDevSelDisable, 0, 17143 0, 17144 0, 16, 17145 0, 1, 17146 0, 0, 17147 0, 17148 17, 0); 17149 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstVxlanGports, 17150 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17151 _bcmFieldDevSelDisable, 0, 17152 _bcmFieldDevSelDisable, 0, 17153 _bcmFieldDevSelDisable, 0, 17154 0, 17155 0, 16, 17156 0, 1, 17157 0, 0, 17158 0, 17159 17, 0); 17160 if (soc_feature(unit, soc_feature_niv)) { 17161 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstNivGport, 17162 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17163 _bcmFieldDevSelDisable, 0, 17164 _bcmFieldDevSelDisable, 0, 17165 _bcmFieldDevSelDisable, 0, 17166 0, 17167 0, 16, 17168 0, 1, 17169 0, 0, 17170 0, 17171 17, 0); 17172 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstNivGports, 17173 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17174 _bcmFieldDevSelDisable, 0, 17175 _bcmFieldDevSelDisable, 0, 17176 _bcmFieldDevSelDisable, 0, 17177 0, 17178 0, 16, 17179 0, 1, 17180 0, 0, 17181 0, 17182 17, 0); 17183 } 17184 /*DVP - */ 17185 if (soc_feature(unit, soc_feature_td3_style_fp)) { 17186 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL3EgressNextHopsUnderlay, 17187 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17188 _bcmFieldDevSelDisable, 0, 17189 _bcmFieldDevSelDisable, 0, 17190 _bcmFieldDevSelDisable, 0, 17191 0, 17192 0, 16, 17193 0, 1, 17194 0, 0, 17195 0, 17196 17, 0); 17197 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL3EgressUnderlay, 17198 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17199 _bcmFieldDevSelDisable, 0, 17200 _bcmFieldDevSelDisable, 0, 17201 _bcmFieldDevSelDisable, 0, 17202 0, 17203 0, 16, 17204 0, 1, 17205 0, 0, 17206 0, 17207 17, 0); 17208 } 17209 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL3EgressNextHops, 17210 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17211 _bcmFieldDevSelDisable, 0, 17212 _bcmFieldDevSelDisable, 0, 17213 _bcmFieldDevSelDisable, 0, 17214 0, 17215 0, 16, 17216 0, 1, 17217 0, 0, 17218 0, 17219 17, 0); 17220 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMultipath, 17221 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17222 _bcmFieldDevSelDisable, 0, 17223 _bcmFieldDevSelDisable, 0, 17224 _bcmFieldDevSelDisable, 0, 17225 0, 17226 0, 16, 17227 0, 1, 17228 0, 0, 17229 0, 17230 17, 0); 17231 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMultipathOverlay, 17232 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17233 _bcmFieldDevSelDisable, 0, 17234 _bcmFieldDevSelDisable, 0, 17235 _bcmFieldDevSelDisable, 0, 17236 0, 17237 0, 16, 17238 0, 1, 17239 0, 0, 17240 0, 17241 17, 0); 17242 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMultipathUnderlay, 17243 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17244 _bcmFieldDevSelDisable, 0, 17245 _bcmFieldDevSelDisable, 0, 17246 _bcmFieldDevSelDisable, 0, 17247 0, 17248 0, 16, 17249 0, 1, 17250 0, 0, 17251 0, 17252 17, 0); 17253 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL3Egress, 17254 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17255 _bcmFieldDevSelDisable, 0, 17256 _bcmFieldDevSelDisable, 0, 17257 _bcmFieldDevSelDisable, 0, 17258 0, 17259 0, 16, 17260 0, 1, 17261 0, 0, 17262 0, 17263 17, 0); 17264 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL3MulticastGroup, 17265 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17266 _bcmFieldDevSelDisable, 0, 17267 _bcmFieldDevSelDisable, 0, 17268 _bcmFieldDevSelDisable, 0, 17269 0, 17270 0, 16, 17271 0, 1, 17272 0, 0, 17273 0, 17274 17, 0); 17275 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL2MulticastGroup, 17276 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17277 _bcmFieldDevSelDisable, 0, 17278 _bcmFieldDevSelDisable, 0, 17279 _bcmFieldDevSelDisable, 0, 17280 0, 17281 0, 16, 17282 0, 1, 17283 0, 0, 17284 0, 17285 17, 0); 17286 17287 /* L2 qualifiers - 48 bits section. */ 17288 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMac, 17289 0, 17290 _bcmFieldSliceSelDisable, 0, 17291 0, 48, 17292 48, 0); 17293 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcMac, 17294 0, 17295 _bcmFieldSliceSelDisable, 0, 17296 0, 48, 17297 48, 0); 17298 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2PayloadFirstEightBytes, 17299 0, 17300 _bcmFieldSliceSelDisable, 0, 17301 0, 64, 17302 64, 0); 17303 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyISid, 17304 0, 17305 _bcmFieldSliceSelDisable, 0, 17306 0, 24, 17307 24, 0); 17308 17309 /* L2 qualifiers - 16 bits section. */ 17310 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterVlan, 17311 0, 17312 _bcmFieldSliceSelDisable, 0, 17313 0, 16, 17314 16, 0); 17315 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterVlanCfi, 17316 0, 17317 _bcmFieldSliceSelDisable, 0, 17318 0, 1, 17319 1, 0); 17320 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterVlanPri, 17321 0, 17322 _bcmFieldSliceSelDisable, 0, 17323 0, 3, 17324 3, 0); 17325 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterVlanId, 17326 0, 17327 _bcmFieldSliceSelDisable, 0, 17328 0, 12, 17329 12, 0); 17330 if (soc_feature(unit, soc_feature_td3_style_fp)) { 17331 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIncomingOuterVlanId, 17332 0, 17333 _bcmFieldSliceSelDisable, 0, 17334 0, 12, 17335 12, 0); 17336 } 17337 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerVlan, 17338 0, 17339 _bcmFieldSliceSelDisable, 0, 17340 0, 16, 17341 16, 0); 17342 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerVlanCfi, 17343 0, 17344 _bcmFieldSliceSelDisable, 0, 17345 0, 1, 17346 1, 0); 17347 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerVlanPri, 17348 0, 17349 _bcmFieldSliceSelDisable, 0, 17350 0, 3, 17351 3, 0); 17352 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerVlanId, 17353 0, 17354 _bcmFieldSliceSelDisable, 0, 17355 0, 12, 17356 12, 0); 17357 17358 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyEtherType, 17359 0, 17360 _bcmFieldSliceSelDisable, 0, 17361 0, 16, 17362 16, 0); 17363 17364 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMacAddrsNormalized, 17365 0, 17366 _bcmFieldSliceSelDisable, 0, 17367 0, 1, 17368 1, 0); 17369 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpAddrsNormalized, 17370 0, 17371 _bcmFieldSliceSelDisable, 0, 17372 1, 1, 17373 1, 1); 17374 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2Format, 17375 0, 17376 _bcmFieldSliceSelDisable, 0, 17377 0, 2, 17378 2, 0); 17379 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVlanFormat, 17380 0, 17381 _bcmFieldSliceSelDisable, 0, 17382 0, 2, 17383 2, 0); 17384 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTranslatedVlanFormat, 17385 0, 17386 _bcmFieldSliceSelDisable, 0, 17387 0, 2, 17388 2, 0); 17389 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterTpid, 17390 0, 17391 _bcmFieldSliceSelDisable, 0, 17392 0, 2, 17393 2, 0); 17394 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerTpid, 17395 0, 17396 _bcmFieldSliceSelDisable, 0, 17397 0, 2, 17398 2, 0); 17399 17400 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVlanTranslationHit, 17401 0, 17402 _bcmFieldSliceSelDisable, 0, 17403 0, 3, 17404 3, 0); 17405 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyForwardingVlanValid, 17406 0, 17407 _bcmFieldSliceSelDisable, 0, 17408 0, 1, 17409 1, 0); 17410 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIngressStpState, 17411 0, 17412 _bcmFieldSliceSelDisable, 0, 17413 0, 2, 17414 2, 0); 17415 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyStpState, 17416 0, 17417 _bcmFieldSliceSelDisable, 0, 17418 0, 2, 17419 2, 0); 17420 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2SrcHit, 17421 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17422 _bcmFieldSliceSelDisable, 0, 17423 0, 1, 17424 1, 1); 17425 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2SrcStatic, 17426 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17427 _bcmFieldSliceSelDisable, 0, 17428 0, 1, 17429 1, 0); 17430 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2DestHit, 17431 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17432 _bcmFieldSliceSelDisable, 0, 17433 0, 1, 17434 1, 0); 17435 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2CacheHit, 17436 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17437 _bcmFieldSliceSelDisable, 0, 17438 0, 1, 17439 1, 0); 17440 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3SrcHostHit, 17441 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17442 _bcmFieldSliceSelDisable, 0, 17443 0, 1, 17444 1, 0); 17445 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpmcStarGroupHit, 17446 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17447 _bcmFieldSliceSelDisable, 0, 17448 0, 1, 17449 1, 0); 17450 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3DestHostHit, 17451 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17452 _bcmFieldSliceSelDisable, 0, 17453 0, 1, 17454 1, 0); 17455 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3DestRouteHit, 17456 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17457 _bcmFieldSliceSelDisable, 0, 17458 0, 1, 17459 1, 0); 17460 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2StationMove, 17461 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17462 _bcmFieldSliceSelDisable, 0, 17463 0, 1, 17464 1, 0); 17465 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDosAttack, 17466 0, 17467 _bcmFieldSliceSelDisable, 0, 17468 0, 1, 17469 1, 0); 17470 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpTunnelHit, 17471 0, 17472 _bcmFieldSliceSelDisable, 0, 17473 0, 1, 17474 1, 0); 17475 /* NV GRE */ 17476 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2GreVsid, 17477 0, 17478 _bcmFieldSliceSelDisable, 0, 17479 0, 24, 17480 24, 0); 17481 17482 /* MPLS */ 17483 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelAction, 17484 0, 17485 _bcmFieldSliceSelDisable, 0, 17486 0, 3, 17487 3, 0); 17488 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabel, 17489 0, 17490 _bcmFieldSliceSelDisable, 0, 17491 0, 32, 17492 32, 0); 17493 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelId, 17494 0, 17495 _bcmFieldSliceSelDisable, 0, 17496 0, 20, 17497 20, 0); 17498 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelExp, 17499 0, 17500 _bcmFieldSliceSelDisable, 0, 17501 0, 3, 17502 3, 0); 17503 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelBos, 17504 0, 17505 _bcmFieldSliceSelDisable, 0, 17506 0, 1, 17507 1, 0); 17508 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelTtl, 17509 0, 17510 _bcmFieldSliceSelDisable, 0, 17511 0, 8, 17512 8, 0); 17513 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsControlWord, 17514 0, 17515 _bcmFieldSliceSelDisable, 0, 17516 0, 32, 17517 32, 0); 17518 /* L2 Payload for non-IP Packets */ 17519 _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2PayLoad, 17520 0, 17521 _bcmFieldDevSelDisable, 0, 17522 _bcmFieldDevSelDisable, 0, 17523 _bcmFieldDevSelDisable, 0, 17524 0, 17525 0, 128, 17526 128, 128, 17527 0, 0, 17528 0, 17529 256, 0); 17530 /* L3 IPv6 qualifiers - 128 bits section. */ 17531 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6, 17532 0, 17533 _bcmFieldSliceSelDisable, 0, 17534 0, 128, 17535 128, 0); 17536 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6, 17537 0, 17538 _bcmFieldSliceSelDisable, 0, 17539 0, 128, 17540 128, 0); 17541 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6High, 17542 0, 17543 _bcmFieldSliceSelDisable, 0, 17544 0, 64, 17545 64, 0); 17546 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6Low, 17547 0, 17548 _bcmFieldSliceSelDisable, 0, 17549 0, 64, 17550 64, 0); 17551 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6High, 17552 0, 17553 _bcmFieldSliceSelDisable, 0, 17554 0, 64, 17555 64, 0); 17556 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6Low, 17557 0, 17558 _bcmFieldSliceSelDisable, 0, 17559 0, 64, 17560 64, 0); 17561 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExtensionHeader2Type, 17562 0, 17563 _bcmFieldSliceSelDisable, 0, 17564 0, 8, 17565 8, 0); 17566 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExtensionHeaderType, 17567 0, 17568 _bcmFieldSliceSelDisable, 0, 17569 0, 8, 17570 8, 0); 17571 if (!soc_feature(unit, soc_feature_td3_style_fp)) { 17572 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExtensionHeaderSubCode, 17573 0, 17574 _bcmFieldSliceSelDisable, 0, 17575 0, 8, 17576 8, 0); 17577 } 17578 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIp6FlowLabel, 17579 0, 17580 _bcmFieldSliceSelDisable, 0, 17581 0, 20, 17582 20, 0); 17583 17584 /* L3 IPv4 qualifiers - 32 bits section. */ 17585 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp, 17586 0, 17587 _bcmFieldSliceSelDisable, 0, 17588 0, 32, 17589 32, 0); 17590 17591 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp, 17592 0, 17593 _bcmFieldSliceSelDisable, 0, 17594 0, 32, 17595 32, 0); 17596 17597 /* L3 IPv4 qualifiers - 16 bits section. */ 17598 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL4DstPort, 17599 0, 17600 _bcmFieldSliceSelDisable, 0, 17601 0, 16, 17602 16, 0); 17603 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL4SrcPort, 17604 0, 17605 _bcmFieldSliceSelDisable, 0, 17606 0, 16, 17607 16, 0); 17608 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIcmpTypeCode, 17609 0, 17610 _bcmFieldSliceSelDisable, 0, 17611 0, 16, 17612 16, 0); 17613 17614 /* L3 IPv4 qualifiers - 8 bits section. */ 17615 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpProtocol, 17616 0, 17617 _bcmFieldSliceSelDisable, 0, 17618 0, 8, 17619 8, 0); 17620 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTtl, 17621 0, 17622 _bcmFieldSliceSelDisable, 0, 17623 0, 8, 17624 8, 0); 17625 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTos, 17626 0, 17627 _bcmFieldSliceSelDisable, 0, 17628 0, 8, 17629 8, 0); 17630 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTcpControl, 17631 0, 17632 _bcmFieldSliceSelDisable, 0, 17633 0, 8, 17634 8, 0); 17635 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpType, 17636 0, 17637 _bcmFieldSliceSelDisable, 0, 17638 0, 5, 17639 5, 0); 17640 /* L3 qualifiers - 1 bit section. */ 17641 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRepCopy, 17642 0, 17643 _bcmFieldSliceSelDisable, 0, 17644 0, 1, 17645 1, 0); 17646 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIcmpError, 17647 0, 17648 _bcmFieldSliceSelDisable, 0, 17649 0, 1, 17650 1, 0); 17651 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIpLocal, 17652 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17653 _bcmFieldSliceSelDisable, 0, 17654 0, 1, 17655 1, 0); 17656 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpFlags, 17657 0, 17658 _bcmFieldSliceSelDisable, 0, 17659 0, 2, 17660 2, 0); 17661 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpFrag, 17662 0, 17663 _bcmFieldSliceSelDisable, 0, 17664 0, 2, 17665 2, 0); 17666 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpFragNonOrFirst, 17667 0, 17668 _bcmFieldSliceSelDisable, 0, 17669 0, 1, 17670 1, 0); 17671 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyColor, 17672 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17673 _bcmFieldSliceSelDisable, 0, 17674 0, 2, 17675 2, 0); 17676 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 17677 bcmFieldQualifyGenericAssociatedChannelLabelValid, 17678 0, 17679 _bcmFieldSliceSelDisable, 0, 17680 0, 1, 17681 1, 0); 17682 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 17683 bcmFieldQualifyRouterAlertLabelValid, 17684 0, 17685 _bcmFieldSliceSelDisable, 0, 17686 0, 1, 17687 1, 0); 17688 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsControlWordValid, 17689 0, 17690 _bcmFieldSliceSelDisable, 0, 17691 0, 1, 17692 1, 0); 17693 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpInfo, 17694 0, 17695 _bcmFieldSliceSelDisable, 0, 17696 0, 1, 17697 1, 0); 17698 #if defined(BCM_TOMAHAWK2_SUPPORT) 17699 if (SOC_IS_TOMAHAWK2(unit)) { 17700 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRecoverableDrop, 17701 0, 17702 _bcmFieldSliceSelDisable, 0, 17703 0, 1, 17704 1, 0); 17705 } 17706 #endif /* BCM_TOMAHAWK2_SUPPORT */ 17707 17708 /* Switch - Port and Interface qualifiers. */ 17709 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInPort, 17710 0, 17711 _bcmFieldSliceSelDisable, 0, 17712 0, 8, 17713 8, 0); 17714 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVpn, 17715 0, 17716 _bcmFieldSliceSelDisable, 0, 17717 0, SOC_IS_HELIX5(unit) ? 12 : 13, 17718 SOC_IS_HELIX5(unit) ? 12 : 13, 0); 17719 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVrf, 17720 0, 17721 _bcmFieldSliceSelDisable, 0, 17722 0, 11, 17723 11, 0); 17724 17725 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassPort, 17726 0, 17727 _bcmFieldSliceSelDisable, 0, 17728 0, 12, 17729 12, 0); 17730 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassL3, 17731 0, 17732 _bcmFieldSliceSelDisable, 0, 17733 0, 12, 17734 12, 0); 17735 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassVPort, 17736 0, 17737 _bcmFieldSliceSelDisable, 0, 17738 0, 12, 17739 12, 0); 17740 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassL2, 17741 0, 17742 _bcmFieldSliceSelDisable, 0, 17743 0, 12, 17744 12, 0); 17745 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstClassField, 17746 0, 17747 _bcmFieldSliceSelDisable, 0, 17748 0, 10, 17749 10, 0); 17750 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcClassField, 17751 0, 17752 _bcmFieldSliceSelDisable, 0, 17753 0, 10, 17754 10, 0); 17755 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVlanTranslateClassId, 17756 0, 17757 _bcmFieldSliceSelDisable, 0, 17758 0, 12, 17759 12, 0); 17760 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassMplsLookup1, 17761 0, 17762 _bcmFieldSliceSelDisable, 0, 17763 0, 12, 17764 12, 0); 17765 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassMplsLookup2, 17766 0, 17767 _bcmFieldSliceSelDisable, 0, 17768 0, 12, 17769 12, 0); 17770 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassL3Tunnel, 17771 0, 17772 _bcmFieldSliceSelDisable, 0, 17773 0, 12, 17774 12, 0); 17775 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyCosMapSelect, 17776 0, 17777 _bcmFieldSliceSelDisable, 0, 17778 0, 1, 17779 1, 0); 17780 if (soc_feature(unit, soc_feature_td3_style_fp)) { 17781 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOpaqueObject4, 17782 0, 17783 _bcmFieldSliceSelDisable, 0, 17784 0, 16, 17785 16, 0); 17786 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOpaqueObject3, 17787 0, 17788 _bcmFieldSliceSelDisable, 0, 17789 0, 16, 17790 16, 0); 17791 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOpaqueObject2, 17792 0, 17793 _bcmFieldSliceSelDisable, 0, 17794 0, 16, 17795 16, 0); 17796 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOpaqueObject1, 17797 0, 17798 _bcmFieldSliceSelDisable, 0, 17799 0, 16, 17800 16, 0); 17801 } 17802 if (soc_feature(unit, soc_feature_flex_flowtracker_ver_1)) { 17803 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerLearn, 17804 0, 17805 _bcmFieldSliceSelDisable, 0, 17806 0, 1, 17807 1, 0); 17808 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerGroupId, 17809 0, 17810 _bcmFieldSliceSelDisable, 0, 17811 0, 16, 17812 16, 0); 17813 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerClassId, 17814 0, 17815 _bcmFieldSliceSelDisable, 0, 17816 0, 16, 17817 16, 0); 17818 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerGroupValid, 17819 0, 17820 _bcmFieldSliceSelDisable, 0, 17821 0, 1, 17822 1, 0); 17823 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerDisabled, 17824 0, 17825 _bcmFieldSliceSelDisable, 0, 17826 0, 1, 17827 1, 0); 17828 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerCheck, 17829 0, 17830 _bcmFieldSliceSelDisable, 0, 17831 0, 8, 17832 8, 0); 17833 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerCollectorCopy, 17834 0, 17835 _bcmFieldSliceSelDisable, 0, 17836 0, 1, 17837 1, 0); 17838 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerMeteringExceeded, 17839 0, 17840 _bcmFieldSliceSelDisable, 0, 17841 0, 1, 17842 1, 0); 17843 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerFlowTableFull, 17844 0, 17845 _bcmFieldSliceSelDisable, 0, 17846 0, 1, 17847 1, 0); 17848 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerGroupFlowExceeded, 17849 0, 17850 _bcmFieldSliceSelDisable, 0, 17851 0, 1, 17852 1, 0); 17853 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerExportQueueFull, 17854 0, 17855 _bcmFieldSliceSelDisable, 0, 17856 0, 1, 17857 1, 0); 17858 } 17859 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceLookupClassPort, 17860 0, 17861 _bcmFieldSliceSelDisable, 0, 17862 0, 8, 17863 8, 0); 17864 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceIngressKeySelectClassPort, 17865 0, 17866 _bcmFieldSliceSelDisable, 0, 17867 0, 8, 17868 8, 0); 17869 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyUdfClass, 17870 0, 17871 _bcmFieldSliceSelDisable, 0, 17872 0, 8, 17873 8, 0); 17874 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGroupClass, 17875 0, 17876 _bcmFieldSliceSelDisable, 0, 17877 0, 2, 17878 2, 0); 17879 /*SGPP*/ 17880 #ifdef BCM_TOMAHAWK3_SUPPORT 17881 if (soc_feature(unit, soc_feature_th3_style_fp)) { 17882 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcPort, 17883 0, 17884 _bcmFieldSliceSelDisable, 0, 17885 0, 9, 17886 9, 0); 17887 } else 17888 #endif 17889 { 17890 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcPort, 17891 0, 17892 _bcmFieldSliceSelDisable, 0, 17893 0, 16, 17894 16, 0); 17895 } 17896 17897 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcModPortGport, 17898 0, 17899 _bcmFieldSliceSelDisable, 0, 17900 0, 16, 17901 16, 0); 17902 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcModPortGports, 17903 0, 17904 _bcmFieldSliceSelDisable, 0, 17905 0, 16, 17906 16, 0); 17907 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcModuleGport, 17908 0, 17909 _bcmFieldSliceSelDisable, 0, 17910 0, 9, 17911 9, 0); 17912 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcTrunkMemberGport, 17913 0, 17914 _bcmFieldSliceSelDisable, 0, 17915 0, 16, 17916 16, 0); 17917 /*SGLP*/ 17918 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcTrunk, 17919 0, 17920 _bcmFieldSliceSelDisable, 0, 17921 0, 16, 17922 16, 0); 17923 /*SVP*/ 17924 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcMplsGport, 17925 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17926 _bcmFieldSliceSelDisable, 0, 17927 0, 16, 17928 16, 0); 17929 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcMplsGports, 17930 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 17931 _bcmFieldSliceSelDisable, 0, 17932 0, 16, 17933 16, 0); 17934 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcMimGport, 17935 0, 17936 _bcmFieldSliceSelDisable, 0, 17937 0, 16, 17938 16, 0); 17939 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcMimGports, 17940 0, 17941 _bcmFieldSliceSelDisable, 0, 17942 0, 16, 17943 16, 0); 17944 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcWlanGport, 17945 0, 17946 _bcmFieldSliceSelDisable, 0, 17947 0, 16, 17948 16, 0); 17949 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcWlanGports, 17950 0, 17951 _bcmFieldSliceSelDisable, 0, 17952 0, 16, 17953 16, 0); 17954 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcVlanGport, 17955 0, 17956 _bcmFieldSliceSelDisable, 0, 17957 0, 16, 17958 16, 0); 17959 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcVlanGports, 17960 0, 17961 _bcmFieldSliceSelDisable, 0, 17962 0, 16, 17963 16, 0); 17964 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcVxlanGport, 17965 0, 17966 _bcmFieldSliceSelDisable, 0, 17967 0, 16, 17968 16, 0); 17969 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcVxlanGports, 17970 0, 17971 _bcmFieldSliceSelDisable, 0, 17972 0, 16, 17973 16, 0); 17974 if (soc_feature(unit, soc_feature_niv)) { 17975 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcNivGport, 17976 0, 17977 _bcmFieldSliceSelDisable, 0, 17978 0, 16, 17979 16, 0); 17980 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcNivGports, 17981 0, 17982 _bcmFieldSliceSelDisable, 0, 17983 0, 16, 17984 16, 0); 17985 } 17986 /*SVP - */ 17987 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcClassL2, 17988 0, 17989 _bcmFieldSliceSelDisable, 0, 17990 0, 10, 17991 10, 0); 17992 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstClassL2, 17993 0, 17994 _bcmFieldSliceSelDisable, 0, 17995 0, 10, 17996 10, 0); 17997 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcClassL3, 17998 0, 17999 _bcmFieldSliceSelDisable, 0, 18000 0, 10, 18001 10, 0); 18002 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstClassL3, 18003 0, 18004 _bcmFieldSliceSelDisable, 0, 18005 0, 10, 18006 10, 0); 18007 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcVirtualPortValid, 18008 0, 18009 _bcmFieldSliceSelDisable, 0, 18010 0, 1, 18011 1, 0); 18012 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDestVirtualPortValid, 18013 0, 18014 _bcmFieldSliceSelDisable, 0, 18015 0, 1, 18016 1, 0); 18017 18018 /* Meta data qualifiers. */ 18019 /* L3_IIF table size is 8192. */ 18020 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyForwardingVlanId, 18021 0, 18022 _bcmFieldSliceSelDisable, 0, 18023 0, 12, 18024 12, 0); 18025 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3Ingress, 18026 0, 18027 _bcmFieldSliceSelDisable, 0, 18028 0, 13, 18029 13, 0); 18030 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRangeCheck, 18031 0, 18032 _bcmFieldSliceSelDisable, 0, 18033 0, 32, 18034 32, 0); 18035 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyPacketRes, 18036 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 18037 _bcmFieldSliceSelDisable, 0, 18038 0, 6, 18039 6, 0); 18040 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyPacketLength, 18041 0, 18042 _bcmFieldSliceSelDisable, 0, 18043 0, 16, 18044 16, 0); 18045 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTunnelType, 18046 0, 18047 _bcmFieldSliceSelDisable, 0, 18048 0, 5, 18049 5, 0); 18050 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyLoopbackType, 18051 0, 18052 _bcmFieldSliceSelDisable, 0, 18053 0, 5, 18054 5, 0); 18055 if (!soc_feature(unit, soc_feature_td3_style_fp)) { 18056 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyLoopback, 18057 0, 18058 _bcmFieldSliceSelDisable, 0, 18059 0, 1, 18060 1, 0); 18061 } 18062 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsLabel1Hit, 18063 0, 18064 _bcmFieldSliceSelDisable, 0, 18065 0, 1, 18066 1, 0); 18067 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTrillEgressRbridgeHit, 18068 0, 18069 _bcmFieldSliceSelDisable, 0, 18070 0, 1, 18071 1, 0); 18072 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2GreSrcIpHit, 18073 0, 18074 _bcmFieldSliceSelDisable, 0, 18075 0, 1, 18076 1, 0); 18077 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMimSrcGportHit, 18078 0, 18079 _bcmFieldSliceSelDisable, 0, 18080 0, 1, 18081 1, 0); 18082 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsLabel2Hit, 18083 0, 18084 _bcmFieldSliceSelDisable, 0, 18085 0, 1, 18086 1, 0); 18087 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTrillIngressRbridgeHit, 18088 0, 18089 _bcmFieldSliceSelDisable, 0, 18090 0, 1, 18091 1, 0); 18092 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2GreVfiHit, 18093 0, 18094 _bcmFieldSliceSelDisable, 0, 18095 0, 1, 18096 1, 0); 18097 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMimVfiHit, 18098 0, 18099 _bcmFieldSliceSelDisable, 0, 18100 0, 1, 18101 1, 0); 18102 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsTerminated, 18103 0, 18104 _bcmFieldSliceSelDisable, 0, 18105 0, 1, 18106 1, 0); 18107 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyForwardingType, 18108 0, 18109 _bcmFieldSliceSelDisable, 0, 18110 0, 4, 18111 4, 0); 18112 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPriority, 18113 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 18114 _bcmFieldSliceSelDisable, 0, 18115 0, 4, 18116 4, 0); 18117 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMHOpcode, 18118 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 18119 _bcmFieldSliceSelDisable, 0, 18120 0, 3, 18121 3, 0); 18122 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyHiGigProxy, 18123 0, 18124 _bcmFieldSliceSelDisable, 0, 18125 0, 1, 18126 1, 0); 18127 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyCpuVisibilityPacket, 18128 0, 18129 _bcmFieldSliceSelDisable, 0, 18130 0, 1, 18131 1, 0); 18132 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL4Ports, 18133 0, 18134 _bcmFieldSliceSelDisable, 0, 18135 0, 1, 18136 1, 0); 18137 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMirrorCopy, 18138 0, 18139 _bcmFieldSliceSelDisable, 0, 18140 0, 1, 18141 1, 0); 18142 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyHiGig, 18143 0, 18144 _bcmFieldSliceSelDisable, 0, 18145 0, 1, 18146 1, 0); 18147 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntCongestionNotification, 18148 0, 18149 _bcmFieldSliceSelDisable, 0, 18150 0, 2, 18151 2, 0); 18152 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3Routable, 18153 0, 18154 _bcmFieldSliceSelDisable, 0, 18155 0, 1, 18156 1, 0); 18157 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMyStationHit, 18158 0, 18159 _bcmFieldSliceSelDisable, 0, 18160 0, 1, 18161 1, 0); 18162 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRtag7AHashUpper, 18163 0, 18164 _bcmFieldSliceSelDisable, 0, 18165 0, 16, 18166 16, 0); 18167 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRtag7AHashLower, 18168 0, 18169 _bcmFieldSliceSelDisable, 0, 18170 0, 16, 18171 16, 0); 18172 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRtag7BHashUpper, 18173 0, 18174 _bcmFieldSliceSelDisable, 0, 18175 0, 16, 18176 16, 0); 18177 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRtag7BHashLower, 18178 0, 18179 _bcmFieldSliceSelDisable, 0, 18180 0, 16, 18181 16, 0); 18182 18183 /* VXLAN qualifiers. */ 18184 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVxlanNetworkId, 18185 0, 18186 _bcmFieldSliceSelDisable, 0, 18187 0, 24, 18188 24, 0); 18189 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVxlanFlags, 18190 0, 18191 _bcmFieldSliceSelDisable, 0, 18192 0, 8, 18193 8, 0); 18194 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVxlanHeaderBits8_31, 18195 0, 18196 _bcmFieldSliceSelDisable, 0, 18197 0, 24, 18198 24, 0); 18199 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVxlanHeaderBits56_63, 18200 0, 18201 _bcmFieldSliceSelDisable, 0, 18202 0, 8, 18203 8, 0); 18204 if (soc_feature(unit, soc_feature_niv)) { 18205 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVnTag, 18206 0, 18207 _bcmFieldSliceSelDisable, 0, 18208 0, 32, 18209 32, 0); 18210 } 18211 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyETag, 18212 0, 18213 _bcmFieldSliceSelDisable, 0, 18214 0, 32, 18215 32, 0); 18216 if (soc_feature(unit, soc_feature_CnTag)) { 18217 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyCnTag, 18218 0, 18219 _bcmFieldSliceSelDisable, 0, 18220 0, 32, 18221 32, 0); 18222 } 18223 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRangeCheckGroup, 18224 0, 18225 _bcmFieldSliceSelDisable, 0, 18226 0, 8, 18227 8, 0); 18228 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFabricQueueTag, 18229 0, 18230 _bcmFieldSliceSelDisable, 0, 18231 0, 32, 18232 32, 0); 18233 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyBfdYourDiscriminator, 18234 0, 18235 _bcmFieldSliceSelDisable, 0, 18236 0, 32, 18237 32, 0); 18238 18239 /* Class Qualifiers */ 18240 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFcoeRxID, 18241 0, 18242 _bcmFieldSliceSelDisable, 0, 18243 0, 16, 18244 16, 0); 18245 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFcoeOxID, 18246 0, 18247 _bcmFieldSliceSelDisable, 0, 18248 0, 16, 18249 16, 0); 18250 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL4DstPortClass, 18251 0, 18252 _bcmFieldSliceSelDisable, 0, 18253 0, 4, 18254 4, 0); 18255 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFcoeRxIDClass, 18256 0, 18257 _bcmFieldSliceSelDisable, 0, 18258 0, 4, 18259 4, 0); 18260 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL4SrcPortClass, 18261 0, 18262 _bcmFieldSliceSelDisable, 0, 18263 0, 4, 18264 4, 0); 18265 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFcoeOxIDClass, 18266 0, 18267 _bcmFieldSliceSelDisable, 0, 18268 0, 4, 18269 4, 0); 18270 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyEtherTypeClass, 18271 0, 18272 _bcmFieldSliceSelDisable, 0, 18273 0, 4, 18274 4, 0); 18275 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpProtocolClass, 18276 0, 18277 _bcmFieldSliceSelDisable, 0, 18278 0, 4, 18279 4, 0); 18280 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIpClassMsbNibble, 18281 0, 18282 _bcmFieldSliceSelDisable, 0, 18283 0, 4, 18284 4, 0); 18285 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6ClassMsbNibble, 18286 0, 18287 _bcmFieldSliceSelDisable, 0, 18288 0, 4, 18289 4, 0); 18290 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanSrcIdClassMsbNibble, 18291 0, 18292 _bcmFieldSliceSelDisable, 0, 18293 0, 4, 18294 4, 0); 18295 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIpClassMsbNibble, 18296 0, 18297 _bcmFieldSliceSelDisable, 0, 18298 0, 4, 18299 4, 0); 18300 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6ClassMsbNibble, 18301 0, 18302 _bcmFieldSliceSelDisable, 0, 18303 0, 4, 18304 4, 0); 18305 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanDstIdClassMsbNibble, 18306 0, 18307 _bcmFieldSliceSelDisable, 0, 18308 0, 4, 18309 4, 0); 18310 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIpClassLower, 18311 0, 18312 _bcmFieldSliceSelDisable, 0, 18313 0, 16, 18314 16, 0); 18315 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6ClassLower, 18316 0, 18317 _bcmFieldSliceSelDisable, 0, 18318 0, 16, 18319 16, 0); 18320 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanDstIdClassLower, 18321 0, 18322 _bcmFieldSliceSelDisable, 0, 18323 0, 16, 18324 16, 0); 18325 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIpClassUpper, 18326 0, 18327 _bcmFieldSliceSelDisable, 0, 18328 0, 16, 18329 16, 0); 18330 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6ClassUpper, 18331 0, 18332 _bcmFieldSliceSelDisable, 0, 18333 0, 16, 18334 16, 0); 18335 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanDstIdClassUpper, 18336 0, 18337 _bcmFieldSliceSelDisable, 0, 18338 0, 16, 18339 16, 0); 18340 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIpClassLower, 18341 0, 18342 _bcmFieldSliceSelDisable, 0, 18343 0, 16, 18344 16, 0); 18345 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6ClassLower, 18346 0, 18347 _bcmFieldSliceSelDisable, 0, 18348 0, 16, 18349 16, 0); 18350 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanSrcIdClassLower, 18351 0, 18352 _bcmFieldSliceSelDisable, 0, 18353 0, 16, 18354 16, 0); 18355 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIpClassUpper, 18356 0, 18357 _bcmFieldSliceSelDisable, 0, 18358 0, 16, 18359 16, 0); 18360 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6ClassUpper, 18361 0, 18362 _bcmFieldSliceSelDisable, 0, 18363 0, 16, 18364 16, 0); 18365 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanSrcIdClassUpper, 18366 0, 18367 _bcmFieldSliceSelDisable, 0, 18368 0, 16, 18369 16, 0); 18370 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIpClass, 18371 0, 18372 _bcmFieldSliceSelDisable, 0, 18373 0, 36, 18374 36, 0); 18375 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6Class, 18376 0, 18377 _bcmFieldSliceSelDisable, 0, 18378 0, 36, 18379 36, 0); 18380 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanSrcIdClass, 18381 0, 18382 _bcmFieldSliceSelDisable, 0, 18383 0, 36, 18384 36, 0); 18385 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIpClass, 18386 0, 18387 _bcmFieldSliceSelDisable, 0, 18388 0, 36, 18389 36, 0); 18390 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6Class, 18391 0, 18392 _bcmFieldSliceSelDisable, 0, 18393 0, 36, 18394 36, 0); 18395 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanDstIdClass, 18396 0, 18397 _bcmFieldSliceSelDisable, 0, 18398 0, 36, 18399 36, 0); 18400 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTcpClassZero, 18401 0, 18402 _bcmFieldSliceSelDisable, 0, 18403 0, 8, 18404 8, 0); 18405 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTosClassZero, 18406 0, 18407 _bcmFieldSliceSelDisable, 0, 18408 0, 8, 18409 8, 0); 18410 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTtlClassZero, 18411 0, 18412 _bcmFieldSliceSelDisable, 0, 18413 0, 8, 18414 8, 0); 18415 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTcpClassOne, 18416 0, 18417 _bcmFieldSliceSelDisable, 0, 18418 0, 8, 18419 8, 0); 18420 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTosClassOne, 18421 0, 18422 _bcmFieldSliceSelDisable, 0, 18423 0, 8, 18424 8, 0); 18425 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTtlClassOne, 18426 0, 18427 _bcmFieldSliceSelDisable, 0, 18428 0, 8, 18429 8, 0); 18430 18431 /* UDF1 and UDF2 qualifiers. */ 18432 18433 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData0, 18434 0, 18435 _bcmFieldSliceSelDisable, 0, 18436 0, 16, 18437 16, 0); 18438 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData1, 18439 0, 18440 _bcmFieldSliceSelDisable, 0, 18441 0, 16, 18442 16, 0); 18443 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData2, 18444 0, 18445 _bcmFieldSliceSelDisable, 0, 18446 0, 16, 18447 16, 0); 18448 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData3, 18449 0, 18450 _bcmFieldSliceSelDisable, 0, 18451 0, 16, 18452 16, 0); 18453 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData4, 18454 0, 18455 _bcmFieldSliceSelDisable, 0, 18456 0, 16, 18457 16, 0); 18458 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData5, 18459 0, 18460 _bcmFieldSliceSelDisable, 0, 18461 0, 16, 18462 16, 0); 18463 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData6, 18464 0, 18465 _bcmFieldSliceSelDisable, 0, 18466 0, 16, 18467 16, 0); 18468 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData7, 18469 0, 18470 _bcmFieldSliceSelDisable, 0, 18471 0, 16, 18472 16, 0); 18473 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData8, 18474 0, 18475 _bcmFieldSliceSelDisable, 0, 18476 0, 16, 18477 16, 0); 18478 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData9, 18479 0, 18480 _bcmFieldSliceSelDisable, 0, 18481 0, 16, 18482 16, 0); 18483 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData10, 18484 0, 18485 _bcmFieldSliceSelDisable, 0, 18486 0, 16, 18487 16, 0); 18488 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData11, 18489 0, 18490 _bcmFieldSliceSelDisable, 0, 18491 0, 16, 18492 16, 0); 18493 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData12, 18494 0, 18495 _bcmFieldSliceSelDisable, 0, 18496 0, 16, 18497 16, 0); 18498 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData13, 18499 0, 18500 _bcmFieldSliceSelDisable, 0, 18501 0, 16, 18502 16, 0); 18503 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData14, 18504 0, 18505 _bcmFieldSliceSelDisable, 0, 18506 0, 16, 18507 16, 0); 18508 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData15, 18509 0, 18510 _bcmFieldSliceSelDisable, 0, 18511 0, 16, 18512 16, 0); 18513 18514 /* FCoE qualifiers */ 18515 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 18516 bcmFieldQualifyFibreChanSrcId, 18517 0, 18518 _bcmFieldSliceSelDisable, 0, 18519 0, 24, 18520 24, 0); 18521 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 18522 bcmFieldQualifyFibreChanFCtl, 18523 0, 18524 _bcmFieldSliceSelDisable, 0, 18525 0, 24, 18526 24, 0); 18527 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFcoeSOF, 18528 0, 18529 _bcmFieldSliceSelDisable, 0, 18530 0, 8, 18531 8, 0); 18532 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 18533 bcmFieldQualifyFibreChanDstId, 18534 0, 18535 _bcmFieldSliceSelDisable, 0, 18536 0, 24, 18537 24, 0); 18538 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanRCtl, 18539 0, 18540 _bcmFieldSliceSelDisable, 0, 18541 0, 8, 18542 8, 0); 18543 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanCSCtl, 18544 0, 18545 _bcmFieldSliceSelDisable, 0, 18546 0, 8, 18547 8, 0); 18548 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanVFTHopCount, 18549 0, 18550 _bcmFieldSliceSelDisable, 0, 18551 0, 8, 18552 8, 0); 18553 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 18554 bcmFieldQualifyFibreChanVFTPri, 18555 0, 18556 _bcmFieldSliceSelDisable, 0, 18557 0, 3, 18558 3, 0); 18559 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanVFTFabricId, 18560 0, 18561 _bcmFieldSliceSelDisable, 0, 18562 0, 12, 18563 12, 0); 18564 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanType, 18565 0, 18566 _bcmFieldSliceSelDisable, 0, 18567 0, 8, 18568 8, 0); 18569 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanDFCtl, 18570 0, 18571 _bcmFieldSliceSelDisable, 0, 18572 0, 8, 18573 8, 0); 18574 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanOuter, 18575 0, 18576 _bcmFieldSliceSelDisable, 0, 18577 0, 3, 18578 3, 0); 18579 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 18580 bcmFieldQualifyFibreChanInner, 18581 0, 18582 _bcmFieldSliceSelDisable, 0, 18583 0, 3, 18584 3, 0); 18585 18586 #if defined(BCM_TOMAHAWK3_SUPPORT) 18587 if (soc_feature(unit, soc_feature_th3_style_fp)) { 18588 /* Exact Match Chaining Qualifier */ 18589 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 18590 _bcmFieldQualifyExactMatchGroupClassIdLookup0, 18591 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 18592 _bcmFieldSliceSelDisable, 0, 18593 0, 4, 18594 4, 0); 18595 } else 18596 #endif 18597 { 18598 /* Exact Match Chaining Qualifier */ 18599 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 18600 _bcmFieldQualifyExactMatchGroupClassIdLookup0, 18601 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 18602 _bcmFieldSliceSelDisable, 0, 18603 0, 5, 18604 5, 0); 18605 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, 18606 _bcmFieldQualifyExactMatchGroupClassIdLookup1, 18607 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT, 18608 _bcmFieldSliceSelDisable, 0, 18609 0, 5, 18610 5, 0); 18611 } 18612 18613 /* Preselector Logical Table ID Qualifier */ 18614 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyPreLogicalTableId, 18615 0, 18616 _bcmFieldSliceSelDisable, 0, 18617 0, 5, 18618 5, 0); 18619 if (soc_feature(unit, soc_feature_fp_ltid_match_all_parts) && 18620 (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS)) { 18621 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyPreLogicalTableId1, 18622 0, 18623 _bcmFieldSliceSelDisable, 0, 18624 0, 5, 18625 5, 0); 18626 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyPreLogicalTableId2, 18627 0, 18628 _bcmFieldSliceSelDisable, 0, 18629 0, 5, 18630 5, 0); 18631 } 18632 #if defined (BCM_TRIDENT3_SUPPORT) 18633 if (soc_feature(unit, soc_feature_td3_style_fp)) { 18634 /* PARSER_1_FLEX_HVE_CHECK_RESULT_15_0 (49) */ 18635 /* BIT 0 */ 18636 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpFragPkt, 18637 0, 18638 _bcmFieldSliceSelDisable, 0, 18639 0, 1, 18640 1, 0); 18641 /* BIT 1 */ 18642 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterPriTaggedPkt, 18643 0, 18644 _bcmFieldSliceSelDisable, 0, 18645 0, 1, 18646 1, 0); 18647 /* BIT 2 */ 18648 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpInIpPkt, 18649 0, 18650 _bcmFieldSliceSelDisable, 0, 18651 0, 1, 18652 1, 0); 18653 /* BIT 3 */ 18654 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGenevePktWithOam, 18655 0, 18656 _bcmFieldSliceSelDisable, 0, 18657 0, 1, 18658 1, 0); 18659 /* BIT 3 */ 18660 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGpePktWithOam, 18661 0, 18662 _bcmFieldSliceSelDisable, 0, 18663 0, 1, 18664 1, 0); 18665 /* BIT 11 */ 18666 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPktVersionOne, 18667 0, 18668 _bcmFieldSliceSelDisable, 0, 18669 0, 1, 18670 1, 0); 18671 /* BIT 12 */ 18672 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPktOverflowed, 18673 0, 18674 _bcmFieldSliceSelDisable, 0, 18675 0, 1, 18676 1, 0); 18677 /* BIT 13 */ 18678 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPktFinalHop, 18679 0, 18680 _bcmFieldSliceSelDisable, 0, 18681 0, 1, 18682 1, 0); 18683 /* BIT 14 */ 18684 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPktLengthValid, 18685 0, 18686 _bcmFieldSliceSelDisable, 0, 18687 0, 1, 18688 1, 0); 18689 /* BIT 14 */ 18690 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyBfdPktVersionOne, 18691 0, 18692 _bcmFieldSliceSelDisable, 0, 18693 0, 1, 18694 1, 0); 18695 /* BIT 14 */ 18696 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGenevePktVersionZero, 18697 0, 18698 _bcmFieldSliceSelDisable, 0, 18699 0, 1, 18700 1, 0); 18701 /* BIT 14 */ 18702 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGpePktVersionZero, 18703 0, 18704 _bcmFieldSliceSelDisable, 0, 18705 0, 1, 18706 1, 0); 18707 /* BIT 15 */ 18708 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPktType, 18709 0, 18710 _bcmFieldSliceSelDisable, 0, 18711 0, 1, 18712 1, 0); 18713 18714 18715 /* PARSER_1_FLEX_HVE_CHECK_RESULT_15_0 (48) */ 18716 /* BIT 0 */ 18717 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpmcV4Pkt, 18718 0, 18719 _bcmFieldSliceSelDisable, 0, 18720 0, 1, 18721 1, 0); 18722 /* BIT 1 */ 18723 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpmcV6Pkt, 18724 0, 18725 _bcmFieldSliceSelDisable, 0, 18726 0, 1, 18727 1, 0); 18728 /* BIT 2 */ 18729 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpChecksumOkPkt, 18730 0, 18731 _bcmFieldSliceSelDisable, 0, 18732 0, 1, 18733 1, 0); 18734 /* BIT 3 */ 18735 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNetworkTagMulticastPkt, 18736 0, 18737 _bcmFieldSliceSelDisable, 0, 18738 0, 1, 18739 1, 0); 18740 /* BIT 4 */ 18741 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpTtlZeroPkt, 18742 0, 18743 _bcmFieldSliceSelDisable, 0, 18744 0, 1, 18745 1, 0); 18746 /* BIT 14 */ 18747 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerBfdPktVersionOne, 18748 0, 18749 _bcmFieldSliceSelDisable, 0, 18750 0, 1, 18751 1, 0); 18752 /* OPAQUE_1 (42) + (8 MSB bits of) OPAQUE_2 (43)*/ 18753 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNshServicePathId, 18754 0, 18755 _bcmFieldSliceSelDisable, 0, 18756 0, 24, 18757 24, 0); 18758 /* OPAQUE_2 (43 - 8 LSB Bits) */ 18759 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNshServiceIndex, 18760 0, 18761 _bcmFieldSliceSelDisable, 0, 18762 0, 8, 18763 8, 0); 18764 /* FCOE_VSAN_ID (40) */ 18765 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanVFTVsanId, 18766 0, 18767 _bcmFieldSliceSelDisable, 0, 18768 0, 16, 18769 16, 0); 18770 18771 /* PKT_FLOW_ID_0 (39) - 624 */ 18772 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFrontPanelPkt, 18773 0, 18774 _bcmFieldSliceSelDisable, 0, 18775 0, 8, 18776 8, 0); 18777 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyHiGigProxyTunnelType, 18778 0, 18779 _bcmFieldSliceSelDisable, 0, 18780 0, 8, 18781 8, 0); 18782 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyLoopbackType, 18783 0, 18784 _bcmFieldSliceSelDisable, 0, 18785 0, 8, 18786 8, 0); 18787 /* PKT_FLOW_ID_1 (38) - 608 */ 18788 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTunnelType, 18789 0, 18790 _bcmFieldSliceSelDisable, 0, 18791 0, 4, 18792 4, 0); 18793 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTunnelSubType, 18794 0, 18795 _bcmFieldSliceSelDisable, 0, 18796 0, 6, 18797 6, 0); 18798 /* PKT_FLOW_ID_2 (37) - */ 18799 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTunnelTerminated, 18800 0, 18801 _bcmFieldSliceSelDisable, 0, 18802 0, 1, 18803 1, 0); 18804 /* ZONE_0_MATCH_ID (36) - 576 */ 18805 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySysHdrType, 18806 0, 18807 _bcmFieldSliceSelDisable, 0, 18808 0, 4, 18809 4, 0); 18810 if (soc_feature(unit, soc_feature_hgproxy_subtag_coe)) { 18811 /* ZONE_1_MATCH_ID (35) - 560 */ 18812 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySubportTagPresent, 18813 0, 18814 _bcmFieldSliceSelDisable, 0, 18815 0, 1, 18816 1, 0); 18817 } 18818 18819 #if defined(BCM_HELIX5_SUPPORT) 18820 if (SOC_IS_HELIX5(unit)) { 18821 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGbpPresent, 18822 0, 18823 _bcmFieldSliceSelDisable, 0, 18824 0, 1, 18825 1, 0); 18826 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyHiGigGbpPresent, 18827 0, 18828 _bcmFieldSliceSelDisable, 0, 18829 0, 1, 18830 1, 0); 18831 } 18832 #endif /* BCM_HELIX5_SUPPORT */ 18833 if (soc_feature(unit, soc_feature_td3_style_fp)) { 18834 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySysHdrLocalDstport, 18835 0, 18836 _bcmFieldSliceSelDisable, 0, 18837 0, 8, 18838 8, 0); 18839 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTimeStampTxPktType, 18840 0, 18841 _bcmFieldSliceSelDisable, 0, 18842 0, 16, 18843 16, 0); 18844 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVxlanGbpPresent, 18845 0, 18846 _bcmFieldSliceSelDisable, 0, 18847 0, 1, 18848 1, 0); 18849 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyHiGigGbpSrcId, 18850 0, 18851 _bcmFieldSliceSelDisable, 0, 18852 0, 12, 18853 12, 0); 18854 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGbpSrcId, 18855 0, 18856 _bcmFieldSliceSelDisable, 0, 18857 0, 16, 18858 16, 0); 18859 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGbpDstId, 18860 0, 18861 _bcmFieldSliceSelDisable, 0, 18862 0, 16, 18863 16, 0); 18864 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyLoopbackSubtype, 18865 0, 18866 _bcmFieldSliceSelDisable, 0, 18867 0, 8, 18868 8, 0); 18869 } 18870 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNetworkTagType, 18871 0, 18872 _bcmFieldSliceSelDisable, 0, 18873 0, 2, 18874 2, 0); 18875 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVlanFormat, 18876 0, 18877 _bcmFieldSliceSelDisable, 0, 18878 0, 2, 18879 2, 0); 18880 if (soc_feature(unit, soc_feature_CnTag)) { 18881 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyCnTagPresent, 18882 0, 18883 _bcmFieldSliceSelDisable, 0, 18884 0, 1, 18885 1, 0); 18886 } 18887 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2PktType, 18888 0, 18889 _bcmFieldSliceSelDisable, 0, 18890 0, 2, 18891 2, 0); 18892 18893 /* ZONE_2_MATCH_ID (34) - 544 */ 18894 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyPktType, 18895 0, 18896 _bcmFieldSliceSelDisable, 0, 18897 0, 8, 18898 8, 0); 18899 /* 18900 * bcmFieldQualifyMplsCwPresent bit is overlapping with MSB bit (7th bit) of 18901 * bcmFieldQualifyPktType. This qualifier should be used only if PktType qualifier 18902 * has MPLS types. 18903 */ 18904 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsCwPresent, 18905 0, 18906 _bcmFieldSliceSelDisable, 0, 18907 0, 1, 18908 1, 0); 18909 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsMcastEthertypePresent, 18910 0, 18911 _bcmFieldSliceSelDisable, 0, 18912 0, 1, 18913 1, 0); 18914 /* Ipv4OptionHdrType should be used only if PktType qualifier has IPv4 types. */ 18915 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpv4OptionHdrType, 18916 0, 18917 _bcmFieldSliceSelDisable, 0, 18918 0, 3, 18919 3, 0); 18920 /* Ipv6ExtensionHdrType should be used only if PktType qualifier has IPv6 types. */ 18921 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpv6ExtensionHdrType, 18922 0, 18923 _bcmFieldSliceSelDisable, 0, 18924 0, 4, 18925 4, 0); 18926 /* ZONE_3_MATCH_ID (33) - 528 */ 18927 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOverlayVlanFormat, 18928 0, 18929 _bcmFieldSliceSelDisable, 0, 18930 0, 2, 18931 2, 0); 18932 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOverlayL2PktType, 18933 0, 18934 _bcmFieldSliceSelDisable, 0, 18935 0, 2, 18936 2, 0); 18937 /* ZONE_4_MATCH_ID (32) - 512 */ 18938 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOverlayPktType, 18939 0, 18940 _bcmFieldSliceSelDisable, 0, 18941 0, 8, 18942 8, 0); 18943 /* Ipv4OptionHdrType should be used only if PktType qualifier has IPv4 types. */ 18944 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOverlayIpv4OptionHdrType, 18945 0, 18946 _bcmFieldSliceSelDisable, 0, 18947 0, 3, 18948 3, 0); 18949 /* Ipv6ExtensionHdrType should be used only if PktType qualifier has IPv6 types. */ 18950 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOverlayIpv6ExtensionHdrType, 18951 0, 18952 _bcmFieldSliceSelDisable, 0, 18953 0, 4, 18954 4, 0); 18955 18956 18957 /* 2 BIT Section */ 18958 /* L3_TYPE_1 - 1st Bit */ 18959 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyPimBidirDfStatus, 18960 0, 18961 _bcmFieldSliceSelDisable, 0, 18962 0, 1, 18963 1, 0); 18964 /* CW_VALID_PROTECTION_DROP - 1st Bit */ 18965 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRecoverableDrop, 18966 0, 18967 _bcmFieldSliceSelDisable, 0, 18968 0, 1, 18969 1, 0); 18970 /* 4 BIT Section */ 18971 /* LOOKUP_STATUS_VECTOR_4 - 19th Bit */ 18972 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpmcStarGroupHit, 18973 0, 18974 _bcmFieldSliceSelDisable, 0, 18975 0, 1, 18976 1, 0); 18977 /* LOOKUP_STATUS_VECTOR_5 - 23rd Bit */ 18978 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3SrcRouteHit, 18979 0, 18980 _bcmFieldSliceSelDisable, 0, 18981 0, 1, 18982 1, 0); 18983 18984 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyBfdGoodPkt, 18985 0, 18986 _bcmFieldSliceSelDisable, 0, 18987 0, 1, 18988 1, 0); 18989 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyBfdPktWithDstIpLoopbackAddr, 18990 0, 18991 _bcmFieldSliceSelDisable, 0, 18992 0, 1, 18993 1, 0); 18994 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsControlPkt, 18995 0, 18996 _bcmFieldSliceSelDisable, 0, 18997 0, 1, 18998 1, 0); 18999 /* OPAQUE_3 */ 19000 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyInPorts_1, 19001 0, 19002 _bcmFieldSliceSelDisable, 0, 19003 0, 16, 19004 16, 0); 19005 /* OPAQUE_4 */ 19006 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyInPorts_2, 19007 0, 19008 _bcmFieldSliceSelDisable, 0, 19009 0, 16, 19010 16, 0); 19011 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpIdentifier, 19012 0, 19013 _bcmFieldSliceSelDisable, 0, 19014 0, 16, 19015 16, 0); 19016 /* UDF Chunks */ 19017 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyINTProbeMarker1, 19018 0, 19019 _bcmFieldSliceSelDisable, 0, 19020 0, 32, 19021 32, 0); 19022 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyINTProbeMarker2, 19023 0, 19024 _bcmFieldSliceSelDisable, 0, 19025 0, 32, 19026 32, 0); 19027 _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyINTReserved4Bytes, 19028 0, 19029 _bcmFieldSliceSelDisable, 0, 19030 0, 32, 19031 32, 0); 19032 } 19033 #endif /* BCM_TRIDENT3_SUPPORT */ 19034 return (BCM_E_NONE); 19035 } 19036 19037 /* 19038 * Function: 19039 * _field_th_qualifiers_init 19040 * Purpose: 19041 * Initialize device qaualifiers select codes & offsets 19042 * Parameters: 19043 * unit - (IN) BCM device number. 19044 * stage_fc - (IN/OUT) Field Processor stage control structure. 19045 * 19046 * Returns: 19047 * BCM_E_PARAM - Null field stage control structure. 19048 * BCM_E_MEMORY - Allocation failure. 19049 * BCM_E_INTERNAL - Invalid CAP Stage ID. 19050 * BCM_E_NONE - Success. 19051 */ 19052 STATIC int 19053 _field_th_qualifiers_init(int unit, _field_stage_t *stage_fc) 19054 { 19055 /* Input parameters check. */ 19056 if (NULL == stage_fc) { 19057 return (BCM_E_PARAM); 19058 } 19059 19060 /* Initialize the stage's qualifier information. */ 19061 switch (stage_fc->stage_id) { 19062 case _BCM_FIELD_STAGE_INGRESS: 19063 case _BCM_FIELD_STAGE_EXACTMATCH: 19064 return (_field_th_common_qualifiers_init(unit, stage_fc)); 19065 case _BCM_FIELD_STAGE_LOOKUP: 19066 return (_field_th_lookup_qualifiers_init(unit, stage_fc)); 19067 case _BCM_FIELD_STAGE_EGRESS: 19068 #if defined(BCM_TRIDENT3_SUPPORT) 19069 if (soc_feature(unit, soc_feature_td3_style_fp)) { 19070 return (_field_td3_egress_qualifiers_init(unit, stage_fc)); 19071 } else 19072 #endif 19073 { 19074 return (_field_th_egress_qualifiers_init(unit, stage_fc)); 19075 } 19076 case _BCM_FIELD_STAGE_CLASS: 19077 case _BCM_FIELD_STAGE_FLOWTRACKER: 19078 return BCM_E_NONE; 19079 default: 19080 break; 19081 } 19082 19083 return (BCM_E_INTERNAL); 19084 } 19085 19086 /* 19087 * Function: 19088 * _bcm_field_th_egress_key_match_type_set 19089 * 19090 * Purpose: 19091 * Set key match type based on entry group. 19092 * NOTE: For double wide entries key type must be the same for 19093 * both parts of the entry. 19094 * Parameters: 19095 * unit - (IN) BCM device number 19096 * f_ent - (IN) Slice number to enable 19097 * Returns: 19098 * BCM_E_XXX 19099 */ 19100 int 19101 _bcm_field_th_egress_key_match_type_set (int unit, _field_entry_t *f_ent) 19102 { 19103 _field_group_t *fg; /* Field group entry belongs to. */ 19104 uint32 data; /* Key match type. */ 19105 uint32 default_data; /* default key match type. */ 19106 uint32 mask; /* Key match type mask. */ 19107 int rv; /* Operation return status. */ 19108 19109 /* Key match type offset. */ 19110 _bcm_field_qual_offset_t q_offset; 19111 { 19112 sal_memset(&q_offset, 0, sizeof(q_offset)); 19113 q_offset.field = KEYf; 19114 q_offset.num_offsets = 1; 19115 if (!soc_feature(unit, soc_feature_td3_style_fp)) { 19116 q_offset.offset[0] = 236; 19117 } else { 19118 q_offset.offset[0] = 268; 19119 } 19120 q_offset.width[0] = 4; 19121 } 19122 19123 /* Input parameters check. */ 19124 if (NULL == f_ent) { 19125 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 19126 return (BCM_E_PARAM); 19127 } 19128 if (NULL == (fg = f_ent->group)) { 19129 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 19130 return (BCM_E_PARAM); 19131 } 19132 19133 if (fg->flags & _FP_GROUP_SPAN_SINGLE_SLICE) { 19134 switch (fg->sel_codes[0].fpf3) { 19135 case _BCM_FIELD_EFP_KEY1: 19136 data = KEY_TYPE_IPv4_SINGLE; 19137 default_data = KEY_TYPE_L2_SINGLE; 19138 break; 19139 case _BCM_FIELD_EFP_KEY2: 19140 data = KEY_TYPE_IPv6_SINGLE; 19141 default_data = KEY_TYPE_L2_SINGLE; 19142 break; 19143 case _BCM_FIELD_EFP_KEY4: 19144 data = KEY_TYPE_L2_SINGLE; 19145 default_data = KEY_TYPE_L2_SINGLE; 19146 break; 19147 #if defined(BCM_TRIDENT3_SUPPORT) 19148 case _BCM_FIELD_EFP_KEY5: 19149 data = KEY_TYPE_FCOE_SINGLE; 19150 default_data = KEY_TYPE_L2_SINGLE; 19151 break; 19152 #endif /* BCM_TRIDENT3_SUPPORT */ 19153 default: 19154 return (BCM_E_INTERNAL); 19155 } 19156 } else { 19157 switch (fg->sel_codes[1].fpf3) { 19158 case _BCM_FIELD_EFP_KEY2: 19159 data = KEY_TYPE_IPv6_DOUBLE; 19160 default_data = KEY_TYPE_L2_DOUBLE; 19161 break; 19162 case _BCM_FIELD_EFP_KEY4: 19163 if (_BCM_FIELD_EFP_KEY1 == fg->sel_codes[0].fpf3) { 19164 if (BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyIp4)){ 19165 default_data = KEY_TYPE_L2_DOUBLE; 19166 } else { 19167 default_data = KEY_TYPE_IPv4_L2_L3_DOUBLE; 19168 } 19169 data = KEY_TYPE_IPv4_L2_L3_DOUBLE; 19170 } else if (_BCM_FIELD_EFP_KEY2 == fg->sel_codes[0].fpf3) { 19171 data = KEY_TYPE_IPv4_IPv6_DOUBLE; 19172 default_data = KEY_TYPE_L2_DOUBLE; 19173 } else if (_BCM_FIELD_EFP_KEY6 == fg->sel_codes[0].fpf3) { 19174 data = KEY_TYPE_HIGIG_DOUBLE; 19175 default_data = KEY_TYPE_IPv4_L2_L3_DOUBLE; 19176 } else if (_BCM_FIELD_EFP_KEY7 == fg->sel_codes[0].fpf3) { 19177 data = KEY_TYPE_LOOPBACK_DOUBLE; 19178 default_data = KEY_TYPE_IPv4_L2_L3_DOUBLE; 19179 } else if (_BCM_FIELD_EFP_KEY8 == fg->sel_codes[0].fpf3) { 19180 data = KEY_TYPE_L2_DOUBLE; 19181 default_data = KEY_TYPE_L2_DOUBLE; 19182 } else if (_BCM_FIELD_EFP_KEY5 == fg->sel_codes[0].fpf3) { 19183 data = KEY_TYPE_FCOE_DOUBLE; 19184 default_data = KEY_TYPE_IPv4_L2_L3_DOUBLE; 19185 } 19186 break; 19187 default: 19188 return (BCM_E_INTERNAL); 19189 } 19190 } 19191 19192 mask = 0xf; 19193 19194 /* 19195 * COVERITY 19196 * 19197 *This flow takes care of the Out-of-bounds access issue 19198 * for data and mask. 19199 */ 19200 /* coverity[callee_ptr_arith : FALSE] */ 19201 rv = _bcm_field_qual_value_set_by_entry_type(unit, &q_offset, f_ent, 19202 &data, &mask, 19203 _FP_ENTRY_TYPE_0); 19204 BCM_IF_ERROR_RETURN(rv); 19205 19206 /* 19207 * COVERITY 19208 * 19209 * This flow takes care of the Out-of-bounds access issue 19210 * for data and mask. 19211 */ 19212 19213 /* coverity[callee_ptr_arith : FALSE] */ 19214 19215 rv = _bcm_field_qual_value_set_by_entry_type(unit, &q_offset, f_ent, 19216 &default_data, &mask, 19217 _FP_ENTRY_TYPE_1); 19218 BCM_IF_ERROR_RETURN(rv); 19219 19220 return rv; 19221 } 19222 19223 /* 19224 * Function: 19225 * _bcm_field_th_egress_selcode_get 19226 * Purpose: 19227 * Finds a select encodings that will satisfy the 19228 * requested qualifier set (Qset). 19229 * Parameters: 19230 * unit - (IN) BCM unit number. 19231 * stage_fc - (IN) Stage Field control structure. 19232 * qset_req - (IN) Client qualifier set. 19233 * fg - (IN/OUT)Select code information filled into the group. 19234 * 19235 * Returns: 19236 * BCM_E_XXX 19237 */ 19238 int 19239 _bcm_field_th_egress_selcode_get(int unit, _field_stage_t *stage_fc, 19240 bcm_field_qset_t *qset_req, 19241 _field_group_t *fg) 19242 { 19243 int rv; /* Operation return status. */ 19244 bcm_field_qset_t new_qset; 19245 19246 /* Input parameters check. */ 19247 if ((NULL == fg) || (NULL == qset_req) || (NULL == stage_fc)) { 19248 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 19249 return (BCM_E_PARAM); 19250 } 19251 19252 if (fg->flags & _FP_GROUP_SPAN_SINGLE_SLICE) { 19253 /* Attempt _BCM_FIELD_EFP_KEY4 (L2 key). */ 19254 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19255 _BCM_FIELD_EFP_KEY4, 0, fg); 19256 if (BCM_SUCCESS(rv)) { 19257 19258 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19259 _BCM_FIELD_EFP_KEY4, -1, &new_qset, fg); 19260 BCM_IF_ERROR_RETURN(rv); 19261 19262 /* In EFP, for a given qset we can have two selector code 19263 combination. So attempt _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19264 19265 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19266 &new_qset, 19267 _BCM_FIELD_EFP_KEY4, 19268 0, fg); 19269 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19270 (rv != BCM_E_RESOURCE))) { 19271 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY4; 19272 return rv; 19273 } 19274 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19275 return rv; 19276 } 19277 19278 /* Attempt _BCM_FIELD_EFP_KEY1 (IPv4 key). */ 19279 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19280 _BCM_FIELD_EFP_KEY1, 0, fg); 19281 19282 if (BCM_SUCCESS(rv)) { 19283 19284 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19285 _BCM_FIELD_EFP_KEY4, -1, &new_qset, fg); 19286 BCM_IF_ERROR_RETURN(rv); 19287 19288 19289 /* In EFP, for a given qset we can have two selector code 19290 combination. So attempt _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19291 19292 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19293 &new_qset, 19294 _BCM_FIELD_EFP_KEY4, 19295 0, fg); 19296 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19297 (rv != BCM_E_RESOURCE))) { 19298 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY1; 19299 return rv; 19300 } 19301 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19302 return rv; 19303 } 19304 19305 /* Attempt _BCM_FIELD_EFP_KEY2 (IPv6 key). */ 19306 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19307 _BCM_FIELD_EFP_KEY2, 0, fg); 19308 if (BCM_SUCCESS(rv)) { 19309 19310 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19311 _BCM_FIELD_EFP_KEY4, -1, &new_qset, fg); 19312 BCM_IF_ERROR_RETURN(rv); 19313 19314 19315 /* In EFP, for a given qset we can have two selector code 19316 combination. So attempt _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19317 19318 19319 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19320 &new_qset, 19321 _BCM_FIELD_EFP_KEY4, 19322 0, fg); 19323 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19324 (rv != BCM_E_RESOURCE))) { 19325 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY2; 19326 return rv; 19327 } 19328 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19329 return rv; 19330 } 19331 19332 #if defined(BCM_TRIDENT3_SUPPORT) 19333 if (soc_feature(unit, soc_feature_td3_style_fp)) { 19334 /* Attempt _BCM_FIELD_EFP_KEY5 (FCOE key). */ 19335 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19336 _BCM_FIELD_EFP_KEY5, 0, fg); 19337 if (BCM_SUCCESS(rv)) { 19338 19339 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19340 _BCM_FIELD_EFP_KEY4, -1, &new_qset, fg); 19341 BCM_IF_ERROR_RETURN(rv); 19342 19343 19344 /* In EFP, for a given qset we can have two selector code 19345 * combination. So attempt _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19346 19347 19348 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19349 &new_qset, 19350 _BCM_FIELD_EFP_KEY4, 19351 0, fg); 19352 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19353 (rv != BCM_E_RESOURCE))) { 19354 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY5; 19355 return rv; 19356 } 19357 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19358 return rv; 19359 } 19360 } 19361 #endif 19362 } else { 19363 19364 if (BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyIp4)) { 19365 /* L3 + L2 double wide key for IPv4 packets */ 19366 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19367 _BCM_FIELD_EFP_KEY1, 19368 _BCM_FIELD_EFP_KEY4, fg); 19369 if (BCM_SUCCESS(rv)) { 19370 19371 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19372 _BCM_FIELD_EFP_KEY8, 19373 _BCM_FIELD_EFP_KEY4, 19374 &new_qset, fg); 19375 BCM_IF_ERROR_RETURN(rv); 19376 19377 19378 /* In EFP, for a given qset we can have two selector code 19379 combination. So attempt _BCM_FIELD_EFP_KEY8 and 19380 _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19381 19382 19383 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19384 &new_qset, 19385 _BCM_FIELD_EFP_KEY8, 19386 _BCM_FIELD_EFP_KEY4, 19387 fg); 19388 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19389 (rv != BCM_E_RESOURCE))) { 19390 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY1; 19391 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4; 19392 return rv; 19393 } 19394 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19395 return rv; 19396 } 19397 } 19398 19399 /* L2 + L3 double wide predefined key. */ 19400 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19401 _BCM_FIELD_EFP_KEY1, 19402 _BCM_FIELD_EFP_KEY4, fg); 19403 if (BCM_SUCCESS(rv)) { 19404 19405 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19406 _BCM_FIELD_EFP_KEY1, 19407 _BCM_FIELD_EFP_KEY4, 19408 &new_qset, fg); 19409 BCM_IF_ERROR_RETURN(rv); 19410 19411 19412 /* In EFP, for a given qset we can have two selector code 19413 combination. So attempt _BCM_FIELD_EFP_KEY1 and 19414 _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19415 19416 19417 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19418 &new_qset, 19419 _BCM_FIELD_EFP_KEY1, 19420 _BCM_FIELD_EFP_KEY4, 19421 fg); 19422 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19423 (rv != BCM_E_RESOURCE))) { 19424 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY1; 19425 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4; 19426 return rv; 19427 } 19428 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19429 return rv; 19430 } 19431 19432 /* HiGiG Doublewide key */ 19433 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19434 _BCM_FIELD_EFP_KEY6, 19435 _BCM_FIELD_EFP_KEY4, fg); 19436 if (BCM_SUCCESS(rv)) { 19437 19438 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19439 _BCM_FIELD_EFP_KEY1, 19440 _BCM_FIELD_EFP_KEY4, 19441 &new_qset, fg); 19442 BCM_IF_ERROR_RETURN(rv); 19443 19444 19445 /* In EFP, for a given qset we can have two selector code 19446 combination. So attempt _BCM_FIELD_EFP_KEY1 and 19447 _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19448 19449 19450 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19451 &new_qset, 19452 _BCM_FIELD_EFP_KEY1, 19453 _BCM_FIELD_EFP_KEY4, 19454 fg); 19455 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19456 (rv != BCM_E_RESOURCE))) { 19457 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY6; 19458 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4; 19459 return rv; 19460 } 19461 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19462 return rv; 19463 } 19464 19465 /* Loopback double wide key */ 19466 19467 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19468 _BCM_FIELD_EFP_KEY7, 19469 _BCM_FIELD_EFP_KEY4, fg); 19470 if (BCM_SUCCESS(rv)) { 19471 19472 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19473 _BCM_FIELD_EFP_KEY1, 19474 _BCM_FIELD_EFP_KEY4, 19475 &new_qset, fg); 19476 BCM_IF_ERROR_RETURN(rv); 19477 19478 19479 /* In EFP, for a given qset we can have two selector code 19480 combination. So attempt _BCM_FIELD_EFP_KEY1 and 19481 _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19482 19483 19484 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19485 &new_qset, 19486 _BCM_FIELD_EFP_KEY1, 19487 _BCM_FIELD_EFP_KEY4, 19488 fg); 19489 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19490 (rv != BCM_E_RESOURCE))) { 19491 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY7; 19492 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4; 19493 return rv; 19494 } 19495 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19496 return rv; 19497 } 19498 19499 /* L3 + L2 double wide key for IPv6 packets */ 19500 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19501 _BCM_FIELD_EFP_KEY2, 19502 _BCM_FIELD_EFP_KEY4, fg); 19503 if (BCM_SUCCESS(rv)) { 19504 19505 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19506 _BCM_FIELD_EFP_KEY8, 19507 _BCM_FIELD_EFP_KEY4, 19508 &new_qset, fg); 19509 BCM_IF_ERROR_RETURN(rv); 19510 19511 19512 /* In EFP, for a given qset we can have two selector code 19513 combination. So attempt _BCM_FIELD_EFP_KEY8 and 19514 _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19515 19516 19517 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19518 &new_qset, 19519 _BCM_FIELD_EFP_KEY8, 19520 _BCM_FIELD_EFP_KEY4, 19521 fg); 19522 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19523 (rv != BCM_E_RESOURCE))) { 19524 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY2; 19525 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4; 19526 return rv; 19527 } 19528 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19529 return rv; 19530 } 19531 19532 /* L3 key for IPv6 packets */ 19533 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19534 _BCM_FIELD_EFP_KEY3, 19535 _BCM_FIELD_EFP_KEY2, fg); 19536 if (BCM_SUCCESS(rv)) { 19537 19538 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19539 _BCM_FIELD_EFP_KEY8, 19540 _BCM_FIELD_EFP_KEY4, 19541 &new_qset, fg); 19542 BCM_IF_ERROR_RETURN(rv); 19543 19544 19545 /* In EFP, for a given qset we can have two selector code 19546 combination. So attempt _BCM_FIELD_EFP_KEY8 and 19547 _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19548 19549 19550 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19551 &new_qset, 19552 _BCM_FIELD_EFP_KEY8, 19553 _BCM_FIELD_EFP_KEY4, 19554 fg); 19555 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19556 (rv != BCM_E_RESOURCE))) { 19557 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY3; 19558 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY2; 19559 return rv; 19560 } 19561 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19562 return rv; 19563 } 19564 19565 /* Bytes after L2 Double key for non IP packets */ 19566 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19567 _BCM_FIELD_EFP_KEY8, 19568 _BCM_FIELD_EFP_KEY4, fg); 19569 if (BCM_SUCCESS(rv)) { 19570 19571 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19572 _BCM_FIELD_EFP_KEY8, 19573 _BCM_FIELD_EFP_KEY4, 19574 &new_qset, fg); 19575 BCM_IF_ERROR_RETURN(rv); 19576 19577 19578 /* In EFP, for a given qset we can have two selector code 19579 combination. So attempt _BCM_FIELD_EFP_KEY8 and 19580 _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19581 19582 19583 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19584 &new_qset, 19585 _BCM_FIELD_EFP_KEY8, 19586 _BCM_FIELD_EFP_KEY4, 19587 fg); 19588 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19589 (rv != BCM_E_RESOURCE))) { 19590 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY8; 19591 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4; 19592 return rv; 19593 } 19594 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19595 return rv; 19596 } 19597 19598 #if defined(BCM_TRIDENT3_SUPPORT) 19599 if (soc_feature(unit, soc_feature_td3_style_fp)) { 19600 /* FCOE double wide predefined key. */ 19601 rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req, 19602 _BCM_FIELD_EFP_KEY5, 19603 _BCM_FIELD_EFP_KEY4, fg); 19604 if (BCM_SUCCESS(rv)) { 19605 19606 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc, 19607 _BCM_FIELD_EFP_KEY1, 19608 _BCM_FIELD_EFP_KEY4, 19609 &new_qset, fg); 19610 BCM_IF_ERROR_RETURN(rv); 19611 19612 19613 /* In EFP, for a given qset we can have two selector code 19614 * combination. So attempt _BCM_FIELD_EFP_KEY1 and 19615 * _BCM_FIELD_EFP_KEY4 (Any Packet type) */ 19616 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc, 19617 &new_qset, 19618 _BCM_FIELD_EFP_KEY1, 19619 _BCM_FIELD_EFP_KEY4, 19620 fg); 19621 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) && 19622 (rv != BCM_E_RESOURCE))) { 19623 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY5; 19624 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4; 19625 return rv; 19626 } 19627 } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) { 19628 return rv; 19629 } 19630 } 19631 #endif 19632 } 19633 19634 return BCM_E_RESOURCE; 19635 } 19636 19637 /* 19638 * Function: 19639 * _bcm_field_th_selcode_get 19640 * Purpose: 19641 * Finds a 4-tuple of select encodings that will satisfy the 19642 * requested qualifier set (Qset). 19643 * Parameters: 19644 * unit - (IN) BCM unit number. 19645 * stage_fc - (IN) Stage Field control structure. 19646 * qset_req - (IN) Client qualifier set. 19647 * fg - (IN/OUT)Select code information filled into the group. 19648 * 19649 * Returns: 19650 * BCM_E_XXX 19651 */ 19652 int 19653 _bcm_field_th_selcode_get(int unit, _field_stage_t *stage_fc, 19654 bcm_field_qset_t *qset_req, 19655 _field_group_t *fg) 19656 { 19657 int rv; /* Operation return status. */ 19658 19659 /* Input parameters check. */ 19660 if ((NULL == fg) || (NULL == qset_req) || (NULL == stage_fc)) { 19661 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 19662 return (BCM_E_PARAM); 19663 } 19664 19665 /* Egress qualifiers are selected based on Key. */ 19666 switch (stage_fc->stage_id) { 19667 case _BCM_FIELD_STAGE_EGRESS: 19668 rv = _bcm_field_th_egress_selcode_get(unit, stage_fc, qset_req, fg); 19669 break; 19670 default: 19671 rv = _bcm_field_selcode_get(unit, stage_fc, qset_req, fg); 19672 } 19673 return (rv); 19674 } 19675 19676 /* 19677 * Function: 19678 * _field_th_group_install 19679 * 19680 * Purpose: 19681 * Auxiliary routine used to install field group. 19682 * Parameters: 19683 * unit - (IN) BCM device number. 19684 * fg - (IN) Installed group structure. 19685 * 19686 * Returns: 19687 * BCM_E_XXX 19688 */ 19689 STATIC int 19690 _field_th_group_install(int unit, _field_group_t *fg) 19691 { 19692 _field_slice_t *fs; /* Slice pointer. */ 19693 uint8 slice_number; /* Slices iterator. */ 19694 int parts_count; /* Number of entry parts. */ 19695 int idx; /* Iteration index. */ 19696 19697 if (NULL == fg) { 19698 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n"))); 19699 return (BCM_E_PARAM); 19700 } 19701 19702 /* Get number of entry parts. */ 19703 BCM_IF_ERROR_RETURN(_bcm_field_entry_tcam_parts_count(unit, 19704 fg->stage_id, 19705 fg->flags, 19706 &parts_count 19707 ) 19708 ); 19709 19710 for (idx = 0; idx < parts_count; ++idx) { 19711 BCM_IF_ERROR_RETURN(_bcm_field_tcam_part_to_slice_number(unit, idx, 19712 fg, 19713 &slice_number 19714 ) 19715 ); 19716 fs = fg->slices + slice_number; 19717 19718 BCM_IF_ERROR_RETURN(_bcm_field_th_selcodes_install(unit, 19719 fg, 19720 fs->slice_number, 19721 fg->pbmp, 19722 idx) 19723 ); 19724 } 19725 19726 return (BCM_E_NONE); 19727 } 19728 19729 /* 19730 * Function: 19731 * _bcm_field_th_group_install 19732 * 19733 * Purpose: 19734 * Auxiliary routine used to install field group. 19735 * Parameters: 19736 * unit - (IN) BCM device number. 19737 * fg - (IN) Installed group structure. 19738 * 19739 * Returns: 19740 * BCM_E_XXX 19741 */ 19742 19743 int 19744 _bcm_field_th_group_install(int unit, _field_group_t *fg) 19745 { 19746 return _field_th_group_install(unit, fg); 19747 } 19748 /* START OF COUNTER ROUTINES */ 19749 19750 19751 /* 19752 * Function: 19753 * _bcm_field_th_flex_stat_index_get 19754 * Purpose: 19755 * Get the indexes and flags needed to compose requested statistic 19756 * which uses flex counter pools. 19757 * 19758 * Parameters: 19759 * unit - (IN) BCM device number. 19760 * f_st - (IN) Field statistics entity. 19761 * stat - (IN) Counter type. 19762 * idx1 - (OUT) Primary counter index. 19763 * idx2 - (OUT) Secondary counter index. 19764 * idx3 - (OUT) Ternary Counter Index. 19765 * out_flags - (OUT) Counter flags. 19766 * Returns: 19767 * BCM_E_XXX 19768 */ 19769 int 19770 _bcm_field_th_flex_stat_index_get(int unit, 19771 _field_stat_t *f_st, 19772 bcm_field_stat_t stat, 19773 int *idx1, int *idx2, 19774 int *idx3, uint32 *out_flags) 19775 { 19776 int fp_stat_mode_max; /* Max stat modes. */ 19777 uint8 idx; /* HW counter modes iterator. */ 19778 uint32 flags = 0; /* _FP_STAT_XXX flags. */ 19779 uint32 req_bmap; /* Requested statistics bitmap. */ 19780 uint32 hw_bmap; /* HW supported statistics bitmap. */ 19781 _field_stat_color_t color; /* Stat Color. */ 19782 19783 if (NULL == f_st || 19784 NULL == idx1 || 19785 NULL == idx2 || 19786 NULL == idx3 || 19787 NULL == out_flags) { 19788 return BCM_E_PARAM; 19789 } 19790 19791 /* Get application requested bitmap. */ 19792 BCM_IF_ERROR_RETURN 19793 (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap)); 19794 19795 /* If bitmap is zero - no mode selection is required. */ 19796 if (0 == req_bmap) { 19797 return BCM_E_INTERNAL; 19798 } 19799 19800 *idx1 = *idx2 = *idx3 = _FP_INVALID_INDEX; 19801 19802 fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl); 19803 for (idx = 0; idx < fp_stat_mode_max; idx++) { 19804 hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap; 19805 color = th_ingress_cntr_hw_mode_tbl[idx].color; 19806 if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) { 19807 /* 19808 * For maximizing utilization of hardware counters, this should 19809 * select the hw_mode both supports the requested stats 19810 * AND minimizes the number of required hardware counters. 19811 */ 19812 break; 19813 } 19814 } 19815 19816 if (idx >= fp_stat_mode_max) { 19817 return (BCM_E_INTERNAL); 19818 } 19819 19820 switch (stat) { 19821 case bcmFieldStatBytes: 19822 flags |= _FP_STAT_BYTES; 19823 /* Fall through */ 19824 case bcmFieldStatPackets: 19825 if (_bcmFieldStatColorNoColor == color) { 19826 *idx1 = f_st->hw_index; 19827 } else if ((_bcmFieldStatColorGreenNotGreen == color) || 19828 (_bcmFieldStatColorYellowNotYellow == color) || 19829 (_bcmFieldStatColorRedNotRed == color)) { 19830 *idx1 = f_st->hw_index; 19831 *idx2 = f_st->hw_index + 1; 19832 } else if (_bcmFieldStatColorGreenYellowRed == color) { 19833 *idx1 = f_st->hw_index; 19834 *idx2 = f_st->hw_index + 1; 19835 *idx3 = f_st->hw_index + 2; 19836 } else { 19837 return BCM_E_INTERNAL; 19838 } 19839 break; 19840 case bcmFieldStatGreenBytes: 19841 flags |= _FP_STAT_BYTES; 19842 /* Fall through */ 19843 case bcmFieldStatGreenPackets: 19844 if ((_bcmFieldStatColorGreen == color) || 19845 (_bcmFieldStatColorGreenYellow == color) || 19846 (_bcmFieldStatColorGreenRed == color) || 19847 (_bcmFieldStatColorGreenNotGreen == color) || 19848 (_bcmFieldStatColorGreenYellowRed == color)) { 19849 *idx1 = f_st->hw_index; 19850 } else { 19851 return BCM_E_INTERNAL; 19852 } 19853 break; 19854 case bcmFieldStatYellowBytes: 19855 flags |= _FP_STAT_BYTES; 19856 /* Fall through */ 19857 case bcmFieldStatYellowPackets: 19858 if ((_bcmFieldStatColorYellow == color) || 19859 (_bcmFieldStatColorYellowRed == color) || 19860 (_bcmFieldStatColorYellowNotYellow == color)) { 19861 *idx1 = f_st->hw_index; 19862 } else if ((_bcmFieldStatColorGreenYellow == color) || 19863 (_bcmFieldStatColorGreenYellowRed == color)) { 19864 *idx1 = f_st->hw_index + 1; 19865 } else { 19866 return BCM_E_INTERNAL; 19867 } 19868 break; 19869 case bcmFieldStatRedBytes: 19870 flags |= _FP_STAT_BYTES; 19871 /* Fall through */ 19872 case bcmFieldStatRedPackets: 19873 if ((_bcmFieldStatColorRed == color) || 19874 (_bcmFieldStatColorRedNotRed == color)) { 19875 *idx1 = f_st->hw_index; 19876 } else if ((_bcmFieldStatColorGreenRed == color) || 19877 (_bcmFieldStatColorYellowRed == color)) { 19878 *idx1 = f_st->hw_index + 1; 19879 } else if (_bcmFieldStatColorGreenYellowRed == color) { 19880 *idx1 = f_st->hw_index + 2; 19881 } else { 19882 return BCM_E_INTERNAL; 19883 } 19884 break; 19885 case bcmFieldStatNotGreenBytes: 19886 flags |= _FP_STAT_BYTES; 19887 /* Fall through */ 19888 case bcmFieldStatNotGreenPackets: 19889 if (_bcmFieldStatColorNotGreen == color) { 19890 *idx1 = f_st->hw_index; 19891 } else if (_bcmFieldStatColorGreenNotGreen == color) { 19892 *idx1 = f_st->hw_index + 1; 19893 } else if (_bcmFieldStatColorYellowRed == color) { 19894 *idx1 = f_st->hw_index; 19895 *idx2 = f_st->hw_index + 1; 19896 } else if (_bcmFieldStatColorGreenYellowRed == color) { 19897 *idx1 = f_st->hw_index + 1; 19898 *idx2 = f_st->hw_index + 2; 19899 } else { 19900 return BCM_E_INTERNAL; 19901 } 19902 break; 19903 case bcmFieldStatNotYellowBytes: 19904 flags |= _FP_STAT_BYTES; 19905 /* Fall through */ 19906 case bcmFieldStatNotYellowPackets: 19907 if (_bcmFieldStatColorNotYellow == color) { 19908 *idx1 = f_st->hw_index; 19909 } else if (_bcmFieldStatColorYellowNotYellow == color) { 19910 *idx1 = f_st->hw_index + 1; 19911 } else if (_bcmFieldStatColorGreenRed == color) { 19912 *idx1 = f_st->hw_index; 19913 *idx2 = f_st->hw_index + 1; 19914 } else if (_bcmFieldStatColorGreenYellowRed == color) { 19915 *idx1 = f_st->hw_index; 19916 *idx2 = f_st->hw_index + 2; 19917 } else { 19918 return BCM_E_INTERNAL; 19919 } 19920 break; 19921 case bcmFieldStatNotRedBytes: 19922 flags |= _FP_STAT_BYTES; 19923 /* Fall through */ 19924 case bcmFieldStatNotRedPackets: 19925 if (_bcmFieldStatColorNotRed == color) { 19926 *idx1 = f_st->hw_index; 19927 } else if (_bcmFieldStatColorRedNotRed == color) { 19928 *idx1 = f_st->hw_index + 1; 19929 } else if ((_bcmFieldStatColorGreenYellow == color) || 19930 (_bcmFieldStatColorGreenYellowRed == color)) { 19931 *idx1 = f_st->hw_index; 19932 *idx2 = f_st->hw_index + 1; 19933 } else { 19934 return BCM_E_INTERNAL; 19935 } 19936 break; 19937 default: 19938 return BCM_E_INTERNAL; 19939 } 19940 19941 flags |= _FP_STAT_ADD; 19942 *out_flags = flags; 19943 return BCM_E_NONE; 19944 } 19945 19946 /* 19947 * Function: 19948 * _bcm_field_th_stat_index_get 19949 * Purpose: 19950 * Get the indexes and flags needed to compose requested statistic. 19951 * 19952 * Parameters: 19953 * unit - (IN) BCM device number. 19954 * f_st - (IN) Field statistics entity. 19955 * stat - (IN) Counter type. 19956 * idx1 - (OUT) Primary counter index. 19957 * idx2 - (OUT) Secondary counter index. 19958 * out_flags - (OUT) Counter flags. 19959 * Returns: 19960 * BCM_E_XXX 19961 */ 19962 int 19963 _bcm_field_th_stat_index_get(int unit, 19964 _field_stat_t *f_st, 19965 bcm_field_stat_t stat, 19966 int *idx1, int *idx2, 19967 int *idx3, uint32 *out_flags) 19968 { 19969 int rv; 19970 19971 if (NULL == f_st || 19972 NULL == idx1 || 19973 NULL == idx2 || 19974 NULL == idx3 || 19975 NULL == out_flags) { 19976 return BCM_E_PARAM; 19977 } 19978 19979 if ((_BCM_FIELD_STAGE_INGRESS == f_st->stage_id) || 19980 (_BCM_FIELD_STAGE_EXACTMATCH == f_st->stage_id)) { 19981 rv = _bcm_field_th_flex_stat_index_get(unit, f_st, stat, idx1, 19982 idx2, idx3, out_flags); 19983 } else { 19984 rv = _bcm_field_trx_stat_index_get(unit, f_st, stat, idx1, 19985 idx2, idx3, out_flags); 19986 } 19987 19988 return rv; 19989 } 19990 19991 /* 19992 * Function: 19993 * _field_th_flex_mode_get 19994 * Purpose: 19995 * Get flex stat hardware counter mode information 19996 * Parameters: 19997 * unit - (IN) BCM device number 19998 * f_st - (IN) Pointer to field stat structure 19999 * Returns: 20000 * BCM_E_XXX 20001 */ 20002 STATIC int 20003 _field_th_flex_mode_get(int unit, 20004 _field_stat_t *f_st) 20005 { 20006 int fp_stat_mode_max; /* Max stat modes. */ 20007 uint8 idx; /* HW counter modes iterator. */ 20008 uint8 hw_entry_count; /* Number of counter table entries.*/ 20009 uint32 req_bmap; /* Requested statistics bitmap. */ 20010 uint32 hw_bmap; /* HW supported statistics bitmap. */ 20011 20012 /* Input parameter check. */ 20013 if (NULL == f_st) { 20014 return (BCM_E_PARAM); 20015 } 20016 20017 /* Get application requested bitmap. */ 20018 BCM_IF_ERROR_RETURN 20019 (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap)); 20020 20021 /* If bitmap is zero - no mode selection is required. */ 20022 if (0 == req_bmap) { 20023 f_st->hw_mode = 0; 20024 f_st->hw_stat = 0; 20025 f_st->hw_flags |= _FP_STAT_FLEX_CNTR; 20026 f_st->flex_mode = 0; 20027 f_st->hw_entry_count = 0; 20028 return (BCM_E_NONE); 20029 } 20030 20031 fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl); 20032 for (idx = 0; idx < fp_stat_mode_max; idx++) { 20033 hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap; 20034 hw_entry_count = th_ingress_cntr_hw_mode_tbl[idx].hw_entry_count; 20035 if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) { 20036 /* 20037 * For maximizing utilization of hardware counters, this should 20038 * select the hw_mode both supports the requested stats 20039 * AND minimizes the number of required hardware counters. 20040 */ 20041 break; 20042 } 20043 } 20044 20045 if (idx >= fp_stat_mode_max) { 20046 return (BCM_E_RESOURCE); 20047 } 20048 20049 /* Initialize stat structure with flex stat parameter info. */ 20050 f_st->hw_stat = req_bmap; 20051 f_st->hw_flags |= _FP_STAT_FLEX_CNTR; 20052 f_st->flex_mode = 0; 20053 f_st->hw_entry_count = hw_entry_count; 20054 20055 return (BCM_E_NONE); 20056 } 20057 20058 /* 20059 * Function: 20060 * _bcm_field_th_stat_hw_mode_get 20061 * 20062 * Description: 20063 * Get hw counter mode which will satisfy requested statistics set. 20064 * Parameters: 20065 * unit - (IN) BCM device number. 20066 * f_st - (IN) Field statistics entity. 20067 * stage_id - (IN) Field stage id. 20068 * Returns: 20069 * BCM_E_XXX 20070 */ 20071 int 20072 _bcm_field_th_stat_hw_mode_get(int unit, _field_stat_t *f_st, 20073 _field_stage_id_t stage_id) 20074 { 20075 /* Input parameters check. */ 20076 if (NULL == f_st) { 20077 return (BCM_E_PARAM); 20078 } 20079 20080 /* 20081 * Tomahawk supports advanced flex counters 20082 * for both IFP and EM then get flex stat mode for this Stat. 20083 */ 20084 if (soc_feature(unit, soc_feature_advanced_flex_counter) 20085 && ((_BCM_FIELD_STAGE_INGRESS == stage_id) || 20086 (_BCM_FIELD_STAGE_EXACTMATCH == stage_id))) { 20087 return (_field_th_flex_mode_get(unit, f_st)); 20088 } 20089 20090 /* EFP still uses dedicated counter pools which can be used by only EFP. 20091 * Tomahawk VFP uses advance flex counters but no change when compred to 20092 * Trident2. 20093 */ 20094 return _bcm_field_stat_hw_mode_get(unit, f_st, stage_id); 20095 } 20096 20097 /* 20098 * Function: 20099 * _bcm_field_th_group_counter_pbm_clear 20100 * 20101 * Description: 20102 * Clear group counter pool bitmap based on used entries in 20103 * in the pool. 20104 * Parameters: 20105 * unit - (IN) BCM device number. 20106 * f_ent - (IN) Field entry structure. 20107 * pool_id - (IN) Counter pool id. 20108 * Returns: 20109 * BCM_E_XXX 20110 */ 20111 int 20112 _bcm_field_th_group_counter_pbm_clear(int unit, 20113 _field_entry_t *f_ent, 20114 uint32 pool_id) 20115 { 20116 int rv; /* Operational Status. */ 20117 uint32 num_pools; /* Counter pool count. */ 20118 uint32 actual_num_pools; /* Actual Counter Pooll Count. */ 20119 bcm_stat_flex_direction_t direction; /* Flex Stat Module object to indicate 20120 * Ingres/Egress Counter pools. 20121 */ 20122 /* Flex Stat Object to carry counter pool info. */ 20123 bcm_stat_flex_pool_stat_info_t pool_info[_FIELD_MAX_COUNTER_POOLS]; 20124 20125 _field_stage_t *stage_fc; /* pipeline stage */ 20126 int pipe_no = 0; 20127 20128 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, f_ent->group->stage_id, 20129 &stage_fc)); 20130 if(stage_fc->oper_mode == bcmFieldGroupOperModePipeLocal) { 20131 pipe_no = f_ent->group->instance; 20132 } else { 20133 pipe_no = 0; 20134 } 20135 20136 /* Though Tomahawk supports 20 flex counter pools , as of now only 16 pools 20137 * are initialized and operating. Remain 4 pools are unused. num_pools has 20138 * to be set to 20 once the remaining 4 pools are supported. 20139 */ 20140 num_pools = _FIELD_MAX_COUNTER_POOLS; 20141 direction = bcmStatFlexDirectionIngress; 20142 rv = _bcm_esw_stat_flex_pipe_pool_info_multi_get(unit, 20143 direction, 20144 pipe_no, 20145 num_pools, 20146 pool_info, 20147 &actual_num_pools); 20148 BCM_IF_ERROR_RETURN(rv); 20149 20150 /* 20151 * Attached entries in any pool is zero means no Field entry has associated stat 20152 * in the cuurent Flex stat pool. 20153 * Used entries in any pool is zero means flex stat module disassociated 20154 * that pool from Field module and can be assigned to any other module. 20155 * So field group should also disassociate the pool from its in use counter 20156 * pool bitmap. 20157 */ 20158 if (0 == pool_info[pool_id].attached_entries) { 20159 20160 /* If the pool is in use for the group, disassocite it now. */ 20161 if (_FP_COUNTER_POOL_BMP_TEST( 20162 f_ent->group->counter_pool_bmp, pool_id)) { 20163 _FP_COUNTER_POOL_BMP_REMOVE( 20164 f_ent->group->counter_pool_bmp, pool_id); 20165 } 20166 } 20167 20168 return BCM_E_NONE; 20169 } 20170 /* 20171 * Function: 20172 * _bcm_field_th_flex_counter_free 20173 * 20174 * Purpose: 20175 * Free flex counter resources used by field entry/entries. 20176 * Parameters: 20177 * unit - (IN) BCM device number. 20178 * f_ent - (IN) Entry array policer belongs to. 20179 * f_st - (IN) Statistics entity. 20180 * mem - (IN) Policy Table name. 20181 * Returns: 20182 * BCM_E_XXX 20183 */ 20184 int 20185 _bcm_field_th_flex_counter_free(int unit, 20186 _field_entry_t *f_ent, 20187 _field_stat_t *f_st, soc_mem_t mem) 20188 { 20189 int rv; /* Operational status. */ 20190 int entry_idx; /* Entry index in a slice. */ 20191 _field_control_t *fc; /* Field Control Structure. */ 20192 _field_stage_t *stage_fc; /* Field Stage structure.*/ 20193 _field_entry_stat_t *f_ent_st; /* Field entry statistics structure. */ 20194 20195 if (NULL == f_ent || NULL == f_st || INVALIDm == mem) { 20196 return BCM_E_PARAM; 20197 } 20198 20199 f_ent_st = &f_ent->statistic; 20200 20201 /* Get pipeline stage information. */ 20202 BCM_IF_ERROR_RETURN 20203 (_field_stage_control_get(unit, 20204 f_ent->group->stage_id, 20205 &stage_fc 20206 ) 20207 ); 20208 20209 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 20210 20211 20212 /* Detach flex stat only if it has been created. */ 20213 if (f_st->flex_mode != 0) { 20214 /* 20215 * Get entry index at which flex STAT information 20216 * has been programmed in policy table. 20217 */ 20218 if (_FP_ENTRY_STAT_INSTALLED == 20219 (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) { 20220 BCM_IF_ERROR_RETURN 20221 (_bcm_field_slice_offset_to_tcam_idx(unit, 20222 stage_fc, 20223 f_ent->group->instance, 20224 f_ent->fs->slice_number, 20225 f_ent->slice_idx, 20226 &entry_idx 20227 )); 20228 20229 /* 20230 * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes, 20231 * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries. 20232 * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and 20233 * entries are 1:1 mapped. 20234 */ 20235 if ((SOC_IS_TOMAHAWKX(unit) && !(SOC_IS_TOMAHAWK3(unit)) && 20236 (f_ent->fs->stage_id == _BCM_FIELD_STAGE_INGRESS) && 20237 (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) 20238 || (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) { 20239 entry_idx = entry_idx + (f_ent->fs->slice_number * 256); 20240 } 20241 20242 /* Disassociate flex counters from the IFP policy table entry 20243 * they are attached to. Once detached, the flex counters are 20244 * no longer updated even if matching traffic 20245 * hits the corresponding IFP policy table entry. 20246 */ 20247 rv = _bcm_esw_stat_flex_detach_ingress_table_counters 20248 (unit, 20249 mem, 20250 entry_idx 20251 ); 20252 /* 20253 * Flex STATs module initialized before field module, ignore 20254 * error during bcm_field_detach(). 20255 */ 20256 if (BCM_FAILURE(rv) && (TRUE == fc->init)) { 20257 return (rv); 20258 } 20259 } 20260 20261 if (!(f_st->hw_flags & _FP_STAT_CREATED_BY_FLEX_MODULE)) { 20262 /* 20263 * Release counter resources and perform associated cleanup in flex 20264 * stat module. This function must be called, once the associated 20265 * statistics collection function is no longer needed and the 20266 * reserved counter resources can be freed for use by other 20267 * applications. Once this function is called, the counters 20268 * associated with the given stat counter id are no longer 20269 * available for any further stat collection. 20270 */ 20271 rv = bcm_esw_stat_group_destroy(unit, f_st->flex_mode); 20272 20273 /* 20274 * Flex STATs module initialized before field module, ignore 20275 * error during bcm_field_detach(). 20276 * Ignore:BCM_E_INTERNAL(as multiple stat entries use same SingleMode 20277 */ 20278 if (rv == BCM_E_INTERNAL) { 20279 /* Doesn't look appropriate error code but */ 20280 rv = BCM_E_NONE; 20281 } 20282 if (BCM_FAILURE(rv) && (TRUE == fc->init)) { 20283 return (rv); 20284 } 20285 } 20286 20287 /* Check and if required disassociate counter pools from the group. */ 20288 rv = _bcm_field_th_group_counter_pbm_clear(unit, f_ent, 20289 f_st->pool_index); 20290 BCM_IF_ERROR_RETURN(rv); 20291 20292 /* decrement the group's counter count equal to 20293 the hw counters used for this stat */ 20294 f_ent->group->group_status.counter_count = 20295 f_ent->group->group_status.counter_count - f_st->hw_entry_count; 20296 20297 /* Reset the field stat attributes. */ 20298 f_st->hw_index = _FP_INVALID_INDEX; 20299 f_st->pool_index = _FP_INVALID_INDEX; 20300 f_st->hw_entry_count = 0; 20301 f_st->flex_mode = 0; 20302 } 20303 20304 return (BCM_E_NONE); 20305 } 20306 20307 /* 20308 * Function: 20309 * _bcm_field_th_em_flex_counter_free 20310 * Purpose: 20311 * Free flex counter resources used by em field entry/entries. 20312 * Parameters: 20313 * unit - (IN) BCM device number. 20314 * f_ent - (IN) Entry array policer belongs to. 20315 * f_st - (IN) Statistics entity. 20316 * mem - (IN) Policy Table name. 20317 * Returns: 20318 * BCM_E_XXX 20319 */ 20320 int 20321 _bcm_field_th_em_flex_counter_free(int unit, 20322 _field_entry_t *f_ent, 20323 _field_stat_t *f_st, soc_mem_t mem) 20324 { 20325 int rv; /* Operational status. */ 20326 _field_control_t *fc; /* Field Control Structure. */ 20327 _field_stage_t *stage_fc; /* Field Stage structure.*/ 20328 _field_entry_stat_t *f_ent_st; /* Field entry statistics structure. */ 20329 20330 if (NULL == f_ent || NULL == f_st || INVALIDm == mem) { 20331 return BCM_E_PARAM; 20332 } 20333 20334 f_ent_st = &f_ent->statistic; 20335 20336 /* Get pipeline stage information. */ 20337 BCM_IF_ERROR_RETURN 20338 (_field_stage_control_get(unit, 20339 f_ent->group->stage_id, 20340 &stage_fc)); 20341 20342 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 20343 20344 /* Detach flex stat only if it has been created. */ 20345 if (f_st->flex_mode != 0) { 20346 if (_FP_ENTRY_STAT_INSTALLED == 20347 (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) { 20348 rv = _bcm_esw_stat_flex_detach_ingress_table_counters_sw(unit, 20349 mem, 0, f_st->hw_mode, f_st->hw_index, 20350 f_st->pool_index); 20351 /* 20352 * Flex STATs module initialized before field module, ignore 20353 * error during bcm_field_detach(). 20354 */ 20355 if (BCM_FAILURE(rv) && (TRUE == fc->init)) { 20356 return (rv); 20357 } 20358 } 20359 20360 if (!(f_st->hw_flags & _FP_STAT_CREATED_BY_FLEX_MODULE)) { 20361 /* 20362 * Release counter resources and perform associated cleanup in flex 20363 * stat module. This function must be called, once the associated 20364 * statistics collection function is no longer needed and the reserved 20365 * counter resources can be freed for use by other applications. Once 20366 * this function is called, the counters associated with the given stat 20367 * counter id are no longer available for any further stat collection. 20368 */ 20369 rv = bcm_esw_stat_group_destroy(unit, f_st->flex_mode); 20370 20371 /* 20372 * Flex STATs module initialized before field module, ignore 20373 * error during bcm_field_detach(). 20374 * Ignore:BCM_E_INTERNAL (as multiple stat entries use same SingleMode 20375 */ 20376 if (rv == BCM_E_INTERNAL) { 20377 /* Doesn't look appropriate error code but */ 20378 rv = BCM_E_NONE; 20379 } 20380 if (BCM_FAILURE(rv) && (TRUE == fc->init)) { 20381 return (rv); 20382 } 20383 } 20384 20385 /* Check and if required disassociate counter pools from the group. */ 20386 rv = _bcm_field_th_group_counter_pbm_clear(unit, f_ent, 20387 f_st->pool_index); 20388 BCM_IF_ERROR_RETURN(rv); 20389 20390 /* decrement the group's counter count equal to 20391 the hw counters used for this stat */ 20392 f_ent->group->group_status.counter_count = 20393 f_ent->group->group_status.counter_count - f_st->hw_entry_count; 20394 20395 /* Reset the field stat attributes. */ 20396 f_st->hw_index = _FP_INVALID_INDEX; 20397 f_st->pool_index = _FP_INVALID_INDEX; 20398 f_st->hw_entry_count = 0; 20399 f_st->flex_mode = 0; 20400 } 20401 20402 return (BCM_E_NONE); 20403 } 20404 20405 /* 20406 * Function: 20407 * _field_th_stat_hw_free 20408 * 20409 * Purpose: 20410 * Deallocate hw counter from an entry for IFP and VFP stages. 20411 * 20412 * Parameters: 20413 * unit - (IN) BCM device number. 20414 * f_ent - (IN) Entry statistics belongs to. 20415 * Returns: 20416 * BCM_E_XXX 20417 */ 20418 STATIC int 20419 _field_th_stat_hw_free (int unit, _field_entry_t *f_ent) 20420 { 20421 int rv; /* Operation return status. */ 20422 int idx; /* Statistics iteration index. */ 20423 int entry_idx; /* Entry index at policy table */ 20424 soc_mem_t tcam_mem; /* Tcam Table Name. */ 20425 soc_mem_t policy_mem; /* Policy Table Name. */ 20426 _field_stat_t *f_st; /* Statistics entity descriptor. */ 20427 _field_stage_t *stage_fc; /* pipeline stage */ 20428 _field_control_t *fc; /* Field Control Structure. */ 20429 _field_entry_stat_t *f_ent_st; /* Field entry statistics structure. */ 20430 20431 /* Input parameters check. */ 20432 if (NULL == f_ent) { 20433 return (BCM_E_PARAM); 20434 } 20435 20436 f_ent_st = &f_ent->statistic; 20437 /* Skip uninstalled statistics entity.*/ 20438 if (0 == (f_ent_st->flags & _FP_ENTRY_STAT_VALID)) { 20439 return (BCM_E_NONE); 20440 } 20441 20442 /* Get pipeline stage information. */ 20443 BCM_IF_ERROR_RETURN 20444 (_field_stage_control_get(unit, 20445 f_ent->group->stage_id, 20446 &stage_fc 20447 ) 20448 ); 20449 20450 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 20451 20452 /* Read stat entity configuration. */ 20453 BCM_IF_ERROR_RETURN(_bcm_field_stat_get(unit, f_ent_st->sid, &f_st)); 20454 20455 BCM_IF_ERROR_RETURN(_bcm_field_th_tcam_policy_mem_get(unit, f_ent, 20456 &tcam_mem, &policy_mem)); 20457 20458 if (_FP_ENTRY_STAT_INSTALLED == 20459 (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) { 20460 /* Decrement hw reference count. */ 20461 if (f_st->hw_ref_count > 0) { 20462 f_st->hw_ref_count--; 20463 if (f_st->flex_mode != 0 && f_st->hw_ref_count > 0) { 20464 /* 20465 * Get entry index at which flex STAT information 20466 * has been programmed in policy table. 20467 */ 20468 BCM_IF_ERROR_RETURN 20469 (_bcm_field_slice_offset_to_tcam_idx(unit, 20470 stage_fc, 20471 f_ent->group->instance, 20472 f_ent->fs->slice_number, 20473 f_ent->slice_idx, 20474 &entry_idx 20475 )); 20476 20477 /* 20478 * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes, 20479 * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries. 20480 * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and 20481 * entries are 1:1 mapped. 20482 */ 20483 if ((SOC_IS_TOMAHAWKX(unit) && (!SOC_IS_TOMAHAWK3(unit)) && 20484 (f_ent->fs->stage_id == _BCM_FIELD_STAGE_INGRESS) && 20485 (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) 20486 || (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)) 20487 )) { 20488 entry_idx = entry_idx + (f_ent->fs->slice_number * 256); 20489 } 20490 20491 /* Disassociate flex counters from the IFP policy table entry 20492 * they are attached to. Once detached, the flex counters are 20493 * no longer updated even if matching traffic hits 20494 * the corresponding IFP policy table entry. 20495 */ 20496 rv = _bcm_esw_stat_flex_detach_ingress_table_counters 20497 (unit, 20498 policy_mem, 20499 entry_idx 20500 ); 20501 /* 20502 * Flex STAT module detached before field module, ignore 20503 * error during bcm_field_detach(). 20504 */ 20505 if (BCM_FAILURE(rv) && (TRUE == fc->init)) { 20506 return (rv); 20507 } 20508 } 20509 } 20510 } 20511 20512 /* Statistics is not used by any other entry. */ 20513 if (f_st->hw_ref_count == 0) { 20514 /* 20515 * Retrieve the stat values only during run time. 20516 * It doesn't need to be maintained during field init/detach. 20517 */ 20518 if (_FP_ENTRY_STAT_INSTALLED == 20519 (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) { 20520 if (fc->init == TRUE) { 20521 /* Read & Reset individual statistics. */ 20522 for (idx = 0; idx < f_st->nstat; idx++) { 20523 rv = _field_stat_value_get(unit, 0, f_st, 20524 f_st->stat_arr[idx], 20525 f_st->stat_values + idx); 20526 if (BCM_FAILURE(rv)) { 20527 /* During system restart flex stat module 20528 * might be reinitialized before fp reinit. Hence 20529 * calls to the flex stat module will result in 20530 * BCM_E_NOT_FOUND * error code. 20531 */ 20532 if (0 == (((_BCM_FIELD_STAGE_INGRESS == 20533 f_st->stage_id) || 20534 (_BCM_FIELD_STAGE_LOOKUP == f_st->stage_id)) 20535 && (BCM_E_NOT_FOUND == rv))) { 20536 return rv; 20537 } 20538 } 20539 } 20540 } 20541 } 20542 20543 /* Mark hw resource as unused in sw. */ 20544 rv = _bcm_field_th_flex_counter_free(unit, f_ent, f_st, policy_mem); 20545 BCM_IF_ERROR_RETURN(rv); 20546 } 20547 20548 /* 20549 * If qualifiers have not been modified for this entry, 20550 * set Action only dirty flag. 20551 */ 20552 if (_FP_ENTRY_STAT_INSTALLED == 20553 (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) { 20554 if (0 == (f_ent->flags & _FP_ENTRY_DIRTY)) { 20555 f_ent->flags |= _FP_ENTRY_POLICY_TABLE_ONLY_DIRTY; 20556 } 20557 20558 f_ent_st->flags &= ~_FP_ENTRY_STAT_INSTALLED; 20559 20560 /* Mark entry for reinstall. */ 20561 f_ent->flags |= _FP_ENTRY_DIRTY; 20562 } 20563 return (BCM_E_NONE); 20564 } 20565 20566 /* 20567 * Function: 20568 * _field_th_em_stat_hw_free 20569 * Purpose: 20570 * Deallocate hw counter from an entry for exact match stage. 20571 * Parameters: 20572 * unit - (IN) BCM device number. 20573 * f_ent - (IN) Entry statistics belongs to. 20574 * Returns: 20575 * BCM_E_XXX 20576 */ 20577 STATIC int 20578 _field_th_em_stat_hw_free (int unit, _field_entry_t *f_ent) 20579 { 20580 int rv; /* Operation return status. */ 20581 int idx; /* Statistics iteration index. */ 20582 soc_mem_t tcam_mem; /* Tcam Table Name. */ 20583 soc_mem_t policy_mem; /* Policy Table Name. */ 20584 _field_stat_t *f_st; /* Statistics entity descriptor. */ 20585 _field_stage_t *stage_fc; /* pipeline stage */ 20586 _field_control_t *fc; /* Field Control Structure. */ 20587 _field_entry_stat_t *f_ent_st; /* Field entry statistics structure. */ 20588 20589 /* Input parameters check. */ 20590 if (NULL == f_ent) { 20591 return (BCM_E_PARAM); 20592 } 20593 20594 f_ent_st = &f_ent->statistic; 20595 /* Skip uninstalled statistics entity. */ 20596 if (0 == (f_ent_st->flags & _FP_ENTRY_STAT_VALID)) { 20597 return (BCM_E_NONE); 20598 } 20599 20600 /* Get pipeline stage information. */ 20601 BCM_IF_ERROR_RETURN 20602 (_field_stage_control_get(unit, 20603 f_ent->group->stage_id, 20604 &stage_fc)); 20605 20606 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 20607 20608 /* Read stat entity configuration. */ 20609 BCM_IF_ERROR_RETURN(_bcm_field_stat_get(unit, f_ent_st->sid, &f_st)); 20610 20611 BCM_IF_ERROR_RETURN(_bcm_field_th_tcam_policy_mem_get(unit, f_ent, 20612 &tcam_mem, &policy_mem)); 20613 if (_FP_ENTRY_STAT_INSTALLED == 20614 (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) { 20615 /* Decrement hw reference count. */ 20616 if (f_st->hw_ref_count > 0) { 20617 f_st->hw_ref_count--; 20618 if (f_st->flex_mode != 0 && f_st->hw_ref_count > 0) { 20619 20620 /* Disassociate flex counters from the EM table entry 20621 * they are attached to. Once detached, the flex counters are 20622 * no longer updated even if matching traffic 20623 * hits the corresponding EM table entry. 20624 */ 20625 rv = _bcm_esw_stat_flex_detach_ingress_table_counters_sw(unit, 20626 policy_mem, 0, 20627 f_st->hw_mode, f_st->hw_index, f_st->pool_index); 20628 /* 20629 * Flex STAT module detached before field module, ignore 20630 * error during bcm_field_detach(). 20631 */ 20632 if (BCM_FAILURE(rv) && (TRUE == fc->init)) { 20633 return (rv); 20634 } 20635 } 20636 } 20637 } 20638 /* Statistics is not used by any other entry. */ 20639 if (f_st->hw_ref_count == 0) { 20640 /* 20641 * Retrieve the stat values only during run time. 20642 * It doesn't need to be maintained during field init/detach. 20643 */ 20644 if (_FP_ENTRY_STAT_INSTALLED == 20645 (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) { 20646 if (fc->init == TRUE) { 20647 for (idx = 0; idx < f_st->nstat; idx++) { 20648 rv = _field_stat_value_get(unit, 0, f_st, 20649 f_st->stat_arr[idx], 20650 f_st->stat_values + idx); 20651 if (BCM_FAILURE(rv)) { 20652 /* During system restart flex stat module 20653 * might be reinitialized before fp reinit. Hence 20654 * calls to the flex stat module will result in 20655 * BCM_E_NOT_FOUND * error code. 20656 */ 20657 if (0 == (((_BCM_FIELD_STAGE_INGRESS == 20658 f_st->stage_id) || 20659 (_BCM_FIELD_STAGE_EXACTMATCH == 20660 f_st->stage_id) || 20661 (_BCM_FIELD_STAGE_LOOKUP == 20662 f_st->stage_id)) 20663 && (BCM_E_NOT_FOUND == rv))) { 20664 return rv; 20665 } 20666 } 20667 } 20668 } 20669 } 20670 20671 /* Mark hw resource as unused in sw. */ 20672 rv = _bcm_field_th_em_flex_counter_free(unit, f_ent, f_st, policy_mem); 20673 BCM_IF_ERROR_RETURN(rv); 20674 } 20675 20676 /* 20677 * If qualifiers have not been modified for this entry, 20678 * set Action only dirty flag. 20679 */ 20680 if (_FP_ENTRY_STAT_INSTALLED == 20681 (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) { 20682 if (0 == (f_ent->flags & _FP_ENTRY_DIRTY)) { 20683 f_ent->flags |= _FP_ENTRY_POLICY_TABLE_ONLY_DIRTY; 20684 } 20685 20686 f_ent_st->flags &= ~_FP_ENTRY_STAT_INSTALLED; 20687 20688 /* Mark entry for reinstall. */ 20689 f_ent->flags |= _FP_ENTRY_DIRTY; 20690 } 20691 return (BCM_E_NONE); 20692 } 20693 20694 /* 20695 * Function: 20696 * _bcm_field_th_stat_hw_free 20697 * 20698 * Purpose: 20699 * Deallocate hw counter from an entry. 20700 * 20701 * Parameters: 20702 * unit - (IN) BCM device number. 20703 * f_ent - (IN) Entry statistics belongs to. 20704 * Returns: 20705 * BCM_E_XXX 20706 */ 20707 int 20708 _bcm_field_th_stat_hw_free(int unit, _field_entry_t *f_ent) 20709 { 20710 int rv = BCM_E_INTERNAL; /* Operational Status. */ 20711 20712 if (NULL == f_ent) { 20713 return BCM_E_PARAM; 20714 } 20715 20716 switch (f_ent->fs->stage_id) { 20717 case _BCM_FIELD_STAGE_INGRESS: 20718 if (soc_feature(unit, soc_feature_ifp_action_profiling)) { 20719 rv = _field_th_em_stat_hw_free(unit, f_ent); 20720 } else { 20721 rv = _field_th_stat_hw_free(unit, f_ent); 20722 } 20723 break; 20724 case _BCM_FIELD_STAGE_LOOKUP: 20725 rv = _field_th_stat_hw_free(unit, f_ent); 20726 break; 20727 case _BCM_FIELD_STAGE_EXACTMATCH: 20728 rv = _field_th_em_stat_hw_free(unit, f_ent); 20729 break; 20730 case _BCM_FIELD_STAGE_EGRESS: 20731 #if defined BCM_TRIDENT3_SUPPORT 20732 if (soc_feature(unit, soc_feature_td3_style_fp)) { 20733 rv = _bcm_field_td2plus_stat_hw_free(unit, f_ent); 20734 } else 20735 #endif /* BCM_TRIDENT3_SUPPORT */ 20736 { 20737 rv = _bcm_field_stat_hw_free(unit, f_ent); 20738 } 20739 break; 20740 default: 20741 rv = _bcm_field_stat_hw_free(unit, f_ent); 20742 break; 20743 } 20744 return rv; 20745 } 20746 /* 20747 * Function: 20748 * _bcm_field_stat_array_get 20749 * 20750 * Purpose: 20751 * Get field stat types array from flex stat attribute array. 20752 * 20753 * Parameters: 20754 * unit - (IN) BCM device number. 20755 * nattr - (IN) Number of attributes. 20756 * stat_attr - (IN) Flex stat attribute array. 20757 * nstat - (OUT) Number of field stat types. 20758 * stata_arr - (OUT) Field stat array. 20759 * Returns: 20760 * BCM_E_XXX 20761 */ 20762 int 20763 _bcm_field_stat_array_get(int unit, 20764 uint32 nattr, 20765 bcm_stat_group_mode_attr_selector_t *stat_attr, 20766 int *nstat, bcm_field_stat_t *stat_arr) 20767 { 20768 int idx = 0; /* Index Variable. */ 20769 int packets = -1; /* Al coloreed packets. */ 20770 int bytes = -1; /* All colored bytes. */ 20771 int g_packets = -1; /* Green Packets. */ 20772 int y_packets = -1; /* Yellow Packets. */ 20773 int r_packets = -1; /* Red Packets. */ 20774 int g_bytes = -1; /* Green Bytes. */ 20775 int y_bytes = -1; /* Yellow Bytes. */ 20776 int r_bytes = -1; /* Red Bytes. */ 20777 int ng_packets = -1; /* Not Green Packets. */ 20778 int ny_packets = -1; /* Not Yellow Packets. */ 20779 int nr_packets = -1; /* Not Red Packets. */ 20780 int ng_bytes = -1; /* Not Green Bytes. */ 20781 int ny_bytes = -1; /* Not Yellow Bytes. */ 20782 int nr_bytes = -1; /* Not Red Bytes. */ 20783 int g_offset = -1; /* Green counter offset. */ 20784 int y_offset = -1; /* Yellow Counter Offset. */ 20785 int r_offset = -1; /* Red Counter Offset. */ 20786 int color = 0; /* Bitmap of G, Y and R colors. */ 20787 int g_present = 0; /* Green Packets Present. */ 20788 int y_present = 0; /* Yellow Packets Present. */ 20789 int r_present = 0; /* Red Packets Present. */ 20790 20791 /* Parameters Check. */ 20792 20793 /* Max number of attributes for any flex stat Id should not excced 3, as 20794 * the max counters attached to an ifp entry doesnot exceed 3. 20795 */ 20796 if (nattr <= 0 || nattr > 3) { 20797 return BCM_E_PARAM; 20798 } 20799 20800 if (NULL == nstat || NULL == stat_attr || NULL == stat_arr) { 20801 return BCM_E_PARAM; 20802 } 20803 20804 *nstat = 0; 20805 20806 /* Get the flex stat Colors and flex stat counters offsets. */ 20807 for (idx = 0; idx < nattr; idx++) { 20808 if (NULL != (stat_attr + idx)) { 20809 if (bcmColorGreen == (stat_attr + idx)->attr_value) { 20810 g_present = 1; 20811 g_offset = (stat_attr + idx)->counter_offset; 20812 } else if (bcmColorYellow == (stat_attr + idx)->attr_value) { 20813 y_present = 1; 20814 y_offset = (stat_attr + idx)->counter_offset; 20815 } else if (bcmColorRed == (stat_attr + idx)->attr_value) { 20816 r_present = 1; 20817 r_offset = (stat_attr + idx)->counter_offset; 20818 } 20819 } 20820 } 20821 20822 color = (r_present << 2) | (y_present << 1) | g_present; 20823 20824 switch (color) { 20825 case 1: 20826 /* If flex Stat has bcmColorGreen, then include Green Packets and 20827 * Green Bytes into field stat types. 20828 */ 20829 if (-1 != g_offset) { 20830 g_packets = 1; 20831 g_bytes = 1; 20832 *nstat = 2; 20833 } else { 20834 return BCM_E_INTERNAL; 20835 } 20836 break; 20837 case 2: 20838 /* If flex Stat has bcmColorYellow, then include Yellow Packets and 20839 * Yellow Bytes into field stat types. 20840 */ 20841 if (-1 != y_offset) { 20842 y_packets = 1; 20843 y_bytes = 1; 20844 *nstat = 2; 20845 } else { 20846 return BCM_E_INTERNAL; 20847 } 20848 break; 20849 case 3: 20850 /* flex stat has both bcmColorGreen and bcmColorYellow. */ 20851 if (-1 != g_offset && -1 != y_offset) { 20852 /* If flex stat has both bcmColorGreen and bcmColorYellow, 20853 * and corrsponding counter offsets are same include 20854 * NotRedPackets and NotRedBytes into field stat types. 20855 */ 20856 if (g_offset == y_offset) { 20857 nr_packets = 1; 20858 nr_bytes = 1; 20859 *nstat = 2; 20860 } else { 20861 /* If flex stat has both bcmColorGreen and bcmColorYellow, 20862 * and corrsponding counter offsets are not same include 20863 * GreenPackets, GreenBytes, YellowPackets and YellowBytes 20864 * into field stat types. 20865 */ 20866 g_packets = 1; 20867 g_bytes = 1; 20868 y_packets = 1; 20869 y_bytes = 1; 20870 *nstat = 4; 20871 } 20872 } else { 20873 return BCM_E_INTERNAL; 20874 } 20875 break; 20876 case 4: 20877 /* If flex Stat has bcmColorYellow, then include Yellow Packets and 20878 * Yellow Bytes into field stat types. 20879 */ 20880 if (-1 != r_offset) { 20881 r_packets = 1; 20882 r_bytes = 1; 20883 *nstat = 2; 20884 } else { 20885 return BCM_E_INTERNAL; 20886 } 20887 break; 20888 case 5: 20889 /* flex stat has both bcmColorGreen and bcmColorRed. */ 20890 if (-1 != g_offset && -1 != r_offset) { 20891 if (g_offset == r_offset) { 20892 /* If flex stat has both bcmColorGreen and bcmColorRed, 20893 * and corrsponding counter offsets are same include 20894 * NotYellowPackets and NotYellowBytes into field stat 20895 * types. 20896 */ 20897 ny_packets = 1; 20898 ny_bytes = 1; 20899 *nstat = 2; 20900 } else { 20901 /* If flex stat has both bcmColorGreen and bcmColorRed, 20902 * and corrsponding counter offsets are not same include 20903 * GreenPackets, GreenBytes, RedPackets and RedBytes 20904 * into field stat types. 20905 */ 20906 g_packets = 1; 20907 g_bytes = 1; 20908 r_packets = 1; 20909 r_bytes = 1; 20910 *nstat = 4; 20911 } 20912 } else { 20913 return BCM_E_INTERNAL; 20914 } 20915 break; 20916 case 6: 20917 /* flex stat has both bcmColorYellow and bcmColorRed. */ 20918 if (-1 != r_offset && -1 != y_offset) { 20919 if (r_offset == y_offset) { 20920 /* If flex stat has both bcmColorYellow and bcmColorRed, 20921 * and corrsponding counter offsets are same include 20922 * NotGreenPackets and NotGreenBytes into field stat 20923 * types. 20924 */ 20925 ng_packets = 1; 20926 ng_bytes = 1; 20927 *nstat = 2; 20928 } else { 20929 /* If flex stat has both bcmColorGreen and bcmColorRed, 20930 * and corrsponding counter offsets are not same include 20931 * YellowPackets, YellowBytes, RedPackets and RedBytes 20932 * into field stat types. 20933 */ 20934 r_packets = 1; 20935 r_bytes = 1; 20936 y_packets = 1; 20937 y_bytes = 1; 20938 *nstat = 4; 20939 } 20940 } else { 20941 return BCM_E_INTERNAL; 20942 } 20943 break; 20944 case 7: 20945 /* flex stat has ColorGreen , ColorYellow and ColorRed. */ 20946 if (-1 != g_offset && -1 != y_offset && -1 != r_offset) { 20947 if (g_offset == y_offset && g_offset == r_offset) { 20948 /* Flex stat has bcmColorGreen ,bcmColorYellow and 20949 * bcmColorRed, and corrsponding counter offsets are same 20950 * include Packets and Bytes into field stat 20951 * types. 20952 */ 20953 packets = 1; 20954 bytes = 1; 20955 *nstat = 2; 20956 } else if (g_offset == y_offset && g_offset != r_offset) { 20957 /* Flex stat has bcmColorGreen ,bcmColorYellow and 20958 * bcmColorRed. Green and Yellow counter offsets are same 20959 * but have different red counter offset then include 20960 * NotRedPackets, NotRedBytes, RedPackets and RedBytes into 20961 * field stat types. 20962 */ 20963 nr_packets = 1; 20964 nr_bytes = 1; 20965 r_packets = 1; 20966 r_bytes = 1; 20967 *nstat = 4; 20968 } else if (g_offset != y_offset && g_offset == r_offset) { 20969 /* Flex stat has bcmColorGreen ,bcmColorYellow and 20970 * bcmColorRed. Green and Red counter offsets are same 20971 * but have different Yellow counter offset then include 20972 * NotYellowPackets, NotYellowBytes, YellowPackets and 20973 * YellowBytes into field stat types. 20974 */ 20975 ny_packets = 1; 20976 ny_bytes = 1; 20977 y_packets = 1; 20978 y_bytes = 1; 20979 *nstat = 4; 20980 } else if(r_offset == y_offset && g_offset != r_offset) { 20981 /* Flex stat has bcmColorGreen ,bcmColorYellow and 20982 * bcmColorRed. Yellow and Red counter offsets are same 20983 * but have different Green counter offset then include 20984 * NotGreenPackets, NotGreenBytes, GreenPackets and 20985 * GreenBytes into field stat types. 20986 */ 20987 ng_packets = 1; 20988 ng_bytes = 1; 20989 g_packets = 1; 20990 g_bytes = 1; 20991 *nstat = 4; 20992 } else if (r_offset != y_offset && g_offset != r_offset && 20993 y_offset != g_offset) { 20994 /* Flex stat has bcmColorGreen ,bcmColorYellow and 20995 * bcmColorRed and corrsponding counter offsets are 20996 * different then include GreenPackets, GreenBytes, 20997 * YellowPackets, YellowBytes , NotGreenPackets, 20998 * NotGreenBytes, NotYellowPackets, NotYellowBYtes, 20999 * NoteRedPackets, NotRedBytes, Packets and Bytes into 21000 * field stat types. 21001 */ 21002 g_packets = 1; 21003 g_bytes = 1; 21004 y_packets = 1; 21005 y_bytes = 1; 21006 r_packets = 1; 21007 r_bytes = 1; 21008 ng_packets = 1; 21009 ng_bytes = 1; 21010 ny_packets = 1; 21011 ny_bytes = 1; 21012 nr_packets = 1; 21013 nr_bytes = 1; 21014 packets = 1; 21015 bytes = 1; 21016 *nstat = 14; 21017 } 21018 } else { 21019 return BCM_E_INTERNAL; 21020 } 21021 break; 21022 default: 21023 return BCM_E_INTERNAL; 21024 } 21025 21026 /* Number field stat types cannot exceed 14 */ 21027 if (*nstat > 14) { 21028 return BCM_E_INTERNAL; 21029 } 21030 21031 /* Update the field stat types belongs given flex stat attributes. */ 21032 idx = 0; 21033 if (-1 != g_packets) { 21034 *(stat_arr+ idx) = bcmFieldStatGreenPackets; 21035 idx++; 21036 } 21037 21038 if (-1 != y_packets) { 21039 *(stat_arr+ idx) = bcmFieldStatYellowPackets; 21040 idx++; 21041 } 21042 21043 if (-1 != r_packets) { 21044 *(stat_arr+ idx) = bcmFieldStatRedPackets; 21045 idx++; 21046 } 21047 21048 if (-1 != g_bytes) { 21049 *(stat_arr+ idx) = bcmFieldStatGreenBytes; 21050 idx++; 21051 } 21052 21053 if (-1 != y_bytes) { 21054 *(stat_arr+ idx) = bcmFieldStatYellowBytes; 21055 idx++; 21056 } 21057 21058 if (-1 != r_bytes) { 21059 *(stat_arr+ idx) = bcmFieldStatRedBytes; 21060 idx++; 21061 } 21062 21063 if (-1 != ng_packets) { 21064 *(stat_arr+ idx) = bcmFieldStatNotGreenPackets; 21065 idx++; 21066 } 21067 21068 if (-1 != ny_packets) { 21069 *(stat_arr+ idx) = bcmFieldStatNotYellowPackets; 21070 idx++; 21071 } 21072 21073 if (-1 != nr_packets) { 21074 *(stat_arr+ idx) = bcmFieldStatNotRedPackets; 21075 idx++; 21076 } 21077 21078 if (-1 != ng_bytes) { 21079 *(stat_arr+ idx) = bcmFieldStatNotGreenBytes; 21080 idx++; 21081 } 21082 21083 if (-1 != ny_bytes) { 21084 *(stat_arr+ idx) = bcmFieldStatNotYellowBytes; 21085 idx++; 21086 } 21087 21088 if (-1 != nr_bytes) { 21089 *(stat_arr+ idx) = bcmFieldStatNotRedBytes; 21090 idx++; 21091 } 21092 21093 if (-1 != packets) { 21094 *(stat_arr+ idx) = bcmFieldStatPackets; 21095 idx++; 21096 } 21097 21098 if (-1 != bytes) { 21099 *(stat_arr+ idx) = bcmFieldStatBytes; 21100 idx++; 21101 } 21102 21103 return BCM_E_NONE; 21104 } 21105 /* 21106 * Function: 21107 * _bcm_field_th_stat_attach 21108 * 21109 * Purpose: 21110 * Attach flex counters created using flex stat API's to fie;ld group. 21111 * 21112 * Parameters: 21113 * unit - (IN) BCM device number. 21114 * field_group - (IN) Field Group Id. 21115 * flex_sid - (IN) Flex stat Id created using flex stat API's. 21116 * stat_id - (OUT) Field stat id mapped to flex_sid. 21117 * Returns: 21118 * BCM_E_XXX 21119 */ 21120 int 21121 _bcm_field_th_stat_attach(int unit, 21122 bcm_field_group_t field_group, 21123 uint32 flex_sid, uint32 *stat_id) 21124 { 21125 int rv; /* Operational Status. */ 21126 int nstat; /* Number of stats attached to stat id. */ 21127 int fp_stat_mode_max; /* Max stat modes. */ 21128 uint8 idx; /* Index variable to carry loop count. */ 21129 uint32 pool_num; /* Flex Stat Hw Pool No. */ 21130 uint32 base_index; /* Flex Stat counter base index. */ 21131 uint32 num_hw_cntrs; /* Number of counters allocated. */ 21132 uint32 req_bmap; /* Requested statistics bitmap. */ 21133 uint32 hw_bmap; /* HW supported statistics bitmap. */ 21134 uint32 nattr; /* Number of flex stat attribute types. */ 21135 _field_stat_t *f_st; /* Field statistics descriptor. */ 21136 bcm_field_stat_t stat_arr[14]; /* Allowable stat types to attach. */ 21137 bcm_stat_group_mode_t stat_mode; /* Stat type bcmStatGroupModeXXX. */ 21138 bcm_stat_object_t stat_obj; /* Stat object type. */ 21139 bcm_stat_flex_mode_t offset_mode; /* Counter mode. */ 21140 bcm_stat_flex_direction_t direction; /* Ingress/Egress Flex Stats. */ 21141 bcm_stat_group_mode_attr_selector_t stat_attr[3]; /* Flex stat attrs. */ 21142 21143 21144 /* Null parameter Check */ 21145 if (NULL == stat_id) { 21146 return BCM_E_PARAM; 21147 } 21148 21149 BCM_IF_ERROR_RETURN(_bcm_esw_stat_id_validate(unit, flex_sid)); 21150 21151 /* Get flex counter hardware details stored in flex stat ID.*/ 21152 _bcm_esw_stat_get_counter_id_info(unit, 21153 flex_sid, 21154 &stat_mode, 21155 &stat_obj, 21156 &offset_mode, 21157 &pool_num, 21158 &base_index); 21159 21160 /* Validate the stat object is in range. */ 21161 BCM_IF_ERROR_RETURN(_bcm_esw_stat_validate_object(unit, 21162 stat_obj, &direction)); 21163 /* Validate the stat mode. */ 21164 BCM_IF_ERROR_RETURN(_bcm_esw_stat_validate_group(unit, stat_mode)); 21165 21166 /* Validate stat object. */ 21167 if ((bcmStatObjectIngFieldStageIngress != stat_obj) && 21168 (bcmStatObjectIngFieldStageLookup != stat_obj) && 21169 (bcmStatObjectIngExactMatch != stat_obj)) { 21170 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META_U(unit, 21171 "Retrieved object need to be bcmStatObjectFieldStageIngress or" 21172 " bcmStatObjectIngFieldStageLookup or" 21173 " bcmStatObjectIngExactMatch\n\r"))); 21174 return BCM_E_PARAM; 21175 } 21176 21177 if ((bcmStatObjectIngFieldStageIngress == stat_obj) || 21178 (bcmStatObjectIngExactMatch == stat_obj)){ 21179 /* Get flex stat attributes array for the given flex stat Id. */ 21180 rv = _bcm_flex_ctr_field_stat_types_get(unit, flex_sid, 21181 stat_attr, &nattr); 21182 BCM_IF_ERROR_RETURN(rv); 21183 21184 sal_memset(stat_arr, 0, sizeof(stat_arr)); 21185 21186 /* Get the field stat types from flex stat attributes array. */ 21187 rv = _bcm_field_stat_array_get(unit, nattr, stat_attr, &nstat, stat_arr); 21188 BCM_IF_ERROR_RETURN(rv); 21189 } else { 21190 nstat = 2; 21191 stat_arr[0] = bcmFieldStatBytes; 21192 stat_arr[1] = bcmFieldStatPackets; 21193 } 21194 21195 FP_LOCK(unit); 21196 21197 /* Create field stat corrsponding to flext stat id. */ 21198 rv = bcm_esw_field_stat_create(unit, field_group, nstat, 21199 stat_arr, (int *)stat_id); 21200 21201 if (BCM_FAILURE(rv)) { 21202 FP_UNLOCK(unit); 21203 return (rv); 21204 } 21205 21206 /* Get the newly created stat operational structure. */ 21207 rv = _bcm_field_stat_get(unit, *stat_id, &f_st); 21208 if(BCM_FAILURE(rv)) { 21209 FP_UNLOCK(unit); 21210 bcm_esw_field_stat_destroy(unit,*stat_id); 21211 return rv; 21212 } 21213 21214 if ((bcmStatObjectIngFieldStageIngress == stat_obj) || 21215 (bcmStatObjectIngExactMatch == stat_obj)){ 21216 /* Get application requested bitmap. */ 21217 BCM_IF_ERROR_RETURN 21218 (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap)); 21219 21220 fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl); 21221 21222 for (idx = 0; idx < fp_stat_mode_max; idx++) { 21223 hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap; 21224 num_hw_cntrs = th_ingress_cntr_hw_mode_tbl[idx].hw_entry_count; 21225 21226 if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) { 21227 /* 21228 * For maximizing utilization of hardware counters, this should 21229 * select the hw_mode both supports the requested stats 21230 * AND minimizes the number of required hardware counters. 21231 */ 21232 break; 21233 } 21234 } 21235 } else { 21236 num_hw_cntrs = 1; 21237 } 21238 21239 /* Update the flex mode with flex stat id so that during entry installs 21240 * h/w resources will not be allocated again. Also update the other 21241 * Stat attributes. 21242 */ 21243 f_st->flex_mode = flex_sid; 21244 f_st->pool_index = pool_num; 21245 f_st->hw_index = base_index; 21246 f_st->hw_mode = offset_mode; 21247 f_st->hw_entry_count = num_hw_cntrs; 21248 f_st->hw_flags |= _FP_STAT_CREATED_BY_FLEX_MODULE; 21249 FP_UNLOCK(unit); 21250 21251 return BCM_E_NONE; 21252 } 21253 /* 21254 * Function: 21255 * _bcm_field_group_flex_ctr_info_get 21256 * Purpose: 21257 * To get the miscellaenous information about field group. 21258 * Parameters: 21259 * unit - (IN) BCM device number. 21260 * group - (IN) Field groups Id. 21261 * instance - (OUT) Pipe to which Field groupd belongs to. 21262 * counter_pool_bmp - (OUT) Bitmap of flex Counter pools in which 21263 * counters are allocated for field group. 21264 * Returns: 21265 * BCM_E_XXX 21266 */ 21267 int 21268 _bcm_field_group_flex_ctr_info_get(int unit, 21269 bcm_field_group_t group, int *instance, 21270 _field_counter_pool_bmp_t *counter_pool_bmp) 21271 { 21272 int rv; /* Operation Status. */ 21273 _field_group_t *fg = NULL; /* Group Operational Structure. */ 21274 bcm_field_group_oper_mode_t mode; /* Stage Group operational mode. */ 21275 bcm_field_qualify_t stage; 21276 21277 if (NULL == instance || NULL == counter_pool_bmp) { 21278 return BCM_E_PARAM; 21279 } 21280 21281 /* Get the group operational structure. */ 21282 BCM_IF_ERROR_RETURN(_field_group_get(unit, group, &fg)); 21283 21284 21285 if (fg->stage_id == _BCM_FIELD_STAGE_INGRESS) { 21286 stage = bcmFieldQualifyStageIngress; 21287 } else if (fg->stage_id == _BCM_FIELD_STAGE_LOOKUP) { 21288 stage = bcmFieldQualifyStageLookup; 21289 } else if (fg->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 21290 stage = bcmFieldQualifyStageIngressExactMatch; 21291 } 21292 #if defined(BCM_TRIDENT3_SUPPORT) 21293 else if (soc_feature(unit, soc_feature_td3_style_fp) && 21294 (fg->stage_id == _BCM_FIELD_STAGE_EGRESS)) { 21295 stage = bcmFieldQualifyStageEgress; 21296 } 21297 #endif 21298 else { 21299 return (BCM_E_PARAM); 21300 } 21301 21302 /* Get the field stage's group operational mode. */ 21303 rv = _bcm_field_th_group_oper_mode_get(unit, stage, &mode); 21304 BCM_IF_ERROR_RETURN(rv); 21305 21306 if (bcmFieldGroupOperModePipeLocal == mode) { 21307 /* Group instance holds pipe to which this group belongs to. */ 21308 *instance = fg->instance; 21309 } else if (bcmFieldGroupOperModeGlobal == mode) { 21310 /* In global mode group instance is set to _FP_DEF_INST(= 0), So to 21311 * dis ambiguate from pipe 0 in PipeLocal mode, instance is given back 21312 * as -1. 21313 */ 21314 *instance = _FP_GLOBAL_INST; 21315 } else { 21316 /* No other mode are supported. */ 21317 return BCM_E_INTERNAL; 21318 } 21319 21320 /* Copy counter pool bitmap from group operational structure. */ 21321 sal_memcpy(counter_pool_bmp, &fg->counter_pool_bmp, 21322 sizeof(_field_counter_pool_bmp_t)); 21323 21324 return BCM_E_NONE; 21325 } 21326 /* 21327 * Function: 21328 * _bcm_field_group_flex_ctr_pool_bmp_update 21329 * Purpose: 21330 * Update the counter pool bitmap of field group. 21331 * Parameters: 21332 * unit - (IN) BCM device number. 21333 * group - (IN) Field groups Id. 21334 * pool_number - (IN) Flex counter pool number. 21335 * Returns: 21336 * BCM_E_XXX 21337 */ 21338 int 21339 _bcm_field_group_flex_ctr_pool_bmp_update(int unit, 21340 bcm_field_group_t group, 21341 int pool_number) 21342 { 21343 _field_group_t *fg = NULL; /* Group Operational Structure. */ 21344 21345 /* Get the group operational structure. */ 21346 BCM_IF_ERROR_RETURN(_field_group_get(unit, group, &fg)); 21347 21348 /*Update the group's flex counter pool bitmap. */ 21349 _FP_COUNTER_POOL_BMP_ADD(fg->counter_pool_bmp, pool_number); 21350 21351 return BCM_E_NONE; 21352 } 21353 21354 /* 21355 * Function: 21356 * _bcm_field_th_em_color_offset_get 21357 * Purpose: 21358 * Get Color offsets for given field stat entry. 21359 * Parameters: 21360 * unit - (IN) BCM device number. 21361 * f_st - (IN) Field Stat Entry. 21362 * green_offset - (OUT) Green Color Offset. 21363 * yellow_offset - (OUT) Yellow Color Offset. 21364 * red_offset - (OUT) Red Color Offset. 21365 * Returns: 21366 * BCM_E_XXX 21367 */ 21368 int 21369 _bcm_field_th_em_color_offset_get(int unit, _field_stat_t *f_st, 21370 uint32 *green_offset, 21371 uint32 *yellow_offset, 21372 uint32 *red_offset) 21373 { 21374 int rv = BCM_E_NONE; /* Return Operational Status. */ 21375 uint32 req_bmap; /* Requested statistics bitmap. */ 21376 uint8 idx; /* HW counter modes iterator. */ 21377 uint32 hw_bmap; /* HW supported statistics bitmap. */ 21378 _field_stat_color_t color; 21379 /* Flex Stat Mode in s/w. */ 21380 int fp_stat_mode_max; /* Max stat modes. */ 21381 21382 /* Input Parameter Check. */ 21383 if ((f_st == NULL) || 21384 (green_offset == NULL) || 21385 (yellow_offset == NULL) || 21386 (red_offset == NULL)) { 21387 return (BCM_E_INTERNAL); 21388 } 21389 21390 /* Get application requested bitmap. */ 21391 BCM_IF_ERROR_RETURN 21392 (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap)); 21393 21394 /* If bitmap is zero - no mode selection is required. */ 21395 if (0 == req_bmap) { 21396 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 21397 "FP(unit %d): No Valid stats.\n "), unit)); 21398 return BCM_E_INTERNAL; 21399 } 21400 21401 fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl); 21402 21403 for (idx = 0; idx < fp_stat_mode_max; idx++) { 21404 hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap; 21405 color = th_ingress_cntr_hw_mode_tbl[idx].color; 21406 21407 if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) { 21408 /* 21409 * For maximizing utilization of hardware counters, this should 21410 * select the hw_mode both supports the requested stats 21411 * AND minimizes the number of required hardware counters. 21412 */ 21413 break; 21414 } 21415 } 21416 21417 if (idx >= fp_stat_mode_max) { 21418 return (BCM_E_INTERNAL); 21419 } 21420 21421 switch (color) { 21422 case _bcmFieldStatColorGreen: 21423 *green_offset = 1; 21424 *yellow_offset = 0; 21425 *red_offset = 0; 21426 break; 21427 case _bcmFieldStatColorYellow: 21428 *green_offset = 0; 21429 *yellow_offset = 1; 21430 *red_offset = 0; 21431 break; 21432 case _bcmFieldStatColorRed: 21433 *green_offset = 0; 21434 *yellow_offset = 0; 21435 *red_offset = 1; 21436 break; 21437 case _bcmFieldStatColorNotGreen: 21438 *green_offset = 0; 21439 *yellow_offset = 1; 21440 *red_offset = 1; 21441 break; 21442 case _bcmFieldStatColorNotYellow: 21443 *green_offset = 1; 21444 *yellow_offset = 0; 21445 *red_offset = 1; 21446 break; 21447 case _bcmFieldStatColorNotRed: 21448 *green_offset = 1; 21449 *yellow_offset = 1; 21450 *red_offset = 0; 21451 break; 21452 case _bcmFieldStatColorGreenYellow: 21453 *green_offset = 1; 21454 *yellow_offset = 2; 21455 *red_offset = 0; 21456 break; 21457 case _bcmFieldStatColorGreenRed: 21458 *green_offset = 1; 21459 *yellow_offset = 0; 21460 *red_offset = 2; 21461 break; 21462 case _bcmFieldStatColorYellowRed: 21463 *green_offset = 0; 21464 *yellow_offset = 1; 21465 *red_offset = 2; 21466 break; 21467 case _bcmFieldStatColorGreenNotGreen: 21468 *green_offset = 1; 21469 *yellow_offset = 2; 21470 *red_offset = 2; 21471 break; 21472 case _bcmFieldStatColorYellowNotYellow: 21473 *green_offset = 2; 21474 *yellow_offset = 1; 21475 *red_offset = 2; 21476 break; 21477 case _bcmFieldStatColorRedNotRed: 21478 *green_offset = 2; 21479 *yellow_offset = 2; 21480 *red_offset = 1; 21481 break; 21482 case _bcmFieldStatColorNoColor: 21483 *green_offset = 1; 21484 *yellow_offset = 1; 21485 *red_offset = 1; 21486 break; 21487 case _bcmFieldStatColorGreenYellowRed: 21488 *green_offset = 1; 21489 *yellow_offset = 2; 21490 *red_offset = 3; 21491 break; 21492 default: 21493 return (BCM_E_INTERNAL); 21494 } 21495 21496 return (rv); 21497 } 21498 /* 21499 * Function: 21500 * _bcm_field_th_flex_counter_info_get 21501 * Purpose: 21502 * Get the free and total flex counters available for group. 21503 * Parameters: 21504 * unit - (IN) BCM device number. 21505 * fg - (IN) Field Group. 21506 * counters_total - (OUT) Total Flex counters available for this group. 21507 * counters_free - (OUT) Free Flex counters available for this group. 21508 * Returns: 21509 * BCM_E_XXX 21510 */ 21511 int 21512 _bcm_field_th_flex_counter_status_get(int unit, 21513 _field_group_t *fg, 21514 int *counters_total, 21515 int *counters_free) 21516 { 21517 int rv = BCM_E_NONE; /* Operational Status. */ 21518 int pipe_no = 0; 21519 _field_stage_t *stage_fc; /* pipeline stage */ 21520 uint8 idx = 0; /* Index to iterate through flex counter pools. */ 21521 uint32 num_pools = 0; /* Number of flex counter Pools. */ 21522 bcm_stat_flex_pool_stat_info_t *flex_pool_info; /* Flex stat pool Info. */ 21523 21524 if (NULL == fg || NULL == counters_total || NULL == counters_free) { 21525 return BCM_E_PARAM; 21526 } 21527 21528 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id, 21529 &stage_fc)); 21530 if(stage_fc->oper_mode == bcmFieldGroupOperModePipeLocal) { 21531 pipe_no = fg->instance; 21532 } else { 21533 pipe_no = 0; 21534 } 21535 21536 flex_pool_info = NULL; 21537 rv =_bcm_esw_stat_flex_pipe_pool_info_multi_get(unit, 21538 bcmStatFlexDirectionIngress, 21539 pipe_no, 0, flex_pool_info, 21540 &num_pools); 21541 BCM_IF_ERROR_RETURN(rv); 21542 21543 /* Tomahawk has only 20 Ingress flex counter pools(from pool-0 - pool-19) */ 21544 if (num_pools > 20) { 21545 return BCM_E_INTERNAL; 21546 } 21547 21548 _FP_XGS3_ALLOC(flex_pool_info, 21549 num_pools * sizeof(bcm_stat_flex_pool_stat_info_t), 21550 "Ingress Flex Pool Information"); 21551 21552 if (NULL == flex_pool_info) { 21553 return BCM_E_MEMORY; 21554 } 21555 21556 rv = _bcm_esw_stat_flex_pipe_pool_info_multi_get(unit, 21557 bcmStatFlexDirectionIngress, 21558 pipe_no, num_pools, 21559 flex_pool_info, &num_pools); 21560 if (BCM_FAILURE(rv)) { 21561 sal_free(flex_pool_info); 21562 return rv; 21563 } 21564 21565 *counters_free = 0; 21566 *counters_total = 0; 21567 21568 for (idx = 0; idx < num_pools; idx++) { 21569 21570 /* Pools 12 to 19 are only dedicated to IFP. */ 21571 if ((_BCM_FIELD_STAGE_LOOKUP == fg->stage_id) && 21572 (flex_pool_info[idx].pool_id > 11)) { 21573 continue; 21574 } 21575 21576 if (!flex_pool_info[idx].used_entries) { 21577 *counters_free += flex_pool_info[idx].free_entries; 21578 *counters_total += flex_pool_info[idx].total_entries; 21579 } else { 21580 *counters_total += flex_pool_info[idx].total_entries; 21581 if (_FP_COUNTER_POOL_BMP_TEST(fg->counter_pool_bmp, 21582 flex_pool_info[idx].pool_id)) { 21583 *counters_free += flex_pool_info[idx].free_entries; 21584 } 21585 } 21586 } 21587 21588 sal_free(flex_pool_info); 21589 return BCM_E_NONE; 21590 } 21591 /* 21592 * Function: 21593 * _field_th_ingress_stat_hw_alloc 21594 * 21595 * Purpose: 21596 * Allocate flex stat hardware resource for Ingress stage 21597 * 21598 * Parameters: 21599 * unit - (IN) BCM device number. 21600 * f_ent - (IN) Entry array policer belongs to. 21601 * Returns: 21602 * BCM_E_XXX 21603 */ 21604 STATIC int 21605 _field_th_ingress_stat_hw_alloc(int unit, _field_entry_t *f_ent) 21606 { 21607 int rv; /* Return Operational Status. */ 21608 int fp_stat_mode_max; /* Max stat modes. */ 21609 uint8 idx; /* HW counter modes iterator. */ 21610 uint32 flex_sid; /* Flex Stat ID. */ 21611 uint32 num_hw_cntrs; /* Number of counters allocated. */ 21612 uint32 pool_num; /* Flex Stat Hw Pool No. */ 21613 uint32 base_index; /* Flex Stat counter base index. */ 21614 uint32 num_selectors; /* NUmber of flex attr slectors. */ 21615 uint32 req_bmap; /* Requested statistics bitmap. */ 21616 uint32 hw_bmap; /* HW supported statistics bitmap. */ 21617 uint32 mode_id; /* Flex Stat Mode. */ 21618 uint32 num_counters; /* Number of flex counters required. */ 21619 _field_stat_color_t color; /* Flex Stat Mode in s/w. */ 21620 _field_entry_stat_t *f_ent_st; /* Field entry stat collector. */ 21621 _field_stat_t *f_st; /* Field statistics descriptor. */ 21622 bcm_stat_flex_mode_t offset_mode; /* Counter mode. */ 21623 bcm_stat_group_mode_t stat_mode; /* Stat type bcmStatGroupModeXXX. */ 21624 bcm_stat_object_t stat_obj; /* Stat object type. */ 21625 bcm_stat_group_mode_id_config_t stat_config; /* Flex stat configuration. */ 21626 bcm_stat_group_mode_attr_selector_t attr_sel[6]; /* Flext stat Attribute 21627 * selector structure. */ 21628 bcm_stat_object_t object; /* Field stat object. */ 21629 21630 /* Input parameters check. */ 21631 if (NULL == f_ent) { 21632 return (BCM_E_PARAM); 21633 } 21634 21635 /* Get field entry STAT structure. */ 21636 f_ent_st = &f_ent->statistic; 21637 21638 /* Read STAT configuration. */ 21639 rv = (_bcm_field_stat_get(unit, f_ent_st->sid, &f_st)); 21640 if (rv == BCM_E_NOT_FOUND) { 21641 /* No Stats attached */ 21642 return BCM_E_NONE; 21643 } else if (BCM_FAILURE(rv)) { 21644 return rv; 21645 } 21646 21647 /* If counter is disabled skip allocation. */ 21648 if (0 == f_st->hw_stat) { 21649 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 21650 "FP(unit %d): Stat is not enabled.\n "), unit)); 21651 return (BCM_E_INTERNAL); 21652 } 21653 21654 /* Get application requested bitmap. */ 21655 BCM_IF_ERROR_RETURN 21656 (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap)); 21657 21658 /* If bitmap is zero - no mode selection is required. */ 21659 if (0 == req_bmap) { 21660 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 21661 "FP(unit %d): No Valid stats.\n "), unit)); 21662 return BCM_E_INTERNAL; 21663 } 21664 21665 21666 if (_FP_INVALID_INDEX == f_st->hw_index) { 21667 fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl); 21668 21669 for (idx = 0; idx < fp_stat_mode_max; idx++) { 21670 21671 hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap; 21672 num_hw_cntrs = th_ingress_cntr_hw_mode_tbl[idx].hw_entry_count; 21673 color = th_ingress_cntr_hw_mode_tbl[idx].color; 21674 21675 if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) { 21676 /* 21677 * For maximizing utilization of hardware counters, this should 21678 * select the hw_mode both supports the requested stats 21679 * AND minimizes the number of required hardware counters. 21680 */ 21681 break; 21682 } 21683 } 21684 21685 if (idx >= fp_stat_mode_max) { 21686 return (BCM_E_INTERNAL); 21687 } 21688 21689 for (idx = 0; idx < 6; idx++) { 21690 /* Initialize attribute selectors to 0 */ 21691 bcm_stat_group_mode_attr_selector_t_init(&attr_sel[idx]); 21692 } 21693 21694 switch (color) { 21695 case _bcmFieldStatColorGreen: 21696 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21697 attr_sel[0].attr_value = bcmColorGreen; 21698 attr_sel[0].counter_offset = 0; 21699 num_selectors = 1; 21700 num_counters = 1; 21701 break; 21702 case _bcmFieldStatColorYellow: 21703 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21704 attr_sel[0].attr_value = bcmColorYellow; 21705 attr_sel[0].counter_offset = 0; 21706 num_selectors = 1; 21707 num_counters = 1; 21708 break; 21709 case _bcmFieldStatColorRed: 21710 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21711 attr_sel[0].attr_value = bcmColorRed; 21712 attr_sel[0].counter_offset = 0; 21713 num_selectors = 1; 21714 num_counters = 1; 21715 break; 21716 case _bcmFieldStatColorNotGreen: 21717 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21718 attr_sel[0].attr_value = bcmColorYellow; 21719 attr_sel[0].counter_offset = 0; 21720 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21721 attr_sel[1].attr_value = bcmColorRed; 21722 attr_sel[1].counter_offset = 0; 21723 num_selectors = 2; 21724 num_counters = 1; 21725 break; 21726 case _bcmFieldStatColorNotYellow: 21727 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21728 attr_sel[0].attr_value = bcmColorGreen; 21729 attr_sel[0].counter_offset = 0; 21730 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21731 attr_sel[1].attr_value = bcmColorRed; 21732 attr_sel[1].counter_offset = 0; 21733 num_selectors = 2; 21734 num_counters = 1; 21735 break; 21736 case _bcmFieldStatColorNotRed: 21737 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21738 attr_sel[0].attr_value = bcmColorGreen; 21739 attr_sel[0].counter_offset = 0; 21740 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21741 attr_sel[1].attr_value = bcmColorYellow; 21742 attr_sel[1].counter_offset = 0; 21743 num_selectors = 2; 21744 num_counters = 1; 21745 break; 21746 case _bcmFieldStatColorGreenYellow: 21747 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21748 attr_sel[0].attr_value = bcmColorGreen; 21749 attr_sel[0].counter_offset = 0; 21750 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21751 attr_sel[1].attr_value = bcmColorYellow; 21752 attr_sel[1].counter_offset = 1; 21753 num_selectors = 2; 21754 num_counters = 2; 21755 break; 21756 case _bcmFieldStatColorGreenRed: 21757 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21758 attr_sel[0].attr_value = bcmColorGreen; 21759 attr_sel[0].counter_offset = 0; 21760 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21761 attr_sel[1].attr_value = bcmColorRed; 21762 attr_sel[1].counter_offset = 1; 21763 num_selectors = 2; 21764 num_counters = 2; 21765 break; 21766 case _bcmFieldStatColorYellowRed: 21767 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21768 attr_sel[0].attr_value = bcmColorYellow; 21769 attr_sel[0].counter_offset = 0; 21770 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21771 attr_sel[1].attr_value = bcmColorRed; 21772 attr_sel[1].counter_offset = 1; 21773 num_selectors = 2; 21774 num_counters = 2; 21775 break; 21776 case _bcmFieldStatColorGreenNotGreen: 21777 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21778 attr_sel[0].attr_value = bcmColorGreen; 21779 attr_sel[0].counter_offset = 0; 21780 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21781 attr_sel[1].attr_value = bcmColorYellow; 21782 attr_sel[1].counter_offset = 1; 21783 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor; 21784 attr_sel[2].attr_value = bcmColorRed; 21785 attr_sel[2].counter_offset = 1; 21786 num_selectors = 3; 21787 num_counters = 2; 21788 break; 21789 case _bcmFieldStatColorYellowNotYellow: 21790 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21791 attr_sel[0].attr_value = bcmColorYellow; 21792 attr_sel[0].counter_offset = 0; 21793 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21794 attr_sel[1].attr_value = bcmColorGreen; 21795 attr_sel[1].counter_offset = 1; 21796 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor; 21797 attr_sel[2].attr_value = bcmColorRed; 21798 attr_sel[2].counter_offset = 1; 21799 num_selectors = 3; 21800 num_counters = 2; 21801 break; 21802 case _bcmFieldStatColorRedNotRed: 21803 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21804 attr_sel[0].attr_value = bcmColorRed; 21805 attr_sel[0].counter_offset = 0; 21806 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21807 attr_sel[1].attr_value = bcmColorGreen; 21808 attr_sel[1].counter_offset = 1; 21809 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor; 21810 attr_sel[2].attr_value = bcmColorYellow; 21811 attr_sel[2].counter_offset = 1; 21812 num_selectors = 3; 21813 num_counters = 2; 21814 break; 21815 case _bcmFieldStatColorNoColor: 21816 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21817 attr_sel[0].attr_value = bcmColorGreen; 21818 attr_sel[0].counter_offset = 0; 21819 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21820 attr_sel[1].attr_value = bcmColorYellow; 21821 attr_sel[1].counter_offset = 0; 21822 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor; 21823 attr_sel[2].attr_value = bcmColorRed; 21824 attr_sel[2].counter_offset = 0; 21825 num_selectors = 3; 21826 num_counters = 1; 21827 break; 21828 case _bcmFieldStatColorGreenYellowRed: 21829 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21830 attr_sel[0].attr_value = bcmColorGreen; 21831 attr_sel[0].counter_offset = 0; 21832 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 21833 attr_sel[1].attr_value = bcmColorYellow; 21834 attr_sel[1].counter_offset = 1; 21835 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor; 21836 attr_sel[2].attr_value = bcmColorRed; 21837 attr_sel[2].counter_offset = 2; 21838 num_selectors = 3; 21839 num_counters = 3; 21840 break; 21841 default: 21842 return BCM_E_INTERNAL; 21843 } 21844 21845 /* Create custom counter update mode */ 21846 bcm_stat_group_mode_id_config_t_init(&stat_config); 21847 stat_config.flags = BCM_STAT_GROUP_MODE_INGRESS; 21848 stat_config.hint.type = bcmStatGroupAllocHintIngressFieldGroup; 21849 object = bcmStatObjectIngFieldStageIngress; 21850 stat_config.total_counters = num_counters; 21851 stat_config.hint.value = f_ent->group->gid; /* group id returned by 21852 * field_group_create()*/ 21853 rv = bcm_esw_stat_group_mode_id_config_create(unit, 0, &stat_config, 21854 num_selectors, attr_sel, 21855 &mode_id); 21856 BCM_IF_ERROR_RETURN(rv); 21857 21858 /* Create custom stat group */ 21859 rv = bcm_esw_stat_custom_group_create(unit, mode_id, object, 21860 &flex_sid, &num_hw_cntrs); 21861 BCM_IF_ERROR_RETURN(rv); 21862 21863 /* Get flex counter hardware details stored in flex stat ID.*/ 21864 _bcm_esw_stat_get_counter_id_info(unit, flex_sid, 21865 &stat_mode, 21866 &stat_obj, 21867 &offset_mode, 21868 &pool_num, 21869 &base_index); 21870 21871 /* If the pool is not set to in use for the group, set it now. */ 21872 if (!_FP_COUNTER_POOL_BMP_TEST( 21873 f_ent->group->counter_pool_bmp, pool_num)) { 21874 _FP_COUNTER_POOL_BMP_ADD(f_ent->group->counter_pool_bmp, pool_num); 21875 } 21876 21877 /* Store flex stat hardware details in stat data structure. */ 21878 f_st->flex_mode = flex_sid; 21879 f_st->pool_index = pool_num; 21880 f_st->hw_index = base_index; 21881 f_st->hw_mode = offset_mode; 21882 f_st->hw_entry_count = num_hw_cntrs; 21883 /* Increment the group counters count equal to 21884 the hw entries count .*/ 21885 f_ent->group->group_status.counter_count = 21886 f_ent->group->group_status.counter_count + num_hw_cntrs; 21887 } 21888 21889 return (BCM_E_NONE); 21890 } 21891 21892 /* 21893 * Function: 21894 * _field_th_exactmatch_stat_hw_alloc 21895 * Purpose: 21896 * Allocate flex stat hardware resource for Exact Match stage 21897 * Parameters: 21898 * unit - (IN) BCM device number. 21899 * f_ent - (IN) Entry array policer belongs to. 21900 * Returns: 21901 * BCM_E_XXX 21902 */ 21903 STATIC int 21904 _field_th_exactmatch_stat_hw_alloc(int unit, _field_entry_t *f_ent) 21905 { 21906 int rv; /* Return Operational Status. */ 21907 int fp_stat_mode_max; /* Max stat modes. */ 21908 uint8 idx; /* HW counter modes iterator. */ 21909 uint32 flex_sid; /* Flex Stat ID. */ 21910 uint32 num_hw_cntrs; /* Number of counters allocated. */ 21911 uint32 pool_num; /* Flex Stat Hw Pool No. */ 21912 uint32 base_index; /* Flex Stat counter base index. */ 21913 uint32 num_selectors; /* NUmber of flex attr slectors. */ 21914 uint32 req_bmap; /* Requested statistics bitmap. */ 21915 uint32 hw_bmap; /* HW supported statistics bitmap. */ 21916 uint32 mode_id; /* Flex Stat Mode. */ 21917 uint32 num_counters; /* Number of flex counters required. */ 21918 _field_stat_color_t color; /* Flex Stat Mode in s/w. */ 21919 _field_entry_stat_t *f_ent_st; /* Field entry stat collector. */ 21920 _field_stat_t *f_st; /* Field statistics descriptor. */ 21921 bcm_stat_flex_mode_t offset_mode; /* Counter mode. */ 21922 bcm_stat_group_mode_t stat_mode; /* Stat type bcmStatGroupModeXXX. */ 21923 bcm_stat_object_t stat_obj; /* Stat object type. */ 21924 bcm_stat_group_mode_id_config_t stat_config; /* Flex stat configuration. */ 21925 bcm_stat_group_mode_attr_selector_t attr_sel[6]; /* Flext stat Attribute 21926 * selector structure. */ 21927 bcm_stat_object_t object; /* Field stat object. */ 21928 21929 /* Input parameters check. */ 21930 if (NULL == f_ent) { 21931 return (BCM_E_PARAM); 21932 } 21933 21934 /* Get field entry STAT structure. */ 21935 f_ent_st = &f_ent->statistic; 21936 21937 /* Read STAT configuration. */ 21938 rv = (_bcm_field_stat_get(unit, f_ent_st->sid, &f_st)); 21939 if (rv == BCM_E_NOT_FOUND) { 21940 /* No Stats attached */ 21941 return BCM_E_NONE; 21942 } else if (BCM_FAILURE(rv)) { 21943 return rv; 21944 } 21945 21946 /* If counter is disabled skip allocation. */ 21947 if (0 == f_st->hw_stat) { 21948 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 21949 "FP(unit %d): Stat is not enabled.\n "), unit)); 21950 return (BCM_E_INTERNAL); 21951 } 21952 21953 /* Get application requested bitmap. */ 21954 BCM_IF_ERROR_RETURN 21955 (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap)); 21956 21957 /* If bitmap is zero - no mode selection is required. */ 21958 if (0 == req_bmap) { 21959 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 21960 "FP(unit %d): No Valid stats.\n "), unit)); 21961 return BCM_E_INTERNAL; 21962 } 21963 21964 21965 if (_FP_INVALID_INDEX == f_st->hw_index) { 21966 fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl); 21967 21968 for (idx = 0; idx < fp_stat_mode_max; idx++) { 21969 21970 hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap; 21971 num_hw_cntrs = th_ingress_cntr_hw_mode_tbl[idx].hw_entry_count; 21972 color = th_ingress_cntr_hw_mode_tbl[idx].color; 21973 21974 if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) { 21975 /* 21976 * For maximizing utilization of hardware counters, this should 21977 * select the hw_mode both supports the requested stats 21978 * AND minimizes the number of required hardware counters. 21979 */ 21980 break; 21981 } 21982 } 21983 21984 if (idx >= fp_stat_mode_max) { 21985 return (BCM_E_INTERNAL); 21986 } 21987 21988 for (idx = 0; idx < 6; idx++) { 21989 /* Initialize attribute selectors to 0 */ 21990 bcm_stat_group_mode_attr_selector_t_init(&attr_sel[idx]); 21991 } 21992 21993 switch (color) { 21994 case _bcmFieldStatColorGreen: 21995 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 21996 attr_sel[0].attr_value = bcmColorGreen; 21997 attr_sel[0].counter_offset = 0; 21998 num_selectors = 1; 21999 num_counters = 1; 22000 break; 22001 case _bcmFieldStatColorYellow: 22002 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22003 attr_sel[0].attr_value = bcmColorYellow; 22004 attr_sel[0].counter_offset = 0; 22005 num_selectors = 1; 22006 num_counters = 1; 22007 break; 22008 case _bcmFieldStatColorRed: 22009 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22010 attr_sel[0].attr_value = bcmColorRed; 22011 attr_sel[0].counter_offset = 0; 22012 num_selectors = 1; 22013 num_counters = 1; 22014 break; 22015 case _bcmFieldStatColorNotGreen: 22016 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22017 attr_sel[0].attr_value = bcmColorYellow; 22018 attr_sel[0].counter_offset = 0; 22019 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22020 attr_sel[1].attr_value = bcmColorRed; 22021 attr_sel[1].counter_offset = 0; 22022 num_selectors = 2; 22023 num_counters = 1; 22024 break; 22025 case _bcmFieldStatColorNotYellow: 22026 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22027 attr_sel[0].attr_value = bcmColorGreen; 22028 attr_sel[0].counter_offset = 0; 22029 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22030 attr_sel[1].attr_value = bcmColorRed; 22031 attr_sel[1].counter_offset = 0; 22032 num_selectors = 2; 22033 num_counters = 1; 22034 break; 22035 case _bcmFieldStatColorNotRed: 22036 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22037 attr_sel[0].attr_value = bcmColorGreen; 22038 attr_sel[0].counter_offset = 0; 22039 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22040 attr_sel[1].attr_value = bcmColorYellow; 22041 attr_sel[1].counter_offset = 0; 22042 num_selectors = 2; 22043 num_counters = 1; 22044 break; 22045 case _bcmFieldStatColorGreenYellow: 22046 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22047 attr_sel[0].attr_value = bcmColorGreen; 22048 attr_sel[0].counter_offset = 0; 22049 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22050 attr_sel[1].attr_value = bcmColorYellow; 22051 attr_sel[1].counter_offset = 1; 22052 num_selectors = 2; 22053 num_counters = 2; 22054 break; 22055 case _bcmFieldStatColorGreenRed: 22056 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22057 attr_sel[0].attr_value = bcmColorGreen; 22058 attr_sel[0].counter_offset = 0; 22059 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22060 attr_sel[1].attr_value = bcmColorRed; 22061 attr_sel[1].counter_offset = 1; 22062 num_selectors = 2; 22063 num_counters = 2; 22064 break; 22065 case _bcmFieldStatColorYellowRed: 22066 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22067 attr_sel[0].attr_value = bcmColorYellow; 22068 attr_sel[0].counter_offset = 0; 22069 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22070 attr_sel[1].attr_value = bcmColorRed; 22071 attr_sel[1].counter_offset = 1; 22072 num_selectors = 2; 22073 num_counters = 2; 22074 break; 22075 case _bcmFieldStatColorGreenNotGreen: 22076 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22077 attr_sel[0].attr_value = bcmColorGreen; 22078 attr_sel[0].counter_offset = 0; 22079 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22080 attr_sel[1].attr_value = bcmColorYellow; 22081 attr_sel[1].counter_offset = 1; 22082 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor; 22083 attr_sel[2].attr_value = bcmColorRed; 22084 attr_sel[2].counter_offset = 1; 22085 num_selectors = 3; 22086 num_counters = 2; 22087 break; 22088 case _bcmFieldStatColorYellowNotYellow: 22089 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22090 attr_sel[0].attr_value = bcmColorYellow; 22091 attr_sel[0].counter_offset = 0; 22092 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22093 attr_sel[1].attr_value = bcmColorGreen; 22094 attr_sel[1].counter_offset = 1; 22095 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor; 22096 attr_sel[2].attr_value = bcmColorRed; 22097 attr_sel[2].counter_offset = 1; 22098 num_selectors = 3; 22099 num_counters = 2; 22100 break; 22101 case _bcmFieldStatColorRedNotRed: 22102 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22103 attr_sel[0].attr_value = bcmColorRed; 22104 attr_sel[0].counter_offset = 0; 22105 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22106 attr_sel[1].attr_value = bcmColorGreen; 22107 attr_sel[1].counter_offset = 1; 22108 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor; 22109 attr_sel[2].attr_value = bcmColorYellow; 22110 attr_sel[2].counter_offset = 1; 22111 num_selectors = 3; 22112 num_counters = 2; 22113 break; 22114 case _bcmFieldStatColorNoColor: 22115 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22116 attr_sel[0].attr_value = bcmColorGreen; 22117 attr_sel[0].counter_offset = 0; 22118 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22119 attr_sel[1].attr_value = bcmColorYellow; 22120 attr_sel[1].counter_offset = 0; 22121 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor; 22122 attr_sel[2].attr_value = bcmColorRed; 22123 attr_sel[2].counter_offset = 0; 22124 num_selectors = 3; 22125 num_counters = 1; 22126 break; 22127 case _bcmFieldStatColorGreenYellowRed: 22128 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor; 22129 attr_sel[0].attr_value = bcmColorGreen; 22130 attr_sel[0].counter_offset = 0; 22131 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor; 22132 attr_sel[1].attr_value = bcmColorYellow; 22133 attr_sel[1].counter_offset = 1; 22134 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor; 22135 attr_sel[2].attr_value = bcmColorRed; 22136 attr_sel[2].counter_offset = 2; 22137 num_selectors = 3; 22138 num_counters = 3; 22139 break; 22140 default: 22141 return BCM_E_INTERNAL; 22142 } 22143 22144 /* Create custom counter update mode */ 22145 bcm_stat_group_mode_id_config_t_init(&stat_config); 22146 stat_config.flags = BCM_STAT_GROUP_MODE_INGRESS; 22147 stat_config.hint.type = bcmStatGroupAllocHintExactMatchFieldGroup; 22148 object = bcmStatObjectIngExactMatch; 22149 stat_config.total_counters = num_counters; 22150 stat_config.hint.value = f_ent->group->gid; /* group id returned by 22151 field_group_create()*/ 22152 rv = bcm_esw_stat_group_mode_id_config_create(unit, 0, &stat_config, 22153 num_selectors, attr_sel, 22154 &mode_id); 22155 BCM_IF_ERROR_RETURN(rv); 22156 22157 /* Create custom stat group */ 22158 rv = bcm_esw_stat_custom_group_create(unit, mode_id, object, 22159 &flex_sid, &num_hw_cntrs); 22160 BCM_IF_ERROR_RETURN(rv); 22161 22162 /* Get flex counter hardware details stored in flex stat ID.*/ 22163 _bcm_esw_stat_get_counter_id_info(unit, flex_sid, 22164 &stat_mode, 22165 &stat_obj, 22166 &offset_mode, 22167 &pool_num, 22168 &base_index); 22169 22170 /* If the pool is not set to in use for the group, set it now. */ 22171 if (!_FP_COUNTER_POOL_BMP_TEST( 22172 f_ent->group->counter_pool_bmp, pool_num)) { 22173 _FP_COUNTER_POOL_BMP_ADD(f_ent->group->counter_pool_bmp, pool_num); 22174 } 22175 22176 /* Store flex stat hardware details in stat data structure. */ 22177 f_st->flex_mode = flex_sid; 22178 f_st->pool_index = pool_num; 22179 f_st->hw_index = base_index; 22180 f_st->hw_mode = offset_mode; 22181 f_st->hw_entry_count = num_hw_cntrs; 22182 /* Increment the group counters count equal to 22183 the hw entries count .*/ 22184 f_ent->group->group_status.counter_count = 22185 f_ent->group->group_status.counter_count + num_hw_cntrs; 22186 } 22187 22188 return (BCM_E_NONE); 22189 } 22190 22191 22192 /* 22193 * Function: 22194 * _field_th_lookup_stat_hw_alloc 22195 * 22196 * Purpose: 22197 * Allocate flex stat hardware resource for lookup stage 22198 * 22199 * Parameters: 22200 * unit - (IN) BCM device number. 22201 * f_ent - (IN) Entry array policer belongs to. 22202 * Returns: 22203 * BCM_E_XXX 22204 */ 22205 STATIC int 22206 _field_th_lookup_stat_hw_alloc(int unit, _field_entry_t *f_ent) 22207 { 22208 int rv; /* Return Operational Status. */ 22209 uint8 idx; /* HW counter modes iterator. */ 22210 uint32 flex_sid; /* Flex Stat ID. */ 22211 uint32 num_hw_cntrs; /* Number of counters allocated. */ 22212 uint32 pool_num; /* Flex Stat Hw Pool No. */ 22213 uint32 base_index; /* Flex Stat counter base index. */ 22214 uint32 num_selectors; /* NUmber of flex attr slectors. */ 22215 uint32 req_bmap; /* Requested statistics bitmap. */ 22216 uint32 mode_id; /* Flex Stat Mode. */ 22217 uint32 num_counters; /* Number of flex counters required. */ 22218 _field_entry_stat_t *f_ent_st; /* Field entry stat collector. */ 22219 _field_stat_t *f_st; /* Field statistics descriptor. */ 22220 bcm_stat_flex_mode_t offset_mode; /* Counter mode. */ 22221 bcm_stat_group_mode_t stat_mode; /* Stat type bcmStatGroupModeXXX. */ 22222 bcm_stat_object_t stat_obj; /* Stat object type. */ 22223 bcm_stat_group_mode_id_config_t stat_config; /* Flex stat configuration. */ 22224 bcm_stat_group_mode_attr_selector_t attr_sel[6]; /* Flext stat Attribute 22225 * selector structure. */ 22226 bcm_stat_object_t object; /* Field stat object. */ 22227 22228 /* Input parameters check. */ 22229 if (NULL == f_ent) { 22230 return (BCM_E_PARAM); 22231 } 22232 22233 /* Get field entry STAT structure. */ 22234 f_ent_st = &f_ent->statistic; 22235 22236 /* Read STAT configuration. */ 22237 rv = (_bcm_field_stat_get(unit, f_ent_st->sid, &f_st)); 22238 if (rv == BCM_E_NOT_FOUND) { 22239 /* No Stats attached */ 22240 return BCM_E_NONE; 22241 } else if (BCM_FAILURE(rv)) { 22242 return rv; 22243 } 22244 22245 /* If counter is disabled skip allocation. */ 22246 if (0 == f_st->hw_stat) { 22247 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 22248 "FP(unit %d): Stat is not enabled.\n "), unit)); 22249 return (BCM_E_INTERNAL); 22250 } 22251 22252 /* Get application requested bitmap. */ 22253 BCM_IF_ERROR_RETURN 22254 (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap)); 22255 22256 /* If bitmap is zero - no mode selection is required. */ 22257 if (0 == req_bmap) { 22258 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 22259 "FP(unit %d): No Valid stats.\n "), unit)); 22260 return BCM_E_INTERNAL; 22261 } 22262 22263 22264 if (_FP_INVALID_INDEX == f_st->hw_index) { 22265 num_hw_cntrs = 1; 22266 22267 for (idx = 0; idx < 6; idx++) { 22268 /* Initialize attribute selectors to 0 */ 22269 bcm_stat_group_mode_attr_selector_t_init(&attr_sel[idx]); 22270 } 22271 22272 attr_sel[0].attr = bcmStatGroupModeAttrPktType; 22273 attr_sel[0].attr_value = BCM_STAT_GROUP_MODE_ATTR_ALL_VALUES; 22274 attr_sel[0].counter_offset = 0; 22275 num_selectors = 1; 22276 num_counters = 1; 22277 22278 /* Create custom counter update mode */ 22279 bcm_stat_group_mode_id_config_t_init(&stat_config); 22280 stat_config.flags = BCM_STAT_GROUP_MODE_INGRESS; 22281 stat_config.hint.type = bcmStatGroupAllocHintVlanFieldGroup; 22282 object = bcmStatObjectIngFieldStageLookup; 22283 stat_config.total_counters = num_counters; 22284 stat_config.hint.value = f_ent->group->gid; /* group id returned by 22285 * field_group_create()*/ 22286 rv = bcm_esw_stat_group_mode_id_config_create(unit, 0, &stat_config, 22287 num_selectors, attr_sel, 22288 &mode_id); 22289 BCM_IF_ERROR_RETURN(rv); 22290 22291 /* Create custom stat group */ 22292 rv = bcm_esw_stat_custom_group_create(unit, mode_id, object, 22293 &flex_sid, &num_hw_cntrs); 22294 BCM_IF_ERROR_RETURN(rv); 22295 22296 /* Get flex counter hardware details stored in flex stat ID.*/ 22297 _bcm_esw_stat_get_counter_id_info(unit, flex_sid, 22298 &stat_mode, 22299 &stat_obj, 22300 &offset_mode, 22301 &pool_num, 22302 &base_index); 22303 22304 /* If the pool is not set to in use for the group, set it now. */ 22305 if (!_FP_COUNTER_POOL_BMP_TEST( 22306 f_ent->group->counter_pool_bmp, pool_num)) { 22307 _FP_COUNTER_POOL_BMP_ADD(f_ent->group->counter_pool_bmp, pool_num); 22308 } 22309 22310 /* Store flex stat hardware details in stat data structure. */ 22311 f_st->flex_mode = flex_sid; 22312 f_st->pool_index = pool_num; 22313 f_st->hw_index = base_index; 22314 f_st->hw_mode = offset_mode; 22315 f_st->hw_entry_count = num_hw_cntrs; 22316 /* Increment the group counters count equal to 22317 the hw entries count .*/ 22318 f_ent->group->group_status.counter_count = 22319 f_ent->group->group_status.counter_count + num_hw_cntrs; 22320 } 22321 22322 return (BCM_E_NONE); 22323 } 22324 22325 22326 /* 22327 * Function: 22328 * _bcm_field_th_stat_hw_alloc 22329 * 22330 * Purpose: 22331 * Allocate Stat hardware resource 22332 * 22333 * Parameters: 22334 * unit - (IN) BCM device number. 22335 * f_ent - (IN) Entry array stat belongs to. 22336 * Returns: 22337 * BCM_E_XXX 22338 */ 22339 int 22340 _bcm_field_th_stat_hw_alloc(int unit, 22341 _field_entry_t *f_ent) 22342 { 22343 int rv = BCM_E_INTERNAL; /* Operational Status. */ 22344 22345 if (NULL == f_ent) { 22346 return BCM_E_PARAM; 22347 } 22348 22349 switch (f_ent->fs->stage_id) { 22350 case _BCM_FIELD_STAGE_INGRESS: 22351 rv = _field_th_ingress_stat_hw_alloc(unit, f_ent); 22352 break; 22353 case _BCM_FIELD_STAGE_EXACTMATCH: 22354 rv = _field_th_exactmatch_stat_hw_alloc(unit, f_ent); 22355 break; 22356 case _BCM_FIELD_STAGE_LOOKUP: 22357 rv = _field_th_lookup_stat_hw_alloc(unit, f_ent); 22358 break; 22359 case _BCM_FIELD_STAGE_EGRESS: 22360 #if defined BCM_TRIDENT3_SUPPORT 22361 if (soc_feature(unit, soc_feature_td3_style_fp)) { 22362 rv = _bcm_field_td2plus_stat_hw_alloc(unit, f_ent); 22363 } else 22364 #endif /* BCM_TRIDENT3_SUPPORT */ 22365 { 22366 rv = _bcm_field_stat_hw_alloc(unit, f_ent); 22367 } 22368 break; 22369 default: 22370 rv = _bcm_field_stat_hw_alloc(unit, f_ent); 22371 break; 22372 } 22373 22374 return rv; 22375 } 22376 /* 22377 * Function: 22378 * _bcm_field_th_flex_stat_action_set 22379 * Purpose: 22380 * Install flex counter update action into policy table. 22381 * Parameters: 22382 * unit - (IN) BCM device number 22383 * f_ent - (IN) entry structure to get policy info from 22384 * mem - (IN) Policy table memory 22385 * tcam_idx - (IN) Common index of various tables 22386 * buf - (OUT) Field Policy table entry 22387 * Returns: 22388 * BCM_E_XXX 22389 */ 22390 int 22391 _bcm_field_th_flex_stat_action_set(int unit, 22392 _field_entry_t *f_ent, 22393 soc_mem_t mem, 22394 int tcam_idx, 22395 uint32 *buf) 22396 { 22397 int rv; /* Return Operational Status. */ 22398 int idx; /* Stat array index. */ 22399 _field_stat_t *f_st; /* Field statistics descriptor. */ 22400 22401 22402 /* Increment statistics hw reference count. */ 22403 if ((f_ent->statistic.flags & _FP_ENTRY_STAT_VALID) 22404 && !(f_ent->statistic.flags & _FP_ENTRY_STAT_INSTALLED)) { 22405 /* Get statistics entity description structure. */ 22406 rv = _bcm_field_stat_get(unit, f_ent->statistic.sid, &f_st); 22407 BCM_IF_ERROR_RETURN(rv); 22408 22409 if (_FP_INVALID_INDEX != f_st->hw_index) { 22410 /* 22411 * For STATs that are shared by entries, hardware counters 22412 * are not allocated again. But reference count is incremented 22413 * for these counters. 22414 */ 22415 f_st->hw_ref_count++; 22416 22417 /* 22418 * Once flex counters have been allocated for the IFP/VFP, these 22419 * counters need to be attached to the appropriate IFP/VFP policy 22420 * table entry. Once flex counters have been attached by associating 22421 * them with the appropriate IFP/VFP policy table entry, counters 22422 * are now ready to be updated by corresponding packets. 22423 */ 22424 rv = _bcm_esw_stat_flex_attach_ingress_table_counters1(unit, mem, 22425 tcam_idx, f_st->hw_mode, 22426 f_st->hw_index, 22427 f_st->pool_index, buf); 22428 BCM_IF_ERROR_RETURN(rv); 22429 22430 /* Mark entry as installed. */ 22431 f_ent->statistic.flags |= _FP_ENTRY_STAT_INSTALLED; 22432 22433 /* 22434 * Write individual statistics previous value, first time 22435 * entry is installed in hardware. 22436 */ 22437 if (1 == f_st->hw_ref_count) { 22438 for (idx = 0; idx < f_st->nstat; idx++) { 22439 rv = _field_stat_value_set(unit, f_st, f_st->stat_arr[idx], 22440 f_st->stat_values[idx]); 22441 BCM_IF_ERROR_RETURN(rv); 22442 } 22443 } 22444 } 22445 } else { 22446 if (f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP) { 22447 /* Disable counters if it is not attached to the entry. */ 22448 PolicySet(unit, mem, buf, FLEX_CTR_OFFSET_MODEf, 0); 22449 PolicySet(unit, mem, buf, FLEX_CTR_POOL_NUMBERf, 0); 22450 PolicySet(unit, mem, buf, FLEX_CTR_BASE_COUNTER_IDXf, 0); 22451 } else { 22452 /* setting COUNTER_SETf to 0 will set FLEX_CTR_BASE_COUNTER_IDX, 22453 * FLEX_CTR_OFFSET_MODE, FLEX_CTR_POOL_NUMBER, G_COUNT, Y_COUNT and 22454 * R_COUNT fields to 0. 22455 */ 22456 PolicySet(unit, mem, buf, COUNTER_SETf, 0); 22457 } 22458 } 22459 22460 return (BCM_E_NONE); 22461 } 22462 22463 /* 22464 * Function: 22465 * _bcm_field_th_stat_action_set 22466 * Purpose: 22467 * Install counter update action into policy table. 22468 * Parameters: 22469 * unit - (IN) BCM device number 22470 * f_ent - (IN) entry structure to get policy info from 22471 * mem - (IN) Policy table memory 22472 * tcam_idx - (IN) Common index of various tables 22473 * buf - (OUT) Field Policy table entry 22474 * Returns: 22475 * BCM_E_XXX 22476 */ 22477 int 22478 _bcm_field_th_stat_action_set(int unit, _field_entry_t *f_ent, 22479 soc_mem_t mem, int tcam_idx, 22480 uint32 *buf) 22481 { 22482 int rv = BCM_E_NONE; /* Operation return status. */ 22483 22484 if (NULL == f_ent || NULL == buf) { 22485 return (BCM_E_PARAM); 22486 } 22487 22488 switch (f_ent->group->stage_id) { 22489 case _BCM_FIELD_STAGE_INGRESS: 22490 case _BCM_FIELD_STAGE_LOOKUP: 22491 case _BCM_FIELD_STAGE_EXACTMATCH: 22492 /* Tomahawk IFP/VFP uses Flex counters. */ 22493 rv = _bcm_field_th_flex_stat_action_set(unit, f_ent, mem, 22494 tcam_idx, buf); 22495 break; 22496 default: 22497 rv = _bcm_field_trx_stat_action_set(unit, f_ent, mem, 22498 tcam_idx, buf); 22499 } 22500 22501 return rv; 22502 } 22503 /* 22504 * Function: 22505 * _bcm_field_th_multi_pipe_counter_mem_get 22506 * 22507 * Purpose: 22508 * To get the pipe specific counter memory names for a given 22509 * Field Processor stage(VFP/IFP/EFP). 22510 * Parameters: 22511 * unit - (IN) BCM device number 22512 * stage_fc - (IN) Field Processor stage control structure. 22513 * counter_mem - (OUT) pointer to array of counter memories. 22514 * Returns: 22515 * BCM_E_XXX 22516 */ 22517 int 22518 _bcm_field_th_multi_pipe_counter_mem_get(int unit, 22519 _field_stage_t *stage_fc, 22520 soc_mem_t *counter_mem) 22521 { 22522 int pipe; /* XGS pipeline to operate on. */ 22523 int max_pipes; /* Maximum XGS pipelines in the stage */ 22524 22525 /* Input parameters check. */ 22526 if ((NULL == stage_fc) || 22527 (NULL == counter_mem)) { 22528 return BCM_E_PARAM; 22529 } 22530 22531 max_pipes = stage_fc->num_pipes; 22532 for (pipe = 0; pipe < max_pipes; pipe++) { 22533 counter_mem[pipe] = INVALIDm; 22534 } 22535 22536 switch(stage_fc->stage_id) { 22537 case _BCM_FIELD_STAGE_EGRESS: 22538 counter_mem[0] = EFP_COUNTER_TABLE_PIPE0m; 22539 counter_mem[1] = EFP_COUNTER_TABLE_PIPE1m; 22540 counter_mem[2] = EFP_COUNTER_TABLE_PIPE2m; 22541 counter_mem[3] = EFP_COUNTER_TABLE_PIPE3m; 22542 break; 22543 case _BCM_FIELD_STAGE_LOOKUP: 22544 break; 22545 default: 22546 return BCM_E_INTERNAL; 22547 } 22548 22549 return BCM_E_NONE; 22550 } 22551 22552 /* 22553 * Function: 22554 * _bcm_field_th_counter_read 22555 * Purpose: 22556 * Update accumulated sw counter and return current counter value. 22557 * Parameters: 22558 * unit - (IN) BCM device number 22559 * stage_fc - (IN) Stage field control 22560 * mamacc_byte - (IN) Memory access cache for byte counters 22561 * memacc_pkt - (IN) Memory access cache for packet counters 22562 * buf - (IN) Memory table entry for FP counter 22563 * cntrs32_buf - (IN) s/w packet Counter value 22564 * cntrs64_buf - (IN) s/w byte Counter value 22565 * packet_count - (OUT) Packet counter value 22566 * byte_count - (OUT) Byte counter value 22567 * Returns: 22568 * BCM_E_XXX 22569 */ 22570 int 22571 _bcm_field_th_counter_read(int unit, _field_stage_t *stage_fc, 22572 soc_memacc_t *memacc_byte, 22573 soc_memacc_t *memacc_pkt, uint32 *buf, 22574 _field_counter32_collect_t *cntrs32_buf, 22575 _field_counter64_collect_t *cntrs64_buf, 22576 uint64 *packet_count, uint64 *byte_count) 22577 { 22578 uint32 hw_val[2]; /* Parsed field counter value.*/ 22579 22580 if (NULL == buf || 22581 NULL == memacc_byte || 22582 NULL == memacc_pkt || 22583 NULL == cntrs32_buf || 22584 NULL == cntrs64_buf) { 22585 return BCM_E_PARAM; 22586 } 22587 22588 /* Byte counter. */ 22589 hw_val[0] = hw_val[1] = 0; 22590 soc_memacc_field_get(memacc_byte, buf, hw_val); 22591 22592 _bcm_field_34bit_counter_update(unit, hw_val, cntrs64_buf); 22593 if (NULL != byte_count) { 22594 COMPILER_64_ADD_64(*byte_count, cntrs64_buf->accumulated_counter); 22595 } 22596 /* Packet counter. */ 22597 hw_val[0] = hw_val[1] = 0; 22598 soc_memacc_field_get(memacc_pkt, buf, hw_val); 22599 _bcm_field_26bit_counter_update(unit, hw_val, cntrs32_buf); 22600 if (NULL != packet_count) { 22601 COMPILER_64_ADD_64(*packet_count, cntrs32_buf->accumulated_counter); 22602 } 22603 22604 return BCM_E_NONE; 22605 } 22606 22607 /* 22608 * Function: 22609 * _bcm_field_th_pipe_counter_get 22610 * Purpose: 22611 * Update accumulated sw counter and return current counter value. 22612 * Parameters: 22613 * unit - (IN) BCM device number 22614 * stage_fc - (IN) Stage field control 22615 * counter_mem - (IN) Memory name for FP counter 22616 * mem_buf - (IN) Memory table entry for FP counter 22617 * idx - (IN) Counter index 22618 * pipe - (IN) XGS pipeline to operate on 22619 * packet_count - (OUT) Packet counter value 22620 * byte_count - (OUT) Byte counter value 22621 * Returns: 22622 * BCM_E_XXX 22623 */ 22624 int 22625 _bcm_field_th_pipe_counter_get(int unit, 22626 _field_stage_t *stage_fc, 22627 soc_mem_t counter_mem, 22628 uint32 *mem_buf, 22629 int idx, 22630 int pipe, 22631 uint64 *packet_count, 22632 uint64 *byte_count) 22633 { 22634 _field_counter32_collect_t *cntrs32_buf; /* Sw packet counter value */ 22635 _field_counter64_collect_t *cntrs64_buf; /* Sw byte counter value */ 22636 soc_memacc_t *memacc_pkt, *memacc_byte; /* Memory access cache. */ 22637 22638 /* Input parameters check. */ 22639 if (NULL == stage_fc) { 22640 return BCM_E_PARAM; 22641 } 22642 22643 cntrs64_buf = &stage_fc->_field_64_counters[pipe][idx]; 22644 cntrs32_buf = &stage_fc->_field_32_counters[pipe][idx]; 22645 memacc_byte = &(stage_fc->_field_memacc_counters[(pipe * 2)]); 22646 memacc_pkt = &(stage_fc->_field_memacc_counters[((pipe * 2) + 1)]); 22647 BCM_IF_ERROR_RETURN(_bcm_field_th_counter_read(unit, stage_fc, 22648 memacc_byte, 22649 memacc_pkt, 22650 mem_buf, 22651 cntrs32_buf, cntrs64_buf, 22652 packet_count, byte_count)); 22653 22654 return BCM_E_NONE; 22655 } 22656 22657 /* 22658 * Function: 22659 * _field_th_multi_pipe_sw_counter_get 22660 * 22661 * Description: 22662 * Service routine used to retrieve 64-bit software accumulated counters. 22663 * Parameters: 22664 * unit - (IN) BCM device number. 22665 * stage_fc - (IN) Stage field control structure. 22666 * stat_group_pipe - (IN) XGS Pipline associated to the field group. 22667 * idx - (IN) Counter hw index. 22668 * packet_count - (OUT) Packet Counter value 22669 * byte_count - (OUT) Byte Counter value 22670 * Returns: 22671 * BCM_E_XXX 22672 */ 22673 STATIC int 22674 _field_th_multi_pipe_sw_counter_get(int unit, 22675 _field_stage_t *stage_fc, 22676 int stat_group_pipe, 22677 int idx, 22678 uint64 *packet_count, 22679 uint64 *byte_count) 22680 { 22681 int rv; /* Operation return status. */ 22682 int pipe; /* XGS pipeline to operate on. */ 22683 int max_pipes; /* Maximum pipeline per stage. */ 22684 uint32 *hw_buf; /* memory HW buffer. */ 22685 uint32 *hw_buffer; /* memory HW buffer. */ 22686 _field_control_t *fc; /* Field control structure. */ 22687 _field_counter32_collect_t *cntrs32_buf; /* Sw packet counter value */ 22688 _field_counter64_collect_t *cntrs64_buf; /* Sw byte counter value */ 22689 soc_mem_t counter_mem[_FP_MAX_NUM_PIPES]; /* FieldProcessor 22690 (IFP/EFP/VFP) 22691 counter memories */ 22692 22693 22694 hw_buf = hw_buffer = NULL; 22695 22696 /* Get field control structure. */ 22697 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 22698 22699 /* Get counter memory. */ 22700 rv = _bcm_field_th_multi_pipe_counter_mem_get(unit, stage_fc, 22701 counter_mem); 22702 BCM_IF_ERROR_RETURN(rv); 22703 22704 /* HW index sanity check. */ 22705 if (idx < soc_mem_index_min(unit, counter_mem[0]) || 22706 idx > soc_mem_index_max(unit, counter_mem[0])) { 22707 return (BCM_E_INTERNAL); 22708 } 22709 22710 max_pipes = stage_fc->num_pipes; 22711 if (_BCM_FIELD_GLOBAL_GROUP != stat_group_pipe) { 22712 for (pipe = 0; pipe < max_pipes; pipe++ ) { 22713 if (pipe != stat_group_pipe) { 22714 counter_mem[pipe] = INVALIDm; 22715 } 22716 } 22717 } 22718 22719 if (0 == (fc->flags & _FP_STAT_SYNC_ENABLE)) { 22720 for (pipe = 0; pipe < max_pipes; pipe++) { 22721 if (INVALIDm != counter_mem[pipe]) { 22722 cntrs64_buf = &stage_fc->_field_64_counters[pipe][idx]; 22723 COMPILER_64_ADD_64(*byte_count, 22724 cntrs64_buf->accumulated_counter); 22725 cntrs32_buf = &stage_fc->_field_32_counters[pipe][idx]; 22726 COMPILER_64_ADD_64(*packet_count, 22727 cntrs32_buf->accumulated_counter); 22728 } 22729 } 22730 } else { 22731 /* Allocate buffer for counter values in HW. */ 22732 _FP_XGS3_ALLOC(hw_buffer, 22733 max_pipes * WORDS2BYTES(SOC_MAX_MEM_FIELD_WORDS), 22734 "Counter buffers"); 22735 if (NULL == hw_buffer) { 22736 return (BCM_E_MEMORY); 22737 } 22738 22739 for (pipe = 0; pipe < max_pipes; pipe++) { 22740 if (INVALIDm != counter_mem[pipe]) { 22741 hw_buf = hw_buffer + (pipe * SOC_MAX_MEM_FIELD_WORDS); 22742 rv = soc_th_ifp_mem_read(unit, 22743 counter_mem[pipe], 22744 MEM_BLOCK_ANY, 22745 idx, hw_buf); 22746 if (BCM_FAILURE(rv)) { 22747 sal_free(hw_buffer); 22748 return rv; 22749 } 22750 rv = _bcm_field_th_pipe_counter_get(unit, stage_fc, 22751 counter_mem[pipe], 22752 hw_buf, idx, pipe, 22753 packet_count, byte_count); 22754 if (BCM_FAILURE(rv)) { 22755 sal_free(hw_buffer); 22756 return rv; 22757 } 22758 22759 } 22760 } 22761 22762 sal_free(hw_buffer); 22763 22764 } 22765 22766 return rv; 22767 } 22768 22769 /* 22770 * Function: 22771 * _bcm_th_field_stat_value_set 22772 * 22773 * Description: 22774 * Set 64 bit counter value for specific statistic type. 22775 * Parameters: 22776 * unit - (IN) BCM device number. 22777 * f_st - (IN) Statistics entity descriptor. 22778 * stat - (IN) Collected statistics descriptor. 22779 * value - (IN) Collected counters value. 22780 * Returns: 22781 * BCM_E_XXX 22782 */ 22783 int 22784 _bcm_th_field_stat_value_set(int unit, 22785 _field_stat_t *f_st, 22786 bcm_field_stat_t stat, 22787 uint64 value) 22788 { 22789 int rv = BCM_E_NONE; /* Operation return status. */ 22790 int idx1; /* First counter index to read. */ 22791 int idx2; /* Second counter index to read. */ 22792 int idx3; /* Third counter index to read. */ 22793 int len; /* length of the h/w field. */ 22794 uint32 flags; /* _FP_STAT_XXX. */ 22795 uint64 hw_value; /* h/w counter value to be written. */ 22796 uint64 reset_val; /* Value to be set on reset */ 22797 _field_control_t *fc; /* Field control structure. */ 22798 bcm_stat_value_t stat_val; /* Stat Values structure to SET. */ 22799 soc_reg_t reg; /* Variable to hold SOC register. */ 22800 soc_ctr_control_info_t ctrl_info; /* Centralized counter information. */ 22801 22802 /* Input parameters check. */ 22803 if (NULL == f_st) { 22804 return (BCM_E_PARAM); 22805 } 22806 22807 /* Check that stat was requested during statistics entity creation. */ 22808 for (idx1 = 0; idx1 < f_st->nstat; idx1++) { 22809 if (stat == f_st->stat_arr[idx1]) { 22810 break; 22811 } 22812 } 22813 if (idx1 == f_st->nstat) { 22814 return (BCM_E_PARAM); 22815 } 22816 22817 /* Get field control structure. */ 22818 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 22819 22820 /* Get hw indexes and flags needed to compose requested statistic.*/ 22821 rv = fc->functions.fp_stat_index_get(unit, f_st, stat, &idx1, 22822 &idx2, &idx3, &flags); 22823 BCM_IF_ERROR_RETURN(rv); 22824 22825 if (_FP_INVALID_INDEX == idx1) { 22826 return (BCM_E_INTERNAL); 22827 } 22828 22829 if (_BCM_FIELD_STAGE_EGRESS == f_st->stage_id) { 22830 int inst; /* Pipe Instance. */ 22831 _field_group_t *fg; /* Field Group structure. */ 22832 _field_stage_t *stage_fc; /* Field Stage Structure. */ 22833 22834 /* Get group descriptor. */ 22835 rv = _field_group_get (unit, f_st->gid, &fg); 22836 BCM_IF_ERROR_RETURN(rv); 22837 22838 /* Get Stage descriptor */ 22839 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, f_st->stage_id, 22840 &stage_fc)); 22841 22842 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 22843 inst = 0; 22844 } else { 22845 inst = fg->instance; 22846 } 22847 22848 if (flags & _FP_STAT_BYTES) { 22849 reg = SOC_COUNTER_NON_DMA_EFP_BYTE; 22850 /* For Tomahawk BYTE_COUNTERf field_length = 34*/ 22851 len = soc_mem_field_length(unit, EFP_COUNTER_TABLEm, BYTE_COUNTERf); 22852 } else { 22853 reg = SOC_COUNTER_NON_DMA_EFP_PKT; 22854 /* For Tomahawk field_length = 26 */ 22855 len = soc_mem_field_length(unit, EFP_COUNTER_TABLEm, 22856 PACKET_COUNTERf); 22857 } 22858 22859 if (len < 32) { 22860 COMPILER_64_SET(hw_value, 0, 22861 COMPILER_64_LO(value) & ((1 << len) - 1)); 22862 } else { 22863 COMPILER_64_SET(hw_value, 22864 COMPILER_64_HI(value) & ((1 << (len - 32)) - 1), 22865 COMPILER_64_LO(value)); 22866 } 22867 22868 22869 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 22870 ctrl_info.instance = _FP_GLOBAL_INST; 22871 } else { 22872 ctrl_info.instance = inst; 22873 } 22874 22875 ctrl_info.instance_type = SOC_CTR_INSTANCE_TYPE_PIPE; 22876 COMPILER_64_ZERO(reset_val); 22877 22878 rv = soc_counter_generic_set(unit, reg, 22879 ctrl_info, 0, 22880 idx1, reset_val); 22881 BCM_IF_ERROR_RETURN(rv); 22882 /* Reset accumulated counter value at secondary index. */ 22883 if (_FP_INVALID_INDEX != idx2) { 22884 rv = soc_counter_generic_set(unit, reg, 22885 ctrl_info, 0, 22886 idx2, reset_val); 22887 BCM_IF_ERROR_RETURN(rv); 22888 } 22889 22890 if (_FP_INVALID_INDEX != idx3) { 22891 rv = soc_counter_generic_set(unit, reg, 22892 ctrl_info, 0, 22893 idx3, reset_val); 22894 BCM_IF_ERROR_RETURN(rv); 22895 } 22896 22897 /* Set accumulated counter value at primary index. */ 22898 ctrl_info.instance = inst; 22899 rv = soc_counter_generic_set(unit, reg, 22900 ctrl_info, 0, 22901 idx1, hw_value); 22902 BCM_IF_ERROR_RETURN(rv); 22903 } else if ((_BCM_FIELD_STAGE_INGRESS == f_st->stage_id) || 22904 (_BCM_FIELD_STAGE_EXACTMATCH == f_st->stage_id)) { 22905 22906 if (flags & _FP_STAT_BYTES) { 22907 COMPILER_64_SET(stat_val.bytes, 22908 COMPILER_64_HI(value), 22909 COMPILER_64_LO(value)); 22910 } else { 22911 stat_val.packets = 0; 22912 COMPILER_64_SET(stat_val.packets64, 22913 COMPILER_64_HI(value), 22914 COMPILER_64_LO(value)); 22915 } 22916 22917 /* Set accumulated counter value at primary index. */ 22918 /* coverity[uninit_use_in_call : FALSE] */ 22919 rv = _bcm_esw_stat_counter_raw_set(unit, 22920 f_st->flex_mode, 22921 (flags & _FP_STAT_BYTES) ? 1 : 0, 22922 idx1 - f_st->hw_index, 22923 &stat_val); 22924 BCM_IF_ERROR_RETURN(rv); 22925 22926 if (_FP_INVALID_INDEX != idx2) { 22927 COMPILER_64_ZERO(stat_val.bytes); 22928 stat_val.packets = 0; 22929 COMPILER_64_ZERO(stat_val.packets64); 22930 /* Reset accumulated counter value at secondary index. */ 22931 /* coverity[uninit_use_in_call : FALSE] */ 22932 rv = _bcm_esw_stat_counter_raw_set(unit, 22933 f_st->flex_mode, 22934 (flags & _FP_STAT_BYTES) ? 1 : 0, 22935 idx2 - f_st->hw_index, 22936 &stat_val); 22937 BCM_IF_ERROR_RETURN(rv); 22938 } 22939 22940 if (_FP_INVALID_INDEX != idx3) { 22941 COMPILER_64_ZERO(stat_val.bytes); 22942 stat_val.packets = 0; 22943 COMPILER_64_ZERO(stat_val.packets64); 22944 /* Reset accumulated counter value at ternary index. */ 22945 /* coverity[uninit_use_in_call : FALSE] */ 22946 rv = _bcm_esw_stat_counter_raw_set(unit, 22947 f_st->flex_mode, 22948 (flags & _FP_STAT_BYTES) ? 1 : 0, 22949 idx3 - f_st->hw_index, 22950 &stat_val); 22951 BCM_IF_ERROR_RETURN(rv); 22952 } 22953 } else { 22954 return BCM_E_INTERNAL; 22955 } 22956 22957 return (rv); 22958 } 22959 22960 /* 22961 * Function: 22962 * _bcm_th_field_stat_value_get 22963 * 22964 * Description: 22965 * Get 64 bit counter value for specific statistic type. 22966 * Parameters: 22967 * unit - (IN) BCM device number. 22968 * f_st - (IN) Statistics entity descriptor. 22969 * stat - (IN) Collected statistics descriptor. 22970 * value - (OUT) Collected counters value. 22971 * Returns: 22972 * BCM_E_XXX 22973 */ 22974 int 22975 _bcm_th_field_stat_value_get(int unit, int sync_mode, 22976 _field_stat_t *f_st, 22977 bcm_field_stat_t stat, 22978 uint64 *value) 22979 { 22980 22981 int idx1; /* First counter index to read. */ 22982 int idx2; /* Second counter index to read. */ 22983 int idx3; /* Third counter index to read. */ 22984 int rv; /* Operation return status. */ 22985 uint32 flags; /* _FP_STAT_XXX. */ 22986 uint64 count_1; /* Primary index packet count. */ 22987 uint64 count_2; /* Primary index byte count. */ 22988 uint64 count_3; /* Third counterindex byte count. */ 22989 _field_control_t *fc; /* Field control structure. */ 22990 soc_ctr_control_info_t ctrl_info; 22991 soc_reg_t reg; 22992 bcm_stat_value_t stat_val; 22993 22994 if (NULL == f_st || NULL == value) { 22995 return BCM_E_PARAM; 22996 } 22997 22998 /* Initialization. */ 22999 COMPILER_64_ZERO(count_1); 23000 COMPILER_64_ZERO(count_2); 23001 COMPILER_64_ZERO(count_3); 23002 idx1 = idx2 = idx3 = _FP_INVALID_INDEX; 23003 flags = 0; 23004 23005 /* Check that stat was requested during statistics entity creation. */ 23006 for (idx1 = 0; idx1 < f_st->nstat; idx1++) { 23007 if (stat == f_st->stat_arr[idx1]) { 23008 break; 23009 } 23010 } 23011 if (idx1 == f_st->nstat) { 23012 return (BCM_E_PARAM); 23013 } 23014 23015 /* Get field control structure. */ 23016 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 23017 23018 /* If stat sync field control is enabled, get the status from h/w. */ 23019 if (fc->flags & _FP_STAT_SYNC_ENABLE) { 23020 sync_mode = 1; 23021 } else { 23022 sync_mode = 0; 23023 } 23024 23025 /* Get hw indexes and flags needed to compose requested statistic.*/ 23026 rv = fc->functions.fp_stat_index_get(unit, f_st, stat, &idx1, 23027 &idx2, &idx3, &flags); 23028 BCM_IF_ERROR_RETURN(rv); 23029 23030 if (!(f_st->hw_flags & _FP_STAT_FLEX_CNTR)) { 23031 /* Fixed Counters - for stage BCM_FIELD_STAGE_EGRESS */ 23032 int inst; /* Pipe Instance. */ 23033 _field_stage_t *stage_fc; /* Field Stage Structure. */ 23034 _field_group_t *fg; /* Field Group structure. */ 23035 23036 /* Get group descriptor. */ 23037 rv = _field_group_get (unit, f_st->gid, &fg); 23038 BCM_IF_ERROR_RETURN(rv); 23039 23040 /* Get Stage descriptor */ 23041 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, f_st->stage_id, 23042 &stage_fc)); 23043 23044 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 23045 inst = _FP_GLOBAL_INST; 23046 } else { 23047 inst = fg->instance; 23048 } 23049 23050 ctrl_info.instance = inst; 23051 ctrl_info.instance_type = SOC_CTR_INSTANCE_TYPE_PIPE; 23052 23053 if (flags & _FP_STAT_BYTES) { 23054 reg = SOC_COUNTER_NON_DMA_EFP_BYTE; 23055 } else { 23056 reg = SOC_COUNTER_NON_DMA_EFP_PKT; 23057 } 23058 23059 /* Get accumulated counter value at primary index. */ 23060 if (_FP_INVALID_INDEX != idx1) { 23061 rv = soc_counter_generic_get (unit, reg, 23062 ctrl_info, sync_mode, 23063 idx1, &count_1); 23064 BCM_IF_ERROR_RETURN(rv); 23065 } 23066 23067 /* Get accumulated counter value at secondary index. */ 23068 if (_FP_INVALID_INDEX != idx2) { 23069 rv = soc_counter_generic_get (unit, reg, 23070 ctrl_info, sync_mode, 23071 idx2, &count_2); 23072 BCM_IF_ERROR_RETURN(rv); 23073 } 23074 23075 /* Get accumulated counter value at secondary index. */ 23076 if (_FP_INVALID_INDEX != idx3) { 23077 rv = soc_counter_generic_get (unit, reg, 23078 ctrl_info, sync_mode, 23079 idx3, &count_3); 23080 BCM_IF_ERROR_RETURN(rv); 23081 } 23082 23083 } else if (((_BCM_FIELD_STAGE_INGRESS == f_st->stage_id) || 23084 (_BCM_FIELD_STAGE_EXACTMATCH == f_st->stage_id) || 23085 (_BCM_FIELD_STAGE_EGRESS == f_st->stage_id)) && 23086 (f_st->hw_flags & _FP_STAT_FLEX_CNTR) && 23087 (soc_feature(unit, soc_feature_advanced_flex_counter))) { 23088 23089 /* Get accumulated counter value at primary index. */ 23090 if (_FP_INVALID_INDEX != idx1) { 23091 rv = _bcm_esw_stat_counter_raw_get(unit, sync_mode, f_st->flex_mode, 23092 (flags & _FP_STAT_BYTES) ? 1 : 0, 23093 idx1 - f_st->hw_index, 23094 &stat_val); 23095 /* 23096 * Flex STAT module is initalized before field module during reset. 23097 * Attempt to read flex stats by field module would result in 23098 * error. Ignore these errors. 23099 */ 23100 if (BCM_FAILURE(rv)) { 23101 if (TRUE == fc->init) { 23102 return (rv); 23103 } else { 23104 return (BCM_E_NOT_FOUND); 23105 } 23106 } else { 23107 /* Store retrieved stat value in return variable. */ 23108 if (flags & _FP_STAT_BYTES) { 23109 COMPILER_64_OR(count_1, stat_val.bytes); 23110 } else { 23111 COMPILER_64_OR(count_1, stat_val.packets64); 23112 } 23113 } 23114 } 23115 23116 /* Get accumulated counter value at secondary index. */ 23117 if (_FP_INVALID_INDEX != idx2) { 23118 23119 rv = _bcm_esw_stat_counter_raw_get(unit, sync_mode, f_st->flex_mode, 23120 (flags & _FP_STAT_BYTES) ? 1 : 0, 23121 idx2 - f_st->hw_index, 23122 &stat_val); 23123 /* 23124 * Flex STAT module is initalized before field module during reset. 23125 * Attempt to read flex stats by field module would result in 23126 * error. Ignore these errors. 23127 */ 23128 if (BCM_FAILURE(rv)) { 23129 if (TRUE == fc->init) { 23130 return (rv); 23131 } else { 23132 return (BCM_E_NOT_FOUND); 23133 } 23134 } else { 23135 /* Store retrieved stat value in return variable. */ 23136 if (flags & _FP_STAT_BYTES) { 23137 COMPILER_64_OR(count_2, stat_val.bytes); 23138 } else { 23139 COMPILER_64_OR(count_2, stat_val.packets64); 23140 } 23141 } 23142 23143 } 23144 23145 /* Get accumulated counter value at secondary index. */ 23146 if (_FP_INVALID_INDEX != idx3) { 23147 23148 rv = _bcm_esw_stat_counter_raw_get(unit, sync_mode, f_st->flex_mode, 23149 (flags & _FP_STAT_BYTES) ? 1 : 0, 23150 idx3 - f_st->hw_index, 23151 &stat_val); 23152 /* 23153 * Flex STAT module is initalized before field module during reset. 23154 * Attempt to read flex stats by field module would result in 23155 * error. Ignore these errors. 23156 */ 23157 if (BCM_FAILURE(rv)) { 23158 if (TRUE == fc->init) { 23159 return (rv); 23160 } else { 23161 return (BCM_E_NOT_FOUND); 23162 } 23163 } else { 23164 /* Store retrieved stat value in return variable. */ 23165 if (flags & _FP_STAT_BYTES) { 23166 COMPILER_64_OR(count_3, stat_val.bytes); 23167 } else { 23168 COMPILER_64_OR(count_3, stat_val.packets64); 23169 } 23170 } 23171 } 23172 23173 } else { 23174 return BCM_E_INTERNAL; 23175 } 23176 23177 /* Get final counter value. */ 23178 COMPILER_64_ZERO(*value); 23179 if (flags & _FP_STAT_ADD) { 23180 COMPILER_64_ADD_64(count_1, count_2); 23181 COMPILER_64_ADD_64(count_1, count_3); 23182 } else if (flags & _FP_STAT_SUBSTRACT) { 23183 COMPILER_64_SUB_64(count_1, count_2); 23184 } 23185 COMPILER_64_OR(*value, count_1); 23186 return (BCM_E_NONE); 23187 } 23188 23189 /* 23190 * Function: 23191 * _bcm_field_th_multi_pipe_stat_value_get 23192 * 23193 * Description: 23194 * Get 64 bit counter value for specific statistic type. 23195 * Parameters: 23196 * unit - (IN) BCM device number. 23197 * f_st - (IN) Statistics entity descriptor. 23198 * stat - (IN) Collected statistics descriptor. 23199 * value - (OUT) Collected counters value. 23200 * Returns: 23201 * BCM_E_XXX 23202 */ 23203 int 23204 _bcm_field_th_multi_pipe_stat_value_get(int unit, 23205 _field_stat_t *f_st, 23206 bcm_field_stat_t stat, 23207 uint64 *value) 23208 { 23209 int idx1; /* First counter index to read. */ 23210 int idx2; /* Second counter index to read. */ 23211 int idx3; /* Third counter index to read. */ 23212 int rv; /* Operation return status. */ 23213 int stat_group_pipe; /* XGS Pipline associated 23214 to the field group. */ 23215 uint32 flags; /* _FP_STAT_XXX. */ 23216 uint64 packet_count_1; /* Primary index packet count. */ 23217 uint64 byte_count_1; /* Primary index byte count. */ 23218 uint64 packet_count_2; /* Secondary index packet count. */ 23219 uint64 byte_count_2; /* Secondary index byte count. */ 23220 uint64 packet_count_3; /* Third counter index packet count. */ 23221 uint64 byte_count_3; /* Third counterindex byte count. */ 23222 _field_stage_t *stage_fc; /* Stage field control. */ 23223 _field_control_t *fc; /* Field control structure. */ 23224 23225 /* Initialization. */ 23226 COMPILER_64_ZERO(packet_count_1); 23227 COMPILER_64_ZERO(packet_count_2); 23228 COMPILER_64_ZERO(packet_count_3); 23229 COMPILER_64_ZERO(byte_count_1); 23230 COMPILER_64_ZERO(byte_count_2); 23231 COMPILER_64_ZERO(byte_count_3); 23232 idx1 = idx2 = idx3 = _FP_INVALID_INDEX; 23233 flags = 0; 23234 23235 /* Get field control. */ 23236 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 23237 23238 /* Stage field control structure. */ 23239 rv = _field_stage_control_get(unit, f_st->stage_id, &stage_fc); 23240 BCM_IF_ERROR_RETURN(rv); 23241 23242 /* Check that stat was requested during statistics entity creation. */ 23243 for (idx1 = 0; idx1 < f_st->nstat; idx1++) { 23244 if (stat == f_st->stat_arr[idx1]) { 23245 break; 23246 } 23247 } 23248 if (idx1 == f_st->nstat) { 23249 return (BCM_E_PARAM); 23250 } 23251 23252 /* Get hw indexes and flags needed to compose requested statistic.*/ 23253 rv = fc->functions.fp_stat_index_get(unit, f_st, stat, &idx1, 23254 &idx2, &idx3, &flags); 23255 BCM_IF_ERROR_RETURN(rv); 23256 23257 stat_group_pipe = _BCM_FIELD_GLOBAL_GROUP; 23258 23259 /* Get accumulated counter value at primary index. */ 23260 if (_FP_INVALID_INDEX != idx1) { 23261 rv = _field_th_multi_pipe_sw_counter_get(unit, stage_fc, 23262 stat_group_pipe, idx1, 23263 &packet_count_1, 23264 &byte_count_1); 23265 BCM_IF_ERROR_RETURN(rv); 23266 } 23267 23268 /* Get accumulated counter value at secondary index. */ 23269 if (_FP_INVALID_INDEX != idx2) { 23270 rv = _field_th_multi_pipe_sw_counter_get(unit, stage_fc, 23271 stat_group_pipe, idx2, 23272 &packet_count_2, 23273 &byte_count_2); 23274 BCM_IF_ERROR_RETURN(rv); 23275 } 23276 23277 /* Get accumulated counter value at secondary index. */ 23278 if (_FP_INVALID_INDEX != idx3) { 23279 rv = _field_th_multi_pipe_sw_counter_get(unit, stage_fc, 23280 stat_group_pipe, idx3, 23281 &packet_count_3, 23282 &byte_count_3); 23283 BCM_IF_ERROR_RETURN(rv); 23284 } 23285 23286 /* Get final counter value. */ 23287 COMPILER_64_ZERO(*value); 23288 if (flags & _FP_STAT_BYTES) { 23289 if (flags & _FP_STAT_ADD) { 23290 COMPILER_64_ADD_64(byte_count_1, byte_count_2); 23291 COMPILER_64_ADD_64(byte_count_1, byte_count_3); 23292 } else if (flags & _FP_STAT_SUBSTRACT) { 23293 COMPILER_64_SUB_64(byte_count_1, byte_count_2); 23294 } 23295 COMPILER_64_OR(*value, byte_count_1); 23296 } else { 23297 if (flags & _FP_STAT_ADD) { 23298 COMPILER_64_ADD_64(packet_count_1, packet_count_2); 23299 COMPILER_64_ADD_64(packet_count_1, packet_count_3); 23300 } else if (flags & _FP_STAT_SUBSTRACT) { 23301 COMPILER_64_SUB_64(packet_count_1, packet_count_2); 23302 } 23303 COMPILER_64_OR(*value, packet_count_1); 23304 } 23305 return (BCM_E_NONE); 23306 } 23307 23308 /* 23309 * Function: 23310 * _field_th_counter_multi_pipe_memacc_alloc 23311 * Purpose: 23312 * Initialize software cached memory access info for field counters 23313 * 23314 * Parameters: 23315 * unit - (IN) BCM device number. 23316 * mem - (IN) Counter memory. 23317 * descr - (IN) Counter descriptor. 23318 * ptr - (OUT) Allocated pointer. 23319 * Returns: 23320 * BCM_E_XXX 23321 */ 23322 STATIC int 23323 _field_th_counter_multi_pipe_memacc_alloc(int unit, soc_memacc_t **memacc_ptr) 23324 { 23325 int mem_size; /* Total memory size of memory access info of 23326 all different counter in all pipes */ 23327 23328 /* Input parameters check. */ 23329 if (NULL == memacc_ptr) { 23330 return (BCM_E_PARAM); 23331 } 23332 23333 mem_size = _FIELD_COUNTER_MEMACC_PIPE_NUM * sizeof(soc_memacc_t); 23334 *memacc_ptr = sal_alloc(mem_size, "FP counter memory access cache"); 23335 if (NULL == *memacc_ptr) { 23336 return (BCM_E_MEMORY); 23337 } 23338 sal_memset(*memacc_ptr, 0, mem_size); 23339 return (BCM_E_NONE); 23340 } 23341 23342 /* 23343 * Function: 23344 * _bcm_field_th_counter_multi_pipe_collect_init 23345 * Purpose: 23346 * Initialize software field 64bit counters. 23347 * 23348 * Parameters: 23349 * unit - (IN) BCM device number. 23350 * fc - (IN) Field control structure. 23351 * stage_fc - (IN/OUT) Stage field control structure. 23352 * 23353 * Returns: 23354 * BCM_E_XXX 23355 */ 23356 int 23357 _bcm_field_th_counter_multi_pipe_collect_init(int unit, 23358 _field_control_t *fc, 23359 _field_stage_t *stage_fc) 23360 { 23361 int rv = BCM_E_NONE; /* Operation return status. */ 23362 int pipe; /* XGS pipeline to operate on. */ 23363 int max_pipes; /* Maximum XGS pipelines in the stage. */ 23364 soc_memacc_t *memacc_list; /* Memory access cache list. */ 23365 soc_mem_t counter_mem[_FP_MAX_NUM_PIPES]; /* FieldProcessor 23366 (IFP/EFP/VFP) 23367 counter memories */ 23368 /* Input parameters check. */ 23369 if (NULL == stage_fc) { 23370 return (BCM_E_PARAM); 23371 } 23372 23373 rv = _bcm_field_th_multi_pipe_counter_mem_get(unit, stage_fc, 23374 counter_mem); 23375 BCM_IF_ERROR_RETURN(rv); 23376 23377 23378 max_pipes = stage_fc->num_pipes; 23379 23380 /* Check if stage has counters. */ 23381 if (INVALIDm == counter_mem[0]) { 23382 return (BCM_E_NONE); 23383 } 23384 23385 /* Allocate space for cached counter memory access info */ 23386 rv = _field_th_counter_multi_pipe_memacc_alloc(unit, 23387 &(stage_fc->_field_memacc_counters)); 23388 if (BCM_FAILURE(rv)) { 23389 return (rv); 23390 } 23391 memacc_list = stage_fc->_field_memacc_counters; 23392 23393 for (pipe = 0; pipe < max_pipes; pipe++) { 23394 23395 rv = _bcm_field_counter32_collect_alloc(unit, counter_mem[pipe], 23396 "FP pipeline counters", 23397 &stage_fc->_field_32_counters[pipe]); 23398 if (BCM_FAILURE(rv)) { 23399 _bcm_field_counter_collect_deinit(unit, stage_fc); 23400 return (rv); 23401 } 23402 23403 rv = _bcm_field_counter64_collect_alloc(unit, counter_mem[pipe], 23404 "FP pipeline byte counters", 23405 &stage_fc->_field_64_counters[pipe]); 23406 if (BCM_FAILURE(rv)) { 23407 _bcm_field_counter_collect_deinit(unit, stage_fc); 23408 return (rv); 23409 } 23410 23411 rv = soc_memacc_init(unit, counter_mem[pipe], BYTE_COUNTERf, 23412 &(memacc_list[(pipe * 2)])); 23413 if(BCM_FAILURE(rv)) { 23414 _bcm_field_counter_collect_deinit(unit, stage_fc); 23415 return (rv); 23416 } 23417 23418 rv = soc_memacc_init(unit, counter_mem[pipe], PACKET_COUNTERf, 23419 &(memacc_list[((pipe * 2) + 1)])); 23420 23421 if(BCM_FAILURE(rv)) { 23422 _bcm_field_counter_collect_deinit(unit, stage_fc); 23423 return (rv); 23424 } 23425 } 23426 return (rv); 23427 } 23428 23429 /* 23430 * Function: 23431 * _bcm_field_th_multi_pipe_sw_counter_update 23432 * Description: 23433 * Service routine used to update 64-bit software accumulated counters. 23434 * based on hw memory block. 23435 * Parameters: 23436 * unit - (IN) BCM device number. 23437 * stage_fc - (IN/OUT) Stage field control structure. 23438 * mem - (IN) Counters memory. 23439 * idx_min - (IN) First counter index in the buffer. 23440 * idx_max - (IN) Last counter index in the buffer. 23441 * buf - (IN) Counters buffer. 23442 * flags - (IN) Device counters flags. 23443 * Returns: 23444 * BCM_E_XXX 23445 */ 23446 int 23447 _bcm_field_th_multi_pipe_sw_counter_update(int unit, _field_stage_t *stage_fc, 23448 soc_mem_t mem, int idx_min, int idx_max, 23449 char *buf, int pipe) 23450 { 23451 int rv = BCM_E_NONE; /* Operartion return status. */ 23452 int idx; /* Iteration index. */ 23453 int buf_offset; /* Offset into counters buffer. */ 23454 uint32 *entry_p; /* HW entry pointer. */ 23455 _field_control_t *fc; /* Field control structure. */ 23456 23457 if ((NULL == stage_fc) || (NULL == buf)) { 23458 return BCM_E_PARAM; 23459 } 23460 23461 /* Get field control structure. */ 23462 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 23463 for (idx = idx_min, buf_offset = 0; idx <= idx_max; idx++, buf_offset++) { 23464 /* Read counter value from the first memory. */ 23465 entry_p = soc_mem_table_idx_to_pointer(unit, mem, uint32 *, 23466 buf, buf_offset); 23467 23468 /* Process accumulated counter value. */ 23469 rv = _bcm_field_th_pipe_counter_get(unit, stage_fc, mem, entry_p, 23470 idx, pipe, NULL, NULL); 23471 if (BCM_FAILURE(rv)) { 23472 break; 23473 } 23474 } 23475 return rv; 23476 } 23477 23478 /* 23479 * Function: 23480 * _field_th_multi_pipe_mem_counters_read 23481 * Description: 23482 * Service routine used to coolect 64-bit software accumulated counters. 23483 * for a specific stage. 23484 * Parameters: 23485 * unit - (IN) BCM device number. 23486 * mem - (IN) Counters memory. 23487 * pipe - (IN) XGS pipeline to operate on. 23488 * stage_fc - (IN/OUT) Stage field control structure. 23489 * Returns: 23490 * BCM_E_XXX 23491 */ 23492 STATIC int 23493 _field_th_multi_pipe_mem_counters_read(int unit, 23494 soc_mem_t mem, 23495 int pipe, 23496 _field_stage_t *stage_fc) 23497 { 23498 int rv = BCM_E_NONE; /* Operation return value. */ 23499 int idx; /* Table iteration index. */ 23500 int buf_end_idx; /* Buffer end index. */ 23501 int alloc_size; /* DMA buffer size. */ 23502 int max_idx; /* Counter memory index max. */ 23503 int min_idx; /* Counter memory index min. */ 23504 char *buf; /* Buffer to read the table. */ 23505 23506 23507 /* Input parameters check. */ 23508 if (NULL == stage_fc) { 23509 return (BCM_E_PARAM); 23510 } 23511 23512 /* Make sure memory is valid */ 23513 if (INVALIDm == mem) { 23514 return BCM_E_INTERNAL; 23515 } 23516 23517 /* Get table boundaries. */ 23518 min_idx = soc_mem_index_min(unit, mem); 23519 max_idx = soc_mem_index_max(unit, mem); 23520 23521 /* Allocate memory buffer. */ 23522 alloc_size = (_FP_64_COUNTER_BUCKET * sizeof(fp_counter_table_entry_t)); 23523 buf = soc_cm_salloc(unit, alloc_size, "fp_64_bit_counter"); 23524 if (buf == NULL) { 23525 return (BCM_E_MEMORY); 23526 } 23527 23528 /* Dma part of the table & update software counters. */ 23529 soc_mem_lock(unit, mem); 23530 for (idx = min_idx; idx <= max_idx; idx += _FP_64_COUNTER_BUCKET) { 23531 buf_end_idx = MIN(max_idx, (idx + _FP_64_COUNTER_BUCKET - 1)); 23532 /* Dma range of entries in counter table. */ 23533 rv = soc_mem_read_range(unit, mem, MEM_BLOCK_ANY, idx, 23534 buf_end_idx, buf); 23535 if (BCM_FAILURE(rv)) { 23536 break; 23537 } 23538 23539 rv = _bcm_field_th_multi_pipe_sw_counter_update(unit, stage_fc, 23540 mem, idx, 23541 buf_end_idx, 23542 buf, pipe); 23543 if (BCM_FAILURE(rv)) { 23544 break; 23545 } 23546 } 23547 soc_mem_unlock(unit, mem); 23548 soc_cm_sfree(unit, buf); 23549 return (rv); 23550 } 23551 23552 /* 23553 * Function: 23554 * _bcm_field_th_stage_multi_pipe_counters_collect 23555 * Description: 23556 * Service routine used to coolect 64-bit software accumulated counters. 23557 * for a specific stage. 23558 * Parameters: 23559 * unit - (IN) BCM device number. 23560 * fc - (IN) Field control structure. 23561 * stage_fc - (IN/OUT) Stage field control structure. 23562 * Returns: 23563 * BCM_E_XXX 23564 * Notes: 23565 * None. 23566 */ 23567 int 23568 _bcm_field_th_stage_multi_pipe_counters_collect (int unit, _field_control_t *fc, 23569 _field_stage_t *stage_fc) 23570 { 23571 int rv = BCM_E_NONE; /* Operation return value. */ 23572 int pipe; /* XGS pipeline to operate on. */ 23573 int max_pipes; /* Maximum XGS pipelines in the stage */ 23574 soc_mem_t counter_mem[_FP_MAX_NUM_PIPES]; /* FieldProcessor 23575 (IFP/EFP/VFP) 23576 counter memories */ 23577 /* Input parameters check. */ 23578 if (NULL == stage_fc || NULL == fc) { 23579 return (BCM_E_PARAM); 23580 } 23581 23582 max_pipes = stage_fc->num_pipes; 23583 for (pipe = 0; pipe < max_pipes; pipe++ ) { 23584 if (NULL == stage_fc->_field_32_counters[pipe] || 23585 NULL == stage_fc->_field_64_counters[pipe]) 23586 return BCM_E_UNAVAIL; 23587 } 23588 23589 /* Get counters memory for the stage. */ 23590 rv = _bcm_field_th_multi_pipe_counter_mem_get(unit, stage_fc, 23591 counter_mem); 23592 BCM_IF_ERROR_RETURN(rv); 23593 23594 for (pipe = 0; pipe < max_pipes; pipe++ ) { 23595 if (INVALIDm != counter_mem[pipe]) { 23596 BCM_IF_ERROR_RETURN 23597 (_field_th_multi_pipe_mem_counters_read(unit, counter_mem[pipe], 23598 pipe, stage_fc)); 23599 } 23600 } 23601 23602 return BCM_E_NONE; 23603 } 23604 23605 /* 23606 * Function: 23607 * _bcm_th_field_counter_config_set 23608 * Description: 23609 * To set the SOC configuration for EFP counters. 23610 * Parameters: 23611 * unit - (IN) BCM device number. 23612 * Returns: 23613 * BCM_E_XXX 23614 * Notes: 23615 * Field module must perform 2 steps to start the counter module to 23616 * start performing the DMA. 23617 * 1. Enable the DMA for the respective counter (Both PKT/BYTE) 23618 * 2. Setup a DMA profile. 23619 */ 23620 23621 int 23622 _bcm_th_field_counter_config_set(int unit) 23623 { 23624 int rv; 23625 int count; 23626 soc_ctr_control_info_t ctrl_info; 23627 soc_ctr_ctrl_config_t ctrl_config; 23628 23629 ctrl_info.instance_type = SOC_CTR_INSTANCE_TYPE_PIPE; 23630 ctrl_info.instance = -1; 23631 ctrl_config.config_type = SOC_CTR_CTRL_CONFIG_DMA_ENABLE; 23632 ctrl_config.config_val = 1; /* Enable DMA */ 23633 count = 1; 23634 rv = soc_counter_config_multi_set(unit, SOC_COUNTER_NON_DMA_EFP_PKT, 23635 count, &ctrl_info, &ctrl_config); 23636 BCM_IF_ERROR_RETURN(rv); 23637 23638 rv = soc_counter_config_multi_set(unit, SOC_COUNTER_NON_DMA_EFP_BYTE, 23639 count, &ctrl_info, &ctrl_config); 23640 23641 BCM_IF_ERROR_RETURN(rv); 23642 23643 ctrl_config.config_type = SOC_CTR_CTRL_CONFIG_DMA_RATE_PROFILE_ALL; 23644 ctrl_config.config_val = 1; /* Enable ALL profiles for EFP_PKT */ 23645 rv = soc_counter_config_multi_set (unit, SOC_COUNTER_NON_DMA_EFP_PKT, 23646 count, &ctrl_info, &ctrl_config); 23647 23648 BCM_IF_ERROR_RETURN(rv); 23649 23650 rv = soc_counter_config_multi_set(unit, SOC_COUNTER_NON_DMA_EFP_BYTE, 23651 count, &ctrl_info, &ctrl_config); 23652 return rv; 23653 } 23654 23655 /* END OF COUNTER ROUTINES */ 23656 23657 /* START OF POLICER ROUTINES */ 23658 /* 23659 * Function: 23660 * _bcm_field_th_policer_mem_get 23661 * Purpose: 23662 * Get policer table name. 23663 * Parameters: 23664 * unit - (IN) BCM device number 23665 * stage_fc - (IN) Field Processor stage control structure. 23666 * counter_mem - (OUT) pointer to array of counter memories. 23667 * Returns: 23668 * BCM_E_XXX 23669 */ 23670 int 23671 _bcm_field_th_policer_mem_get(int unit, 23672 _field_stage_t *stage_fc, 23673 int instance, 23674 soc_mem_t *policer_mem) 23675 { 23676 int pipe; 23677 soc_mem_t mem = INVALIDm; 23678 23679 if (NULL == policer_mem || NULL == stage_fc) { 23680 return (BCM_E_PARAM); 23681 } 23682 23683 pipe = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 23684 _FP_GLOBAL_INST : instance; 23685 23686 *policer_mem = INVALIDm; 23687 23688 switch (stage_fc->stage_id) { 23689 case _BCM_FIELD_STAGE_INGRESS: 23690 case _BCM_FIELD_STAGE_EXACTMATCH: 23691 mem = IFP_METER_TABLEm; 23692 break; 23693 case _BCM_FIELD_STAGE_EGRESS: 23694 mem = EFP_METER_TABLEm; 23695 break; 23696 default: 23697 return (BCM_E_INTERNAL); 23698 } 23699 23700 /* Retrieve meter table name. */ 23701 return (_bcm_field_mem_instance_get(unit, mem, pipe, policer_mem)); 23702 } 23703 23704 /* 23705 * Function: 23706 * _bcm_field_th_policer_install 23707 * Purpose: 23708 * Install a meter pair into the hardware tables. 23709 * Parameters: 23710 * unit - (IN) BCM device number. 23711 * f_ent - (IN) Field entry. 23712 * f_pl - (IN) Field policer descriptor. 23713 * Returns: 23714 * BCM_E_XXX 23715 */ 23716 int 23717 _bcm_field_th_policer_install(int unit, _field_entry_t *f_ent, 23718 _field_policer_t *f_pl) 23719 { 23720 int refresh_bitsize; /* Number of bits for the 23721 refresh rate field. */ 23722 int bucket_max_bitsize; /* Number of bits for the 23723 bucket max field. */ 23724 int rv; /* Operation return status. */ 23725 int multi_factor; /* Multiple Factor. */ 23726 uint32 bucketsize_peak = 0; /* Bucket size. */ 23727 uint32 refresh_rate_peak = 0; /* Policer refresh rate. */ 23728 uint32 granularity_peak = 0; /* Policer granularity. */ 23729 uint32 bucketsize_commit = 0; /* Bucket size. */ 23730 uint32 refresh_rate_commit = 0; /* Policer refresh rate. */ 23731 uint32 granularity_commit = 0; /* Policer granularity. */ 23732 uint32 flags; /* Policer flags. */ 23733 soc_mem_t policer_mem; /* Meter table name. */ 23734 _field_stage_t *stage_fc; /* Stage Field control structure. */ 23735 23736 /* Input parameters check. */ 23737 if ((NULL == f_ent) || (NULL == f_pl)) { 23738 return (BCM_E_PARAM); 23739 } 23740 23741 if (NULL == f_ent->group || NULL == f_ent->fs) { 23742 return (BCM_E_INTERNAL); 23743 } 23744 23745 if (0 == (f_pl->hw_flags & _FP_POLICER_DIRTY)) { 23746 return (BCM_E_NONE); 23747 } 23748 23749 23750 rv = _field_stage_control_get (unit, f_ent->fs->stage_id, &stage_fc); 23751 BCM_IF_ERROR_RETURN(rv); 23752 23753 /* Resolve meter table name. */ 23754 rv = _bcm_field_th_policer_mem_get(unit, stage_fc, f_ent->group->instance, 23755 &policer_mem); 23756 BCM_IF_ERROR_RETURN(rv); 23757 23758 refresh_bitsize = soc_mem_field_length(unit, policer_mem, REFRESHCOUNTf); 23759 bucket_max_bitsize = soc_mem_field_length(unit, policer_mem, BUCKETSIZEf); 23760 23761 /* lookup bucket size from tables */ 23762 flags = _BCM_XGS_METER_FLAG_GRANULARITY | _BCM_XGS_METER_FLAG_FP_POLICER; 23763 23764 /* TD2/TH has change in granularity calculation */ 23765 if (f_pl->cfg.flags & BCM_POLICER_MODE_PACKETS) { 23766 flags = flags | _BCM_XGS_METER_FLAG_FP_TD2_POLICER; 23767 } 23768 23769 /* Set packet mode flags setting */ 23770 if (f_pl->cfg.flags & BCM_POLICER_MODE_PACKETS) { 23771 flags |= _BCM_XGS_METER_FLAG_PACKET_MODE; 23772 } else { 23773 flags &= ~_BCM_XGS_METER_FLAG_PACKET_MODE; 23774 } 23775 23776 /* In Tomahawk EFP metering, Refresh tick duration has changed from 23777 * 7.8125us to 15.625us ,but the RTL does not double the REFRESHCOUNT 23778 * while putting the tokens into the bucket which is causing 50% lesser 23779 * traffic rate than expected. So the work around is the value programmed 23780 * from software in EFP meters needs to be doubled. 23781 * 23782 * In TH2, refresh tick is still 15.625 usec, but EFRESHCOUNT is doubled 23783 * in HW before adding to the bucket per refresh 23784 */ 23785 23786 multi_factor = 1; 23787 if (SOC_IS_TOMAHAWK(unit) && 23788 (_BCM_FIELD_STAGE_EGRESS == stage_fc->stage_id)) { 23789 multi_factor = 2; 23790 refresh_bitsize--; 23791 } 23792 23793 if (f_pl->cfg.mode != bcmPolicerModeSrTcm) { 23794 if (f_pl->hw_flags & _FP_POLICER_COMMITTED_DIRTY) { 23795 /* Calculate policer bucket size/refresh_rate/granularity. */ 23796 rv = _bcm_xgs_kbits_to_bucket_encoding(f_pl->cfg.ckbits_sec, 23797 f_pl->cfg.ckbits_burst, 23798 flags, refresh_bitsize, 23799 bucket_max_bitsize, 23800 &refresh_rate_commit, 23801 &bucketsize_commit, 23802 &granularity_commit); 23803 23804 if ((INVALIDm != policer_mem) && BCM_SUCCESS(rv)) { 23805 /* Programm policer parameters into hw. */ 23806 rv = _bcm_field_trx_policer_hw_update(unit, f_ent, f_pl, 23807 BCM_FIELD_METER_COMMITTED, 23808 bucketsize_commit, 23809 (refresh_rate_commit * 23810 multi_factor), 23811 granularity_commit, 23812 policer_mem); 23813 BCM_IF_ERROR_RETURN(rv); 23814 23815 } 23816 f_pl->hw_flags &= ~_FP_POLICER_COMMITTED_DIRTY; 23817 } 23818 23819 if (f_pl->hw_flags & _FP_POLICER_PEAK_DIRTY) { 23820 23821 if (_FP_POLICER_EXCESS_HW_METER(f_pl)) { 23822 /* 23823 * Rates are always set in committed variables, 23824 * for flow meters. 23825 */ 23826 f_pl->cfg.pkbits_sec = f_pl->cfg.ckbits_sec; 23827 f_pl->cfg.pkbits_burst = f_pl->cfg.ckbits_burst; 23828 } 23829 23830 /* Calculate policer bucket size/refresh_rate/granularity. */ 23831 rv = _bcm_xgs_kbits_to_bucket_encoding(f_pl->cfg.pkbits_sec, 23832 f_pl->cfg.pkbits_burst, 23833 flags, 23834 refresh_bitsize, 23835 bucket_max_bitsize, 23836 &refresh_rate_peak, 23837 &bucketsize_peak, 23838 &granularity_peak); 23839 23840 if ((INVALIDm != policer_mem) && BCM_SUCCESS(rv)) { 23841 /* Programm policer parameters into hw. */ 23842 rv = _bcm_field_trx_policer_hw_update(unit, f_ent, f_pl, 23843 BCM_FIELD_METER_PEAK, 23844 bucketsize_peak, 23845 (refresh_rate_peak * 23846 multi_factor), 23847 granularity_peak, 23848 policer_mem); 23849 BCM_IF_ERROR_RETURN(rv); 23850 23851 } 23852 23853 f_pl->hw_flags &= ~_FP_POLICER_PEAK_DIRTY; 23854 23855 if (_FP_POLICER_EXCESS_HW_METER(f_pl)) { 23856 /* Reset peak meter rates. */ 23857 f_pl->cfg.pkbits_sec = 0; 23858 f_pl->cfg.pkbits_burst = 0; 23859 } 23860 } 23861 } else { 23862 if (f_pl->hw_flags & _FP_POLICER_COMMITTED_DIRTY) { 23863 /* Calculate policer bucket size/refresh_rate/granularity. */ 23864 rv = _bcm_xgs_kbits_to_bucket_encoding(f_pl->cfg.ckbits_sec, 23865 f_pl->cfg.ckbits_burst, 23866 flags, refresh_bitsize, 23867 bucket_max_bitsize, 23868 &refresh_rate_commit, 23869 &bucketsize_commit, 23870 &granularity_commit); 23871 BCM_IF_ERROR_RETURN(rv); 23872 } 23873 23874 if (f_pl->hw_flags & _FP_POLICER_PEAK_DIRTY) { 23875 /* Calculate policer bucket size/refresh_rate/granularity. */ 23876 rv = _bcm_xgs_kbits_to_bucket_encoding(f_pl->cfg.pkbits_sec, 23877 f_pl->cfg.pkbits_burst, 23878 flags, 23879 refresh_bitsize, 23880 bucket_max_bitsize, 23881 &refresh_rate_peak, 23882 &bucketsize_peak, 23883 &granularity_peak); 23884 BCM_IF_ERROR_RETURN(rv); 23885 } 23886 23887 if (granularity_commit != granularity_peak) { 23888 if (granularity_commit < granularity_peak) { 23889 rv = _bcm_xgs_kbits_to_dual_bucket_encoding( 23890 f_pl->cfg.ckbits_sec, 23891 f_pl->cfg.ckbits_burst, 23892 flags, 23893 refresh_bitsize, 23894 bucket_max_bitsize, 23895 granularity_peak, 23896 &refresh_rate_commit, 23897 &bucketsize_commit, 23898 &granularity_commit); 23899 } else if (granularity_commit > granularity_peak) { 23900 rv = _bcm_xgs_kbits_to_dual_bucket_encoding( 23901 f_pl->cfg.pkbits_sec, 23902 f_pl->cfg.pkbits_burst, 23903 flags, 23904 refresh_bitsize, 23905 bucket_max_bitsize, 23906 granularity_commit, 23907 &refresh_rate_peak, 23908 &bucketsize_peak, 23909 &granularity_peak); 23910 } 23911 BCM_IF_ERROR_RETURN(rv); 23912 } 23913 23914 23915 if ((INVALIDm != policer_mem) && BCM_SUCCESS(rv)) { 23916 /* Programm policer parameters into hw. */ 23917 rv = _bcm_field_trx_policer_hw_update(unit, f_ent, f_pl, 23918 BCM_FIELD_METER_COMMITTED, 23919 bucketsize_commit, 23920 (refresh_rate_commit * 23921 multi_factor), 23922 granularity_commit, 23923 policer_mem); 23924 BCM_IF_ERROR_RETURN(rv); 23925 } 23926 23927 f_pl->hw_flags &= ~_FP_POLICER_COMMITTED_DIRTY; 23928 23929 if ((INVALIDm != policer_mem) && BCM_SUCCESS(rv)) { 23930 /* Programm policer parameters into hw. */ 23931 rv = _bcm_field_trx_policer_hw_update(unit, f_ent, f_pl, 23932 BCM_FIELD_METER_PEAK, 23933 bucketsize_peak, 23934 (refresh_rate_peak * 23935 multi_factor), 23936 granularity_peak, 23937 policer_mem); 23938 BCM_IF_ERROR_RETURN(rv); 23939 } 23940 23941 f_pl->hw_flags &= ~_FP_POLICER_PEAK_DIRTY; 23942 } 23943 23944 /* Update current policer counters from hw */ 23945 rv = _field_entry_policer_update_actual_hw_rates(unit, policer_mem, 23946 f_ent->group->instance, f_ent, f_pl); 23947 23948 return BCM_E_NONE; 23949 } 23950 23951 /* 23952 * Function: 23953 * _bcm_field_th_policer_meter_hw_free 23954 * 23955 * Purpose: 23956 * Clear the meter entries from the h/w associated with the policer 23957 * 23958 * Parameters: 23959 * unit - (IN) BCM device number. 23960 * level - (IN) Policer level. 23961 * f_ent - (IN) Entry policer belongs to. 23962 * Returns: 23963 * BCM_E_XXX 23964 */ 23965 int 23966 _bcm_field_th_policer_meter_hw_free(int unit, _field_entry_t *f_ent, 23967 _field_entry_policer_t *f_ent_pl) 23968 { 23969 int rv = BCM_E_NONE; /* Return value */ 23970 int idx; /* Meter hw index */ 23971 soc_mem_t policer_mem; /* Meter table identifier. */ 23972 _field_meter_pool_t *mp; /* Meter pool pointer. */ 23973 _field_slice_t *fs; /* Field slice pointer. */ 23974 _field_stage_t *stage_fc; /* Stage field control structure */ 23975 _field_policer_t *f_pl; /* Policer descriptor */ 23976 _field_stage_id_t stage_id; /* Stage id used for metering. */ 23977 23978 stage_id = (_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id) ? \ 23979 _BCM_FIELD_STAGE_INGRESS : f_ent->group->stage_id; 23980 23981 /* Get field stage control structure. */ 23982 BCM_IF_ERROR_RETURN 23983 (_field_stage_control_get(unit, stage_id, 23984 &stage_fc)); 23985 23986 /* Resolve meter table name. */ 23987 rv = _bcm_field_th_policer_mem_get(unit, stage_fc, f_ent->group->instance, &policer_mem); 23988 BCM_IF_ERROR_RETURN(rv); 23989 23990 /* Read policer configuration.*/ 23991 BCM_IF_ERROR_RETURN 23992 (_bcm_field_policer_get(unit, f_ent_pl->pid, &f_pl)); 23993 23994 /* Must be a valid meter index. */ 23995 if (f_pl->hw_index == _FP_INVALID_INDEX) { 23996 return (BCM_E_INTERNAL); 23997 } 23998 23999 if (stage_fc->flags & _FP_STAGE_GLOBAL_METER_POOLS) { 24000 mp = stage_fc->meter_pool[f_ent->group->instance][f_pl->pool_index]; 24001 /* Get slice policer installed in. */ 24002 idx = (f_pl->pool_index * mp->pool_size) + (2 * f_pl->hw_index); 24003 24004 } else { 24005 fs = stage_fc->slices[f_ent->group->instance] + f_pl->pool_index; 24006 idx = fs->start_tcam_idx + (2 * f_pl->hw_index); 24007 } 24008 24009 if (idx < soc_mem_index_min(unit, policer_mem) || 24010 idx > soc_mem_index_max(unit, policer_mem)) { 24011 return (BCM_E_INTERNAL); 24012 } 24013 24014 if (!_FP_POLICER_IS_FLOW_MODE(f_pl)) { 24015 rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL, 24016 idx, soc_mem_entry_null(unit, policer_mem)); 24017 BCM_IF_ERROR_RETURN(rv); 24018 24019 idx++; 24020 rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL, 24021 idx, soc_mem_entry_null(unit, policer_mem)); 24022 } else { 24023 if (_FP_POLICER_COMMITTED_HW_METER(f_pl)) { 24024 idx ++; 24025 } 24026 24027 rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL, 24028 idx, soc_mem_entry_null(unit, policer_mem)); 24029 } 24030 24031 return (BCM_E_NONE); 24032 } 24033 24034 /* 24035 * Function: 24036 * _bcm_field_th_policer_meter_hw_free_old 24037 * 24038 * Purpose: 24039 * Clear the meter entries from the h/w associated with the policer 24040 * priori to calling bem_policer_set API 24041 * 24042 * Parameters: 24043 * unit - (IN) BCM device number. 24044 * level - (IN) Policer level. 24045 * f_ent - (IN) Entry policer belongs to. 24046 * Returns: 24047 * BCM_E_XXX 24048 */ 24049 int 24050 _bcm_field_th_policer_meter_hw_free_old(int unit, _field_entry_t *f_ent, 24051 _field_entry_policer_t *f_ent_pl) 24052 { 24053 int rv = BCM_E_NONE; /* Return value */ 24054 int idx; /* Meter hw index */ 24055 soc_mem_t policer_mem; /* Meter table identifier. */ 24056 _field_meter_pool_t *mp; /* Meter pool pointer. */ 24057 _field_slice_t *fs; /* Field slice pointer. */ 24058 _field_stage_t *stage_fc; /* Stage field control structure */ 24059 _field_policer_t *f_pl; /* Policer descriptor */ 24060 _field_stage_id_t stage_id; /* Stage id used for metering. */ 24061 24062 stage_id = (_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id) ? \ 24063 _BCM_FIELD_STAGE_INGRESS : f_ent->group->stage_id; 24064 24065 /* Get field stage control structure. */ 24066 BCM_IF_ERROR_RETURN 24067 (_field_stage_control_get(unit, stage_id, 24068 &stage_fc)); 24069 24070 /* Resolve meter table name. */ 24071 rv = _bcm_field_th_policer_mem_get(unit, stage_fc, f_ent->group->instance, &policer_mem); 24072 BCM_IF_ERROR_RETURN(rv); 24073 24074 /* Read policer configuration.*/ 24075 BCM_IF_ERROR_RETURN 24076 (_bcm_field_policer_get(unit, f_ent_pl->pid, &f_pl)); 24077 24078 /* Must be a valid meter index. */ 24079 if (f_pl->old_hw_index == _FP_INVALID_INDEX) { 24080 return (BCM_E_INTERNAL); 24081 } 24082 24083 if (stage_fc->flags & _FP_STAGE_GLOBAL_METER_POOLS) { 24084 mp = stage_fc->meter_pool[f_ent->group->instance][f_pl->old_pool_index]; 24085 /* Get slice policer installed in. */ 24086 idx = (f_pl->old_pool_index * mp->pool_size) + (2 * f_pl->old_hw_index); 24087 24088 } else { 24089 fs = stage_fc->slices[f_ent->group->instance] + f_pl->old_pool_index; 24090 idx = fs->start_tcam_idx + (2 * f_pl->old_hw_index); 24091 } 24092 24093 if (idx < soc_mem_index_min(unit, policer_mem) || 24094 idx > soc_mem_index_max(unit, policer_mem)) { 24095 return (BCM_E_INTERNAL); 24096 } 24097 24098 if (bcmPolicerModeCommitted != (f_pl)->old_mode) { 24099 rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL, 24100 idx, soc_mem_entry_null(unit, policer_mem)); 24101 BCM_IF_ERROR_RETURN(rv); 24102 24103 idx++; 24104 rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL, 24105 idx, soc_mem_entry_null(unit, policer_mem)); 24106 } else { 24107 if ((bcmPolicerModeCommitted == (f_pl)->old_mode) && 24108 (!((f_pl)->old_hw_flags & _FP_POLICER_EXCESS_METER))) { 24109 idx ++; 24110 } 24111 rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL, 24112 idx, soc_mem_entry_null(unit, policer_mem)); 24113 } 24114 24115 return (BCM_E_NONE); 24116 } 24117 /* END OF POLICER ROUTINES */ 24118 24119 24120 /* 24121 * Function: 24122 * _field_th_hw_clear 24123 * 24124 * Purpose: 24125 * Clear hardware memories for the requested stage. 24126 * 24127 * Parameters: 24128 * unit - (IN) BCM device number. 24129 * stage_fc - (IN) Field Processor stage control structure. 24130 * 24131 * Returns: 24132 * BCM_E_INTERNAL - Invalid CAP stage. 24133 * BCM_E_NONE - Success. 24134 */ 24135 STATIC int 24136 _field_th_hw_clear(int unit, _field_stage_t *stage_fc, _field_control_t *fc) 24137 { 24138 int pipe = 0; 24139 soc_mem_t fp_tcam; 24140 24141 /* Input parameters check. */ 24142 if (NULL == stage_fc) { 24143 return (BCM_E_NONE); 24144 } 24145 24146 /* 24147 * Note: DO NOT CLEAR HW tables when in warm boot mode. 24148 * If HW tables are cleared, there is no configuration available in hardware 24149 * to perform Level2 or Level1 WB recovery 24150 */ 24151 if (SOC_WARM_BOOT(unit)) { 24152 return (BCM_E_NONE); 24153 } 24154 24155 switch (stage_fc->stage_id) { 24156 case _BCM_FIELD_STAGE_INGRESS: 24157 if (soc_feature(unit, soc_feature_udf_support) && UDF_CTRL(unit)) { 24158 if (UDF_CTRL(unit)->udf_used_by_module == UDF_USED_BY_FIELD_MODULE) { 24159 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, FP_UDF_TCAMm, COPYNO_ALL, 24160 TRUE)); 24161 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, FP_UDF_OFFSETm, COPYNO_ALL, 24162 TRUE)); 24163 } 24164 } 24165 24166 if (RANGE_CTRL(unit)) { 24167 if (!RANGE_CTRL(unit)->range_used_by_module) { 24168 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_RANGE_CHECKm, 24169 COPYNO_ALL, TRUE)); 24170 } 24171 } else { 24172 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_RANGE_CHECKm, 24173 COPYNO_ALL, TRUE)); 24174 } 24175 24176 if (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == TRUE) { 24177 #if defined (BCM_TOMAHAWK3_SUPPORT) 24178 if (SOC_IS_TOMAHAWK3(unit)) { 24179 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_TCAMm, 24180 COPYNO_ALL, TRUE)); 24181 } else 24182 #endif 24183 { 24184 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_TCAM_WIDEm, 24185 COPYNO_ALL, TRUE)); 24186 } 24187 24188 } else { 24189 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) { 24190 if (!(fc->pipe_map & (1 << pipe))) { 24191 continue; 24192 } 24193 #if defined (BCM_TOMAHAWK3_SUPPORT) 24194 if (soc_feature(unit, soc_feature_th3_style_fp)) { 24195 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24196 IFP_TCAMm, 24197 pipe, 24198 &fp_tcam)); 24199 } else 24200 #endif 24201 { 24202 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24203 IFP_TCAM_WIDEm, 24204 pipe, 24205 &fp_tcam)); 24206 } 24207 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, fp_tcam, 24208 COPYNO_ALL, TRUE)); 24209 } 24210 } 24211 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_POLICY_TABLEm, 24212 COPYNO_ALL, TRUE)); 24213 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_LOGICAL_TABLE_SELECTm, 24214 COPYNO_ALL, TRUE)); 24215 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24216 IFP_KEY_GEN_PROGRAM_PROFILEm, COPYNO_ALL, TRUE)); 24217 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24218 IFP_KEY_GEN_PROGRAM_PROFILE2m, COPYNO_ALL, TRUE)); 24219 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24220 IFP_LOGICAL_TABLE_ACTION_PRIORITYm, COPYNO_ALL, TRUE)); 24221 break; 24222 case _BCM_FIELD_STAGE_LOOKUP: 24223 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, VFP_TCAMm, COPYNO_ALL, 24224 TRUE)); 24225 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, VFP_POLICY_TABLEm, 24226 COPYNO_ALL, TRUE)); 24227 /* 24228 * Group destroy done as part of Field Deinit "bcm_esw_field_detach" 24229 * clears following registers: 24230 * VFP_KEY_CONTROL_1 24231 * VFP_KEY_CONTROL_2 24232 * VFP_SLICE_MAP 24233 */ 24234 break; 24235 case _BCM_FIELD_STAGE_EGRESS: 24236 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) { 24237 if (!(fc->pipe_map & (1 << pipe))) { 24238 continue; 24239 } 24240 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, EFP_COUNTER_TABLEm, 24241 pipe, 24242 &fp_tcam)); 24243 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, fp_tcam, 24244 COPYNO_ALL, TRUE)); 24245 } 24246 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, EFP_TCAMm, COPYNO_ALL, 24247 TRUE)); 24248 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, EFP_POLICY_TABLEm, 24249 COPYNO_ALL, TRUE)); 24250 if (soc_feature(unit, soc_feature_field_egress_metering)) { 24251 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, EFP_METER_TABLEm, 24252 COPYNO_ALL, TRUE)); 24253 } 24254 24255 break; 24256 case _BCM_FIELD_STAGE_CLASS: 24257 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, TCP_FNm, COPYNO_ALL, 24258 TRUE)); 24259 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, TOS_FNm, COPYNO_ALL, 24260 TRUE)); 24261 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, TTL_FNm, COPYNO_ALL, 24262 TRUE)); 24263 if (!SOC_IS_TOMAHAWK3(unit)) { 24264 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, SRC_COMPRESSIONm, COPYNO_ALL, 24265 TRUE)); 24266 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, DST_COMPRESSIONm, COPYNO_ALL, 24267 TRUE)); 24268 } 24269 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IP_PROTO_MAPm, COPYNO_ALL, 24270 TRUE)); 24271 break; 24272 case _BCM_FIELD_STAGE_EXACTMATCH: 24273 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24274 EXACT_MATCH_LOGICAL_TABLE_SELECTm, COPYNO_ALL, TRUE)); 24275 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24276 EXACT_MATCH_KEY_GEN_MASKm, COPYNO_ALL, TRUE)); 24277 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24278 EXACT_MATCH_DEFAULT_POLICYm, COPYNO_ALL, TRUE)); 24279 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24280 EXACT_MATCH_KEY_GEN_PROGRAM_PROFILEm, COPYNO_ALL, TRUE)); 24281 if(!SAL_BOOT_PLISIM) { 24282 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24283 EXACT_MATCH_2m, COPYNO_ALL, TRUE)); 24284 } 24285 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24286 EXACT_MATCH_ACTION_PROFILEm, COPYNO_ALL, TRUE)); 24287 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24288 EXACT_MATCH_QOS_ACTIONS_PROFILEm, COPYNO_ALL, TRUE)); 24289 break; 24290 #if defined(BCM_FLOWTRACKER_SUPPORT) 24291 case _BCM_FIELD_STAGE_FLOWTRACKER: 24292 if (!soc_feature(unit, soc_feature_field_flowtracker_support)) { 24293 break; 24294 } 24295 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_LOGICAL_TBL_SEL_TCAMm, 24296 COPYNO_ALL, TRUE)); 24297 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_LOGICAL_TBL_SEL_SRAMm, 24298 COPYNO_ALL, TRUE)); 24299 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_MUX_CTRL_0m, 24300 COPYNO_ALL, TRUE)); 24301 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_MASK_0m, 24302 COPYNO_ALL, TRUE)); 24303 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_MUX_CTRL_1m, 24304 COPYNO_ALL, TRUE)); 24305 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_MASK_1m, 24306 COPYNO_ALL, TRUE)); 24307 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_MUX_CTRL_2_PLUS_MASKm, 24308 COPYNO_ALL, TRUE)); 24309 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_TCAMm, 24310 COPYNO_ALL, TRUE)); 24311 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_POLICYm, 24312 COPYNO_ALL, TRUE)); 24313 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_KEY_LTS_MUX_CTRL_0m, 24314 COPYNO_ALL, TRUE)); 24315 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_KEY_LTS_MASK_0m, 24316 COPYNO_ALL, TRUE)); 24317 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_KEY_LTS_MUX_CTRL_1m, 24318 COPYNO_ALL, TRUE)); 24319 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_KEY_LTS_MASK_1m, 24320 COPYNO_ALL, TRUE)); 24321 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_KEY_LTS_MUX_CTRL_2_PLUS_MASKm, 24322 COPYNO_ALL, TRUE)); 24323 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_DATA_LTS_MUX_CTRL_0m, 24324 COPYNO_ALL, TRUE)); 24325 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_DATA_LTS_MASK_0m, 24326 COPYNO_ALL, TRUE)); 24327 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_DATA_LTS_MUX_CTRL_1_PLUS_MASKm, 24328 COPYNO_ALL, TRUE)); 24329 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_ALU_DATA_LTS_MUX_CTRL_PLUS_MASKm, 24330 COPYNO_ALL, TRUE)); 24331 break; 24332 #endif 24333 default: 24334 /* Should never hit this default condition. */ 24335 return (BCM_E_INTERNAL); 24336 24337 } /* end switch */ 24338 24339 return (BCM_E_NONE); 24340 } 24341 24342 /* 24343 * Function: 24344 * _field_th_pipes_hw_clear 24345 * 24346 * Purpose: 24347 * Clear hardware memories for a requested stage on all pipes. 24348 * 24349 * Parameters: 24350 * unit - (IN) BCM device number 24351 * stage_fc - (IN) Field Processor stage control structure. 24352 * 24353 * Returns: 24354 * BCM_E_INTERNAL - Invalid CAP stage. 24355 * BCM_E_NONE - Success. 24356 */ 24357 STATIC int 24358 _field_th_pipes_hw_clear(int unit, _field_stage_t *stage_fc, 24359 _field_control_t *fc) 24360 { 24361 int pipe; /* Pipe iterator. */ 24362 soc_mem_t vfp_tcam; /* VFP TCAM memory names. */ 24363 soc_mem_t vfp_policy; /* VFP POLICY table memory names. */ 24364 soc_mem_t rcheck; /* IFP range checker memory names. */ 24365 soc_mem_t fp_tcam;/* IFP TCAM memory names. */ 24366 soc_mem_t fp_policy; /* IFP POLICY memory names. */ 24367 soc_mem_t lt_tcam; /* LT selection TCAM memory names. */ 24368 soc_mem_t kgen_prof1; /* Keygen program memory names. */ 24369 soc_mem_t kgen_prof2; /* Keygen program memory names. */ 24370 soc_mem_t action_pri; /* LT priority memory names. */ 24371 soc_mem_t efp_tcam; /* EFP TCAM memory names. */ 24372 soc_mem_t efp_policy; /* EFP policy memory names. */ 24373 soc_mem_t efp_meter; /* EFP meter memory names. */ 24374 soc_mem_t efp_cntr; /* EFP counter memory names. */ 24375 soc_mem_t ttl_fn ; /* Class TTL memory names. */ 24376 soc_mem_t tos_fn; /* Class TOS memory names. */ 24377 soc_mem_t tcp_fn; /* Class TCP memory names. */ 24378 soc_mem_t src_compress; /* Class Src Compression memory names. */ 24379 soc_mem_t dst_compress; /* Class Dst Compression memory names. */ 24380 soc_mem_t ip_proto_map; /* IP Protocol Map Memory names. */ 24381 soc_mem_t lt_em_tcam; 24382 soc_mem_t lt_em_kgen_mask; 24383 soc_mem_t lt_em_def_policy; 24384 soc_mem_t kgen_em_prof; 24385 soc_mem_t em_act_prof; 24386 soc_mem_t em_qos_act_prof; 24387 soc_mem_t em_uft_wide; 24388 soc_mem_t em_uft_narrow; 24389 24390 /* Input parameters check. */ 24391 if (NULL == stage_fc) { 24392 return (BCM_E_NONE); 24393 } 24394 24395 /* 24396 * Note: DO NOT CLEAR HW tables when in warm boot mode. 24397 * If HW tables are cleared, there is no configuration available in hardware 24398 * to perform Level2 or Level1 WB recovery 24399 */ 24400 if (SOC_WARM_BOOT(unit)) { 24401 return (BCM_E_NONE); 24402 } 24403 24404 switch (stage_fc->stage_id) { 24405 case _BCM_FIELD_STAGE_INGRESS: 24406 if (RANGE_CTRL(unit)) { 24407 if (!RANGE_CTRL(unit)->range_used_by_module) { 24408 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) { 24409 if (!(fc->pipe_map & (1 << pipe))) { 24410 continue; 24411 } 24412 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24413 IFP_RANGE_CHECKm, 24414 pipe, 24415 &rcheck)); 24416 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, rcheck, 24417 COPYNO_ALL, TRUE)); 24418 } 24419 } 24420 } else { 24421 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) { 24422 if (!(fc->pipe_map & (1 << pipe))) { 24423 continue; 24424 } 24425 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24426 IFP_RANGE_CHECKm, 24427 pipe, 24428 &rcheck)); 24429 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, rcheck, 24430 COPYNO_ALL, TRUE)); 24431 } 24432 } 24433 24434 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) { 24435 if (!(fc->pipe_map & (1 << pipe))) { 24436 continue; 24437 } 24438 #if defined (BCM_TOMAHAWK3_SUPPORT) 24439 if (soc_feature(unit, soc_feature_th3_style_fp)) { 24440 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24441 IFP_TCAMm, 24442 pipe, 24443 &fp_tcam)); 24444 } else 24445 #endif 24446 { 24447 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24448 IFP_TCAM_WIDEm, 24449 pipe, 24450 &fp_tcam)); 24451 } 24452 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, fp_tcam, 24453 COPYNO_ALL, TRUE)); 24454 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24455 IFP_POLICY_TABLEm, 24456 pipe, 24457 &fp_policy)); 24458 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, fp_policy, 24459 COPYNO_ALL, TRUE)); 24460 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24461 IFP_LOGICAL_TABLE_SELECTm, 24462 pipe, 24463 <_tcam)); 24464 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, lt_tcam, 24465 COPYNO_ALL, TRUE)); 24466 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24467 IFP_KEY_GEN_PROGRAM_PROFILEm, 24468 pipe, 24469 &kgen_prof1)); 24470 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, kgen_prof1, 24471 COPYNO_ALL, TRUE)); 24472 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24473 IFP_KEY_GEN_PROGRAM_PROFILE2m, 24474 pipe, 24475 &kgen_prof2)); 24476 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, kgen_prof2, 24477 COPYNO_ALL, TRUE)); 24478 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24479 IFP_LOGICAL_TABLE_ACTION_PRIORITYm, 24480 pipe, 24481 &action_pri)); 24482 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, action_pri, 24483 COPYNO_ALL, TRUE)); 24484 } 24485 /* 24486 * Currently Field module doesn't support per-pipe mode for UDF. 24487 * Hence, accessing the memory globally. 24488 */ 24489 if (soc_feature(unit, soc_feature_udf_support) && UDF_CTRL(unit)) { 24490 if (UDF_CTRL(unit)->udf_used_by_module 24491 == UDF_USED_BY_FIELD_MODULE) { 24492 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24493 FP_UDF_TCAMm, COPYNO_ALL, 24494 TRUE)); 24495 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24496 FP_UDF_OFFSETm, COPYNO_ALL, 24497 TRUE)); 24498 } 24499 } 24500 break; 24501 case _BCM_FIELD_STAGE_LOOKUP: 24502 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) { 24503 if (!(fc->pipe_map & (1 << pipe))) { 24504 continue; 24505 } 24506 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24507 VFP_TCAMm, 24508 pipe, &vfp_tcam)); 24509 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24510 VFP_POLICY_TABLEm, 24511 pipe, 24512 &vfp_policy)); 24513 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, vfp_tcam, 24514 COPYNO_ALL, TRUE)); 24515 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, vfp_policy, 24516 COPYNO_ALL, TRUE)); 24517 } 24518 break; 24519 case _BCM_FIELD_STAGE_EGRESS: 24520 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) { 24521 if (!(fc->pipe_map & (1 << pipe))) { 24522 continue; 24523 } 24524 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24525 EFP_TCAMm, 24526 pipe, &efp_tcam)); 24527 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24528 EFP_POLICY_TABLEm, 24529 pipe, 24530 &efp_policy)); 24531 if (soc_feature(unit, soc_feature_field_egress_metering)) { 24532 24533 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24534 EFP_METER_TABLEm, 24535 pipe, &efp_meter)); 24536 } 24537 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24538 EFP_COUNTER_TABLEm, 24539 pipe, 24540 &efp_cntr)); 24541 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, efp_tcam, 24542 COPYNO_ALL, TRUE)); 24543 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, efp_policy, 24544 COPYNO_ALL, TRUE)); 24545 if (soc_feature(unit, soc_feature_field_egress_metering)) { 24546 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, efp_meter, 24547 COPYNO_ALL, TRUE)); 24548 } 24549 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, efp_cntr, 24550 COPYNO_ALL, TRUE)); 24551 } 24552 break; 24553 case _BCM_FIELD_STAGE_CLASS: 24554 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) { 24555 if (!(fc->pipe_map & (1 << pipe))) { 24556 continue; 24557 } 24558 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24559 TTL_FNm, 24560 pipe, 24561 &ttl_fn)); 24562 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, ttl_fn, 24563 COPYNO_ALL, TRUE)); 24564 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24565 TOS_FNm, 24566 pipe, 24567 &tos_fn)); 24568 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, tos_fn, 24569 COPYNO_ALL, TRUE)); 24570 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24571 TCP_FNm, 24572 pipe, 24573 &tcp_fn)); 24574 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, tcp_fn, 24575 COPYNO_ALL, TRUE)); 24576 if (!(SOC_IS_TOMAHAWK3(unit))) { 24577 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24578 SRC_COMPRESSIONm, 24579 pipe, 24580 &src_compress)); 24581 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, src_compress, 24582 COPYNO_ALL, TRUE)); 24583 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24584 DST_COMPRESSIONm, 24585 pipe, 24586 &dst_compress)); 24587 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, dst_compress, 24588 COPYNO_ALL, TRUE)); 24589 } 24590 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24591 IP_PROTO_MAPm, 24592 pipe, 24593 &ip_proto_map)); 24594 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, ip_proto_map, 24595 COPYNO_ALL, TRUE)); 24596 } 24597 break; 24598 case _BCM_FIELD_STAGE_EXACTMATCH: 24599 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) { 24600 if (!(fc->pipe_map & (1 << pipe))) { 24601 continue; 24602 } 24603 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24604 EXACT_MATCH_LOGICAL_TABLE_SELECTm, 24605 pipe, 24606 <_em_tcam)); 24607 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24608 lt_em_tcam, COPYNO_ALL, TRUE)); 24609 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24610 EXACT_MATCH_KEY_GEN_MASKm, 24611 pipe, 24612 <_em_kgen_mask)); 24613 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24614 lt_em_kgen_mask, COPYNO_ALL, TRUE)); 24615 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24616 EXACT_MATCH_DEFAULT_POLICYm, 24617 pipe, 24618 <_em_def_policy)); 24619 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24620 lt_em_def_policy, COPYNO_ALL, TRUE)); 24621 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24622 EXACT_MATCH_KEY_GEN_PROGRAM_PROFILEm, 24623 pipe, 24624 &kgen_em_prof)); 24625 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24626 kgen_em_prof, COPYNO_ALL, TRUE)); 24627 #if defined (BCM_TOMAHAWK3_SUPPORT) 24628 if (soc_feature(unit, soc_feature_th3_style_fp)) { 24629 24630 } else 24631 #endif 24632 { 24633 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24634 EXACT_MATCH_2m, 24635 pipe, 24636 &em_uft_narrow)); 24637 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24638 em_uft_narrow, COPYNO_ALL, TRUE)); 24639 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24640 EXACT_MATCH_4m, 24641 pipe, 24642 &em_uft_wide)); 24643 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24644 em_uft_wide, COPYNO_ALL, TRUE)); 24645 } 24646 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24647 EXACT_MATCH_ACTION_PROFILEm, 24648 pipe, 24649 &em_act_prof)); 24650 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24651 em_act_prof, COPYNO_ALL, TRUE)); 24652 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 24653 EXACT_MATCH_QOS_ACTIONS_PROFILEm, 24654 pipe, 24655 &em_qos_act_prof)); 24656 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, 24657 em_qos_act_prof, COPYNO_ALL, TRUE)); 24658 } 24659 break; 24660 default: 24661 /* Should never hit this default condition. */ 24662 return (BCM_E_INTERNAL); 24663 24664 } /* end switch */ 24665 24666 return (BCM_E_NONE); 24667 } 24668 24669 /* 24670 * Function: 24671 * _field_th_pipes_meter_refresh_enable 24672 * 24673 * Purpose: 24674 * Enable meters refresh cycle on all pipes. 24675 * 24676 * Parameters: 24677 * unit - (IN) BCM device number. 24678 * fc - (IN) Field control structure. 24679 * state - (IN) On/Off boolean. 24680 * 24681 * Returns: 24682 * BCM_E_PARAM - Null field control structure or invalid value for "state". 24683 * BCM_E_INTERNAL - Null field stage control structure. 24684 * BCM_E_NONE - Success. 24685 */ 24686 STATIC int 24687 _field_th_pipes_meter_refresh_enable(int unit, 24688 _field_control_t *fc, 24689 uint32 state) 24690 { 24691 int pipe; /* Pipe iterator. */ 24692 _field_stage_t *stage_fc; /* Pointer to Stage control structure. */ 24693 soc_reg_t reg; /* FP IP auxilary arbiter control register. */ 24694 24695 /* Input parameters check. */ 24696 if (NULL == fc || ((TRUE != state) && (FALSE != state))) { 24697 return (BCM_E_PARAM); 24698 } 24699 24700 24701 /* Get the stage control handle. */ 24702 stage_fc = fc->stages; 24703 24704 /* Ensure stage data structure is initialized. */ 24705 if (NULL == stage_fc) { 24706 return (BCM_E_INTERNAL); 24707 } 24708 24709 /* Enable FP meter refresh in each pipe */ 24710 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) { 24711 if (!(fc->pipe_map & (1 << pipe))) { 24712 continue; 24713 } 24714 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 24715 AUX_ARB_CONTROLr, 24716 pipe, ®)); 24717 BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, reg, 24718 REG_PORT_ANY, FP_REFRESH_ENABLEf, state)); 24719 } 24720 return (BCM_E_NONE); 24721 } 24722 24723 /* 24724 * Function: 24725 * _field_th_detach 24726 * 24727 * Purpose: 24728 * Clears field module hardware tables based on Group operational mode. 24729 * Also disables FP meter refresh and FP lookup control on ports. 24730 * 24731 * Parameters: 24732 * unit - (IN) BCM device number 24733 * fc - (IN) Field control structure. 24734 * 24735 * Returns: 24736 * BCM_E_PARAM - Null field control structure. 24737 * BCM_E_INTERNAL - Invalid CAP stage ID. 24738 * BCM_E_NONE - Success. 24739 */ 24740 STATIC int 24741 _field_th_detach(int unit, _field_control_t *fc) 24742 { 24743 _field_stage_t *stage_fc; /* Stage control structure pointer. */ 24744 24745 /* Input parameters check. */ 24746 if (NULL == fc) { 24747 return (BCM_E_PARAM); 24748 } 24749 24750 /* Get the stage control handle. */ 24751 stage_fc = fc->stages; 24752 24753 /* 24754 * Initialize FP hardware tables based on the device Group Oper mode 24755 * settings. 24756 */ 24757 switch (stage_fc->oper_mode) { 24758 case bcmFieldGroupOperModeGlobal: 24759 /* Legacy global mode, use DUPLICATE view to clear FP HW tables. */ 24760 while (stage_fc) { 24761 24762 /* 24763 * Note : DO NOT CLEAR Exact Match HW tables if ExactMatch SKIP detach flag is set. 24764 * Retaining ExactMatch groups during bcm_field_init for retaining ExactMatch stage. 24765 */ 24766 if ((fc->flags & _FP_EXACTMATCH_STAGE_SKIP_DETACH) && 24767 (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id)) { 24768 /* Goto next stage */ 24769 stage_fc = stage_fc->next; 24770 continue; 24771 } 24772 /* Clear hardware table */ 24773 BCM_IF_ERROR_RETURN(_field_th_hw_clear(unit, stage_fc, fc)); 24774 24775 /* Goto next stage */ 24776 stage_fc = stage_fc->next; 24777 } 24778 24779 /* Disable FP meter refresh on all pipes. */ 24780 if (!(soc_feature(unit, soc_feature_th3_style_fp))) { 24781 BCM_IF_ERROR_RETURN(_field_meter_refresh_enable_set(unit, fc, 24782 FALSE)); 24783 } 24784 break; 24785 24786 case bcmFieldGroupOperModePipeLocal: 24787 while (stage_fc) { 24788 /* 24789 * Note : DO NOT CLEAR Exact Match HW tables if ExactMatch SKIP detach flag is set. 24790 * Retaining ExactMatch groups during bcm_field_init for retaining ExactMatch stage. 24791 */ 24792 if ((fc->flags & _FP_EXACTMATCH_STAGE_SKIP_DETACH) && 24793 (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id)) { 24794 /* Goto next stage */ 24795 stage_fc = stage_fc->next; 24796 continue; 24797 } 24798 /* Clear hardware table */ 24799 BCM_IF_ERROR_RETURN(_field_th_pipes_hw_clear(unit, stage_fc, fc)); 24800 24801 /* Goto next stage */ 24802 stage_fc = stage_fc->next; 24803 } 24804 24805 /* Enable FP meter refresh on all pipes. */ 24806 if (!(soc_feature(unit, soc_feature_th3_style_fp))) { 24807 BCM_IF_ERROR_RETURN(_field_th_pipes_meter_refresh_enable(unit, fc, 24808 FALSE)); 24809 } 24810 break; 24811 default: 24812 break; 24813 } 24814 24815 /* Don't disable port controls during Warmboot or Reloading state */ 24816 if (0 == SOC_HW_ACCESS_DISABLE(unit)) { 24817 /* Disable filter processor */ 24818 BCM_IF_ERROR_RETURN(_field_port_filter_enable_set(unit, fc, FALSE)); 24819 } 24820 24821 /* Murthy: Check and disable any counter ejection support here. */ 24822 24823 return (BCM_E_NONE); 24824 } 24825 /* 24826 * Function: 24827 * _field_th_egress_slice_clear 24828 * 24829 * Purpose: 24830 * Reset slice configuraton on group deletion event. 24831 * 24832 * Parameters: 24833 * unit - (IN) BCM device number. 24834 * fg - (IN) Reference to Field Group Structure. 24835 * slice_numb - (IN) Slice number to set mode for. 24836 * 24837 * Returns: 24838 * BCM_E_XXX 24839 */ 24840 STATIC int 24841 _field_th_egress_slice_clear(int unit, _field_group_t *fg, uint8 slice_numb) 24842 { 24843 int rv; /* Operation return status. */ 24844 int inst; /* Pipe Instance. */ 24845 uint32 mode_val[2] = {0, 0}; /* Mode values for slice control. */ 24846 uint32 class_mode_val[7] = {0, 0, 0, 0, 0, 0, 0}; /* Mode values for 24847 * class select register 24848 */ 24849 _field_stage_t *stage_fc; /* Ref. to Stage control structure. */ 24850 soc_reg_t efp_classid_sel_r; 24851 soc_reg_t efp_key4_dvp_reg; 24852 soc_reg_t efp_key4_mdl_reg; 24853 soc_reg_t efp_slice_control_reg; 24854 soc_reg_t efp_key8_dvp_reg; 24855 soc_reg_t efp_dst_port_reg; 24856 soc_reg_t efp_key4_class_reg; 24857 soc_reg_t efp_key8_class_reg; 24858 24859 #if defined (BCM_TRIDENT3_SUPPORT) 24860 soc_reg_t efp_classid_b_sel_reg; 24861 int idx = 0; 24862 static const soc_field_t efp_dest_port_selector_flds[][2] = { 24863 {SLICE_0_F1_DEST_SELf, SLICE_0_F5_DEST_SELf}, 24864 {SLICE_1_F1_DEST_SELf, SLICE_1_F5_DEST_SELf}, 24865 {SLICE_2_F1_DEST_SELf, SLICE_2_F5_DEST_SELf}, 24866 {SLICE_3_F1_DEST_SELf, SLICE_3_F5_DEST_SELf}, 24867 }; 24868 #endif 24869 24870 /* Input parameters check. */ 24871 if (slice_numb >= COUNTOF(_th_efp_slice_mode)) { 24872 return (BCM_E_PARAM); 24873 } 24874 24875 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, 24876 fg->stage_id, &stage_fc)); 24877 24878 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 24879 inst = _FP_GLOBAL_INST; 24880 } else { 24881 inst = fg->instance; 24882 } 24883 24884 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 24885 EFP_KEY4_DVP_SELECTORr, 24886 inst, &efp_key4_dvp_reg)); 24887 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 24888 EFP_KEY8_DVP_SELECTORr, 24889 inst, &efp_key8_dvp_reg)); 24890 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 24891 EFP_KEY4_MDL_SELECTORr, 24892 inst, &efp_key4_mdl_reg)); 24893 24894 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, EFP_SLICE_CONTROLr, 24895 inst, 24896 &efp_slice_control_reg)); 24897 24898 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 24899 EFP_DEST_PORT_SELECTORr, 24900 inst, 24901 &efp_dst_port_reg)); 24902 24903 if (soc_feature(unit, soc_feature_fp_no_dvp_support)) { 24904 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 24905 EFP_KEY4_L3_CLASSID_SELECTORr, 24906 inst, 24907 &efp_key4_class_reg)); 24908 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 24909 EFP_KEY8_L3_CLASSID_SELECTORr, 24910 inst, 24911 &efp_key8_class_reg)); 24912 } 24913 24914 #if defined (BCM_TRIDENT3_SUPPORT) 24915 if (soc_feature(unit, soc_feature_td3_style_fp)) { 24916 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 24917 EFP_CLASSID_SELECTOR_Ar, 24918 inst, &efp_classid_sel_r)); 24919 } else 24920 #endif 24921 { 24922 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 24923 EFP_CLASSID_SELECTORr, 24924 inst, &efp_classid_sel_r)); 24925 } 24926 rv = soc_reg_fields32_modify(unit, efp_slice_control_reg, REG_PORT_ANY, 24927 2, _th_efp_slice_mode[slice_numb], mode_val); 24928 BCM_IF_ERROR_RETURN(rv); 24929 24930 rv = soc_reg_fields32_modify(unit, efp_classid_sel_r, REG_PORT_ANY, 24931 7, classfldtbl[slice_numb], class_mode_val); 24932 BCM_IF_ERROR_RETURN(rv); 24933 24934 #if defined (BCM_TRIDENT3_SUPPORT) 24935 if (soc_feature(unit, soc_feature_td3_style_fp)) { 24936 uint32 const0 = 0; 24937 uint32 reg_val; 24938 24939 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 24940 EFP_CLASSID_B_SELECTOR_KEY_TYPEr, 24941 inst, &efp_classid_b_sel_reg)); 24942 24943 /* Reset class id b values to 0 */ 24944 for (idx =0; idx<=7; idx++) { 24945 BCM_IF_ERROR_RETURN(soc_reg32_get(unit, 24946 efp_classid_b_sel_reg, 24947 REG_PORT_ANY, 24948 idx, 24949 ®_val 24950 ) 24951 ); 24952 soc_reg_field_set(unit, 24953 efp_classid_b_sel_reg, 24954 ®_val, 24955 classIdBfldtbl[slice_numb], 24956 const0 24957 ); 24958 BCM_IF_ERROR_RETURN(soc_reg32_set(unit, 24959 efp_classid_b_sel_reg, 24960 REG_PORT_ANY, 24961 idx, 24962 reg_val 24963 ) 24964 ); 24965 } 24966 } 24967 #endif 24968 if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) { 24969 rv = soc_reg_field32_modify(unit, efp_key4_dvp_reg, REG_PORT_ANY, 24970 dvpfldtbl[slice_numb], 0); 24971 BCM_IF_ERROR_RETURN(rv); 24972 } 24973 24974 if (0 == soc_feature(unit, soc_feature_td3_style_fp)) { 24975 rv = soc_reg_field32_modify(unit, efp_key4_mdl_reg, REG_PORT_ANY, 24976 mdlfldtbl[slice_numb], 0); 24977 BCM_IF_ERROR_RETURN(rv); 24978 } 24979 24980 if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) { 24981 rv = soc_reg_field32_modify(unit, efp_key8_dvp_reg, REG_PORT_ANY, 24982 mdlfldtbl[slice_numb], 0); 24983 BCM_IF_ERROR_RETURN(rv); 24984 } 24985 24986 #if defined (BCM_TOMAHAWK3_SUPPORT) 24987 if (soc_feature(unit, soc_feature_fp_no_dvp_support)) { 24988 rv = soc_reg_field32_modify(unit, efp_key4_class_reg, REG_PORT_ANY, 24989 classIdBfldtbl[slice_numb], 0); 24990 BCM_IF_ERROR_RETURN(rv); 24991 rv = soc_reg_field32_modify(unit, efp_key8_class_reg, REG_PORT_ANY, 24992 classIdBfldtbl[slice_numb], 0); 24993 BCM_IF_ERROR_RETURN(rv); 24994 } 24995 #endif 24996 24997 #if defined (BCM_TRIDENT3_SUPPORT) 24998 /* SELECTOR CODES for EFP_DEST_PORT_SELECTORr */ 24999 if (SOC_REG_IS_VALID(unit, EFP_DEST_PORT_SELECTORr)) { 25000 rv = soc_reg_field32_modify(unit, 25001 efp_dst_port_reg, 25002 REG_PORT_ANY, 25003 efp_dest_port_selector_flds[slice_numb][0], 25004 0 25005 ); 25006 BCM_IF_ERROR_RETURN(rv); 25007 25008 rv = soc_reg_field32_modify(unit, 25009 efp_dst_port_reg, 25010 REG_PORT_ANY, 25011 efp_dest_port_selector_flds[slice_numb][1], 25012 0 25013 ); 25014 BCM_IF_ERROR_RETURN(rv); 25015 } 25016 #endif 25017 25018 return (rv); 25019 } 25020 25021 /* 25022 * Function: 25023 * _field_th_slice_clear 25024 * 25025 * Purpose: 25026 * Clear slice configuration on group removal 25027 * 25028 * Parameters: 25029 * unit - BCM device number 25030 * fg - Field group slice belongs to 25031 * fs - Field slice structure. 25032 * 25033 * Returns: 25034 * BCM_E_XXX 25035 */ 25036 STATIC int 25037 _field_th_slice_clear(int unit, _field_group_t *fg, _field_slice_t *fs) 25038 { 25039 int rv; 25040 25041 switch (fs->stage_id) { 25042 case _BCM_FIELD_STAGE_INGRESS: 25043 rv = _bcm_field_th_ingress_slice_clear(unit, fg, fs); 25044 break; 25045 case _BCM_FIELD_STAGE_LOOKUP: 25046 rv = _field_th_lookup_slice_clear(unit, fg, fs); 25047 break; 25048 case _BCM_FIELD_STAGE_EGRESS: 25049 rv = _field_th_egress_slice_clear(unit, fg, fs->slice_number); 25050 break; 25051 default: 25052 rv = BCM_E_INTERNAL; 25053 } 25054 return (rv); 25055 } 25056 25057 /* 25058 * Function: 25059 * _bcm_field_th_slice_clear 25060 * 25061 * Purpose: 25062 * Clear slice configuration on group removal 25063 * 25064 * Parameters: 25065 * unit - BCM device number 25066 * fg - Field group slice belongs to 25067 * fs - Field slice structure. 25068 * 25069 * Returns: 25070 * BCM_E_XXX 25071 */ 25072 int 25073 _bcm_field_th_slice_clear(int unit, _field_group_t *fg, _field_slice_t *fs) 25074 { 25075 return _field_th_slice_clear(unit, fg, fs); 25076 } 25077 25078 /* 25079 * Function: 25080 * _bcm_field_th_functions_init 25081 * 25082 * Purpose: 25083 * Set up functions pointers 25084 * 25085 * Parameters: 25086 * functions - (IN/OUT) Pointer to device specific field module utility 25087 * routines. 25088 * 25089 * Returns: 25090 * Nothing 25091 */ 25092 void 25093 _bcm_field_th_functions_init(_field_funct_t *functions) 25094 { 25095 functions->fp_detach = _field_th_detach; 25096 functions->fp_group_install = _bcm_field_th_group_install; 25097 functions->fp_selcodes_install = _bcm_field_th_selcodes_install; 25098 functions->fp_slice_clear = _bcm_field_th_slice_clear; 25099 functions->fp_entry_remove = _bcm_field_th_entry_remove; 25100 functions->fp_entry_move = _bcm_field_th_entry_move; 25101 functions->fp_entry_enable = _bcm_field_th_entry_enable_set; 25102 functions->fp_selcode_get = _bcm_field_th_selcode_get; 25103 functions->fp_selcode_to_qset = _bcm_field_selcode_to_qset; 25104 functions->fp_qual_list_get = _bcm_field_qual_lists_get; 25105 functions->fp_tcam_policy_clear = NULL; 25106 functions->fp_tcam_policy_install = _bcm_field_th_entry_install; 25107 functions->fp_tcam_policy_reinstall = _bcm_field_th_entry_reinstall; 25108 functions->fp_policer_install = _bcm_field_th_policer_install; 25109 functions->fp_write_slice_map = _bcm_field_th_write_slice_map; 25110 functions->fp_qualify_ip_type = _bcm_field_td2_qualify_ip_type; 25111 functions->fp_qualify_ip_type_get = _bcm_field_td2_qualify_ip_type_get; 25112 functions->fp_action_support_check = _bcm_field_th_action_support_check; 25113 functions->fp_action_conflict_check = _bcm_field_th_action_conflict_check; 25114 functions->fp_counter_get = _bcm_field_td_counter_get; 25115 functions->fp_counter_set = _bcm_field_td_counter_set; 25116 functions->fp_stat_value_get = _bcm_th_field_stat_value_get; 25117 functions->fp_stat_value_set = _bcm_th_field_stat_value_set; 25118 functions->fp_stat_index_get = _bcm_field_th_stat_index_get; 25119 functions->fp_action_params_check = _bcm_field_th_action_params_check; 25120 functions->fp_action_depends_check = NULL; 25121 functions->fp_egress_key_match_type_set 25122 = _bcm_field_th_egress_key_match_type_set; 25123 functions->fp_external_entry_install = NULL; 25124 functions->fp_external_entry_reinstall = NULL; 25125 functions->fp_external_entry_remove = NULL; 25126 functions->fp_external_entry_prio_set = NULL; 25127 functions->fp_data_qualifier_ethertype_add 25128 = _bcm_field_trx2_data_qualifier_ethertype_add; 25129 functions->fp_data_qualifier_ethertype_delete 25130 = _bcm_field_trx2_data_qualifier_ethertype_delete; 25131 functions->fp_data_qualifier_ip_protocol_add 25132 = _bcm_field_trx2_data_qualifier_ip_protocol_add; 25133 functions->fp_data_qualifier_ip_protocol_delete 25134 = _bcm_field_trx2_data_qualifier_ip_protocol_delete; 25135 functions->fp_data_qualifier_packet_format_add 25136 = _bcm_field_trx2_data_qualifier_packet_format_add; 25137 functions->fp_data_qualifier_packet_format_delete 25138 = _bcm_field_trx2_data_qualifier_packet_format_delete; 25139 functions->fp_control_set = _bcm_field_th_control_set; 25140 functions->fp_control_get = _bcm_field_th_control_get; 25141 functions->fp_stat_hw_mode_get = _bcm_field_th_stat_hw_mode_get; 25142 functions->fp_stat_hw_alloc = _bcm_field_th_stat_hw_alloc; 25143 functions->fp_stat_hw_free = _bcm_field_th_stat_hw_free; 25144 functions->fp_group_add = _bcm_field_th_group_add; 25145 functions->fp_qualify_svp = _bcm_field_th_qualify_svp; 25146 functions->fp_qualify_dvp = _bcm_field_th_qualify_dvp; 25147 functions->fp_qualify_trunk = _bcm_field_th_qualify_trunk; 25148 functions->fp_qualify_trunk_get = _bcm_field_th_qualify_trunk_get; 25149 functions->fp_qualify_inports = _bcm_field_th_qualify_InPorts; 25150 functions->fp_entry_stat_extended_attach = NULL; 25151 functions->fp_entry_stat_extended_get = NULL; 25152 functions->fp_entry_stat_detach = _bcm_field_entry_stat_detach; 25153 functions->fp_class_size_get = _bcm_field_th_qual_class_size_get; 25154 functions->fp_eh_mask_profile_hw_alloc = 25155 _bcm_field_th_eh_mask_profile_hw_alloc; 25156 functions->fp_eh_mask_profile_hw_free = 25157 _bcm_field_th_eh_mask_profile_hw_free; 25158 functions->fp_qualify_packet_res = _bcm_field_th_qualify_PacketRes; 25159 functions->fp_qualify_packet_res_get = _bcm_field_th_qualify_PacketRes_get; 25160 functions->fp_ddrop_action_alloc = _bcm_field_th_ddrop_profile_alloc; 25161 functions->fp_dredirect_action_alloc = _bcm_field_th_dredirect_profile_alloc; 25162 } 25163 25164 /* 25165 * Function: 25166 * _field_th_stage_extractors_init 25167 * Purpose: 25168 * Initialize extractor section hierarcy structure for the IFP stage. 25169 * Parameters: 25170 * unit - (IN) BCM device number. 25171 * stage_fc - (IN) Stage field control structure pointer. 25172 * Returns: 25173 * BCM_E_PARAM - Invalid parameter. 25174 * BCM_E_MEMORY - Memory allocation failure. 25175 * BCM_E_NONE - Success. 25176 */ 25177 STATIC int 25178 _field_th_stage_extractors_init(int unit, _field_stage_t *stage_fc) 25179 { 25180 int idx = 0; /* Index iterator. */ 25181 int level = 0; /* Extractor hierarchy level. */ 25182 int gran = 0; /* Extractor granularity. */ 25183 int ext_num = 0; /* Extractor number. */ 25184 int part; /* Entry part number. */ 25185 bcmi_keygen_ext_attrs_t ext_attrs; 25186 bcmi_keygen_ext_attrs_t temp_attrs; 25187 bcmi_keygen_ext_attrs_t *attrs = &temp_attrs; 25188 uint32 ext_attrs_size = 0; 25189 BCMI_KEYGEN_EXT_CFG_DECL; /* Extractors config declaration. */ 25190 bcmi_keygen_ext_cfg_db_t *ext_cfg_db = NULL; 25191 BCMI_KEYGEN_FUNC_ENTER(unit); 25192 25193 BCMI_KEYGEN_NULL_CHECK(stage_fc, BCM_E_PARAM); 25194 25195 ext_attrs_size = sizeof(bcmi_keygen_ext_attrs_t); 25196 sal_memset(attrs, 0, ext_attrs_size); 25197 25198 _FP_XGS3_ALLOC(stage_fc->ext_cfg_db_arr, 25199 (BCMI_KEYGEN_MODE_COUNT * sizeof(bcmi_keygen_ext_cfg_db_t *)), 25200 "Field Extractors Data base Array"); 25201 if (NULL == stage_fc->ext_cfg_db_arr) { 25202 return (BCM_E_MEMORY); 25203 } 25204 25205 _FP_XGS3_ALLOC(ext_cfg_db, 25206 sizeof(bcmi_keygen_ext_cfg_db_t), "Field Extractors DB"); 25207 if (NULL == ext_cfg_db) { 25208 return (BCM_E_MEMORY); 25209 } 25210 stage_fc->ext_cfg_db_arr[BCMI_KEYGEN_MODE_DBLINTRA] = ext_cfg_db; 25211 /* Initialize Level_1 32-bit extractor section. */ 25212 level = 1; 25213 gran = 32; 25214 ext_num = 0; 25215 part = 0; 25216 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25217 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2S1, 0, attrs); 25218 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25219 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2S1, 32, attrs); 25220 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25221 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2S1, 64, attrs); 25222 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25223 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2S1, 96, attrs); 25224 25225 /* Initialize Level_1 16-bit extractors section. */ 25226 level = 1; 25227 gran = 16; 25228 ext_num = 0; 25229 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25230 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 128, attrs); 25231 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25232 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 144, attrs); 25233 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25234 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 160, attrs); 25235 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25236 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 176, attrs); 25237 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25238 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 192, attrs); 25239 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25240 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 208, attrs); 25241 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25242 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 224, attrs); 25243 25244 /* Initialize Level_1 8-bit extractors section. */ 25245 level = 1; 25246 gran = 8; 25247 ext_num = 0; 25248 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25249 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 0, attrs); 25250 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25251 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 8, attrs); 25252 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25253 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 16, attrs); 25254 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25255 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 24, attrs); 25256 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25257 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 32, attrs); 25258 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25259 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 40, attrs); 25260 25261 ext_num = 6; 25262 sal_memset(&ext_attrs, 0, ext_attrs_size); 25263 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 25264 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num , 25265 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 48, &ext_attrs); 25266 25267 /* Initialize Level_1 4-bit extractors section. */ 25268 level = 1; 25269 gran = 4; 25270 ext_num = 0; 25271 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25272 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 56, attrs); 25273 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25274 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 60, attrs); 25275 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25276 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 64, attrs); 25277 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25278 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 68, attrs); 25279 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25280 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 72, attrs); 25281 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25282 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 76, attrs); 25283 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25284 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 80, attrs); 25285 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 25286 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 84, attrs); 25287 25288 /* Initialize Level1 2-bit extractors section. */ 25289 level = 1; 25290 gran = 2; 25291 ext_num = 0; 25292 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25293 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 88, attrs); 25294 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25295 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 90, attrs); 25296 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25297 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 92, attrs); 25298 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25299 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 94, attrs); 25300 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25301 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 96, attrs); 25302 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25303 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 98, attrs); 25304 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25305 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 100, attrs); 25306 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 25307 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 102, attrs); 25308 25309 /* Initialize Level_2 16-bit extractors section. */ 25310 level = 2; 25311 gran = 16; 25312 ext_num = 0; 25313 sal_memset(&ext_attrs, 0, ext_attrs_size); 25314 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM); 25315 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF); 25316 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25317 BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S1, 0, &ext_attrs); 25318 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25319 BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S1, 16, &ext_attrs); 25320 sal_memset(&ext_attrs, 0, ext_attrs_size); 25321 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_SINGLE_ASET_WIDE); 25322 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF); 25323 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 25324 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25325 BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S1, 32, &ext_attrs); 25326 sal_memset(&ext_attrs, 0, ext_attrs_size); 25327 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_SINGLE_ASET_WIDE); 25328 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF); 25329 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 25330 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25331 BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S1, 48, &ext_attrs); 25332 25333 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25334 BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 0, attrs); 25335 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25336 BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 16, attrs); 25337 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25338 BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 32, attrs); 25339 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 25340 BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 48, attrs); 25341 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 8), 25342 BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 64, attrs); 25343 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 9), 25344 BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 80, attrs); 25345 25346 /* Initialize Level_2 8-bit extractors section. */ 25347 level = 2; 25348 gran = 8; 25349 ext_num = 0; 25350 sal_memset(&ext_attrs, 0, ext_attrs_size); 25351 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25352 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25353 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 96, &ext_attrs); 25354 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25355 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 104, &ext_attrs); 25356 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25357 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 112, &ext_attrs); 25358 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25359 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 120, &ext_attrs); 25360 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25361 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 128, &ext_attrs); 25362 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25363 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 136, &ext_attrs); 25364 ext_num = 6; 25365 sal_memset(&ext_attrs, 0, ext_attrs_size); 25366 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 25367 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num , 25368 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 144, &ext_attrs); 25369 25370 /* Initialize Level_2 4-bit extractors section. */ 25371 level = 2; 25372 gran = 4; 25373 ext_num = 0; 25374 sal_memset(&ext_attrs, 0, ext_attrs_size); 25375 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25376 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25377 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 152, &ext_attrs); 25378 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25379 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 156, &ext_attrs); 25380 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25381 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 160, &ext_attrs); 25382 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25383 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 164, &ext_attrs); 25384 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25385 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 168, &ext_attrs); 25386 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25387 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 172, &ext_attrs); 25388 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25389 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 176, &ext_attrs); 25390 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 25391 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 180, &ext_attrs); 25392 25393 /* Initialize Level2 2-bit extractors section. */ 25394 level = 2; 25395 gran = 2; 25396 ext_num = 0; 25397 sal_memset(&ext_attrs, 0, ext_attrs_size); 25398 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25399 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25400 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 184, &ext_attrs); 25401 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25402 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 186, &ext_attrs); 25403 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25404 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 188, &ext_attrs); 25405 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25406 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 190, &ext_attrs); 25407 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25408 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 192, &ext_attrs); 25409 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25410 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 194, &ext_attrs); 25411 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25412 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 196, &ext_attrs); 25413 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 25414 BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 198, &ext_attrs); 25415 25416 /* Initialize two Level_3 16-bit extractors section. */ 25417 level = 3; 25418 gran = 16; 25419 ext_num = 0; 25420 sal_memset(&ext_attrs, 0, ext_attrs_size); 25421 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM); 25422 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF); 25423 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25424 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25425 BCMI_KEYGEN_EXT_SECTION_L3S1, BCMI_KEYGEN_EXT_SECTION_FK, 0, &ext_attrs); 25426 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25427 BCMI_KEYGEN_EXT_SECTION_L3S1, BCMI_KEYGEN_EXT_SECTION_FK, 20, &ext_attrs); 25428 25429 /* Initialize four Level_3 4-bit extractors section. */ 25430 level = 3; 25431 gran = 4; 25432 ext_num = 0; 25433 sal_memset(&ext_attrs, 0, ext_attrs_size); 25434 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM); 25435 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF); 25436 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25437 BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 16, &ext_attrs); 25438 sal_memset(&ext_attrs, 0, ext_attrs_size); 25439 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF); 25440 for (idx = 1; idx < 4; idx++) { 25441 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25442 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25443 36 + (gran * (idx - 1)) , &ext_attrs); 25444 } 25445 25446 /* Initialize Level_3 16-bit extractors section. */ 25447 level = 3; 25448 gran = 16; 25449 ext_num = 2; 25450 sal_memset(&ext_attrs, 0, ext_attrs_size); 25451 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_SINGLE_ASET_WIDE); 25452 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF); 25453 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 25454 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25455 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25456 BCMI_KEYGEN_EXT_SECTION_L3S1, BCMI_KEYGEN_EXT_SECTION_FK, 48, &ext_attrs); 25457 sal_memset(&ext_attrs, 0, ext_attrs_size); 25458 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25459 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_SINGLE_ASET_WIDE); 25460 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF); 25461 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 25462 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25463 BCMI_KEYGEN_EXT_SECTION_L3S1, BCMI_KEYGEN_EXT_SECTION_FK, 64, &ext_attrs); 25464 25465 /* Initialize seventeen Level_3 4-bit extractors section. */ 25466 level = 3; 25467 gran = 4; 25468 ext_num = 4; 25469 for (idx = 0; idx < 2; idx++) { 25470 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25471 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25472 80 + (idx * gran), attrs); 25473 } 25474 ext_num = 4; 25475 sal_memset(&ext_attrs, 0, ext_attrs_size); 25476 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0_HM); 25477 for (idx = 2; idx < 6; idx++) { 25478 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25479 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25480 80 + (idx * gran), &ext_attrs); 25481 } 25482 ext_num = 4; 25483 sal_memset(&ext_attrs, 0, ext_attrs_size); 25484 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1_HM); 25485 for (idx = 6; idx < 10; idx++) { 25486 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25487 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25488 80 + (idx * gran), &ext_attrs); 25489 } 25490 ext_num = 4; 25491 idx = 10; 25492 sal_memset(&ext_attrs, 0, ext_attrs_size); 25493 SHR_BITSET(ext_attrs.w, 25494 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_0_3); 25495 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25496 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25497 80 + (idx * gran), &ext_attrs); 25498 idx = 11; 25499 sal_memset(&ext_attrs, 0, ext_attrs_size); 25500 SHR_BITSET(ext_attrs.w, 25501 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_4_7); 25502 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25503 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25504 80 + (idx * gran), &ext_attrs); 25505 idx = 12; 25506 sal_memset(&ext_attrs, 0, ext_attrs_size); 25507 SHR_BITSET(ext_attrs.w, 25508 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_8_11); 25509 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25510 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25511 80 + (idx * gran), &ext_attrs); 25512 25513 ext_num = 4; 25514 idx = 13; 25515 sal_memset(&ext_attrs, 0, ext_attrs_size); 25516 SHR_BITSET(ext_attrs.w, 25517 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_0_3); 25518 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25519 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25520 80 + (idx * gran), &ext_attrs); 25521 25522 idx = 14; 25523 sal_memset(&ext_attrs, 0, ext_attrs_size); 25524 SHR_BITSET(ext_attrs.w, 25525 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_4_7); 25526 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25527 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25528 80 + (idx * gran), &ext_attrs); 25529 25530 idx = 15; 25531 sal_memset(&ext_attrs, 0, ext_attrs_size); 25532 SHR_BITSET(ext_attrs.w, 25533 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_8_11); 25534 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25535 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25536 80 + (idx * gran), &ext_attrs); 25537 25538 idx = 16; 25539 sal_memset(&ext_attrs, 0, ext_attrs_size); 25540 SHR_BITSET(ext_attrs.w,BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 25541 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 25542 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25543 80 + (idx * gran), &ext_attrs); 25544 25545 /* Initialize 5 Level_3 2-bit extractors section. */ 25546 level = 3; 25547 gran = 2; 25548 25549 for (ext_num = 0; ext_num < 1; ext_num++) { 25550 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25551 BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 25552 148 + (ext_num * gran), attrs); 25553 } 25554 25555 ext_num = 1; 25556 sal_memset(&ext_attrs, 0, ext_attrs_size); 25557 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 25558 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num , 25559 BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 150, &ext_attrs); 25560 25561 /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */ 25562 ext_num = 0; 25563 sal_memset(&ext_attrs, 0, ext_attrs_size); 25564 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB); 25565 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB_HM); 25566 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num + 2, 25567 BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 152, &ext_attrs); 25568 25569 ext_num = 0; 25570 sal_memset(&ext_attrs, 0, ext_attrs_size); 25571 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_HIT); 25572 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_HIT); 25573 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num + 3, 25574 BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 154, &ext_attrs); 25575 25576 /* Overlay with NAT_DST_REALM_ID. */ 25577 ext_num = 0; 25578 sal_memset(&ext_attrs, 0, ext_attrs_size); 25579 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_DST_REALM_ID); 25580 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num + 4, 25581 BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 156, &ext_attrs); 25582 25583 /* Initialize 2 Level_3 1-bit extractors section. */ 25584 level = 3; 25585 gran = 1; 25586 ext_num = 0; 25587 sal_memset(&ext_attrs, 0, ext_attrs_size); 25588 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_NEEDED); 25589 /* Overlay with NAT_NEEDED. */ 25590 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25591 BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 158, &ext_attrs); 25592 25593 /* Overlay with DROP. */ 25594 sal_memset(&ext_attrs, 0, ext_attrs_size); 25595 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_DROP); 25596 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num + 1, 25597 BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 159, &ext_attrs); 25598 25599 /* Initialize Level_4 extractor section. */ 25600 level = 4; 25601 gran = 160; 25602 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 0, 25603 BCMI_KEYGEN_EXT_SECTION_FK, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs); 25604 25605 /* 320 bits mode - Initialize Level_1 32-bit extractor section. */ 25606 ext_cfg_db = NULL; 25607 _FP_XGS3_ALLOC(ext_cfg_db, 25608 sizeof(bcmi_keygen_ext_cfg_db_t), "Field Extractors DB"); 25609 if (NULL == ext_cfg_db) { 25610 return (BCM_E_MEMORY); 25611 } 25612 stage_fc->ext_cfg_db_arr[BCMI_KEYGEN_MODE_DBLINTER] = ext_cfg_db; 25613 level = 1; 25614 gran = 32; 25615 ext_num = 0; 25616 25617 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 25618 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 0, attrs); 25619 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 25620 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 0, attrs); 25621 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 25622 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 32, attrs); 25623 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 25624 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 32, attrs); 25625 25626 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 25627 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 64, attrs); 25628 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 25629 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 64, attrs); 25630 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 25631 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 96, attrs); 25632 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 25633 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 96, attrs); 25634 25635 /* Initialize Level_1 16-bit extractor section. */ 25636 level = 1; 25637 gran = 16; 25638 ext_num = 0; 25639 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 25640 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 128, attrs); 25641 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 25642 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 128, attrs); 25643 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 25644 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 144, attrs); 25645 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 25646 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 144, attrs); 25647 25648 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 25649 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 160, attrs); 25650 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 25651 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 160, attrs); 25652 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 25653 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 176, attrs); 25654 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 25655 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 176, attrs); 25656 25657 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 25658 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 192, attrs); 25659 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4, 25660 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 192, attrs); 25661 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5, 25662 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 208, attrs); 25663 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5, 25664 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 208, attrs); 25665 25666 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6, 25667 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 224, attrs); 25668 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6, 25669 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 224, attrs); 25670 25671 /* Initialize Level_1 8-bit extractor section. */ 25672 level = 1; 25673 gran = 8; 25674 ext_num = 0; 25675 25676 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 25677 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 0, attrs); 25678 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 25679 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 8, attrs); 25680 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 25681 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 0, attrs); 25682 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 25683 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 8, attrs); 25684 25685 25686 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 25687 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 16, attrs); 25688 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 25689 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 16, attrs); 25690 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 25691 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 24, attrs); 25692 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 25693 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 24, attrs); 25694 25695 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 25696 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 32, attrs); 25697 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4, 25698 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 32, attrs); 25699 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5, 25700 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 40, attrs); 25701 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5, 25702 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 40, attrs); 25703 25704 ext_num = 6; 25705 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6, 25706 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 48, attrs); 25707 sal_memset(&ext_attrs, 0, ext_attrs_size); 25708 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 25709 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num , 25710 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 48, &ext_attrs); 25711 25712 /* Initialize Level_1 4-bit extractor section. */ 25713 level = 1; 25714 gran = 4; 25715 ext_num = 0; 25716 25717 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 25718 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 56, attrs); 25719 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 25720 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 56, attrs); 25721 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 25722 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 60, attrs); 25723 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 25724 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 60, attrs); 25725 25726 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 25727 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 64, attrs); 25728 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 25729 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 64, attrs); 25730 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 25731 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 68, attrs); 25732 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 25733 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 68, attrs); 25734 25735 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 25736 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 72, attrs); 25737 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4, 25738 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 72, attrs); 25739 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5, 25740 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 76, attrs); 25741 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5, 25742 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 76, attrs); 25743 25744 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6, 25745 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 80, attrs); 25746 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6, 25747 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 80, attrs); 25748 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7, 25749 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 84, attrs); 25750 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 7, 25751 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 84, attrs); 25752 25753 /* Initialize Level_1 2-bit extractor section. */ 25754 level = 1; 25755 gran = 2; 25756 ext_num = 0; 25757 25758 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 25759 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 88, attrs); 25760 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 25761 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 88, attrs); 25762 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 25763 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 90, attrs); 25764 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 25765 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 90, attrs); 25766 25767 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 25768 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 92, attrs); 25769 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 25770 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 92, attrs); 25771 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 25772 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 94, attrs); 25773 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 25774 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 94, attrs); 25775 25776 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 25777 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 96, attrs); 25778 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4, 25779 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 96, attrs); 25780 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5, 25781 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 98, attrs); 25782 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5, 25783 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 98, attrs); 25784 25785 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6, 25786 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 100, attrs); 25787 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6, 25788 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 100, attrs); 25789 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7, 25790 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 102, attrs); 25791 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 7, 25792 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 102, attrs); 25793 25794 /* Initialize Level_2 16-bit extractors section. */ 25795 level = 2; 25796 gran = 16; 25797 ext_num = 0; 25798 sal_memset(&ext_attrs, 0, ext_attrs_size); 25799 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM); 25800 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 25801 BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 0, &ext_attrs); 25802 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 25803 BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 16, &ext_attrs); 25804 25805 sal_memset(&ext_attrs, 0, ext_attrs_size); 25806 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 25807 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 25808 BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 32, &ext_attrs); 25809 sal_memset(&ext_attrs, 0, ext_attrs_size); 25810 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 25811 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 25812 BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 48, &ext_attrs); 25813 25814 for (ext_num = 4; ext_num < 10; ext_num++) { 25815 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 25816 BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS2, 25817 ((ext_num - 4) * gran), attrs); 25818 } 25819 25820 level = 2; 25821 gran = 16; 25822 ext_num = 0; 25823 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 25824 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 0, attrs); 25825 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 25826 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 16, attrs); 25827 sal_memset(&ext_attrs, 0, ext_attrs_size); 25828 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 25829 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 25830 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 32, &ext_attrs); 25831 sal_memset(&ext_attrs, 0, ext_attrs_size); 25832 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 25833 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 25834 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 48, &ext_attrs); 25835 25836 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 25837 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 0, attrs); 25838 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5, 25839 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 16, attrs); 25840 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6, 25841 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 32, attrs); 25842 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7, 25843 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 48, attrs); 25844 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 8, 25845 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 64, attrs); 25846 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 9, 25847 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 80, attrs); 25848 25849 25850 /* Initialize Level_2 8-bit extractors section. */ 25851 level = 2; 25852 gran = 8; 25853 ext_num = 0; 25854 part = 0; 25855 sal_memset(&ext_attrs, 0, ext_attrs_size); 25856 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25857 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25858 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 96, &ext_attrs); 25859 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25860 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2,104, &ext_attrs); 25861 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25862 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 112, &ext_attrs); 25863 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25864 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 120, &ext_attrs); 25865 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25866 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 128, &ext_attrs); 25867 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25868 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 136, &ext_attrs); 25869 25870 ext_num = 6; 25871 sal_memset(&ext_attrs, 0, ext_attrs_size); 25872 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 25873 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num , 25874 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 144, &ext_attrs); 25875 25876 /* Initialize Level_2 4-bit extractors section. */ 25877 level = 2; 25878 gran = 4; 25879 ext_num = 0; 25880 sal_memset(&ext_attrs, 0, ext_attrs_size); 25881 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25882 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25883 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 152, &ext_attrs); 25884 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25885 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 156, &ext_attrs); 25886 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25887 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 160, &ext_attrs); 25888 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25889 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 164, &ext_attrs); 25890 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25891 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 168, &ext_attrs); 25892 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25893 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 172, &ext_attrs); 25894 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25895 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 176, &ext_attrs); 25896 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 25897 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 180, &ext_attrs); 25898 25899 /* Initialize Level2 2-bit extractors section. */ 25900 level = 2; 25901 gran = 2; 25902 ext_num = 0; 25903 sal_memset(&ext_attrs, 0, ext_attrs_size); 25904 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25905 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25906 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 184, &ext_attrs); 25907 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25908 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 186, &ext_attrs); 25909 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25910 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 188, &ext_attrs); 25911 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25912 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 190, &ext_attrs); 25913 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25914 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 192, &ext_attrs); 25915 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25916 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 194, &ext_attrs); 25917 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25918 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 196, &ext_attrs); 25919 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 25920 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 198, &ext_attrs); 25921 25922 25923 /* Initialize Level_2 8-bit extractors section. */ 25924 level = 2; 25925 gran = 8; 25926 ext_num = 0; 25927 part = 1; 25928 sal_memset(&ext_attrs, 0, ext_attrs_size); 25929 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25930 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25931 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 96, &ext_attrs); 25932 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25933 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2,104, &ext_attrs); 25934 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25935 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 112, &ext_attrs); 25936 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25937 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 120, &ext_attrs); 25938 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25939 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 128, &ext_attrs); 25940 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25941 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 136, &ext_attrs); 25942 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25943 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 144, &ext_attrs); 25944 25945 /* Initialize Level_2 4-bit extractors section. */ 25946 level = 2; 25947 gran = 4; 25948 ext_num = 0; 25949 sal_memset(&ext_attrs, 0, ext_attrs_size); 25950 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25951 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25952 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 152, &ext_attrs); 25953 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25954 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 156, &ext_attrs); 25955 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25956 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 160, &ext_attrs); 25957 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25958 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 164, &ext_attrs); 25959 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25960 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 168, &ext_attrs); 25961 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25962 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 172, &ext_attrs); 25963 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25964 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 176, &ext_attrs); 25965 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 25966 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 180, &ext_attrs); 25967 25968 /* Initialize Level2 2-bit extractors section. */ 25969 level = 2; 25970 gran = 2; 25971 ext_num = 0; 25972 sal_memset(&ext_attrs, 0, ext_attrs_size); 25973 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25974 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 25975 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 184, &ext_attrs); 25976 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 25977 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 186, &ext_attrs); 25978 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 25979 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 188, &ext_attrs); 25980 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 25981 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 190, &ext_attrs); 25982 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 25983 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 192, &ext_attrs); 25984 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 25985 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 194, &ext_attrs); 25986 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 25987 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 196, &ext_attrs); 25988 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 25989 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 198, &ext_attrs); 25990 25991 /* Initialize Level_3 16-bit extractors section - SLICE_A. */ 25992 level = 3; 25993 gran = 16; 25994 ext_num = 0; 25995 sal_memset(&ext_attrs, 0, ext_attrs_size); 25996 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 25997 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM); 25998 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 25999 BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 0, &ext_attrs); 26000 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 26001 BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 20, &ext_attrs); 26002 26003 /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */ 26004 sal_memset(&ext_attrs, 0, ext_attrs_size); 26005 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 26006 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26007 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 26008 BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 48, &ext_attrs); 26009 sal_memset(&ext_attrs, 0, ext_attrs_size); 26010 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 26011 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26012 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 26013 BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 64, &ext_attrs); 26014 26015 /* Initialize Level_3 4-bit extractors section. */ 26016 level = 3; 26017 gran = 4; 26018 ext_num = 0; 26019 sal_memset(&ext_attrs, 0, ext_attrs_size); 26020 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM); 26021 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26022 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 16, &ext_attrs); 26023 for (idx = 1; idx < 4; idx++) { 26024 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26025 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26026 36 + (gran * (idx - 1)), attrs); 26027 } 26028 26029 level = 3; 26030 gran = 4; 26031 ext_num = 4; 26032 for (idx = 0; idx < 10; idx++) { 26033 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26034 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26035 80 + (idx * gran), attrs); 26036 } 26037 26038 ext_num = 4; 26039 idx = 10; 26040 sal_memset(&ext_attrs, 0, ext_attrs_size); 26041 SHR_BITSET(ext_attrs.w, 26042 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_0_3); 26043 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26044 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26045 80 + (idx * gran), &ext_attrs); 26046 26047 idx = 11; 26048 sal_memset(&ext_attrs, 0, ext_attrs_size); 26049 SHR_BITSET(ext_attrs.w, 26050 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_4_7); 26051 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26052 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26053 80 + (idx * gran), &ext_attrs); 26054 26055 idx = 12; 26056 sal_memset(&ext_attrs, 0, ext_attrs_size); 26057 SHR_BITSET(ext_attrs.w, 26058 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_8_11); 26059 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26060 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26061 80 + (idx * gran), &ext_attrs); 26062 26063 ext_num = 4; 26064 idx = 13; 26065 sal_memset(&ext_attrs, 0, ext_attrs_size); 26066 SHR_BITSET(ext_attrs.w, 26067 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_0_3); 26068 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26069 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26070 80 + (idx * gran), &ext_attrs); 26071 26072 idx = 14; 26073 sal_memset(&ext_attrs, 0, ext_attrs_size); 26074 SHR_BITSET(ext_attrs.w, 26075 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_4_7); 26076 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26077 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26078 80 + (idx * gran), &ext_attrs); 26079 26080 idx = 15; 26081 sal_memset(&ext_attrs, 0, ext_attrs_size); 26082 SHR_BITSET(ext_attrs.w, 26083 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_8_11); 26084 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26085 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26086 80 + (idx * gran), &ext_attrs); 26087 26088 ext_num = 4; 26089 idx = 16; 26090 sal_memset(&ext_attrs, 0, ext_attrs_size); 26091 SHR_BITSET(ext_attrs.w,BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 26092 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26093 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26094 80 + (idx * gran), &ext_attrs); 26095 26096 /* Initialize Level_3 2-bit extractors section. */ 26097 level = 3; 26098 gran = 2; 26099 for (ext_num = 0; ext_num < 1; ext_num++) { 26100 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26101 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26102 148 + (ext_num * gran), attrs); 26103 } 26104 ext_num = 1; 26105 sal_memset(&ext_attrs, 0, ext_attrs_size); 26106 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 26107 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num , 26108 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 150, &ext_attrs); 26109 26110 26111 /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */ 26112 ext_num = 0; 26113 sal_memset(&ext_attrs, 0, ext_attrs_size); 26114 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB); 26115 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 26116 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 152, &ext_attrs); 26117 26118 ext_num = 0; 26119 sal_memset(&ext_attrs, 0, ext_attrs_size); 26120 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_HIT); 26121 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_HIT); 26122 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 26123 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 154, &ext_attrs); 26124 26125 /* Overlay with NAT_DST_REALM_ID. */ 26126 ext_num = 0; 26127 sal_memset(&ext_attrs, 0, ext_attrs_size); 26128 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_DST_REALM_ID); 26129 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4, 26130 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 156, &ext_attrs); 26131 26132 /* Initialize 2 Level_3 1-bit extractors section. */ 26133 level = 3; 26134 gran = 1; 26135 ext_num = 0; 26136 /* Overlay with NAT_NEEDED. */ 26137 sal_memset(&ext_attrs, 0, ext_attrs_size); 26138 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_NEEDED); 26139 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26140 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 158, &ext_attrs); 26141 /* Overlay with DROP. */ 26142 sal_memset(&ext_attrs, 0, ext_attrs_size); 26143 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_DROP); 26144 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 26145 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 159, &ext_attrs); 26146 26147 /* Initialize Level_3 16-bit extractors section - SLICE_B. */ 26148 level = 3; 26149 gran = 16; 26150 ext_num = 0; 26151 sal_memset(&ext_attrs, 0, ext_attrs_size); 26152 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26153 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26154 BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 0, &ext_attrs); 26155 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 26156 BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 20, &ext_attrs); 26157 sal_memset(&ext_attrs, 0, ext_attrs_size); 26158 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26159 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 26160 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 26161 BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 48, &ext_attrs); 26162 sal_memset(&ext_attrs, 0, ext_attrs_size); 26163 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26164 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 26165 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 26166 BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 64, &ext_attrs); 26167 26168 /* Initialize Level_3 4-bit extractors section. */ 26169 level = 3; 26170 gran = 4; 26171 ext_num = 0; 26172 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26173 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 16, attrs); 26174 26175 for (idx = 1; idx < 4; idx++) { 26176 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, 26177 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 26178 36 + (gran * (idx - 1)), attrs); 26179 } 26180 26181 level = 3; 26182 gran = 4; 26183 ext_num = 4; 26184 26185 for (idx = 0; idx < 17; idx++) { 26186 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, 26187 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 26188 80 + (idx * gran), attrs); 26189 } 26190 26191 /* Initialize Level_3 2-bit extractors section. */ 26192 level = 3; 26193 gran = 2; 26194 for (ext_num = 0; ext_num < 2; ext_num++) { 26195 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26196 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 26197 148 + (ext_num * gran), attrs); 26198 } 26199 26200 /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */ 26201 ext_num = 0; 26202 sal_memset(&ext_attrs, 0, ext_attrs_size); 26203 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB); 26204 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 26205 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 152, &ext_attrs); 26206 26207 ext_num = 0; 26208 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 26209 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 154, attrs); 26210 26211 ext_num = 0; 26212 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 26213 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 156, attrs); 26214 26215 /* Initialize 2 Level_3 1-bit extractors section. */ 26216 level = 3; 26217 gran = 1; 26218 for (ext_num = 0; ext_num < 2; ext_num++) { 26219 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26220 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 26221 158 + (ext_num * gran), attrs); 26222 } 26223 26224 /* Initialize Level_4 extractor section. */ 26225 level = 4; 26226 gran = 160; 26227 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 0, 26228 BCMI_KEYGEN_EXT_SECTION_FK, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs); 26229 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 0, 26230 BCMI_KEYGEN_EXT_SECTION_FKA, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs); 26231 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, 0, 26232 BCMI_KEYGEN_EXT_SECTION_FKB, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs); 26233 26234 /* 480 bit mode - Initialize Level_1 32-bit extractor section. */ 26235 ext_cfg_db = NULL; 26236 _FP_XGS3_ALLOC(ext_cfg_db, 26237 sizeof(bcmi_keygen_ext_cfg_db_t), "Field Extractors DB"); 26238 if (NULL == ext_cfg_db) { 26239 return (BCM_E_MEMORY); 26240 } 26241 stage_fc->ext_cfg_db_arr[BCMI_KEYGEN_MODE_TRIPLE] = ext_cfg_db; 26242 level = 1; 26243 gran = 32; 26244 ext_num = 0; 26245 26246 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26247 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 0, attrs); 26248 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 26249 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 32, attrs); 26250 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26251 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 0, attrs); 26252 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 26253 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 32, attrs); 26254 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num, 26255 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2CS1, 0, attrs); 26256 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1, 26257 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2CS1, 32, attrs); 26258 26259 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 26260 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 64, attrs); 26261 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 26262 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 96, attrs); 26263 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 26264 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 64, attrs); 26265 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 26266 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 96, attrs); 26267 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2, 26268 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2CS1, 64, attrs); 26269 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3, 26270 BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2CS1, 96, attrs); 26271 26272 /* Initialize Level_1 16-bit extractor section. */ 26273 level = 1; 26274 gran = 16; 26275 ext_num = 0; 26276 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26277 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 128, attrs); 26278 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 26279 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 144, attrs); 26280 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num, 26281 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 128, attrs); 26282 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1, 26283 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 144, attrs); 26284 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26285 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 128, attrs); 26286 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 26287 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 144, attrs); 26288 26289 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 26290 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 160, attrs); 26291 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 26292 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 176, attrs); 26293 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2, 26294 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 160, attrs); 26295 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3, 26296 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 176, attrs); 26297 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 26298 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 160, attrs); 26299 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 26300 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 176, attrs); 26301 26302 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 26303 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 192, attrs); 26304 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5, 26305 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 208, attrs); 26306 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4, 26307 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 192, attrs); 26308 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 5, 26309 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 208, attrs); 26310 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4, 26311 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 192, attrs); 26312 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5, 26313 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 208, attrs); 26314 26315 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6, 26316 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 224, attrs); 26317 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 6, 26318 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 224, attrs); 26319 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6, 26320 BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 224, attrs); 26321 26322 /* Initialize Level_1 8-bit extractor section. */ 26323 level = 1; 26324 gran = 8; 26325 ext_num = 0; 26326 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26327 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 0, attrs); 26328 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 26329 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 8, attrs); 26330 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num, 26331 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 0, attrs); 26332 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1, 26333 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 8, attrs); 26334 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26335 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 0, attrs); 26336 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 26337 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 8, attrs); 26338 26339 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 26340 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 16, attrs); 26341 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 26342 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 24, attrs); 26343 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2, 26344 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 16, attrs); 26345 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3, 26346 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 24, attrs); 26347 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 26348 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 16, attrs); 26349 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 26350 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 24, attrs); 26351 26352 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 26353 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 32, attrs); 26354 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5, 26355 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 40, attrs); 26356 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4, 26357 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 32, attrs); 26358 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 5, 26359 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 40, attrs); 26360 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4, 26361 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 32, attrs); 26362 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5, 26363 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 40, attrs); 26364 26365 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6, 26366 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 48, attrs); 26367 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 6, 26368 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 48, attrs); 26369 sal_memset(&ext_attrs, 0, ext_attrs_size); 26370 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 26371 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6, 26372 BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 48, &ext_attrs); 26373 26374 /* Initialize Level_1 4-bit extractor section. */ 26375 level = 1; 26376 gran = 4; 26377 ext_num = 0; 26378 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26379 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 56, attrs); 26380 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 26381 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 60, attrs); 26382 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num, 26383 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 56, attrs); 26384 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1, 26385 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 60, attrs); 26386 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26387 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 56, attrs); 26388 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 26389 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 60, attrs); 26390 26391 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 26392 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 64, attrs); 26393 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 26394 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 68, attrs); 26395 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2, 26396 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 64, attrs); 26397 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3, 26398 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 68, attrs); 26399 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 26400 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 64, attrs); 26401 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 26402 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 68, attrs); 26403 26404 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 26405 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 72, attrs); 26406 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5, 26407 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 76, attrs); 26408 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4, 26409 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 72, attrs); 26410 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 5, 26411 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 76, attrs); 26412 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4, 26413 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 72, attrs); 26414 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5, 26415 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 76, attrs); 26416 26417 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6, 26418 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 80, attrs); 26419 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7, 26420 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 84, attrs); 26421 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 6, 26422 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 80, attrs); 26423 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 7, 26424 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 84, attrs); 26425 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6, 26426 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 80, attrs); 26427 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 7, 26428 BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 84, attrs); 26429 26430 /* Initialize Level_1 2-bit extractor section. */ 26431 level = 1; 26432 gran = 2; 26433 ext_num = 0; 26434 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num, 26435 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 88, attrs); 26436 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1, 26437 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 90, attrs); 26438 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26439 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 88, attrs); 26440 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 26441 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 90, attrs); 26442 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26443 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 88, attrs); 26444 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 26445 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 90, attrs); 26446 26447 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2, 26448 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 92, attrs); 26449 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3, 26450 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 94, attrs); 26451 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 26452 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 92, attrs); 26453 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 26454 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 94, attrs); 26455 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 26456 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 92, attrs); 26457 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 26458 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 94, attrs); 26459 26460 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4, 26461 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 96, attrs); 26462 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 5, 26463 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 98, attrs); 26464 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 26465 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 96, attrs); 26466 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5, 26467 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 98, attrs); 26468 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4, 26469 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 96, attrs); 26470 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5, 26471 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 98, attrs); 26472 26473 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 6, 26474 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 100, attrs); 26475 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 7, 26476 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 102, attrs); 26477 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6, 26478 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 100, attrs); 26479 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7, 26480 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 102, attrs); 26481 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6, 26482 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 100, attrs); 26483 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 7, 26484 BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 102, attrs); 26485 26486 /* Initialize Level_2 16-bit extractors section - Slice_A. */ 26487 level = 2; 26488 gran = 16; 26489 ext_num = 0; 26490 sal_memset(&ext_attrs, 0, ext_attrs_size); 26491 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM); 26492 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26493 BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 0, &ext_attrs); 26494 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 26495 BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 16, &ext_attrs); 26496 sal_memset(&ext_attrs, 0, ext_attrs_size); 26497 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 26498 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 26499 BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 32, &ext_attrs); 26500 sal_memset(&ext_attrs, 0, ext_attrs_size); 26501 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 26502 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 26503 BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 48, &ext_attrs); 26504 for (ext_num = 4; ext_num < 10; ext_num++) { 26505 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26506 BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS2, 26507 ((ext_num - 4) * gran), attrs); 26508 } 26509 26510 /* Initialize Level_2 8-bit extractors section. */ 26511 level = 2; 26512 gran = 8; 26513 ext_num = 0; 26514 part = 0; 26515 sal_memset(&ext_attrs, 0, ext_attrs_size); 26516 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26517 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 26518 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 96, &ext_attrs); 26519 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 26520 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2,104, &ext_attrs); 26521 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 26522 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 112, &ext_attrs); 26523 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 26524 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 120, &ext_attrs); 26525 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 26526 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 128, &ext_attrs); 26527 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 26528 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 136, &ext_attrs); 26529 26530 ext_num = 6; 26531 sal_memset(&ext_attrs, 0, ext_attrs_size); 26532 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 26533 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num , 26534 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 144, &ext_attrs); 26535 26536 /* Initialize Level_2 4-bit extractors section. */ 26537 level = 2; 26538 gran = 4; 26539 ext_num = 0; 26540 sal_memset(&ext_attrs, 0, ext_attrs_size); 26541 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26542 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 26543 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 152, &ext_attrs); 26544 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 26545 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 156, &ext_attrs); 26546 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 26547 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 160, &ext_attrs); 26548 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 26549 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 164, &ext_attrs); 26550 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 26551 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 168, &ext_attrs); 26552 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 26553 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 172, &ext_attrs); 26554 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 26555 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 176, &ext_attrs); 26556 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 26557 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 180, &ext_attrs); 26558 26559 /* Initialize Level2 2-bit extractors section. */ 26560 level = 2; 26561 gran = 2; 26562 ext_num = 0; 26563 sal_memset(&ext_attrs, 0, ext_attrs_size); 26564 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26565 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 26566 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 184, &ext_attrs); 26567 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 26568 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 186, &ext_attrs); 26569 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 26570 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 188, &ext_attrs); 26571 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 26572 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 190, &ext_attrs); 26573 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 26574 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 192, &ext_attrs); 26575 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 26576 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 194, &ext_attrs); 26577 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 26578 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 196, &ext_attrs); 26579 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 26580 BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 198, &ext_attrs); 26581 26582 /* Initialize Level_2 16-bit extractors section - Slice_B. */ 26583 level = 2; 26584 gran = 16; 26585 ext_num = 0; 26586 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26587 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 0, attrs); 26588 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 26589 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 16, attrs); 26590 sal_memset(&ext_attrs, 0, ext_attrs_size); 26591 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 26592 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 26593 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 32, &ext_attrs); 26594 sal_memset(&ext_attrs, 0, ext_attrs_size); 26595 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 26596 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 26597 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 48, &ext_attrs); 26598 26599 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 26600 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 0, attrs); 26601 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5, 26602 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 16, attrs); 26603 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6, 26604 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 32, attrs); 26605 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7, 26606 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 48, attrs); 26607 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 8, 26608 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 64, attrs); 26609 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 9, 26610 BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 80, attrs); 26611 26612 /* Initialize Level_2 8-bit extractors section. */ 26613 level = 2; 26614 gran = 8; 26615 ext_num = 0; 26616 part = 1; 26617 sal_memset(&ext_attrs, 0, ext_attrs_size); 26618 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26619 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 26620 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 96, &ext_attrs); 26621 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 26622 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2,104, &ext_attrs); 26623 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 26624 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 112, &ext_attrs); 26625 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 26626 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 120, &ext_attrs); 26627 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 26628 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 128, &ext_attrs); 26629 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 26630 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 136, &ext_attrs); 26631 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 26632 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 144, &ext_attrs); 26633 26634 /* Initialize Level_2 4-bit extractors section. */ 26635 level = 2; 26636 gran = 4; 26637 ext_num = 0; 26638 sal_memset(&ext_attrs, 0, ext_attrs_size); 26639 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26640 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 26641 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 152, &ext_attrs); 26642 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 26643 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 156, &ext_attrs); 26644 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 26645 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 160, &ext_attrs); 26646 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 26647 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 164, &ext_attrs); 26648 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 26649 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 168, &ext_attrs); 26650 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 26651 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 172, &ext_attrs); 26652 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 26653 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 176, &ext_attrs); 26654 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 26655 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 180, &ext_attrs); 26656 26657 /* Initialize Level2 2-bit extractors section. */ 26658 level = 2; 26659 gran = 2; 26660 ext_num = 0; 26661 sal_memset(&ext_attrs, 0, ext_attrs_size); 26662 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26663 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 26664 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 184, &ext_attrs); 26665 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 26666 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 186, &ext_attrs); 26667 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 26668 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 188, &ext_attrs); 26669 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 26670 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 190, &ext_attrs); 26671 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 26672 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 192, &ext_attrs); 26673 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 26674 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 194, &ext_attrs); 26675 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 26676 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 196, &ext_attrs); 26677 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 26678 BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 198, &ext_attrs); 26679 26680 /* Initialize Level_2 16-bit extractors section - Slice_C. */ 26681 level = 2; 26682 gran = 16; 26683 ext_num = 0; 26684 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num, 26685 BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS1, 0, attrs); 26686 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1, 26687 BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS1, 16, attrs); 26688 sal_memset(&ext_attrs, 0, ext_attrs_size); 26689 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 26690 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2, 26691 BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS1, 32, &ext_attrs); 26692 sal_memset(&ext_attrs, 0, ext_attrs_size); 26693 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 26694 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3, 26695 BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS1, 48, &ext_attrs); 26696 26697 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4, 26698 BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 0, attrs); 26699 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 5, 26700 BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 16, attrs); 26701 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 6, 26702 BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 32, attrs); 26703 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 7, 26704 BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 48, attrs); 26705 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 8, 26706 BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 64, attrs); 26707 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 9, 26708 BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 80, attrs); 26709 26710 /* Initialize Level_2 8-bit extractors section. */ 26711 level = 2; 26712 gran = 8; 26713 ext_num = 0; 26714 part = 2; 26715 sal_memset(&ext_attrs, 0, ext_attrs_size); 26716 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26717 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 26718 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 96, &ext_attrs); 26719 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 26720 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2,104, &ext_attrs); 26721 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 26722 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 112, &ext_attrs); 26723 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 26724 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 120, &ext_attrs); 26725 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 26726 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 128, &ext_attrs); 26727 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 26728 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 136, &ext_attrs); 26729 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 26730 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 144, &ext_attrs); 26731 26732 /* Initialize Level_2 4-bit extractors section. */ 26733 level = 2; 26734 gran = 4; 26735 ext_num = 0; 26736 sal_memset(&ext_attrs, 0, ext_attrs_size); 26737 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26738 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 26739 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 152, &ext_attrs); 26740 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 26741 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 156, &ext_attrs); 26742 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 26743 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 160, &ext_attrs); 26744 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 26745 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 164, &ext_attrs); 26746 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 26747 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 168, &ext_attrs); 26748 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 26749 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 172, &ext_attrs); 26750 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 26751 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 176, &ext_attrs); 26752 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 26753 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 180, &ext_attrs); 26754 26755 /* Initialize Level2 2-bit extractors section. */ 26756 level = 2; 26757 gran = 2; 26758 ext_num = 0; 26759 sal_memset(&ext_attrs, 0, ext_attrs_size); 26760 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26761 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num, 26762 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 184, &ext_attrs); 26763 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1), 26764 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 186, &ext_attrs); 26765 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2), 26766 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 188, &ext_attrs); 26767 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3), 26768 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 190, &ext_attrs); 26769 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4), 26770 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 192, &ext_attrs); 26771 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5), 26772 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 194, &ext_attrs); 26773 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6), 26774 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 196, &ext_attrs); 26775 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7), 26776 BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 198, &ext_attrs); 26777 26778 /* Initialize Level_3 16-bit extractors section - SLICE_A. */ 26779 level = 3; 26780 gran = 16; 26781 ext_num = 0; 26782 sal_memset(&ext_attrs, 0, ext_attrs_size); 26783 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26784 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM); 26785 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26786 BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 0, &ext_attrs); 26787 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 26788 BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 20, &ext_attrs); 26789 sal_memset(&ext_attrs, 0, ext_attrs_size); 26790 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26791 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 26792 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 26793 BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 48, &ext_attrs); 26794 sal_memset(&ext_attrs, 0, ext_attrs_size); 26795 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26796 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 26797 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 26798 BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 64, &ext_attrs); 26799 26800 /* Initialize Level_3 4-bit extractors section. */ 26801 level = 3; 26802 gran = 4; 26803 ext_num = 0; 26804 sal_memset(&ext_attrs, 0, ext_attrs_size); 26805 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM); 26806 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26807 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 16, &ext_attrs); 26808 for (idx = 1; idx < 4; idx++) { 26809 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26810 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26811 36 + (gran * (idx - 1)), attrs); 26812 } 26813 26814 level = 3; 26815 gran = 4; 26816 ext_num = 4; 26817 for (idx = 0; idx < 10; idx++) { 26818 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26819 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26820 80 + (idx * gran), attrs); 26821 } 26822 26823 ext_num = 4; 26824 idx = 10; 26825 sal_memset(&ext_attrs, 0, ext_attrs_size); 26826 SHR_BITSET(ext_attrs.w, 26827 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_0_3); 26828 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26829 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26830 80 + (idx * gran), &ext_attrs); 26831 26832 idx = 11; 26833 sal_memset(&ext_attrs, 0, ext_attrs_size); 26834 SHR_BITSET(ext_attrs.w, 26835 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_4_7); 26836 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26837 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26838 80 + (idx * gran), &ext_attrs); 26839 26840 idx = 12; 26841 sal_memset(&ext_attrs, 0, ext_attrs_size); 26842 SHR_BITSET(ext_attrs.w, 26843 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_8_11); 26844 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26845 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26846 80 + (idx * gran), &ext_attrs); 26847 26848 ext_num = 4; 26849 idx = 13; 26850 sal_memset(&ext_attrs, 0, ext_attrs_size); 26851 SHR_BITSET(ext_attrs.w, 26852 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_0_3); 26853 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26854 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26855 80 + (idx * gran), &ext_attrs); 26856 26857 idx = 14; 26858 sal_memset(&ext_attrs, 0, ext_attrs_size); 26859 SHR_BITSET(ext_attrs.w, 26860 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_4_7); 26861 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26862 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26863 80 + (idx * gran), &ext_attrs); 26864 26865 idx = 15; 26866 sal_memset(&ext_attrs, 0, ext_attrs_size); 26867 SHR_BITSET(ext_attrs.w, 26868 BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_8_11); 26869 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26870 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26871 80 + (idx * gran), &ext_attrs); 26872 26873 ext_num = 4; 26874 idx = 16; 26875 sal_memset(&ext_attrs, 0, ext_attrs_size); 26876 SHR_BITSET(ext_attrs.w,BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 26877 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 26878 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26879 80 + (idx * gran), &ext_attrs); 26880 26881 26882 /* Initialize Level_3 2-bit extractors section. */ 26883 level = 3; 26884 gran = 2; 26885 for (ext_num = 0; ext_num < 1; ext_num++) { 26886 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26887 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 26888 148 + (ext_num * gran), attrs); 26889 } 26890 ext_num = 1; 26891 sal_memset(&ext_attrs, 0, ext_attrs_size); 26892 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID); 26893 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num , 26894 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 150, &ext_attrs); 26895 26896 /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */ 26897 ext_num = 0; 26898 sal_memset(&ext_attrs, 0, ext_attrs_size); 26899 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB); 26900 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2, 26901 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 152, &ext_attrs); 26902 ext_num = 0; 26903 sal_memset(&ext_attrs, 0, ext_attrs_size); 26904 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_HIT); 26905 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_HIT); 26906 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3, 26907 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 154, &ext_attrs); 26908 26909 /* Overlay with NAT_DST_REALM_ID. */ 26910 ext_num = 0; 26911 sal_memset(&ext_attrs, 0, ext_attrs_size); 26912 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_DST_REALM_ID); 26913 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4, 26914 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 156, &ext_attrs); 26915 26916 /* Initialize Level_3 1-bit extractors section. */ 26917 level = 3; 26918 gran = 1; 26919 ext_num = 0; 26920 /* Overlay with NAT_NEEDED. */ 26921 sal_memset(&ext_attrs, 0, ext_attrs_size); 26922 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_NEEDED); 26923 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num, 26924 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 158, &ext_attrs); 26925 /* Overlay with DROP. */ 26926 sal_memset(&ext_attrs, 0, ext_attrs_size); 26927 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_DROP); 26928 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1, 26929 BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 159, &ext_attrs); 26930 26931 /* Initialize Level_3 16-bit extractors section - SLICE_B. */ 26932 level = 3; 26933 gran = 16; 26934 ext_num = 0; 26935 sal_memset(&ext_attrs, 0, ext_attrs_size); 26936 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26937 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26938 BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 0, &ext_attrs); 26939 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1, 26940 BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 20, &ext_attrs); 26941 sal_memset(&ext_attrs, 0, ext_attrs_size); 26942 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26943 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 26944 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 26945 BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 48, &ext_attrs); 26946 sal_memset(&ext_attrs, 0, ext_attrs_size); 26947 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 26948 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 26949 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 26950 BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 64, &ext_attrs); 26951 26952 /* Initialize Level_3 4-bit extractors section. */ 26953 level = 3; 26954 gran = 4; 26955 ext_num = 0; 26956 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26957 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 16, attrs); 26958 for (idx = 1; idx < 4; idx++) { 26959 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, 26960 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 26961 36 + (gran * (idx - 1)), attrs); 26962 } 26963 level = 3; 26964 gran = 4; 26965 ext_num = 4; 26966 for (idx = 0; idx < 17; idx++) { 26967 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, 26968 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 26969 80 + (idx * gran), attrs); 26970 } 26971 /* Initialize Level_3 2-bit extractors section. */ 26972 level = 3; 26973 gran = 2; 26974 for (ext_num = 0; ext_num < 2; ext_num++) { 26975 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 26976 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 26977 148 + (gran * ext_num), attrs); 26978 } 26979 26980 /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */ 26981 ext_num = 0; 26982 sal_memset(&ext_attrs, 0, ext_attrs_size); 26983 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB); 26984 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2, 26985 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 152, &ext_attrs); 26986 26987 ext_num = 0; 26988 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3, 26989 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 154, attrs); 26990 26991 ext_num = 0; 26992 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4, 26993 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 156, attrs); 26994 26995 /* Initialize Level_3 1-bit extractors section. */ 26996 level = 3; 26997 gran = 1; 26998 for (ext_num = 0; ext_num < 2; ext_num++) { 26999 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num, 27000 BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 27001 158 + (gran * ext_num), attrs); 27002 } 27003 27004 /* Initialize Level_3 16-bit extractors section - SLICE_C. */ 27005 level = 3; 27006 gran = 16; 27007 ext_num = 0; 27008 sal_memset(&ext_attrs, 0, ext_attrs_size); 27009 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 27010 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num, 27011 BCMI_KEYGEN_EXT_SECTION_L3CS1, BCMI_KEYGEN_EXT_SECTION_FKC, 0, &ext_attrs); 27012 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1, 27013 BCMI_KEYGEN_EXT_SECTION_L3CS1, BCMI_KEYGEN_EXT_SECTION_FKC, 20, &ext_attrs); 27014 sal_memset(&ext_attrs, 0, ext_attrs_size); 27015 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 27016 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0); 27017 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2, 27018 BCMI_KEYGEN_EXT_SECTION_L3CS1, BCMI_KEYGEN_EXT_SECTION_FKC, 48, &ext_attrs); 27019 sal_memset(&ext_attrs, 0, ext_attrs_size); 27020 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU); 27021 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1); 27022 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3, 27023 BCMI_KEYGEN_EXT_SECTION_L3CS1, BCMI_KEYGEN_EXT_SECTION_FKC, 64, &ext_attrs); 27024 27025 /* Initialize Level_3 4-bit extractors section. */ 27026 level = 3; 27027 gran = 4; 27028 ext_num = 0; 27029 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num, 27030 BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 16, attrs); 27031 for (idx = 1; idx < 4; idx++) { 27032 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, 27033 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 27034 36 + (gran * (idx - 1)), attrs); 27035 } 27036 27037 level = 3; 27038 gran = 4; 27039 ext_num = 4; 27040 for (idx = 0; idx < 17; idx++) { 27041 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, 27042 (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 27043 80 + (idx * gran), attrs); 27044 } 27045 27046 /* Initialize Level_3 2-bit extractors section. */ 27047 level = 3; 27048 gran = 2; 27049 for (ext_num = 0; ext_num < 2; ext_num++) { 27050 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num, 27051 BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 27052 148 + (gran * ext_num), attrs); 27053 } 27054 27055 /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */ 27056 ext_num = 0; 27057 sal_memset(&ext_attrs, 0, ext_attrs_size); 27058 SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB); 27059 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2, 27060 BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 152, &ext_attrs); 27061 27062 ext_num = 0; 27063 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3, 27064 BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 154, attrs); 27065 27066 ext_num = 0; 27067 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4, 27068 BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 156, attrs); 27069 27070 27071 /* Initialize Level_3 1-bit extractors section. */ 27072 level = 3; 27073 gran = 1; 27074 for (ext_num = 0; ext_num < 2; ext_num++) { 27075 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num, 27076 BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 27077 158 + (gran * ext_num), attrs); 27078 } 27079 27080 /* Initialize Level_4 extractor section. */ 27081 level = 4; 27082 gran = 160; 27083 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 0, 27084 BCMI_KEYGEN_EXT_SECTION_FK, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs); 27085 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 0, 27086 BCMI_KEYGEN_EXT_SECTION_FKA, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs); 27087 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, 0, 27088 BCMI_KEYGEN_EXT_SECTION_FKB, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs); 27089 BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, 0, 27090 BCMI_KEYGEN_EXT_SECTION_FKC, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs); 27091 exit: 27092 BCMI_KEYGEN_FUNC_EXIT(); 27093 } 27094 27095 /* 27096 * Function: 27097 * _bcm_field_th_init 27098 * Purpose: 27099 * Perform initializations that are specific to BCM56960. This 27100 * includes initializing the FP field select bit offset tables for FPF[1-3] 27101 * for every stage. 27102 * Parameters: 27103 * unit - (IN) BCM device number. 27104 * fc - (IN) Field Processor control structure. 27105 * 27106 * Returns: 27107 * BCM_E_PARAM - Null field control structure or stage control structure. 27108 * BCM_E_INTERNAL - Invalid CAP stage ID. 27109 * BCM_E_NONE - Success. 27110 */ 27111 int 27112 _bcm_field_th_init(int unit, _field_control_t *fc) 27113 { 27114 _field_stage_t *stage_fc; /* Pointer to Stage control structure. */ 27115 27116 /* Input parameters check. */ 27117 if (NULL == fc || NULL == fc->stages) { 27118 return (BCM_E_PARAM); 27119 } 27120 27121 /* Get the stage control handle. */ 27122 stage_fc = fc->stages; 27123 27124 /* 27125 * Initialize FP hardware tables based on the device Group Oper mode 27126 * settings. 27127 */ 27128 switch (stage_fc->oper_mode) { 27129 case bcmFieldGroupOperModeGlobal: 27130 /* Legacy global mode, use DUPLICATE view to clear FP HW tables. */ 27131 while (stage_fc) { 27132 if (!SAL_BOOT_BCMSIM && !SAL_BOOT_QUICKTURN && !SAL_BOOT_XGSSIM) { 27133 /* Clear hardware table */ 27134 BCM_IF_ERROR_RETURN(_field_th_hw_clear(unit, 27135 stage_fc, fc)); 27136 } 27137 27138 /* Initialize qualifiers info. */ 27139 BCM_IF_ERROR_RETURN(_field_th_qualifiers_init(unit, stage_fc)); 27140 27141 /* Initialize stage actions information. */ 27142 BCM_IF_ERROR_RETURN(_field_th_actions_init(unit, stage_fc)); 27143 27144 /* Goto next stage */ 27145 stage_fc = stage_fc->next; 27146 } 27147 27148 if (0 == SOC_WARM_BOOT(unit)) { 27149 if (!(soc_feature(unit, soc_feature_th3_style_fp))) { 27150 /* Enable FP meter refresh on all pipes. */ 27151 BCM_IF_ERROR_RETURN(_field_meter_refresh_enable_set(unit, fc, 27152 TRUE)); 27153 } 27154 } 27155 break; 27156 27157 case bcmFieldGroupOperModePipeLocal: 27158 while (stage_fc) { 27159 if (!SAL_BOOT_BCMSIM && !SAL_BOOT_QUICKTURN && !SAL_BOOT_XGSSIM) { 27160 /* Clear hardware table */ 27161 BCM_IF_ERROR_RETURN(_field_th_pipes_hw_clear(unit, 27162 stage_fc, fc)); 27163 } 27164 27165 /* Initialize qualifiers info. */ 27166 BCM_IF_ERROR_RETURN(_field_th_qualifiers_init(unit, stage_fc)); 27167 27168 /* Initialize stage actions information. */ 27169 BCM_IF_ERROR_RETURN(_field_th_actions_init(unit, stage_fc)); 27170 27171 /* Goto next stage */ 27172 stage_fc = stage_fc->next; 27173 } 27174 if (0 == SOC_WARM_BOOT(unit)) { 27175 /* Enable FP meter refresh on all pipes. */ 27176 if (!(soc_feature(unit, soc_feature_th3_style_fp))) { 27177 27178 BCM_IF_ERROR_RETURN(_field_th_pipes_meter_refresh_enable( 27179 unit, fc, TRUE)); 27180 } 27181 } 27182 break; 27183 27184 default: 27185 break; 27186 } 27187 27188 if (0 == SOC_WARM_BOOT(unit)) { 27189 /* Enable filter processor */ 27190 BCM_IF_ERROR_RETURN(_field_port_filter_enable_set(unit, fc, TRUE)); 27191 27192 } 27193 27194 #if defined(BCM_TRIDENT3_SUPPORT) 27195 if (soc_feature(unit, soc_feature_td3_style_fp)) { 27196 /* Initialize the function pointers */ 27197 _bcm_field_td3_functions_init(&fc->functions); 27198 } else 27199 #endif /* BCM_TRIDENT3_SUPPORT */ 27200 { 27201 /* Initialize the function pointers */ 27202 _bcm_field_th_functions_init(&fc->functions); 27203 } 27204 27205 /* initialize the qset comb */ 27206 BCM_IF_ERROR_RETURN(_field_th_qset_comb_init(unit, fc)); 27207 27208 /* Register with Counter ejection */ 27209 _bcm_th_field_counter_config_set(unit); 27210 27211 stage_fc = fc->stages; 27212 while (stage_fc) { 27213 if ((stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) || 27214 (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH)) { 27215 /* Match ID width partition for each zone */ 27216 if (fc->functions.fp_zone_match_id_partition_init != NULL) { 27217 BCM_IF_ERROR_RETURN(fc->functions.fp_zone_match_id_partition_init 27218 (unit, stage_fc)); 27219 } 27220 } 27221 #ifdef BCM_FLOWTRACKER_SUPPORT 27222 if (stage_fc->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) { 27223 BCM_IF_ERROR_RETURN(_field_hx5_ft_tcam_policy_init(unit, stage_fc)); 27224 } 27225 #endif 27226 /* Goto next stage */ 27227 stage_fc = stage_fc->next; 27228 } 27229 27230 return (BCM_E_NONE); 27231 } 27232 27233 /* 27234 * Function: 27235 * _field_ingress_entry_tcam_wide_install 27236 * Purpose: 27237 * Set the per-pipe PBMP in the Ingress TCAM 27238 * Parameters: 27239 * unit - (IN) BCM device number 27240 * f_ent - (IN) entry structure to get policy info from 27241 * tcam_idx - (IN) Index in the TCAM memory. 27242 * _f_pbmp - (IN) Reference to field PBMP. 27243 * num_pipe - (IN) Number of Pipes the _f_pbmp has. 27244 * Returns: 27245 * BCM_E_XXX 27246 */ 27247 STATIC int 27248 _field_ingress_entry_tcam_wide_install(int unit, _field_entry_t *f_ent, 27249 int tcam_idx, uint8 set_pbmp, 27250 _field_pbmp_t *_f_pbmp, 27251 int num_pipe) 27252 { 27253 int inst; /* Pipe Instance. */ 27254 int valid = 0; /* Valid bit. */ 27255 _field_tcam_t *tcam; 27256 uint32 entry_buf[SOC_MAX_MEM_FIELD_WORDS] = {0}; 27257 /* Buffer to fill Policy & TCAM entry.*/ 27258 soc_mem_t ifp_tcam_wide; /* IFP TCAM memory names. */ 27259 27260 #if defined(BCM_TOMAHAWK2_SUPPORT) 27261 bcm_pbmp_t valid_pbm; /* valid_pbm in HW. */ 27262 #endif 27263 if (f_ent == NULL || _f_pbmp == NULL) { 27264 return BCM_E_PARAM; 27265 } 27266 27267 /* Update the valid bit based on the mode and group flags */ 27268 valid = (f_ent->group->flags & _FP_GROUP_LOOKUP_ENABLED) ? 3 : 0; 27269 27270 tcam = &f_ent->tcam; 27271 for (inst = 0; inst < num_pipe; inst++) { 27272 if (!SOC_IS_TOMAHAWK3(unit)) { 27273 BCM_IF_ERROR_RETURN( 27274 _bcm_field_mem_instance_get(unit, 27275 IFP_TCAM_WIDEm, 27276 inst, 27277 &ifp_tcam_wide)); 27278 } else { 27279 BCM_IF_ERROR_RETURN( 27280 _bcm_field_mem_instance_get(unit, 27281 IFP_TCAMm, 27282 inst, 27283 &ifp_tcam_wide)); 27284 } 27285 sal_memset(entry_buf, 0x0, sizeof(entry_buf)); 27286 soc_mem_field_set(unit, ifp_tcam_wide, entry_buf, KEYf, tcam->key); 27287 soc_mem_field_set(unit, ifp_tcam_wide, entry_buf, MASKf, tcam->mask); 27288 if (set_pbmp == 1) { 27289 #if defined(BCM_TOMAHAWK2_SUPPORT) 27290 if (soc_feature(unit, soc_feature_xy_tcam_x0y)) { 27291 BCM_PBMP_CLEAR(valid_pbm); 27292 soc_mem_field_set(unit, ifp_tcam_wide, entry_buf, 27293 IPBMf, (uint32 *)&valid_pbm); 27294 BCM_PBMP_ASSIGN(valid_pbm, _f_pbmp[inst].data); 27295 BCM_PBMP_AND(valid_pbm, _f_pbmp[inst].mask); 27296 BCM_PBMP_XOR(valid_pbm, _f_pbmp[inst].mask); 27297 soc_mem_field_width_fit_set(unit, ifp_tcam_wide, entry_buf, 27298 IPBM_MASKf, (uint32 *)&valid_pbm); 27299 } else 27300 #endif /* BCM_TOMAHAWK2_SUPPORT */ 27301 { 27302 soc_mem_field_set(unit, ifp_tcam_wide, entry_buf, 27303 IPBMf, (uint32 *)&_f_pbmp[inst].data); 27304 soc_mem_field_width_fit_set(unit, ifp_tcam_wide, entry_buf, 27305 IPBM_MASKf, (uint32 *)&_f_pbmp[inst].mask); 27306 } 27307 } 27308 soc_mem_field32_set(unit, ifp_tcam_wide, entry_buf, VALIDf, valid); 27309 BCM_IF_ERROR_RETURN(soc_th_ifp_mem_write(unit, 27310 ifp_tcam_wide, 27311 MEM_BLOCK_ALL, 27312 tcam_idx, 27313 entry_buf)); 27314 } 27315 27316 return BCM_E_NONE; 27317 } 27318 27319 /* 27320 * Function: 27321 * _field_fp_tcam_ipbmp_size 27322 * Purpose: 27323 * Retrieve the per-pipe PBMP size for a chip. 27324 * Parameters: 27325 * unit - (IN) BCM device number 27326 * Returns: 27327 * pbmp_size 27328 */ 27329 27330 int 27331 _field_fp_tcam_ipbmp_size(int unit) { 27332 27333 #ifdef BCM_TOMAHAWK3_SUPPORT 27334 if (SOC_IS_TOMAHAWK3(unit)) { 27335 return soc_mem_field_length(unit, IFP_TCAMm, IPBMf); 27336 } else 27337 #endif 27338 { 27339 return soc_mem_field_length(unit, IFP_TCAM_WIDEm, IPBMf);; 27340 } 27341 } 27342 27343 /* 27344 * Function: 27345 * _field_ingress_pipe_pbmp_get 27346 * Purpose: 27347 * Retrieve the per-pipe PBMP from the given pbmp 27348 * Parameters: 27349 * unit - (IN) BCM device number 27350 * qset - (IN) Qualifier QSET 27351 * pbmp - (IN) Input PBMP, contains all pipes pbmp. 27352 * pipe_pbmp - (OUT) Reference to per-pipe PBMP. 27353 * pipe_pbmp_len - (IN) Number of elements in pipe_pbmp array. 27354 * Returns: 27355 * BCM_E_XXX 27356 */ 27357 STATIC int 27358 _field_ingress_pipe_pbmp_get(int unit, 27359 bcm_field_qset_t qset, 27360 _field_pbmp_t *pbmp, 27361 _field_pbmp_t *pipe_pbmp, 27362 int pipe_pbmp_len) 27363 { 27364 int inst; /* Pipe Instance */ 27365 int port; /* Input Port */ 27366 int pipe_port; /* Pipe Port */ 27367 int pipe_ports_max; /* Max ports per pipe. */ 27368 27369 /* NULL parameter checks. */ 27370 if (pbmp == NULL || NULL == pipe_pbmp) { 27371 return BCM_E_PARAM; 27372 } 27373 27374 /* Update the pipe PBMP for PortBitmap Qualifiers. */ 27375 if (!BCM_FIELD_QSET_TEST(qset, bcmFieldQualifyInPorts)) { 27376 int base_port; /* Instance Base port. */ 27377 int max_port; /* Instance Max Port. */ 27378 27379 for (inst = 0; inst < pipe_pbmp_len; inst++) { 27380 base_port = (inst * _FP_TCAM_IPBMP_SIZE(unit)); 27381 max_port = ((inst + 1) * _FP_TCAM_IPBMP_SIZE(unit)); 27382 for (port = base_port; port < max_port; port++) { 27383 /* Update data. */ 27384 if (BCM_PBMP_MEMBER(pbmp->data, port)) { 27385 pipe_port = port - base_port; 27386 BCM_PBMP_PORT_ADD(pipe_pbmp[inst].data, pipe_port); 27387 } 27388 /* Update mask. */ 27389 if (BCM_PBMP_MEMBER(pbmp->mask, port)) { 27390 pipe_port = port - base_port; 27391 BCM_PBMP_PORT_ADD(pipe_pbmp[inst].mask, pipe_port); 27392 } 27393 } 27394 } 27395 return BCM_E_NONE; 27396 } 27397 27398 #if defined(BCM_TRIDENT3_SUPPORT) 27399 if (soc_feature(unit, soc_feature_td3_style_fp)) { 27400 pipe_ports_max = _BCM_TD3_NUM_PIPE_PORTS; 27401 } else 27402 #endif /* BCM_TRIDENT3_SUPPORT */ 27403 #if defined(BCM_TOMAHAWK2_SUPPORT) 27404 if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced)) { 27405 pipe_ports_max = _TH2_DEV_PORTS_PER_PIPE; 27406 } else 27407 #endif /* BCM_TOMAHAWK2_SUPPORT */ 27408 #if defined(BCM_TOMAHAWK3_SUPPORT) 27409 if (soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) { 27410 pipe_ports_max = _TH3_DEV_PORTS_PER_PIPE; 27411 } else 27412 #endif /* BCM_TOMAHAWK3_SUPPORT */ 27413 { 27414 pipe_ports_max = _TH_DEV_PORTS_PER_PIPE; 27415 } 27416 27417 /* Update the Output Data Pipe Pbmp based on the input pbmp */ 27418 BCM_PBMP_ITER(pbmp->data, port) { 27419 SOC_IF_ERROR_RETURN(soc_port_pipe_get(unit, port, &inst)); 27420 if (inst >= pipe_pbmp_len) { 27421 return BCM_E_INTERNAL; 27422 } 27423 27424 /* per_pipe pbmp does not have cpu port but all pbmp has cpu port. */ 27425 if (inst == 0 && port == 0) { 27426 BCM_PBMP_PORT_ADD(pipe_pbmp[inst].data, port); 27427 } else if (BCM_PBMP_MEMBER(PBMP_PIPE(unit, inst), port)) { 27428 pipe_port = port - (inst * pipe_ports_max); 27429 BCM_PBMP_PORT_ADD(pipe_pbmp[inst].data, pipe_port); 27430 } else { 27431 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("Invalid port[%d] \n\r"), port)); 27432 return BCM_E_PARAM; 27433 } 27434 } 27435 27436 /* Update the Output Mask Pipe Pbmp based on the input pbmp */ 27437 BCM_PBMP_ITER(pbmp->mask, port) { 27438 SOC_IF_ERROR_RETURN(soc_port_pipe_get(unit, port, &inst)); 27439 if (inst >= pipe_pbmp_len) { 27440 return BCM_E_INTERNAL; 27441 } 27442 27443 /* per_pipe pbmp does not have cpu port but all pbmp has cpu port. */ 27444 if (inst == 0 && port == 0) { 27445 BCM_PBMP_PORT_ADD(pipe_pbmp[inst].mask, port); 27446 } else if (BCM_PBMP_MEMBER(PBMP_PIPE(unit, inst), port) || 27447 IS_LB_PORT(unit, port)) { 27448 pipe_port = port - (inst * pipe_ports_max); 27449 BCM_PBMP_PORT_ADD(pipe_pbmp[inst].mask, pipe_port); 27450 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META("Adding Port[%d] to Mask" 27451 " .. pipe_port:%d on inst:%d\n\r"), 27452 port, pipe_port, inst)); 27453 } else { 27454 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("Invalid mask[%d] \n\r"), port)); 27455 return BCM_E_PARAM; 27456 } 27457 } 27458 27459 return BCM_E_NONE; 27460 } 27461 27462 /* 27463 * Function: 27464 * _field_th_ingress_entry_qual_tcam_install 27465 * Purpose: 27466 * Install the entry qualifiers in the Ingress TCAM. 27467 * Parameters: 27468 * unit - (IN) BCM device number 27469 * f_ent - (IN) entry structure to get policy info from 27470 * tcam_mem - (IN) TCAM memory index. 27471 * tcam_idx - (IN) Index in the TCAM memory. 27472 * Returns: 27473 * BCM_E_XXX 27474 */ 27475 27476 STATIC int 27477 _field_th_ingress_entry_qual_tcam_install(int unit, _field_entry_t *f_ent, 27478 soc_mem_t tcam_mem, int tcam_idx) 27479 { 27480 uint32 entry_buf[SOC_MAX_MEM_FIELD_WORDS] = {0}; 27481 /* Buffer to fill Policy & TCAM entry.*/ 27482 _field_stage_t *stage_fc; /* Reference to Stage control structure. */ 27483 _field_tcam_t *tcam; 27484 _field_group_t *fg; 27485 int rv; 27486 int stage_id; 27487 uint32 valid; 27488 uint8 mode; 27489 27490 /* Input parameters check. */ 27491 if (NULL == f_ent) { 27492 return (BCM_E_PARAM); 27493 } 27494 27495 tcam = &f_ent->tcam; 27496 fg = f_ent->group; 27497 if (tcam == NULL || fg == NULL) { 27498 return BCM_E_INTERNAL; 27499 } 27500 27501 stage_id = f_ent->group->stage_id; 27502 BCM_IF_ERROR_RETURN 27503 (_field_stage_control_get(unit, stage_id, &stage_fc)); 27504 27505 /* Determine the slice mode based on group flags. */ 27506 mode = _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(fg->flags) ? 27507 _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW; 27508 27509 /* Update the valid bit based on the mode and group flags */ 27510 valid = (fg->flags & _FP_GROUP_LOOKUP_ENABLED) ? 27511 ((mode == _IFP_SLICE_MODE_WIDE) ? 3 : 1) : 0; 27512 27513 /* 27514 * When the TCAM Mode is Wide on a global view, 27515 * Install the entry on the Pipes to support the PBMP. 27516 */ 27517 if ((mode == _IFP_SLICE_MODE_WIDE) && 27518 (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) && 27519 (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) { 27520 uint8 set_pbmp = 0; 27521 _field_pbmp_t pipe_pbmp[_FP_MAX_NUM_PIPES]; 27522 27523 if (_BCM_FIELD_QSET_PBMP_TEST(f_ent->group->qset)) { 27524 _field_entry_t *entry_p = NULL; 27525 27526 rv = _field_entry_get(unit, f_ent->eid, _FP_ENTRY_PRIMARY, &entry_p); 27527 BCM_IF_ERROR_RETURN(rv); 27528 27529 /* If entry is the primary part, set the pbmp. */ 27530 if (entry_p == f_ent) { 27531 set_pbmp = 1; 27532 } 27533 27534 if ((set_pbmp == 1) || 27535 ((soc_feature(unit, soc_feature_td3_style_fp) && 27536 BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyInPorts)))) { 27537 sal_memset(&pipe_pbmp, 0x0, 27538 sizeof(_field_pbmp_t) * _FP_MAX_NUM_PIPES); 27539 rv = _field_ingress_pipe_pbmp_get(unit, f_ent->group->qset, 27540 &entry_p->pbmp, 27541 pipe_pbmp, stage_fc->num_pipes); 27542 if (BCM_FAILURE(rv)) { 27543 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("Failed to retrieve Pipe PBMP," 27544 " Failed to write PBMP on IFP_TCAM Pipes.\n\r"))); 27545 return BCM_E_INTERNAL; 27546 } 27547 } 27548 } 27549 27550 #if defined(BCM_TRIDENT3_SUPPORT) 27551 if (soc_feature(unit, soc_feature_td3_style_fp) && 27552 BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyInPorts)) { 27553 rv = _bcm_field_td3_ifp_inports_entry_tcam_install(unit, f_ent, tcam_idx, 27554 set_pbmp, pipe_pbmp, 27555 stage_fc->num_pipes); 27556 } else 27557 #endif /* BCM_TRIDENT3_SUPPORT */ 27558 { 27559 rv = _field_ingress_entry_tcam_wide_install(unit, f_ent, tcam_idx, 27560 set_pbmp, pipe_pbmp, 27561 stage_fc->num_pipes); 27562 } 27563 27564 if (BCM_FAILURE(rv)) { 27565 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 27566 " Failed to write PBMP on IFP_TCAM Pipes.\n\r"))); 27567 return BCM_E_INTERNAL; 27568 } 27569 27570 return (BCM_E_NONE); 27571 } 27572 27573 BCM_IF_ERROR_RETURN(soc_th_ifp_mem_read(unit, 27574 tcam_mem, 27575 MEM_BLOCK_ANY, 27576 tcam_idx, 27577 entry_buf)); 27578 soc_mem_field_set(unit, tcam_mem, entry_buf, KEYf, tcam->key); 27579 soc_mem_field_set(unit, tcam_mem, entry_buf, MASKf, tcam->mask); 27580 27581 soc_mem_field32_set(unit, tcam_mem, entry_buf, VALIDf, valid); 27582 #if defined(BCM_TOMAHAWK2_SUPPORT) 27583 if (soc_feature(unit, soc_feature_xy_tcam_x0y) && 27584 (soc_feature(unit, soc_feature_field_multi_pipe_enhanced) || 27585 soc_feature(unit, soc_feature_th3_style_fp)) && 27586 _BCM_FIELD_QSET_PBMP_TEST(f_ent->group->qset)) { 27587 bcm_pbmp_t valid_pbm; /* valid_pbm in HW. */ 27588 _field_entry_t *entry_p = NULL; 27589 27590 BCM_IF_ERROR_RETURN 27591 (_field_entry_get(unit, f_ent->eid, _FP_ENTRY_PRIMARY, &entry_p)); 27592 /* If entry is the primary part, set the pbmp. */ 27593 if (entry_p == f_ent) { 27594 BCM_PBMP_CLEAR(valid_pbm); 27595 soc_mem_field_width_fit_set(unit, tcam_mem, entry_buf, IPBMf, 27596 (uint32 *)&valid_pbm); 27597 BCM_PBMP_ASSIGN(valid_pbm, f_ent->pbmp.data); 27598 BCM_PBMP_AND(valid_pbm, f_ent->pbmp.mask); 27599 BCM_PBMP_XOR(valid_pbm, f_ent->pbmp.mask); 27600 soc_mem_field_width_fit_set(unit, tcam_mem, entry_buf, IPBM_MASKf, 27601 (uint32 *)&valid_pbm); 27602 } 27603 } 27604 #endif /* BCM_TOMAHAWK2_SUPPORT */ 27605 BCM_IF_ERROR_RETURN(soc_th_ifp_mem_write(unit, 27606 tcam_mem, 27607 MEM_BLOCK_ALL, 27608 tcam_idx, 27609 entry_buf)); 27610 return (BCM_E_NONE); 27611 } 27612 27613 /* 27614 * Function: 27615 * _field_th_vfp_efp_entry_qual_tcam_install 27616 * Purpose: 27617 * Install the entry qualifiers in the VFP or EFP TCAM. 27618 * Parameters: 27619 * unit - (IN) BCM device number 27620 * f_ent - (IN) entry structure to get policy info from 27621 * tcam_mem - (IN) TCAM memory index. 27622 * tcam_idx - (IN) Index in the TCAM memory. 27623 * Returns: 27624 * BCM_E_XXX 27625 */ 27626 27627 STATIC int 27628 _field_th_vfp_efp_entry_qual_tcam_install(int unit, _field_entry_t *f_ent, 27629 soc_mem_t tcam_mem, int tcam_idx) 27630 { 27631 uint32 entry_buf[SOC_MAX_MEM_FIELD_WORDS] = {0}; 27632 /* Buffer to fill Policy & TCAM entry.*/ 27633 uint8 valid = 0; 27634 soc_field_t mask_field; 27635 _field_tcam_t *tcam = NULL; 27636 uint8 hw_enable = 0, hw_disable = 0; 27637 27638 27639 /* Input parameters check. */ 27640 if (NULL == f_ent) { 27641 return (BCM_E_PARAM); 27642 } 27643 27644 /* Update TCAM and Mask field as per the stage. */ 27645 switch (f_ent->group->stage_id) { 27646 case _BCM_FIELD_STAGE_LOOKUP: 27647 tcam = &f_ent->tcam; 27648 mask_field = MASKf; 27649 break; 27650 case _BCM_FIELD_STAGE_EGRESS: 27651 tcam = (f_ent->efp_key_match_type) ? 27652 &f_ent->key_match_tcam : &f_ent->tcam; 27653 mask_field = KEY_MASKf; 27654 break; 27655 default: 27656 return (BCM_E_INTERNAL); 27657 } 27658 27659 if (tcam == NULL) { 27660 return BCM_E_INTERNAL; 27661 } 27662 27663 if ((soc_feature(unit, soc_feature_field_multi_pipe_enhanced) || 27664 soc_feature(unit, soc_feature_td3_style_fp)) && 27665 (f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP)) { 27666 /* VALIDf in VFP_TCAM on TH2 only has one bit */ 27667 hw_enable = 1; 27668 hw_disable = 0; 27669 } else if ((SOC_IS_TOMAHAWK3(unit)) && 27670 ((f_ent->group->stage_id == _BCM_FIELD_STAGE_EGRESS) || 27671 (f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP))) { 27672 /* VALIDf in EFP_TCAM on TH3 only has one bit */ 27673 hw_enable = 1; 27674 hw_disable = 0; 27675 } else { 27676 hw_enable = 3; 27677 hw_disable = 2; 27678 } 27679 27680 valid = (f_ent->group->flags & _FP_GROUP_LOOKUP_ENABLED) 27681 ? hw_enable:hw_disable; 27682 27683 soc_mem_field_set(unit, tcam_mem, entry_buf, KEYf, tcam->key); 27684 soc_mem_field_set(unit, tcam_mem, entry_buf, mask_field, tcam->mask); 27685 27686 soc_mem_field32_set(unit, tcam_mem, entry_buf, VALIDf, valid); 27687 27688 BCM_IF_ERROR_RETURN(soc_th_ifp_mem_write(unit, tcam_mem, MEM_BLOCK_ALL, 27689 tcam_idx, entry_buf)); 27690 return (BCM_E_NONE); 27691 } 27692 27693 27694 /* 27695 * Function: 27696 * _bcm_field_th_tcam_policy_mem_get 27697 * 27698 * Purpose: 27699 * Get tcam & policy memories for a specific chip pipeline stage. 27700 * 27701 * Parameters: 27702 * unit - (IN) BCM device number. 27703 * f_ent - (IN) Field entry. 27704 * tcam_mem - (OUT) TCAM Memory id. 27705 * policy_mem - (OUT) Policy memory id. 27706 * 27707 * Returns: 27708 * BCM_E_XXX 27709 */ 27710 int 27711 _bcm_field_th_tcam_policy_mem_get(int unit, 27712 _field_entry_t *f_ent, 27713 soc_mem_t *tcam_mem, 27714 soc_mem_t *policy_mem) 27715 { 27716 int mode = 0; /* IFP_TCAM mode */ 27717 int instance; /* Pipe Instance */ 27718 soc_mem_t vfp_tcam; 27719 soc_mem_t vfp_policy_table; 27720 soc_mem_t efp_tcam; 27721 soc_mem_t efp_policy_table; 27722 soc_mem_t ifp_tcam_wide; 27723 soc_mem_t ifp_tcam_narrow; 27724 soc_mem_t ifp_policy_table_wide; 27725 soc_mem_t ifp_policy_table; 27726 soc_mem_t em_uft_wide; 27727 soc_mem_t em_uft_narrow; 27728 27729 _field_stage_t *stage_fc; /* Reference to Stage control structure. */ 27730 27731 /* Input parameters check. */ 27732 if ((NULL == f_ent) || (NULL == tcam_mem) || (NULL == policy_mem)) { 27733 return (BCM_E_PARAM); 27734 } 27735 27736 if (NULL == f_ent->group) { 27737 return (BCM_E_INTERNAL); 27738 } 27739 27740 BCM_IF_ERROR_RETURN 27741 (_field_stage_control_get (unit, f_ent->group->stage_id, &stage_fc)); 27742 27743 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 27744 instance = _FP_GLOBAL_INST; 27745 } else { 27746 instance = f_ent->group->instance; 27747 } 27748 27749 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, VFP_TCAMm, 27750 instance, &vfp_tcam)); 27751 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, VFP_POLICY_TABLEm, 27752 instance, &vfp_policy_table)); 27753 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, EFP_TCAMm, 27754 instance, &efp_tcam)); 27755 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, EFP_POLICY_TABLEm, 27756 instance, &efp_policy_table)); 27757 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 27758 IFP_TCAM_WIDEm, 27759 instance, 27760 &ifp_tcam_wide)); 27761 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 27762 IFP_TCAMm, 27763 instance, 27764 &ifp_tcam_narrow)); 27765 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 27766 IFP_POLICY_TABLEm, 27767 instance, 27768 &ifp_policy_table)); 27769 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 27770 IFP_POLICY_TABLE_WIDEm, 27771 instance, 27772 &ifp_policy_table_wide)); 27773 27774 switch (f_ent->group->stage_id) { 27775 case _BCM_FIELD_STAGE_INGRESS: 27776 if (soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) { 27777 *tcam_mem = ifp_tcam_narrow; 27778 } else { 27779 mode = _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(f_ent->group->flags)? 27780 _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW; 27781 *tcam_mem = (mode == _IFP_SLICE_MODE_WIDE) ? 27782 ifp_tcam_wide:ifp_tcam_narrow; 27783 } 27784 27785 if(soc_feature(unit, soc_feature_ifp_action_profiling)) { 27786 *policy_mem = (mode == _IFP_SLICE_MODE_WIDE) ? 27787 ifp_policy_table_wide : ifp_policy_table; 27788 } else { 27789 *policy_mem = ifp_policy_table; 27790 } 27791 break; 27792 27793 case _BCM_FIELD_STAGE_LOOKUP: 27794 *tcam_mem = vfp_tcam; 27795 *policy_mem = vfp_policy_table; 27796 break; 27797 27798 case _BCM_FIELD_STAGE_EGRESS: 27799 *tcam_mem = efp_tcam; 27800 *policy_mem = efp_policy_table; 27801 break; 27802 case _BCM_FIELD_STAGE_EXACTMATCH: 27803 mode = (f_ent->group->flags & _FP_GROUP_SPAN_DOUBLE_SLICE) ? 27804 _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW; 27805 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 27806 EXACT_MATCH_2m, 27807 instance, 27808 &em_uft_narrow)); 27809 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 27810 EXACT_MATCH_4m, 27811 instance, 27812 &em_uft_wide)); 27813 *tcam_mem = (mode == _IFP_SLICE_MODE_WIDE) ? 27814 em_uft_wide : em_uft_narrow; 27815 *policy_mem = *tcam_mem; 27816 break; 27817 #if defined(BCM_FLOWTRACKER_SUPPORT) 27818 case _BCM_FIELD_STAGE_FLOWTRACKER: 27819 if (soc_feature(unit, soc_feature_field_flowtracker_support)) { 27820 *tcam_mem = BSK_FTFP_TCAMm; 27821 *policy_mem = BSK_FTFP_POLICYm; 27822 } else { 27823 *tcam_mem = INVALIDm; 27824 *policy_mem = INVALIDm; 27825 } 27826 break; 27827 #endif 27828 default: 27829 *tcam_mem = *policy_mem = INVALIDm; 27830 return BCM_E_PARAM; 27831 } 27832 27833 return (BCM_E_NONE); 27834 } 27835 27836 /* 27837 * Function: 27838 * _field_th_default_policer_set 27839 * 27840 * Purpose: 27841 * Get metering portion of Policy Table. 27842 * 27843 * Parameters: 27844 * unit - (IN)BCM device number. 27845 * stage_fc - (IN)Stage control structure. 27846 * level - (IN)Policer level. 27847 * f_ent - (IN)Software entry structure to get tcam info from. 27848 * buf - (IN/OUT)Hardware policy entry 27849 * 27850 * Returns: 27851 * BCM_E_NONE - Success 27852 */ 27853 27854 STATIC int 27855 _field_th_default_policer_set(int unit, _field_stage_t *stage_fc, 27856 int level, _field_entry_t *f_ent, uint32 *buf) 27857 { 27858 _bcm_field_action_offset_t meter_info_offset; /* Meter Set for basic Meter info. */ 27859 soc_format_t fmt = IFP_METER_SETfmt; 27860 soc_field_info_t *fld_info = NULL; 27861 int meter_base = 0; 27862 27863 /* Input parameter check. */ 27864 if ((NULL == stage_fc) || (NULL == buf) || (NULL == f_ent)) { 27865 return (BCM_E_PARAM); 27866 } 27867 27868 sal_memset(&meter_info_offset, 0x0, sizeof(meter_info_offset)); 27869 /* 27870 * For the legacy devices which doesn't support PDD format for IFP, 27871 * base offset for IFP_METER_SET will be non zero and part of IFP_POLICY_TABLE. 27872 */ 27873 if ((_BCM_FIELD_STAGE_INGRESS == f_ent->group->stage_id) 27874 && (0 == soc_feature(unit, soc_feature_ifp_action_profiling))) { 27875 fld_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, METER_SETf); 27876 meter_base = fld_info->bp; 27877 } else { 27878 meter_base = 0; 27879 } 27880 27881 /* 27882 * Get each meter field offset and width in format IFP_METE_SETfmt 27883 * and update respective meter_info_offset. 27884 */ 27885 /* METER_PAIR_MODE */ 27886 fld_info = NULL; 27887 fld_info = soc_format_fieldinfo_get(unit, fmt, METER_PAIR_MODEf); 27888 if (NULL == fld_info) { 27889 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 27890 "IFP policer set failed for field %d\n\r"), 27891 METER_PAIR_MODEf)); 27892 return BCM_E_INTERNAL; 27893 } 27894 meter_info_offset.offset[1] = meter_base + fld_info->bp; 27895 meter_info_offset.width[1] = fld_info->len; 27896 /* DEFAULT meter pair mode is enabled */ 27897 meter_info_offset.value[1] = 0; 27898 27899 fld_info = NULL; 27900 fld_info = soc_format_fieldinfo_get(unit, fmt, METER_PAIR_MODE_MODIFIERf); 27901 if (NULL == fld_info) { 27902 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 27903 "IFP policer set failed for field %d\n\r"), 27904 METER_PAIR_MODE_MODIFIERf)); 27905 return BCM_E_INTERNAL; 27906 } 27907 /* METER_PAIR_MODE_MODIFIER */ 27908 meter_info_offset.offset[2] = meter_base + fld_info->bp; 27909 meter_info_offset.width[2] = fld_info->len; 27910 /* Enable packet color modifier */ 27911 meter_info_offset.value[2] = 1; 27912 27913 ACTION_SET(unit, f_ent, buf, &meter_info_offset); 27914 27915 return (BCM_E_NONE); 27916 } 27917 27918 /* 27919 * Function: 27920 * _field_th_ingress_policer_action_set 27921 * 27922 * Purpose: 27923 * Get metering portion of Policy Table. 27924 * 27925 * Parameters: 27926 * unit - (IN)BCM device number. 27927 * f_ent - (IN)Software entry structure to get tcam info from. 27928 * buf - (IN/OUT)Hardware policy entry 27929 * 27930 * Returns: 27931 * BCM_E_NONE - Success 27932 */ 27933 int 27934 _field_th_ingress_policer_action_set(int unit, _field_entry_t *f_ent, 27935 uint32 *buf) 27936 { 27937 _field_entry_policer_t *f_ent_pl; /* Field entry policer descriptor.*/ 27938 _field_stage_t *stage_fc; /* Stage field control structure. */ 27939 _field_policer_t *f_pl; /* Field policer descriptor. */ 27940 int idx; /* Policers levels iterator. */ 27941 uint32 meter_pair_mode = BCM_FIELD_METER_MODE_DEFAULT; 27942 /* Hw meter usage bits. */ 27943 soc_format_t fmt = IFP_METER_SETfmt; 27944 uint8 meter_type = 0xff; 27945 soc_field_info_t *fld_info = NULL; 27946 int meter_pair_idx; /* Meter pair index. */ 27947 int rv; /* Operation return status. */ 27948 _bcm_field_action_offset_t meter_offset; /* Meter Set for ODD_EVEN */ 27949 _bcm_field_action_offset_t meter_info_offset;/* Meter Set for basic info */ 27950 int instance; /* Current Pipe instance */ 27951 int meter_base = 0; /* Meter base value */ 27952 _field_stage_id_t stage_id; /* Stage id used for metering. */ 27953 27954 /* Input parameter check. */ 27955 if ((NULL == f_ent) || (NULL == buf)) { 27956 return (BCM_E_PARAM); 27957 } 27958 if (NULL == f_ent->group) { 27959 return (BCM_E_PARAM); 27960 } 27961 27962 stage_id = (_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id) ? \ 27963 _BCM_FIELD_STAGE_INGRESS : f_ent->group->stage_id; 27964 27965 /* 27966 * For the legacy devices which doesn't support PDD format for IFP, 27967 * base offset for IFP_METER_SET will be non zero and part of IFP_POLICY_TABLE. 27968 */ 27969 if (0 == soc_feature(unit, soc_feature_ifp_action_profiling)) { 27970 fld_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, METER_SETf); 27971 meter_base = fld_info->bp; 27972 } 27973 27974 /* Get stage control structure. */ 27975 rv = _field_stage_control_get(unit, stage_id, &stage_fc); 27976 BCM_IF_ERROR_RETURN(rv); 27977 27978 /* Get the current pipe instance from group */ 27979 instance = f_ent->group->instance; 27980 27981 for (idx = 0; idx < _FP_POLICER_LEVEL_COUNT; idx++) { 27982 f_ent_pl = f_ent->policer + idx; 27983 27984 if ((idx > 0)) { 27985 /* Trident device does not support Level1 policers */ 27986 break; 27987 } 27988 27989 if (0 == (f_ent_pl->flags & _FP_POLICER_INSTALLED)) { 27990 /* Install preserve the color policer. */ 27991 rv = _field_th_default_policer_set(unit, stage_fc, idx, 27992 f_ent, buf); 27993 BCM_IF_ERROR_RETURN(rv); 27994 continue; 27995 } 27996 27997 /* Get policer config. */ 27998 rv = _bcm_field_policer_get(unit, f_ent_pl->pid, &f_pl); 27999 BCM_IF_ERROR_RETURN(rv); 28000 28001 if (0 == f_pl->level) { 28002 /* Get hw encoding for meter mode. */ 28003 rv = _bcm_field_meter_pair_mode_get(unit, f_pl, &meter_pair_mode); 28004 BCM_IF_ERROR_RETURN(rv); 28005 /* If level 0 policer is Modified trTcm -> 28006 * meter sharing mode is dual. 28007 */ 28008 } 28009 28010 28011 /* Pair index is (Pool number * Pairs in Pool + Pair number) */ 28012 meter_pair_idx 28013 = (f_pl->pool_index 28014 * (stage_fc->meter_pool[instance][f_pl->pool_index]->num_meter_pairs)) 28015 + (f_pl->hw_index); 28016 28017 sal_memset(&meter_info_offset, 0x0, sizeof(meter_info_offset)); 28018 sal_memset(&meter_offset, 0x0, sizeof(meter_offset)); 28019 28020 /* 28021 * Get each meter field offset and width in format IFP_METE_SETfmt 28022 * and update respective meter_info_offset. 28023 */ 28024 fld_info = NULL; 28025 fld_info = soc_format_fieldinfo_get(unit, fmt, METER_PAIR_INDEXf); 28026 if (NULL == fld_info) { 28027 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 28028 "IFP policer set failed for field %d\n\r"), 28029 METER_PAIR_INDEXf)); 28030 return BCM_E_INTERNAL; 28031 } 28032 /* METER_PAIR_INDEX */ 28033 meter_info_offset.offset[0] = meter_base + fld_info->bp; 28034 meter_info_offset.width[0] = fld_info->len; 28035 /* Program meter pair index */ 28036 meter_info_offset.value[0] = meter_pair_idx; 28037 28038 fld_info = NULL; 28039 fld_info = soc_format_fieldinfo_get(unit, fmt, METER_PAIR_MODEf); 28040 if (NULL == fld_info) { 28041 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 28042 "IFP policer set failed for field %d\n\r"), 28043 METER_PAIR_MODEf)); 28044 return BCM_E_INTERNAL; 28045 } 28046 /* METER_PAIR_MODE */ 28047 meter_info_offset.offset[1] = meter_base + fld_info->bp; 28048 meter_info_offset.width[1] = fld_info->len; 28049 /* H/W encoding of meter pair mode based on policer level */ 28050 meter_info_offset.value[1] = meter_pair_mode; 28051 28052 /* 28053 * Flow mode is the only one that cares about the test and 28054 * update bits. 28055 */ 28056 if (_FP_POLICER_EXCESS_HW_METER(f_pl)) { 28057 /* Excess meter - even index. */ 28058 meter_type = _FIELD_METER_TYPE_EVEN; 28059 } else if (_FP_POLICER_COMMITTED_HW_METER(f_pl)) { 28060 /* Committed meter - odd index. */ 28061 meter_type = _FIELD_METER_TYPE_ODD; 28062 } else { 28063 meter_type = 0xff; 28064 } 28065 28066 if (0xff != meter_type) { 28067 fld_info = NULL; 28068 fld_info = soc_format_fieldinfo_get(unit, fmt, METER_TEST_ODDf); 28069 if (NULL == fld_info) { 28070 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 28071 "IFP policer set failed for field %d\n\r"), 28072 METER_TEST_ODDf)); 28073 return BCM_E_INTERNAL; 28074 } 28075 /* METER_TEST_ODD */ 28076 meter_offset.offset[0] = meter_base + fld_info->bp; 28077 meter_offset.width[0] = fld_info->len; 28078 /* Enable only for Odd idx or Committed meter otherwise disable it */ 28079 meter_offset.value[0] = (_FIELD_METER_TYPE_ODD == meter_type); 28080 28081 fld_info = NULL; 28082 fld_info = soc_format_fieldinfo_get(unit, fmt, METER_TEST_EVENf); 28083 if (NULL == fld_info) { 28084 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 28085 "IFP policer set failed for field %d\n\r"), 28086 METER_TEST_EVENf)); 28087 return BCM_E_INTERNAL; 28088 } 28089 /* METER_TEST_EVEN */ 28090 meter_offset.offset[1] = meter_base + fld_info->bp; 28091 meter_offset.width[1] = fld_info->len; 28092 /* Enable only for Even idx or Excess meter otherwise disable it */ 28093 meter_offset.value[1] = (_FIELD_METER_TYPE_EVEN == meter_type); 28094 28095 fld_info = NULL; 28096 fld_info = soc_format_fieldinfo_get(unit, fmt, METER_UPDATE_ODDf); 28097 if (NULL == fld_info) { 28098 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 28099 "IFP policer set failed for field %d\n\r"), 28100 METER_UPDATE_ODDf)); 28101 return BCM_E_INTERNAL; 28102 } 28103 /* METER_UPDATE_ODD */ 28104 meter_offset.offset[2] = meter_base + fld_info->bp; 28105 meter_offset.width[2] = fld_info->len; 28106 /* Enable only for Odd idx or Committed meter otherwise disable it */ 28107 meter_offset.value[2] = (_FIELD_METER_TYPE_ODD == meter_type); 28108 28109 fld_info = NULL; 28110 fld_info = soc_format_fieldinfo_get(unit, fmt, METER_UPDATE_EVENf); 28111 if (NULL == fld_info) { 28112 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 28113 "IFP policer set failed for field %d\n\r"), 28114 METER_UPDATE_EVENf)); 28115 return BCM_E_INTERNAL; 28116 } 28117 /* METER_UPDATE_EVEN */ 28118 meter_offset.offset[3] = meter_base + fld_info->bp; 28119 meter_offset.width[3] = fld_info->len; 28120 /* Enable only for Even idx or Excess meter otherwise disable it */ 28121 meter_offset.value[3] = (_FIELD_METER_TYPE_EVEN == meter_type); 28122 } 28123 28124 if ((f_pl->cfg.mode == bcmPolicerModePassThrough) || 28125 (f_pl->cfg.mode == bcmPolicerModeSrTcmModified)) { 28126 28127 fld_info = NULL; 28128 fld_info = soc_format_fieldinfo_get(unit, fmt, METER_PAIR_MODE_MODIFIERf); 28129 if (NULL == fld_info) { 28130 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 28131 "IFP policer set failed for field %d\n\r"), 28132 METER_PAIR_MODE_MODIFIERf)); 28133 return BCM_E_INTERNAL; 28134 } 28135 /* METER_PAIR_MODE_MODIFIER */ 28136 meter_info_offset.offset[2] = meter_base + fld_info->bp; 28137 meter_info_offset.width[2] = fld_info->len; 28138 /* Enable packet color modifier */ 28139 meter_info_offset.value[2] = 1; 28140 } 28141 28142 ACTION_SET(unit, f_ent, buf, &meter_offset); 28143 ACTION_SET(unit, f_ent, buf, &meter_info_offset); 28144 } 28145 28146 return BCM_E_NONE; 28147 } 28148 28149 /* 28150 * Function: 28151 * _field_th_ingress_entry_policy_mem_install 28152 * Purpose: 28153 * Install the entry actions into the policy table. 28154 * Parameters: 28155 * unit - (IN) BCM device number 28156 * f_ent - (IN) entry structure to get policy info from 28157 * policy_mem - (IN) Policy table memory 28158 * tcam_idx - (IN) Common index of various tables 28159 * Returns: 28160 * BCM_E_XXX 28161 */ 28162 STATIC int 28163 _field_th_ingress_entry_policy_mem_install(int unit, _field_entry_t *f_ent, 28164 soc_mem_t policy_mem, int tcam_idx) 28165 { 28166 uint32 e_buf[SOC_MAX_MEM_FIELD_WORDS] = {0}; 28167 /* Buffer to fill Policy entry. */ 28168 _field_action_t *fa = NULL; /* Reference to field action structure */ 28169 int rv; /* Operation return status. */ 28170 int policy_idx; /* Policy index in the Policy table. */ 28171 uint8 entry_part; /* Entry part number in wider group */ 28172 soc_field_info_t * f_info; 28173 28174 /* Input parameters check. */ 28175 if (NULL == f_ent) { 28176 return (BCM_E_PARAM); 28177 } 28178 28179 28180 /* 28181 * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes, 28182 * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries. 28183 * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and 28184 * entries are 1:1 mapped. 28185 */ 28186 if ((SOC_IS_TOMAHAWKX(unit) && !(SOC_IS_TOMAHAWK3(unit)) && 28187 (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) || 28188 (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) { 28189 policy_idx = tcam_idx + (f_ent->fs->slice_number * 256); 28190 } else { 28191 policy_idx = tcam_idx; 28192 } 28193 28194 /* Get the entry part number from entry flags */ 28195 _bcm_field_th_entry_flags_to_tcam_part(unit, f_ent->flags, 28196 f_ent->group->flags, &entry_part); 28197 28198 if (entry_part != 0) { 28199 /* policy install is needed only for Entry part 0 28200 of wider groups */ 28201 return BCM_E_NONE; 28202 } 28203 /* Extract the policy info from the entry structure. */ 28204 for (fa = f_ent->actions; fa != NULL; fa = fa->next) { 28205 /* Skip the invalid entries */ 28206 if (_FP_ACTION_VALID & fa->flags) { 28207 rv = _bcm_field_th_action_set(unit, policy_mem, f_ent, 28208 policy_idx, fa, e_buf); 28209 if (BCM_FAILURE(rv)) { 28210 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("TH Action set failed.\n"))); 28211 return rv; 28212 } 28213 } 28214 } 28215 28216 /* 28217 * Handle color dependence/independence 28218 * (1 bit field in GREEN_TO_PID_SET) 28219 */ 28220 { 28221 _bcm_field_action_offset_t a_offset; 28222 sal_memset(&a_offset, 0x0, sizeof(a_offset)); 28223 f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, GREEN_TO_PID_SETf); 28224 a_offset.offset[0] = f_info->bp; 28225 a_offset.width[0] = 1; 28226 a_offset.value[0] = ((f_ent->flags & _FP_ENTRY_COLOR_INDEPENDENT) 28227 ? 1 : 0); 28228 ACTION_SET(unit, f_ent, e_buf, &a_offset); 28229 } 28230 28231 /* Extract meter related policy fields */ 28232 BCM_IF_ERROR_RETURN 28233 (_field_th_ingress_policer_action_set(unit, f_ent, e_buf)); 28234 28235 if ( (f_ent->group->stage_id == _BCM_FIELD_STAGE_INGRESS) && 28236 (!(f_ent->statistic.flags & _FP_ENTRY_STAT_DIRTY)) && 28237 (f_ent->statistic.flags & _FP_ENTRY_STAT_VALID) ) { 28238 uint32 val; 28239 uint32 count; 28240 uint32 counter_set; 28241 uint32 data[SOC_MAX_MEM_FIELD_WORDS] = {0}; 28242 /* retain counter values. */ 28243 28244 /* Read policy entry from current tcam index. */ 28245 rv = soc_th_ifp_mem_read(unit, policy_mem, MEM_BLOCK_ANY, 28246 policy_idx, data); 28247 BCM_IF_ERROR_RETURN(rv); 28248 28249 val = soc_mem_field32_get(unit, policy_mem, data, FLEX_CTR_POOL_NUMBERf); 28250 soc_mem_field32_set(unit, policy_mem, e_buf, FLEX_CTR_POOL_NUMBERf, val); 28251 val = soc_mem_field32_get(unit, policy_mem, data, FLEX_CTR_OFFSET_MODEf); 28252 soc_mem_field32_set(unit, policy_mem, e_buf, FLEX_CTR_OFFSET_MODEf, val); 28253 val = soc_mem_field32_get(unit, policy_mem, data, FLEX_CTR_BASE_COUNTER_IDXf); 28254 soc_mem_field32_set(unit, policy_mem, e_buf, FLEX_CTR_BASE_COUNTER_IDXf, val); 28255 28256 count = soc_mem_field32_get(unit, policy_mem, data, Y_COUNTf); 28257 soc_mem_field32_set(unit, policy_mem, e_buf, Y_COUNTf, count); 28258 count = soc_mem_field32_get(unit, policy_mem, data, G_COUNTf); 28259 soc_mem_field32_set(unit, policy_mem, e_buf, G_COUNTf, count); 28260 count = soc_mem_field32_get(unit, policy_mem, data, R_COUNTf); 28261 soc_mem_field32_set(unit, policy_mem, e_buf, R_COUNTf, count); 28262 28263 counter_set = soc_mem_field32_get(unit, policy_mem, data, COUNTER_SETf); 28264 soc_mem_field32_set(unit, policy_mem, e_buf, COUNTER_SETf, counter_set); 28265 } else { 28266 /* Extract counter related policy fields */ 28267 BCM_IF_ERROR_RETURN 28268 (_bcm_field_th_flex_stat_action_set(unit, f_ent, policy_mem, 28269 policy_idx, e_buf)); 28270 } 28271 28272 28273 /* Write the POLICY Table */ 28274 rv = soc_th_ifp_mem_write(unit, policy_mem, MEM_BLOCK_ALL, policy_idx, e_buf); 28275 return (rv); 28276 } 28277 28278 /* 28279 * Function: 28280 * _field_th_vfp_efp_entry_policy_mem_install 28281 * Purpose: 28282 * Install the entry actions into the policy table. 28283 * Parameters: 28284 * unit - (IN) BCM device number 28285 * f_ent - (IN) entry structure to get policy info from 28286 * policy_mem - (IN) Policy table memory 28287 * policy_idx - (IN) Index to the Policy Memory Table. 28288 * Returns: 28289 * BCM_E_XXX 28290 */ 28291 STATIC int 28292 _field_th_vfp_efp_entry_policy_mem_install(int unit, _field_entry_t *f_ent, 28293 soc_mem_t policy_mem, int policy_idx) 28294 { 28295 uint32 e_buf[SOC_MAX_MEM_FIELD_WORDS] = {0}; 28296 /* Buffer to fill Policy entry. */ 28297 28298 int rv; /* Operation return status. */ 28299 28300 _field_action_t *fa = NULL; /* Reference to field action structure */ 28301 28302 /* Input parameters check. */ 28303 if (NULL == f_ent) { 28304 return (BCM_E_PARAM); 28305 } 28306 28307 /* Extract the policy info from the entry structure. */ 28308 for (fa = f_ent->actions; fa != NULL; fa = fa->next) { 28309 /* Skip the invalid entries */ 28310 if (_FP_ACTION_VALID & fa->flags) { 28311 rv = _bcm_field_trx_action_get(unit, policy_mem, f_ent, 28312 policy_idx, fa, e_buf); 28313 if (BCM_FAILURE(rv)) { 28314 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("TH Action set failed.\n"))); 28315 return rv; 28316 } 28317 } 28318 } 28319 28320 /* Extract meter related policy fields */ 28321 if (((soc_feature(unit, soc_feature_field_egress_metering)) 28322 && (f_ent->group->stage_id == _BCM_FIELD_STAGE_EGRESS)) 28323 || (f_ent->group->stage_id != _BCM_FIELD_STAGE_EGRESS)) { 28324 BCM_IF_ERROR_RETURN 28325 (_bcm_field_trx_policer_action_set(unit, f_ent, policy_mem, e_buf)); 28326 } 28327 28328 /* Extract counter related policy fields */ 28329 if (f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP) { 28330 BCM_IF_ERROR_RETURN(_bcm_field_th_flex_stat_action_set(unit, f_ent, 28331 policy_mem, policy_idx, e_buf)); 28332 } else { 28333 BCM_IF_ERROR_RETURN(_bcm_field_trx_stat_action_set(unit, f_ent, 28334 policy_mem, policy_idx, e_buf)); 28335 #ifdef BCM_TRIDENT2PLUS_SUPPORT 28336 if (soc_feature(unit, soc_feature_td3_style_fp)) { 28337 rv = _bcm_field_td2plus_extended_stat_action_set(unit, f_ent, 28338 policy_mem, policy_idx, e_buf); 28339 BCM_IF_ERROR_RETURN(rv); 28340 } 28341 #endif /* BCM_TRIDENT2PLUS_SUPPORT */ 28342 28343 } 28344 28345 /* Write the POLICY Table */ 28346 rv = soc_th_ifp_mem_write(unit, policy_mem, MEM_BLOCK_ALL, policy_idx, e_buf); 28347 return (rv); 28348 } 28349 28350 28351 /* 28352 * Function: 28353 * _field_th_entry_policy_mem_install 28354 * Purpose: 28355 * Install the entry actions into the policy table. 28356 * Parameters: 28357 * unit - (IN) BCM device number 28358 * f_ent - (IN) entry structure to get policy info from 28359 * policy_mem - (IN) Policy table memory 28360 * tcam_idx - (IN) Common index of various tables 28361 * Returns: 28362 * BCM_E_XXX 28363 */ 28364 STATIC int 28365 _field_th_entry_policy_mem_install(int unit, _field_entry_t *f_ent, 28366 soc_mem_t policy_mem, int tcam_idx) 28367 { 28368 /* Input parameters check. */ 28369 if (NULL == f_ent) { 28370 return (BCM_E_PARAM); 28371 } 28372 28373 switch (f_ent->group->stage_id) { 28374 case _BCM_FIELD_STAGE_INGRESS: 28375 #if defined(BCM_TRIDENT3_SUPPORT) 28376 if(soc_feature(unit, soc_feature_ifp_action_profiling)) { 28377 return _field_td3_ingress_entry_policy_mem_install(unit, 28378 f_ent, policy_mem, tcam_idx); 28379 } else 28380 #endif 28381 { 28382 return _field_th_ingress_entry_policy_mem_install(unit, 28383 f_ent, policy_mem, tcam_idx); 28384 } 28385 case _BCM_FIELD_STAGE_EGRESS: 28386 case _BCM_FIELD_STAGE_LOOKUP: 28387 return _field_th_vfp_efp_entry_policy_mem_install(unit, f_ent, 28388 policy_mem, tcam_idx); 28389 #if defined(BCM_FLOWTRACKER_SUPPORT) 28390 case _BCM_FIELD_STAGE_FLOWTRACKER: 28391 if (soc_feature(unit, soc_feature_field_flowtracker_support)) { 28392 return _field_hx5_ft_entry_policy_mem_install(unit, 28393 f_ent, policy_mem, tcam_idx); 28394 } 28395 #endif 28396 default: 28397 break; 28398 } 28399 28400 return (BCM_E_INTERNAL); 28401 } 28402 28403 /* 28404 * Function: 28405 * _field_th_entry_qual_tcam_install 28406 * Purpose: 28407 * Install the entry qualifiers in the TCAM. 28408 * Parameters: 28409 * unit - (IN) BCM device number 28410 * f_ent - (IN) entry structure to get policy info from 28411 * tcam_mem - (IN) TCAM memory index. 28412 * tcam_idx - (IN) Index in the TCAM memory. 28413 * Returns: 28414 * BCM_E_XXX 28415 */ 28416 28417 STATIC int 28418 _field_th_entry_qual_tcam_install(int unit, _field_entry_t *f_ent, 28419 soc_mem_t tcam_mem, int tcam_idx) 28420 { 28421 /* Input parameters check. */ 28422 if (NULL == f_ent) { 28423 return (BCM_E_PARAM); 28424 } 28425 28426 switch (f_ent->group->stage_id) { 28427 case _BCM_FIELD_STAGE_INGRESS: 28428 return _field_th_ingress_entry_qual_tcam_install(unit, f_ent, 28429 tcam_mem, tcam_idx); 28430 case _BCM_FIELD_STAGE_EGRESS: 28431 case _BCM_FIELD_STAGE_LOOKUP: 28432 return _field_th_vfp_efp_entry_qual_tcam_install(unit, f_ent, 28433 tcam_mem, tcam_idx); 28434 default: 28435 break; 28436 } 28437 28438 return (BCM_E_INTERNAL); 28439 } 28440 28441 /* 28442 * Function: 28443 * _bcm_field_th_entry_install 28444 * Purpose: 28445 * Write entry into the device hardware TCAM memory. 28446 * Parameters: 28447 * unit - (IN) BCM Device Number 28448 * f_ent - (IN) Physical entry structure to be installed 28449 * tcam_idx - (IN) common index of various tables 28450 * Returns: 28451 * BCM_E_XXX On TCAM read/write errors 28452 * BCM_E_NONE 28453 * Note: 28454 * Unit lock should be held by calling function. 28455 */ 28456 int 28457 _bcm_field_th_entry_install(int unit, _field_entry_t *f_ent, 28458 int tcam_idx) 28459 { 28460 int rv = BCM_E_INTERNAL; /* Return Value */ 28461 soc_mem_t tcam_mem; /* TCAM memory id. */ 28462 soc_mem_t policy_mem; /* Policy table memory id. */ 28463 uint8 enabled = 0; 28464 28465 /* Input parameters check. */ 28466 if (NULL == f_ent) { 28467 return (BCM_E_PARAM); 28468 } 28469 28470 if (NULL == f_ent->fs || NULL == f_ent->group) { 28471 return BCM_E_INTERNAL; 28472 } 28473 28474 #if defined(BCM_FLOWTRACKER_SUPPORT) 28475 if (f_ent->group->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) { 28476 return _field_hx5_ft_entry_tcam_policy_install(unit, f_ent, tcam_idx); 28477 } 28478 #endif 28479 28480 rv = _bcm_field_th_tcam_policy_mem_get(unit, f_ent, 28481 &tcam_mem, &policy_mem); 28482 BCM_IF_ERROR_RETURN(rv); 28483 28484 if ((tcam_idx < soc_mem_index_min(unit, tcam_mem)) || 28485 (tcam_idx > soc_mem_index_max(unit, tcam_mem))) { 28486 return (BCM_E_PARAM); 28487 } 28488 28489 if ((f_ent->fs->slice_flags & _BCM_FIELD_SLICE_HW_ENABLE) == 0) { 28490 if (BCM_FAILURE(_bcm_field_th_slice_enable_set(unit, 28491 f_ent->group, f_ent->fs, 1))) { 28492 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 28493 "Failed to Enable Field Slice[%d] for Entry[%d].\n\r"), 28494 f_ent->fs->slice_number, f_ent->eid)); 28495 } 28496 f_ent->fs->slice_flags |= _BCM_FIELD_SLICE_HW_ENABLE; 28497 enabled = 1; 28498 } 28499 28500 28501 /* Write actions into Policy Table */ 28502 rv = _field_th_entry_policy_mem_install(unit, f_ent, policy_mem, tcam_idx); 28503 if (BCM_FAILURE(rv)) { 28504 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 28505 "Failed to Install Policy Table for Entry[%d]" 28506 " tcam_idx:[%d].\n\r"), 28507 f_ent->eid, tcam_idx)); 28508 goto cleanup; 28509 } 28510 28511 /* Write qualifiers into TCAM */ 28512 rv = _field_th_entry_qual_tcam_install(unit, f_ent, tcam_mem, tcam_idx); 28513 28514 /* Enable the Slice if it is the first Entry */ 28515 if (BCM_SUCCESS(rv)) { 28516 /* 28517 * Check for Entry installed or not. 28518 * Hw_ent_count shoudb be incremented only once per an entry. 28519 */ 28520 if (0 == (f_ent->flags & _FP_ENTRY_INSTALLED)) { 28521 /* Increment the HW Slice entry count */ 28522 f_ent->fs->hw_ent_count++; 28523 } 28524 } else { 28525 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 28526 "Failed to Install the TCAM Entry[%d] tcam_idx:[%d].\n\r"), 28527 f_ent->eid, tcam_idx)); 28528 goto cleanup; 28529 } 28530 28531 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 28532 "==> %s(): Entry[%d] Installed - mem:%d tcam_idx:%d slice:%d\n\r"), 28533 __func__, f_ent->eid, tcam_mem, tcam_idx, f_ent->fs->slice_number)); 28534 28535 return rv; 28536 28537 cleanup: 28538 if ((enabled == 1) && (f_ent->fs->slice_flags & _BCM_FIELD_SLICE_HW_ENABLE)) { 28539 if (BCM_FAILURE(_bcm_field_th_slice_enable_set(unit, f_ent->group, 28540 f_ent->fs, 0))) { 28541 LOG_WARN(BSL_LS_BCM_FP, (BSL_META("Failed to Disable Field" 28542 " Slice[%d] for Entry[%d].\n\r"), 28543 f_ent->fs->slice_number, f_ent->eid)); 28544 } 28545 f_ent->fs->slice_flags &= ~_BCM_FIELD_SLICE_HW_ENABLE; 28546 } 28547 return rv; 28548 28549 } 28550 28551 /* 28552 * Function: 28553 * _bcm_field_th_entry_reinstall 28554 * Purpose: 28555 * Write entry into the chip's memory. 28556 * Parameters: 28557 * unit - BCM Unit 28558 * f_ent - Physical entry structure to be installed 28559 * tcam_idx - common index of various tables 28560 * Returns: 28561 * BCM_E_XXX On TCAM read/write errors 28562 * BCM_E_NONE 28563 * Note: 28564 * Unit lock should be held by calling function. 28565 */ 28566 int 28567 _bcm_field_th_entry_reinstall(int unit, _field_entry_t *f_ent, int tcam_idx) 28568 { 28569 int rv = BCM_E_INTERNAL; /* Return Value */ 28570 soc_mem_t tcam_mem; /* TCAM memory id. */ 28571 soc_mem_t policy_mem; /* Policy table memory id . */ 28572 28573 /* Input parameters check. */ 28574 if (NULL == f_ent) { 28575 return (BCM_E_PARAM); 28576 } 28577 28578 if (NULL == f_ent->fs) { 28579 return (BCM_E_PARAM); 28580 } 28581 28582 rv = _bcm_field_th_tcam_policy_mem_get(unit, f_ent, 28583 &tcam_mem, &policy_mem); 28584 BCM_IF_ERROR_RETURN(rv); 28585 28586 if ((tcam_idx < soc_mem_index_min(unit, tcam_mem)) || 28587 (tcam_idx > soc_mem_index_max(unit, tcam_mem))) { 28588 return (BCM_E_PARAM); 28589 } 28590 28591 /* Write actions into Policy Table */ 28592 rv = _field_th_entry_policy_mem_install(unit, f_ent, policy_mem, tcam_idx); 28593 return rv; 28594 } 28595 28596 /* 28597 * Function: 28598 * _field_th_qual_tcam_key_mask_get 28599 * Purpose: 28600 * Allocate & read from hw tcam key/mask image. 28601 * Parameters: 28602 * unit - (IN) BCM device number. 28603 * f_ent - (IN/OUT) Field entry. 28604 * tcam - (IN) Reference to Entry TCAM structure. 28605 * Returns: 28606 * BCM_E_XXX 28607 */ 28608 STATIC int 28609 _field_th_qual_tcam_key_mask_get(int unit, 28610 _field_entry_t *f_ent, 28611 _field_tcam_t *tcam) 28612 { 28613 int rv = BCM_E_INTERNAL; /* Return Value */ 28614 uint32 tcam_key_words; /* tcam key length */ 28615 soc_field_t mask_field; /* Mask field */ 28616 soc_mem_t tcam_mem; /* TCAM Memory name */ 28617 soc_mem_t policy_mem; /* Policy Memory name */ 28618 28619 28620 /* Validate input parameters */ 28621 if (NULL == f_ent || NULL == tcam) { 28622 return BCM_E_PARAM; 28623 } 28624 28625 /* Validate the group */ 28626 if (NULL == f_ent->fs || NULL == f_ent->group) { 28627 return BCM_E_INTERNAL; 28628 } 28629 28630 mask_field = (f_ent->group->stage_id == _BCM_FIELD_STAGE_EGRESS) ? 28631 KEY_MASKf : MASKf; 28632 28633 BCM_IF_ERROR_RETURN 28634 (_bcm_field_th_tcam_policy_mem_get(unit, f_ent, 28635 &tcam_mem, &policy_mem)); 28636 /* 28637 * Always use Per-pipe view for IFP_TCAM_WIDE memory 28638 * in-case of Global mode. 28639 */ 28640 if (tcam_mem == IFP_TCAM_WIDEm) { 28641 tcam_mem = IFP_TCAM_WIDE_PIPE0m; 28642 } else if (tcam_mem == IFP_TCAMm) { 28643 tcam_mem = IFP_TCAM_PIPE0m; 28644 } 28645 28646 if (f_ent->group->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 28647 if (f_ent->group->em_mode == _FieldExactMatchMode128) { 28648 tcam_key_words = BITS2WORDS(soc_mem_field_length(unit, 28649 tcam_mem, 28650 MODE128__KEY_0_ONLYf) 28651 + soc_mem_field_length(unit, 28652 tcam_mem, 28653 MODE128__KEY_1_ONLYf)); 28654 } else if (f_ent->group->em_mode == _FieldExactMatchMode160) { 28655 tcam_key_words = BITS2WORDS(soc_mem_field_length(unit, 28656 tcam_mem, 28657 MODE160__KEY_0_ONLYf) 28658 + soc_mem_field_length(unit, 28659 tcam_mem, 28660 MODE160__KEY_1_ONLYf)); 28661 } else if (f_ent->group->em_mode == _FieldExactMatchMode320) { 28662 tcam_key_words = BITS2WORDS(soc_mem_field_length(unit, 28663 EXACT_MATCH_2m, 28664 MODE160__KEY_0_ONLYf) 28665 + soc_mem_field_length(unit, 28666 EXACT_MATCH_2m, 28667 MODE160__KEY_1_ONLYf)); 28668 } else { 28669 /* Invalid Exact Match Mode. */ 28670 return (BCM_E_INTERNAL); 28671 } 28672 } else { 28673 tcam_key_words = BITS2WORDS(soc_mem_field_length(unit, 28674 tcam_mem, 28675 KEYf)); 28676 } 28677 28678 /* Retrieve the key size */ 28679 tcam->key_size = WORDS2BYTES(tcam_key_words); 28680 28681 /* Allocate Memory for TCAM Key and Mask */ 28682 _FP_XGS3_ALLOC(tcam->key, tcam->key_size, "TH TCAM Key Alloc."); 28683 _FP_XGS3_ALLOC(tcam->mask, tcam->key_size, "TH TCAM Mask Alloc."); 28684 if (tcam->key == NULL || tcam->mask == NULL) { 28685 rv = BCM_E_MEMORY; 28686 goto error; 28687 } 28688 28689 /* Only applicable for ingress stage. */ 28690 if (f_ent->group->stage_id != _BCM_FIELD_STAGE_EXACTMATCH) { 28691 if (f_ent->flags & _FP_ENTRY_INSTALLED) { 28692 int tcam_idx; 28693 uint32 tcam_entry[SOC_MAX_MEM_FIELD_WORDS] = {0}; 28694 28695 rv = _bcm_field_entry_tcam_idx_get(unit, f_ent, &tcam_idx); 28696 if (BCM_FAILURE(rv)) { 28697 goto error; 28698 } 28699 if(f_ent->group->stage_id == _BCM_FIELD_STAGE_EGRESS) { 28700 rv = soc_mem_read(unit, 28701 tcam_mem, 28702 MEM_BLOCK_ANY, 28703 tcam_idx, 28704 tcam_entry); 28705 } else { 28706 rv = soc_th_ifp_mem_read(unit, 28707 tcam_mem, 28708 MEM_BLOCK_ANY, 28709 tcam_idx, 28710 tcam_entry); 28711 } 28712 if (BCM_FAILURE(rv)) { 28713 goto error; 28714 } 28715 soc_mem_field_get(unit, tcam_mem, tcam_entry, 28716 KEYf, tcam->key); 28717 soc_mem_field_get(unit, tcam_mem, tcam_entry, 28718 mask_field, tcam->mask); 28719 } 28720 } 28721 28722 return (BCM_E_NONE); 28723 28724 error: 28725 if (tcam->key) { 28726 sal_free(tcam->key); 28727 tcam->key = NULL; 28728 } 28729 if (tcam->mask) { 28730 sal_free(tcam->mask); 28731 tcam->mask = NULL; 28732 } 28733 28734 return rv; 28735 } 28736 28737 /* 28738 * Function: 28739 * _bcm_field_qual_tcam_key_mask_get 28740 * Purpose: 28741 * Allocate & read from hw tcam key/mask image. 28742 * Parameters: 28743 * unit - (IN) BCM device number. 28744 * f_ent - (IN/OUT) Field entry. 28745 * tcam - (IN) Reference to Entry TCAM structure. 28746 * Returns: 28747 * BCM_E_XXX 28748 */ 28749 int 28750 _bcm_field_th_qual_tcam_key_mask_get(int unit, 28751 _field_entry_t *f_ent, 28752 _field_tcam_t *tcam) 28753 { 28754 int rv = BCM_E_NONE; /* Return value */ 28755 28756 /* Validate input parameters */ 28757 if (NULL == f_ent || NULL == tcam) { 28758 return BCM_E_PARAM; 28759 } 28760 28761 switch (f_ent->group->stage_id) { 28762 case _BCM_FIELD_STAGE_INGRESS: 28763 case _BCM_FIELD_STAGE_LOOKUP: 28764 case _BCM_FIELD_STAGE_EGRESS: 28765 case _BCM_FIELD_STAGE_EXACTMATCH: 28766 case _BCM_FIELD_STAGE_FLOWTRACKER: 28767 rv = _field_th_qual_tcam_key_mask_get(unit, f_ent, tcam); 28768 break; 28769 default: 28770 rv = BCM_E_INTERNAL; 28771 break; 28772 } 28773 28774 return rv; 28775 } 28776 28777 /* 28778 * Function: 28779 * _field_th_ingress_tcam_policy_clear 28780 * 28781 * Purpose: 28782 * Writes a null entry into the TCAM plus Policy table. 28783 * 28784 * Parameters: 28785 * unit - (IN) BCM device number. 28786 * f_ent - (IN) Field entry. 28787 * tcam_idx - (IN) Entry tcam index. 28788 * 28789 * Returns: 28790 * BCM_E_XXX 28791 * 28792 * Note: 28793 * Unit lock should be held by calling function. 28794 */ 28795 STATIC int 28796 _field_th_ingress_tcam_policy_clear(int unit, _field_entry_t *f_ent, 28797 int tcam_idx) 28798 { 28799 soc_mem_t tcam_mem; /* TCAM memory id. */ 28800 soc_mem_t policy_mem; /* Policy table memory id . */ 28801 28802 _field_stage_t *stage_fc; /* Stage field control structure. */ 28803 int num_tcams = 0; /* Number of TCAMs */ 28804 int ct; 28805 int policy_idx; /* Policy index in the Policy table. */ 28806 soc_mem_t tcam_mem_global; /* Global TCAM Id */ 28807 uint8 per_pipe_mode = FALSE; 28808 28809 /* Validate input parameters */ 28810 if (NULL == f_ent) { 28811 return BCM_E_PARAM; 28812 } 28813 28814 BCM_IF_ERROR_RETURN 28815 (_bcm_field_th_tcam_policy_mem_get(unit, f_ent, &tcam_mem, &policy_mem)); 28816 tcam_mem_global = tcam_mem; 28817 28818 /* Get field stage control . */ 28819 BCM_IF_ERROR_RETURN 28820 (_field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc)); 28821 28822 /* 28823 * When the TCAM Mode is Wide on a global view, 28824 * Clear entries from the Pipes. 28825 */ 28826 if (((tcam_mem == IFP_TCAM_WIDEm) || 28827 ((soc_feature(unit, soc_feature_th3_style_fp)) && 28828 (tcam_mem == IFP_TCAMm))) && 28829 (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) && 28830 (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) { 28831 num_tcams = stage_fc->num_pipes; 28832 per_pipe_mode = TRUE; 28833 } else { 28834 num_tcams = 1; /* tcam name is fetched in tcam_mem */ 28835 } 28836 28837 for (ct = 0; ct < num_tcams; ct++) { 28838 if (per_pipe_mode == TRUE) { 28839 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 28840 tcam_mem_global, 28841 ct, 28842 &tcam_mem)); 28843 } 28844 28845 /* Memory index sanity check. */ 28846 if (tcam_idx > soc_mem_index_max(unit, tcam_mem)) { 28847 return (BCM_E_PARAM); 28848 } 28849 28850 /* Write the TCAM & Policy Tables */ 28851 SOC_IF_ERROR_RETURN 28852 (soc_th_ifp_mem_write(unit, tcam_mem, MEM_BLOCK_ALL, tcam_idx, 28853 soc_mem_entry_null(unit, tcam_mem))); 28854 } 28855 28856 /* 28857 * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes, 28858 * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries. 28859 * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and 28860 * entries are 1:1 mapped. 28861 */ 28862 if ((SOC_IS_TOMAHAWKX(unit) && !(SOC_IS_TOMAHAWK3(unit)) && 28863 (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) || 28864 (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) { 28865 policy_idx = tcam_idx + (f_ent->fs->slice_number * 256); 28866 } else { 28867 policy_idx = tcam_idx; 28868 } 28869 28870 SOC_IF_ERROR_RETURN 28871 (soc_th_ifp_mem_write(unit, policy_mem, MEM_BLOCK_ALL, policy_idx, 28872 soc_mem_entry_null(unit, policy_mem))); 28873 28874 return (BCM_E_NONE); 28875 } 28876 28877 /* 28878 * Function: 28879 * _bcm_field_th_entry_move 28880 * Purpose: 28881 * Copy an entry from one TCAM index to another. It copies the values in 28882 * hardware from the old index to the new index. 28883 * IT IS ASSUMED THAT THE NEW INDEX IS EMPTY (VALIDf=00) IN HARDWARE. 28884 * The old Hardware index is cleared at the end. 28885 * Parameters: 28886 * unit - (IN) BCM device number. 28887 * f_ent - (IN) Entry to move 28888 * parts_count - (IN) Field entry parts count. 28889 * tcam_idx_old - (IN) Source entry tcam index. 28890 * tcam_idx_new - (IN) Destination entry tcam index. 28891 * 28892 * Returns: 28893 * BCM_E_XXX 28894 */ 28895 int 28896 _bcm_field_th_entry_move(int unit, _field_entry_t *f_ent, int parts_count, 28897 int *tcam_idx_old, int *tcam_idx_new) 28898 { 28899 static uint32 entry_buf[BCM_MAX_NUM_UNITS][25]; 28900 /* For TCAM */ 28901 static uint32 policy_buf[BCM_MAX_NUM_UNITS][25]; 28902 /* For policies */ 28903 soc_mem_t tcam_mem; /* TCAM memory id. */ 28904 soc_mem_t policy_mem; /* Policy table memory id . */ 28905 int tcam_idx_max; /* TCAM memory max index. */ 28906 int tcam_idx_min; /* TCAM memory min index. */ 28907 _field_stage_t *stage_fc; /* Stage field control structure. */ 28908 _field_stage_id_t stage_id; /* Field pipeline stage id. */ 28909 int idx; /* Iteration index. */ 28910 _field_group_t *fg; /* Field group structure. */ 28911 _field_slice_t *fs = NULL; 28912 int rv; /* Operation return status. */ 28913 int is_backup_entry = 0; /* Flag ,checks the entry is 28914 backup entry or not*/ 28915 int num_tcams = 0; /* Number of TCAMs */ 28916 int ct; 28917 int policy_idx; 28918 int new_slice_idx = 0, /* New slice number and index. */ 28919 new_slice_numb = 0; 28920 uint8 enabled = 0; 28921 uint8 per_pipe_mode = FALSE; 28922 soc_mem_t tcam_mem_global; /* Global TCAM Id */ 28923 28924 /* Input parameters check. */ 28925 if ((NULL == f_ent) || (NULL == tcam_idx_old) || (NULL == tcam_idx_new)) { 28926 return (BCM_E_PARAM); 28927 } 28928 28929 28930 fg = f_ent->group; 28931 if (fg == NULL) { 28932 return BCM_E_INTERNAL; 28933 } 28934 28935 /* Get field stage control . */ 28936 stage_id = fg->stage_id; 28937 rv = _field_stage_control_get(unit, stage_id, &stage_fc); 28938 BCM_IF_ERROR_RETURN(rv); 28939 28940 #if defined(BCM_FLOWTRACKER_SUPPORT) 28941 if (stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) { 28942 return _bcm_field_hx5_ft_entry_move(unit, f_ent, parts_count, 28943 tcam_idx_old, tcam_idx_new); 28944 } 28945 #endif 28946 28947 /* 28948 * Invoke common function for the stages other than Ingress 28949 * Need to re-visit for per-pipe support for other stages. 28950 */ 28951 if (f_ent->group->stage_id != _BCM_FIELD_STAGE_INGRESS) { 28952 28953 rv = _bcm_field_td2_entry_move(unit, f_ent, parts_count, 28954 tcam_idx_old, tcam_idx_new); 28955 BCM_IF_ERROR_RETURN(rv); 28956 28957 for (idx = 0; idx < parts_count; idx++) { 28958 /* Calculate entry new slice & offset in the slice. */ 28959 rv = _bcm_field_tcam_idx_to_slice_offset (unit, stage_fc, 28960 f_ent->group->instance, 28961 tcam_idx_new[idx], 28962 &new_slice_numb, 28963 &new_slice_idx); 28964 BCM_IF_ERROR_RETURN(rv); 28965 fs = &stage_fc->slices[f_ent->group->instance][new_slice_numb]; 28966 fs->hw_ent_count++; 28967 } 28968 28969 return rv; 28970 } 28971 28972 /* Get entry tcam and actions. */ 28973 BCM_IF_ERROR_RETURN 28974 (_bcm_field_th_tcam_policy_mem_get(unit, f_ent, 28975 &tcam_mem, &policy_mem)); 28976 tcam_mem_global = tcam_mem; 28977 28978 /* 28979 * When the TCAM Mode is Wide on a global view, 28980 * Move entries from the Pipes. 28981 */ 28982 if (((tcam_mem == IFP_TCAM_WIDEm) || 28983 ((soc_feature(unit, soc_feature_th3_style_fp)) && 28984 (tcam_mem == IFP_TCAMm))) && 28985 (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) && 28986 (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) { 28987 num_tcams = stage_fc->num_pipes; 28988 per_pipe_mode = TRUE; 28989 } else { 28990 num_tcams = 1; /* tcam name is fetched in tcam_mem */ 28991 } 28992 28993 for (ct = 0; ct < num_tcams; ct++) { 28994 if (per_pipe_mode == TRUE) { 28995 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 28996 tcam_mem_global, 28997 ct, 28998 &tcam_mem)); 28999 } 29000 tcam_idx_max = soc_mem_index_max(unit, tcam_mem); 29001 tcam_idx_min = soc_mem_index_min(unit, tcam_mem); 29002 29003 for (idx = 0; idx < parts_count; idx++) { 29004 /* Index sanity check. */ 29005 if ((tcam_idx_old[idx] < tcam_idx_min) || 29006 (tcam_idx_old[idx] > tcam_idx_max) || 29007 (tcam_idx_new[idx] < tcam_idx_min) || 29008 (tcam_idx_new[idx] > tcam_idx_max)) { 29009 LOG_DEBUG(BSL_LS_BCM_FP, 29010 (BSL_META_U(unit, 29011 "Invalid index range for _field_td2_entry_move\n" 29012 "from %d to %d"), tcam_idx_old[idx], tcam_idx_new[idx])); 29013 return (BCM_E_PARAM); 29014 } 29015 } 29016 29017 /* Update policy entry if moving across the slices. */ 29018 if (((NULL != f_ent->ent_copy) && 29019 (f_ent->ent_copy->eid == _FP_INTERNAL_RESERVED_ID))) { 29020 is_backup_entry = 1; 29021 } 29022 29023 for (idx = 0; idx < parts_count; idx++) { 29024 /* Calculate entry new slice & offset in the slice. */ 29025 rv = _bcm_field_th_tcam_idx_to_slice_offset (unit, stage_fc, 29026 f_ent, 29027 tcam_idx_new[idx], 29028 &new_slice_numb, 29029 &new_slice_idx); 29030 if (BCM_SUCCESS(rv)) { 29031 29032 fs = &stage_fc->slices[f_ent->group->instance][new_slice_numb]; 29033 /* Enable the slice if the entry moves to new slice. */ 29034 if (!(fs->slice_flags & _BCM_FIELD_SLICE_HW_ENABLE)) { 29035 if (BCM_FAILURE(_bcm_field_th_slice_enable_set(unit, 29036 f_ent->group, fs, 1))) { 29037 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 29038 "Failed to Enable Field Slice[%d] for Entry[%d].\n\r"), 29039 fs->slice_number, f_ent->eid)); 29040 } 29041 fs->slice_flags |= _BCM_FIELD_SLICE_HW_ENABLE; 29042 enabled = 1; 29043 } 29044 } 29045 } 29046 /* 29047 * Write entry to the destination 29048 * ORDER is important 29049 */ 29050 for (idx = parts_count - 1; idx >= 0; idx--) { 29051 if (ct == 0) { 29052 29053 /* 29054 * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes, 29055 * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries. 29056 * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and 29057 * entries are 1:1 mapped. 29058 */ 29059 if ((SOC_IS_TOMAHAWKX(unit) && !(SOC_IS_TOMAHAWK3(unit)) && 29060 (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) || 29061 (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) { 29062 policy_idx = tcam_idx_old[idx] + (tcam_idx_old[idx]/256 * 256); 29063 } else { 29064 policy_idx = tcam_idx_old[idx]; 29065 } 29066 29067 /* Read policy entry from current tcam index. */ 29068 rv = soc_th_ifp_mem_read(unit, policy_mem, MEM_BLOCK_ANY, 29069 policy_idx, policy_buf[unit]); 29070 29071 if (BCM_FAILURE(rv)) { 29072 goto cleanup; 29073 } 29074 29075 /* 29076 * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes, 29077 * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries. 29078 * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and 29079 * entries are 1:1 mapped. 29080 */ 29081 if ((SOC_IS_TOMAHAWKX(unit) && !(SOC_IS_TOMAHAWK3(unit)) && 29082 (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) || 29083 (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) { 29084 policy_idx = tcam_idx_new[idx] + (tcam_idx_new[idx]/256 * 256); 29085 } else { 29086 policy_idx = tcam_idx_new[idx]; 29087 } 29088 29089 /* Write duplicate policy entry to new tcam index. */ 29090 rv = soc_th_ifp_mem_write(unit, policy_mem, MEM_BLOCK_ALL, 29091 policy_idx, policy_buf[unit]); 29092 if (BCM_FAILURE(rv)) { 29093 goto cleanup; 29094 } 29095 } 29096 29097 /* Read tcam entry from current tcam index. */ 29098 rv = soc_th_ifp_mem_read(unit, tcam_mem, MEM_BLOCK_ANY, 29099 tcam_idx_old[idx], entry_buf[unit]); 29100 if (BCM_FAILURE(rv)) { 29101 goto cleanup; 29102 } 29103 29104 /* Write duplicate tcam entry to new tcam index. */ 29105 rv = soc_th_ifp_mem_write(unit, tcam_mem, MEM_BLOCK_ALL, 29106 tcam_idx_new[idx], entry_buf[unit]); 29107 if (BCM_FAILURE(rv)) { 29108 goto cleanup; 29109 } 29110 } 29111 } 29112 29113 for (idx = 0; idx < parts_count; idx++) { 29114 /* Calculate entry new slice & offset in the slice. */ 29115 rv = _bcm_field_th_tcam_idx_to_slice_offset (unit, stage_fc, 29116 f_ent, 29117 tcam_idx_new[idx], 29118 &new_slice_numb, 29119 &new_slice_idx); 29120 if (BCM_SUCCESS(rv)) { 29121 29122 fs = &stage_fc->slices[f_ent->group->instance][new_slice_numb]; 29123 /* Increment the HW Slice entry count */ 29124 fs->hw_ent_count++; 29125 } else { 29126 goto cleanup; 29127 } 29128 29129 /* 29130 * fp_entry_move is invoked even for backup entry create 29131 * to copy TCAM and FP_POLICY_TABLE tables. In this case 29132 * TCAM and FP_POLICY_TABLEs should not be erased for 29133 * original entry. 29134 */ 29135 if (1 != is_backup_entry) { 29136 /* 29137 * Clear old location 29138 */ 29139 rv = _bcm_field_th_tcam_policy_clear(unit, f_ent, 29140 tcam_idx_old[idx]); 29141 BCM_IF_ERROR_RETURN(rv); 29142 } 29143 } 29144 return (BCM_E_NONE); 29145 29146 cleanup: 29147 if (enabled == 1) { 29148 for (idx = 0; idx < parts_count; idx++) { 29149 /* Calculate entry new slice & offset in the slice. */ 29150 rv = _bcm_field_th_tcam_idx_to_slice_offset (unit, stage_fc, 29151 f_ent, 29152 tcam_idx_new[idx], 29153 &new_slice_numb, 29154 &new_slice_idx); 29155 if (BCM_SUCCESS(rv)) { 29156 29157 fs = &stage_fc->slices[f_ent->group->instance][new_slice_numb]; 29158 if (fs->slice_flags & _BCM_FIELD_SLICE_HW_ENABLE) { 29159 if (BCM_FAILURE(_bcm_field_th_slice_enable_set(unit, f_ent->group, 29160 fs, 0))) { 29161 LOG_WARN(BSL_LS_BCM_FP, (BSL_META("Failed to Disable Field" 29162 " Slice[%d] for Entry[%d].\n\r"), 29163 fs->slice_number, f_ent->eid)); 29164 } 29165 fs->slice_flags &= ~_BCM_FIELD_SLICE_HW_ENABLE; 29166 } 29167 } 29168 } 29169 } 29170 return rv; 29171 } 29172 29173 /* 29174 * Function: 29175 * _bcm_field_th_tcam_policy_clear 29176 * 29177 * Purpose: 29178 * Writes a null entry into the TCAM plus Policy table. 29179 * 29180 * Parameters: 29181 * unit - (IN) BCM device number. 29182 * f_ent - (IN) Field entry. 29183 * tcam_idx - (IN) Entry tcam index. 29184 * 29185 * Returns: 29186 * BCM_E_XXX 29187 * 29188 * Note: 29189 * Unit lock should be held by calling function. 29190 */ 29191 int 29192 _bcm_field_th_tcam_policy_clear(int unit, _field_entry_t *f_ent, int tcam_idx) 29193 { 29194 bcm_error_t rv = BCM_E_NONE; /* Operational Status. */ 29195 soc_mem_t tcam_mem; /* TCAM memory id. */ 29196 soc_mem_t policy_mem; /* Policy table memory id . */ 29197 int new_slice_idx = 0; /* New slice number. */ 29198 int new_slice_numb = 0; /* New slice index. */ 29199 _field_slice_t *fs; /* Field Slice structure. */ 29200 _field_stage_t *stage_fc; /* Stage field control structure. */ 29201 29202 if (NULL == f_ent) { 29203 return (BCM_E_PARAM); 29204 } 29205 29206 /* Get field stage control . */ 29207 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, f_ent->group->stage_id, 29208 &stage_fc)); 29209 29210 switch (f_ent->group->stage_id) { 29211 case _BCM_FIELD_STAGE_INGRESS: 29212 BCM_IF_ERROR_RETURN (_field_th_ingress_tcam_policy_clear(unit, f_ent, 29213 tcam_idx)); 29214 29215 /* Calculate entry new slice & offset in the slice. */ 29216 rv = _bcm_field_th_tcam_idx_to_slice_offset (unit, stage_fc, 29217 f_ent, tcam_idx, 29218 &new_slice_numb, 29219 &new_slice_idx); 29220 BCM_IF_ERROR_RETURN(rv); 29221 29222 break; 29223 case _BCM_FIELD_STAGE_LOOKUP: 29224 case _BCM_FIELD_STAGE_EGRESS: 29225 BCM_IF_ERROR_RETURN (_bcm_field_th_tcam_policy_mem_get(unit, f_ent, 29226 &tcam_mem, &policy_mem)); 29227 /* Memory index sanity check. */ 29228 if (tcam_idx > soc_mem_index_max(unit, tcam_mem)) { 29229 return (BCM_E_PARAM); 29230 } 29231 29232 /* Write the TCAM & Policy Tables */ 29233 SOC_IF_ERROR_RETURN 29234 (soc_th_ifp_mem_write(unit, tcam_mem, MEM_BLOCK_ALL, tcam_idx, 29235 soc_mem_entry_null(unit, tcam_mem))); 29236 SOC_IF_ERROR_RETURN 29237 (soc_th_ifp_mem_write(unit, policy_mem, MEM_BLOCK_ALL, tcam_idx, 29238 soc_mem_entry_null(unit, policy_mem))); 29239 29240 /* Calculate entry new slice & offset in the slice. */ 29241 rv = _bcm_field_tcam_idx_to_slice_offset(unit, stage_fc, 29242 f_ent->group->instance, 29243 tcam_idx, 29244 &new_slice_numb, 29245 &new_slice_idx); 29246 BCM_IF_ERROR_RETURN(rv); 29247 29248 break; 29249 #if defined(BCM_FLOWTRACKER_SUPPORT) 29250 case _BCM_FIELD_STAGE_FLOWTRACKER: 29251 BCM_IF_ERROR_RETURN(_bcm_field_hx5_ft_tcam_policy_clear(unit, f_ent, 29252 tcam_idx)); 29253 /* Calculate entry new slice & offset in the slice. */ 29254 rv = _bcm_field_th_tcam_idx_to_slice_offset (unit, stage_fc, 29255 f_ent, tcam_idx, 29256 &new_slice_numb, 29257 &new_slice_idx); 29258 break; 29259 #endif 29260 default: 29261 return BCM_E_INTERNAL; 29262 } 29263 29264 fs = &stage_fc->slices[f_ent->group->instance][new_slice_numb]; 29265 if ((fs->slice_flags & _BCM_FIELD_SLICE_HW_ENABLE) && 29266 (fs->hw_ent_count == 1)) { 29267 /* Disable the Slice, if it the last entry */ 29268 if (BCM_FAILURE(_bcm_field_th_slice_enable_set(unit, f_ent->group, 29269 fs, 0))) { 29270 LOG_WARN(BSL_LS_BCM_FP, (BSL_META("Failed to Disable Field" 29271 " Slice[%d] for Entry[%d].\n\r"), 29272 fs->slice_number, f_ent->eid)); 29273 } 29274 fs->slice_flags &= ~_BCM_FIELD_SLICE_HW_ENABLE; 29275 /* Decrement the HW Slice entry count */ 29276 fs->hw_ent_count = 0; 29277 } else { 29278 if (0 >= fs->hw_ent_count) { 29279 29280 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("Mismatch b/w number of entries" 29281 "created and deleted in Slice [%d].\n\r"), 29282 fs->slice_number)); 29283 29284 return BCM_E_INTERNAL; 29285 } 29286 fs->hw_ent_count--; 29287 29288 } 29289 29290 return (BCM_E_NONE); 29291 } 29292 29293 /* 29294 * Function: 29295 * _bcm_field_th_entry_remove 29296 * Purpose: 29297 * Remove a previously installed physical entry. 29298 * Parameters: 29299 * unit - BCM device number 29300 * f_ent - Physical entry data 29301 * Returns: 29302 * BCM_E_XXX 29303 * BCM_E_NONE 29304 * Notes: 29305 * FP unit lock should be held by calling function. 29306 */ 29307 int 29308 _bcm_field_th_entry_remove(int unit, _field_entry_t *f_ent, int tcam_idx) 29309 { 29310 int rv; /* Return value */ 29311 29312 if (NULL == f_ent) { 29313 return (BCM_E_PARAM); 29314 } 29315 29316 if ((NULL == f_ent->fs) || (NULL == f_ent->group)) { 29317 return (BCM_E_INTERNAL); 29318 } 29319 29320 /* Remove exact match entry from hardware. */ 29321 if (f_ent->group->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 29322 return _field_th_em_entry_remove(unit, f_ent); 29323 } 29324 29325 rv = _bcm_field_th_tcam_policy_clear(unit, f_ent, tcam_idx); 29326 if (BCM_FAILURE(rv)) { 29327 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META( 29328 "Failed to Remove the TCAM entry for entry[%d] tcam_idx[%d]." 29329 "\n\r"), f_ent->eid, tcam_idx)); 29330 return rv; 29331 } 29332 29333 f_ent->flags |= _FP_ENTRY_DIRTY; /* Mark entry as not installed */ 29334 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 29335 "==> %s(): Entry[%d] Un-installed - tcam_idx:%d slice:%d\n\r"), __func__, 29336 f_ent->eid, tcam_idx, f_ent->fs->slice_number)); 29337 return (BCM_E_NONE); 29338 } 29339 29340 /* 29341 * Function: _field_th_stage_entry_enable_set 29342 * 29343 * Purpose: 29344 * Enable/Disable an entry from the ingress field hw tables. 29345 * 29346 * Parameters: 29347 * unit - (IN) BCM device number 29348 * f_ent - (IN) Reference to Entry structure 29349 * enable_flag - (IN) Flag to enable or disable 29350 * 29351 * Returns: 29352 * BCM_E_XXX 29353 * 29354 * Notes: 29355 * This does not destroy the entry, nor deallocate any related resources; 29356 * it only enables/disables a rule from hardware table using VALIDf of the 29357 * corresponding hardware entry. To deallocate the memory used by the entry 29358 * call bcm_field_entry_destroy. 29359 */ 29360 int 29361 _field_th_stage_entry_enable_set(int unit, _field_entry_t *f_ent, 29362 int enable_flag) 29363 { 29364 int rv; /* Operation return status. */ 29365 int tcam_idx; 29366 int valid = 0; 29367 soc_mem_t tcam_mem = INVALIDm; 29368 soc_mem_t policy_mem = INVALIDm; 29369 uint32 tcam_entry[SOC_MAX_MEM_FIELD_WORDS] = {0}; 29370 _field_stage_t *stage_fc; /* Stage field control structure. */ 29371 int num_tcams = 0; /* Number of TCAMs */ 29372 int ct; 29373 uint8 per_pipe_mode = FALSE; 29374 soc_mem_t tcam_mem_global; /* Global TCAM Id */ 29375 29376 if (NULL == f_ent) { 29377 return (BCM_E_PARAM); 29378 } 29379 29380 if ((NULL == f_ent->fs) || (NULL == f_ent->group)) { 29381 return (BCM_E_INTERNAL); 29382 } 29383 29384 /* Get tcam indexes for installed entry. */ 29385 rv = _bcm_field_entry_tcam_idx_get(unit, f_ent, 29386 &tcam_idx); 29387 if (BCM_FAILURE(rv)) { 29388 return (rv); 29389 } 29390 29391 rv = _bcm_field_th_tcam_policy_mem_get(unit, f_ent, 29392 &tcam_mem, &policy_mem); 29393 BCM_IF_ERROR_RETURN(rv); 29394 tcam_mem_global = tcam_mem; 29395 29396 /* Get field stage control . */ 29397 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 29398 BCM_IF_ERROR_RETURN(rv); 29399 29400 /* 29401 * When the TCAM Mode is Wide on a global view, 29402 * Access the entries per-pipe. 29403 */ 29404 if (_BCM_FIELD_STAGE_INGRESS == f_ent->group->stage_id) { 29405 29406 if (((tcam_mem == IFP_TCAM_WIDEm) || 29407 ((soc_feature(unit, soc_feature_th3_style_fp)) && 29408 (tcam_mem == IFP_TCAMm))) && 29409 (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) && 29410 (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) { 29411 num_tcams = stage_fc->num_pipes; 29412 per_pipe_mode = TRUE; 29413 } else { 29414 num_tcams = 1; /* tcam name is fetched in tcam_mem */ 29415 } 29416 29417 if (enable_flag) { 29418 int mode; 29419 29420 mode = _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(f_ent->group->flags) ? 29421 _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW; 29422 /* Update the valid bit based on the mode */ 29423 valid = (mode == _IFP_SLICE_MODE_WIDE) ? 3 : 1; 29424 } 29425 29426 } else if (_BCM_FIELD_STAGE_LOOKUP == f_ent->group->stage_id || 29427 _BCM_FIELD_STAGE_EGRESS == f_ent->group->stage_id) { 29428 num_tcams = 1; 29429 29430 /* Set the VALIDf bits appropriately */ 29431 if (((soc_feature(unit, soc_feature_field_multi_pipe_enhanced) || 29432 soc_feature(unit, soc_feature_td3_style_fp)) && 29433 (f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP)) || 29434 (SOC_IS_TOMAHAWK3(unit))) { 29435 valid = (enable_flag) ? 1 : 0; 29436 } else { 29437 valid = (enable_flag) ? 3 : 2; 29438 } 29439 #if defined(BCM_FLOWTRACKER_SUPPORT) 29440 } else if (_BCM_FIELD_STAGE_FLOWTRACKER == f_ent->group->stage_id) { 29441 valid = (enable_flag) ? 3 : 2; 29442 num_tcams = 1; 29443 #endif 29444 } else { 29445 return BCM_E_INTERNAL; 29446 } 29447 29448 for (ct = 0; ct < num_tcams; ct++) { 29449 29450 if (per_pipe_mode == TRUE) { 29451 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 29452 tcam_mem_global, 29453 ct, 29454 &tcam_mem)); 29455 } 29456 29457 rv = soc_th_ifp_mem_read(unit, tcam_mem, MEM_BLOCK_ANY, 29458 tcam_idx, tcam_entry); 29459 if (BCM_FAILURE(rv)) { 29460 return (rv); 29461 } 29462 29463 soc_mem_field32_set(unit, tcam_mem, tcam_entry, VALIDf, valid); 29464 29465 BCM_IF_ERROR_RETURN(soc_th_ifp_mem_write(unit, 29466 tcam_mem, 29467 MEM_BLOCK_ALL, 29468 tcam_idx, 29469 tcam_entry)); 29470 } 29471 29472 if (enable_flag) { 29473 f_ent->flags |= _FP_ENTRY_ENABLED; 29474 } else { 29475 f_ent->flags &= ~_FP_ENTRY_ENABLED; 29476 } 29477 29478 return BCM_E_NONE; 29479 } 29480 29481 #if defined(BCM_TOMAHAWK2_SUPPORT) 29482 /* 29483 * Function: _field_th2_lookup_entry_enable_set 29484 * 29485 * Purpose: 29486 * Enable/Disable an entry from th2 vfp hw tables. 29487 * 29488 * Parameters: 29489 * unit - (IN) BCM device number 29490 * f_ent - (IN) Reference to Entry structure 29491 * enable_flag - (IN) Flag to enable or disable 29492 * 29493 * Returns: 29494 * BCM_E_XXX 29495 * 29496 * Notes: 29497 * This does not destroy the entry, nor deallocate any related resources; 29498 * it only enables/disables a rule from hardware table using one bit VALIDf of the 29499 * corresponding hardware entry. To deallocate the memory used by the entry 29500 * call bcm_field_entry_destroy. 29501 */ 29502 int 29503 _field_th2_lookup_entry_enable_set(int unit, _field_entry_t *f_ent, 29504 int enable_flag) 29505 { 29506 int rv; /* Operation return status. */ 29507 int tcam_idx; 29508 int valid = 0; 29509 soc_mem_t tcam_mem = INVALIDm; 29510 soc_mem_t policy_mem = INVALIDm; 29511 uint32 tcam_entry[SOC_MAX_MEM_FIELD_WORDS] = {0}; 29512 29513 if (NULL == f_ent) { 29514 return (BCM_E_PARAM); 29515 } 29516 29517 if ((NULL == f_ent->fs) || (NULL == f_ent->group)) { 29518 return (BCM_E_INTERNAL); 29519 } 29520 29521 /* Get tcam indexes for installed entry. */ 29522 rv = _bcm_field_entry_tcam_idx_get(unit, f_ent, &tcam_idx); 29523 BCM_IF_ERROR_RETURN(rv); 29524 29525 rv = _bcm_field_th_tcam_policy_mem_get(unit, f_ent, &tcam_mem, &policy_mem); 29526 BCM_IF_ERROR_RETURN(rv); 29527 29528 rv = soc_mem_read(unit, tcam_mem, MEM_BLOCK_ANY, tcam_idx, tcam_entry); 29529 BCM_IF_ERROR_RETURN(rv); 29530 29531 valid = enable_flag ? 1 : 0; 29532 soc_mem_field32_set(unit, tcam_mem, tcam_entry, VALIDf, valid); 29533 BCM_IF_ERROR_RETURN(soc_mem_write(unit, 29534 tcam_mem, 29535 MEM_BLOCK_ALL, 29536 tcam_idx, 29537 tcam_entry)); 29538 29539 if (enable_flag) { 29540 f_ent->flags |= _FP_ENTRY_ENABLED; 29541 } else { 29542 f_ent->flags &= ~_FP_ENTRY_ENABLED; 29543 } 29544 29545 return BCM_E_NONE; 29546 } 29547 #endif /* BCM_TOMAHAWK2_SUPPORT */ 29548 29549 /* 29550 * Function: _bcm_field_th_entry_enable_set 29551 * 29552 * Purpose: 29553 * Enable/Disable an entry from the hardware tables. 29554 * 29555 * Parameters: 29556 * unit - (IN) BCM device number 29557 * f_ent - (IN) Reference to Entry structure 29558 * enable_flag - (IN) Flag to enable or disable 29559 * 29560 * Returns: 29561 * BCM_E_XXX 29562 * 29563 * Notes: 29564 * This does not destroy the entry, nor deallocate any related resources; 29565 * it only enables/disables a rule from hardware table using VALIDf of the 29566 * corresponding hardware entry. To deallocate the memory used by the entry 29567 * call bcm_field_entry_destroy. 29568 */ 29569 int 29570 _bcm_field_th_entry_enable_set(int unit, _field_entry_t *f_ent, int enable_flag) 29571 { 29572 int rv = BCM_E_NONE; 29573 29574 if (NULL == f_ent) { 29575 return (BCM_E_PARAM); 29576 } 29577 29578 if ((NULL == f_ent->fs) || (NULL == f_ent->group)) { 29579 return (BCM_E_INTERNAL); 29580 } 29581 29582 switch (f_ent->group->stage_id) { 29583 case _BCM_FIELD_STAGE_LOOKUP: 29584 #if defined(BCM_TOMAHAWK2_SUPPORT) 29585 if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced)) { 29586 return _field_th2_lookup_entry_enable_set(unit, f_ent, enable_flag); 29587 } 29588 #endif /* BCM_TOMAHAWK2_SUPPORT */ 29589 case _BCM_FIELD_STAGE_INGRESS: 29590 case _BCM_FIELD_STAGE_EGRESS: 29591 rv = _field_th_stage_entry_enable_set(unit, f_ent, enable_flag); 29592 break; 29593 case _BCM_FIELD_STAGE_EXACTMATCH: 29594 rv = BCM_E_UNAVAIL; 29595 break; 29596 #if defined(BCM_FLOWTRACKER_SUPPORT) 29597 case _BCM_FIELD_STAGE_FLOWTRACKER: 29598 rv = _field_hx5_ft_stage_entry_enable_set(unit, f_ent, enable_flag); 29599 break; 29600 #endif 29601 29602 default: 29603 rv = BCM_E_INTERNAL; 29604 break; 29605 } 29606 29607 return rv; 29608 } 29609 29610 /* 29611 * Function: 29612 * _field_ser_oper_mode_init 29613 * Purpose: 29614 * Initialize the SER for the given operational mode 29615 * per-CAP stage. 29616 * Parameters: 29617 * unit - (IN) BCM Device number. 29618 * stage - (IN) Field Stage Pipeline value. 29619 * mode - (IN) Field Group Operational Mode enum value. 29620 * Returns: 29621 * BCM_E_NONE - Operation successful. 29622 * BCM_E_PARAM - Invalid operational mode or Field Stage. 29623 * BCM_E_XXX - For others. 29624 * 29625 * Notes: 29626 * 1. Valid "stage" input parameter values supported by 29627 * this API are: 29628 * "bcmFieldQualifyStageLookup" 29629 * "bcmFieldQualifyStageIngress" 29630 * "bcmFieldQualifyStageEgress" 29631 * "bcmFieldQualifyStageIngressExactMatch" 29632 * "bcmFieldQualifyStageClass" 29633 * "bcmFieldQualifyStageClassExactMatch". 29634 * 2. Irrespective of the given mode, the IFP_TCAM_WIDE is 29635 * always be initialized to Unique Mode. 29636 */ 29637 STATIC int 29638 _field_ser_oper_mode_init( 29639 int unit, 29640 int stage_id, 29641 bcm_field_group_oper_mode_t mode) 29642 { 29643 int idx; /* Temp Index variable. */ 29644 int ser_mode; /* SER mode */ 29645 int rv; /* Return Value */ 29646 int8 num_tcam = 0, /* Number of tcams */ 29647 ct; 29648 soc_mem_t tcam_mem[12] = {INVALIDm}; /* Tcam memory id */ 29649 int set_mode[12] = {0}; 29650 29651 /* Validate input parameters */ 29652 if ((mode != bcmFieldGroupOperModeGlobal) && 29653 (mode != bcmFieldGroupOperModePipeLocal)) { 29654 return BCM_E_PARAM; 29655 } 29656 29657 /* Update the SER mode */ 29658 ser_mode = (mode == bcmFieldGroupOperModeGlobal) ? 29659 _SOC_SER_MEM_MODE_GLOBAL:_SOC_SER_MEM_MODE_PIPE_UNIQUE; 29660 29661 /* Update stage_id and tcam memory for the given stage */ 29662 switch (stage_id) { 29663 case _BCM_FIELD_STAGE_LOOKUP: 29664 tcam_mem[0] = VFP_TCAMm; 29665 num_tcam = 2; 29666 break; 29667 case _BCM_FIELD_STAGE_INGRESS: 29668 tcam_mem[1] = IFP_LOGICAL_TABLE_SELECTm; 29669 tcam_mem[2] = IFP_LOGICAL_TABLE_SELECT_TCAM_ONLYm; 29670 tcam_mem[3] = IFP_TCAMm; 29671 tcam_mem[4] = IFP_TCAM_WIDEm; 29672 num_tcam = 5; 29673 break; 29674 case _BCM_FIELD_STAGE_EGRESS: 29675 tcam_mem[0] = EFP_TCAMm; 29676 num_tcam = 1; 29677 break; 29678 case _BCM_FIELD_STAGE_EXACTMATCH: 29679 tcam_mem[0] = EXACT_MATCH_LOGICAL_TABLE_SELECTm; 29680 tcam_mem[1] = EXACT_MATCH_LOGICAL_TABLE_SELECT_TCAM_ONLYm; 29681 num_tcam = 2; 29682 break; 29683 case _BCM_FIELD_STAGE_CLASS: 29684 tcam_mem[0] = SRC_COMPRESSIONm; 29685 tcam_mem[1] = SRC_COMPRESSION_TCAM_ONLYm; 29686 tcam_mem[2] = DST_COMPRESSIONm; 29687 tcam_mem[3] = DST_COMPRESSION_TCAM_ONLYm; 29688 tcam_mem[4] = TTL_FNm; 29689 tcam_mem[5] = TOS_FNm; 29690 tcam_mem[6] = TCP_FNm; 29691 tcam_mem[7] = IP_PROTO_MAPm; 29692 num_tcam = 8; 29693 break; 29694 default: 29695 return BCM_E_PARAM; 29696 } 29697 29698 for (idx = 0; idx < num_tcam; idx++) { 29699 /* In order to support the bcmFieldQualifyInPorts qualifier in 29700 * Global Mode, reads/writes on IFP_TCAM_WIDE should always be 29701 * in per pipe mode. 29702 */ 29703 if (((IFP_TCAM_WIDEm == tcam_mem[idx]) || 29704 ((soc_feature(unit, soc_feature_th3_style_fp)) && 29705 (IFP_TCAMm == tcam_mem[idx]))) && 29706 (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) { 29707 set_mode[idx] = _SOC_SER_MEM_MODE_PIPE_UNIQUE; 29708 } else { 29709 set_mode[idx] = ser_mode; 29710 } 29711 } 29712 29713 SOC_IF_ERROR_RETURN(soc_generic_ser_mem_scan_stop(unit)); 29714 for (ct = 0; num_tcam > 0; ct++,num_tcam--) { 29715 rv = soc_generic_ser_mem_update(unit, tcam_mem[ct], stage_id, set_mode[ct]); 29716 if (SOC_FAILURE(rv)) { 29717 LOG_ERROR(BSL_LS_BCM_FP, 29718 (BSL_META_U(unit, 29719 "SER memory update failed[%d] to set" 29720 " '%s' mode for tcam[%d].\n"), 29721 rv, 29722 (set_mode[ct] == _SOC_SER_MEM_MODE_GLOBAL)?"Global":"Unique", 29723 tcam_mem[ct])); 29724 } 29725 } 29726 SOC_IF_ERROR_RETURN(soc_generic_ser_mem_scan_start(unit)); 29727 29728 return BCM_E_NONE; 29729 } 29730 29731 /* 29732 * Function: 29733 * _bcm_th_field_stage_supported_qset_init 29734 * 29735 * Purpose: 29736 * Initialize field stages supported qset for each stage 29737 * 29738 * Parameters: 29739 * unit - (IN) BCM device number. 29740 * 29741 * Returns: 29742 * BCM_E_NONE - Success 29743 * BCM_E_MEMORY - Allocation failure 29744 */ 29745 int 29746 _bcm_th_field_stage_supported_qset_init(int unit, _field_control_t *fc, 29747 _field_stage_t *stage_fc) 29748 { 29749 bcm_field_qset_t *qset; /* Operation result. */ 29750 int idx; /* Iteration index. */ 29751 bcmi_keygen_qual_cfg_info_t **qual_cfg_info = NULL; 29752 29753 /* Fill supported qset for each pipeline stage. */ 29754 qset = &stage_fc->_field_supported_qset; 29755 29756 #if defined (BCM_TOMAHAWK_SUPPORT) 29757 if ((soc_feature(unit, soc_feature_th3_style_fp)) && 29758 ((_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) || 29759 (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id))) { 29760 if (stage_fc->qual_cfg_info_db != NULL ) { 29761 for (idx = 0; idx < _bcmFieldQualifyCount; idx++) { 29762 if (NULL != stage_fc->qual_cfg_info_db->qual_cfg_info[idx]) { 29763 BCM_FIELD_QSET_ADD(*qset, 29764 (stage_fc->qual_cfg_info_db->qual_cfg_info[idx])->qual); 29765 } 29766 } 29767 } 29768 } else 29769 #endif 29770 { 29771 if (stage_fc->f_qual_arr != NULL ) { 29772 for (idx = 0; idx < _bcmFieldQualifyCount; idx++) { 29773 if (NULL != stage_fc->f_qual_arr[idx]) { 29774 BCM_FIELD_QSET_ADD(*qset, (stage_fc->f_qual_arr[idx])->qid); 29775 } 29776 } 29777 #if defined(BCM_TOMAHAWK_SUPPORT) 29778 } else if (stage_fc->qual_cfg_info_db != NULL) { 29779 qual_cfg_info = stage_fc->qual_cfg_info_db->qual_cfg_info; 29780 for (idx = 0; idx < BCM_FIELD_QUALIFY_MAX; idx++) { 29781 if (NULL != qual_cfg_info[idx]) { 29782 BCM_FIELD_QSET_ADD(*qset, (qual_cfg_info[idx])->qual); 29783 } 29784 } 29785 #endif 29786 } 29787 } 29788 29789 return (BCM_E_NONE); 29790 } 29791 29792 29793 /* 29794 * Function: 29795 * _bcm_field_wb_group_oper_mode_set 29796 * Purpose: 29797 * Configure Field Processor Group operational mode 29798 * per-CAP stage. 29799 * Parameters: 29800 * unit - (IN) BCM Device number. 29801 * stage - (IN) Field Stage Pipeline Qualifier enum value. 29802 * mode - (IN) Field Group Operational Mode enum value. 29803 * Returns: 29804 * BCM_E_NONE - Operation successful. 29805 * BCM_E_PARAM - Invalid operational mode or Field Stage. 29806 * BCM_E_INIT - BCM unit not initialized. 29807 * BCM_E_BUSY - Field stage has valid group/entry configured. 29808 * 29809 * Notes: 29810 * Valid "stage" input parameter values supported by 29811 * this API are: 29812 * "bcmFieldQualifyStageLookup" 29813 * "bcmFieldQualifyStageIngress" 29814 * "bcmFieldQualifyStageEgress" 29815 * "bcmFieldQualifyStageExactMatch". 29816 */ 29817 29818 int 29819 _bcm_field_wb_group_oper_mode_set( 29820 int unit, 29821 bcm_field_qualify_t stage, 29822 _field_stage_t **stage_fc, 29823 bcm_field_group_oper_mode_t mode) 29824 { 29825 _field_control_t *fc; /* Field control structure. */ 29826 _field_stage_id_t stage_id; /* Pipeline stage id */ 29827 _field_group_t *fg; /* Field group structure */ 29828 int rv; /* Return Value */ 29829 29830 /* Validate input parameters */ 29831 if ((mode != bcmFieldGroupOperModeGlobal) && 29832 (mode != bcmFieldGroupOperModePipeLocal)) { 29833 return BCM_E_PARAM; 29834 } 29835 29836 /* Update stage_id and tcam memory for the given stage */ 29837 switch (stage) { 29838 case bcmFieldQualifyStageLookup: 29839 stage_id = _BCM_FIELD_STAGE_LOOKUP; 29840 break; 29841 case bcmFieldQualifyStageIngress: 29842 stage_id = _BCM_FIELD_STAGE_INGRESS; 29843 break; 29844 case bcmFieldQualifyStageEgress: 29845 stage_id = _BCM_FIELD_STAGE_EGRESS; 29846 break; 29847 case bcmFieldQualifyStageIngressExactMatch: 29848 stage_id = _BCM_FIELD_STAGE_EXACTMATCH; 29849 break; 29850 case bcmFieldQualifyStageClass: 29851 stage_id = _BCM_FIELD_STAGE_CLASS; 29852 break; 29853 default: 29854 return BCM_E_PARAM; 29855 } 29856 29857 /* Verify whether the mode is already set */ 29858 if ((*stage_fc)->oper_mode == mode) { 29859 return BCM_E_NONE; 29860 } 29861 29862 /* Field control structure */ 29863 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 29864 29865 /* Verify whether stage related group/entry is configured */ 29866 fg = fc->groups; 29867 while (NULL != fg) { 29868 if (fg->stage_id == stage_id) { 29869 /* can't modify the stage as a group already exists */ 29870 return BCM_E_BUSY; 29871 } 29872 fg = fg->next; 29873 } 29874 29875 /* To reinitialize the stage, first delete the stage. */ 29876 rv = _field_th_stage_delete(unit, fc, *stage_fc); 29877 if (BCM_FAILURE(rv)) { 29878 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 29879 "FP(unit %d) Error: Stage=%d Delete failed = %d.\n"), 29880 unit, (*stage_fc)->stage_id, rv)); 29881 return (rv); 29882 } 29883 29884 #if defined(BCM_TRIDENT3_SUPPORT) 29885 if (soc_feature(unit, soc_feature_td3_style_fp) && 29886 ((stage_id == _BCM_FIELD_STAGE_INGRESS) || 29887 (stage_id == _BCM_FIELD_STAGE_EXACTMATCH))) { 29888 BCM_IF_ERROR_RETURN(_bcm_field_td3_flex_qual_ceh_db_init(unit)); 29889 } 29890 #endif /* BCM_TRIDENT3_SUPPORT */ 29891 29892 /* 29893 * Add the stage back. Stage structure is allocated in this function hence 29894 * pass the stage ID as input parameter to this function. 29895 * The oper_mode is updated in this function. 29896 */ 29897 rv = _field_th_stage_add(unit, fc, stage_id, mode); 29898 if (BCM_FAILURE(rv)) { 29899 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 29900 "FP(unit %d) Error: Stage=%d Add failed = %d.\n"), 29901 unit, stage_id, rv)); 29902 return (rv); 29903 } 29904 29905 /* SER initialization */ 29906 BCM_IF_ERROR_RETURN(_field_ser_oper_mode_init(unit, stage_id, mode)); 29907 29908 BCM_IF_ERROR_RETURN 29909 (_field_stage_control_get(unit, stage_id, stage_fc)); 29910 29911 /* Initialize qualifiers info. */ 29912 BCM_IF_ERROR_RETURN(_field_th_qualifiers_init(unit, *stage_fc)); 29913 29914 /* Initialize stage actions information. */ 29915 BCM_IF_ERROR_RETURN(_field_th_actions_init(unit, *stage_fc)); 29916 29917 /* Initialize supported qset for each stage. */ 29918 BCM_IF_ERROR_RETURN(_bcm_th_field_stage_supported_qset_init(unit, fc, *stage_fc)); 29919 29920 #if defined(BCM_TRIDENT3_SUPPORT) 29921 if (soc_feature(unit, soc_feature_td3_style_fp) && 29922 ((stage_id == _BCM_FIELD_STAGE_INGRESS) || 29923 (stage_id == _BCM_FIELD_STAGE_EXACTMATCH))) { 29924 rv = (_bcm_field_td3_flex_qual_ceh_db_clear(unit)); 29925 } 29926 #endif 29927 29928 return rv; 29929 } 29930 29931 int 29932 _field_th_group_oper_mode_set( 29933 int unit, 29934 bcm_field_qualify_t stage, 29935 bcm_field_group_oper_mode_t mode) 29936 { 29937 _field_stage_t *stage_fc; /* Stage field control structure. */ 29938 _field_control_t *fc; /* Field control structure. */ 29939 _field_stage_id_t stage_id; /* Pipeline stage id */ 29940 _field_group_t *fg; /* Field group structure */ 29941 int rv; /* Return Value */ 29942 29943 /* Validate input parameters */ 29944 if ((mode != bcmFieldGroupOperModeGlobal) && 29945 (mode != bcmFieldGroupOperModePipeLocal)) { 29946 return BCM_E_PARAM; 29947 } 29948 29949 /* Update stage_id and tcam memory for the given stage */ 29950 switch (stage) { 29951 case bcmFieldQualifyStageLookup: 29952 stage_id = _BCM_FIELD_STAGE_LOOKUP; 29953 break; 29954 case bcmFieldQualifyStageIngress: 29955 stage_id = _BCM_FIELD_STAGE_INGRESS; 29956 break; 29957 case bcmFieldQualifyStageEgress: 29958 stage_id = _BCM_FIELD_STAGE_EGRESS; 29959 break; 29960 case bcmFieldQualifyStageIngressExactMatch: 29961 stage_id = _BCM_FIELD_STAGE_EXACTMATCH; 29962 break; 29963 case bcmFieldQualifyStageClass: 29964 case bcmFieldQualifyStageClassExactMatch: 29965 stage_id = _BCM_FIELD_STAGE_CLASS; 29966 break; 29967 default: 29968 return BCM_E_PARAM; 29969 } 29970 29971 /* 29972 * Retrieve Field stage control structure, 29973 * It also return BCM_E_INIT if the field is not initialized. 29974 */ 29975 BCM_IF_ERROR_RETURN 29976 (_field_stage_control_get(unit, stage_id, &stage_fc)); 29977 29978 /* Verify whether the mode is already set */ 29979 if (stage_fc->oper_mode == mode) { 29980 return BCM_E_NONE; 29981 } 29982 29983 /* Field control structure */ 29984 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 29985 29986 /* Restrict EM in per pipe mode for TH3 */ 29987 #if defined (BCM_TOMAHAWK3_SUPPORT) 29988 if (soc_feature(unit, soc_feature_th3_style_fp)) { 29989 if ((stage_id == _BCM_FIELD_STAGE_EXACTMATCH) && 29990 (mode == bcmFieldGroupOperModePipeLocal)) { 29991 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 29992 "FP(unit %d) Error: Exact Match Stage Per Pipe Mode Not Supported.\n"), 29993 unit)); 29994 return (BCM_E_UNAVAIL); 29995 } 29996 } 29997 #endif 29998 29999 /* Verify whether stage related group/entry is configured */ 30000 fg = fc->groups; 30001 while (NULL != fg) { 30002 if (fg->stage_id == stage_id) { 30003 return BCM_E_BUSY; 30004 } 30005 fg = fg->next; 30006 } 30007 30008 switch (stage_fc->oper_mode) { 30009 case bcmFieldGroupOperModeGlobal: 30010 /* Clear hardware table */ 30011 BCM_IF_ERROR_RETURN(_field_th_hw_clear(unit, stage_fc, fc)); 30012 break; 30013 case bcmFieldGroupOperModePipeLocal: 30014 /* Clear hardware table */ 30015 BCM_IF_ERROR_RETURN(_field_th_pipes_hw_clear(unit, stage_fc, fc)); 30016 break; 30017 default: 30018 return BCM_E_INTERNAL; 30019 } 30020 30021 /* To reinitialize the stage, first delete the stage. */ 30022 rv = _field_th_stage_delete(unit, fc, stage_fc); 30023 if (BCM_FAILURE(rv)) { 30024 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 30025 "FP(unit %d) Error: Stage=%d Delete failed = %d.\n"), 30026 unit, stage_fc->stage_id, rv)); 30027 return (rv); 30028 } 30029 30030 #if defined(BCM_TRIDENT3_SUPPORT) 30031 if (soc_feature(unit, soc_feature_td3_style_fp) && 30032 ((stage_id == _BCM_FIELD_STAGE_INGRESS) || 30033 (stage_id == _BCM_FIELD_STAGE_EXACTMATCH))) { 30034 BCM_IF_ERROR_RETURN(_bcm_field_td3_flex_qual_ceh_db_init(unit)); 30035 } 30036 #endif /* BCM_TRIDENT3_SUPPORT */ 30037 30038 /* 30039 * Add the stage back. Stage structure is allocated in this function hence 30040 * pass the stage ID as input parameter to this function. 30041 * The oper_mode is updated in this function. 30042 */ 30043 rv = _field_th_stage_add(unit, fc, stage_id, mode); 30044 if (BCM_FAILURE(rv)) { 30045 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 30046 "FP(unit %d) Error: Stage=%d Add failed = %d.\n"), 30047 unit, stage_id, rv)); 30048 goto cleanup; 30049 } 30050 30051 /* SER initialization */ 30052 rv = (_field_ser_oper_mode_init(unit, stage_id, mode)); 30053 if (BCM_FAILURE(rv)) { 30054 goto cleanup; 30055 } 30056 30057 rv = (_field_stage_control_get(unit, stage_id, &stage_fc)); 30058 if (BCM_FAILURE(rv)) { 30059 goto cleanup; 30060 } 30061 30062 switch (stage_fc->oper_mode) { 30063 case bcmFieldGroupOperModeGlobal: 30064 /* Clear hardware table */ 30065 rv = (_field_th_hw_clear(unit, stage_fc, fc)); 30066 break; 30067 case bcmFieldGroupOperModePipeLocal: 30068 /* Clear hardware table */ 30069 rv = (_field_th_pipes_hw_clear(unit, stage_fc, fc)); 30070 break; 30071 default: 30072 rv = BCM_E_INTERNAL; 30073 break; 30074 } 30075 30076 if (BCM_FAILURE(rv)) { 30077 goto cleanup; 30078 } 30079 30080 if ((stage_id == _BCM_FIELD_STAGE_INGRESS) || 30081 (stage_id == _BCM_FIELD_STAGE_EXACTMATCH)) { 30082 /* Match ID width partition for each zone */ 30083 if (fc->functions.fp_zone_match_id_partition_init != NULL) { 30084 fc->functions.fp_zone_match_id_partition_init(unit, stage_fc); 30085 } 30086 } 30087 30088 /* Initialize qualifiers info. */ 30089 rv = (_field_th_qualifiers_init(unit, stage_fc)); 30090 if (BCM_FAILURE(rv)) { 30091 goto cleanup; 30092 } 30093 30094 /* Initialize stage actions information. */ 30095 rv = (_field_th_actions_init(unit, stage_fc)); 30096 if (BCM_FAILURE(rv)) { 30097 goto cleanup; 30098 } 30099 30100 /* IFP and EXACTMATCH stages are non-correlative if FLOWTRACKER_ENABLE is enabled*/ 30101 if ((stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) && 30102 soc_feature(unit, soc_feature_field_exact_match_support)){ 30103 /* Update exact match input bus when ingress oper mode is changed. */ 30104 rv = (_field_th_emstage_update(unit, stage_fc)); 30105 if (BCM_FAILURE(rv)) { 30106 goto cleanup; 30107 } 30108 } 30109 30110 /* Initialize supported qset for each stage seperately */ 30111 rv = (_bcm_th_field_stage_supported_qset_init(unit, fc, stage_fc)); 30112 if (BCM_FAILURE(rv)) { 30113 goto cleanup; 30114 } 30115 30116 cleanup: 30117 #if defined(BCM_TRIDENT3_SUPPORT) 30118 if (soc_feature(unit, soc_feature_td3_style_fp) && 30119 ((stage_id == _BCM_FIELD_STAGE_INGRESS) || 30120 (stage_id == _BCM_FIELD_STAGE_EXACTMATCH))) { 30121 rv = (_bcm_field_td3_flex_qual_ceh_db_clear(unit)); 30122 } 30123 #endif 30124 30125 return rv; 30126 } 30127 30128 /* 30129 * Function: 30130 * _bcm_field_th_group_oper_mode_set 30131 * Purpose: 30132 * Configure Field Processor Group operational mode 30133 * per-CAP stage. 30134 * Parameters: 30135 * unit - (IN) BCM Device number. 30136 * stage - (IN) Field Stage Pipeline Qualifier enum value. 30137 * mode - (IN) Field Group Operational Mode enum value. 30138 * Returns: 30139 * BCM_E_NONE - Operation successful. 30140 * BCM_E_PARAM - Invalid operational mode or Field Stage. 30141 * BCM_E_INIT - BCM unit not initialized. 30142 * BCM_E_BUSY - Field stage has valid group/entry configured. 30143 * 30144 * Notes: 30145 * Valid "stage" input parameter values supported by 30146 * this API are: 30147 * "bcmFieldQualifyStageLookup" 30148 * "bcmFieldQualifyStageIngress" 30149 * "bcmFieldQualifyStageEgress" 30150 * "bcmFieldQualifyStageIngressExactMatch" 30151 * "bcmFieldQualifyStageClass" 30152 * "bcmFieldQualifyStageClassExactMatch". 30153 * "bcmFieldQualifyStageIngressFlowtracker." 30154 */ 30155 int 30156 _bcm_field_th_group_oper_mode_set( 30157 int unit, 30158 bcm_field_qualify_t stage, 30159 bcm_field_group_oper_mode_t mode) 30160 { 30161 BCM_IF_ERROR_RETURN(_field_th_group_oper_mode_set(unit, stage, mode)); 30162 return BCM_E_NONE; 30163 } 30164 /* 30165 * Function: 30166 * _bcm_field_th_group_oper_mode_get 30167 * Purpose: 30168 * Retrieve Field Processor Group operational mode 30169 * per-CAP stage. 30170 * Parameters: 30171 * unit - (IN) BCM Device number. 30172 * stage - (IN) Field Stage Pipeline Qualifier enum value. 30173 * mode - (OUT) Reference to Field Group Operational 30174 * Mode enum value. 30175 * Returns: 30176 * BCM_E_NONE - Operation successful. 30177 * BCM_E_PARAM - Invalid parameter. 30178 * BCM_E_INIT - BCM unit not initialized. 30179 * 30180 * Notes: 30181 * Valid "stage" input parameter values supported by 30182 * this API are: 30183 * "bcmFieldQualifyStageLookup" 30184 * "bcmFieldQualifyStageIngress" 30185 * "bcmFieldQualifyStageEgress" 30186 * "bcmFieldQualifyStageIngressExactMatch" 30187 * "bcmFieldQualifyStageClass" 30188 * "bcmFieldQualifyStageClassExactMatch." 30189 * "bcmFieldQualifyStageIngressFlowtracker." 30190 */ 30191 30192 int 30193 _bcm_field_th_group_oper_mode_get( 30194 int unit, 30195 bcm_field_qualify_t stage, 30196 bcm_field_group_oper_mode_t *mode) 30197 { 30198 _field_stage_t *stage_fc; /* Stage field control structure. */ 30199 _field_stage_id_t stage_id; /* Pipeline stage id */ 30200 30201 /* Validate input parameters */ 30202 if (mode == NULL) { 30203 return BCM_E_PARAM; 30204 } 30205 30206 switch (stage) { 30207 case bcmFieldQualifyStageLookup: 30208 stage_id = _BCM_FIELD_STAGE_LOOKUP; 30209 break; 30210 case bcmFieldQualifyStageIngress: 30211 stage_id = _BCM_FIELD_STAGE_INGRESS; 30212 break; 30213 case bcmFieldQualifyStageEgress: 30214 stage_id = _BCM_FIELD_STAGE_EGRESS; 30215 break; 30216 case bcmFieldQualifyStageClass: 30217 case bcmFieldQualifyStageClassExactMatch: 30218 stage_id = _BCM_FIELD_STAGE_CLASS; 30219 break; 30220 case bcmFieldQualifyStageIngressExactMatch: 30221 stage_id = _BCM_FIELD_STAGE_EXACTMATCH; 30222 break; 30223 case bcmFieldQualifyStageIngressFlowtracker: 30224 stage_id = _BCM_FIELD_STAGE_FLOWTRACKER; 30225 break; 30226 default: 30227 return BCM_E_PARAM; 30228 break; 30229 } 30230 30231 /* 30232 * Retrieve Field stage control structure, 30233 * It also return BCM_E_INIT if the field is not initialized. 30234 */ 30235 BCM_IF_ERROR_RETURN 30236 (_field_stage_control_get (unit, stage_id, &stage_fc)); 30237 30238 /* update the mode */ 30239 *mode = stage_fc->oper_mode; 30240 return BCM_E_NONE; 30241 } 30242 30243 /* 30244 * Function: 30245 * _field_th_ingress_slice_enable_set 30246 * 30247 * Purpose: 30248 * Enables or disables packet lookup on a hardware slice 30249 * and configures the slice mode. 30250 * 30251 * Parameters: 30252 * unit - (IN) BCM device number. 30253 * fg - (IN) Reference to Group Structure. 30254 * fs - (IN) Reference to Slice Structure. 30255 * enable - (IN) enable/disable state of slice. 30256 * 30257 * Returns: 30258 * BCM_E_NONE - Success 30259 * BCM_E_INTERNAL - SOC read/write error 30260 * 30261 * Note: 30262 * Calling function is responsible for checking feature availability. 30263 */ 30264 30265 int 30266 _field_th_ingress_slice_enable_set(int unit, 30267 _field_group_t *fg, 30268 uint8 slice_idx, 30269 uint8 enable) 30270 { 30271 uint32 regval_old, regval_new; 30272 uint8 mode; 30273 _field_stage_t *stage_fc; 30274 soc_reg_t reg; 30275 int inst; 30276 30277 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, 30278 _BCM_FIELD_STAGE_INGRESS, &stage_fc)); 30279 30280 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 30281 inst = _FP_GLOBAL_INST; 30282 } else { 30283 inst = fg->instance; 30284 } 30285 30286 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, IFP_CONFIGr, 30287 inst, ®)); 30288 30289 BCM_IF_ERROR_RETURN 30290 (soc_reg32_get(unit, reg, REG_PORT_ANY, slice_idx, ®val_old)); 30291 regval_new = regval_old; 30292 30293 enable = (enable == 0) ? 0 : 1; 30294 soc_reg_field_set(unit, reg, ®val_new, IFP_SLICE_ENABLEf, enable); 30295 soc_reg_field_set(unit, reg, ®val_new, IFP_SLICE_LOOKUP_ENABLEf, enable); 30296 30297 if (!soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) { 30298 30299 /* Determine the slice mode based on group flags. */ 30300 mode = _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(fg->flags) ? 30301 _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW; 30302 soc_reg_field_set(unit, reg, ®val_new, IFP_SLICE_MODEf, mode); 30303 } 30304 30305 if (regval_new != regval_old) { 30306 BCM_IF_ERROR_RETURN 30307 (soc_reg32_set(unit, reg, REG_PORT_ANY, slice_idx, regval_new)); 30308 } 30309 30310 return BCM_E_NONE; 30311 } 30312 30313 /* 30314 * Function: 30315 * _field_th_stage_slice_enable_set 30316 * 30317 * Purpose: 30318 * Enables or disables packet lookup on a hardware slice for 30319 * VFP and EFP stages. 30320 * 30321 * Parameters: 30322 * unit - (IN) BCM device number. 30323 * fg - (IN) Reference to Group Structure. 30324 * fs - (IN) Reference to Slice Structure. 30325 * enable - (IN) enable/disable state of slice. 30326 * 30327 * Returns: 30328 * BCM_E_NONE - Success 30329 * BCM_E_INTERNAL - SOC read/write error 30330 * 30331 * Note: 30332 * Calling function is responsible for checking feature availability. 30333 */ 30334 int 30335 _field_th_stage_slice_enable_set(int unit, _field_group_t *fg, 30336 int slice, int enable) 30337 { 30338 int inst; 30339 soc_reg_t reg; 30340 _field_stage_t *stage_fc; 30341 uint32 val; 30342 30343 static soc_field_t lookup_enable_field[4] = {LOOKUP_ENABLE_SLICE_0f, 30344 LOOKUP_ENABLE_SLICE_1f, 30345 LOOKUP_ENABLE_SLICE_2f, 30346 LOOKUP_ENABLE_SLICE_3f}; 30347 30348 static soc_field_t slice_enable_field[4] = {SLICE_ENABLE_SLICE_0f, 30349 SLICE_ENABLE_SLICE_1f, 30350 SLICE_ENABLE_SLICE_2f, 30351 SLICE_ENABLE_SLICE_3f}; 30352 30353 if (NULL == fg) { 30354 return (BCM_E_PARAM); 30355 } 30356 30357 /* Validate slice. */ 30358 if (slice < 0 || slice >= COUNTOF(slice_enable_field)) { 30359 return (BCM_E_PARAM); 30360 } 30361 30362 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, 30363 fg->stage_id, &stage_fc)); 30364 30365 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 30366 inst = _FP_GLOBAL_INST; 30367 } else { 30368 inst = fg->instance; 30369 } 30370 30371 switch (fg->stage_id) { 30372 case _BCM_FIELD_STAGE_LOOKUP: 30373 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 30374 VFP_SLICE_CONTROLr, 30375 inst, ®)); 30376 break; 30377 case _BCM_FIELD_STAGE_EGRESS: 30378 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 30379 EFP_SLICE_CONTROLr, 30380 inst, ®)); 30381 break; 30382 default: 30383 return BCM_E_INTERNAL; 30384 } 30385 30386 val = (enable ? 1 : 0); 30387 30388 /* SW WAR for TH3-5323 */ 30389 if ((soc_feature(unit, soc_feature_th3_style_fp)) && 30390 (fg->stage_id == _BCM_FIELD_STAGE_LOOKUP)) { 30391 30392 BCM_IF_ERROR_RETURN(soc_reg_fields32_modify(unit, reg, REG_PORT_ANY, 1, 30393 &slice_enable_field[slice], &val)); 30394 } 30395 30396 BCM_IF_ERROR_RETURN(soc_reg_fields32_modify(unit, reg, REG_PORT_ANY, 1, 30397 &lookup_enable_field[slice], &val)); 30398 30399 return (BCM_E_NONE); 30400 } 30401 30402 /* 30403 * Function: 30404 * _bcm_field_th_slice_enable_set 30405 * 30406 * Purpose: 30407 * Enables or disables packet lookup on a hardware slice. 30408 * 30409 * Parameters: 30410 * unit - (IN) BCM device number 30411 * fg - (IN) Reference to Group Structure. 30412 * fs - (IN) Reference to Slice Structure. 30413 * enable - (IN) enable/disable state of slice. 30414 * 30415 * Returns: 30416 * BCM_E_NONE - SUCCESS 30417 * BCM_E_INTERNAL - SOC read/write error 30418 * 30419 * Note: 30420 * Calling function is responsible for checking feature availability. 30421 */ 30422 int 30423 _bcm_field_th_slice_enable_set(int unit, 30424 _field_group_t *fg, 30425 _field_slice_t *fs, 30426 uint8 enable) 30427 { 30428 if (NULL == fg || NULL == fs) { 30429 return (BCM_E_PARAM); 30430 } 30431 30432 switch (fg->stage_id) { 30433 case _BCM_FIELD_STAGE_INGRESS: 30434 return 30435 (_field_th_ingress_slice_enable_set(unit, fg, 30436 fs->slice_number, enable)); 30437 break; 30438 case _BCM_FIELD_STAGE_LOOKUP: 30439 case _BCM_FIELD_STAGE_EGRESS: 30440 return 30441 (_field_th_stage_slice_enable_set(unit, fg, 30442 fs->slice_number, enable)); 30443 break; 30444 default: 30445 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META( 30446 "Invalid stage_id[%d].\n\r"), 30447 fg->stage_id)); 30448 break; 30449 } 30450 30451 return BCM_E_INTERNAL; 30452 } 30453 30454 /* 30455 * Function: 30456 * _bcm_field_th_qualify_class 30457 * Purpose: 30458 * Qualifies field entry classifier id data and mask value 30459 * Parameters: 30460 * unit - (IN) BCM device number 30461 * entry - (IN) Field entry identifier 30462 * data - (IN) Classifier ID lookup key value 30463 * mask - (IN) Classifier ID lookup mask value 30464 * Returns: 30465 * BCM_E_XXXX 30466 */ 30467 int 30468 _bcm_field_th_qualify_class(int unit, 30469 bcm_field_entry_t entry, 30470 bcm_field_qualify_t qual, 30471 uint32 *data, 30472 uint32 *mask) 30473 { 30474 _field_entry_t *f_ent; 30475 uint32 cl_width, cl_max; 30476 uint32 ifp_cl_type; /* IFP Class Type propagted to EFP. */ 30477 30478 /* Get field entry part that contains the qualifier. */ 30479 BCM_IF_ERROR_RETURN(_bcm_field_entry_qual_get(unit, entry, qual, &f_ent)); 30480 30481 switch (f_ent->group->stage_id) { 30482 case _BCM_FIELD_STAGE_INGRESS: 30483 case _BCM_FIELD_STAGE_EXACTMATCH: 30484 case _BCM_FIELD_STAGE_FLOWTRACKER: 30485 switch (qual) { 30486 /* Class IDs from L2 Entry Table (10) */ 30487 case bcmFieldQualifySrcClassL2: 30488 case bcmFieldQualifyDstClassL2: 30489 cl_width = 10; 30490 break; 30491 /* Class fields from VFP_CLASS_ID_HI */ 30492 case bcmFieldQualifySrcClassField: 30493 /* Class fields from VFP_CLASS_ID_L0 */ 30494 case bcmFieldQualifyDstClassField: 30495 cl_width = 10; 30496 break; 30497 /* Class IDs from L3 Entry table (12) */ 30498 case bcmFieldQualifySrcClassL3: 30499 cl_width = 10; 30500 break; 30501 case bcmFieldQualifyDstClassL3: 30502 cl_width = 10; 30503 break; 30504 /* Class ID from VLAN table (12) */ 30505 case bcmFieldQualifyInterfaceClassL2: 30506 /* Class ID from L3_IIF (12) */ 30507 case bcmFieldQualifyInterfaceClassL3: 30508 /* Class ID from Port Table (12) */ 30509 case bcmFieldQualifyInterfaceClassPort: 30510 /* Class ID from SVP (12) */ 30511 case bcmFieldQualifyInterfaceClassVPort: 30512 cl_width = 12; 30513 break; 30514 case bcmFieldQualifyGroupClass: 30515 cl_width = 2; 30516 break; 30517 case bcmFieldQualifyUdfClass: 30518 case bcmFieldQualifyInterfaceLookupClassPort: 30519 case bcmFieldQualifyInterfaceIngressKeySelectClassPort: 30520 cl_width = 8; 30521 break; 30522 default: 30523 return (BCM_E_INTERNAL); 30524 } 30525 30526 cl_max = 1 << cl_width; 30527 30528 if (*data >= cl_max) { 30529 return (BCM_E_PARAM); 30530 } 30531 break; 30532 30533 case _BCM_FIELD_STAGE_LOOKUP: 30534 return 30535 (_bcm_field_td2_qualify_class(unit, entry, qual, 30536 data, mask)); 30537 case _BCM_FIELD_STAGE_EGRESS: 30538 cl_width = 9; 30539 /* Need to set IFP_CLASS_TYPE in TCAM (upper 4 bits) */ 30540 switch (qual) { 30541 case bcmFieldQualifySrcClassL2: 30542 ifp_cl_type = 6; 30543 break; 30544 case bcmFieldQualifySrcClassL3: 30545 ifp_cl_type = 8; 30546 break; 30547 case bcmFieldQualifySrcClassField: 30548 ifp_cl_type = 4; 30549 break; 30550 case bcmFieldQualifyDstClassL2: 30551 ifp_cl_type = 7; 30552 break; 30553 case bcmFieldQualifyDstClassL3: 30554 ifp_cl_type = 9; 30555 break; 30556 case bcmFieldQualifyDstClassField: 30557 ifp_cl_type = 5; 30558 break; 30559 case bcmFieldQualifyInterfaceClassL2: 30560 ifp_cl_type = 10; 30561 break; 30562 case bcmFieldQualifyInterfaceClassL3: 30563 ifp_cl_type = 3; 30564 break; 30565 case bcmFieldQualifyIngressClassField: 30566 ifp_cl_type = 15; 30567 break; 30568 case bcmFieldQualifyIngressInterfaceClassPort: 30569 ifp_cl_type = 1; 30570 break; 30571 case bcmFieldQualifyIngressInterfaceClassVPort: 30572 ifp_cl_type = 2; 30573 break; 30574 case bcmFieldQualifyEgressClass: 30575 case bcmFieldQualifyEgressClassL3Interface: 30576 case bcmFieldQualifyEgressClassTrill: 30577 case bcmFieldQualifyEgressClassL2Gre: 30578 case bcmFieldQualifyEgressClassVxlan: 30579 case bcmFieldQualifyEgressClassTunnel: 30580 case bcmFieldQualifyEgressClassL3InterfaceTunnel: 30581 30582 cl_width = 12; 30583 ifp_cl_type = 0; 30584 break; 30585 default: 30586 return (BCM_E_INTERNAL); 30587 } 30588 30589 cl_max = 1 << cl_width; 30590 30591 if (*data >= cl_max || (*mask != BCM_FIELD_EXACT_MATCH_MASK && *mask >= cl_max)) { 30592 return (BCM_E_PARAM); 30593 } 30594 30595 if (ifp_cl_type) { 30596 *data |= ifp_cl_type << cl_width; 30597 *mask |= 0xf << cl_width; 30598 } 30599 break; 30600 default: 30601 return (BCM_E_INTERNAL); 30602 } 30603 30604 return (BCM_E_NONE); 30605 } 30606 30607 /* 30608 * Function: 30609 * _bcm_field_th_qualify_class_get 30610 * Purpose: 30611 * Retrieve field entry classifier id data and mask values 30612 * Parameters: 30613 * unit - (IN) BCM device number 30614 * entry - (IN) Field entry identifier 30615 * qual - (IN) Field entry qualifier enumeration 30616 * data - (IN/OUT) Classifier ID lookup key value 30617 * mask - (IN/OUT) Classifier ID lookup mask value 30618 * Returns: 30619 * BCM_E_XXXX 30620 */ 30621 int 30622 _bcm_field_th_qualify_class_get(int unit, 30623 bcm_field_entry_t entry, 30624 bcm_field_qualify_t qual, 30625 uint32 *data, 30626 uint32 *mask 30627 ) 30628 { 30629 _field_entry_t *f_ent; 30630 const uint32 m = (1 << 9) - 1; 30631 30632 /* Get field entry part that contains the qualifier. */ 30633 BCM_IF_ERROR_RETURN(_bcm_field_entry_qual_get(unit, entry, qual, &f_ent)); 30634 30635 if (f_ent->group->stage_id == _BCM_FIELD_STAGE_EGRESS) { 30636 switch (qual) { 30637 case bcmFieldQualifySrcClassL2: 30638 case bcmFieldQualifySrcClassL3: 30639 case bcmFieldQualifySrcClassField: 30640 case bcmFieldQualifyDstClassL2: 30641 case bcmFieldQualifyDstClassL3: 30642 case bcmFieldQualifyDstClassField: 30643 case bcmFieldQualifyInterfaceClassL2: 30644 case bcmFieldQualifyInterfaceClassL3: 30645 case bcmFieldQualifyIngressClassField: 30646 case bcmFieldQualifyIngressInterfaceClassPort: 30647 case bcmFieldQualifyIngressInterfaceClassVPort: 30648 /* Mask off IFP_CLASSID_TYPE */ 30649 *data &= m; 30650 *mask &= m; 30651 break; 30652 default: 30653 break; 30654 } 30655 } 30656 30657 return (BCM_E_NONE); 30658 } 30659 30660 /* 30661 * Function: _bcm_field_th_ForwardingType_set 30662 * 30663 * Purpose: 30664 * Add qualification data to an entry for IP Type. 30665 * 30666 * Parameters: 30667 * unit - (IN) BCM unit number. 30668 * stage_id - (IN) Stage ID. 30669 * entry - (IN) Entry ID. 30670 * type - (IN) Forwarding type. 30671 * data - (OUT) Data. 30672 * mask - (OUT) Mask. 30673 * 30674 * Returns: 30675 * BCM_E_XXX 30676 */ 30677 int 30678 _bcm_field_th_forwardingType_set(int unit, _field_stage_id_t stage_id, 30679 bcm_field_entry_t entry, 30680 bcm_field_ForwardingType_t type, 30681 uint32 *data, uint32 *mask) 30682 { 30683 30684 if (NULL == data || NULL == mask) { 30685 return BCM_E_PARAM; 30686 } 30687 30688 switch (stage_id) { 30689 case _BCM_FIELD_STAGE_INGRESS: 30690 case _BCM_FIELD_STAGE_EXACTMATCH: 30691 switch (type) { 30692 case bcmFieldForwardingTypeAny: 30693 *data = 0; 30694 *mask = 0; 30695 break; 30696 case bcmFieldForwardingTypeL2: 30697 *data = 0; 30698 *mask = 0xE; 30699 break; 30700 case bcmFieldForwardingTypeL2Independent: 30701 *data = 0; 30702 *mask = 0xF; 30703 break; 30704 case bcmFieldForwardingTypeL2Shared: 30705 *data = 1; 30706 *mask = 0xF; 30707 break; 30708 case bcmFieldForwardingTypeL2Vpn: 30709 *data = 2; 30710 *mask = 0xF; 30711 break; 30712 case bcmFieldForwardingTypeL2VpnDirect: 30713 *data = 3; 30714 *mask = 0xF; 30715 break; 30716 case bcmFieldForwardingTypeL3Direct: 30717 *data = 4; 30718 *mask = 0xF; 30719 break; 30720 case bcmFieldForwardingTypeL3: 30721 *data = 5; 30722 *mask = 0xF; 30723 break; 30724 case bcmFieldForwardingTypePortExtender: 30725 *data = 6; 30726 *mask = 0xF; 30727 break; 30728 case bcmFieldForwardingTypeMpls: 30729 *data = 7; 30730 *mask = 0xF; 30731 break; 30732 case bcmFieldForwardingTypeTrill: 30733 *data = 8; 30734 *mask = 0xF; 30735 break; 30736 default: 30737 return (BCM_E_PARAM); 30738 } 30739 break; 30740 default: 30741 return BCM_E_INTERNAL; 30742 } 30743 30744 return BCM_E_NONE; 30745 } 30746 30747 /* 30748 * Function: 30749 * _bcm_field_th_forwardingType_get 30750 * Purpose: 30751 * Get match criteria for bcmFieildQualifyForwardingType 30752 * qualifier from the field entry. 30753 * Parameters: 30754 * unit - (IN) Unit number. 30755 * stage_id - (IN) Stage ID. 30756 * entry - (IN) BCM field entry id. 30757 * type - (OUT) Qualifier match forwarding type. 30758 * Returns: 30759 * BCM_E_XXX 30760 * Notes: 30761 */ 30762 int 30763 _bcm_field_th_forwardingType_get(int unit, _field_stage_id_t stage_id, 30764 bcm_field_entry_t entry, 30765 uint32 data, uint32 mask, 30766 bcm_field_ForwardingType_t *type) 30767 { 30768 if (NULL == type) { 30769 return BCM_E_PARAM; 30770 } 30771 30772 switch (stage_id) { 30773 case _BCM_FIELD_STAGE_INGRESS: 30774 case _BCM_FIELD_STAGE_EXACTMATCH: 30775 if ((0 == data) && (mask == 0)) { 30776 *type = bcmFieldForwardingTypeAny; 30777 } else if ((0 == data) && (mask == 0xE)) { 30778 *type = bcmFieldForwardingTypeL2; 30779 } else if ((0 == data) && (mask == 0xF)) { 30780 *type = bcmFieldForwardingTypeL2Independent; 30781 } else if ((1 == data) && (mask == 0xF)) { 30782 *type = bcmFieldForwardingTypeL2Shared; 30783 } else if ((2 == data) && (mask == 0xF)) { 30784 *type = bcmFieldForwardingTypeL2Vpn; 30785 } else if ((3 == data) && (mask == 0xF)) { 30786 *type = bcmFieldForwardingTypeL2VpnDirect; 30787 } else if ((4 == data) && (mask == 0xF)) { 30788 *type = bcmFieldForwardingTypeL3Direct; 30789 } else if ((5 == data) && (mask == 0xF)) { 30790 *type = bcmFieldForwardingTypeL3; 30791 } else if ((6 == data) && (mask == 0xF)) { 30792 *type = bcmFieldForwardingTypePortExtender; 30793 } else if ((7 == data) && (mask == 0xF)) { 30794 *type = bcmFieldForwardingTypeMpls; 30795 } else if ((8 == data) && (mask == 0xF)) { 30796 *type = bcmFieldForwardingTypeTrill; 30797 } else { 30798 return (BCM_E_INTERNAL); 30799 } 30800 break; 30801 default: 30802 return BCM_E_INTERNAL; 30803 } 30804 30805 return BCM_E_NONE; 30806 } 30807 30808 /* 30809 * Function: 30810 * _bcm_field_th_qualify_svp 30811 * Purpose: 30812 * Add source virtual port field qualification to a field entry. 30813 * Parameters: 30814 * unit - (IN) Unit number. 30815 * entry - (IN) BCM field entry id. 30816 * qual - (IN) SVP Qualifier type 30817 * data - (IN) SVP data 30818 * mask - (IN) SVP Mask 30819 * svp_valid - (IN) Indication to SVP Valid field 30820 * Returns: 30821 * BCM_E_XXX 30822 * Notes: 30823 */ 30824 int 30825 _bcm_field_th_qualify_svp(int unit, bcm_field_entry_t entry, 30826 bcm_field_qualify_t qual, 30827 uint32 data, uint32 mask, 30828 int svp_valid) 30829 { 30830 int rv; /* Operational Status */ 30831 _field_entry_t *f_ent; /* Field entry structure. */ 30832 _bcm_field_qual_offset_t *q_offset; /* Field qualifier offset info. */ 30833 30834 /* Get the field entry operational structure. */ 30835 BCM_IF_ERROR_RETURN(_bcm_field_entry_qual_get(unit, entry, 30836 qual, &f_ent)); 30837 30838 /* Get qualifier offsets in the tcam. */ 30839 rv = _field_qual_offset_get(unit, f_ent, qual, &q_offset); 30840 BCM_IF_ERROR_RETURN(rv); 30841 30842 if (mask == (uint32)BCM_FIELD_EXACT_MATCH_MASK) { 30843 uint32 multi_width; 30844 30845 _BCM_FIELD_QUAL_MULTI_OFFSET_WIDTH(q_offset, multi_width); 30846 30847 /* Exact match requested, make maximum mask value */ 30848 mask = (1 << multi_width) - 1; 30849 } 30850 30851 /* coverity[address_of : FALSE] */ 30852 /* coverity[callee_ptr_arith : FALSE] */ 30853 rv = _bcm_field_th_qualify_set(unit, entry, qual, &data, &mask, 30854 _FP_QUALIFIER_ADD); 30855 BCM_IF_ERROR_RETURN(rv); 30856 30857 f_ent->flags |= _FP_ENTRY_DIRTY; 30858 return (BCM_E_NONE); 30859 } 30860 30861 /* 30862 * Function: 30863 * _bcm_field_th_qualify_dvp 30864 * Purpose: 30865 * Add destination virtual port field qualification to a field entry. 30866 * Parameters: 30867 * unit - (IN) Unit number. 30868 * entry - (IN) BCM field entry id. 30869 * qual - (IN) SVP Qualifier type 30870 * data - (IN) SVP data 30871 * mask - (IN) SVP Mask 30872 * dvp_valid - (IN) Indication to DVP Valid field 30873 * Returns: 30874 * BCM_E_XXX 30875 * Notes: 30876 */ 30877 int 30878 _bcm_field_th_qualify_dvp(int unit, 30879 bcm_field_entry_t entry, 30880 bcm_field_qualify_t qual, 30881 uint32 data, uint32 mask, 30882 int dvp_valid) 30883 { 30884 int rv; /* Operational Status */ 30885 _field_entry_t *f_ent; /* Field entry structure. */ 30886 _bcm_field_qual_offset_t *q_offset; /* Field qualifier offset info. */ 30887 30888 30889 /* Get the field entry operational structure. */ 30890 BCM_IF_ERROR_RETURN(_bcm_field_entry_qual_get(unit, entry, 30891 qual, &f_ent)); 30892 30893 /* Get qualifier offsets in the tcam. */ 30894 rv = _field_qual_offset_get(unit, f_ent, qual, &q_offset); 30895 BCM_IF_ERROR_RETURN(rv); 30896 30897 if (mask == (uint32)BCM_FIELD_EXACT_MATCH_MASK) { 30898 uint32 multi_width; 30899 30900 _BCM_FIELD_QUAL_MULTI_OFFSET_WIDTH(q_offset, multi_width); 30901 /* Exact match requested, make maximum mask value */ 30902 mask = (1 << multi_width) - 1; 30903 } 30904 30905 /* coverity[address_of : FALSE] */ 30906 /* coverity[callee_ptr_arith : FALSE] */ 30907 rv = _bcm_field_th_qualify_set(unit, entry, qual, &data, &mask, 30908 _FP_QUALIFIER_ADD); 30909 BCM_IF_ERROR_RETURN(rv); 30910 30911 f_ent->flags |= _FP_ENTRY_DIRTY; 30912 return (BCM_E_NONE); 30913 } 30914 30915 /* 30916 * Function: 30917 * _bcm_field_th_qualify_trunk 30918 * Purpose: 30919 * Match on Source or Destination Trunk in Field Processor. 30920 * Parameters: 30921 * unit - (IN) Unit number. 30922 * entry - (IN) BCM field entry id. 30923 * qual - (IN) Trunk Qualifier type 30924 * data - (IN) Trunk data 30925 * mask - (IN) Trunk Mask 30926 * Returns: 30927 * BCM_E_XXX 30928 * Notes: 30929 */ 30930 int 30931 _bcm_field_th_qualify_trunk(int unit, 30932 bcm_field_entry_t entry, 30933 bcm_field_qualify_t qual, 30934 bcm_trunk_t data, bcm_trunk_t mask) 30935 { 30936 int rv; /* Operational Status. */ 30937 uint32 hw_data = 0; /* HW buffer data. */ 30938 uint32 hw_mask = 0; /* HW buffer mask. */ 30939 _field_entry_t *f_ent; /* Field entry structure. */ 30940 30941 30942 TRUNK_CHK_TGID_EXTENDED(unit, data); 30943 30944 rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent); 30945 BCM_IF_ERROR_RETURN(rv); 30946 30947 if ((_BCM_FIELD_STAGE_INGRESS == f_ent->group->stage_id) || 30948 (_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id)) { 30949 30950 /* set the trunk bit */ 30951 hw_data = data | (0x1 << SOC_TRUNK_BIT_POS(unit)); 30952 hw_mask = mask | (0x1 << SOC_TRUNK_BIT_POS(unit)); 30953 30954 /* coverity[address_of : FALSE] */ 30955 /* coverity[callee_ptr_arith : FALSE] */ 30956 rv = _bcm_field_th_qualify_set(unit, entry, qual, &hw_data, &hw_mask, 30957 _FP_QUALIFIER_ADD); 30958 BCM_IF_ERROR_RETURN(rv); 30959 30960 f_ent->flags |= _FP_ENTRY_DIRTY; 30961 } else { 30962 return _bcm_field_qualify_trunk(unit, entry, qual, data, mask); 30963 } 30964 30965 return (BCM_E_NONE); 30966 } 30967 30968 /* 30969 * Function: 30970 * _bcm_field_th_qualify_trunk_get 30971 * Purpose: 30972 * Get Source or Destination Trunk qualified in Field Processor Key. 30973 * Parameters: 30974 * unit - (IN) Unit number. 30975 * entry - (IN) BCM field entry id. 30976 * qual - (IN) Trunk Qualifier type 30977 * data - (OUT) Trunk data 30978 * mask - (OUT) Trunk Mask 30979 * Returns: 30980 * BCM_E_XXX 30981 * Notes: 30982 */ 30983 30984 int 30985 _bcm_field_th_qualify_trunk_get(int unit, 30986 bcm_field_entry_t entry, 30987 bcm_field_qualify_t qual, 30988 bcm_trunk_t *data, bcm_trunk_t *mask) 30989 { 30990 int rv; /* Operational Status. */ 30991 uint32 hw_data = 0; /* HW buffer data. */ 30992 uint32 hw_mask = 0; /* HW buffer mask. */ 30993 _field_entry_t *f_ent; /* Field entry structure. */ 30994 30995 30996 /* Input parameters check. */ 30997 if ((NULL == data) || (NULL == mask)) { 30998 return (BCM_E_PARAM); 30999 } 31000 31001 if ((qual != bcmFieldQualifySrcTrunk) && (qual != bcmFieldQualifyDstTrunk)) { 31002 return (BCM_E_INTERNAL); 31003 } 31004 31005 rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent); 31006 BCM_IF_ERROR_RETURN(rv); 31007 31008 if ((_BCM_FIELD_STAGE_INGRESS == f_ent->group->stage_id) || 31009 (_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id)) { 31010 31011 /* Read qualifier match value and mask. */ 31012 rv = _bcm_field_entry_qualifier_uint32_get(unit, entry, qual, 31013 &hw_data, &hw_mask); 31014 31015 /* set the trunk bit */ 31016 *data = hw_data & ~(0x1 << SOC_TRUNK_BIT_POS(unit)); 31017 *mask = hw_mask & ~(0x1 << SOC_TRUNK_BIT_POS(unit)); 31018 31019 } else { 31020 return _bcm_field_qualify_trunk_get(unit, entry, qual, data, mask); 31021 } 31022 31023 return (BCM_E_NONE); 31024 } 31025 31026 /* 31027 * Function: 31028 * _bcm_field_th_qualify_PortBitmap 31029 * Purpose: 31030 * Match on IPBM Source bitmap for the given bitmap. 31031 * Parameters: 31032 * unit - (IN) Unit number. 31033 * entry - (IN) BCM field entry id. 31034 * qual - (IN) IPBM Qualifier type 31035 * data - (IN) IPBM data 31036 * mask - (IN) IPBM Mask 31037 * Returns: 31038 * BCM_E_XXX 31039 * Notes: 31040 */ 31041 STATIC int 31042 _bcm_field_th_qualify_PortBitmap(int unit, 31043 bcm_field_entry_t entry, 31044 bcm_field_qualify_t qual, 31045 bcm_pbmp_t data, 31046 bcm_pbmp_t mask) 31047 { 31048 int rv; /* Operational Status. */ 31049 uint8 instance; /* Field group pipe information. */ 31050 bcm_port_t port; /* Holds physical port number. */ 31051 bcm_pbmp_t temp_pbm; /* Holds valid pbm supported. */ 31052 bcm_pbmp_t valid_pbm; /* Holds valid pbm supported */ 31053 _field_stage_t *stage_fc; /* Stage operational Structure. */ 31054 _field_group_t *fg; /* Field group structure. */ 31055 _field_entry_t *f_ent; /* Field entry structure. */ 31056 31057 /* Validate the qualifier. */ 31058 if (!_BCM_FIELD_IS_PBMP_QUALIFIER(qual)) { 31059 return BCM_E_PARAM; 31060 } 31061 31062 /* Get field entry structure pointer. */ 31063 rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent); 31064 BCM_IF_ERROR_RETURN(rv); 31065 31066 fg = f_ent->group; 31067 /* Get the stage control structure. */ 31068 rv = _field_stage_control_get(unit, fg->stage_id, &stage_fc); 31069 BCM_IF_ERROR_RETURN(rv); 31070 31071 /* Confirm that InPorts/PortBitmap Qualifiers are in group's Qset. */ 31072 if (!_BCM_FIELD_QSET_PBMP_TEST(fg->qset)) { 31073 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 31074 "Error: %s not in Group=%d Qset.\n"), 31075 _field_qual_name(qual), fg->gid)); 31076 return (BCM_E_NOT_FOUND); 31077 } 31078 31079 if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) { 31080 instance = fg->instance; 31081 } else { 31082 /* 31083 * In-case of Atomic update, InPorts/PortBitmap qualifiers are not 31084 * support in Global mode. 31085 */ 31086 if (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == TRUE) { 31087 return BCM_E_UNAVAIL; 31088 } 31089 31090 instance = _BCM_FIELD_GLOBAL_GROUP; 31091 } 31092 31093 BCM_PBMP_CLEAR(valid_pbm); 31094 /* Retreive Valid PBMP for the given pipe */ 31095 _BCM_FIELD_VALID_PIPE_PBMP_GET(unit, instance, valid_pbm); 31096 31097 /* Validate data */ 31098 BCM_PBMP_ASSIGN(temp_pbm, valid_pbm); 31099 BCM_PBMP_OR(temp_pbm, data); 31100 if (BCM_PBMP_NEQ(temp_pbm, valid_pbm)) { 31101 return BCM_E_PARAM; 31102 } 31103 31104 /* 31105 * Check and clear invalid ports in the mask. 31106 */ 31107 BCM_PBMP_AND(valid_pbm, mask); 31108 BCM_PBMP_ASSIGN(mask, valid_pbm); 31109 31110 BCM_PBMP_CLEAR(f_ent->pbmp.data); 31111 BCM_PBMP_CLEAR(f_ent->pbmp.mask); 31112 31113 switch (instance) { 31114 case _BCM_FIELD_PIPE0_GROUP: 31115 case _BCM_FIELD_PIPE1_GROUP: 31116 case _BCM_FIELD_PIPE2_GROUP: 31117 case _BCM_FIELD_PIPE3_GROUP: 31118 case _BCM_FIELD_PIPE4_GROUP: 31119 case _BCM_FIELD_PIPE5_GROUP: 31120 case _BCM_FIELD_PIPE6_GROUP: 31121 case _BCM_FIELD_PIPE7_GROUP: 31122 31123 BCM_PBMP_ITER(data, port) { 31124 if ((port - (_FP_TCAM_IPBMP_SIZE(unit) * instance)) < 0) { 31125 return BCM_E_PARAM; 31126 } 31127 BCM_PBMP_PORT_ADD(f_ent->pbmp.data, port - 31128 (_FP_TCAM_IPBMP_SIZE(unit) * f_ent->group->instance)); 31129 } 31130 BCM_PBMP_ITER(mask, port) { 31131 if ((port - (_FP_TCAM_IPBMP_SIZE(unit) * instance)) < 0) { 31132 return BCM_E_PARAM; 31133 } 31134 BCM_PBMP_PORT_ADD(f_ent->pbmp.mask, port - 31135 (_FP_TCAM_IPBMP_SIZE(unit) * f_ent->group->instance)); 31136 } 31137 break; 31138 case _BCM_FIELD_GLOBAL_GROUP: 31139 BCM_PBMP_ASSIGN(f_ent->pbmp.data, data); 31140 BCM_PBMP_ASSIGN(f_ent->pbmp.mask, mask); 31141 break; 31142 default: 31143 return BCM_E_INTERNAL; 31144 } 31145 31146 if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) { 31147 /* coverity[address_of : FALSE] */ 31148 /* coverity[callee_ptr_arith : FALSE] */ 31149 rv = _bcm_field_th_qualify_set(unit, entry, qual, 31150 (uint32 *)&f_ent->pbmp.data, 31151 (uint32 *)&f_ent->pbmp.mask, 31152 _FP_QUALIFIER_ADD); 31153 BCM_IF_ERROR_RETURN(rv); 31154 } 31155 31156 f_ent->flags |= _FP_ENTRY_DIRTY; 31157 31158 return BCM_E_NONE; 31159 } 31160 31161 31162 31163 /* 31164 * Function: 31165 * _bcm_field_th_qualify_InPorts 31166 * Purpose: 31167 * Match on Source or Destination Trunk in Field Processor. 31168 * Parameters: 31169 * unit - (IN) Unit number. 31170 * entry - (IN) BCM field entry id. 31171 * qual - (IN) IPBM Qualifier type 31172 * data - (IN) IPBM data 31173 * mask - (IN) IPBM Mask 31174 * Returns: 31175 * BCM_E_XXX 31176 * Notes: 31177 */ 31178 int 31179 _bcm_field_th_qualify_InPorts(int unit, 31180 bcm_field_entry_t entry, 31181 bcm_field_qualify_t qual, 31182 bcm_pbmp_t data, 31183 bcm_pbmp_t mask) 31184 { 31185 int rv; /* Operational Status. */ 31186 uint8 instance; /* Field group pipe information. */ 31187 bcm_port_t port; /* Holds physical port number. */ 31188 bcm_pbmp_t temp_pbm; /* Holds valid pbm supported. */ 31189 bcm_pbmp_t valid_pbm; /* Holds valid pbm supported */ 31190 _field_stage_t *stage_fc; /* Stage operational Structure. */ 31191 _field_group_t *fg; /* Field group structure. */ 31192 _field_entry_t *f_ent; /* Field entry structure. */ 31193 31194 /* Validate the qualifier. */ 31195 if (!_BCM_FIELD_IS_PBMP_QUALIFIER(qual)) { 31196 return BCM_E_PARAM; 31197 } 31198 31199 if (qual != bcmFieldQualifyInPorts) { 31200 return _bcm_field_th_qualify_PortBitmap(unit, entry, qual, data, mask); 31201 } 31202 if (soc_feature(unit, soc_feature_ifp_no_inports_support) 31203 && qual == bcmFieldQualifyInPorts) { 31204 return (BCM_E_UNAVAIL); 31205 } 31206 /* Get field entry structure pointer. */ 31207 rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent); 31208 BCM_IF_ERROR_RETURN(rv); 31209 31210 fg = f_ent->group; 31211 /* Get the stage control structure. */ 31212 rv = _field_stage_control_get(unit, fg->stage_id, &stage_fc); 31213 BCM_IF_ERROR_RETURN(rv); 31214 31215 /* Confirm that InPorts/PortBitmap Qualifiers are in group's Qset. */ 31216 if (!_BCM_FIELD_QSET_PBMP_TEST(fg->qset)) { 31217 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 31218 "Error: %s not in Group=%d Qset.\n"), 31219 _field_qual_name(qual), fg->gid)); 31220 return (BCM_E_NOT_FOUND); 31221 } 31222 31223 if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) { 31224 instance = fg->instance; 31225 /* Retreive Valid Pipe PBMP */ 31226 BCM_PBMP_ASSIGN(valid_pbm, PBMP_PIPE(unit, fg->instance)); 31227 BCM_PBMP_REMOVE(valid_pbm, PBMP_LB(unit)); 31228 } else { 31229 /* 31230 * In-case of Atomic update, InPorts/PortBitmap qualifiers are not 31231 * support in Global mode. 31232 */ 31233 if (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == TRUE) { 31234 return BCM_E_UNAVAIL; 31235 } 31236 31237 instance = _BCM_FIELD_GLOBAL_GROUP; 31238 /* Retreive Valid PBMP for all the ports */ 31239 BCM_PBMP_CLEAR(valid_pbm); 31240 BCM_IF_ERROR_RETURN(_bcm_field_valid_pbmp_get(unit, &valid_pbm)); 31241 } 31242 31243 /* Validate data */ 31244 BCM_PBMP_ASSIGN(temp_pbm, valid_pbm); 31245 BCM_PBMP_AND(temp_pbm, data); 31246 if (BCM_PBMP_NEQ(temp_pbm, data)) { 31247 return BCM_E_PARAM; 31248 } 31249 31250 /* 31251 * Check and clear invalid ports in the mask. 31252 */ 31253 BCM_PBMP_AND(valid_pbm, mask); 31254 BCM_PBMP_ASSIGN(mask, valid_pbm); 31255 /* 31256 * Add Loopback ports to mask so that Loopback packets 31257 * will not hit entry if InPorts is qualified. 31258 */ 31259 if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) { 31260 bcm_pbmp_t pipe_lb_mask; 31261 int prt_no; 31262 BCM_PBMP_CLEAR(pipe_lb_mask); 31263 /* Getting Loopback PBM per pipe */ 31264 for (prt_no = instance * _FP_TCAM_IPBMP_SIZE(unit); 31265 prt_no < (instance + 1) * _FP_TCAM_IPBMP_SIZE(unit); prt_no++) { 31266 BCM_PBMP_PORT_ADD(pipe_lb_mask, prt_no); 31267 } 31268 BCM_PBMP_AND(pipe_lb_mask, PBMP_LB(unit)); 31269 BCM_PBMP_OR(mask, pipe_lb_mask); 31270 } else { 31271 BCM_PBMP_OR(mask, PBMP_LB(unit)); 31272 } 31273 31274 31275 BCM_PBMP_CLEAR(f_ent->pbmp.data); 31276 BCM_PBMP_CLEAR(f_ent->pbmp.mask); 31277 31278 31279 switch (instance) { 31280 case _BCM_FIELD_PIPE0_GROUP: 31281 case _BCM_FIELD_PIPE1_GROUP: 31282 case _BCM_FIELD_PIPE2_GROUP: 31283 case _BCM_FIELD_PIPE3_GROUP: 31284 case _BCM_FIELD_PIPE4_GROUP: 31285 case _BCM_FIELD_PIPE5_GROUP: 31286 case _BCM_FIELD_PIPE6_GROUP: 31287 case _BCM_FIELD_PIPE7_GROUP: 31288 BCM_PBMP_ITER(data, port) { 31289 if ((port - (_FP_TCAM_IPBMP_SIZE(unit) * instance)) < 0) { 31290 return BCM_E_PARAM; 31291 } 31292 BCM_PBMP_PORT_ADD(f_ent->pbmp.data, port - 31293 (_FP_TCAM_IPBMP_SIZE(unit) 31294 * f_ent->group->instance)); 31295 } 31296 BCM_PBMP_ITER(mask, port) { 31297 if ((port - (_FP_TCAM_IPBMP_SIZE(unit) * instance)) < 0) { 31298 return BCM_E_PARAM; 31299 } 31300 BCM_PBMP_PORT_ADD(f_ent->pbmp.mask, port - 31301 (_FP_TCAM_IPBMP_SIZE(unit) 31302 * f_ent->group->instance)); 31303 } 31304 break; 31305 case _BCM_FIELD_GLOBAL_GROUP: 31306 BCM_PBMP_ITER(data, port) { 31307 BCM_PBMP_PORT_ADD(f_ent->pbmp.data, port); 31308 } 31309 BCM_PBMP_ITER(mask, port) { 31310 BCM_PBMP_PORT_ADD(f_ent->pbmp.mask, port); 31311 } 31312 break; 31313 default: 31314 return BCM_E_INTERNAL; 31315 } 31316 31317 if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) { 31318 /* coverity[address_of : FALSE] */ 31319 /* coverity[callee_ptr_arith : FALSE] */ 31320 rv = _bcm_field_th_qualify_set(unit, entry, qual, 31321 (uint32 *)&f_ent->pbmp.data, 31322 (uint32 *)&f_ent->pbmp.mask, 31323 _FP_QUALIFIER_ADD); 31324 BCM_IF_ERROR_RETURN(rv); 31325 } 31326 31327 f_ent->flags |= _FP_ENTRY_DIRTY; 31328 31329 return BCM_E_NONE; 31330 } 31331 31332 int 31333 _bcm_field_th_qualify_VlanTranslationHit(int unit, 31334 bcm_field_entry_t entry, 31335 uint8 *data, 31336 uint8 *mask) 31337 { 31338 _field_entry_t *f_ent = NULL; 31339 int (*func)(int, bcm_field_entry_t, uint8 *, uint8 *) = 31340 _field_qualify_VlanTranslationHit; 31341 31342 if (soc_feature(unit, soc_feature_field_preselector_support) && 31343 (_BCM_FIELD_IS_PRESEL_ENTRY(entry) == FALSE)) 31344 { 31345 BCM_IF_ERROR_RETURN(_field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent)); 31346 31347 #if defined(BCM_TRIDENT3_SUPPORT) 31348 if (soc_feature(unit, soc_feature_td3_style_fp) 31349 && (_BCM_FIELD_STAGE_EGRESS == f_ent->group->stage_id)) { 31350 func = _bcm_field_td3_qualify_VlanTranslationHit; 31351 } else 31352 #endif 31353 if (SOC_IS_TD2_TT2(unit) 31354 && (_BCM_FIELD_STAGE_EGRESS != f_ent->group->stage_id)) { 31355 func = _bcm_field_td2_qualify_VlanTranslationHit; 31356 } 31357 } else { 31358 func = _bcm_field_td2_qualify_VlanTranslationHit; 31359 } 31360 31361 BCM_IF_ERROR_RETURN((*func)(unit, entry, data, mask)); 31362 return BCM_E_NONE; 31363 31364 } 31365 /* 31366 * Function: 31367 * _bcm_field_th_entry_check_full_mask 31368 * Purpose: 31369 * To check if mask for qualifier is exact match mask 31370 * Parameters: 31371 * unit - (IN) BCM device number. 31372 * qid - (IN) Qualifier id. 31373 * stage_fc - (IN) Stage Control Structure. 31374 * mask - (IN) Qualifying Mask. 31375 * flags - (IN) Qualifier Flags. 31376 * Returns: 31377 * BCM_E_XXX 31378 */ 31379 int 31380 _bcm_field_th_entry_check_full_mask(int unit, int qid, 31381 _field_stage_t *stage_fc, 31382 uint32 *mask, uint8 flags) 31383 { 31384 int rv = BCM_E_NONE; /* BCM Operational Status. */ 31385 uint32 qual_width = 0; /* Actual Qualifier Width. */ 31386 uint32 keywords = 0; /* Width Keywords. */ 31387 uint32 leftover_width = 0; /* Qualifier Leftover width. */ 31388 uint32 idx = 0; /* Index for Iteration. */ 31389 uint32 mask_exact = ~0; /* Exact Match Mask. */ 31390 uint32 mask_orig = 0; /* Original Mask Data. */ 31391 31392 /* Input Parameter Check. */ 31393 if ((stage_fc == NULL) || 31394 (mask == NULL)) { 31395 return (BCM_E_PARAM); 31396 } 31397 31398 /* If Called for Delete then ignore. */ 31399 if (flags & _FP_QUALIFIER_DEL) { 31400 return (BCM_E_NONE); 31401 } 31402 31403 /* For Certain Qualifiers mask is internal. 31404 * It can be ignored. */ 31405 if ((qid == bcmFieldQualifyL2Format) || 31406 (qid == bcmFieldQualifyVlanTranslationHit) || 31407 (qid == bcmFieldQualifyForwardingType) || 31408 (qid == bcmFieldQualifyTunnelType) || 31409 (qid == bcmFieldQualifyLoopbackType) || 31410 (qid == bcmFieldQualifySrcModPortGport) || 31411 (qid == bcmFieldQualifySrcModPortGports) || 31412 (qid == bcmFieldQualifySrcModuleGport) || 31413 (qid == bcmFieldQualifySrcTrunkMemberGport) || 31414 (qid == bcmFieldQualifySrcTrunk) || 31415 (qid == bcmFieldQualifySrcMplsGport) || 31416 (qid == bcmFieldQualifySrcMplsGports) || 31417 (qid == bcmFieldQualifySrcMimGport) || 31418 (qid == bcmFieldQualifySrcMimGports) || 31419 (qid == bcmFieldQualifySrcWlanGport) || 31420 (qid == bcmFieldQualifySrcWlanGports) || 31421 (qid == bcmFieldQualifySrcVlanGport) || 31422 (qid == bcmFieldQualifySrcVlanGports) || 31423 (qid == bcmFieldQualifySrcVxlanGport) || 31424 (qid == bcmFieldQualifySrcVxlanGports) || 31425 (qid == bcmFieldQualifySrcNivGport) || 31426 (qid == bcmFieldQualifySrcNivGports) ) { 31427 return (BCM_E_NONE); 31428 } 31429 31430 /* For all data qualifiers exact match mask checks are done 31431 * in _field_qualify_data 31432 */ 31433 if ((qid == _bcmFieldQualifyData0) || 31434 (qid == _bcmFieldQualifyData1) || 31435 (qid == _bcmFieldQualifyData2) || 31436 (qid == _bcmFieldQualifyData3) || 31437 (qid == _bcmFieldQualifyData4) || 31438 (qid == _bcmFieldQualifyData5) || 31439 (qid == _bcmFieldQualifyData6) || 31440 (qid == _bcmFieldQualifyData7) || 31441 (qid == _bcmFieldQualifyData8) || 31442 (qid == _bcmFieldQualifyData9) || 31443 (qid == _bcmFieldQualifyData10) || 31444 (qid == _bcmFieldQualifyData11) || 31445 (qid == _bcmFieldQualifyData12) || 31446 (qid == _bcmFieldQualifyData13) || 31447 (qid == _bcmFieldQualifyData14) || 31448 (qid == _bcmFieldQualifyData15)) { 31449 return BCM_E_NONE; 31450 } 31451 31452 /* Check if qualifier database info is present. */ 31453 if((stage_fc->f_qual_arr[qid] != NULL) && 31454 (stage_fc->f_qual_arr[qid]->conf_arr != NULL)) { 31455 31456 /* Retreive Actual Qualifier Width. */ 31457 qual_width = stage_fc->f_qual_arr[qid]->conf_arr->offset.qual_width; 31458 31459 /* Calculate data words and leftover width. */ 31460 keywords = qual_width/32; 31461 leftover_width = qual_width%32; 31462 31463 /* Go to last MSB part of qualifier. */ 31464 for (idx = 0; idx < keywords; idx++) { 31465 mask_exact = ~0; 31466 if (*mask != mask_exact) { 31467 LOG_ERROR(BSL_LS_BCM_FP, 31468 (BSL_META_U(unit, 31469 "FP(unit %d) Error: Qual(%s) " 31470 "mask = 0x%08x is not exact match.\n"), 31471 unit, _field_qual_name(qid), *mask)); 31472 return (BCM_E_PARAM); 31473 } 31474 mask++; 31475 } 31476 31477 if (leftover_width != 0) { 31478 /* Check if mask is exact, ignore higher mask bits */ 31479 mask_exact = ((1 << leftover_width) - 1); 31480 mask_orig = *mask & ((1 << leftover_width) - 1); 31481 31482 if (mask_orig != mask_exact) { 31483 LOG_ERROR(BSL_LS_BCM_FP, 31484 (BSL_META_U(unit, 31485 "FP(unit %d) Error: Qual(%s) " 31486 "mask = 0x%08x is not exact match.\n"), 31487 unit, _field_qual_name(qid), *mask)); 31488 return (BCM_E_PARAM); 31489 } 31490 } 31491 } else { 31492 /* No info about qualifier in stage database. */ 31493 return (BCM_E_INTERNAL); 31494 } 31495 31496 return (rv); 31497 } 31498 31499 /* 31500 * Function: 31501 * _bcm_field_th_qual_part_offset_get 31502 * Purpose: 31503 * Retrieve qualifier offsets 31504 * Parameters: 31505 * unit - (IN) BCM device number. 31506 * f_ent - (IN) Field entry structure. 31507 * entry_part - (IN) Entry part 31508 * qid - (IN) Qualifier id. 31509 * offset - (OUT) Qualifier offset and width. 31510 * Returns: 31511 * BCM_E_XXX 31512 */ 31513 int 31514 _bcm_field_th_qual_part_offset_get(int unit, _field_entry_t *f_ent, 31515 int entry_part, int qid, 31516 _bcm_field_qual_offset_t *offset) 31517 { 31518 _bcm_field_group_qual_t *q_arr; /* Qualifiers array. */ 31519 _field_group_t *fg; /* Field group structure. */ 31520 uint8 entry_type; /* Index to tcam entries 31521 of multiple types */ 31522 int idx; /* Entry qualifiers iterator. */ 31523 31524 LOG_DEBUG(BSL_LS_BCM_FP, 31525 (BSL_META_U(unit, 31526 "_field_qual_offset_get\n"))); 31527 31528 /* Input parameters check. */ 31529 if ((NULL == offset) || (NULL == f_ent)) { 31530 return (BCM_E_PARAM); 31531 } 31532 31533 /* Validate Entry Part */ 31534 if (entry_part > _FP_MAX_ENTRY_WIDTH) { 31535 return (BCM_E_PARAM); 31536 } 31537 31538 /* Get entry group. */ 31539 fg = f_ent->group; 31540 31541 if (0 == BCM_FIELD_QSET_TEST(fg->qset, qid)) { 31542 /* Only qualifiers that were explicitly requested may be used */ 31543 LOG_DEBUG(BSL_LS_BCM_FP, 31544 (BSL_META_U(unit, 31545 "FP(unit %d) Error: qual=%s not in group=%d Qset\n"), 31546 unit, _field_qual_name(qid), f_ent->group->gid)); 31547 return (BCM_E_PARAM); 31548 } 31549 31550 entry_type = _FP_ENTRY_TYPE_DEFAULT; 31551 /* Get qualifier information. */ 31552 q_arr = &(fg->qual_arr[entry_type][entry_part]); 31553 for (idx = 0; idx < q_arr->size; idx++) { 31554 if (qid == q_arr->qid_arr[idx]) { 31555 sal_memcpy(offset, q_arr->offset_arr + idx, 31556 sizeof(_bcm_field_qual_offset_t)); 31557 break; 31558 } 31559 } 31560 31561 if (idx == q_arr->size) { 31562 offset = NULL; 31563 return (BCM_E_NOT_FOUND); 31564 } 31565 31566 /* 31567 * For Single wide mode, MSB 80-bits of 160-bits are valid 31568 * in the final key, hence shift the offset by 80-bit. 31569 */ 31570 if (fg->stage_id == _BCM_FIELD_STAGE_INGRESS) { 31571 if ((fg->flags & _FP_GROUP_SPAN_SINGLE_SLICE) && 31572 !(fg->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)) { 31573 int qual_part; 31574 31575 for (qual_part = 0; qual_part < (offset)->num_offsets; ++qual_part) { 31576 if ((offset)->width[qual_part] > 0) { 31577 (offset)->offset[qual_part] -= 80; 31578 } 31579 } 31580 } 31581 } else if (fg->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 31582 /* In Exact Match Mode 128 - whole key is not presented 31583 * for lookup. Instead Bit 0-47 and Bit 80-160 are provided 31584 * to UFT. Hence qualifier offsets at position greater than 31585 * 80 bit are shifted by 32 bit for key. 31586 */ 31587 if(fg->em_mode == _FieldExactMatchMode128) { 31588 if (soc_feature(unit, soc_feature_th3_style_fp)) { 31589 int q_part; 31590 for (q_part = 0; q_part < (offset)->num_offsets; ++q_part) { 31591 if ((offset)->width[q_part] > 0) { 31592 if(((offset)->offset[q_part]) > 51) { 31593 (offset)->offset[q_part] -= 32; 31594 } 31595 } 31596 } 31597 } else { 31598 int q_part; 31599 for (q_part = 0; q_part < (offset)->num_offsets; ++q_part) { 31600 if ((offset)->width[q_part] > 0) { 31601 if(((offset)->offset[q_part]) > 79) { 31602 (offset)->offset[q_part] -= 32; 31603 } 31604 } 31605 } 31606 } 31607 } 31608 #if defined(BCM_FLOWTRACKER_SUPPORT) 31609 } else if (fg->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) { 31610 int q_part; 31611 /* 31612 * Flowtracker stage support 2 modes - Single (180 bits) and 31613 * Double (360 bits) using 1 and 2 indices in TCAM. 31614 * Each entry has 7-bit Keytype and 1-bit keymode at bit position 0 to 31615 * 7th in KEYf. So, substacting 180 bits and then adding 8 bits to the 31616 * correct offset per hw entry. 31617 */ 31618 for (q_part = 0; q_part < (offset)->num_offsets; ++q_part) { 31619 if ((offset)->width[q_part] > 0) { 31620 (offset)->offset[q_part] -= (entry_part * 180); 31621 (offset)->offset[q_part] += 8; 31622 } 31623 } 31624 #endif 31625 } else { 31626 /* Invalid Stage. */ 31627 return (BCM_E_PARAM); 31628 } 31629 31630 return (BCM_E_NONE); 31631 } 31632 31633 int 31634 _field_udf_internal_qual_valid_get(int unit, int int_qual, 31635 uint32 chunk_bitmap, uint8 *valid) 31636 { 31637 uint8 compound_chunk = 0; 31638 31639 if (NULL == valid) { 31640 return BCM_E_PARAM; 31641 } 31642 31643 compound_chunk = !(soc_feature(unit, soc_feature_td3_style_fp) 31644 || soc_feature(unit, soc_feature_udf_selector_support)); 31645 switch (int_qual) { 31646 case _bcmFieldQualifyData0: 31647 *valid = (chunk_bitmap & (1 << 0)); 31648 break; 31649 case _bcmFieldQualifyData1: 31650 *valid = (chunk_bitmap & (1 << 1)); 31651 break; 31652 case _bcmFieldQualifyData2: 31653 if (compound_chunk) { 31654 *valid = (chunk_bitmap & (1 << 2)) || (chunk_bitmap & (1 << 3)); 31655 } else { 31656 *valid = (chunk_bitmap & (1 << 2)); 31657 } 31658 break; 31659 case _bcmFieldQualifyData3: 31660 if (compound_chunk) { 31661 *valid = (chunk_bitmap & (1 << 4)) || (chunk_bitmap & (1 << 5)); 31662 } else { 31663 *valid = (chunk_bitmap & (1 << 3)); 31664 } 31665 break; 31666 case _bcmFieldQualifyData4: 31667 if (compound_chunk) { 31668 *valid = (chunk_bitmap & (1 << 6)) || (chunk_bitmap & (1 << 7)); 31669 } else { 31670 *valid = (chunk_bitmap & (1 << 4)); 31671 } 31672 break; 31673 case _bcmFieldQualifyData5: 31674 if (compound_chunk) { 31675 *valid = (chunk_bitmap & (1 << 8)) || (chunk_bitmap & (1 << 9)); 31676 } else { 31677 *valid = (chunk_bitmap & (1 << 5)); 31678 } 31679 break; 31680 case _bcmFieldQualifyData6: 31681 if (compound_chunk) { 31682 *valid = (chunk_bitmap & (1 << 9)) || (chunk_bitmap & (1 << 10)); 31683 } else { 31684 *valid = (chunk_bitmap & (1 << 6)); 31685 } 31686 break; 31687 case _bcmFieldQualifyData7: 31688 if (compound_chunk) { 31689 *valid = (chunk_bitmap & (1 << 10)) || (chunk_bitmap & (1 << 11)); 31690 } else { 31691 *valid = (chunk_bitmap & (1 << 7)); 31692 } 31693 break; 31694 case _bcmFieldQualifyData8: 31695 if (compound_chunk) { 31696 *valid = (chunk_bitmap & (1 << 12)) || (chunk_bitmap & (1 << 13)); 31697 } else { 31698 *valid = (chunk_bitmap & (1 << 8)); 31699 } 31700 break; 31701 case _bcmFieldQualifyData9: 31702 if (compound_chunk) { 31703 *valid = (chunk_bitmap & (1 << 14)) || (chunk_bitmap & (1 << 15)); 31704 } else { 31705 *valid = (chunk_bitmap & (1 << 9)); 31706 } 31707 break; 31708 case _bcmFieldQualifyData10: 31709 *valid = (chunk_bitmap & (1 << 10)); 31710 break; 31711 case _bcmFieldQualifyData11: 31712 *valid = (chunk_bitmap & (1 << 11)); 31713 break; 31714 case _bcmFieldQualifyData12: 31715 *valid = (chunk_bitmap & (1 << 12)); 31716 break; 31717 case _bcmFieldQualifyData13: 31718 *valid = (chunk_bitmap & (1 << 13)); 31719 break; 31720 case _bcmFieldQualifyData14: 31721 *valid = (chunk_bitmap & (1 << 14)); 31722 break; 31723 case _bcmFieldQualifyData15: 31724 *valid = (chunk_bitmap & (1 << 15)); 31725 break; 31726 default: 31727 return BCM_E_INTERNAL; 31728 } 31729 return BCM_E_NONE; 31730 } 31731 31732 int 31733 _field_udf_chunk_to_internal_qual_get(int unit, uint16 chunk, int *int_qual) 31734 { 31735 uint8 compound_chunk = 0; 31736 if (NULL == int_qual) { 31737 return BCM_E_PARAM; 31738 } 31739 31740 compound_chunk = !(soc_feature(unit, soc_feature_td3_style_fp) 31741 || soc_feature(unit, soc_feature_udf_selector_support)); 31742 switch(chunk) { 31743 case 0x0: 31744 *int_qual = _bcmFieldQualifyData0; 31745 break; 31746 case 0x1: 31747 *int_qual = _bcmFieldQualifyData1; 31748 break; 31749 case 0x2: 31750 *int_qual = _bcmFieldQualifyData2; 31751 break; 31752 case 0x3: 31753 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData2) : (_bcmFieldQualifyData3); 31754 break; 31755 case 0x4: 31756 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData3) : (_bcmFieldQualifyData4); 31757 break; 31758 case 0x5: 31759 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData3) : (_bcmFieldQualifyData5); 31760 break; 31761 case 0x6: 31762 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData4) : (_bcmFieldQualifyData6); 31763 break; 31764 case 0x7: 31765 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData4) : (_bcmFieldQualifyData7); 31766 break; 31767 case 0x8: 31768 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData5) : (_bcmFieldQualifyData8); 31769 break; 31770 case 0x9: 31771 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData6) : (_bcmFieldQualifyData9); 31772 break; 31773 case 10: 31774 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData7) : (_bcmFieldQualifyData10); 31775 break; 31776 case 11: 31777 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData7) : (_bcmFieldQualifyData11); 31778 break; 31779 case 12: 31780 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData8) : (_bcmFieldQualifyData12); 31781 break; 31782 case 13: 31783 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData8) : (_bcmFieldQualifyData13); 31784 break; 31785 case 14: 31786 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData9) : (_bcmFieldQualifyData14); 31787 break; 31788 case 15: 31789 *int_qual = (compound_chunk) ? (_bcmFieldQualifyData9) : (_bcmFieldQualifyData15); 31790 break; 31791 default: 31792 return BCM_E_INTERNAL; 31793 } 31794 return BCM_E_NONE; 31795 } 31796 int 31797 _bcm_th_qual_hint_bmp_get(int unit, int qual, 31798 uint8 em_keygen_mask, 31799 _field_hint_t *hint_node, 31800 uint32 *qual_bitmap, 31801 uint8 partial, 31802 bcm_field_qset_t *qset, 31803 bcmi_keygen_qual_info_t *qual_info) 31804 { 31805 bcm_udf_id_t udf_id; 31806 int idx = 0; 31807 uint8 valid = 0; 31808 uint8 start_second_chunk = 0; 31809 uint8 end_second_chunk = 0; 31810 #if defined(BCM_TRIDENT3_SUPPORT) 31811 _bcm_udf_td3_obj_info_t *obj_info = NULL; 31812 #endif 31813 bcmi_xgs4_udf_offset_info_t *offset_info = NULL; 31814 uint32 chunk_bmap = 0; 31815 uint32 temp_bitmap = 0; 31816 uint32 start_width = 0; 31817 uint32 start_bit = 0; 31818 uint32 end_bit = 0; 31819 uint32 cont_width = 0; 31820 uint32 end_width = 0; 31821 uint16 chunk = 0; 31822 uint16 extra_width = 0; 31823 uint16 max_chunks = 0; 31824 uint16 start_chunk = 0; 31825 uint16 start_chunk_valid = 0; 31826 uint16 end_chunk = 0; 31827 int int_qual_start = 0; 31828 int int_qual_end = 0; 31829 31830 udf_id = hint_node->hint->udf_id; 31831 /* Get UDF info. */ 31832 #if defined(BCM_TRIDENT3_SUPPORT) 31833 if (soc_feature(unit, soc_feature_td3_style_fp)) { 31834 BCM_IF_ERROR_RETURN(_bcm_udf_td3_object_info_get(unit, udf_id, &obj_info)); 31835 chunk_bmap = obj_info->chunk_bmap; 31836 cont_width = obj_info->width; 31837 max_chunks = _BCM_UDF_CTRL_MAX_UDF_CHUNKS(unit); 31838 } else 31839 #endif 31840 { 31841 BCM_IF_ERROR_RETURN(bcmi_xgs4_udf_offset_node_get(unit, udf_id, &offset_info)); 31842 chunk_bmap = offset_info->hw_bmap; 31843 cont_width = offset_info->width; 31844 max_chunks = BCMI_XGS4_UDF_CTRL_MAX_UDF_CHUNKS(unit); 31845 } 31846 31847 /* Logical Start and end chunks based on user given inputs */ 31848 if (!soc_feature(unit, soc_feature_td3_style_fp)) { 31849 /* 31850 * Check whether UDF container width is multiple of 16 or not. 31851 * cont_width is multiple of bytes. It has to be even number for multiple of 16 bits 31852 */ 31853 if (cont_width & 1) { 31854 /* 31855 * For the UDFs whcih are not multiples of 16, 31856 * Chunk allocation is always be mutlples of 16 bit. 31857 * Need to think that the given start and end bit be 31858 * 8 bits extra width. 31859 */ 31860 extra_width = partial ? 8 : 0; 31861 } 31862 } 31863 31864 if ((hint_node->hint->start_bit > (cont_width * 8)) 31865 || (hint_node->hint->end_bit) > (cont_width * 8)) { 31866 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 31867 "Provided hint has wrong start/end bit\n\r"))); 31868 return BCM_E_PARAM; 31869 } 31870 31871 start_chunk = hint_node->hint->start_bit/16 + extra_width; 31872 end_chunk = hint_node->hint->end_bit/16 + extra_width; 31873 chunk = 0; 31874 start_chunk_valid = 0; 31875 /* Derive physical chunks with logical moves */ 31876 for (idx = max_chunks - 1; idx >= 0; idx--) { 31877 if ((chunk_bmap & (1 << idx))) { 31878 if ((0 == start_chunk_valid) && (chunk == start_chunk)) { 31879 start_chunk = idx; 31880 start_chunk_valid = 1; 31881 } 31882 if (chunk == end_chunk) { 31883 end_chunk = idx; 31884 break; 31885 } 31886 chunk++; 31887 } 31888 } 31889 31890 BCM_IF_ERROR_RETURN(_field_udf_chunk_to_internal_qual_get(unit, start_chunk, &int_qual_start)); 31891 BCM_IF_ERROR_RETURN(_field_udf_chunk_to_internal_qual_get(unit, end_chunk, &int_qual_end)); 31892 31893 if ((_bcmFieldQualifyCount == int_qual_start) 31894 || (_bcmFieldQualifyCount == int_qual_end)) { 31895 return BCM_E_INTERNAL; 31896 } 31897 31898 if (soc_feature(unit, soc_feature_td3_style_fp) 31899 || soc_feature(unit, soc_feature_udf_selector_support)) { 31900 start_bit = hint_node->hint->start_bit%16; 31901 end_width = hint_node->hint->end_bit%16; 31902 start_width = _UDF_CHUNK_WIDTH_ - start_bit; 31903 /* End chunk starts from 0 for all 16bit chunks */ 31904 end_bit = 0; 31905 } else if (SOC_IS_TOMAHAWK(unit) || SOC_IS_TOMAHAWK2(unit)) { 31906 switch (int_qual_start) { 31907 case _bcmFieldQualifyData0: 31908 case _bcmFieldQualifyData1: 31909 case _bcmFieldQualifyData5: 31910 case _bcmFieldQualifyData6: 31911 start_bit = hint_node->hint->start_bit%(_UDF_CHUNK_WIDTH_); 31912 start_width = _UDF_CHUNK_WIDTH_ - start_bit; 31913 break; 31914 case _bcmFieldQualifyData2: 31915 _FIELD_UDF_START_CHUNK_OFFSET_GET(2, 3); 31916 break; 31917 case _bcmFieldQualifyData3: 31918 _FIELD_UDF_START_CHUNK_OFFSET_GET(4, 5); 31919 break; 31920 case _bcmFieldQualifyData4: 31921 _FIELD_UDF_START_CHUNK_OFFSET_GET(6, 7); 31922 break; 31923 case _bcmFieldQualifyData7: 31924 _FIELD_UDF_START_CHUNK_OFFSET_GET(10, 11); 31925 break; 31926 case _bcmFieldQualifyData8: 31927 _FIELD_UDF_START_CHUNK_OFFSET_GET(12, 13); 31928 break; 31929 case _bcmFieldQualifyData9: 31930 _FIELD_UDF_START_CHUNK_OFFSET_GET(14, 15); 31931 break; 31932 default: 31933 return BCM_E_INTERNAL; 31934 } 31935 31936 switch (int_qual_end) { 31937 case _bcmFieldQualifyData0: 31938 case _bcmFieldQualifyData1: 31939 case _bcmFieldQualifyData5: 31940 case _bcmFieldQualifyData6: 31941 end_width = hint_node->hint->end_bit%(_UDF_CHUNK_WIDTH_); 31942 break; 31943 case _bcmFieldQualifyData2: 31944 _FIELD_UDF_END_CHUNK_OFFSET_GET(2, 3); 31945 break; 31946 case _bcmFieldQualifyData3: 31947 _FIELD_UDF_END_CHUNK_OFFSET_GET(4, 5); 31948 break; 31949 case _bcmFieldQualifyData4: 31950 _FIELD_UDF_END_CHUNK_OFFSET_GET(6, 7); 31951 break; 31952 case _bcmFieldQualifyData7: 31953 _FIELD_UDF_END_CHUNK_OFFSET_GET(10, 11); 31954 break; 31955 case _bcmFieldQualifyData8: 31956 _FIELD_UDF_END_CHUNK_OFFSET_GET(12, 13); 31957 break; 31958 case _bcmFieldQualifyData9: 31959 _FIELD_UDF_END_CHUNK_OFFSET_GET(14, 15); 31960 break; 31961 default: 31962 return BCM_E_INTERNAL; 31963 } 31964 } else { 31965 return BCM_E_INTERNAL; 31966 } 31967 31968 if (partial && (start_second_chunk || end_second_chunk)) { 31969 temp_bitmap = *qual_bitmap; 31970 *qual_bitmap = 0; 31971 } 31972 31973 idx = 0; 31974 if (em_keygen_mask && (*qual_bitmap)) { 31975 /* 31976 * EM KEYGEN needs to set the number of bits needed for the qualfiier 31977 * not the bit positions bitmap. 31978 * So whenever Same qualifier has mutliple hints, 31979 * need to consider previous hint width too. 31980 */ 31981 for (idx = 0; (idx < 32) && (SHR_BITGET(qual_bitmap, idx)); idx++); 31982 } 31983 31984 if ((int_qual_start == qual) && (int_qual_end == qual)) { 31985 SHR_BITSET_RANGE(qual_bitmap, 31986 em_keygen_mask ? 0 : start_bit, 31987 (idx + hint_node->hint->end_bit - hint_node->hint->start_bit + 1)); 31988 31989 if (start_second_chunk) { 31990 SHR_BITSET_RANGE(qual_bitmap, 31991 (start_bit >= _UDF_CHUNK_WIDTH_) ? 0 : _UDF_CHUNK_WIDTH_, 31992 _UDF_CHUNK_WIDTH_); 31993 } 31994 31995 if ((0 == start_second_chunk) && end_second_chunk) { 31996 SHR_BITSET_RANGE(qual_bitmap, 31997 (end_width >= _UDF_CHUNK_WIDTH_) ? 0 : _UDF_CHUNK_WIDTH_, 31998 _UDF_CHUNK_WIDTH_); 31999 } 32000 32001 if (partial && (NULL != qual_info)) { 32002 qual_info->partial = TRUE; 32003 } 32004 } else { 32005 if (qual == int_qual_start) { 32006 SHR_BITSET_RANGE(qual_bitmap, 32007 em_keygen_mask ? 0 : start_bit, 32008 idx + start_width); 32009 if (start_second_chunk) { 32010 SHR_BITSET_RANGE(qual_bitmap, 32011 (start_bit >= _UDF_CHUNK_WIDTH_) ? 0 : _UDF_CHUNK_WIDTH_, 32012 _UDF_CHUNK_WIDTH_); 32013 } 32014 if (partial && (NULL != qual_info)) { 32015 qual_info->partial = TRUE; 32016 } 32017 } else if (qual == int_qual_end) { 32018 SHR_BITSET_RANGE(qual_bitmap, 32019 em_keygen_mask ? 0 : end_bit, (idx + end_width + 1)); 32020 if (end_second_chunk) { 32021 SHR_BITSET_RANGE(qual_bitmap, 32022 (end_width >= _UDF_CHUNK_WIDTH_) ? 0 : _UDF_CHUNK_WIDTH_, 32023 _UDF_CHUNK_WIDTH_); 32024 } 32025 if (partial && (NULL != qual_info)) { 32026 qual_info->partial = TRUE; 32027 } 32028 } else if ((int_qual_start < qual) || (qual < int_qual_end)) { 32029 if (partial && (NULL != qual_info)) { 32030 /* Check whether qual belongs to this UDF Object */ 32031 BCM_IF_ERROR_RETURN(_field_udf_internal_qual_valid_get(unit, qual, chunk_bmap, &valid)); 32032 if (valid) { 32033 qual_info->partial = TRUE; 32034 } 32035 } 32036 } 32037 } 32038 32039 if (partial && temp_bitmap && (start_second_chunk || end_second_chunk)) { 32040 *qual_bitmap &= temp_bitmap; 32041 } 32042 32043 return BCM_E_NONE; 32044 } 32045 32046 /* 32047 * Function: 32048 * _bcm_field_th_qual_hints_get 32049 * Purpose: 32050 * Get the hints for the given qualifier. 32051 * Parameters: 32052 * unit - (IN) BCM device number. 32053 * qual - (IN) Field Qualifier. 32054 * hintid - (IN) HintId attached to the field group. 32055 * hints_present - (OUT) Flag to indicate whetehr hints 32056 * present for the qualifier or not. 32057 * qual_bitmap - (OUT) Required bit to extract for the qualifier. 32058 * Returns: 32059 * BCM_E_XXX 32060 */ 32061 int 32062 _bcm_field_th_qual_hints_get(int unit, int qual, 32063 bcm_field_hintid_t hintid, 32064 bcm_field_qset_t *qset, 32065 uint8 *hints_present, 32066 _bcm_field_qual_data_t qual_bitmap) 32067 { 32068 int idx = 0; /* Index variablre. */ 32069 uint8 hints_p = 0; /* hints present status */ 32070 _field_hints_t *f_ht = NULL; /* Field hints Structure. */ 32071 _field_hint_t *hint_node = NULL; /* Field hint Structure. */ 32072 32073 /* Parameters Check */ 32074 if (NULL == hints_present) { 32075 return BCM_E_PARAM; 32076 } 32077 32078 *hints_present = 0; 32079 _FP_QUAL_DATA_CLEAR(qual_bitmap); 32080 32081 BCM_IF_ERROR_RETURN(_field_hints_control_get (unit, hintid, &f_ht)); 32082 32083 /* Not a valid hint Id. */ 32084 if (NULL == f_ht) { 32085 return BCM_E_NONE; 32086 } 32087 32088 /* No hinta are attached to the hintid. */ 32089 if (NULL == f_ht->hints) { 32090 return BCM_E_NONE; 32091 } 32092 32093 /* Go through all the hints in the hintid. */ 32094 hint_node = f_ht->hints; 32095 while (NULL != hint_node) { 32096 32097 if (bcmFieldQualifyUdf != hint_node->hint->qual) { 32098 if ((bcmFieldHintTypeExtraction == hint_node->hint->hint_type) && 32099 (qual == hint_node->hint->qual)) { 32100 *hints_present = 1; 32101 break; 32102 } 32103 } else { 32104 if ((bcmFieldHintTypeExtraction == hint_node->hint->hint_type) && 32105 (_FIELD_IS_INTERNAL_UDF_QUAL(qual))) { 32106 *hints_present = 1; 32107 break; 32108 } 32109 } 32110 32111 hint_node = hint_node->next; 32112 } 32113 32114 /* Hints not present for the qualifier. */ 32115 if (!(*hints_present)) { 32116 return BCM_E_NONE; 32117 } 32118 32119 hint_node = f_ht->hints; 32120 32121 /* Update the required bits for the qualifier. */ 32122 while (NULL != hint_node) { 32123 32124 if (bcmFieldQualifyUdf != hint_node->hint->qual) { 32125 if (bcmFieldHintTypeExtraction == hint_node->hint->hint_type && 32126 qual != hint_node->hint->qual) { 32127 hint_node = hint_node->next; 32128 continue; 32129 } 32130 } else { 32131 if ((bcmFieldHintTypeExtraction == hint_node->hint->hint_type) && 32132 (!(_FIELD_IS_INTERNAL_UDF_QUAL(qual)))) { 32133 hint_node = hint_node->next; 32134 continue; 32135 } 32136 } 32137 32138 #if defined(BCM_FLOWTRACKER_SUPPORT) 32139 if ((qual == bcmFieldQualifyDosAttackEvents) || 32140 (qual == bcmFieldQualifyInnerDosAttackEvents)) { 32141 SHR_BITOR_RANGE(&(hint_node->hint->dosattack_event_flags), 32142 qual_bitmap, 0, 32, qual_bitmap); 32143 hint_node = hint_node->next; 32144 continue; 32145 } 32146 #endif 32147 32148 if (bcmFieldQualifyUdf != hint_node->hint->qual) { 32149 for (idx = hint_node->hint->start_bit; 32150 idx <= hint_node->hint->end_bit; idx++) { 32151 SHR_BITSET(qual_bitmap, idx); 32152 } 32153 } else { 32154 BCM_IF_ERROR_RETURN(_bcm_th_qual_hint_bmp_get(unit, qual, 0, hint_node, 32155 qual_bitmap, 1, qset, NULL)); 32156 if (*qual_bitmap) { 32157 hints_p = 1; 32158 *hints_present = 1; 32159 } 32160 32161 if (hints_p == 0) { 32162 *hints_present = 0; 32163 } 32164 } 32165 hint_node = hint_node->next; 32166 } 32167 32168 return BCM_E_NONE; 32169 } 32170 32171 /* 32172 * Function: 32173 * _bcm_field_th_qualify_set 32174 * 32175 * Purpose: 32176 * Utility routine for qualify APIs taking 32 bits or less 32177 * 32178 * Parameters: 32179 * unit - BCM device number 32180 * entry - Entry ID 32181 * qual - Qualifier field 32182 * data - Matching data 32183 * mask - Bit mask for data 32184 * flags - Qualifier Flags. 32185 * Returns: 32186 * BCM_E_NONE - BCM device number 32187 * BCM_E_PARAM - Qualifier not in group's Qset 32188 * BCM_E_CONFIG - entry is groups default entry 32189 */ 32190 32191 int 32192 _bcm_field_th_qualify_set(int unit, bcm_field_entry_t entry, 32193 int qual, uint32 *data, uint32 *mask, uint8 flags) 32194 { 32195 int rv; 32196 _bcm_field_qual_offset_t q_offset; 32197 _field_entry_t *f_ent; 32198 _bcm_field_qual_data_t out_data1; 32199 _bcm_field_qual_data_t out_mask1; 32200 _bcm_field_qual_data_t out_data2; 32201 _bcm_field_qual_data_t out_mask2; 32202 _bcm_field_qual_data_t actual_data; 32203 _bcm_field_qual_data_t actual_mask; 32204 _bcm_field_qual_data_t qual_bitmap; 32205 uint32 start_offset = 0; 32206 int parts_cnt; 32207 int miss_count; 32208 int part_idx; 32209 int idx; 32210 int get_start_bit; 32211 int set_start_bit; 32212 uint16 width; 32213 uint16 total_width; 32214 uint8 hints_present; 32215 _bcm_field_qual_data_t null_data; 32216 uint16 chunk_size[_BCM_FIELD_QUAL_OFFSET_MAX] = {0}; 32217 uint16 chunk_offset[_BCM_FIELD_QUAL_OFFSET_MAX] = {0}; 32218 _field_stage_t *stage_fc; 32219 32220 /* Input Parameter Check. */ 32221 if (NULL == data || NULL == mask) { 32222 return BCM_E_PARAM; 32223 } 32224 32225 /* Retrieve the field entry. */ 32226 rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent); 32227 BCM_IF_ERROR_RETURN(rv); 32228 32229 /* Currently this function handles qualifiers related to IFP,FT and EM */ 32230 if ((f_ent->group->stage_id != _BCM_FIELD_STAGE_INGRESS) && 32231 (f_ent->group->stage_id != _BCM_FIELD_STAGE_EXACTMATCH) && 32232 (f_ent->group->stage_id != _BCM_FIELD_STAGE_FLOWTRACKER)) { 32233 return BCM_E_INTERNAL; 32234 } 32235 32236 /* Check if it is group default entry. */ 32237 if (f_ent->flags & _FP_ENTRY_EXACT_MATCH_GROUP_DEFAULT) { 32238 return (BCM_E_CONFIG); 32239 } 32240 32241 /* Retrieve group entry parts */ 32242 rv = _bcm_field_th_entry_tcam_parts_count(unit, f_ent->group->flags, 32243 &parts_cnt); 32244 BCM_IF_ERROR_RETURN(rv); 32245 32246 /* Retreive stage control. */ 32247 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 32248 BCM_IF_ERROR_RETURN(rv); 32249 32250 _FP_QUAL_DATA_CLEAR(actual_data); 32251 _FP_QUAL_DATA_CLEAR(actual_mask); 32252 32253 /* Check if mask is full, do it only for exact match entries. */ 32254 if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 32255 rv = _bcm_field_th_entry_check_full_mask(unit, qual, 32256 stage_fc, mask, flags); 32257 BCM_IF_ERROR_RETURN(rv); 32258 } 32259 32260 /* Initialize q_offset to NULL */ 32261 sal_memset(&q_offset, 0x0, sizeof(q_offset)); 32262 _FP_QUAL_DATA_CLEAR(null_data); 32263 miss_count = 0; 32264 total_width = 0; 32265 hints_present = 0; 32266 get_start_bit = -1; 32267 set_start_bit = 0; 32268 width = 0; 32269 32270 /* Update each chunk size of the qualifier. */ 32271 for (part_idx = 0; part_idx < parts_cnt; ++part_idx) { 32272 /* Retrieve the Qualifier offsets for the particular entry part */ 32273 rv = _bcm_field_th_qual_part_offset_get(unit, f_ent + part_idx, 32274 part_idx, qual, &q_offset); 32275 32276 if (rv == BCM_E_NOT_FOUND) { 32277 continue; 32278 } else if (BCM_FAILURE(rv)) { 32279 return rv; 32280 } 32281 32282 for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) { 32283 if (q_offset.width[idx]) { 32284 chunk_size[idx] = q_offset.width[idx]; 32285 total_width += chunk_size[idx]; 32286 } 32287 } 32288 } 32289 32290 _FP_QUAL_DATA_CLEAR(actual_data); 32291 _FP_QUAL_DATA_CLEAR(actual_mask); 32292 32293 rv = _bcm_field_th_qual_hints_get(unit, qual, f_ent->group->hintid, 32294 &f_ent->group->qset, 32295 &hints_present, qual_bitmap); 32296 BCM_IF_ERROR_RETURN(rv); 32297 32298 if (hints_present) { 32299 for (idx = 0; idx < _FP_QUAL_DATA_WORDS * 32; idx++) { 32300 if (SHR_BITGET(qual_bitmap, idx)) { 32301 if (-1 == get_start_bit) { 32302 get_start_bit = idx; 32303 } 32304 width++; 32305 } else { 32306 if (-1 != get_start_bit) { 32307 32308 _FP_QUAL_DATA_CLEAR(out_data1); 32309 _FP_QUAL_DATA_CLEAR(out_mask1); 32310 32311 rv = _bcm_field_qual_partial_data_get(data, get_start_bit, 32312 width, out_data1); 32313 BCM_IF_ERROR_RETURN(rv); 32314 32315 rv = _bcm_field_qual_partial_data_set(out_data1, 32316 set_start_bit, 32317 width, actual_data); 32318 BCM_IF_ERROR_RETURN(rv); 32319 32320 rv = _bcm_field_qual_partial_data_get(mask, get_start_bit, 32321 width, out_mask1); 32322 BCM_IF_ERROR_RETURN(rv); 32323 32324 rv = _bcm_field_qual_partial_data_set(out_mask1, 32325 set_start_bit, 32326 width, actual_mask); 32327 BCM_IF_ERROR_RETURN(rv); 32328 32329 set_start_bit += width; 32330 get_start_bit = -1; 32331 width = 0; 32332 } 32333 } 32334 } 32335 } else { 32336 rv = _bcm_field_qual_partial_data_set(data, 0, 32337 total_width, actual_data); 32338 BCM_IF_ERROR_RETURN(rv); 32339 32340 rv = _bcm_field_qual_partial_data_set(mask, 0, 32341 total_width, actual_mask); 32342 BCM_IF_ERROR_RETURN(rv); 32343 } 32344 32345 /* Update each chunk offset of the qualifier. offsets in q_offset 32346 * are local to the partition but chunk_offset array will have offsets 32347 * across the partitions. 32348 */ 32349 for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) { 32350 32351 if (idx == 0) { 32352 chunk_offset[idx] = 0; 32353 continue; 32354 } 32355 32356 if (chunk_size[idx]) { 32357 chunk_offset[idx] = chunk_offset[idx-1] + chunk_size[idx - 1]; 32358 } else { 32359 break; 32360 } 32361 } 32362 32363 for (part_idx = 0; part_idx < parts_cnt; ++part_idx) { 32364 /* Retrieve the Qualifier offsets for the particular entry part */ 32365 rv = _bcm_field_th_qual_part_offset_get(unit, f_ent + part_idx, 32366 part_idx, qual, &q_offset); 32367 if (rv == BCM_E_NOT_FOUND) { 32368 miss_count += 1; 32369 continue; 32370 } else if (BCM_FAILURE(rv)) { 32371 return rv; 32372 } 32373 32374 _FP_QUAL_DATA_CLEAR(out_data2); 32375 _FP_QUAL_DATA_CLEAR(out_mask2); 32376 32377 start_offset = 0; 32378 32379 /* Extract relevent data for this partion from user passed data. */ 32380 for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) { 32381 32382 if (0 == q_offset.width[idx]) { 32383 continue; 32384 } 32385 32386 _FP_QUAL_DATA_CLEAR(out_data1); 32387 _FP_QUAL_DATA_CLEAR(out_mask1); 32388 32389 32390 rv = _bcm_field_qual_partial_data_get(actual_data, 32391 chunk_offset[idx], 32392 q_offset.width[idx], 32393 out_data1); 32394 BCM_IF_ERROR_RETURN(rv); 32395 32396 rv = _bcm_field_qual_partial_data_set(out_data1, start_offset, 32397 q_offset.width[idx], out_data2); 32398 BCM_IF_ERROR_RETURN(rv); 32399 32400 rv = _bcm_field_qual_partial_data_get(actual_mask, 32401 chunk_offset[idx], 32402 q_offset.width[idx], 32403 out_mask1); 32404 BCM_IF_ERROR_RETURN(rv); 32405 32406 rv = _bcm_field_qual_partial_data_set(out_mask1, start_offset, 32407 q_offset.width[idx], out_mask2); 32408 BCM_IF_ERROR_RETURN(rv); 32409 32410 start_offset += q_offset.width[idx]; 32411 32412 } 32413 32414 /* Program data/mask pair to tcam buffer. */ 32415 /* coverity[callee_ptr_arith : FALSE] */ 32416 rv = _bcm_field_qual_value_set(unit, &q_offset, f_ent + part_idx, 32417 out_data2, out_mask2); 32418 BCM_IF_ERROR_RETURN(rv); 32419 32420 } 32421 32422 /* 32423 * Verify whether qualifier offset is present in the qual Array. 32424 */ 32425 if (miss_count == parts_cnt) { 32426 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 32427 "Qualifier[%s] Offset not found for Entry:%d\n\r"), 32428 _field_qual_name(qual), entry)); 32429 32430 return BCM_E_NOT_FOUND; 32431 } 32432 32433 f_ent->flags |= _FP_ENTRY_DIRTY; 32434 return (BCM_E_NONE); 32435 } 32436 32437 /* 32438 * Function: 32439 * _bcm_field_th_entry_qualifier_key_get 32440 * 32441 * Purpose: 32442 * Get qualifier match value and mask. 32443 * 32444 * Parameters: 32445 * unit - BCM device number 32446 * entry - Entry id. 32447 * qual_id - qualifier id. 32448 * q_data - Qualifier data array. 32449 * q_mask - Qualifier mask array. 32450 * Returns: 32451 * Nothing. 32452 */ 32453 int 32454 _bcm_field_th_entry_qualifier_key_get(int unit, 32455 bcm_field_entry_t entry, 32456 int qual_id, 32457 _bcm_field_qual_data_t q_data, 32458 _bcm_field_qual_data_t q_mask) 32459 { 32460 int rv; /* Operation return status. */ 32461 int miss_count; /* Number of partitions having 32462 * no offset info for qual_id. 32463 */ 32464 int idx; /* Temp variable used for indexing. */ 32465 int entry_parts; /* Number of TCAM partitions. */ 32466 int part_ct; /* Varable to hold the current partiotion number. */ 32467 int get_start_bit = -1; 32468 int set_start_bit = -1; 32469 uint8 hints_present = 0; 32470 uint16 total_width = 0; 32471 uint16 chunk_size[_BCM_FIELD_QUAL_OFFSET_MAX] = {0}; /* Size of all chunks 32472 * of a qualifier distributed 32473 * across different partitions. */ 32474 uint16 chunk_offset[_BCM_FIELD_QUAL_OFFSET_MAX] = {0}; /* offsets of all 32475 * chunks of a qualifier w.r.t 32476 * actual qualifier size. */ 32477 uint32 width = 0; /* Width of a qualifier in a partition. */ 32478 32479 uint32 start_offset = 0; /* Start offset for each chunk in a prtition*/ 32480 #if 0 32481 uint32 qual_width = 0; /* Actual width of qualifier in the shared chunk. */ 32482 _field_stage_t *stage_fc; /* Field stage operational structure. */ 32483 #endif 32484 _field_entry_t *f_ent; /* Field entry structure. */ 32485 _bcm_field_qual_data_t part_data; /* Qualifier data in a partition. */ 32486 _bcm_field_qual_data_t part_mask; /* Qualifier mask in a partition. */ 32487 _bcm_field_qual_data_t chunk_data; /* Qual data of a particular chunk. */ 32488 _bcm_field_qual_data_t chunk_mask; /* Qual mask of a particular chunk. */ 32489 _bcm_field_qual_data_t actual_data; 32490 _bcm_field_qual_data_t actual_mask; 32491 _bcm_field_qual_data_t qual_bitmap; 32492 _bcm_field_qual_offset_t q_offset; /* Qual offset in the tcam part. */ 32493 32494 /* Get entry part that contains requested qualifier. */ 32495 rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent); 32496 BCM_IF_ERROR_RETURN(rv); 32497 32498 if ((f_ent->group->stage_id != _BCM_FIELD_STAGE_INGRESS) && 32499 (f_ent->group->stage_id != _BCM_FIELD_STAGE_EXACTMATCH) && 32500 (f_ent->group->stage_id != _BCM_FIELD_STAGE_FLOWTRACKER)) { 32501 return BCM_E_INTERNAL; 32502 } 32503 32504 /* Get number of parts in field entry based on group flags. */ 32505 rv = _bcm_field_th_entry_tcam_parts_count (unit, f_ent->group->flags, 32506 &entry_parts); 32507 BCM_IF_ERROR_RETURN(rv); 32508 32509 /* Update each chunk size of the qualifier. */ 32510 for (part_ct = 0; part_ct < entry_parts; ++part_ct) { 32511 32512 sal_memset(&q_offset, 0, sizeof(_bcm_field_qual_offset_t)); 32513 /* Retrieve the Qualifier offsets for the particular entry part */ 32514 rv = _bcm_field_th_qual_part_offset_get(unit, f_ent + part_ct, 32515 part_ct, qual_id, &q_offset); 32516 32517 if (rv == BCM_E_NOT_FOUND) { 32518 continue; 32519 } else if (BCM_FAILURE(rv)) { 32520 return rv; 32521 } 32522 32523 for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) { 32524 if (q_offset.width[idx]) { 32525 chunk_size[idx] = q_offset.width[idx]; 32526 total_width += chunk_size[idx]; 32527 } 32528 } 32529 } 32530 32531 /* Update each chunk offset of the qualifier. offsets in q_offset 32532 * are local to the partition but chunk_offset array will have offsets 32533 * across the partitions. 32534 */ 32535 for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) { 32536 32537 if (idx == 0) { 32538 chunk_offset[idx] = 0; 32539 continue; 32540 } 32541 32542 if (chunk_size[idx]) { 32543 chunk_offset[idx] = chunk_offset[idx-1] + chunk_size[idx - 1]; 32544 } else { 32545 break; 32546 } 32547 } 32548 32549 miss_count = 0; 32550 _FP_QUAL_DATA_CLEAR(actual_data); 32551 _FP_QUAL_DATA_CLEAR(actual_mask); 32552 for (part_ct = 0; part_ct < entry_parts; part_ct++) { 32553 32554 /* Initialize q_offset to NULL */ 32555 sal_memset(&q_offset, 0x0, sizeof(q_offset)); 32556 32557 /* Retrieve the Qualifier offsets for the particular entry part */ 32558 rv = _bcm_field_th_qual_part_offset_get(unit, f_ent, part_ct, 32559 qual_id, &q_offset); 32560 if (rv == BCM_E_NOT_FOUND) { 32561 miss_count += 1; 32562 continue; 32563 } else if (BCM_FAILURE(rv)) { 32564 return rv; 32565 } 32566 32567 width = 0; 32568 _FP_QUAL_DATA_CLEAR(part_data); 32569 _FP_QUAL_DATA_CLEAR(part_mask); 32570 32571 /* Combined width of a qualifier for a given part */ 32572 _BCM_FIELD_QUAL_MULTI_OFFSET_WIDTH(&q_offset, width); 32573 if (width > 0) { 32574 /* Read qualifier match value and mask. */ 32575 rv = _bcm_field_qual_value_get(unit, &q_offset, f_ent + part_ct, 32576 part_data, part_mask); 32577 BCM_IF_ERROR_RETURN(rv); 32578 } else { 32579 continue; 32580 } 32581 32582 start_offset = 0; 32583 /* Extract relevent data for this partion from user passed data. */ 32584 for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) { 32585 32586 if (0 == q_offset.width[idx]) { 32587 continue; 32588 } 32589 32590 _FP_QUAL_DATA_CLEAR(chunk_data); 32591 _FP_QUAL_DATA_CLEAR(chunk_mask); 32592 32593 32594 rv = _bcm_field_qual_partial_data_get(part_data, start_offset, 32595 q_offset.width[idx], chunk_data); 32596 BCM_IF_ERROR_RETURN(rv); 32597 32598 rv = _bcm_field_qual_partial_data_get(part_mask, start_offset, 32599 q_offset.width[idx], chunk_mask); 32600 BCM_IF_ERROR_RETURN(rv); 32601 32602 /* Adjust Data and Mask based on the part offsets. */ 32603 rv = _bcm_field_qual_partial_data_set(chunk_data, chunk_offset[idx], 32604 q_offset.width[idx], actual_data); 32605 BCM_IF_ERROR_RETURN(rv); 32606 rv = _bcm_field_qual_partial_data_set(chunk_mask, chunk_offset[idx], 32607 q_offset.width[idx], actual_mask); 32608 BCM_IF_ERROR_RETURN(rv); 32609 32610 /* Increment the offset for the next part */ 32611 start_offset += q_offset.width[idx]; 32612 } 32613 } 32614 32615 /* 32616 * Verify whether qualifier offset is present in the qual Array. 32617 */ 32618 if (miss_count == entry_parts) { 32619 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 32620 "Qualifier[%s] Offset not found for Entry:%d\n\r"), 32621 _field_qual_name(qual_id), entry)); 32622 32623 return BCM_E_NOT_FOUND; 32624 } 32625 32626 32627 _FP_QUAL_DATA_CLEAR(q_data); 32628 _FP_QUAL_DATA_CLEAR(q_mask); 32629 32630 rv = _bcm_field_th_qual_hints_get(unit, qual_id, f_ent->group->hintid, 32631 &f_ent->group->qset, 32632 &hints_present, qual_bitmap); 32633 BCM_IF_ERROR_RETURN(rv); 32634 32635 width = 0; 32636 set_start_bit = -1; 32637 get_start_bit = 0; 32638 if (hints_present) { 32639 for (idx = 0; idx < _FP_QUAL_DATA_WORDS * 32; idx++) { 32640 if (SHR_BITGET(qual_bitmap, idx)) { 32641 if (-1 == set_start_bit) { 32642 set_start_bit = idx; 32643 } 32644 32645 width++; 32646 } else { 32647 if (-1 != set_start_bit) { 32648 32649 _FP_QUAL_DATA_CLEAR(part_data); 32650 _FP_QUAL_DATA_CLEAR(part_mask); 32651 32652 rv = _bcm_field_qual_partial_data_get(actual_data, 32653 get_start_bit, 32654 width, part_data); 32655 BCM_IF_ERROR_RETURN(rv); 32656 32657 rv = _bcm_field_qual_partial_data_set(part_data, 32658 set_start_bit, 32659 width, q_data); 32660 BCM_IF_ERROR_RETURN(rv); 32661 32662 rv = _bcm_field_qual_partial_data_get(actual_mask, 32663 get_start_bit, 32664 width, part_mask); 32665 BCM_IF_ERROR_RETURN(rv); 32666 32667 rv = _bcm_field_qual_partial_data_set(part_mask, 32668 set_start_bit, 32669 width, q_mask); 32670 BCM_IF_ERROR_RETURN(rv); 32671 32672 32673 get_start_bit += width; 32674 set_start_bit = -1; 32675 width = 0; 32676 } 32677 } 32678 } 32679 } else { 32680 sal_memcpy(q_data, actual_data, sizeof(actual_data)); 32681 sal_memcpy(q_mask, actual_mask, sizeof(actual_mask)); 32682 } 32683 32684 return (BCM_E_NONE); 32685 } 32686 32687 /* 32688 * Function: 32689 * _bcm_field_th_qualifier_delete 32690 * Purpose: 32691 * Remove match criteria from a field processor entry. 32692 * Parameters: 32693 * unit - (IN) Unit number. 32694 * entry - (IN) BCM field entry id. 32695 * qual_id - (IN) BCM field qualifier id. 32696 * Returns: 32697 * BCM_E_XXX 32698 * Notes: 32699 * The assumption is that all qualifiers are less then 128 bit. 32700 */ 32701 int 32702 _bcm_field_th_qualifier_delete(int unit, bcm_field_entry_t entry, 32703 bcm_field_qualify_t qual_id) 32704 { 32705 _bcm_field_qual_data_t q_data; /* Qualifier match data. */ 32706 _bcm_field_qual_data_t q_mask; /* Qualifier match mask. */ 32707 int rv = BCM_E_NONE; /* Operation return status. */ 32708 _field_entry_t *f_ent; /* Field Entry */ 32709 32710 sal_memset(q_data, 0, sizeof(_bcm_field_qual_data_t)); 32711 sal_memset(q_mask, 0, sizeof(_bcm_field_qual_data_t)); 32712 32713 /* Retrieve the field entry. */ 32714 rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent); 32715 BCM_IF_ERROR_RETURN(rv); 32716 32717 if ((BCM_FIELD_QSET_TEST(f_ent->group->qset, qual_id)) && 32718 (_BCM_FIELD_IS_PBMP_QUALIFIER(qual_id))) { 32719 BCM_PBMP_CLEAR(f_ent->pbmp.data); 32720 BCM_PBMP_CLEAR(f_ent->pbmp.mask); 32721 } 32722 32723 if (_BCM_FIELD_IS_PRESEL_ENTRY(entry) == TRUE) { 32724 rv = _bcm_field_presel_qualify_set(unit, entry, qual_id, 32725 q_data, q_mask); 32726 32727 if (qual_id == bcmFieldQualifyMixedSrcClassId) { 32728 rv = _bcm_field_th_qualifier_MixedSrcClassId_delete(unit, entry); 32729 } 32730 32731 } else { 32732 if ((qual_id != bcmFieldQualifyExactMatchActionClassId) && 32733 (qual_id != bcmFieldQualifyExactMatchHitStatus) && 32734 (qual_id != bcmFieldQualifyExactMatchGroupClassId)) { 32735 rv = _bcm_field_th_qualify_set(unit, entry, qual_id, 32736 q_data, q_mask, 32737 _FP_QUALIFIER_DEL); 32738 } else { 32739 rv = _field_th_em_qualifier_set(unit, entry, qual_id, 32740 q_data, q_mask); 32741 } 32742 } 32743 32744 if (BCM_FAILURE(rv)) { 32745 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 32746 "Qualifier[%s] delete failed for Entry:%d (0x%x)\n\r"), 32747 _field_qual_name(qual_id), entry, entry)); 32748 } 32749 return (rv); 32750 } 32751 32752 /* 32753 * Function: 32754 * _bcm_field_th_lt_tcam_data_mem_get 32755 * 32756 * Purpose: 32757 * Retrieve Preselector tcam & data memories for a specific pipeline stage. 32758 * 32759 * Parameters: 32760 * unit - (IN) BCM device number. 32761 * stage_fc - (IN) Reference to Field Stage Control structure. 32762 * instance - (IN) Pipe Instance. 32763 * mem_type - (IN) Type of Memory (_BCM_FIELD_MEM_TYPE_xx). 32764 * view_type - (IN) Memory View type (_BCM_FIELD_MEM_VIEW_TYPE_xx). 32765 * tcam_mem - (OUT) Reference to TCAM Memory id. 32766 * data_mem - (OUT) Reference to DATA Memory id. 32767 * 32768 * Returns: 32769 * BCM_E_XXX 32770 */ 32771 int 32772 _bcm_field_th_lt_tcam_policy_mem_get(int unit, _field_stage_t *stage_fc, 32773 int instance, int mem_type, int view_type, 32774 soc_mem_t *tcam_mem, soc_mem_t *data_mem) 32775 { 32776 soc_mem_t tcam_ptr, data_ptr, comb_ptr; 32777 32778 /* Input parameters check. */ 32779 if (NULL == stage_fc) { 32780 return (BCM_E_PARAM); 32781 } 32782 32783 if ((((view_type & _BCM_FIELD_MEM_VIEW_TYPE_TCAM) || 32784 (view_type & _BCM_FIELD_MEM_VIEW_TYPE_TCAM_DATA_COMB)) && 32785 (tcam_mem == NULL)) || 32786 ((view_type & _BCM_FIELD_MEM_VIEW_TYPE_DATA) && 32787 (data_mem == NULL))) { 32788 return (BCM_E_PARAM); 32789 } 32790 32791 /* Validate instance */ 32792 if ((instance < 0) || (instance >= _FP_MAX_NUM_PIPES)) { 32793 return (BCM_E_PARAM); 32794 } 32795 32796 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 32797 instance = _FP_GLOBAL_INST; 32798 } 32799 32800 switch (mem_type) { 32801 case _BCM_FIELD_MEM_TYPE_IFP_LT: 32802 if (stage_fc->stage_id != _BCM_FIELD_STAGE_INGRESS) { 32803 return BCM_E_PARAM; 32804 } 32805 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 32806 IFP_LOGICAL_TABLE_SELECT_TCAM_ONLYm, 32807 instance, &tcam_ptr)); 32808 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 32809 IFP_LOGICAL_TABLE_SELECT_DATA_ONLYm, 32810 instance, &data_ptr)); 32811 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 32812 IFP_LOGICAL_TABLE_SELECTm, 32813 instance, &comb_ptr)); 32814 32815 break; 32816 32817 case _BCM_FIELD_MEM_TYPE_EM_LT: 32818 if (stage_fc->stage_id != _BCM_FIELD_STAGE_EXACTMATCH) { 32819 return BCM_E_PARAM; 32820 } 32821 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 32822 EXACT_MATCH_LOGICAL_TABLE_SELECT_TCAM_ONLYm, 32823 instance, &tcam_ptr)); 32824 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 32825 EXACT_MATCH_LOGICAL_TABLE_SELECT_DATA_ONLYm, 32826 instance, &data_ptr)); 32827 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 32828 EXACT_MATCH_LOGICAL_TABLE_SELECTm, 32829 instance, &comb_ptr)); 32830 break; 32831 32832 #if defined(BCM_FLOWTRACKER_SUPPORT) 32833 case _BCM_FIELD_MEM_TYPE_FT_LT: 32834 if (stage_fc->stage_id != _BCM_FIELD_STAGE_FLOWTRACKER) { 32835 return BCM_E_PARAM; 32836 } 32837 /* Only global mode is supported */ 32838 tcam_ptr = BSK_FTFP_LTS_LOGICAL_TBL_SEL_TCAMm; 32839 data_ptr = BSK_FTFP_LTS_LOGICAL_TBL_SEL_SRAMm; 32840 comb_ptr = INVALIDm; 32841 break; 32842 #endif 32843 32844 default: 32845 return BCM_E_PARAM; 32846 } 32847 switch (view_type) { 32848 case _BCM_FIELD_MEM_VIEW_TYPE_TCAM: 32849 *tcam_mem = tcam_ptr; 32850 break; 32851 case _BCM_FIELD_MEM_VIEW_TYPE_DATA: 32852 *data_mem = data_ptr; 32853 break; 32854 case (_BCM_FIELD_MEM_VIEW_TYPE_TCAM | 32855 _BCM_FIELD_MEM_VIEW_TYPE_DATA): 32856 *tcam_mem = tcam_ptr; 32857 *data_mem = data_ptr; 32858 break; 32859 case _BCM_FIELD_MEM_VIEW_TYPE_TCAM_DATA_COMB: 32860 *tcam_mem = comb_ptr; 32861 break; 32862 default: 32863 return (BCM_E_PARAM); 32864 } 32865 32866 return (BCM_E_NONE); 32867 } 32868 32869 /* 32870 * Function: 32871 * _field_th_write_slice_map_vfp 32872 * 32873 * Purpose: 32874 * Write the VFP_SLICE_MAP (Lookup) or EFP_SLICE_MAP (Egress) 32875 * 32876 * Parameters: 32877 * unit - Device number. 32878 * stage_fc - pointer to stage control block. 32879 * fg - Field Group Structure. 32880 * 32881 * Returns: 32882 * BCM_E_XXX 32883 */ 32884 STATIC int 32885 _field_th_write_slice_map_vfp_efp(int unit, 32886 _field_stage_t *stage_fc, 32887 _field_group_t *fg) 32888 { 32889 soc_reg_t reg; /* HW Register. */ 32890 soc_field_t field; /* HW entry fields. */ 32891 uint32 map_entry; /* HW entry buffer. */ 32892 int vmap_size; /* Virtual map index count. */ 32893 uint32 value; /* Field entry value. */ 32894 int idx; /* Map fields iterator. */ 32895 int rv; /* Operation return status. */ 32896 int inst; /* Pipe Instance. */ 32897 32898 32899 /* Input parameters check. */ 32900 if (NULL == stage_fc || NULL == fg) { 32901 return (BCM_E_PARAM); 32902 } 32903 32904 if ((stage_fc->stage_id != _BCM_FIELD_STAGE_LOOKUP) && 32905 (stage_fc->stage_id != _BCM_FIELD_STAGE_EGRESS)) { 32906 return BCM_E_PARAM; 32907 } 32908 32909 /* Calculate virtual map size. */ 32910 rv = _bcm_field_virtual_map_size_get(unit, stage_fc, &vmap_size); 32911 BCM_IF_ERROR_RETURN(rv); 32912 32913 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 32914 inst = _FP_GLOBAL_INST; 32915 } else { 32916 inst = fg->instance; 32917 } 32918 32919 if ((stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP)) { 32920 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 32921 VFP_SLICE_MAPr, 32922 inst, ®)); 32923 } else { 32924 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 32925 EFP_SLICE_MAPr, 32926 inst, ®)); 32927 } 32928 32929 inst = fg->instance; 32930 32931 rv = soc_reg32_get(unit, reg, REG_PORT_ANY, 0, &map_entry); 32932 BCM_IF_ERROR_RETURN(rv); 32933 32934 for (idx = 0; idx < vmap_size; idx++) { 32935 value = (stage_fc->vmap[inst][_FP_VMAP_DEFAULT][idx]).vmap_key; 32936 field = vfp_efp_virtual_to_physical_map[idx]; 32937 soc_reg_field_set(unit, reg, &map_entry, field, value); 32938 32939 value = (stage_fc->vmap[inst][_FP_VMAP_DEFAULT][idx]).virtual_group; 32940 field = vfp_efp_virtual_to_group_map[idx]; 32941 soc_reg_field_set(unit, reg, &map_entry, field, value); 32942 } 32943 32944 rv = soc_reg32_set(unit, reg, REG_PORT_ANY, 0, map_entry); 32945 BCM_IF_ERROR_RETURN(rv); 32946 32947 return (BCM_E_NONE); 32948 } 32949 32950 /* 32951 * Function: 32952 * _bcm_field_th_write_slice_map 32953 * Purpose: 32954 * Write EFP_SLICE_MAP, VFP_SLICE_MAP for egress and lookup stages. 32955 * Parameters: 32956 * unit - (IN) BCM device number 32957 * stage_fc - (IN) stage control structure 32958 * fg - (IN) reference to field group structure. 32959 * Returns: 32960 * BCM_E_XXX 32961 */ 32962 32963 int 32964 _bcm_field_th_write_slice_map(int unit, 32965 _field_stage_t *stage_fc, 32966 _field_group_t *fg) 32967 { 32968 switch (stage_fc->stage_id) { 32969 case _BCM_FIELD_STAGE_LOOKUP: 32970 case _BCM_FIELD_STAGE_EGRESS: 32971 return (_field_th_write_slice_map_vfp_efp(unit, stage_fc, fg)); 32972 32973 default: 32974 ; 32975 } 32976 32977 return (BCM_E_INTERNAL); 32978 } 32979 32980 /* 32981 * Function: 32982 * _field_th_qset_comb_set 32983 * Purpose: 32984 * set combination for qset array 32985 * Parameters: 32986 * unit - (IN) Unit number. 32987 * arr - (IN) Qual data array 32988 * start - (IN) Start index of iteration 32989 * end - (IN) End index of iteration 32990 * index - (IN) Last member index 32991 * range - (IN) Combination Range 32992 * fc - (IN) field_control to accesss qset_comb 32993 * Returns: 32994 * BCM_E_*** 32995 * Notes: 32996 */ 32997 /* keep track qset_comb index */ 32998 static uint32 qset_count ; 32999 33000 void _field_th_qset_comb_set(int arr[], int data[], int start, 33001 int end, int index, int range, 33002 _field_control_t *fc) 33003 { 33004 int qual_index, comb_index; 33005 33006 if (index == range) 33007 { 33008 fc->extd_qset_comb[qset_count][0] = 0; 33009 33010 for (qual_index = 0; qual_index < range; qual_index++) { 33011 fc->extd_qset_comb[qset_count][0]++; 33012 fc->extd_qset_comb[qset_count][qual_index+1] 33013 = data[qual_index]; 33014 } 33015 33016 qset_count++; 33017 } 33018 33019 /* replace index with all possible elements. */ 33020 for (comb_index=start; 33021 comb_index<=end && end-comb_index+1 >= range-index; comb_index++) 33022 { 33023 data[index] = arr[comb_index]; 33024 _field_th_qset_comb_set(arr, data, comb_index+1, 33025 end, index+1, range, fc); 33026 } 33027 } 33028 33029 /* 33030 * Function: 33031 * _field_th_qset_comb_init 33032 * Purpose: 33033 * initialize qset combination array 33034 * Parameters: 33035 * unit - (IN) Unit number. 33036 * fc - (INOUT) field_control 33037 * Returns: 33038 * BCM_E_*** 33039 * Notes: 33040 */ 33041 33042 int 33043 _field_th_qset_comb_init(int unit, _field_control_t *fc) 33044 { 33045 33046 int qual_data_arr[] = 33047 {_bcmFieldQualifyData0, _bcmFieldQualifyData1, 33048 _bcmFieldQualifyData2, _bcmFieldQualifyData3, 33049 _bcmFieldQualifyData4, _bcmFieldQualifyData5, 33050 _bcmFieldQualifyData6, _bcmFieldQualifyData7, 33051 _bcmFieldQualifyData8, _bcmFieldQualifyData9}; 33052 int temp_store_data[COUNTOF(qual_data_arr)]; 33053 int range, max_range, array_size; 33054 33055 qset_count = 0; 33056 max_range = COUNTOF(fc->extd_qset_comb[0]) - 1; 33057 array_size = COUNTOF(qual_data_arr); 33058 sal_memset(fc->extd_qset_comb, -1, sizeof(fc->extd_qset_comb)); 33059 33060 for (range = 1; range <= max_range; range++) { 33061 /* Program all combination using qual_data_arr[] */ 33062 _field_th_qset_comb_set( 33063 qual_data_arr, temp_store_data, 33064 0, array_size - 1, 33065 0, range, fc); 33066 } 33067 33068 fc->extd_qset_comb_init = 1; 33069 33070 return BCM_E_NONE; 33071 } 33072 33073 /* 33074 * Function: 33075 * _bcm_field_th_udf_chunks_to_int_qset 33076 * Purpose: 33077 * Sets internal data qualifiers corrspeonding to the 33078 * offset chunks used by the UDF. 33079 * Parameters: 33080 * unit - (IN) Unit number. 33081 * udf_chunks_bmap - (IN) UDF offsets chunks map 33082 * qset - (OUT) Qualifier set 33083 * Returns: 33084 * BCM_E_NONE 33085 * Notes: 33086 */ 33087 int 33088 _bcm_field_th_udf_chunks_to_int_qset(int unit, uint32 udf_chunks_bmap, 33089 bcm_field_qset_t *qset) 33090 { 33091 int idx, max_chunks = 0; 33092 33093 max_chunks = BCMI_XGS4_UDF_CTRL_MAX_UDF_CHUNKS(unit); 33094 33095 33096 for (idx = 0; idx < max_chunks; idx++) { 33097 if(udf_chunks_bmap & (1 << idx)) { 33098 if (idx == 0) { 33099 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData0); 33100 } 33101 if (idx == 1) { 33102 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData1); 33103 } 33104 if (idx == 2 || idx == 3) { 33105 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData2); 33106 } 33107 if (idx == 4 || idx == 5) { 33108 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData3); 33109 } 33110 if (idx == 6 || idx == 7) { 33111 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData4); 33112 } 33113 if (idx == 8) { 33114 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData5); 33115 } 33116 if (idx == 9) { 33117 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData6); 33118 } 33119 if (idx == 0xa || idx == 0xb) { 33120 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData7); 33121 } 33122 if (idx == 0xc || idx == 0xd) { 33123 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData8); 33124 } 33125 if (idx == 0xe || idx == 0xf) { 33126 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData9); 33127 } 33128 } 33129 } 33130 return BCM_E_NONE; 33131 } 33132 33133 /* 33134 * Function: 33135 * _bcm_field_th_qset_udf_offsets_alloc 33136 * Purpose: 33137 * Allocates offset chunks based on the INPUT qset. 33138 * Parameters: 33139 * unit - (IN) Unit number. 33140 * stage - (IN) Field Group Stage. 33141 * qset - (IN) Qualifier set. 33142 * req_offsets - (IN) Number of chunks to be allocated. 33143 * offset_array - (OUT) Offset chunks in the order of availability. 33144 * Returns: 33145 * BCM_E_XXX 33146 * Notes: 33147 */ 33148 int 33149 _bcm_field_th_qset_udf_offsets_alloc(int unit, _field_stage_id_t stage, 33150 bcm_field_qset_t qset, int req_offsets, int offset_array[], int *max_chunks, 33151 int pipe_num) 33152 { 33153 int group_flags[5] = { 33154 /* SINGLE */ 33155 (_FP_GROUP_SPAN_SINGLE_SLICE), 33156 /* DOUBLE_INTRA */ 33157 (_FP_GROUP_SPAN_SINGLE_SLICE | _FP_GROUP_INTRASLICE_DOUBLEWIDE), 33158 /* DOUBLE */ 33159 (_FP_GROUP_SPAN_DOUBLE_SLICE), 33160 /* QUAD_INTRA */ 33161 (_FP_GROUP_SPAN_DOUBLE_SLICE | _FP_GROUP_INTRASLICE_DOUBLEWIDE), 33162 /* TRIPLE */ 33163 (_FP_GROUP_SPAN_TRIPLE_SLICE) 33164 }; 33165 33166 int i, j; 33167 int qid; 33168 int qual_count; 33169 int rv = BCM_E_NONE; 33170 int num_chunks = 0; 33171 _field_group_t fg; 33172 bcm_field_qset_t qset_test; 33173 int idx; 33174 33175 uint32 qset_comb_count; 33176 33177 _field_control_t *fc = NULL; 33178 _field_group_add_fsm_t fsm_ptr; 33179 _field_stage_t *stage_fc; /* Stage Field control structure*/ 33180 33181 BCM_IF_ERROR_RETURN( 33182 _field_control_get(unit, &fc)); 33183 33184 if (fc->extd_qset_comb_init != 1) { 33185 BCM_IF_ERROR_RETURN(_field_th_qset_comb_init(unit, fc)); 33186 } 33187 33188 qset_comb_count = COUNTOF(fc->extd_qset_comb); 33189 33190 /* Initialize group creation tracking structure. */ 33191 sal_memset(&fg, 0, sizeof(fg)); 33192 33193 fg.stage_id = stage; 33194 33195 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg.stage_id, 33196 &stage_fc)); 33197 33198 for (i = 0; i < COUNTOF(group_flags); i++) { 33199 33200 /* TD_TT family support intra_double mode group only in VFP */ 33201 if (soc_feature(unit, soc_feature_field_intraslice_double_wide)) { 33202 if (((i == 1) || (i == 4)) && (stage != _BCM_FIELD_STAGE_LOOKUP)) { 33203 continue; 33204 } 33205 } 33206 33207 if ((soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) && (i == 0)) { 33208 continue; 33209 } 33210 if ((stage == _BCM_FIELD_STAGE_INGRESS) || 33211 (stage == _BCM_FIELD_STAGE_EXACTMATCH)) { 33212 /* Skip quad mode for ingress and EM */ 33213 if ( i == 3) { 33214 continue; 33215 } 33216 } 33217 33218 fg.flags = group_flags[i]; 33219 33220 for (j = 0; j < qset_comb_count; j++) { 33221 33222 num_chunks = 0; 33223 qual_count = fc->extd_qset_comb[j][0]; 33224 33225 sal_memcpy(&qset_test, &qset, sizeof(bcm_field_qset_t)); 33226 33227 for (qid = 0; qid < qual_count; qid++) { 33228 BCM_FIELD_QSET_ADD_INTERNAL(qset_test, fc->extd_qset_comb[j][1 + qid]); 33229 } 33230 if (BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageLookup) || 33231 (_BCM_FIELD_STAGE_LOOKUP == stage)) { 33232 rv = _field_selcode_assign(unit, qset_test, 1, &fg); 33233 } else if 33234 (BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageIngress) || 33235 !(BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageLookup)) || 33236 BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageEgress) || 33237 BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageClass) || 33238 BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageClassExactMatch) || 33239 BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageIngressExactMatch)) { 33240 sal_memset(&fsm_ptr, 0, sizeof(_field_group_add_fsm_t)); 33241 fsm_ptr.fg = &fg; 33242 fsm_ptr.fc = fc; 33243 fsm_ptr.stage_fc = stage_fc; 33244 fg.qset = qset_test; 33245 fsm_ptr.flags |= _FP_GROUP_CONFIG_VALIDATE; 33246 rv = _field_th_ext_code_assign(unit, 1, &fsm_ptr); 33247 } else { 33248 return BCM_E_PARAM; 33249 } 33250 33251 if (BCM_SUCCESS(rv)) { 33252 33253 for (qid = 0; qid < qual_count; qid++) { 33254 rv = _bcm_esw_field_qual_udf_offsets_get(unit, 33255 fc->extd_qset_comb[j][1 + qid], &fg, 33256 offset_array+num_chunks, &num_chunks, 33257 pipe_num); 33258 if (BCM_FAILURE(rv)) { 33259 if (BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageLookup)) { 33260 for (idx = 0; idx < _FP_MAX_ENTRY_WIDTH; idx++) { 33261 BCM_IF_ERROR_RETURN(_bcm_field_group_qualifiers_free(&fg, idx)); 33262 } 33263 } 33264 return rv; 33265 } 33266 } 33267 33268 if (num_chunks >= req_offsets) { 33269 break; 33270 } 33271 } 33272 } 33273 if (num_chunks >= req_offsets) { 33274 break; 33275 } 33276 } 33277 33278 #if 0 33279 if (BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageLookup)) { 33280 for (idx = 0; idx < _FP_MAX_ENTRY_WIDTH; idx++) { 33281 BCM_IF_ERROR_RETURN(_bcm_field_group_qualifiers_free(&fg, idx)); 33282 } 33283 } 33284 #endif 33285 33286 /* The UDF offset allocation to suit in an fp group 33287 * that consists of the user specified qset is not possible */ 33288 if (num_chunks < req_offsets) { 33289 return BCM_E_RESOURCE; 33290 } 33291 33292 *max_chunks = num_chunks; 33293 33294 return BCM_E_NONE; 33295 } 33296 33297 /* 33298 * Function: 33299 * _bcm_field_th_qual_udf_offsets_get 33300 * Purpose: 33301 * Gets list of udf id objects in a qset 33302 * Parameters: 33303 * unit - (IN) Unit number. 33304 * qid - (IN) Internal Data qualifier. 33305 * chunk_order - (IN) Offset chunks in the order of availability. 33306 * num_chunks - (OUT) Number of chunks. 33307 * Returns: 33308 * BCM_E_NONE 33309 * Notes: 33310 */ 33311 int 33312 _bcm_field_th_qual_udf_offsets_get(int unit, int qid, 33313 int chunk_order[], int *num_chunks, 33314 uint32 hw_bmap) 33315 { 33316 int idx; 33317 int alloc_count = 0; 33318 33319 int max_chunks = BCMI_XGS4_UDF_CTRL_MAX_UDF_CHUNKS(unit); 33320 33321 _field_control_t *fc; 33322 33323 BCM_IF_ERROR_RETURN( 33324 _field_control_get(unit, &fc)); 33325 33326 33327 for (idx = 0; idx < max_chunks; idx++) { 33328 /* coverity[ptr_arith] */ 33329 if (SHR_BITGET(&hw_bmap, idx)) { 33330 continue; 33331 } 33332 33333 33334 if (((qid == _bcmFieldQualifyData0) && (idx == 0)) || 33335 ((qid == _bcmFieldQualifyData1) && (idx == 1)) || 33336 ((qid == _bcmFieldQualifyData2) && ((idx == 2) || (idx == 3))) || 33337 ((qid == _bcmFieldQualifyData3) && ((idx == 4) || (idx == 5))) || 33338 ((qid == _bcmFieldQualifyData4) && ((idx == 6) || (idx == 7))) || 33339 ((qid == _bcmFieldQualifyData5) && ((idx == 8))) || 33340 ((qid == _bcmFieldQualifyData6) && ((idx == 9))) || 33341 ((qid == _bcmFieldQualifyData7) && ((idx == 0xa) || (idx == 0xb))) || 33342 ((qid == _bcmFieldQualifyData8) && ((idx == 0xc) || (idx == 0xd))) || 33343 ((qid == _bcmFieldQualifyData9) && ((idx == 0xe) || (idx == 0xf)))) { 33344 33345 chunk_order[alloc_count] = idx; 33346 alloc_count++; 33347 33348 if ((*num_chunks + alloc_count) >= max_chunks) { 33349 break; 33350 } 33351 } 33352 } 33353 33354 *num_chunks += alloc_count; 33355 33356 return BCM_E_NONE; 33357 } 33358 33359 33360 /* 33361 * Function: 33362 * _bcm_field_th_qualify_udf_data_elem_get 33363 * Purpose: 33364 * get qualifier id based on udf chunk index 33365 * Parameters: 33366 * unit - (IN) Unit number. 33367 * idx - (IN) Index of UDF chunk 33368 * max_chunks - (IN) Total number of UDF chunk 33369 * qid - (INOUT) Qualifier ID 33370 * Returns: 33371 * BCM_E_XXX 33372 * Notes: 33373 */ 33374 int 33375 _bcm_field_th_qualify_udf_data_elem_get(int unit, int idx, 33376 int max_chunks, 33377 int *qid) 33378 { 33379 if ((idx >= 0) && (idx < max_chunks)) { 33380 if (idx == 0) { 33381 *qid = _bcmFieldQualifyData0; 33382 } 33383 if (idx == 1) { 33384 *qid = _bcmFieldQualifyData1; 33385 } 33386 if (idx == 2 || idx == 3) { 33387 *qid = _bcmFieldQualifyData2; 33388 } 33389 if (idx == 4 || idx == 5) { 33390 *qid = _bcmFieldQualifyData3; 33391 } 33392 if (idx == 6 || idx == 7) { 33393 *qid = _bcmFieldQualifyData4; 33394 } 33395 if (idx == 8) { 33396 *qid = _bcmFieldQualifyData5; 33397 } 33398 if (idx == 9) { 33399 *qid = _bcmFieldQualifyData6; 33400 } 33401 if (idx == 0xa || idx == 0xb) { 33402 *qid = _bcmFieldQualifyData7; 33403 } 33404 if (idx == 0xc || idx == 0xd) { 33405 *qid = _bcmFieldQualifyData8; 33406 } 33407 if (idx == 0xe || idx == 0xf) { 33408 *qid = _bcmFieldQualifyData9; 33409 } 33410 return BCM_E_NONE; 33411 } else { 33412 return BCM_E_PARAM; 33413 } 33414 } 33415 33416 /* 33417 * Function: 33418 * bcm_field_th_qualify_udf_get 33419 * Purpose: 33420 * Qualify the field entry with data/mask corresponding to an offset chunk. 33421 * Parameters: 33422 * unit - (IN) Unit number. 33423 * eid - (IN) Field Entry. 33424 * udf_id - (IN) UDF ID. 33425 * max_length - (IN) Length of bytes of data/mask to fetch. 33426 * data - (OUT) Data to qualify the entry. 33427 * mask - (OUT Mask to qualify the entry. 33428 * actual_length - (OUT) Length of bytes of data/mask fetched. 33429 * Returns: 33430 * BCM_E_XXX 33431 * Notes: 33432 */ 33433 int 33434 bcmi_field_th_qualify_udf_get(int unit, bcm_field_entry_t eid, 33435 bcm_udf_id_t udf_id, int max_length, 33436 uint8 *data, uint8 *mask, int *actual_length) 33437 { 33438 _field_stage_t *stage_fc; /* Stage field control. */ 33439 _field_entry_t *f_ent = NULL; 33440 _field_group_t *fg; 33441 bcm_field_qset_t *qset; 33442 _bcm_field_udf_data_t q_data; 33443 _bcm_field_udf_data_t q_mask; 33444 uint32 local_data, local_mask; 33445 bcmi_xgs4_udf_offset_info_t *offset_info = NULL; /* UDF offset info. */ 33446 uint8 *p_data = (uint8 *) &q_data; /* qualifier data pointer */ 33447 uint8 *p_mask = (uint8 *) &q_mask; /* qualifier mask pointer */ 33448 uint8 *p_local_data = (uint8 *) &local_data; /* 32bit qualifier data pointer */ 33449 uint8 *p_local_mask = (uint8 *) &local_mask; /* 32bit qualifier mask pointer */ 33450 int num_elems = 0; 33451 int qid = 0, qual_index = 0; 33452 int iter_idx = 0, hw_idx = 0; /* HW bitmap iteration index. */ 33453 int rv; /* Operation return status. */ 33454 int copy_mem = 0, shift = 2, num_qual = 0; 33455 int copy_len; 33456 int len = 0; 33457 int offset_2_3 = 0; /* HW offset 0 and 1 usage status. */ 33458 int offset_4_5 = 0; /* HW offset 2 and 3 usage status. */ 33459 int offset_6_7 = 0; /* HW offset 4 and 5 usage status. */ 33460 int offset_a_b = 0; /* HW offset 8 and 9 usage status. */ 33461 int offset_c_d = 0; /* HW offset a and b usage status. */ 33462 int offset_e_f = 0; /* HW offset c and d usage status. */ 33463 33464 #ifdef LE_HOST 33465 uint32 data_swap, mask_swap; 33466 #endif /* LE_HOST */ 33467 33468 33469 FP_LOCK(unit); 33470 UDF_LOCK(unit); 33471 33472 /* Get UDF info. */ 33473 rv = bcmi_xgs4_udf_offset_node_get(unit, udf_id, &offset_info); 33474 if (BCM_FAILURE(rv)) { 33475 FP_UNLOCK(unit); 33476 UDF_UNLOCK(unit); 33477 return (rv); 33478 } 33479 33480 /* Get stage field control structure. */ 33481 rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc); 33482 if (BCM_FAILURE(rv)) { 33483 FP_UNLOCK(unit); 33484 UDF_UNLOCK(unit); 33485 return (rv); 33486 } 33487 33488 rv = _bcm_field_entry_get_by_id(unit, eid, &f_ent); 33489 if (BCM_FAILURE(rv)) { 33490 FP_UNLOCK(unit); 33491 UDF_UNLOCK(unit); 33492 return (rv); 33493 } 33494 33495 /* Get field group */ 33496 fg = f_ent->group; 33497 33498 num_elems = BCMI_XGS4_UDF_CTRL_MAX_UDF_CHUNKS(unit); 33499 33500 /* get qset */ 33501 qset = &(fg->qset); 33502 33503 for (qual_index = _bcmFieldQualifyData0; 33504 qual_index < _bcmFieldQualifyCount; qual_index++) { 33505 33506 num_qual = 1; 33507 33508 if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) && 33509 qual_index == _bcmFieldQualifyData0) { 33510 if (SHR_BITGET(qset->udf_map, 0x0)) { 33511 qid = _bcmFieldQualifyData0; 33512 hw_idx = 0x0; 33513 copy_mem = 1; 33514 } 33515 } 33516 else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) && 33517 qual_index == _bcmFieldQualifyData1) { 33518 if (SHR_BITGET(qset->udf_map, 0x1)) { 33519 qid = _bcmFieldQualifyData1; 33520 hw_idx = 0x1; 33521 copy_mem = 1; 33522 } 33523 } 33524 else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) && 33525 qual_index == _bcmFieldQualifyData5) { 33526 if (SHR_BITGET(qset->udf_map, 0x8)) { 33527 qid = _bcmFieldQualifyData5; 33528 hw_idx = 0x8; 33529 copy_mem = 1; 33530 } 33531 } 33532 else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) && 33533 qual_index == _bcmFieldQualifyData6) { 33534 if (SHR_BITGET(qset->udf_map, 0x9)) { 33535 qid = _bcmFieldQualifyData6; 33536 hw_idx = 0x9; 33537 copy_mem = 1; 33538 } 33539 } 33540 else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) && 33541 qual_index == _bcmFieldQualifyData2) { 33542 SHR_BITTEST_RANGE(qset->udf_map, 0x2, 2, offset_2_3); 33543 if (offset_2_3) { 33544 num_qual = 2; 33545 qid = _bcmFieldQualifyData2; 33546 hw_idx = 0x2; 33547 copy_mem = 1; 33548 } 33549 } 33550 else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) && 33551 qual_index == _bcmFieldQualifyData3) { 33552 SHR_BITTEST_RANGE(qset->udf_map, 0x4, 2, offset_4_5); 33553 if (offset_4_5) { 33554 num_qual = 2; 33555 qid = _bcmFieldQualifyData3; 33556 hw_idx = 0x4; 33557 copy_mem = 1; 33558 } 33559 } 33560 else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) && 33561 qual_index == _bcmFieldQualifyData4) { 33562 SHR_BITTEST_RANGE(qset->udf_map, 0x6, 2, offset_6_7); 33563 if (offset_6_7) { 33564 num_qual = 2; 33565 qid = _bcmFieldQualifyData4; 33566 hw_idx = 0x6; 33567 copy_mem = 1; 33568 } 33569 } 33570 else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) && 33571 qual_index == _bcmFieldQualifyData7) { 33572 SHR_BITTEST_RANGE(qset->udf_map, 0xa, 2, offset_a_b); 33573 if (offset_a_b) { 33574 num_qual = 2; 33575 qid = _bcmFieldQualifyData7; 33576 hw_idx = 0xa; 33577 copy_mem = 1; 33578 } 33579 } 33580 else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) && 33581 qual_index == _bcmFieldQualifyData8) { 33582 SHR_BITTEST_RANGE(qset->udf_map, 0xc, 2, offset_c_d); 33583 if (offset_c_d) { 33584 num_qual = 2; 33585 qid = _bcmFieldQualifyData8; 33586 hw_idx = 0xc; 33587 copy_mem = 1; 33588 } 33589 } 33590 else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) && 33591 qual_index == _bcmFieldQualifyData9) { 33592 SHR_BITTEST_RANGE(qset->udf_map, 0xe, 2, offset_e_f); 33593 if (offset_e_f) { 33594 num_qual = 2; 33595 qid = _bcmFieldQualifyData9; 33596 hw_idx = 0xe; 33597 copy_mem = 1; 33598 } 33599 } else { 33600 hw_idx = 0; 33601 num_qual = 0; 33602 } 33603 33604 if (copy_mem == 1) { 33605 _bcm_field_entry_qualifier_uint32_get(unit, eid, qid, &local_data, &local_mask); 33606 } 33607 33608 33609 #ifdef LE_HOST 33610 data_swap = _shr_swap32(local_data); 33611 local_data = data_swap; 33612 33613 mask_swap = _shr_swap32(local_mask); 33614 local_mask = mask_swap; 33615 33616 #endif /* LE_HOST */ 33617 33618 /* Copy the data and mask */ 33619 if ((hw_idx < num_elems) && (copy_mem) && 33620 (len < offset_info->width)) { 33621 33622 for (iter_idx = 0; iter_idx < num_qual; iter_idx++) { 33623 if (!(offset_info->hw_bmap & (1 << hw_idx))) { 33624 continue; 33625 } 33626 33627 copy_len = ((offset_info->width - len) == 1)? 1 : 2; 33628 33629 if (len == 0) { 33630 sal_memcpy((p_data + len), p_local_data + offset_info->byte_offset, copy_len); 33631 sal_memcpy((p_mask + len), p_local_mask + offset_info->byte_offset, copy_len); 33632 } 33633 else if ((num_qual == 1) || (iter_idx %2 == 0)) { 33634 sal_memcpy((p_data + len), p_local_data, copy_len); 33635 sal_memcpy((p_mask + len), p_local_mask, copy_len); 33636 } else { 33637 sal_memcpy((p_data + len), p_local_data + shift, copy_len); 33638 sal_memcpy((p_mask + len), p_local_mask + shift, copy_len); 33639 } 33640 33641 len+= copy_len; 33642 hw_idx++; 33643 } 33644 } 33645 copy_mem = 0; 33646 33647 } /* end of qual_index++ */ 33648 33649 sal_memcpy(data, p_data, offset_info->width); 33650 sal_memcpy(mask, p_mask, offset_info->width); 33651 33652 *actual_length = offset_info->width; 33653 33654 FP_UNLOCK(unit); 33655 UDF_UNLOCK(unit); 33656 33657 return BCM_E_NONE; 33658 } 33659 33660 /* 33661 * Function: 33662 * _bcm_field_th_qualify_LoopbackType 33663 * Purpose: 33664 * Encode the loopback type qualified for Stage Egress 33665 * Parameters: 33666 * unit - (IN) BCM device number 33667 * loopback_type - (IN) Loopback Type 33668 * tcam_data - (OUT) Qualifier data 33669 * tcam_mask - (OUT) Qualifier mask 33670 * Returns: 33671 * BCM_E_XXX 33672 */ 33673 int _bcm_field_th_qualify_LoopbackType( 33674 int unit, 33675 bcm_field_LoopbackType_t loopback_type, 33676 uint32 *tcam_data, 33677 uint32 *tcam_mask) 33678 { 33679 switch (loopback_type) { 33680 case bcmFieldLoopbackTypeAny: 33681 *tcam_data = 0x10; 33682 *tcam_mask = 0x10; 33683 break; 33684 case bcmFieldLoopbackTypeTunnelAny: 33685 *tcam_data = 0x10; 33686 *tcam_mask = 0x1f; 33687 break; 33688 case bcmFieldLoopbackTypeTrillNetwork: 33689 *tcam_data = 0x11; 33690 *tcam_mask = 0x1f; 33691 break; 33692 case bcmFieldLoopbackTypeTrillAccess: 33693 *tcam_data = 0x12; 33694 *tcam_mask = 0x1f; 33695 break; 33696 case bcmFieldLoopbackTypeMasquerade: 33697 *tcam_data = 0x13; 33698 *tcam_mask = 0x1f; 33699 break; 33700 default: 33701 return (BCM_E_PARAM); 33702 } 33703 33704 return (BCM_E_NONE); 33705 33706 } 33707 33708 /* 33709 * Function: 33710 * _bcm_field_th_qualify_LoopbackType_get 33711 * Purpose: 33712 * Decode the loopback type qualified in Stage Egress 33713 * Parameters: 33714 * unit - (IN) BCM device number 33715 * tcam_data - (IN) Qualifier data 33716 * tcam_mask - (IN) Qualifier mask 33717 * loopback_type - (OUT) Loopback Type 33718 * Returns: 33719 * BCM_E_XXX 33720 */ 33721 int 33722 _bcm_field_th_qualify_LoopbackType_get( 33723 uint8 tcam_data, 33724 uint8 tcam_mask, 33725 bcm_field_LoopbackType_t *loopback_type) 33726 { 33727 switch (tcam_data & tcam_mask) { 33728 case 0x10: 33729 if (tcam_mask == 0x10) { 33730 *loopback_type = bcmFieldLoopbackTypeAny; 33731 } else { 33732 *loopback_type = bcmFieldLoopbackTypeTunnelAny; 33733 } 33734 break; 33735 case 0x11: 33736 *loopback_type = bcmFieldLoopbackTypeTrillNetwork; 33737 break; 33738 case 0x12: 33739 *loopback_type = bcmFieldLoopbackTypeTrillAccess; 33740 break; 33741 case 0x13: 33742 *loopback_type = bcmFieldLoopbackTypeMasquerade; 33743 break; 33744 default: 33745 return (BCM_E_PARAM); 33746 } 33747 33748 return (BCM_E_NONE); 33749 } 33750 33751 /* 33752 * Function: 33753 * _bcm_field_th_entry_tcam_index_get 33754 * 33755 * Purpose: 33756 * Retrieve Field group entry's assigned TCAM index. 33757 * 33758 * Parameters: 33759 * unit - (IN) BCM device number 33760 * eid - (IN) Field entry ID. 33761 * logical_tcam_idx - (OUT) Reference to Entry's logical tcam index. 33762 * physical_tcam_idx - (OUT) Reference to Entry's Physical tcam index. 33763 * 33764 * Returns: 33765 * BCM_E_xx 33766 * 33767 * Note: 33768 * In-case of IFP_TCAM narrow mode, the logical index is the free TCAM index 33769 * assigned to the entry during creation and the physical index is the 33770 * mapped HW index where the entry is actually written on priority basis. 33771 * For wide mode TCAMs, the logical and physical indices are same. 33772 */ 33773 33774 int _bcm_field_th_entry_tcam_index_get(int unit, bcm_field_entry_t eid, 33775 int *logical_tcam_idx, 33776 int *physical_tcam_idx) 33777 { 33778 int rv; 33779 _field_entry_t *f_ent; 33780 soc_mem_t mem = INVALIDm; 33781 33782 if (logical_tcam_idx == NULL || physical_tcam_idx == NULL) { 33783 return BCM_E_PARAM; 33784 } 33785 33786 BCM_IF_ERROR_RETURN(_bcm_field_entry_get_by_id(unit, eid, &f_ent)); 33787 33788 *logical_tcam_idx = *physical_tcam_idx = f_ent->slice_idx; 33789 33790 if ((f_ent->group->stage_id == _BCM_FIELD_STAGE_INGRESS) && 33791 ((f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) && 33792 !(f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE))) { 33793 mem = IFP_TCAMm; 33794 } else { 33795 return BCM_E_NONE; 33796 } 33797 33798 rv = soc_mem_field_nw_tcam_prio_order_index_get(unit, mem, 33799 physical_tcam_idx); 33800 if (SOC_FAILURE(rv)) { 33801 return BCM_E_INTERNAL; 33802 } 33803 33804 return BCM_E_NONE; 33805 } 33806 33807 /* 33808 * Function: 33809 * _bcm_field_th_ifp_slice_mode_get 33810 * Purpose: 33811 * Retrieve the slice TCAM mode and enable status. 33812 * Parameters: 33813 * unit - (IN) BCM Device number. 33814 * pipe - (IN) Pipe Instance. (pipe < 0 indicates Global.) 33815 * slice_num - (IN) IFP TCAM Slice number. 33816 * slice_mode - (OUT) IFP TCAM mode. 33817 * slice_enabled - (OUT) Whether the slice is enabled. 33818 * 33819 * Returns: 33820 * BCM_E_XXX 33821 */ 33822 int 33823 _bcm_field_th_ifp_slice_mode_get(int unit, int pipe, int slice_num, 33824 int *slice_mode, int *slice_enabled) 33825 { 33826 _field_slice_t *fs = NULL; 33827 _field_stage_t *stage_fc; 33828 int inst; 33829 uint8 status; /* Field Init status. */ 33830 33831 /* Validate input parameters */ 33832 if ((slice_mode == NULL) || (slice_enabled == NULL) || 33833 (pipe >= SOC_MAX_NUM_PIPES) || 33834 (slice_num < 0 && slice_num > 11)) { 33835 return BCM_E_PARAM; 33836 } 33837 33838 BCM_IF_ERROR_RETURN(_bcm_field_initialized_status_get(unit, &status)); 33839 if (status == FALSE) { 33840 return BCM_E_INIT; 33841 } 33842 33843 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, 33844 _BCM_FIELD_STAGE_INGRESS, &stage_fc)); 33845 33846 if ((stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) && 33847 (pipe >= 0)) { 33848 return BCM_E_CONFIG; 33849 } 33850 33851 inst = (pipe < 0) ? 0 : pipe; 33852 /* coverity[overrun-local : FALSE] */ 33853 fs = stage_fc->slices[inst] + slice_num; 33854 if (_BCM_FIELD_SLICE_HW_ENABLE & fs->slice_flags) { 33855 *slice_enabled = TRUE; 33856 if (soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) { 33857 *slice_mode = _IFP_SLICE_MODE_WIDE; 33858 } else { 33859 /* Determine the slice mode based on group flags. */ 33860 *slice_mode = _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(fs->group_flags) ? 33861 _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW; 33862 } 33863 } else { 33864 *slice_enabled = FALSE; 33865 *slice_mode = _IFP_SLICE_MODE_WIDE; /* default mode */ 33866 } 33867 33868 return BCM_E_NONE; 33869 } 33870 33871 /* 33872 * Function: 33873 * _bcm_field_th_resync 33874 * Purpose: 33875 * Sync HW entries with SW entries. 33876 * Parameters: 33877 * unit - (IN) BCM Device number. 33878 * stage_fc - (IN) Reference to Field stage structure. 33879 * 33880 * Returns: 33881 * BCM_E_XXX 33882 */ 33883 int 33884 _bcm_field_th_resync(int unit, _field_stage_t *stage_fc) 33885 { 33886 33887 int rv, tcam_idx; 33888 _field_slice_t *fs; 33889 soc_mem_t mem = INVALIDm; 33890 soc_reg_t reg = INVALIDr; 33891 soc_field_t field = VALIDf; 33892 uint32 valid, e[SOC_MAX_MEM_FIELD_WORDS]; 33893 uint32 regval = 0, enable = 0, mode = 0; 33894 int slice = 0, slice_idx = 0; 33895 int inst, mem_inst; 33896 soc_mem_t ifp_tcam_wide; 33897 soc_mem_t ifp_tcam_narrow; 33898 _field_control_t *fc; /* Field control structure. */ 33899 33900 if (stage_fc == NULL) { 33901 return BCM_E_PARAM; 33902 } 33903 33904 if (stage_fc->stage_id != _BCM_FIELD_STAGE_INGRESS) { 33905 return BCM_E_NONE; 33906 } 33907 33908 /* Get field control structure. */ 33909 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 33910 33911 for (inst = 0; inst < stage_fc->num_instances; inst++) { 33912 if (!(fc->pipe_map & (1 << inst))) { 33913 continue; 33914 } 33915 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 33916 mem_inst = _FP_GLOBAL_INST; 33917 } else { 33918 mem_inst = inst; 33919 } 33920 33921 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, IFP_CONFIGr, 33922 mem_inst, ®)); 33923 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 33924 IFP_TCAM_WIDEm, 33925 mem_inst, 33926 &ifp_tcam_wide)); 33927 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 33928 IFP_TCAMm, 33929 mem_inst, 33930 &ifp_tcam_narrow)); 33931 33932 for (slice = 0; slice < stage_fc->num_instances; slice++) { 33933 if (!(fc->pipe_map & (1 << slice))) { 33934 continue; 33935 } 33936 BCM_IF_ERROR_RETURN 33937 (soc_reg32_get(unit, reg, REG_PORT_ANY, slice, ®val)); 33938 enable = soc_reg_field_get(unit, reg, regval, IFP_SLICE_ENABLEf); 33939 if (enable == 0) { 33940 continue; 33941 } 33942 33943 if (soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) { 33944 mode = _IFP_SLICE_MODE_WIDE; 33945 mem = ifp_tcam_narrow; 33946 } else { 33947 mode = soc_reg_field_get(unit, reg, regval, IFP_SLICE_MODEf); 33948 mem = (mode == _IFP_SLICE_MODE_WIDE) ? 33949 ifp_tcam_wide : ifp_tcam_narrow; 33950 } 33951 33952 fs = &stage_fc->slices[inst][slice]; 33953 33954 for (slice_idx = 0; slice_idx < fs->entry_count; slice_idx++) { 33955 33956 (void)_bcm_field_th_slice_offset_to_tcam_idx(unit, stage_fc, inst, 33957 slice, slice_idx, 33958 &tcam_idx); 33959 /* Read tcam entry. */ 33960 sal_memset(e, 0, sizeof(uint32) * SOC_MAX_MEM_FIELD_WORDS); 33961 rv = soc_mem_read(unit, mem, MEM_BLOCK_ANY, tcam_idx, e); 33962 if (BCM_FAILURE(rv)) { 33963 return rv; 33964 } 33965 valid = soc_mem_field32_get(unit, mem, e, field); 33966 if ((valid) && (fs->entries[slice_idx] == NULL)) { 33967 soc_mem_field32_set(unit, mem, e, field, 0); 33968 rv = soc_mem_write(unit, mem, MEM_BLOCK_ANY, tcam_idx, e); 33969 if (BCM_FAILURE(rv)) { 33970 return rv; 33971 } 33972 } 33973 } 33974 if (fs->entry_count == fs->free_count) { 33975 uint32 regval_old, regval_new; 33976 33977 BCM_IF_ERROR_RETURN 33978 (soc_reg32_get(unit, reg, REG_PORT_ANY, slice, ®val_old)); 33979 regval_new = regval_old; 33980 soc_reg_field_set(unit, reg, ®val_new, IFP_SLICE_ENABLEf, enable); 33981 soc_reg_field_set(unit, reg, ®val_new, IFP_SLICE_LOOKUP_ENABLEf, enable); 33982 33983 if (!soc_feature(unit, 33984 soc_feature_ifp_no_narrow_mode_support)) { 33985 soc_reg_field_set(unit, reg, ®val_new, 33986 IFP_SLICE_MODEf, mode); 33987 } 33988 33989 if (regval_new != regval_old) { 33990 BCM_IF_ERROR_RETURN 33991 (soc_reg32_set(unit, reg, REG_PORT_ANY, slice_idx, regval_new)); 33992 } 33993 } 33994 } 33995 } 33996 33997 return BCM_E_NONE; 33998 } 33999 34000 /* 34001 * Function: 34002 * _bcm_field_th_entry_phys_dump 34003 * 34004 * Purpose: 34005 * Show contents of a physical entry structure 34006 * 34007 * Parameters: 34008 * unit - BCM device number 34009 * f_ent - Physical entry to dump 34010 * Returns: 34011 * Nothing. 34012 */ 34013 int 34014 _bcm_field_th_entry_phys_dump(int unit, _field_entry_t *f_ent) 34015 { 34016 int idx; 34017 int qual_idx; 34018 _field_group_t *fg; 34019 _bcm_field_qual_data_t q_data; 34020 _bcm_field_qual_data_t q_mask; 34021 _bcm_field_qual_offset_t q_offset; 34022 int rv, i; 34023 int entry_parts = 0; 34024 int part_ct; 34025 uint32 data = 0; 34026 uint32 mask = 0; 34027 _field_stage_t *stage_fc; 34028 #if defined(BCM_TOMAHAWK2_SUPPORT) 34029 bcm_pbmp_t mask_pbmp; 34030 bcm_port_t mask_port; 34031 #endif 34032 _field_control_t *fc; /* Field control structure. */ 34033 uint32 offset = 0; 34034 34035 /* Input validation check */ 34036 if (f_ent == NULL) { 34037 return BCM_E_PARAM; 34038 } 34039 34040 /* Get field control structure. */ 34041 BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc)); 34042 34043 /* Get number of parts in field entry based on group flags. */ 34044 rv = _bcm_field_th_entry_tcam_parts_count (unit, f_ent->group->flags, 34045 &entry_parts); 34046 BCM_IF_ERROR_RETURN(rv); 34047 34048 if ((f_ent->group->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) && 34049 (soc_feature(unit, soc_feature_bscan_fae_port_flow_exclude))) { 34050 offset = 4; 34051 } 34052 34053 for (part_ct = 0; part_ct < entry_parts; part_ct++) { 34054 34055 if (part_ct) { 34056 LOG_CLI((BSL_META_U(unit,"\n"))); 34057 } 34058 34059 LOG_CLI((BSL_META_U(unit, 34060 " slice=%d, slice_idx=%#x," 34061 " part =%d, prio=%#x, flags=%#x, "), 34062 (f_ent + part_ct)->fs->slice_number, 34063 (f_ent + part_ct)->slice_idx + offset, part_ct, 34064 (f_ent + part_ct)->prio, (f_ent + part_ct)->flags)); 34065 34066 if (!((f_ent + part_ct)->flags & _FP_ENTRY_INSTALLED)) { 34067 if ((f_ent + part_ct)->flags & 34068 _FP_ENTRY_EXACT_MATCH_GROUP_DEFAULT) { 34069 LOG_CLI((BSL_META_U(unit, 34070 "Default, "))); 34071 } 34072 LOG_CLI((BSL_META_U(unit, 34073 "Not installed"))); 34074 } else { 34075 LOG_CLI((BSL_META_U(unit, 34076 "Installed, "))); 34077 34078 if (!((f_ent + part_ct)->flags & _FP_ENTRY_ENABLED)) { 34079 LOG_CLI((BSL_META_U(unit, 34080 "Disabled"))); 34081 } 34082 34083 else { 34084 LOG_CLI((BSL_META_U(unit, 34085 "Enabled"))); 34086 } 34087 34088 if ((f_ent + part_ct)->flags & _FP_ENTRY_EXACT_MATCH_GROUP_DEFAULT) { 34089 LOG_CLI((BSL_META_U(unit, 34090 ", Default"))); 34091 } 34092 34093 if ((f_ent + part_ct)->flags & _FP_ENTRY_DIRTY) { 34094 LOG_CLI((BSL_META_U(unit, 34095 ", Dirty"))); 34096 } 34097 34098 } 34099 34100 LOG_CLI((BSL_META_U(unit, 34101 ", color_indep=%d"), 34102 (((f_ent + part_ct)->flags & _FP_ENTRY_COLOR_INDEPENDENT) ? 1 : 0))); 34103 } 34104 LOG_CLI((BSL_META_U(unit,"\n"))); 34105 34106 rv = _bcm_field_qual_tcam_key_mask_get(unit, f_ent); 34107 if (BCM_FAILURE(rv)) { 34108 LOG_CLI((BSL_META_U(unit, 34109 "\nUnit (%d) Entry (%d) tcam key read failure.\n"), 34110 unit, f_ent->eid)); 34111 return BCM_E_INTERNAL; 34112 } 34113 34114 rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc); 34115 BCM_IF_ERROR_RETURN(rv); 34116 34117 fg = f_ent->group; 34118 34119 for (qual_idx = 0; qual_idx < _bcmFieldQualifyCount; qual_idx++) { 34120 34121 if (0 == BCM_FIELD_QSET_TEST(fg->qset, qual_idx) 34122 || IS_SUDO_QUALIFIER(qual_idx)) { 34123 continue; 34124 } 34125 #if defined(BCM_TRIDENT3_SUPPORT) 34126 if (soc_feature(unit, soc_feature_td3_style_fp)) { 34127 int port, temp_p, set_data, inst; 34128 bcm_pbmp_t ipbm[2], ipbm_mask[2]; 34129 char buf_ipbm[100]; /* s/w buffer to contain pbmp. */ 34130 uint16 pbm_34_50[2] = {0}; 34131 uint16 pbm_51_65[2] = {0}; 34132 uint16 pbm_34_50_mask[2] = {0}; 34133 uint16 pbm_51_65_mask[2] = {0}; 34134 34135 if (qual_idx == bcmFieldQualifyInPorts) { 34136 if (0 == _FP_TCAM_IPBMP_SIZE(unit)) { 34137 return BCM_E_INTERNAL; 34138 } 34139 BCM_PBMP_CLEAR(ipbm[0]); 34140 BCM_PBMP_CLEAR(ipbm_mask[0]); 34141 BCM_PBMP_CLEAR(ipbm[1]); 34142 BCM_PBMP_CLEAR(ipbm_mask[1]); 34143 BCM_PBMP_ITER(f_ent->pbmp.mask, port) { 34144 set_data = 0; 34145 SOC_IF_ERROR_RETURN(soc_port_pipe_get(unit, port, &inst)); 34146 temp_p = (port >= _BCM_TD3_NUM_PIPE_PORTS) ? 34147 (port - _BCM_TD3_NUM_PIPE_PORTS) : port; 34148 if (BCM_PBMP_MEMBER(f_ent->pbmp.data, port)) { 34149 set_data = 1; 34150 } 34151 if (temp_p < _FP_TCAM_IPBMP_SIZE(unit)) { 34152 if (set_data == 1) { 34153 BCM_PBMP_PORT_ADD(ipbm[inst], temp_p); 34154 } 34155 if (!IS_LB_PORT(unit, port)) { 34156 BCM_PBMP_PORT_ADD(ipbm_mask[inst], temp_p); 34157 } 34158 } else if (temp_p < (_FP_TCAM_IPBMP_SIZE(unit) + 16)) { 34159 temp_p = temp_p - _FP_TCAM_IPBMP_SIZE(unit); 34160 /* coverity[BAD_SHIFT: FALSE] */ 34161 pbm_34_50_mask[inst] |= 1 << temp_p; 34162 if (set_data == 1) { 34163 /* coverity[BAD_SHIFT: FALSE] */ 34164 pbm_34_50[inst] |= 1 << temp_p; 34165 } 34166 } else if (temp_p < (_FP_TCAM_IPBMP_SIZE(unit) + 32)) { 34167 temp_p = temp_p - (_FP_TCAM_IPBMP_SIZE(unit) + 16); 34168 /* coverity[BAD_SHIFT: FALSE] */ 34169 pbm_51_65_mask[inst] |= 1 << temp_p; 34170 if (set_data == 1) { 34171 /* coverity[BAD_SHIFT: FALSE] */ 34172 pbm_51_65[inst] |= 1 << temp_p; 34173 } 34174 } 34175 } 34176 34177 34178 34179 LOG_CLI((BSL_META_U(unit, 34180 "\n %s "), _field_qual_name(qual_idx))); 34181 LOG_CLI((BSL_META_U(unit, 34182 "\n DATA=%s"), SOC_PBMP_FMT(f_ent->pbmp.data, buf_ipbm))); 34183 LOG_CLI((BSL_META_U(unit, 34184 "\n MASK=%s"), SOC_PBMP_FMT(f_ent->pbmp.mask, buf_ipbm))); 34185 34186 34187 for (i = 0; i < 3; i++) { 34188 LOG_CLI((BSL_META_U(unit, "\n %s "), 34189 ((i == 0) ? "_InPorts_0" : ((i == 1) ? "_InPorts_1" : "_InPorts_2")))); 34190 for (inst = 0; inst < stage_fc->num_pipes; inst++) { 34191 if (!(fc->pipe_map & (1 << inst))) { 34192 continue; 34193 } 34194 if (stage_fc->oper_mode == bcmFieldGroupOperModePipeLocal) { 34195 if (inst != fg->instance) { 34196 continue; 34197 } 34198 } 34199 LOG_CLI((BSL_META_U(unit, "\n Instance=%d"), inst)); 34200 34201 if (i == 0) { 34202 SOC_PBMP_FMT(ipbm[inst], buf_ipbm); 34203 LOG_CLI((BSL_META_U(unit, 34204 "\n DATA=0x%s"), (char *)&buf_ipbm[56])); 34205 SOC_PBMP_FMT(ipbm_mask[inst], buf_ipbm); 34206 LOG_CLI((BSL_META_U(unit, 34207 "\n MASK=0x%s"), (char *)&buf_ipbm[56])); 34208 } else if (i == 1) { 34209 LOG_CLI((BSL_META_U(unit, 34210 "\n DATA=0x%x"), pbm_34_50[inst])); 34211 LOG_CLI((BSL_META_U(unit, 34212 "\n MASK=0x%x"), pbm_34_50_mask[inst])); 34213 } else if (i == 2) { 34214 LOG_CLI((BSL_META_U(unit, 34215 "\n DATA=0x%x"), pbm_51_65[inst])); 34216 LOG_CLI((BSL_META_U(unit, 34217 "\n MASK=0x%x"), pbm_51_65_mask[inst])); 34218 } 34219 } 34220 } 34221 continue; 34222 } 34223 34224 if ((qual_idx == _bcmFieldQualifyInPorts_1) || 34225 (qual_idx == _bcmFieldQualifyInPorts_2)) { 34226 continue; 34227 } 34228 } 34229 #endif /* BCM_TRIDENT3_SUPPORT */ 34230 #if defined(BCM_TOMAHAWK2_SUPPORT) 34231 if (_BCM_FIELD_IS_PBMP_QUALIFIER(qual_idx) && 34232 soc_feature(unit, soc_feature_xy_tcam_x0y)) { 34233 char buf_ipbm[100]; /* s/w buffer to contain pbmp. */ 34234 LOG_CLI((BSL_META_U(unit, 34235 "\n %s "), _field_qual_name(qual_idx))); 34236 LOG_CLI((BSL_META_U(unit, 34237 "\n DATA=%s"), SOC_PBMP_FMT(f_ent->pbmp.data, buf_ipbm))); 34238 BCM_PBMP_ASSIGN(mask_pbmp, f_ent->pbmp.mask); 34239 BCM_PBMP_ITER(f_ent->pbmp.mask, mask_port) { 34240 if (IS_LB_PORT(unit, mask_port)) { 34241 BCM_PBMP_PORT_REMOVE(mask_pbmp, mask_port); 34242 } 34243 } 34244 LOG_CLI((BSL_META_U(unit, 34245 "\n MASK=%s"), SOC_PBMP_FMT(mask_pbmp, buf_ipbm))); 34246 continue; 34247 } 34248 #endif /* BCM_TOMAHAWK2_SUPPORT */ 34249 _FP_QUAL_DATA_CLEAR(q_data); 34250 _FP_QUAL_DATA_CLEAR(q_mask); 34251 34252 if ((_BCM_FIELD_IS_PBMP_QUALIFIER(qual_idx)) && 34253 (bcmFieldGroupOperModeGlobal == stage_fc->oper_mode) && 34254 (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) { 34255 int pipe_ports_max; /* Max ports per pipe. */ 34256 int tcam_idx = 0; /* Entry slice index. */ 34257 char buf[100]; /* s/w buffer to contain pbmp. */ 34258 int inst; /* XGS pipe number */ 34259 _field_pbmp_t pipe_pbmp; /* Per pipe 36 bit pbmp. */ 34260 _field_pbmp_t system_pbmp; /* System wide 144 bit pbmp.*/ 34261 uint32 tcam_entry[SOC_MAX_MEM_FIELD_WORDS] = {0}; 34262 bcm_port_t port; /* Holds physical port number. */ 34263 bcm_port_t system_port; 34264 soc_mem_t tcam_mem = INVALIDm; 34265 34266 pipe_ports_max = SOC_MAX_NUM_PORTS/SOC_MAX_NUM_PIPES; 34267 34268 (void)_bcm_field_th_slice_offset_to_tcam_idx(unit, stage_fc, 34269 f_ent->group->instance, 34270 f_ent->fs->slice_number, 34271 f_ent->slice_idx, &tcam_idx); 34272 34273 LOG_CLI((BSL_META_U(unit, 34274 "\n %s "), _field_qual_name(qual_idx))); 34275 34276 sal_memset(&system_pbmp, 0x0, sizeof(_field_pbmp_t)); 34277 for (inst = 0; inst < stage_fc->num_pipes; inst++) { 34278 if (!(fc->pipe_map & (1 << inst))) { 34279 continue; 34280 } 34281 34282 if (soc_feature(unit, soc_feature_th3_style_fp)) { 34283 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 34284 IFP_TCAMm, 34285 inst, &tcam_mem)); 34286 } else { 34287 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 34288 IFP_TCAM_WIDEm, 34289 inst, &tcam_mem)); 34290 } 34291 34292 rv = soc_th_ifp_mem_read(unit, tcam_mem, MEM_BLOCK_ANY, 34293 tcam_idx, tcam_entry); 34294 SOC_IF_ERROR_RETURN(rv); 34295 34296 sal_memset(&pipe_pbmp, 0x0, sizeof(_field_pbmp_t)); 34297 soc_mem_pbmp_field_get(unit, tcam_mem, tcam_entry, 34298 IPBMf, &pipe_pbmp.data); 34299 34300 BCM_PBMP_ITER(pipe_pbmp.data, port) { 34301 system_port = port + (inst * pipe_ports_max); 34302 if (system_port <= SOC_MAX_NUM_PORTS) { 34303 /* coverity[overrun-local] */ 34304 BCM_PBMP_PORT_ADD(system_pbmp.data, system_port); 34305 } 34306 } 34307 34308 soc_mem_pbmp_field_get(unit, tcam_mem, tcam_entry, 34309 IPBM_MASKf, &pipe_pbmp.mask); 34310 34311 34312 BCM_PBMP_ITER(pipe_pbmp.mask, port) { 34313 system_port = port + (inst * pipe_ports_max); 34314 if ((system_port <= SOC_MAX_NUM_PORTS) && 34315 (0 == IS_LB_PORT(unit, port))){ 34316 /* coverity[overrun-local] */ 34317 BCM_PBMP_PORT_ADD(system_pbmp.mask, system_port); 34318 } 34319 } 34320 } 34321 LOG_CLI((BSL_META_U(unit, 34322 "\n DATA=%s"), SOC_PBMP_FMT(system_pbmp.data, buf))); 34323 LOG_CLI((BSL_META_U(unit, 34324 "\n MASK=%s"), SOC_PBMP_FMT(system_pbmp.mask, buf))); 34325 34326 continue; 34327 } 34328 34329 /* Get the data and mask for the current qualifier*/ 34330 rv = _bcm_field_th_entry_qualifier_key_get(unit, f_ent->eid, 34331 qual_idx, q_data, q_mask); 34332 BCM_IF_ERROR_RETURN(rv); 34333 34334 /* if mask is 0x0, no need to print the qualifier in entry dump*/ 34335 if(q_mask[0] == 0 && q_mask[1] == 0 34336 && q_mask[2] == 0 && q_mask[3] == 0 34337 && q_mask[4] == 0 && q_mask[5] == 0 34338 && q_mask[6] == 0 && q_mask[7] == 0) { 34339 continue; 34340 } 34341 34342 LOG_CLI((BSL_META_U(unit, "\n %s "), 34343 _field_qual_name(qual_idx))); 34344 34345 for (part_ct = 0; part_ct < entry_parts; part_ct++) { 34346 /* Initialize q_offset to NULL */ 34347 sal_memset(&q_offset, 0x0, sizeof(q_offset)); 34348 34349 rv = _bcm_field_th_qual_part_offset_get(unit, f_ent, part_ct, 34350 qual_idx, &q_offset); 34351 if (rv == BCM_E_NOT_FOUND) { 34352 continue; 34353 } else if (BCM_FAILURE(rv)) { 34354 return rv; 34355 } 34356 34357 for (i = 0; i < q_offset.num_offsets; i++) { 34358 if (0 != q_offset.width[i]) { 34359 int delta = 0; 34360 if ((fg->flags & _FP_GROUP_SPAN_SINGLE_SLICE) && 34361 !(fg->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)) { 34362 delta = 80; 34363 } 34364 #if defined(BCM_FLOWTRACKER_SUPPORT) 34365 if (fg->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) { 34366 delta = 0; 34367 } 34368 #endif 34369 LOG_CLI((BSL_META_U(unit, 34370 "\n Part:%d Offset%d: %2d Width%d: %3d "), 34371 part_ct, i, q_offset.offset[i]+delta, i, 34372 q_offset.width[i])); 34373 } 34374 } 34375 } 34376 LOG_CLI((BSL_META_U(unit, 34377 "\n DATA=0x"))); 34378 for (idx = 7; idx >= 0; idx--) { 34379 data = q_data[idx]; 34380 mask = q_mask[idx]; 34381 if (data == 0 && mask == 0) { 34382 continue; 34383 } 34384 /* Check if HW packet_res must be remmaped for API use */ 34385 if (bcmFieldQualifyPacketRes == qual_idx) { 34386 _bcm_field_td2_qualify_PacketRes_get(unit, 34387 f_ent->eid, &data, &mask); 34388 q_mask[idx] = mask; 34389 } 34390 LOG_CLI((BSL_META_U(unit, 34391 "%08x "), data)); 34392 } 34393 34394 LOG_CLI((BSL_META_U(unit, 34395 "\n MASK=0x"))); 34396 for (idx = 7; idx >= 0; idx--) { 34397 data = q_data[idx]; 34398 mask = q_mask[idx]; 34399 if (data == 0 && mask == 0) { 34400 continue; 34401 } 34402 LOG_CLI((BSL_META_U(unit, 34403 "%08x "), q_mask[idx])); 34404 } 34405 } 34406 34407 LOG_CLI((BSL_META_U(unit, 34408 "\n"))); 34409 return BCM_E_NONE; 34410 } 34411 34412 /* 34413 * Retrieve Action Format for a given index to the policy memory. 34414 * Supported only for IFP PDD formats. 34415 */ 34416 STATIC int 34417 _field_action_ifp_policy_decoder_data_get( 34418 int unit, 34419 soc_mem_t policy_mem, 34420 int index, 34421 soc_field_t field, 34422 uint32 *fmt_val) 34423 { 34424 int rv; 34425 int bit = 0, idx; 34426 uint32 ap_idx; 34427 soc_mem_t profile_mem; 34428 uint32 policy_entry[SOC_MAX_MEM_FIELD_WORDS] = {0}; 34429 _bcm_field_action_set_t *action_prof_ptr = NULL; 34430 void *act_prof_entry; /* Profile table buffer pointer */ 34431 uint32 hw_bitmap[2] = {0}; 34432 uint32 act_offset = 0; 34433 uint32 bitmap_size = 0; 34434 uint32 act_bitmap_sz = 0; 34435 uint32 size = 0, value = 0, offset = 0; 34436 uint32 data_buf[100] = {0}; 34437 34438 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 34439 return BCM_E_NONE; 34440 } 34441 34442 if ((policy_mem != IFP_POLICY_TABLEm) && 34443 (policy_mem != IFP_POLICY_TABLE_PIPE0m) && 34444 (policy_mem != IFP_POLICY_TABLE_PIPE1m) && 34445 (policy_mem != IFP_POLICY_TABLE_WIDEm) && 34446 (policy_mem != IFP_POLICY_TABLE_WIDE_PIPE0m) && 34447 (policy_mem != IFP_POLICY_TABLE_WIDE_PIPE1m)) { 34448 return BCM_E_PARAM; 34449 } 34450 34451 rv = soc_mem_read(unit, policy_mem, MEM_BLOCK_ANY, index, policy_entry); 34452 BCM_IF_ERROR_RETURN(rv); 34453 34454 /* Get Action data from entry buffere */ 34455 soc_mem_field_get(unit, policy_mem, policy_entry, DATAf, &data_buf[0]); 34456 34457 /* Get Action Data type from entry Buffer. */ 34458 ap_idx = soc_mem_field32_get(unit, policy_mem, policy_entry, DATA_TYPEf); 34459 34460 /* Initialise variables */ 34461 sal_memcpy(&act_prof_entry, soc_mem_entry_null(unit, policy_mem), 34462 soc_mem_entry_words(unit, policy_mem) * sizeof(uint32)); 34463 34464 if ((policy_mem == IFP_POLICY_TABLEm) || (policy_mem == IFP_POLICY_TABLE_WIDEm)) { 34465 profile_mem = IFP_POLICY_ACTION_PROFILEm; 34466 rv = soc_mem_read(unit, profile_mem, MEM_BLOCK_ANY, ap_idx, &hw_bitmap); 34467 } 34468 34469 act_offset = 0; 34470 /* For TD3, policy data is filled from MSB to LSB */ 34471 if(soc_feature(unit, soc_feature_td3_style_fp)) { 34472 if (policy_mem == IFP_POLICY_TABLEm 34473 || policy_mem == IFP_POLICY_TABLE_PIPE0m 34474 || policy_mem == IFP_POLICY_TABLE_PIPE1m) { 34475 act_offset = _FP_ASET_DATA_SIZE_FOR_POLICY_NARROW; 34476 } else if (policy_mem == IFP_POLICY_TABLE_WIDEm 34477 || policy_mem == IFP_POLICY_TABLE_WIDE_PIPE0m 34478 || policy_mem == IFP_POLICY_TABLE_WIDE_PIPE1m) { 34479 act_offset = _FP_ASET_DATA_SIZE_FOR_POLICY_WIDE; 34480 } 34481 34482 if (SOC_IS_HELIX5(unit)) { 34483 action_prof_ptr = bcm_field_hx5_ifp_action_set; 34484 bitmap_size = sizeof(bcm_field_hx5_ifp_action_set)/sizeof(_bcm_field_action_set_t); 34485 } else { 34486 action_prof_ptr = bcm_field_td3_ifp_action_set; 34487 bitmap_size = sizeof(bcm_field_td3_ifp_action_set)/sizeof(_bcm_field_action_set_t); 34488 } 34489 34490 for (idx = (bitmap_size - 1); idx >= 0; idx--) { 34491 if (action_prof_ptr[idx].size == 0) { 34492 continue; 34493 } 34494 34495 if (act_bitmap_sz == 0) { 34496 act_bitmap_sz = idx; 34497 bit = act_bitmap_sz; 34498 } 34499 34500 if ((((bit >= 32) && (hw_bitmap[1] & (1 << (bit - 32)))) || 34501 ((bit < 32) && (hw_bitmap[0] & (1 << bit)))) && 34502 (idx < (bitmap_size - 1))) { 34503 value = 0; 34504 size = action_prof_ptr[idx + 1].size; 34505 offset = act_offset - size; 34506 34507 if (field == action_prof_ptr[idx + 1].hw_field) { 34508 _bcm_field_th_val_get(data_buf, &value, offset, size); 34509 *fmt_val = value; 34510 break; 34511 } 34512 act_offset -= size; 34513 } 34514 if (bit > 0) { 34515 bit--; 34516 } else { 34517 return BCM_E_INTERNAL; 34518 } 34519 } 34520 } 34521 34522 return BCM_E_NONE; 34523 } 34524 /* 34525 * Function to retrieve Flex Counter fields for a given 34526 * index to the IFP Policy memory. 34527 */ 34528 int 34529 _bcm_field_action_profile_hw_stat_fields_get( 34530 int unit, 34531 int index, 34532 soc_mem_t mem, 34533 uint32 *offset_mode, 34534 uint32 *pool_number, 34535 uint32 *base_idx) 34536 { 34537 uint32 value; 34538 soc_format_t fmt = IFP_COUNTER_SETfmt; 34539 34540 if (!soc_feature(unit, soc_feature_ifp_action_profiling)) { 34541 return BCM_E_NONE; 34542 } 34543 34544 BCM_IF_ERROR_RETURN(_field_action_ifp_policy_decoder_data_get( 34545 unit, mem, index, COUNTER_SETf, &value)); 34546 34547 if (base_idx != NULL) { 34548 *base_idx = soc_format_field32_get(unit, fmt, &value, 34549 FLEX_CTR_BASE_COUNTER_IDXf); 34550 } 34551 34552 if (pool_number != NULL) { 34553 *pool_number = soc_format_field32_get(unit, fmt, &value, 34554 FLEX_CTR_POOL_NUMBERf); 34555 } 34556 34557 if (offset_mode != NULL) { 34558 *offset_mode = soc_format_field32_get(unit, fmt, &value, 34559 FLEX_CTR_OFFSET_MODEf); 34560 } 34561 34562 34563 return BCM_E_NONE; 34564 } 34565 34566 int _fp_action_profile_dump( 34567 int unit, 34568 bcm_field_action_t action, 34569 soc_mem_t mem, 34570 int index) 34571 { 34572 int rv; 34573 uint32 value = 0; 34574 soc_field_t field; 34575 soc_format_t fmt; 34576 int action_set; 34577 _field_stage_t *stage_fc; /* Field Stage Structure. */ 34578 _bcm_field_action_conf_t *aconf; /* Field Action config structure. */ 34579 34580 if (action == bcmFieldActionStatGroup) { 34581 uint32 offset_mode, base_idx, pool; 34582 34583 rv = _bcm_field_action_profile_hw_stat_fields_get( 34584 unit, index, mem, &offset_mode, &pool, &base_idx); 34585 BCM_IF_ERROR_RETURN(rv); 34586 34587 cli_out("%s :: base_idx: 0x%x pool_number: 0x%x offset_mode: 0x%x\n\r", 34588 _field_action_name(action), base_idx, pool, offset_mode); 34589 34590 return BCM_E_NONE; 34591 } 34592 34593 rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc); 34594 BCM_IF_ERROR_RETURN(rv); 34595 34596 BCM_IF_ERROR_RETURN(_bcm_field_action_config_get( 34597 unit, stage_fc, action, &aconf)); 34598 34599 action_set = aconf->offset->aset; 34600 field = bcm_field_td3_ifp_action_set[action_set].hw_field; 34601 34602 if ((action == bcmFieldActionCopyToCpu) || 34603 (action == bcmFieldActionGpCopyToCpu) || 34604 (action == bcmFieldActionYpCopyToCpu) || 34605 (action == bcmFieldActionRpCopyToCpu)) { 34606 uint32 r_copy2cpu, y_copy2cpu, g_copy2cpu, matched_rule; 34607 uint32 val = 0; 34608 34609 uint8 copy_2_cpu_val[8][40] = { 34610 "NOOP", 34611 "COPY_TO_CPU", 34612 "DO_NOT_COPY_TO_CPU", 34613 "OVERRIDE_SWITCH_COPY_TO_CPU", 34614 "DO_NOT_OVERRIDE_SWITCH_COPY_TO_CPU", 34615 "COPY_WITH_TIMESTAMP", 34616 "CANCEL_COPY_AND_SWITCH_TO_CPU", 34617 "RESERVED_7"}; 34618 34619 34620 BCM_IF_ERROR_RETURN(_field_action_ifp_policy_decoder_data_get( 34621 unit, mem, index, field, &value)); 34622 fmt = IFP_COPY_TO_CPU_SETfmt; 34623 r_copy2cpu = soc_format_field32_get(unit, fmt, &value, R_COPY_TO_CPUf); 34624 y_copy2cpu = soc_format_field32_get(unit, fmt, &value, Y_COPY_TO_CPUf); 34625 g_copy2cpu = soc_format_field32_get(unit, fmt, &value, G_COPY_TO_CPUf); 34626 matched_rule = soc_format_field32_get(unit, fmt, &value, MATCHED_RULEf); 34627 34628 if (action == bcmFieldActionGpCopyToCpu || 34629 action == bcmFieldActionCopyToCpu) { 34630 val = g_copy2cpu; 34631 } else if (action == bcmFieldActionYpCopyToCpu) { 34632 val = y_copy2cpu; 34633 } else if (action == bcmFieldActionRpCopyToCpu) { 34634 val = r_copy2cpu; 34635 } 34636 34637 cli_out("%s :: [%s] Matched_rule:[%d]\n\r", 34638 _field_action_name(action), copy_2_cpu_val[val], matched_rule); 34639 } else { 34640 BCM_IF_ERROR_RETURN(_field_action_ifp_policy_decoder_data_get( 34641 unit, mem, index, field, &value)); 34642 34643 cli_out("%s :: value:%d \n\r", _field_action_name(action), value); 34644 } 34645 34646 return BCM_E_NONE; 34647 } 34648 34649 int 34650 _bcm_field_th_qualify_PacketRes(int unit, 34651 bcm_field_entry_t entry, 34652 uint32 *data, 34653 uint32 *mask 34654 ) 34655 { 34656 int rv = BCM_E_NONE; 34657 34658 if (soc_feature(unit, soc_feature_field_multi_pipe_support)) { 34659 rv = _bcm_field_is_entry_stage_valid(unit, entry, 34660 _BCM_FIELD_STAGE_INGRESS); 34661 if ((rv != BCM_E_NONE) && (rv != BCM_E_CONFIG)) { 34662 /*Error fetching entry*/ 34663 return (rv); 34664 } 34665 34666 if (rv == BCM_E_NONE) { /*Stage is Ingress*/ 34667 34668 if ((soc_feature(unit, soc_feature_field_preselector_support)) && 34669 (soc_feature(unit, soc_feature_th3_style_fp)) && 34670 (_BCM_FIELD_IS_PRESEL_ENTRY(entry) == TRUE)) { 34671 switch (*data) { 34672 case BCM_FIELD_PKT_RES_IEEE1588: 34673 case BCM_FIELD_PKT_RES_BFD: 34674 case BCM_FIELD_PKT_RES_UNKNOWN: 34675 break; 34676 default: 34677 return BCM_E_UNAVAIL; 34678 } 34679 } else { 34680 34681 switch (*data) { 34682 case BCM_FIELD_PKT_RES_ICNM: 34683 case BCM_FIELD_PKT_RES_FCOEKNOWN: 34684 case BCM_FIELD_PKT_RES_FCOEUNKNOWN: 34685 case BCM_FIELD_PKT_RES_MPLSMCKNOWN: 34686 case BCM_FIELD_PKT_RES_FCOE_ANY: 34687 case BCM_FIELD_PKT_RES_MPLS_ANY: 34688 return BCM_E_UNAVAIL; 34689 case BCM_FIELD_PKT_RES_PIMBIDIRUNKNOWN: 34690 #if defined( BCM_TOMAHAWK2_SUPPORT) 34691 if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced)) { 34692 break; 34693 } else 34694 #endif /*BCM _TOMAHAWK2_SUPPORT*/ 34695 { 34696 return BCM_E_UNAVAIL; 34697 } 34698 case BCM_FIELD_PKT_RES_OAM: 34699 case BCM_FIELD_PKT_RES_MPLSL2KNOWN: 34700 case BCM_FIELD_PKT_RES_MIMKNOWN: 34701 case BCM_FIELD_PKT_RES_MIMUNKNOWN: 34702 case BCM_FIELD_PKT_RES_TRILLKNOWN: 34703 case BCM_FIELD_PKT_RES_TRILLUNKNOWN: 34704 case BCM_FIELD_PKT_RES_NIVKNOWN: 34705 case BCM_FIELD_PKT_RES_NIVUNKNOWN: 34706 case BCM_FIELD_PKT_RES_L2GREKNOWN: 34707 case BCM_FIELD_PKT_RES_VXLANKNOWN: 34708 case BCM_FIELD_PKT_RES_TRILL_ANY: 34709 case BCM_FIELD_PKT_RES_NIV_ANY: 34710 case BCM_FIELD_PKT_RES_MIM_ANY: 34711 if (soc_feature(unit, soc_feature_fp_no_dvp_support)) { 34712 return BCM_E_UNAVAIL; 34713 } 34714 break; 34715 default: 34716 break; 34717 } 34718 } 34719 } 34720 } 34721 34722 BCM_IF_ERROR_RETURN(_bcm_field_td2_qualify_PacketRes(unit, entry, data, mask)); 34723 return rv; 34724 } 34725 34726 34727 int 34728 _bcm_field_th_qualify_PacketRes_get( 34729 int unit, 34730 bcm_field_entry_t entry, 34731 uint32 *data, 34732 uint32 *mask) 34733 { 34734 int rv; /* Operation return status. */ 34735 34736 /* Read qualifier match value and mask. */ 34737 rv = _bcm_field_entry_qualifier_uint32_get(unit, entry, 34738 bcmFieldQualifyPacketRes, 34739 data, mask); 34740 BCM_IF_ERROR_RETURN(rv); 34741 34742 rv = _bcm_field_td2_qualify_PacketRes_get(unit, entry, data, mask); 34743 if (BCM_FAILURE(rv)) { 34744 return rv; 34745 } 34746 34747 if (soc_feature(unit, soc_feature_field_multi_pipe_support)) { 34748 34749 if ((soc_feature(unit, soc_feature_field_preselector_support)) && 34750 (soc_feature(unit, soc_feature_th3_style_fp)) && 34751 (_BCM_FIELD_IS_PRESEL_ENTRY(entry) == TRUE)) { 34752 switch (*data) { 34753 case BCM_FIELD_PKT_RES_IEEE1588: 34754 case BCM_FIELD_PKT_RES_BFD: 34755 case BCM_FIELD_PKT_RES_UNKNOWN: 34756 break; 34757 default: 34758 return BCM_E_INTERNAL; 34759 } 34760 } else { 34761 34762 switch (*data) { 34763 case BCM_FIELD_PKT_RES_ICNM: 34764 case BCM_FIELD_PKT_RES_FCOEKNOWN: 34765 case BCM_FIELD_PKT_RES_FCOEUNKNOWN: 34766 case BCM_FIELD_PKT_RES_MPLSMCKNOWN: 34767 return BCM_E_INTERNAL; 34768 case BCM_FIELD_PKT_RES_PIMBIDIRUNKNOWN: 34769 #if defined(BCM_TOMAHAWK2_SUPPORT) 34770 if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced)) { 34771 break; 34772 } else 34773 #endif /*BCM_TOMAHAWK2_SUPPORT*/ 34774 { 34775 return BCM_E_UNAVAIL; 34776 } 34777 case BCM_FIELD_PKT_RES_OAM: 34778 case BCM_FIELD_PKT_RES_MPLSL2KNOWN: 34779 case BCM_FIELD_PKT_RES_MIMKNOWN: 34780 case BCM_FIELD_PKT_RES_MIMUNKNOWN: 34781 case BCM_FIELD_PKT_RES_TRILLKNOWN: 34782 case BCM_FIELD_PKT_RES_TRILLUNKNOWN: 34783 case BCM_FIELD_PKT_RES_NIVKNOWN: 34784 case BCM_FIELD_PKT_RES_NIVUNKNOWN: 34785 case BCM_FIELD_PKT_RES_L2GREKNOWN: 34786 case BCM_FIELD_PKT_RES_VXLANKNOWN: 34787 case BCM_FIELD_PKT_RES_TRILL_ANY: 34788 case BCM_FIELD_PKT_RES_NIV_ANY: 34789 case BCM_FIELD_PKT_RES_MIM_ANY: 34790 if (soc_feature(unit, soc_feature_fp_no_dvp_support)) { 34791 return BCM_E_INTERNAL; 34792 } 34793 break; 34794 default: 34795 break; 34796 } 34797 } 34798 } 34799 34800 return rv; 34801 } 34802 34803 34804 int 34805 _bcm_field_th_ddrop_profile_alloc(int unit, _field_entry_t *f_ent, 34806 _field_action_t *fa) 34807 { 34808 #if defined (BCM_TOMAHAWK3_SUPPORT) 34809 if (soc_feature(unit, soc_feature_th3_style_fp)) { 34810 return _bcm_field_th3_ddrop_profile_alloc(unit, f_ent, fa); 34811 } 34812 #endif 34813 return BCM_E_UNAVAIL; 34814 } 34815 34816 int 34817 _bcm_field_th_dredirect_profile_alloc(int unit, _field_entry_t *f_ent, 34818 _field_action_t *fa) 34819 { 34820 #if defined (BCM_TOMAHAWK3_SUPPORT) 34821 if (soc_feature(unit, soc_feature_th3_style_fp)) { 34822 return _bcm_field_th3_dredirect_profile_alloc(unit, f_ent, fa); 34823 } 34824 #endif 34825 return BCM_E_UNAVAIL; 34826 34827 } 34828 34829 #ifdef BCM_WARM_BOOT_SUPPORT 34830 34831 /* START OF WARMBOOT ROUTINES */ 34832 /* 34833 * Function: 34834 * _field_th_slice_map_write 34835 * 34836 * Purpose: 34837 * Sync's slice status to scache for a stage 34838 * (Expanded, master slice idx, Pipe instance) 34839 * 34840 * Parameters: 34841 * unit - (IN) BCM device number 34842 * fc - (IN) FP control info. 34843 * instance - (IN) Pipe Instance. 34844 * stage_fc - (IN) FP stage control info. 34845 * 34846 * Returns: 34847 * BCM_E_XXX 34848 */ 34849 34850 int 34851 _field_th_slice_map_write(int unit, _field_control_t *fc, 34852 int instance, _field_stage_t *stage_fc) 34853 { 34854 uint8 slice_id; /* Slices iterator. */ 34855 _field_slice_t *fs; /* Slice pointer. */ 34856 uint8 *buf; /* Scache pointer. */ 34857 34858 if ((stage_fc == NULL) || (fc == NULL)) { 34859 return BCM_E_PARAM; 34860 } 34861 34862 /* No need to sync external stage */ 34863 if (stage_fc->stage_id != _BCM_FIELD_STAGE_LOOKUP && 34864 stage_fc->stage_id != _BCM_FIELD_STAGE_EGRESS) { 34865 return BCM_E_PARAM; 34866 } 34867 34868 if (instance < 0 || instance >= _FP_MAX_NUM_PIPES) { 34869 return BCM_E_PARAM; 34870 } 34871 34872 buf = fc->scache_ptr[_FIELD_SCACHE_PART_0]; 34873 34874 for (slice_id = 0; slice_id < stage_fc->tcam_slices; slice_id++) { 34875 fs = stage_fc->slices[instance] + slice_id; 34876 34877 if ((fc->wb_current_version) < BCM_FIELD_WB_VERSION_1_26) { 34878 buf[fc->scache_pos] = (fs->prev != NULL) ? 1 : 0; 34879 /* Go to master slice */ 34880 while (fs->prev != NULL) { 34881 fs = fs->prev; 34882 } 34883 buf[fc->scache_pos] |= (fs->slice_number << 1); 34884 34885 /* Write the Pipe instance in the MSB 2-bits of the same byte */ 34886 buf[fc->scache_pos] |= (instance << 6); 34887 34888 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 34889 "%s(): Writing inst[%d] expanded[%d] master_slice[%d]" 34890 " for slice[%d] val:%d @ byte %d...\n\r"), 34891 __func__, ((buf[fc->scache_pos] >> 6) & 0x3), 34892 (buf[fc->scache_pos] & 0x1), ((buf[fc->scache_pos] >> 1) & 0x3), 34893 slice_id, buf[fc->scache_pos], fc->scache_pos)); 34894 34895 fc->scache_pos++; 34896 fs = NULL; 34897 } else { 34898 34899 /* 1 bit to save prev info */ 34900 buf[fc->scache_pos] = (fs->prev != NULL) ? 1 : 0; 34901 /* Go to master slice */ 34902 while (fs->prev != NULL) { 34903 fs = fs->prev; 34904 } 34905 /* 7 bits for slice number */ 34906 buf[fc->scache_pos] |= (fs->slice_number << 1); 34907 34908 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 34909 "%s(): Writing expanded[%d] master_slice[%d]" 34910 " for slice[%d] val:%d @ byte %d...\n\r"), 34911 __func__, (buf[fc->scache_pos] & 0x1), 34912 ((buf[fc->scache_pos] >> 1) & 0x3), 34913 slice_id, buf[fc->scache_pos], fc->scache_pos)); 34914 34915 fc->scache_pos++; 34916 34917 /* Write the Pipe instance in the LSB 4-bits of the next byte */ 34918 buf[fc->scache_pos] = ((instance) & 0xf); 34919 34920 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 34921 "%s(): Writing inst[%d] at @ byte %d...\n\r"), 34922 __func__,(buf[fc->scache_pos] & 0xf), fc->scache_pos)); 34923 34924 fc->scache_pos++; 34925 fs = NULL; 34926 34927 } 34928 } 34929 return BCM_E_NONE; 34930 } 34931 34932 34933 /* 34934 * Function: 34935 * _bcm_field_slice_index_bmp_write 34936 * 34937 * Purpose: 34938 * Sync's slice index bmp to scache for a stage 34939 * 34940 * Parameters: 34941 * unit - (IN) BCM device number 34942 * fc - (IN) FP control info. 34943 * stage_fc - (IN) FP stage control info. 34944 * 34945 * Returns: 34946 * BCM_E_XXX 34947 */ 34948 34949 int 34950 _bcm_field_wb_slice_index_bmp_write(int unit, _field_control_t *fc, 34951 _field_stage_t *stage_fc) 34952 { 34953 uint8 *buf; /* Scache pointer. */ 34954 int size; 34955 int slice_size; 34956 int entry_index; 34957 _field_sliceidx_bmp_t sliceidx_bmp; 34958 _field_group_t *fgtemp; 34959 int slice_offset; 34960 int rv = BCM_E_NONE; 34961 int tcam_index = 0; 34962 sliceidx_bmp.w = NULL; 34963 34964 if ((stage_fc == NULL) || (fc == NULL)) { 34965 return BCM_E_PARAM; 34966 } 34967 34968 buf = fc->scache_ptr[_FIELD_SCACHE_PART_0]; 34969 /* get the total slice size*/ 34970 slice_size = stage_fc->tcam_sz; 34971 size = SHR_BITALLOCSIZE(slice_size * _FP_MAX_NUM_PIPES); 34972 sliceidx_bmp.w = NULL; 34973 _FP_XGS3_ALLOC(sliceidx_bmp.w, size, "Sliceidx Bitmap"); 34974 if (NULL == sliceidx_bmp.w) { 34975 return (BCM_E_MEMORY); 34976 } 34977 fgtemp = fc->groups; 34978 while (fgtemp != NULL) { 34979 if ((fgtemp->stage_id == stage_fc->stage_id)) { 34980 for (entry_index = 0; 34981 entry_index < fgtemp->group_status.entry_count; 34982 ++entry_index) { 34983 if ( ((fgtemp->entry_arr[entry_index]->flags) & 34984 _FP_ENTRY_INSTALLED) && 34985 ((!(fgtemp->flags & _FP_GROUP_LOOKUP_ENABLED)) || 34986 (!(((fgtemp->entry_arr[entry_index]->flags) & 34987 _FP_ENTRY_ENABLED) == _FP_ENTRY_ENABLED)))) { 34988 slice_offset = (slice_size * fgtemp->instance); 34989 rv = _bcm_field_entry_tcam_idx_get(unit, 34990 fgtemp->entry_arr[entry_index], 34991 &tcam_index); 34992 if (BCM_FAILURE(rv)) { 34993 sal_free(sliceidx_bmp.w); 34994 sliceidx_bmp.w = NULL; 34995 LOG_DEBUG(BSL_LS_BCM_FP, 34996 (BSL_META_U(unit, 34997 "Error: Failed to sync" 34998 " slice index of disabled entry [%d]\n"), 34999 entry_index)); 35000 return rv; 35001 } 35002 _FP_SLICEIDX_BMP_ADD(sliceidx_bmp, 35003 slice_offset + tcam_index); 35004 } 35005 } 35006 } 35007 fgtemp = fgtemp->next; 35008 } 35009 /* sync the data */ 35010 sal_memcpy (&buf[fc->scache_pos], ((sliceidx_bmp).w), size); 35011 fc->scache_pos += size; 35012 35013 sal_free(sliceidx_bmp.w); 35014 sliceidx_bmp.w = NULL; 35015 return BCM_E_NONE; 35016 } 35017 35018 /* 35019 * Function: 35020 * _bcm_field_th_scache_sync 35021 * 35022 * Purpose: 35023 * Save field module software state to external cache. 35024 * 35025 * Parameters: 35026 * unit - (IN) BCM device number 35027 * fc - (IN) Pointer to device field control structure 35028 * stage_fc - (IN) FP stage control info. 35029 * 35030 * Returns: 35031 * BCM_E_XXX 35032 */ 35033 int 35034 _bcm_field_th_scache_sync(int unit, 35035 _field_control_t *fc, 35036 _field_stage_t *stage_fc 35037 ) 35038 { 35039 int idx; /* Index to field entry. */ 35040 int mem_inst, inst; /* Pipe Instance. */ 35041 int rv = BCM_E_NONE; /* Operation return value. */ 35042 int efp_slice_mode; /* Slice mode of EFP. */ 35043 int paired = 0; /* TCAM paired status of a slice. */ 35044 int ratio = 0; /* TCAM entry ratio. */ 35045 int slice_idx; /* Index of a slice in (V/I/E)FP */ 35046 uint8 *buf; /* Pointer to 1st scache part. */ 35047 uint8 *buf1; /* Pointer to 2nd scache part. */ 35048 uint32 start_char; /* Start character for (V/I/E)FP */ 35049 uint32 end_char; /* End caharacter for (V/I/E)FP. */ 35050 uint32 val; /* Carry Register contents. */ 35051 uint64 rval; /* Carry register contents. */ 35052 _field_slice_t *fs; /* Slice pointer. */ 35053 _field_group_t *fg; /* Filed group pointer. */ 35054 _field_data_control_t *data_ctrl; /* UDF control data pointer. */ 35055 _field_entry_t *f_ent; /* Pointer to field entry. */ 35056 soc_field_t fld; /* field in any memory/register. */ 35057 soc_reg_t vfp_control_1_reg; 35058 soc_reg_t efp_slice_control_reg; 35059 35060 35061 soc_field_t _efp_slice_mode[] = {SLICE_0_MODEf, SLICE_1_MODEf, 35062 SLICE_2_MODEf, SLICE_3_MODEf}; 35063 35064 buf = fc->scache_ptr[_FIELD_SCACHE_PART_0]; 35065 buf1 = fc->scache_ptr[_FIELD_SCACHE_PART_1]; 35066 35067 35068 switch (stage_fc->stage_id) { 35069 case _BCM_FIELD_STAGE_INGRESS: 35070 start_char = _FIELD_IFP_DATA_START; 35071 end_char = _FIELD_IFP_DATA_END; 35072 break; 35073 case _BCM_FIELD_STAGE_EGRESS: 35074 start_char = _FIELD_EFP_DATA_START; 35075 end_char = _FIELD_EFP_DATA_END; 35076 break; 35077 case _BCM_FIELD_STAGE_LOOKUP: 35078 start_char = _FIELD_VFP_DATA_START; 35079 end_char = _FIELD_VFP_DATA_END; 35080 break; 35081 case _BCM_FIELD_STAGE_EXTERNAL: 35082 /* 35083 if (_field_tr2_ext_scache_sync_chk(unit, fc, stage_fc)) { 35084 return (_field_tr2_ext_scache_sync(unit, fc, stage_fc)); 35085 } */ 35086 start_char = _FIELD_EXTFP_DATA_START; 35087 end_char = _FIELD_EXTFP_DATA_END; 35088 break; 35089 case _BCM_FIELD_STAGE_CLASS: 35090 start_char = _FIELD_CLASS_DATA_START; 35091 end_char = _FIELD_CLASS_DATA_END; 35092 break; 35093 case _BCM_FIELD_STAGE_EXACTMATCH: 35094 start_char = _FIELD_EM_DATA_START; 35095 end_char = _FIELD_EM_DATA_END; 35096 break; 35097 #if defined(BCM_HELIX5_SUPPORT) 35098 case _BCM_FIELD_STAGE_FLOWTRACKER: 35099 start_char = _FIELD_FT_DATA_START; 35100 end_char = _FIELD_FT_DATA_END; 35101 break; 35102 #endif 35103 default: 35104 return BCM_E_PARAM; 35105 } 35106 35107 LOG_DEBUG(BSL_LS_BCM_FP, 35108 (BSL_META_U(unit, 35109 "FP(unit %d): _bcm_field_th_scache_sync() - " 35110 "Synching scache for FP stage %d...\n"), 35111 unit, stage_fc->stage_id)); 35112 35113 35114 if (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) { 35115 BCM_IF_ERROR_RETURN(_bcm_field_th_stage_ingress_sync(unit, 35116 stage_fc)); 35117 LOG_DEBUG(BSL_LS_BCM_FP, 35118 (BSL_META_U(unit, 35119 "FP(unit %d): _bcm_field_th_scache_sync() -" 35120 " Writing end of section @ byte %d.\n"), 35121 unit, fc->scache_pos)); 35122 35123 /* Mark the end of the IFP section */ 35124 buf[fc->scache_pos] = end_char & 0xFF; 35125 fc->scache_pos++; 35126 buf[fc->scache_pos] = (end_char >> 8) & 0xFF; 35127 fc->scache_pos++; 35128 buf[fc->scache_pos] = (end_char >> 16) & 0xFF; 35129 fc->scache_pos++; 35130 buf[fc->scache_pos] = (end_char >> 24) & 0xFF; 35131 fc->scache_pos++; 35132 fc->scache_usage = fc->scache_pos; /* Usage in bytes */ 35133 35134 return BCM_E_NONE; 35135 } 35136 35137 _field_scache_stage_hdr_save(fc, start_char); 35138 35139 if (stage_fc->stage_id == _BCM_FIELD_STAGE_CLASS) { 35140 BCM_IF_ERROR_RETURN(_bcm_field_th_stage_class_sync(unit, fc, stage_fc)); 35141 _field_scache_stage_hdr_save(fc, end_char); 35142 return BCM_E_NONE; 35143 } 35144 35145 if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) { 35146 BCM_IF_ERROR_RETURN(_bcm_field_th_stage_em_sync(unit, fc, stage_fc)); 35147 _field_scache_stage_hdr_save(fc, end_char); 35148 return BCM_E_NONE; 35149 } 35150 35151 #if defined(BCM_HELIX5_SUPPORT) 35152 if (stage_fc->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) { 35153 BCM_IF_ERROR_RETURN(_bcm_field_stage_ft_sync(unit, fc, stage_fc)); 35154 _field_scache_stage_hdr_save(fc, end_char); 35155 return BCM_E_NONE; 35156 } 35157 #endif 35158 35159 if ((fc->wb_current_version) >= BCM_FIELD_WB_VERSION_1_10) { 35160 /* Save Stage operational mode in the first byte after Data Start */ 35161 buf[fc->scache_pos] = stage_fc->oper_mode; 35162 35163 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 35164 "%s(): Writing oper_mode[%d] for Stage:%d @ byte s_pos=%d s_pos=%d...\n\r"), 35165 __func__, buf[fc->scache_pos], stage_fc->stage_id, 35166 fc->scache_pos, fc->scache_pos1)); 35167 fc->scache_pos++; 35168 } 35169 35170 /* Save data qualifiers */ 35171 if ((data_ctrl = stage_fc->data_ctrl) != 0) { 35172 if (soc_mem_is_valid(unit, FP_UDF_TCAMm)) { 35173 /* Device has UDF TCAM => 35174 Save internal information regarding TCAM entry usage 35175 */ 35176 35177 _field_data_tcam_entry_t *p; 35178 unsigned n; 35179 35180 for (p = data_ctrl->tcam_entry_arr, 35181 n = soc_mem_index_count(unit, FP_UDF_TCAMm); 35182 n; 35183 --n, ++p 35184 ) { 35185 buf[fc->scache_pos] = p->ref_count; 35186 fc->scache_pos++; 35187 } 35188 } 35189 35190 _field_scache_sync_data_quals_write(fc, data_ctrl); 35191 } 35192 35193 /* Iterate for stage's instances. */ 35194 for (inst = 0; inst < stage_fc->num_instances; inst++) { 35195 if (!(fc->pipe_map & (1 << inst))) { 35196 continue; 35197 } 35198 _field_th_slice_map_write(unit, fc, inst, stage_fc); 35199 } 35200 if (((fc->wb_current_version) >= BCM_FIELD_WB_VERSION_1_27) && 35201 ((stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP) || 35202 (stage_fc->stage_id == _BCM_FIELD_STAGE_EGRESS) )) { 35203 /* create and sync the slice index bmp*/ 35204 BCM_IF_ERROR_RETURN(_bcm_field_wb_slice_index_bmp_write(unit, 35205 fc, stage_fc)); 35206 } 35207 35208 /* Iterate for stage's instances. */ 35209 for (inst = 0; inst < stage_fc->num_instances; inst++) { 35210 if (!(fc->pipe_map & (1 << inst))) { 35211 continue; 35212 } 35213 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 35214 mem_inst = _FP_GLOBAL_INST; 35215 } else { 35216 mem_inst = inst; 35217 } 35218 35219 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_1r, 35220 mem_inst, &vfp_control_1_reg)); 35221 35222 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, EFP_SLICE_CONTROLr, 35223 mem_inst, &efp_slice_control_reg)); 35224 35225 for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) { 35226 LOG_DEBUG(BSL_LS_BCM_FP, 35227 (BSL_META_U(unit, 35228 "FP(unit %d): _bcm_field_th_scache_sync() - " 35229 "Checking slice %d...\n"), 35230 unit, slice_idx)); 35231 /* Skip slices without groups */ 35232 fs = stage_fc->slices[inst] + slice_idx; 35233 fg = fc->groups; 35234 while (fg != NULL) { 35235 if ((fg->instance == inst) && 35236 (fg->stage_id == stage_fc->stage_id) && 35237 (fg->slices[0].slice_number == slice_idx)) { 35238 break; 35239 } 35240 fg = fg->next; 35241 } 35242 35243 if (fg == NULL) { 35244 continue; /* No group found */ 35245 } 35246 35247 /* Also skip expanded slices */ 35248 if (stage_fc->slices[inst][slice_idx].prev != NULL) { 35249 continue; 35250 } 35251 35252 paired = 0; 35253 35254 /* Ignore secondary slice in paired mode */ 35255 switch (stage_fc->stage_id) { 35256 case _BCM_FIELD_STAGE_EGRESS: 35257 BCM_IF_ERROR_RETURN(soc_reg32_get(unit, 35258 efp_slice_control_reg, 35259 REG_PORT_ANY, 0, &val)); 35260 efp_slice_mode = soc_reg_field_get(unit, 35261 efp_slice_control_reg, 35262 val, _efp_slice_mode[slice_idx]); 35263 35264 if ((efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE) 35265 || (efp_slice_mode 35266 == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY) 35267 || (efp_slice_mode 35268 == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6)) { 35269 paired = 1; 35270 } 35271 break; 35272 35273 case _BCM_FIELD_STAGE_LOOKUP: 35274 BCM_IF_ERROR_RETURN(soc_reg_get(unit, 35275 vfp_control_1_reg, 35276 REG_PORT_ANY, 0, &rval)); 35277 fld = _bcm_field_trx_slice_pairing_field[slice_idx / 2]; 35278 paired = soc_reg64_field32_get(unit, 35279 vfp_control_1_reg, 35280 rval, fld); 35281 break; 35282 default: 35283 return BCM_E_PARAM; 35284 break; 35285 } 35286 35287 if (paired && (slice_idx % 2)) { 35288 continue; 35289 } 35290 35291 BCM_IF_ERROR_RETURN 35292 (_field_tr2_group_entry_write(unit, inst, slice_idx, fs, 35293 fc, stage_fc)); 35294 } 35295 } 35296 35297 /* Now sync the expanded slices */ 35298 /* Iterate for stage's instances. */ 35299 for (inst = 0; inst < stage_fc->num_instances; inst++) { 35300 if (!(fc->pipe_map & (1 << inst))) { 35301 continue; 35302 } 35303 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 35304 mem_inst = _FP_GLOBAL_INST; 35305 } else { 35306 mem_inst = inst; 35307 } 35308 35309 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_1r, 35310 mem_inst, &vfp_control_1_reg)); 35311 35312 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, EFP_SLICE_CONTROLr, 35313 mem_inst, &efp_slice_control_reg)); 35314 35315 for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) { 35316 fs = stage_fc->slices[inst] + slice_idx; 35317 /* Skip empty slices */ 35318 if (fs->entry_count == fs->free_count) { 35319 LOG_DEBUG(BSL_LS_BCM_FP, 35320 (BSL_META_U(unit, 35321 "FP(unit %d): _bcm_field_th_scache_sync() - " 35322 "Slice is empty.\n"), 35323 unit)); 35324 continue; 35325 } 35326 35327 /* Skip master slices */ 35328 if (stage_fc->slices[inst][slice_idx].prev == NULL) { 35329 continue; 35330 } 35331 35332 /* 35333 * Skip expanded slices with no entries installed in Hw 35334 * to match recovery logic. 35335 */ 35336 if (fs->group_flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) { 35337 ratio = 2; 35338 } else { 35339 ratio = 1; 35340 } 35341 35342 for (idx = 0; idx < fs->entry_count / ratio; idx++) { 35343 /* Find EID that matches this HW index */ 35344 f_ent = fs->entries[idx]; 35345 if (f_ent == NULL) { 35346 continue; 35347 } 35348 if (!(f_ent->flags & _FP_ENTRY_INSTALLED)) { 35349 continue; 35350 } 35351 break; 35352 } 35353 35354 if (idx == (fs->entry_count / ratio)) { 35355 continue; 35356 } 35357 35358 paired = 0; 35359 35360 /* Ignore secondary slice in paired mode */ 35361 switch (stage_fc->stage_id) { 35362 case _BCM_FIELD_STAGE_EGRESS: 35363 BCM_IF_ERROR_RETURN(soc_reg32_get(unit, 35364 efp_slice_control_reg, 35365 REG_PORT_ANY, 0, &val)); 35366 efp_slice_mode = soc_reg_field_get(unit, 35367 efp_slice_control_reg, 35368 val, _efp_slice_mode[slice_idx]); 35369 if ((efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE) 35370 || (efp_slice_mode 35371 == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY) 35372 || (efp_slice_mode 35373 == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6)) { 35374 paired = 1; 35375 } 35376 break; 35377 35378 case _BCM_FIELD_STAGE_LOOKUP: 35379 BCM_IF_ERROR_RETURN(soc_reg_get(unit, 35380 vfp_control_1_reg, 35381 REG_PORT_ANY, 0, &rval)); 35382 fld = _bcm_field_trx_slice_pairing_field[slice_idx / 2]; 35383 paired = soc_reg64_field32_get(unit, 35384 vfp_control_1_reg, 35385 rval, fld); 35386 break; 35387 default: 35388 return BCM_E_PARAM; 35389 break; 35390 } 35391 if (paired && (slice_idx % 2)) { 35392 continue; 35393 } 35394 BCM_IF_ERROR_RETURN 35395 (_field_tr2_group_entry_write(unit, inst, slice_idx, 35396 fs, fc, stage_fc)); 35397 } /* Slices */ 35398 } /* instance */ 35399 35400 if ((fc->wb_current_version) >= BCM_FIELD_WB_VERSION_1_15) { 35401 /* Mark end of Slice Info */ 35402 buf[fc->scache_pos] = _FP_WB_END_OF_SLICES; 35403 fc->scache_pos++; 35404 } 35405 35406 if ((fc->wb_current_version) >= BCM_FIELD_WB_VERSION_1_15) { 35407 if ( stage_fc->stage_id == _BCM_FIELD_STAGE_EGRESS || 35408 stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP) { 35409 LOG_DEBUG(BSL_LS_BCM_FP, 35410 (BSL_META_U(unit,"FP(unit %d) vverb:" 35411 "_bcm_field_td2_scache_sync() -section " 35412 "Writing HintIds information @ byte %d.\n"), 35413 unit, fc->scache_pos)); 35414 BCM_IF_ERROR_RETURN (_bcm_hints_scache_hintid_sync (unit, stage_fc, 35415 &buf[fc->scache_pos])); 35416 } 35417 } 35418 35419 if ((fc->wb_current_version) >= BCM_FIELD_WB_VERSION_1_15) { 35420 /* Group Slice Selectors */ 35421 if ((stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP) 35422 || (stage_fc->stage_id == _BCM_FIELD_STAGE_EGRESS)) { 35423 BCM_IF_ERROR_RETURN(_field_group_slice_selectors_sync(unit, 35424 &buf[fc->scache_pos], stage_fc->stage_id)); 35425 } 35426 } 35427 35428 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 35429 "%s(): Writing end of section scache1 for stage:%s @ byte %d.\n"), 35430 __func__, 35431 (stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP)?"Lookup":"Egress", 35432 fc->scache_pos)); 35433 35434 /* Mark the end of the section */ 35435 buf[fc->scache_pos] = end_char & 0xFF; 35436 fc->scache_pos++; 35437 buf[fc->scache_pos] = (end_char >> 8) & 0xFF; 35438 fc->scache_pos++; 35439 buf[fc->scache_pos] = (end_char >> 16) & 0xFF; 35440 fc->scache_pos++; 35441 buf[fc->scache_pos] = (end_char >> 24) & 0xFF; 35442 fc->scache_pos++; 35443 fc->scache_usage = fc->scache_pos; /* Usage in bytes */ 35444 35445 if(NULL != buf1) { 35446 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 35447 "%s(): Writing end of section scache2 for stage:%s @ byte %d.\n"), 35448 __func__, 35449 (stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP)?"Lookup":"Egress", 35450 fc->scache_pos1)); 35451 /* Mark the end of the section */ 35452 buf1[fc->scache_pos1] = end_char & 0xFF; 35453 fc->scache_pos1++; 35454 buf1[fc->scache_pos1] = (end_char >> 8) & 0xFF; 35455 fc->scache_pos1++; 35456 buf1[fc->scache_pos1] = (end_char >> 16) & 0xFF; 35457 fc->scache_pos1++; 35458 buf1[fc->scache_pos1] = (end_char >> 24) & 0xFF; 35459 fc->scache_pos1++; 35460 } 35461 35462 /* Check for overflow */ 35463 if (fc->scache_pos > fc->scache_size[_FIELD_SCACHE_PART_0]) { 35464 LOG_DEBUG(BSL_LS_BCM_FP, 35465 (BSL_META_U(unit, 35466 "FP(unit %d) Error: Current Scache Position[%u] exceeds Scache size[%u]\n"), 35467 unit, fc->scache_pos, fc->scache_size[_FIELD_SCACHE_PART_0])); 35468 return BCM_E_INTERNAL; 35469 } 35470 35471 if (buf1 != NULL) { 35472 if (fc->scache_pos1 > fc->scache_size[_FIELD_SCACHE_PART_1]) { 35473 LOG_DEBUG(BSL_LS_BCM_FP, 35474 (BSL_META_U(unit, 35475 "FP(unit %d) Error: Current Scache Position1[%u] exceeds Scache size[%u]\n"), 35476 unit, fc->scache_pos1, fc->scache_size[_FIELD_SCACHE_PART_1])); 35477 return BCM_E_INTERNAL; 35478 } 35479 } 35480 35481 return rv; 35482 } 35483 35484 STATIC int 35485 _field_th_slice_expanded_status_get(int unit, int inst, 35486 _field_control_t *fc, 35487 _field_stage_t *stage_fc, 35488 int *expanded, int *slice_master_idx) 35489 { 35490 int i, vslice, slice_idx = 0, vgroup = -1, max = -1, slice_num_max = 0; 35491 uint32 map_entry; 35492 soc_reg_t slice_map_reg = INVALIDr; 35493 soc_field_t fld; 35494 uint8 *buf = fc->scache_ptr[_FIELD_SCACHE_PART_0]; 35495 int mem_inst; 35496 int instance; 35497 35498 mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 35499 _FP_GLOBAL_INST : inst; 35500 35501 switch (stage_fc->stage_id) { 35502 case _BCM_FIELD_STAGE_EGRESS: 35503 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 35504 EFP_SLICE_MAPr, 35505 mem_inst, 35506 &slice_map_reg)); 35507 slice_num_max = 4; 35508 break; 35509 case _BCM_FIELD_STAGE_LOOKUP: 35510 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 35511 VFP_SLICE_MAPr, 35512 mem_inst, 35513 &slice_map_reg)); 35514 slice_num_max = 4; 35515 break; 35516 default: 35517 return BCM_E_PARAM; 35518 break; /* Should never happen */ 35519 } 35520 35521 if ((fc->l2warm) 35522 && ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_8)) { 35523 for (i = 0; i < slice_num_max; i++) { 35524 if ((fc->wb_recovered_version) < BCM_FIELD_WB_VERSION_1_26) { 35525 expanded[i] = buf[fc->scache_pos] & 0x1; 35526 slice_master_idx[i] = (buf[fc->scache_pos] >> 1) & 0x3; 35527 instance = ((buf[fc->scache_pos] >> 6) & 0x3); 35528 35529 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 35530 "%s(): Recovering inst[%d] expanded[%d] master_slice[%d]" 35531 " for slice[%d] val:%d @ byte %d...\n\r"), __func__, 35532 instance, expanded[i], slice_master_idx[i], i, 35533 buf[fc->scache_pos], fc->scache_pos)); 35534 35535 if (instance != inst) { 35536 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 35537 "%s(): Wrong Instance:%d Recovered instead of inst:%d" 35538 " @ byte %d...\n\r"), 35539 __func__, instance, inst, fc->scache_pos)); 35540 return BCM_E_INTERNAL; 35541 } 35542 } else { 35543 expanded[i] = buf[fc->scache_pos] & 0x1; 35544 slice_master_idx[i] = (buf[fc->scache_pos] >> 1); 35545 35546 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 35547 "%s(): Recovering expanded[%d] master_slice[%d]" 35548 " for slice[%d] val:%d @ byte %d...\n\r"), __func__, 35549 expanded[i], slice_master_idx[i], i, 35550 buf[fc->scache_pos], fc->scache_pos)); 35551 35552 fc->scache_pos++; 35553 instance = ((buf[fc->scache_pos]) & 0xf); 35554 35555 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 35556 "%s(): Recovering instance[%d] @ byte %d...\n\r"), __func__, 35557 instance, fc->scache_pos)); 35558 35559 if (instance != inst) { 35560 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 35561 "%s(): Wrong Instance:%d Recovered instead of inst:%d" 35562 " @ byte %d...\n\r"), 35563 __func__, instance, inst, fc->scache_pos)); 35564 return BCM_E_INTERNAL; 35565 } 35566 } 35567 fc->scache_pos++; 35568 } 35569 } 35570 35571 /* Iterate over virtual slices to get physical slices and virtual groups */ 35572 for (vslice = 0; vslice < slice_num_max; vslice++) { 35573 BCM_IF_ERROR_RETURN(soc_reg32_get(unit, slice_map_reg, 35574 REG_PORT_ANY, 0, &map_entry)); 35575 fld = vfp_efp_virtual_to_physical_map[vslice]; 35576 slice_idx = soc_reg_field_get(unit, slice_map_reg, 35577 map_entry, fld); 35578 /* Now get virtual group for this virtual slice */ 35579 fld = vfp_efp_virtual_to_group_map[vslice]; 35580 vgroup = soc_reg_field_get(unit, slice_map_reg, 35581 map_entry, fld); 35582 35583 /* Phys slice_idx <=> virtual vslice <=> vgroup */ 35584 stage_fc->vmap[inst][0][vslice].vmap_key = slice_idx; 35585 stage_fc->vmap[inst][0][vslice].virtual_group = vgroup; 35586 stage_fc->vmap[inst][0][vslice].priority = vgroup; 35587 35588 } 35589 35590 /* See if virtual slice is the highest number in the virtual group */ 35591 for (vslice = 0; vslice < slice_num_max; vslice++) { 35592 max = -1; 35593 for (i = 0; i < slice_num_max; i++) { 35594 if ((stage_fc->vmap[inst][0][vslice].virtual_group == 35595 stage_fc->vmap[inst][0][i].virtual_group)) { 35596 if (i > max) { 35597 max = i; 35598 } 35599 } 35600 } 35601 if (!((fc->l2warm) && ((fc->wb_recovered_version) 35602 >= BCM_FIELD_WB_VERSION_1_8))) { 35603 if ((max != vslice) && (max != -1)) { 35604 expanded[stage_fc->vmap[inst][0][vslice].vmap_key] = 1; 35605 } 35606 } 35607 } 35608 35609 return BCM_E_NONE; 35610 } 35611 35612 /* 35613 * Function: 35614 * _bcm_field_th_egress_secondary_selcode_set 35615 * 35616 * Purpose: 35617 * Sets the secondary select codes based on field values in different 35618 * registers EFP_CLASSID_SELECTORr, EFP_KEY4_DVP_SELECTORr and 35619 * EFP_KEY4_MDL_SELECTORr. 35620 * 35621 * Parameters: 35622 * unit - (IN) BCM unit number. 35623 * fg - (IN/OUT) Select code information filled into the group 35624 * slice_idx - (IN) Slice id 35625 * part_idx - (IN) Part id of the given slice in the given group 35626 * 35627 * Returns: 35628 * BCM_E_XXX 35629 */ 35630 STATIC int 35631 _bcm_field_th_egress_secondary_selcodes_set(int unit, _field_group_t *fg, 35632 int slice_idx, uint8 part_idx) 35633 { 35634 soc_field_t field; /* H/W Register field. */ 35635 uint64 reg_val64; /* 64 bit H/W Register value. */ 35636 uint32 fldval; /* Field in a H/W register value. */ 35637 uint8 num_fields; /* Number of fields. */ 35638 soc_reg_t reg; /* H/W register. */ 35639 int rv = BCM_E_NONE; /* Operation status. */ 35640 int idx; /* Index. */ 35641 int inst; /* Instance. */ 35642 _field_stage_t *stage_fc = NULL; 35643 soc_reg_t efp_classid_sel_reg; 35644 soc_reg_t efp_key4_dvp_reg; 35645 soc_reg_t efp_key4_mdl_reg; 35646 soc_reg_t efp_key8_dvp_reg; 35647 soc_reg_t efp_key4_class_reg; 35648 soc_reg_t efp_key8_class_reg; 35649 35650 if (NULL == fg) { 35651 return BCM_E_PARAM; 35652 } 35653 35654 BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, _BCM_FIELD_STAGE_EGRESS, &stage_fc)); 35655 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 35656 inst = _FP_GLOBAL_INST; 35657 } else { 35658 inst = fg->instance; 35659 } 35660 35661 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 35662 EFP_CLASSID_SELECTORr, 35663 inst, 35664 &efp_classid_sel_reg)); 35665 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 35666 EFP_KEY4_DVP_SELECTORr, 35667 inst, &efp_key4_dvp_reg)); 35668 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 35669 EFP_KEY8_DVP_SELECTORr, 35670 inst, &efp_key8_dvp_reg)); 35671 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 35672 EFP_KEY4_MDL_SELECTORr, 35673 inst, &efp_key4_mdl_reg)); 35674 if (soc_feature(unit, soc_feature_fp_no_dvp_support)) { 35675 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 35676 EFP_KEY4_L3_CLASSID_SELECTORr, 35677 inst, 35678 &efp_key4_class_reg)); 35679 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 35680 EFP_KEY8_L3_CLASSID_SELECTORr, 35681 inst, 35682 &efp_key8_class_reg)); 35683 } 35684 35685 fg->sel_codes[part_idx].egr_class_f1_sel = _FP_SELCODE_DONT_CARE; 35686 fg->sel_codes[part_idx].egr_class_f2_sel = _FP_SELCODE_DONT_CARE; 35687 fg->sel_codes[part_idx].egr_class_f3_sel = _FP_SELCODE_DONT_CARE; 35688 fg->sel_codes[part_idx].egr_class_f4_sel = _FP_SELCODE_DONT_CARE; 35689 fg->sel_codes[part_idx].egr_class_f6_sel = _FP_SELCODE_DONT_CARE; 35690 fg->sel_codes[part_idx].egr_class_f7_sel = _FP_SELCODE_DONT_CARE; 35691 fg->sel_codes[part_idx].egr_class_f8_sel = _FP_SELCODE_DONT_CARE; 35692 fg->sel_codes[part_idx].egr_key4_dvp_sel = _FP_SELCODE_DONT_CARE; 35693 fg->sel_codes[part_idx].egr_key8_dvp_sel = _FP_SELCODE_DONT_CARE; 35694 fg->sel_codes[part_idx].egr_key4_mdl_sel = _FP_SELCODE_DONT_CARE; 35695 fg->sel_codes[part_idx].egr_key4_l3_classId_sel = _FP_SELCODE_DONT_CARE; 35696 fg->sel_codes[part_idx].egr_key8_l3_classId_sel = _FP_SELCODE_DONT_CARE; 35697 35698 reg = efp_classid_sel_reg; 35699 rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, ®_val64); 35700 num_fields = sizeof(classfldtbl[0]) / 35701 sizeof(classfldtbl[0][0]); 35702 35703 if (BCM_SUCCESS(rv)) { 35704 for (idx = 0 ; idx < num_fields; idx++) { 35705 field = classfldtbl[slice_idx][idx]; 35706 if (!soc_reg_field_valid(unit, reg, field)) { 35707 continue; 35708 } 35709 35710 fldval = soc_reg64_field_get(unit, reg, reg_val64, field); 35711 35712 switch(idx) { 35713 case 0: 35714 fg->sel_codes[part_idx].egr_class_f1_sel = fldval; 35715 break; 35716 case 1: 35717 fg->sel_codes[part_idx].egr_class_f2_sel = fldval; 35718 break; 35719 case 2: 35720 fg->sel_codes[part_idx].egr_class_f3_sel = fldval; 35721 break; 35722 case 3: 35723 fg->sel_codes[part_idx].egr_class_f4_sel = fldval; 35724 break; 35725 case 4: 35726 fg->sel_codes[part_idx].egr_class_f6_sel = fldval; 35727 break; 35728 case 5: 35729 fg->sel_codes[part_idx].egr_class_f7_sel = fldval; 35730 break; 35731 case 6: 35732 fg->sel_codes[part_idx].egr_class_f8_sel = fldval; 35733 break; 35734 default: 35735 LOG_ERROR(BSL_LS_BCM_FP, 35736 (BSL_META_U(unit, 35737 "FP(unit %d) Error:Invalid field in efp classid selector \n"), 35738 unit)); 35739 return BCM_E_INTERNAL; 35740 } 35741 } 35742 } 35743 35744 if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) { 35745 reg = efp_key4_dvp_reg; 35746 rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, ®_val64); 35747 35748 if (BCM_SUCCESS(rv)) { 35749 field = dvpfldtbl[slice_idx]; 35750 if (soc_reg_field_valid(unit, reg, field)) { 35751 fldval = soc_reg_field_get(unit, reg, reg_val64, field); 35752 fg->sel_codes[part_idx].egr_key4_dvp_sel = fldval; 35753 } 35754 } 35755 35756 reg = efp_key8_dvp_reg; 35757 rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, ®_val64); 35758 35759 if (BCM_SUCCESS(rv)) { 35760 35761 field = dvpfldtbl[slice_idx]; 35762 if (soc_reg_field_valid(unit, reg, field)) { 35763 35764 fldval = soc_reg_field_get(unit, reg, reg_val64, field); 35765 fg->sel_codes[part_idx].egr_key8_dvp_sel = fldval; 35766 } 35767 } 35768 } 35769 35770 reg = efp_key4_mdl_reg; 35771 rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, ®_val64); 35772 35773 if (BCM_SUCCESS(rv)) { 35774 field = mdlfldtbl[slice_idx]; 35775 if (soc_reg_field_valid(unit, reg, field)) { 35776 35777 fldval = soc_reg_field_get(unit, reg, reg_val64, field); 35778 fg->sel_codes[part_idx].egr_key4_mdl_sel = fldval; 35779 } 35780 } 35781 35782 #if defined (BCM_TOMAHAWK3_SUPPORT) 35783 if (soc_feature(unit, soc_feature_fp_no_dvp_support)) { 35784 reg = efp_key4_class_reg; 35785 rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, ®_val64); 35786 35787 if (BCM_SUCCESS(rv)) { 35788 field = classIdBfldtbl[slice_idx]; 35789 if (soc_reg_field_valid(unit, reg, field)) { 35790 35791 fldval = soc_reg_field_get(unit, reg, reg_val64, field); 35792 fg->sel_codes[part_idx].egr_key4_l3_classId_sel = fldval; 35793 } 35794 } 35795 reg = efp_key8_class_reg; 35796 rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, ®_val64); 35797 35798 if (BCM_SUCCESS(rv)) { 35799 field = classIdBfldtbl[slice_idx]; 35800 if (soc_reg_field_valid(unit, reg, field)) { 35801 35802 fldval = soc_reg_field_get(unit, reg, reg_val64, field); 35803 fg->sel_codes[part_idx].egr_key8_l3_classId_sel = fldval; 35804 } 35805 } 35806 35807 } 35808 #endif 35809 35810 return BCM_E_NONE; 35811 } 35812 35813 /* 35814 * Function: 35815 * _bcm_field_th_stage_egress_reinit 35816 * Description: 35817 * Service routine used to retain the software sate of 35818 * EFP(Egress Field Processor) configuration . 35819 * Parameters: 35820 * unit - (IN) BCM device number. 35821 * fc - (IN) Field control structure. 35822 * stage_fc - (IN/OUT) Stage field control structure. 35823 * Returns: 35824 * BCM_E_XXX 35825 * Notes: 35826 * None. 35827 */ 35828 int 35829 _bcm_field_th_stage_egress_reinit(int unit, _field_control_t *fc, 35830 _field_stage_t *stage_fc) 35831 { 35832 char *efp_policy_buf = NULL; /* Buffer to read the EFP_POLICY table */ 35833 char *efp_policy_pipe_buf[_FP_MAX_NUM_PIPES+1] = {NULL}; 35834 /* Buffer for EFP_POLICY_TABLE pipes. */ 35835 int idx; /* Index to field entry. */ 35836 int idx1; 35837 int slice_idx; /* Slice index in (V/I/E)FP. */ 35838 int vslice_idx; /* Slice index in a virtual group. */ 35839 int index_min; /* Min index of a memory. */ 35840 int index_max; /* Max index of a field memory. */ 35841 int rv = BCM_E_NONE; /* Operation status. */ 35842 int mem_sz; /* Size of the memory. */ 35843 int slice_ent_cnt = 0; /* Entry count in a slice. */ 35844 int parts_count = 1; /* Parts count in a field group. */ 35845 int i; /* Used to loop through parts i 35846 in a field group. */ 35847 int pri_tcam_idx; /* Priority of an entry in TCAM. */ 35848 int part_index; /* Index to part(s) in a field group. */ 35849 int slice_number; /* (V/I/E) slice number. */ 35850 int phys_tcam_idx; /* Index to physical TCAM in (V/I/E)FP. */ 35851 int prev_prio; /* Priority of previous field entry. */ 35852 int expanded[_FP_MAX_NUM_PIPES][4]; 35853 /* Expansion status of slices in (V/I/E)FP. */ 35854 int slice_master_idx[_FP_MAX_NUM_PIPES][4]; 35855 /* Expansion status of slices in (V/I/E)FP. */ 35856 int priority; /* Priority of a field entry. */ 35857 int multigroup; /* Field group's multigroup status. */ 35858 int max; /*Temporary variable. */ 35859 int master_slice; /* Master slice number for expanded group. */ 35860 uint8 *buf = NULL; /* Pointer to 1st scache part. */ 35861 uint8 *buf1 = NULL; /* Pointer to 2nd scache part. */ 35862 uint8 old_physical_slice; /* Physical slice number. */ 35863 uint8 slice_num; /* Physical slice number. */ 35864 uint16 default_key_1; /* Default selcode of a field group in EFP. */ 35865 uint16 default_key_2; /* Default selcode of a field group in EFP. */ 35866 uint32 *efp_tcam_buf = NULL; /* Buffer to read the EFP_TCAM table. */ 35867 uint32 *efp_tcam_pipe_buf[_FP_MAX_NUM_PIPES+1] = {NULL}; 35868 /* Buffer to read EFP_TCAM table. */ 35869 uint32 rval; /* Holds conetets of register. */ 35870 uint32 efp_slice_mode; /* Mode of a slice in EFP. */ 35871 uint32 efp_slice_ipv6_mode; /* IPv6 mode of a slice in EFP. */ 35872 uint32 temp; /* Temporary varibale. */ 35873 uint32 key_match_type[2]; /* Key match types of field group in EFP. */ 35874 uint32 entry_type = 0; /* Type of entry of filed group in EFP. */ 35875 uint32 efp_key_type_offset = 0;/* Type of entry of filed group in EFP. */ 35876 uint32 entry_flags; /* Flags set for a entry in field group. */ 35877 _field_slice_t *fs = NULL; /* Slice pointer. */ 35878 _field_group_t *fg = NULL; /* Filed group pointer. */ 35879 _field_entry_t *f_ent = NULL; /* Field entry pointer. */ 35880 bcm_field_group_t gid; /* Field group ID. */ 35881 bcm_field_qset_t qset; /* QSET of field group. */ 35882 bcm_pbmp_t all_pbmp; /* Port Bit Map. */ 35883 bcm_pbmp_t group_pbmp; /* Port Bit Map. */ 35884 _field_action_t *fa = NULL; /* Field Action Structure */ 35885 int group_flags = 0; 35886 int action_res_id; 35887 int inst, mem_inst, instance; /* Pipe Instances */ 35888 _field_entry_oam_wb_t *f_ent_oam_wb = NULL; 35889 _field_entry_policer_wb_t *f_ent_policer_wb = NULL; 35890 _field_slice_t *fs_temp = NULL; /* Slice pointer. */ 35891 int8 efp_key_info[2]; 35892 efp_tcam_entry_t *efp_tcam_entry = NULL; /* Buffer to hold 35893 contents of entry in 35894 EFP_TCAM entry. */ 35895 efp_policy_table_entry_t *efp_policy_entry = NULL; /* Buffer to hold 35896 contetnts of entry in 35897 EFP_POLICY_TABLE. */ 35898 35899 35900 soc_field_t efp_en_flds[4] = {SLICE_ENABLE_SLICE_0f, SLICE_ENABLE_SLICE_1f, 35901 SLICE_ENABLE_SLICE_2f, SLICE_ENABLE_SLICE_3f}; 35902 35903 _field_action_bmp_t action_bmp; 35904 _field_entry_wb_info_t f_ent_wb_info; 35905 soc_reg_t efp_slice_control_reg; 35906 soc_mem_t efp_tcam; 35907 soc_mem_t efp_policy_table; 35908 35909 int size; 35910 int slice_size; 35911 _field_sliceidx_bmp_t sliceidx_bmp; 35912 int slice_offset; 35913 int tcam_valid_val = 0; 35914 sliceidx_bmp.w = NULL; 35915 slice_size = 0; 35916 slice_offset = 0; 35917 #if defined (BCM_TOMAHAWK3_SUPPORT) 35918 if (SOC_IS_TOMAHAWK3(unit)) { 35919 tcam_valid_val = 1; 35920 } else 35921 #endif /* BCM_TOMAHAWK3_SUPPORT */ 35922 { 35923 tcam_valid_val = 3; 35924 } 35925 35926 /* Reset Action bitmap to NULL. */ 35927 action_bmp.w = NULL; 35928 buf = fc->scache_ptr[_FIELD_SCACHE_PART_0]; 35929 buf1 = fc->scache_ptr[_FIELD_SCACHE_PART_1]; 35930 35931 fc->scache_pos1 = 0; 35932 fc->scache_pos1 += SOC_WB_SCACHE_CONTROL_SIZE; 35933 35934 sal_memset(expanded, 0, 4 * _FP_MAX_NUM_PIPES * sizeof(int)); 35935 sal_memset(slice_master_idx, 0, 4 * _FP_MAX_NUM_PIPES * sizeof(int)); 35936 35937 /* 35938 * In Trident3, EFP_TCAM entry KEY field width is (272 + 2b VALID) 35939 * In Tomahawk, EFP_TCAM entry KEY field width is (240 + 2b VALID) 35940 */ 35941 #if defined (BCM_TOMAHAWK3_SUPPORT) 35942 if (SOC_IS_TOMAHAWK3(unit)) { 35943 /*for TH3, the KEY fields MINBIT is 1 as VALID is only 1 bit*/ 35944 efp_key_type_offset = 236 + 1; 35945 } else 35946 #endif /* BCM_TOMAHAWK3_SUPPORT */ 35947 { 35948 efp_key_type_offset = soc_feature(unit, soc_feature_td3_style_fp) ? \ 35949 (268 + 2) : (236 + 2); 35950 } 35951 35952 if (fc->l2warm) { 35953 rv = _field_scache_stage_hdr_chk(fc, _FIELD_EFP_DATA_START); 35954 if (BCM_FAILURE(rv)) { 35955 return (rv); 35956 } 35957 35958 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_10) { 35959 bcm_field_group_oper_mode_t oper_mode; 35960 35961 /* Retrieve Stage Operational Mode. */ 35962 oper_mode = buf[fc->scache_pos]; 35963 35964 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 35965 "%s(): Recovering oper_mode:%d @ byte s_pos=%d s_po1=%d\n\r"), 35966 __func__, oper_mode, fc->scache_pos, fc->scache_pos1)); 35967 35968 fc->scache_pos++; 35969 35970 if (stage_fc->oper_mode != oper_mode) { 35971 /* Initialize the stage with the given operational mode. */ 35972 rv = _bcm_field_th_group_oper_mode_set(unit, 35973 bcmFieldQualifyStageEgress, 35974 oper_mode); 35975 if (BCM_FAILURE(rv)) { 35976 return rv; 35977 } 35978 35979 rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_EGRESS, 35980 &stage_fc); 35981 BCM_IF_ERROR_RETURN(rv); 35982 } 35983 } 35984 } 35985 35986 for (inst = 0; inst < stage_fc->num_instances; inst++) { 35987 if (!(fc->pipe_map & (1 << inst))) { 35988 continue; 35989 } 35990 mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 35991 _FP_GLOBAL_INST : inst; 35992 instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 35993 _FP_MAX_NUM_PIPES : inst; 35994 35995 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, EFP_TCAMm, 35996 mem_inst, &efp_tcam)); 35997 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 35998 EFP_POLICY_TABLEm, 35999 mem_inst, 36000 &efp_policy_table)); 36001 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 36002 EFP_SLICE_CONTROLr, 36003 mem_inst, &efp_slice_control_reg)); 36004 /* DMA various tables */ 36005 efp_tcam_buf = soc_cm_salloc(unit, sizeof(efp_tcam_entry_t) * 36006 soc_mem_index_count(unit, efp_tcam), 36007 "EFP TCAM buffer"); 36008 if (NULL == efp_tcam_buf) { 36009 rv = BCM_E_MEMORY; 36010 goto cleanup; 36011 } 36012 36013 sal_memset(efp_tcam_buf, 0, sizeof(efp_tcam_entry_t) * 36014 soc_mem_index_count(unit, EFP_TCAMm)); 36015 36016 index_min = soc_mem_index_min(unit, efp_tcam); 36017 index_max = soc_mem_index_max(unit, efp_tcam); 36018 fs = stage_fc->slices[inst]; 36019 if (stage_fc->flags & _FP_STAGE_HALF_SLICE) { 36020 slice_ent_cnt = fs->entry_count * 2; 36021 /* DMA in chunks */ 36022 for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) { 36023 fs = stage_fc->slices[inst] + slice_idx; 36024 if ((rv = soc_mem_read_range(unit, 36025 efp_tcam, MEM_BLOCK_ALL, 36026 slice_idx * slice_ent_cnt, 36027 slice_idx * slice_ent_cnt + fs->entry_count - 1, 36028 efp_tcam_buf + slice_idx * slice_ent_cnt * 36029 soc_mem_entry_words(unit, efp_tcam))) 36030 < 0 ) { 36031 goto cleanup; 36032 } 36033 } 36034 } else { 36035 slice_ent_cnt = fs->entry_count; 36036 if ((rv = soc_mem_read_range(unit, efp_tcam, MEM_BLOCK_ALL, 36037 index_min, index_max, 36038 efp_tcam_buf)) < 0 ) { 36039 goto cleanup; 36040 } 36041 } 36042 36043 efp_policy_buf = soc_cm_salloc(unit, SOC_MEM_TABLE_BYTES 36044 (unit, efp_policy_table), 36045 "EFP POLICY TABLE buffer"); 36046 if (NULL == efp_policy_buf) { 36047 rv = BCM_E_MEMORY; 36048 goto cleanup; 36049 } 36050 sal_memset(efp_policy_buf, 0, SOC_MEM_TABLE_BYTES 36051 (unit, efp_policy_table)); 36052 index_min = soc_mem_index_min(unit, efp_policy_table); 36053 index_max = soc_mem_index_max(unit, efp_policy_table); 36054 if ((rv = soc_mem_read_range(unit, efp_policy_table, 36055 MEM_BLOCK_ALL, index_min, index_max, 36056 efp_policy_buf)) < 0 ) { 36057 goto cleanup; 36058 } 36059 36060 efp_tcam_pipe_buf[instance] = efp_tcam_buf; 36061 efp_policy_pipe_buf[instance] = efp_policy_buf; 36062 efp_tcam_buf = NULL; 36063 efp_policy_buf = NULL; 36064 } 36065 36066 /* Get slice expansion status and virtual map for all the instances */ 36067 for (inst = 0; inst < stage_fc->num_instances; inst++) { 36068 if (!(fc->pipe_map & (1 << inst))) { 36069 36070 continue; 36071 } 36072 if ((rv = _field_th_slice_expanded_status_get(unit, inst, fc, stage_fc, 36073 expanded[inst], slice_master_idx[inst])) < 0) { 36074 goto cleanup; 36075 } 36076 } 36077 36078 slice_size = 0; 36079 if ((fc->l2warm) && 36080 ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_27)) { 36081 /* get the total slice size*/ 36082 slice_size = stage_fc->tcam_sz; 36083 size = SHR_BITALLOCSIZE(slice_size * _FP_MAX_NUM_PIPES); 36084 _FP_XGS3_ALLOC(sliceidx_bmp.w, size, "Sliceidx Bitmap"); 36085 if (NULL == sliceidx_bmp.w) { 36086 rv = BCM_E_MEMORY; 36087 goto cleanup; 36088 } 36089 sal_memcpy (sliceidx_bmp.w, &buf[fc->scache_pos], 36090 size); 36091 fc->scache_pos += size; 36092 } 36093 36094 /* Iterate over the instances */ 36095 for (inst = 0; inst < stage_fc->num_instances; inst++) { 36096 if (!(fc->pipe_map & (1 << inst))) { 36097 continue; 36098 } 36099 mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 36100 _FP_GLOBAL_INST : inst; 36101 instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 36102 _FP_MAX_NUM_PIPES : inst; 36103 slice_offset = inst * slice_size; 36104 36105 rv = _bcm_field_reg_instance_get(unit, 36106 EFP_SLICE_CONTROLr, 36107 mem_inst, &efp_slice_control_reg); 36108 if (BCM_FAILURE(rv)) { 36109 goto cleanup; 36110 } 36111 rv = _bcm_field_mem_instance_get(unit, EFP_TCAMm, 36112 mem_inst, &efp_tcam); 36113 if (BCM_FAILURE(rv)) { 36114 goto cleanup; 36115 } 36116 rv = _bcm_field_mem_instance_get(unit, 36117 EFP_POLICY_TABLEm, 36118 mem_inst, 36119 &efp_policy_table); 36120 if (BCM_FAILURE(rv)) { 36121 goto cleanup; 36122 } 36123 36124 if ((rv = soc_reg32_get(unit, efp_slice_control_reg, 36125 REG_PORT_ANY, 0, &rval)) < 0) { 36126 goto cleanup; 36127 } 36128 36129 /* Iterate over the slices */ 36130 for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) { 36131 /* Ignore disabled slice */ 36132 if (soc_reg_field_get(unit, efp_slice_control_reg, rval, 36133 efp_en_flds[slice_idx]) == 0) { 36134 continue; 36135 } 36136 36137 /* Don't need to read selectors for expanded slice */ 36138 if (expanded[inst][slice_idx]) { 36139 continue; 36140 } 36141 36142 efp_slice_mode = soc_reg_field_get(unit, 36143 efp_slice_control_reg, rval, 36144 _th_efp_slice_mode[slice_idx][0]); 36145 efp_slice_ipv6_mode = soc_reg_field_get(unit, 36146 efp_slice_control_reg, rval, 36147 _th_efp_slice_mode[slice_idx][1]); 36148 36149 /* Skip second part of slice pair */ 36150 if (((efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE) || 36151 (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY) || 36152 (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6)) && 36153 (slice_idx % 2)) { 36154 continue; 36155 } 36156 36157 /* Skip if slice has no valid groups and entries */ 36158 fs = stage_fc->slices[inst] + slice_idx; 36159 key_match_type[0] = ~0; 36160 key_match_type[1] = ~0; 36161 36162 /* Get KEY_MATCH_TYPE from the valid entries of EFP_TCAM */ 36163 for (idx = 0; idx < slice_ent_cnt; idx++) { 36164 efp_tcam_entry = soc_mem_table_idx_to_pointer(unit, 36165 efp_tcam, 36166 efp_tcam_entry_t *, 36167 efp_tcam_pipe_buf[instance], 36168 idx + slice_ent_cnt * slice_idx); 36169 36170 if ((soc_mem_field32_get(unit, efp_tcam, 36171 efp_tcam_entry, VALIDf) != 0) || 36172 ((fc->l2warm) && 36173 ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_27) && 36174 (_FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 36175 (idx + slice_ent_cnt * slice_idx) + slice_offset) ))) { 36176 36177 if (key_match_type[0] == ~0) { 36178 _field_extract((uint32 *)efp_tcam_entry, efp_key_type_offset, 4, 36179 &key_match_type[0]); 36180 continue; 36181 } 36182 36183 if (key_match_type[1] == ~0) { 36184 _field_extract((uint32 *)efp_tcam_entry, efp_key_type_offset, 4, 36185 &key_match_type[1]); 36186 if (key_match_type[0] == key_match_type[1]) { 36187 key_match_type[1] = ~0; 36188 } else { 36189 /* break once possible two key match types are 36190 * extracted from the valid entries 36191 */ 36192 break; 36193 } 36194 } 36195 } 36196 } 36197 36198 if (key_match_type[0] == ~0 && !fc->l2warm) { 36199 continue; 36200 } 36201 36202 fg = NULL; 36203 if (efp_slice_mode <= 5) { /* Valid values */ 36204 /* If Level 2, retrieve the GIDs in this slice */ 36205 if (fc->l2warm) { 36206 rv = _field_trx_scache_slice_group_recover(unit, 36207 fc, 36208 inst, 36209 slice_idx, 36210 NULL, 36211 stage_fc, 36212 0); 36213 if (BCM_FAILURE(rv) && (rv != BCM_E_NOT_FOUND)) { 36214 fc->l2warm = 0; 36215 goto cleanup; 36216 } 36217 if (rv == BCM_E_NOT_FOUND) { 36218 rv = BCM_E_NONE; 36219 continue; 36220 } 36221 } 36222 36223 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 36224 "# line[%d] inst[%d] slice[%d] byte @ s_pos=%d s_pos1=%d\n\r"), 36225 __LINE__,inst,slice_idx, fc->scache_pos,fc->scache_pos1)); 36226 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 36227 "@ efp_slice_mode:[%d] inst[%d] slice[%d] key_match_type[0]=%d" 36228 " key_match_type[1]=%d\n\r"), efp_slice_mode, inst, slice_idx, 36229 key_match_type[0], key_match_type[1])); 36230 36231 rv = _field_tr2_group_construct_alloc(unit, &fg); 36232 if (BCM_FAILURE(rv)) { 36233 goto cleanup; 36234 } 36235 36236 action_res_id = BCM_FIELD_GROUP_ACTION_RES_ID_DEFAULT; 36237 36238 group_flags = 0; 36239 if (fc->l2warm) { 36240 /* Get stored group ID and QSET for Level 2 */ 36241 rv = _field_group_info_retrieve(unit, -1, inst, 36242 &gid, &priority, 36243 &action_res_id, 36244 &group_pbmp, 36245 efp_key_info, 36246 &group_flags, 36247 &qset, fc); 36248 sal_memcpy(&fg->qset, &qset, sizeof(bcm_field_qset_t)); 36249 } else { 36250 if ((rv = _bcm_field_group_id_generate(unit, &gid)) 36251 == BCM_E_NONE) { 36252 unsigned vmap, vslice; 36253 36254 for (priority = -1, vmap = 0; 36255 priority == -1 && vmap < _FP_VMAP_CNT; ++vmap) { 36256 for (vslice = 0; 36257 vslice < COUNTOF(stage_fc->vmap[inst][0]); 36258 ++vslice) { 36259 if (stage_fc->vmap[inst][vmap][vslice].vmap_key == 36260 slice_idx) { 36261 priority = 36262 stage_fc->vmap[inst][vmap][vslice].priority; 36263 break; 36264 } 36265 } 36266 } 36267 36268 if (priority == -1) { 36269 rv = BCM_E_INTERNAL; 36270 } 36271 } 36272 } 36273 if (BCM_FAILURE(rv)) { 36274 sal_free(fg); 36275 goto cleanup; 36276 } 36277 36278 fg->gid = gid; 36279 fg->priority = priority; 36280 fg->action_res_id = action_res_id; 36281 fg->stage_id = stage_fc->stage_id; 36282 fg->instance = inst; 36283 36284 if (fc->l2warm && ((fc->wb_recovered_version) 36285 >= BCM_FIELD_WB_VERSION_1_16)) { 36286 /* Update efp primary key value */ 36287 fg->sel_codes[0].fpf3 = efp_key_info[0]; 36288 36289 /* Update efp secondary key value based on mode */ 36290 if ((efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE) || 36291 (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY) || 36292 (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6)) { 36293 fg->sel_codes[1].fpf3 = efp_key_info[1]; 36294 parts_count = 2; 36295 fg->flags |= _FP_GROUP_SPAN_DOUBLE_SLICE; 36296 } else { 36297 parts_count = 1; 36298 fg->flags |= _FP_GROUP_SPAN_SINGLE_SLICE; 36299 } 36300 36301 /* Update IPv6 mode */ 36302 if (efp_key_info[0] == _BCM_FIELD_EFP_KEY2) { 36303 fg->sel_codes[0].ip6_addr_sel = efp_slice_ipv6_mode; 36304 } else if (efp_key_info[1] == _BCM_FIELD_EFP_KEY2) { 36305 fg->sel_codes[1].ip6_addr_sel = efp_slice_ipv6_mode; 36306 } 36307 36308 for (part_index = 0; part_index < parts_count; part_index++) { 36309 /* Populate all secondary selectors for the given group */ 36310 #if defined(BCM_TRIDENT3_SUPPORT) 36311 if (soc_feature(unit, soc_feature_td3_style_fp)) { 36312 rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg, 36313 slice_idx + part_index, 36314 part_index); 36315 } else 36316 #endif 36317 { 36318 rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg, 36319 slice_idx + part_index, 36320 part_index); 36321 } 36322 if (BCM_FAILURE(rv)) { 36323 sal_free(fg); 36324 goto cleanup; 36325 } 36326 } 36327 36328 /* Store primary key's */ 36329 default_key_1 = fg->sel_codes[0].fpf3; 36330 default_key_2 = fg->sel_codes[1].fpf3; 36331 36332 if (fg->flags & _FP_GROUP_SPAN_SINGLE_SLICE) { 36333 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36334 stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1); 36335 if (BCM_FAILURE(rv)) { 36336 sal_free(fg); 36337 goto cleanup; 36338 } 36339 36340 /* Update secondary or default key for quals update */ 36341 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY4; 36342 } else { 36343 switch(efp_slice_mode) { 36344 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6: 36345 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE: 36346 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36347 stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1); 36348 if (BCM_FAILURE(rv)) { 36349 sal_free(fg); 36350 goto cleanup; 36351 } 36352 /* Update secondary or default key for quals update */ 36353 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY8; 36354 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36355 break; 36356 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY: 36357 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36358 stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1); 36359 if (BCM_FAILURE(rv)) { 36360 sal_free(fg); 36361 goto cleanup; 36362 } 36363 /* Update secondary or default key for quals update */ 36364 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1; 36365 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36366 break; 36367 default: 36368 rv = BCM_E_INTERNAL; 36369 sal_free(fg); 36370 goto cleanup; 36371 } 36372 } 36373 36374 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36375 stage_fc, _FP_ENTRY_TYPE_1, fg, 36376 default_key_1, default_key_2); 36377 if (BCM_FAILURE(rv)) { 36378 sal_free(fg); 36379 goto cleanup; 36380 } 36381 36382 /* Restore Primary Key */ 36383 fg->sel_codes[0].fpf3 = default_key_1; 36384 fg->sel_codes[1].fpf3 = default_key_2; 36385 } else { 36386 switch (efp_slice_mode) { 36387 36388 case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L2: 36389 fg->flags |= _FP_GROUP_SPAN_SINGLE_SLICE; 36390 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY4; 36391 parts_count = 1; 36392 36393 for (part_index = 0; part_index < parts_count; part_index++) { 36394 /* Populate all secondary selectors for the given group */ 36395 #if defined(BCM_TRIDENT3_SUPPORT) 36396 if (soc_feature(unit, soc_feature_td3_style_fp)) { 36397 rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg, 36398 slice_idx + part_index, 36399 part_index); 36400 } else 36401 #endif 36402 { 36403 rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg, 36404 slice_idx + part_index, 36405 part_index); 36406 } 36407 if (BCM_FAILURE(rv)) { 36408 sal_free(fg); 36409 goto cleanup; 36410 } 36411 } 36412 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36413 stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1); 36414 if (BCM_FAILURE(rv)) { 36415 sal_free(fg); 36416 goto cleanup; 36417 } 36418 36419 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36420 stage_fc, _FP_ENTRY_TYPE_1, fg, 36421 fg->sel_codes[0].fpf3, -1); 36422 if (BCM_FAILURE(rv)) { 36423 sal_free(fg); 36424 goto cleanup; 36425 } 36426 break; 36427 case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3: 36428 fg->flags |= _FP_GROUP_SPAN_SINGLE_SLICE; 36429 parts_count = 1; 36430 36431 36432 for (part_index = 0; part_index < parts_count; part_index++) { 36433 /* Populate all secondary selectors for the given group */ 36434 #if defined(BCM_TRIDENT3_SUPPORT) 36435 if (soc_feature(unit, soc_feature_td3_style_fp)) { 36436 rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg, 36437 slice_idx + part_index, 36438 part_index); 36439 } else 36440 #endif 36441 { 36442 rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg, 36443 slice_idx + part_index, 36444 part_index); 36445 } 36446 if (BCM_FAILURE(rv)) { 36447 sal_free(fg); 36448 goto cleanup; 36449 } 36450 } 36451 36452 if (efp_slice_ipv6_mode) { 36453 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY2; 36454 default_key_1 = _BCM_FIELD_EFP_KEY2; 36455 fg->sel_codes[0].ip6_addr_sel = efp_slice_ipv6_mode; 36456 } else { 36457 if ((key_match_type[0] == KEY_TYPE_IPv6_SINGLE) || 36458 (key_match_type[1] == KEY_TYPE_IPv6_SINGLE) || 36459 BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifySrcIp6) || 36460 BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyDstIp6) || 36461 BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyIp6) || 36462 BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifySrcIp6High) || 36463 BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyDstIp6High)) { 36464 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY2; 36465 default_key_1 = _BCM_FIELD_EFP_KEY2; 36466 fg->sel_codes[0].ip6_addr_sel = efp_slice_ipv6_mode; 36467 } else { 36468 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1; 36469 default_key_1 = _BCM_FIELD_EFP_KEY1; 36470 fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36471 } 36472 } 36473 36474 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36475 stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1); 36476 if (BCM_FAILURE(rv)) { 36477 sal_free(fg); 36478 goto cleanup; 36479 } 36480 36481 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY4; 36482 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36483 stage_fc, _FP_ENTRY_TYPE_1, fg, 36484 default_key_1, -1); 36485 if (BCM_FAILURE(rv)) { 36486 sal_free(fg); 36487 goto cleanup; 36488 } 36489 36490 fg->sel_codes[0].fpf3 = default_key_1; 36491 if (efp_slice_ipv6_mode) { 36492 fg->sel_codes[0].ip6_addr_sel = efp_slice_ipv6_mode; 36493 } 36494 else { 36495 if (default_key_1 == _BCM_FIELD_EFP_KEY1) { 36496 fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36497 } 36498 } 36499 break; 36500 case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3_ANY: 36501 fg->flags |= _FP_GROUP_SPAN_SINGLE_SLICE; 36502 parts_count = 1; 36503 36504 36505 for (part_index = 0; part_index < parts_count; part_index++) { 36506 /* Populate all secondary selectors for the given group */ 36507 #if defined(BCM_TRIDENT3_SUPPORT) 36508 if (soc_feature(unit, soc_feature_td3_style_fp)) { 36509 rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg, 36510 slice_idx + part_index, 36511 part_index); 36512 } else 36513 #endif 36514 { 36515 rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg, 36516 slice_idx + part_index, 36517 part_index); 36518 } 36519 if (BCM_FAILURE(rv)) { 36520 sal_free(fg); 36521 goto cleanup; 36522 } 36523 } 36524 36525 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1; 36526 fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36527 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36528 stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1); 36529 if (BCM_FAILURE(rv)) { 36530 sal_free(fg); 36531 goto cleanup; 36532 } 36533 36534 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY4; 36535 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36536 stage_fc, _FP_ENTRY_TYPE_1, fg, 36537 _BCM_FIELD_EFP_KEY1, -1); 36538 if (BCM_FAILURE(rv)) { 36539 sal_free(fg); 36540 goto cleanup; 36541 } 36542 36543 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1; 36544 fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36545 break; 36546 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE: 36547 fg->flags |= _FP_GROUP_SPAN_DOUBLE_SLICE; 36548 parts_count = 2; 36549 36550 36551 for (part_index = 0; part_index < parts_count; part_index++) { 36552 /* Populate all secondary selectors for the given group */ 36553 #if defined(BCM_TRIDENT3_SUPPORT) 36554 if (soc_feature(unit, soc_feature_td3_style_fp)) { 36555 rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg, 36556 slice_idx + part_index, 36557 part_index); 36558 } else 36559 #endif 36560 { 36561 rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg, 36562 slice_idx + part_index, 36563 part_index); 36564 } 36565 if (BCM_FAILURE(rv)) { 36566 sal_free(fg); 36567 goto cleanup; 36568 } 36569 } 36570 36571 if (efp_slice_ipv6_mode) { 36572 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY3; 36573 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY2; 36574 default_key_1 = _BCM_FIELD_EFP_KEY3; 36575 default_key_2 = _BCM_FIELD_EFP_KEY2; 36576 fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36577 fg->sel_codes[1].ip6_addr_sel = efp_slice_ipv6_mode; 36578 } else { 36579 if ((key_match_type[0] == KEY_TYPE_IPv6_DOUBLE) || 36580 (key_match_type[1] == KEY_TYPE_IPv6_DOUBLE)) { 36581 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY3; 36582 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY2; 36583 default_key_1 = _BCM_FIELD_EFP_KEY3; 36584 default_key_2 = _BCM_FIELD_EFP_KEY2; 36585 fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36586 fg->sel_codes[1].ip6_addr_sel = efp_slice_ipv6_mode; 36587 } else if ((key_match_type[0] == 36588 KEY_TYPE_IPv4_L2_L3_DOUBLE) || 36589 (key_match_type[1] == 36590 KEY_TYPE_IPv4_L2_L3_DOUBLE) ) { 36591 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1; 36592 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36593 default_key_1 = _BCM_FIELD_EFP_KEY1; 36594 default_key_2 = _BCM_FIELD_EFP_KEY4; 36595 fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36596 fg->sel_codes[1].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36597 } else { 36598 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY8; 36599 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36600 default_key_1 = _BCM_FIELD_EFP_KEY8; 36601 default_key_2 = _BCM_FIELD_EFP_KEY4; 36602 fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36603 fg->sel_codes[1].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36604 } 36605 } 36606 36607 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36608 stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1); 36609 if (BCM_FAILURE(rv)) { 36610 sal_free(fg); 36611 goto cleanup; 36612 } 36613 36614 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY8; 36615 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36616 36617 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36618 stage_fc, _FP_ENTRY_TYPE_1, fg, 36619 default_key_1, default_key_2); 36620 if (BCM_FAILURE(rv)) { 36621 sal_free(fg); 36622 goto cleanup; 36623 } 36624 36625 fg->sel_codes[0].fpf3 = default_key_1; 36626 fg->sel_codes[1].fpf3 = default_key_2; 36627 break; 36628 36629 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY: 36630 fg->flags |= _FP_GROUP_SPAN_DOUBLE_SLICE; 36631 parts_count = 2; 36632 36633 for (part_index = 0; part_index < parts_count; part_index++) { 36634 /* Populate all secondary selectors for the given group */ 36635 #if defined(BCM_TRIDENT3_SUPPORT) 36636 if (soc_feature(unit, soc_feature_td3_style_fp)) { 36637 rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg, 36638 slice_idx + part_index, 36639 part_index); 36640 } else 36641 #endif 36642 { 36643 rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg, 36644 slice_idx + part_index, 36645 part_index); 36646 } 36647 if (BCM_FAILURE(rv)) { 36648 sal_free(fg); 36649 goto cleanup; 36650 } 36651 } 36652 36653 fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36654 fg->sel_codes[1].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36655 36656 if ((key_match_type[0] == KEY_TYPE_HIGIG_DOUBLE) || 36657 (key_match_type[1] == KEY_TYPE_HIGIG_DOUBLE)) { 36658 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY6; 36659 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36660 default_key_1 = _BCM_FIELD_EFP_KEY6; 36661 default_key_2 = _BCM_FIELD_EFP_KEY4; 36662 } else if ((key_match_type[0] == 36663 KEY_TYPE_LOOPBACK_DOUBLE) || 36664 (key_match_type[0] == 36665 KEY_TYPE_LOOPBACK_DOUBLE) ) { 36666 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY7; 36667 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36668 default_key_1 = _BCM_FIELD_EFP_KEY7; 36669 default_key_2 = _BCM_FIELD_EFP_KEY4; 36670 } else { 36671 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1; 36672 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36673 default_key_1 = _BCM_FIELD_EFP_KEY1; 36674 default_key_2 = _BCM_FIELD_EFP_KEY4; 36675 } 36676 36677 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36678 stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1); 36679 if (BCM_FAILURE(rv)) { 36680 sal_free(fg); 36681 goto cleanup; 36682 } 36683 36684 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1; 36685 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36686 36687 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36688 stage_fc, _FP_ENTRY_TYPE_1, fg, 36689 default_key_1, default_key_2); 36690 if (BCM_FAILURE(rv)) { 36691 sal_free(fg); 36692 goto cleanup; 36693 } 36694 36695 fg->sel_codes[0].fpf3 = default_key_1; 36696 fg->sel_codes[1].fpf3 = default_key_2; 36697 break; 36698 36699 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6: 36700 36701 fg->flags |= _FP_GROUP_SPAN_DOUBLE_SLICE; 36702 parts_count = 2; 36703 36704 for (part_index = 0; part_index < parts_count; part_index++) { 36705 /* Populate all secondary selectors for the given group */ 36706 #if defined(BCM_TRIDENT3_SUPPORT) 36707 if (soc_feature(unit, soc_feature_td3_style_fp)) { 36708 rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg, 36709 slice_idx + part_index, 36710 part_index); 36711 } else 36712 #endif 36713 { 36714 rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg, 36715 slice_idx + part_index, 36716 part_index); 36717 } 36718 if (BCM_FAILURE(rv)) { 36719 sal_free(fg); 36720 goto cleanup; 36721 } 36722 } 36723 36724 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY2; 36725 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36726 fg->sel_codes[0].ip6_addr_sel = efp_slice_ipv6_mode; 36727 fg->sel_codes[1].ip6_addr_sel = _FP_SELCODE_DONT_CARE; 36728 36729 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36730 stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1); 36731 if (BCM_FAILURE(rv)) { 36732 sal_free(fg); 36733 goto cleanup; 36734 } 36735 36736 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY8; 36737 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36738 36739 rv = _bcm_field_td2_group_construct_quals_add(unit, fc, 36740 stage_fc, _FP_ENTRY_TYPE_1, fg, 36741 _BCM_FIELD_EFP_KEY2, _BCM_FIELD_EFP_KEY4); 36742 if (BCM_FAILURE(rv)) { 36743 sal_free(fg); 36744 goto cleanup; 36745 } 36746 36747 fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY2; 36748 fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4; 36749 break; 36750 36751 default: 36752 rv = BCM_E_INTERNAL; 36753 sal_free(fg); 36754 goto cleanup; 36755 } 36756 } 36757 36758 /* Associate slice(s) to group */ 36759 fg->slices = stage_fc->slices[inst] + slice_idx; 36760 SOC_PBMP_CLEAR(all_pbmp); 36761 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 36762 SOC_PBMP_ASSIGN(all_pbmp, PBMP_PORT_ALL(unit)); 36763 SOC_PBMP_OR(all_pbmp, PBMP_CMIC(unit)); 36764 } else { 36765 SOC_PBMP_ASSIGN(all_pbmp, PBMP_PIPE(unit, fg->instance)); 36766 SOC_PBMP_REMOVE(all_pbmp, PBMP_LB(unit)); 36767 } 36768 SOC_PBMP_ASSIGN(fg->pbmp, all_pbmp); 36769 BCM_PBMP_OR(fs->pbmp, fg->pbmp); 36770 36771 fs->group_flags = fg->flags & _FP_GROUP_STATUS_MASK; 36772 if (fg->flags & _FP_GROUP_SPAN_DOUBLE_SLICE) { 36773 BCM_PBMP_OR((fs + 1)->pbmp, fg->pbmp); 36774 (fs + 1)->group_flags = fs->group_flags; 36775 } 36776 36777 /* Initialize group default ASET list. */ 36778 rv = _field_group_default_aset_set(unit, fg); 36779 if (BCM_FAILURE(rv)) { 36780 sal_free(fg); 36781 goto cleanup; 36782 } 36783 36784 if (fc->l2warm 36785 && ((fc->wb_recovered_version) 36786 >= BCM_FIELD_WB_VERSION_1_15)) { 36787 if (group_flags & _FP_GROUP_LOOKUP_ENABLED) { 36788 fg->flags = fg->flags | _FP_GROUP_LOOKUP_ENABLED; 36789 } 36790 if (group_flags & _FP_GROUP_WLAN) { 36791 fg->flags = fg->flags | _FP_GROUP_WLAN; 36792 } 36793 } else { 36794 fg->flags |= _FP_GROUP_LOOKUP_ENABLED; 36795 } 36796 36797 if (group_flags & _FP_GROUP_SELECT_AUTO_EXPANSION) { 36798 fg->flags |= _FP_GROUP_SELECT_AUTO_EXPANSION; 36799 } 36800 36801 fg->next = fc->groups; 36802 fc->groups = fg; 36803 36804 /* Now go over the entries in this slice */ 36805 prev_prio = -1; 36806 for (idx = 0; idx < slice_ent_cnt; idx++) { 36807 efp_tcam_entry = soc_mem_table_idx_to_pointer(unit, 36808 efp_tcam, 36809 efp_tcam_entry_t *, 36810 efp_tcam_pipe_buf[instance], 36811 idx + slice_ent_cnt * slice_idx); 36812 if (soc_mem_field32_get(unit, efp_tcam, 36813 efp_tcam_entry, VALIDf) == 0) { 36814 if (!(fc->l2warm)) { 36815 continue; 36816 } else { 36817 if ((fc->wb_recovered_version) < 36818 BCM_FIELD_WB_VERSION_1_27) { 36819 continue; 36820 } else if (!(_FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 36821 (idx + slice_ent_cnt * slice_idx) +slice_offset))) { 36822 continue; 36823 } 36824 } 36825 } 36826 36827 _field_extract((uint32 *)efp_tcam_entry, efp_key_type_offset, 4, 36828 &entry_type); 36829 36830 /* Allocate memory for this entry */ 36831 mem_sz = parts_count * sizeof (_field_entry_t); 36832 _FP_XGS3_ALLOC(f_ent, mem_sz, "field entry"); 36833 if (f_ent == NULL) { 36834 rv = BCM_E_MEMORY; 36835 goto cleanup; 36836 } 36837 for (idx1 = 0; idx1 < _FP_POLICER_LEVEL_COUNT; idx1++) { 36838 f_ent->policer[idx1].pid = _FP_INVALID_INDEX; 36839 } 36840 sal_memset(&f_ent_wb_info, 0, sizeof(_field_entry_wb_info_t)); 36841 f_ent_wb_info.sid = f_ent_wb_info.pid = -1; 36842 if (fc->l2warm) { 36843 /* Recover f_ent_oam_wb structure from here */ 36844 /* Allocate f_ent_oam_wb structure and pass it to 36845 * corresponding function */ 36846 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_11) { 36847 _FP_XGS3_ALLOC(f_ent_oam_wb, sizeof (_field_entry_oam_wb_t), 36848 "Field Entry Warmboot"); 36849 if (f_ent_oam_wb == NULL) { 36850 sal_free (f_ent); 36851 rv = BCM_E_MEMORY; 36852 goto cleanup; 36853 } 36854 } 36855 f_ent_wb_info.f_ent_oam_wb = f_ent_oam_wb; 36856 36857 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) { 36858 action_bmp.w = NULL; 36859 _FP_XGS3_ALLOC(action_bmp.w, 36860 SHR_BITALLOCSIZE(_bcmFieldActionNoParamCount), 36861 "Action No Param Bitmap"); 36862 if (action_bmp.w == NULL) { 36863 rv = BCM_E_MEMORY; 36864 sal_free(f_ent); 36865 goto cleanup; 36866 } 36867 } 36868 f_ent_wb_info.action_bmp = &action_bmp; 36869 36870 /* Recover f_ent_policer_wb structure from here */ 36871 /* Allocate f_ent_policer_wb structure and pass it to 36872 * corresponding function */ 36873 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_17) { 36874 _FP_XGS3_ALLOC(f_ent_policer_wb, sizeof (_field_entry_policer_wb_t), 36875 "Field Entry Warmboot"); 36876 if (f_ent_policer_wb == NULL) { 36877 rv = BCM_E_MEMORY; 36878 sal_free (f_ent); 36879 goto cleanup; 36880 } 36881 } 36882 f_ent_wb_info.f_ent_policer_wb = f_ent_policer_wb; 36883 rv = _field_trx_entry_info_retrieve(unit, 36884 fc, 36885 stage_fc, 36886 0, 36887 &prev_prio, 36888 &f_ent_wb_info); 36889 36890 if (BCM_FAILURE(rv)) { 36891 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 36892 sal_free(f_ent); 36893 goto cleanup; 36894 } 36895 } else { 36896 _bcm_field_last_alloc_eid_incr(unit); 36897 } 36898 36899 switch(efp_slice_mode) { 36900 case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L2: 36901 f_ent->efp_key_match_type = 1; 36902 break; 36903 case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3: 36904 if (fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY1) { 36905 if (KEY_TYPE_IPv4_SINGLE == entry_type) { 36906 f_ent->efp_key_match_type = 0; 36907 } else { 36908 f_ent->efp_key_match_type = 1; 36909 } 36910 } else if (fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY5) { 36911 if (KEY_TYPE_FCOE_SINGLE == entry_type) { 36912 f_ent->efp_key_match_type = 0; 36913 } else { 36914 f_ent->efp_key_match_type = 1; 36915 } 36916 } else { 36917 if (KEY_TYPE_IPv6_SINGLE == entry_type) { 36918 f_ent->efp_key_match_type = 0; 36919 } else { 36920 f_ent->efp_key_match_type = 1; 36921 } 36922 } 36923 break; 36924 case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3_ANY: 36925 if (KEY_TYPE_IPv4_SINGLE == entry_type) { 36926 f_ent->efp_key_match_type = 0; 36927 } else { 36928 f_ent->efp_key_match_type = 1; 36929 } 36930 break; 36931 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE: 36932 if ((fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY1) && 36933 (fg->sel_codes[1].fpf3 == _BCM_FIELD_EFP_KEY4)) { 36934 if (KEY_TYPE_IPv4_L2_L3_DOUBLE == entry_type) { 36935 f_ent->efp_key_match_type = 0; 36936 (f_ent+1)->efp_key_match_type = 0; 36937 } else { 36938 f_ent->efp_key_match_type = 1; 36939 (f_ent+1)->efp_key_match_type = 1; 36940 } 36941 } else if ((fg->sel_codes[0].fpf3 == 36942 _BCM_FIELD_EFP_KEY3) && 36943 (fg->sel_codes[1].fpf3 == 36944 _BCM_FIELD_EFP_KEY2)) { 36945 if (KEY_TYPE_IPv6_DOUBLE == entry_type) { 36946 f_ent->efp_key_match_type = 0; 36947 (f_ent+1)->efp_key_match_type = 0; 36948 } else { 36949 f_ent->efp_key_match_type = 1; 36950 (f_ent+1)->efp_key_match_type = 1; 36951 } 36952 } else { 36953 f_ent->efp_key_match_type = 1; 36954 (f_ent+1)->efp_key_match_type = 1; 36955 } 36956 break; 36957 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY: 36958 if ((fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY6) && 36959 (fg->sel_codes[1].fpf3 == _BCM_FIELD_EFP_KEY4)) { 36960 if (KEY_TYPE_HIGIG_DOUBLE == entry_type) { 36961 f_ent->efp_key_match_type = 0; 36962 (f_ent+1)->efp_key_match_type = 0; 36963 } else { 36964 f_ent->efp_key_match_type = 1; 36965 (f_ent+1)->efp_key_match_type = 1; 36966 } 36967 } else if ((fg->sel_codes[0].fpf3 == 36968 _BCM_FIELD_EFP_KEY7) && 36969 (fg->sel_codes[1].fpf3 == 36970 _BCM_FIELD_EFP_KEY4)) { 36971 if (KEY_TYPE_LOOPBACK_DOUBLE == entry_type) { 36972 f_ent->efp_key_match_type = 0; 36973 (f_ent+1)->efp_key_match_type = 0; 36974 } else { 36975 f_ent->efp_key_match_type = 1; 36976 (f_ent+1)->efp_key_match_type = 1; 36977 } 36978 } else { 36979 f_ent->efp_key_match_type = 1; 36980 (f_ent+1)->efp_key_match_type = 1; 36981 } 36982 break; 36983 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6: 36984 if (KEY_TYPE_IPv4_IPv6_DOUBLE == entry_type) { 36985 f_ent->efp_key_match_type = 0; 36986 (f_ent+1)->efp_key_match_type = 0; 36987 } else { 36988 f_ent->efp_key_match_type = 1; 36989 (f_ent+1)->efp_key_match_type = 1; 36990 } 36991 break; 36992 default: 36993 rv = BCM_E_INTERNAL; 36994 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 36995 sal_free(f_ent); 36996 goto cleanup; 36997 } 36998 36999 pri_tcam_idx = idx + slice_ent_cnt * slice_idx; 37000 for (i = 0; i < parts_count; i++) { 37001 if (fc->l2warm) { 37002 f_ent[i].eid = f_ent_wb_info.eid; 37003 /* Set retrieved dvp_type and svp_type */ 37004 f_ent[i].dvp_type = f_ent_wb_info.dvp_type[i]; 37005 f_ent[i].svp_type = f_ent_wb_info.svp_type[i]; 37006 f_ent[i].prio = f_ent_wb_info.prio; 37007 } else { 37008 f_ent[i].eid = _bcm_field_last_alloc_eid_get(unit); 37009 } 37010 f_ent[i].group = fg; 37011 37012 rv = _bcm_field_tcam_part_to_entry_flags(unit, i, fg, 37013 &f_ent[i].flags); 37014 if (BCM_FAILURE(rv)) { 37015 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37016 sal_free(f_ent); 37017 goto cleanup; 37018 } 37019 if (f_ent_wb_info.color_independent) { 37020 f_ent[i].flags |= _FP_ENTRY_COLOR_INDEPENDENT; 37021 } 37022 rv = _bcm_field_entry_part_tcam_idx_get(unit, f_ent, 37023 pri_tcam_idx, 37024 i, &part_index); 37025 if (BCM_FAILURE(rv)) { 37026 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37027 sal_free(f_ent); 37028 goto cleanup; 37029 } 37030 if (f_ent_wb_info.color_independent) { 37031 f_ent[i].flags |= _FP_ENTRY_COLOR_INDEPENDENT; 37032 } 37033 rv = _bcm_field_tcam_idx_to_slice_offset(unit, stage_fc, 37034 inst, 37035 part_index, 37036 &slice_number, 37037 (int *)&f_ent[i].slice_idx); 37038 if (BCM_FAILURE(rv)) { 37039 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37040 sal_free(f_ent); 37041 goto cleanup; 37042 } 37043 f_ent[i].fs = stage_fc->slices[inst] + slice_number; 37044 if (0 == (f_ent[i].flags & _FP_ENTRY_SECOND_HALF)) { 37045 /* Decrement slice free entry count for primary 37046 entries. */ 37047 f_ent[i].fs->free_count--; 37048 } 37049 37050 f_ent[i].fs->hw_ent_count++; 37051 37052 /* Assign entry to a slice */ 37053 f_ent[i].fs->entries[f_ent[i].slice_idx] = f_ent + i; 37054 f_ent[i].flags |= _FP_ENTRY_INSTALLED; 37055 37056 if (soc_mem_field32_get(unit, efp_tcam, 37057 efp_tcam_entry, VALIDf) == tcam_valid_val) { 37058 f_ent[i].flags |= _FP_ENTRY_ENABLED; 37059 } else { 37060 if ((fc->l2warm) && (i != 0) && 37061 ((fc->wb_recovered_version) >= 37062 BCM_FIELD_WB_VERSION_1_27) && 37063 ( _FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 37064 pri_tcam_idx + slice_offset) )) { 37065 37066 f_ent[i].flags |= _FP_ENTRY_ENABLED; 37067 } 37068 } 37069 37070 /* Get the actions associated with this entry part */ 37071 efp_policy_entry = soc_mem_table_idx_to_pointer 37072 (unit, efp_policy_table, 37073 efp_policy_table_entry_t *, 37074 efp_policy_pipe_buf[instance], 37075 part_index); 37076 rv = _field_tr2_actions_recover(unit, 37077 efp_policy_table, 37078 (uint32 *) efp_policy_entry, 37079 f_ent, 37080 i, 37081 &f_ent_wb_info); 37082 if (BCM_FAILURE(rv)) { 37083 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37084 sal_free(f_ent); 37085 goto cleanup; 37086 } 37087 if (action_bmp.w != NULL) { 37088 _FP_ACTION_BMP_FREE(action_bmp); 37089 action_bmp.w = NULL; 37090 } 37091 } 37092 /* Set action stat flags */ 37093 fa = f_ent->actions; 37094 while (fa != NULL) { 37095 rv = _bcm_field_action_stat_flag_update(unit, f_ent, 37096 fa, TRUE); 37097 if (rv < 0) { 37098 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37099 sal_free(f_ent); 37100 goto cleanup; 37101 } 37102 fa = fa->next; 37103 } 37104 /* Add to the group */ 37105 rv = _field_group_entry_add(unit, fg, f_ent); 37106 if (BCM_FAILURE(rv)) { 37107 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37108 sal_free(f_ent); 37109 goto cleanup; 37110 } 37111 f_ent = NULL; 37112 37113 /* Entry has been added to group, 37114 * so free f_ent_oam_wb structure */ 37115 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37116 if (f_ent_policer_wb != NULL) { 37117 sal_free(f_ent_policer_wb); 37118 f_ent_policer_wb = NULL; 37119 } 37120 37121 } 37122 } 37123 37124 /* Free up the temporary slice group info */ 37125 if (fc->l2warm) { 37126 _field_scache_slice_group_free(unit, fc, slice_idx); 37127 } 37128 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 37129 "# Done reading for inst[%d] slice[%d] byte @ %d\n\r"), 37130 inst, slice_idx, fc->scache_pos)); 37131 } 37132 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 37133 "## Done reading for inst[%d] byte @ s_pos=%d s_pos1=%d\n\r"), 37134 inst, fc->scache_pos, fc->scache_pos1)); 37135 } 37136 37137 /* Iterate over the instances */ 37138 for (inst = 0; inst < stage_fc->num_instances; inst++) { 37139 if (!(fc->pipe_map & (1 << inst))) { 37140 continue; 37141 } 37142 mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 37143 _FP_GLOBAL_INST : inst; 37144 instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 37145 _FP_MAX_NUM_PIPES : inst; 37146 slice_offset = inst * slice_size; 37147 37148 rv = _bcm_field_reg_instance_get(unit, 37149 EFP_SLICE_CONTROLr, 37150 mem_inst, &efp_slice_control_reg); 37151 if (BCM_FAILURE(rv)) { 37152 goto cleanup; 37153 } 37154 rv = _bcm_field_mem_instance_get(unit, EFP_TCAMm, 37155 mem_inst, &efp_tcam); 37156 if (BCM_FAILURE(rv)) { 37157 goto cleanup; 37158 } 37159 rv = _bcm_field_mem_instance_get(unit, 37160 EFP_POLICY_TABLEm, 37161 mem_inst, 37162 &efp_policy_table); 37163 if (BCM_FAILURE(rv)) { 37164 goto cleanup; 37165 } 37166 37167 if ((rv = soc_reg32_get(unit, efp_slice_control_reg, 37168 REG_PORT_ANY, 0, &rval)) < 0) { 37169 goto cleanup; 37170 } 37171 /* Now go over the expanded slices */ 37172 for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) { 37173 if (!expanded[inst][slice_idx]) { 37174 continue; 37175 } 37176 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 37177 "# inst[%d] slice[%d] expanded[%d][%d]=[%d] byte @ %d\n\r"), inst, 37178 slice_idx, inst, slice_idx, expanded[inst][slice_idx], 37179 fc->scache_pos)); 37180 37181 /* Ignore secondary slice in paired mode */ 37182 efp_slice_mode = soc_reg_field_get(unit, 37183 efp_slice_control_reg, 37184 rval, 37185 _th_efp_slice_mode[slice_idx][0]); 37186 if (((efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE) || 37187 (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY) || 37188 (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6)) && 37189 (slice_idx % 2)) { 37190 continue; 37191 } 37192 /* Skip if slice has no valid entries */ 37193 fs = stage_fc->slices[inst] + slice_idx; 37194 slice_ent_cnt = fs->entry_count; 37195 for (idx = 0; idx < slice_ent_cnt; idx++) { 37196 if (_bcm_field_slice_offset_to_tcam_idx(unit, stage_fc, inst, 37197 slice_idx, idx, &phys_tcam_idx) != BCM_E_NONE) { 37198 rv = BCM_E_INTERNAL; 37199 goto cleanup; 37200 } 37201 efp_tcam_entry = soc_mem_table_idx_to_pointer(unit, 37202 efp_tcam, efp_tcam_entry_t *, 37203 efp_tcam_pipe_buf[instance], phys_tcam_idx); 37204 if (soc_mem_field32_get(unit, efp_tcam, 37205 efp_tcam_entry, VALIDf) != 0) { 37206 break; 37207 } else { 37208 if ((fc->l2warm) && 37209 ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_27) 37210 && (_FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 37211 phys_tcam_idx + slice_offset))) { 37212 break; 37213 } 37214 } 37215 } 37216 if (idx == slice_ent_cnt) { 37217 continue; 37218 } 37219 /* If Level 2, retrieve the GIDs in this slice */ 37220 if (fc->l2warm) { 37221 rv = _field_trx_scache_slice_group_recover(unit, 37222 fc, 37223 inst, 37224 slice_idx, 37225 &multigroup, 37226 stage_fc, 37227 0);; 37228 if (BCM_FAILURE(rv) && (rv != BCM_E_NOT_FOUND)) { 37229 fc->l2warm = 0; 37230 goto cleanup; 37231 } 37232 if (rv == BCM_E_NOT_FOUND) { 37233 rv = BCM_E_NONE; 37234 continue; 37235 } 37236 } 37237 /* Now find the master slice for this virtual group */ 37238 vslice_idx = _field_physical_to_virtual(unit, inst, slice_idx, 37239 stage_fc); 37240 if (vslice_idx < 0) { 37241 rv = BCM_E_INTERNAL; 37242 goto cleanup; 37243 } 37244 37245 if (fc->l2warm && ((fc->wb_recovered_version) 37246 >=BCM_FIELD_WB_VERSION_1_8)) { 37247 master_slice = slice_master_idx[inst][slice_idx]; 37248 } else { 37249 max = -1; 37250 for (i = 0; i < stage_fc->tcam_slices; i++) { 37251 if ((stage_fc->vmap[inst][0][vslice_idx].virtual_group == 37252 stage_fc->vmap[inst][0][i].virtual_group) 37253 && (i != vslice_idx)) { 37254 if (i > max) { 37255 max = i; 37256 } 37257 } 37258 } 37259 if (max < 0) { 37260 rv = BCM_E_INTERNAL; 37261 goto cleanup; 37262 } 37263 37264 master_slice = stage_fc->vmap[inst][0][max].vmap_key; 37265 } 37266 /* See which group is in this slice - can be only one */ 37267 fg = fc->groups; 37268 while (fg != NULL) { 37269 /* Check if group is in this slice */ 37270 fs = &fg->slices[0]; 37271 if ((fg->instance == inst) && 37272 (fg->stage_id == stage_fc->stage_id) && 37273 (fs->slice_number == master_slice)) { 37274 break; 37275 } 37276 fg = fg->next; 37277 } 37278 if (fg == NULL) { 37279 rv = BCM_E_INTERNAL; 37280 goto cleanup; 37281 } 37282 37283 old_physical_slice = fs->slice_number; 37284 37285 /* Set up the new physical slice parameters in Software */ 37286 for(part_index = parts_count - 1; part_index >= 0; part_index--) { 37287 /* Get entry flags. */ 37288 rv = _bcm_field_tcam_part_to_entry_flags(unit, part_index, fg, 37289 &entry_flags); 37290 37291 if (BCM_FAILURE(rv)) { 37292 goto cleanup; 37293 } 37294 /* Get slice id for entry part */ 37295 rv = _bcm_field_tcam_part_to_slice_number(unit, part_index, 37296 fg, &slice_num); 37297 if (BCM_FAILURE(rv)) { 37298 goto cleanup; 37299 } 37300 37301 /* Get slice pointer. */ 37302 fs = stage_fc->slices[inst] + slice_idx + slice_num; 37303 37304 if (0 == (entry_flags & _FP_ENTRY_SECOND_HALF)) { 37305 /* 37306 * Set per slice configuration & number of free entries in the 37307 * slice. 37308 */ 37309 fs->free_count = fs->entry_count; 37310 if (fg->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) { 37311 fs->free_count >>= 1; 37312 } 37313 /* Set group flags in in slice.*/ 37314 fs->group_flags = fg->flags & _FP_GROUP_STATUS_MASK; 37315 37316 /* Add slice to slices linked list . */ 37317 fs_temp = stage_fc->slices[inst] + 37318 old_physical_slice + slice_num; 37319 /* To handle more than one auto expanded slice in a group */ 37320 while (fs_temp->next != NULL) { 37321 fs_temp = fs_temp->next; 37322 } 37323 fs_temp->next = fs; 37324 fs->prev = fs_temp; 37325 } 37326 } 37327 37328 fs = stage_fc->slices[inst] + slice_idx; 37329 fs->group_flags = fg->flags & _FP_GROUP_STATUS_MASK; 37330 37331 prev_prio = -1; 37332 SOC_PBMP_CLEAR(all_pbmp); 37333 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 37334 SOC_PBMP_ASSIGN(all_pbmp, PBMP_PORT_ALL(unit)); 37335 SOC_PBMP_OR(all_pbmp, PBMP_CMIC(unit)); 37336 } else { 37337 SOC_PBMP_ASSIGN(all_pbmp, PBMP_PIPE(unit, fg->instance)); 37338 SOC_PBMP_REMOVE(all_pbmp, PBMP_LB(unit)); 37339 } 37340 SOC_PBMP_ASSIGN(fg->pbmp, all_pbmp); 37341 BCM_PBMP_OR(fs->pbmp, fg->pbmp); 37342 if (fg->flags & _FP_GROUP_SPAN_DOUBLE_SLICE) { 37343 BCM_PBMP_OR((fs + 1)->pbmp, fg->pbmp); 37344 (fs + 1)->group_flags = fs->group_flags; 37345 } 37346 37347 for (idx = 0; idx < slice_ent_cnt; idx++) { 37348 if (_bcm_field_slice_offset_to_tcam_idx(unit, stage_fc, 37349 inst, slice_idx, idx, &phys_tcam_idx) != BCM_E_NONE) { 37350 rv = BCM_E_INTERNAL; 37351 goto cleanup; 37352 } 37353 efp_tcam_entry = soc_mem_table_idx_to_pointer(unit, 37354 efp_tcam, efp_tcam_entry_t *, 37355 efp_tcam_pipe_buf[instance], phys_tcam_idx); 37356 if (soc_mem_field32_get(unit, efp_tcam, 37357 efp_tcam_entry, VALIDf) == 0) { 37358 if (!(fc->l2warm)) { 37359 continue; 37360 } else { 37361 if ((fc->wb_recovered_version) < 37362 BCM_FIELD_WB_VERSION_1_27) { 37363 continue; 37364 } else if (!(_FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 37365 phys_tcam_idx + slice_offset))) { 37366 continue; 37367 } 37368 } 37369 } 37370 37371 _field_extract((uint32 *)efp_tcam_entry, efp_key_type_offset, 4, 37372 &entry_type); 37373 37374 /* Allocate memory for the entry */ 37375 rv = _bcm_field_entry_tcam_parts_count(unit, fg->stage_id, 37376 fg->flags, &parts_count); 37377 if (BCM_FAILURE(rv)) { 37378 goto cleanup; 37379 } 37380 mem_sz = parts_count * sizeof (_field_entry_t); 37381 _FP_XGS3_ALLOC(f_ent, mem_sz, "field entry"); 37382 if (f_ent == NULL) { 37383 rv = BCM_E_MEMORY; 37384 goto cleanup; 37385 } 37386 37387 for (idx1 = 0; idx1 < _FP_POLICER_LEVEL_COUNT; idx1++) { 37388 f_ent->policer[idx1].pid = _FP_INVALID_INDEX; 37389 } 37390 37391 sal_memset(&f_ent_wb_info, 0, sizeof(_field_entry_wb_info_t)); 37392 f_ent_wb_info.sid = f_ent_wb_info.pid = -1; 37393 if (fc->l2warm) { 37394 /* Recover f_ent_oam_wb structure from here */ 37395 /* Allocate f_ent_oam_wb structure and pass it to 37396 * corresponding function */ 37397 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_11) { 37398 _FP_XGS3_ALLOC(f_ent_oam_wb, sizeof (_field_entry_oam_wb_t), 37399 "Field Entry Warmboot"); 37400 if (f_ent_oam_wb == NULL) { 37401 sal_free (f_ent); 37402 rv = BCM_E_MEMORY; 37403 goto cleanup; 37404 } 37405 } 37406 f_ent_wb_info.f_ent_oam_wb = f_ent_oam_wb; 37407 37408 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) { 37409 action_bmp.w = NULL; 37410 _FP_XGS3_ALLOC(action_bmp.w, 37411 SHR_BITALLOCSIZE(_bcmFieldActionNoParamCount), 37412 "Action No Param Bitmap"); 37413 if (action_bmp.w == NULL) { 37414 rv = BCM_E_MEMORY; 37415 sal_free(f_ent); 37416 goto cleanup; 37417 } 37418 } 37419 f_ent_wb_info.action_bmp = &action_bmp; 37420 37421 /* Recover f_ent_policer_wb structure from here */ 37422 /* Allocate f_ent_policer_wb structure and pass it to 37423 * corresponding function */ 37424 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_17) { 37425 _FP_XGS3_ALLOC(f_ent_policer_wb, sizeof (_field_entry_policer_wb_t), 37426 "Field Entry Warmboot"); 37427 if (f_ent_policer_wb == NULL) { 37428 rv = BCM_E_MEMORY; 37429 sal_free (f_ent); 37430 goto cleanup; 37431 } 37432 } 37433 f_ent_wb_info.f_ent_policer_wb = f_ent_policer_wb; 37434 37435 rv = _field_trx_entry_info_retrieve(unit, 37436 fc, stage_fc, multigroup, &prev_prio, &f_ent_wb_info); 37437 37438 if (BCM_FAILURE(rv)) { 37439 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37440 sal_free(f_ent); 37441 goto cleanup; 37442 } 37443 } else { 37444 _bcm_field_last_alloc_eid_incr(unit); 37445 } 37446 37447 switch(efp_slice_mode) { 37448 case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L2: 37449 f_ent->efp_key_match_type = 1; 37450 break; 37451 case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3: 37452 if (fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY1) { 37453 if (KEY_TYPE_IPv4_SINGLE == entry_type) { 37454 f_ent->efp_key_match_type = 0; 37455 } else { 37456 f_ent->efp_key_match_type = 1; 37457 } 37458 } else if (fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY5) { 37459 if (KEY_TYPE_FCOE_SINGLE == entry_type) { 37460 f_ent->efp_key_match_type = 0; 37461 } else { 37462 f_ent->efp_key_match_type = 1; 37463 } 37464 } else { 37465 if (KEY_TYPE_IPv6_SINGLE == entry_type) { 37466 f_ent->efp_key_match_type = 0; 37467 } else { 37468 f_ent->efp_key_match_type = 1; 37469 } 37470 } 37471 break; 37472 case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3_ANY: 37473 if (KEY_TYPE_IPv4_SINGLE == entry_type) { 37474 f_ent->efp_key_match_type = 0; 37475 } else { 37476 f_ent->efp_key_match_type = 1; 37477 } 37478 break; 37479 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE: 37480 if ((fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY1) && 37481 (fg->sel_codes[1].fpf3 == _BCM_FIELD_EFP_KEY4)) { 37482 if (KEY_TYPE_IPv4_L2_L3_DOUBLE == entry_type) { 37483 f_ent->efp_key_match_type = 0; 37484 (f_ent+1)->efp_key_match_type = 0; 37485 } else { 37486 f_ent->efp_key_match_type = 1; 37487 (f_ent+1)->efp_key_match_type = 1; 37488 } 37489 } else if ((fg->sel_codes[0].fpf3 == 37490 _BCM_FIELD_EFP_KEY3) && 37491 (fg->sel_codes[1].fpf3 == 37492 _BCM_FIELD_EFP_KEY2)) { 37493 if (KEY_TYPE_IPv6_DOUBLE == entry_type) { 37494 f_ent->efp_key_match_type = 0; 37495 (f_ent+1)->efp_key_match_type = 0; 37496 } else { 37497 f_ent->efp_key_match_type = 1; 37498 (f_ent+1)->efp_key_match_type = 1; 37499 } 37500 } else { 37501 f_ent->efp_key_match_type = 1; 37502 (f_ent+1)->efp_key_match_type = 1; 37503 } 37504 break; 37505 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY: 37506 if ((fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY6) && 37507 (fg->sel_codes[1].fpf3 == _BCM_FIELD_EFP_KEY4)) { 37508 if (KEY_TYPE_HIGIG_DOUBLE == entry_type) { 37509 f_ent->efp_key_match_type = 0; 37510 (f_ent+1)->efp_key_match_type = 0; 37511 } else { 37512 f_ent->efp_key_match_type = 1; 37513 (f_ent+1)->efp_key_match_type = 1; 37514 } 37515 } else if ((fg->sel_codes[0].fpf3 == 37516 _BCM_FIELD_EFP_KEY7) && 37517 (fg->sel_codes[1].fpf3 == 37518 _BCM_FIELD_EFP_KEY4)) { 37519 if (KEY_TYPE_LOOPBACK_DOUBLE == entry_type) { 37520 f_ent->efp_key_match_type = 0; 37521 (f_ent+1)->efp_key_match_type = 0; 37522 } else { 37523 f_ent->efp_key_match_type = 1; 37524 (f_ent+1)->efp_key_match_type = 1; 37525 } 37526 } else { 37527 f_ent->efp_key_match_type = 1; 37528 (f_ent+1)->efp_key_match_type = 1; 37529 } 37530 break; 37531 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6: 37532 if (KEY_TYPE_IPv4_IPv6_DOUBLE == entry_type) { 37533 f_ent->efp_key_match_type = 0; 37534 (f_ent+1)->efp_key_match_type = 0; 37535 } else { 37536 f_ent->efp_key_match_type = 1; 37537 (f_ent+1)->efp_key_match_type = 1; 37538 } 37539 break; 37540 case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_FCOE: 37541 if ((_BCM_FIELD_EFP_KEY5 == fg->sel_codes[0].fpf3) 37542 && (_BCM_FIELD_EFP_KEY4 == fg->sel_codes[1].fpf3) 37543 && (KEY_TYPE_FCOE_DOUBLE == entry_type)) { 37544 f_ent->efp_key_match_type = 0; 37545 (f_ent+1)->efp_key_match_type = 0; 37546 } else { 37547 f_ent->efp_key_match_type = 1; 37548 (f_ent+1)->efp_key_match_type = 1; 37549 } 37550 break; 37551 default: 37552 rv = BCM_E_INTERNAL; 37553 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37554 sal_free(f_ent); 37555 goto cleanup; 37556 } 37557 37558 pri_tcam_idx = phys_tcam_idx; 37559 for (i = 0; i < parts_count; i++) { 37560 if (fc->l2warm) { 37561 /* Use retrieved EID */ 37562 f_ent[i].eid = f_ent_wb_info.eid; 37563 /* Set retrieved dvp_type and svp_type */ 37564 f_ent[i].dvp_type = f_ent_wb_info.dvp_type[i]; 37565 f_ent[i].svp_type = f_ent_wb_info.svp_type[i]; 37566 f_ent[i].prio = f_ent_wb_info.prio; 37567 } else { 37568 f_ent[i].eid = _bcm_field_last_alloc_eid_get(unit); 37569 } 37570 f_ent[i].group = fg; 37571 37572 rv = _bcm_field_tcam_part_to_entry_flags(unit, i, fg, 37573 &f_ent[i].flags); 37574 if (BCM_FAILURE(rv)) { 37575 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37576 sal_free(f_ent); 37577 goto cleanup; 37578 } 37579 37580 rv = _bcm_field_entry_part_tcam_idx_get(unit, 37581 f_ent, pri_tcam_idx, i, &part_index); 37582 if (BCM_FAILURE(rv)) { 37583 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37584 sal_free(f_ent); 37585 goto cleanup; 37586 } 37587 if (f_ent_wb_info.color_independent) { 37588 f_ent[i].flags |= _FP_ENTRY_COLOR_INDEPENDENT; 37589 } 37590 rv = _bcm_field_tcam_idx_to_slice_offset(unit, 37591 stage_fc, inst, part_index, &slice_number, 37592 (int *)&f_ent[i].slice_idx); 37593 if (BCM_FAILURE(rv)) { 37594 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37595 sal_free(f_ent); 37596 goto cleanup; 37597 } 37598 f_ent[i].fs = stage_fc->slices[inst] + slice_number; 37599 if (0 == (f_ent[i].flags & _FP_ENTRY_SECOND_HALF)) { 37600 /* Decrement slice free entry count for primary 37601 entries. */ 37602 f_ent[i].fs->free_count--; 37603 } 37604 37605 f_ent[i].fs->hw_ent_count++; 37606 37607 /* Assign entry to a slice */ 37608 f_ent[i].fs->entries[f_ent[i].slice_idx] = f_ent + i; 37609 f_ent[i].flags |= _FP_ENTRY_INSTALLED; 37610 37611 if (soc_mem_field32_get(unit, efp_tcam, 37612 efp_tcam_entry, VALIDf) == tcam_valid_val) { 37613 f_ent[i].flags |= _FP_ENTRY_ENABLED; 37614 } else { 37615 if ((fc->l2warm) && (i != 0) && 37616 ((fc->wb_recovered_version) >= 37617 BCM_FIELD_WB_VERSION_1_27) && 37618 ( _FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 37619 pri_tcam_idx + slice_offset) )) { 37620 37621 f_ent[i].flags |= _FP_ENTRY_ENABLED; 37622 } 37623 } 37624 37625 37626 /* Get the actions associated with this part of the entry */ 37627 efp_policy_entry = soc_mem_table_idx_to_pointer( 37628 unit, efp_policy_table, 37629 efp_policy_table_entry_t *, 37630 efp_policy_pipe_buf[instance], 37631 part_index); 37632 rv = _field_tr2_actions_recover(unit, 37633 efp_policy_table, 37634 (uint32 *) efp_policy_entry, 37635 f_ent, i, &f_ent_wb_info); 37636 if (BCM_FAILURE(rv)) { 37637 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37638 sal_free(f_ent); 37639 goto cleanup; 37640 } 37641 if (action_bmp.w != NULL) { 37642 _FP_ACTION_BMP_FREE(action_bmp); 37643 action_bmp.w = NULL; 37644 } 37645 } 37646 /* Set action stat flags */ 37647 fa = f_ent->actions; 37648 while (fa != NULL) { 37649 rv = _bcm_field_action_stat_flag_update(unit, f_ent, 37650 fa, TRUE); 37651 if (rv < 0) { 37652 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37653 sal_free(f_ent); 37654 goto cleanup; 37655 } 37656 fa = fa->next; 37657 } 37658 37659 rv = _field_group_entry_add(unit, fg, f_ent); 37660 if (BCM_FAILURE(rv)) { 37661 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37662 sal_free(f_ent); 37663 goto cleanup; 37664 } 37665 f_ent = NULL; 37666 37667 /* Entry has been added to group, 37668 * so free f_ent_oam_wb structure */ 37669 _field_entry_oam_wb_free (unit, &f_ent_oam_wb); 37670 if (f_ent_policer_wb != NULL) { 37671 sal_free(f_ent_policer_wb); 37672 f_ent_policer_wb = NULL; 37673 } 37674 37675 } 37676 /* Free up the temporary slice group info */ 37677 if (fc->l2warm) { 37678 _field_scache_slice_group_free(unit, fc, slice_idx); 37679 } 37680 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 37681 "# Expansion Done reading for inst[%d] slice[%d] byte @ %d\n\r"), 37682 inst, slice_idx, fc->scache_pos)); 37683 } 37684 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 37685 "## Expansion Done reading for inst[%d] byte @ s_pos=%d s_pos1=%d\n\r"), 37686 inst, fc->scache_pos, fc->scache_pos1)); 37687 } 37688 37689 if (fc->l2warm) { 37690 37691 /* Mark end of Slice Info */ 37692 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) { 37693 fc->scache_pos++; 37694 } 37695 37696 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) { 37697 if (stage_fc->stage_id == _BCM_FIELD_STAGE_EGRESS) { 37698 LOG_DEBUG(BSL_LS_BCM_FP, 37699 (BSL_META_U(unit,"Recovering hint Ids " 37700 "from pos = %d\r\n"), fc->scache_pos)); 37701 rv = _bcm_hints_scache_hintid_recover(unit, stage_fc, 37702 fc, &buf[fc->scache_pos]); 37703 if (BCM_FAILURE(rv)) { 37704 goto cleanup; 37705 } 37706 } 37707 } 37708 37709 /* Group Slice Selectors */ 37710 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) { 37711 rv = (_field_group_slice_selectors_recover(unit, 37712 &buf[fc->scache_pos], stage_fc->stage_id)); 37713 if (BCM_FAILURE(rv)) { 37714 goto cleanup; 37715 } 37716 } 37717 37718 temp = 0; 37719 temp |= buf[fc->scache_pos]; 37720 fc->scache_pos++; 37721 temp |= buf[fc->scache_pos] << 8; 37722 fc->scache_pos++; 37723 temp |= buf[fc->scache_pos] << 16; 37724 fc->scache_pos++; 37725 temp |= buf[fc->scache_pos] << 24; 37726 fc->scache_pos++; 37727 if (temp != _FIELD_EFP_DATA_END) { 37728 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 37729 "%s(): Unable to find buf EFP_DATA_END [0x%x] @ byte %d.\n"), 37730 __func__, temp, fc->scache_pos)); 37731 fc->l2warm = 0; 37732 rv = BCM_E_INTERNAL; 37733 } 37734 37735 if (NULL != buf1) { 37736 temp = 0; 37737 temp |= buf1[fc->scache_pos1]; 37738 fc->scache_pos1++; 37739 temp |= buf1[fc->scache_pos1] << 8; 37740 fc->scache_pos1++; 37741 temp |= buf1[fc->scache_pos1] << 16; 37742 fc->scache_pos1++; 37743 temp |= buf1[fc->scache_pos1] << 24; 37744 fc->scache_pos1++; 37745 if (temp != _FIELD_EFP_DATA_END) { 37746 fc->l2warm = 0; 37747 rv = BCM_E_INTERNAL; 37748 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit, 37749 "%s(): Unable to find buf1 EFP_DATA_END [0x%x] @ byte %d.\n"), 37750 __func__, temp, fc->scache_pos1)); 37751 } 37752 } 37753 37754 } 37755 37756 if (BCM_SUCCESS(rv)) { 37757 _field_group_slice_vmap_recovery(unit, fc, stage_fc); 37758 } 37759 37760 _field_tr2_stage_reinit_all_groups_cleanup(unit, fc, 37761 _BCM_FIELD_STAGE_EGRESS, 37762 NULL); 37763 cleanup: 37764 for (inst = 0; inst < stage_fc->num_instances; inst++) { 37765 if (!(fc->pipe_map & (1 << inst))) { 37766 37767 continue; 37768 } 37769 instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 37770 _FP_MAX_NUM_PIPES : inst; 37771 37772 if (efp_tcam_pipe_buf[instance]) { 37773 soc_cm_sfree(unit, efp_tcam_pipe_buf[instance]); 37774 } 37775 if (efp_policy_pipe_buf[instance]) { 37776 soc_cm_sfree(unit, efp_policy_pipe_buf[instance]); 37777 } 37778 } 37779 if (efp_tcam_buf) { 37780 soc_cm_sfree(unit, efp_tcam_buf); 37781 } 37782 if (efp_policy_buf) { 37783 soc_cm_sfree(unit, efp_policy_buf); 37784 } 37785 if (action_bmp.w != NULL) { 37786 _FP_ACTION_BMP_FREE(action_bmp); 37787 action_bmp.w = NULL; 37788 } 37789 if (f_ent_policer_wb != NULL) { 37790 sal_free(f_ent_policer_wb); 37791 f_ent_policer_wb = NULL; 37792 } 37793 37794 if (NULL != sliceidx_bmp.w) { 37795 sal_free(sliceidx_bmp.w); 37796 sliceidx_bmp.w = NULL; 37797 } 37798 return rv; 37799 } 37800 37801 /* 37802 * Function: 37803 * _bcm_field_th_stage_lookup_reinit 37804 * 37805 * Purpose: 37806 * Reconstruct's VFP/Lookup stage groups and entries. 37807 * 37808 * Parameters: 37809 * unit - (IN) BCM device number. 37810 * fc - (IN) Device field control structure pointer. 37811 * stage_fc - (IN) FP stage control info. 37812 * 37813 * Returns: 37814 * BCM_E_XXX 37815 */ 37816 int 37817 _bcm_field_th_stage_lookup_reinit(int unit, 37818 _field_control_t *fc, 37819 _field_stage_t *stage_fc) 37820 { 37821 int vslice_idx, max, master_slice; 37822 int idx, idx1, slice_idx, index_min, index_max, ratio, rv = BCM_E_NONE; 37823 int mem_sz, parts_count, slice_ent_cnt = 0; 37824 int expanded[_FP_MAX_NUM_PIPES][4]; 37825 /* Expansion status of slices in (V/I/E)FP. */ 37826 int slice_master_idx[_FP_MAX_NUM_PIPES][4]; 37827 /* Expansion status of slices in (V/I/E)FP. */ 37828 int i, pri_tcam_idx, part_index, slice_number, prev_prio; 37829 int paired, intraslice; 37830 char *vfp_policy_buf = NULL; /* Buffer to read the VFP_POLICY table */ 37831 char *vfp_policy_pipe_buf[_FP_MAX_NUM_PIPES+1] = {NULL}; 37832 /* Buffer to read VFP_POLICY table in all pipes */ 37833 uint8 *buf = fc->scache_ptr[_FIELD_SCACHE_PART_0]; 37834 uint8 *buf1 = fc->scache_ptr[_FIELD_SCACHE_PART_1]; 37835 uint32 rval, dbl_wide_key, dbl_wide_key_sec; 37836 uint32 *vfp_tcam_buf = NULL; /* Buffer to read the VFP_TCAM table */ 37837 uint32 *vfp_tcam_pipe_buf[_FP_MAX_NUM_PIPES+1] = {NULL}; 37838 /* Buffer to read VFP_TCAM table in all pipes */ 37839 uint32 vfp_key2 = 0; 37840 uint32 temp; 37841 uint64 vfp_key_1; 37842 soc_field_t fld; 37843 vfp_tcam_entry_t *vfp_tcam_entry; 37844 vfp_policy_table_entry_t *vfp_policy_entry; 37845 _field_hw_qual_info_t hw_sels; 37846 _field_slice_t *fs; 37847 _field_group_t *fg; 37848 _field_entry_t *f_ent = NULL; 37849 bcm_pbmp_t entry_pbmp, temp_pbmp; 37850 uint8 old_physical_slice, slice_num; 37851 uint32 entry_flags; 37852 _field_slice_t *fs_temp = NULL; 37853 int inst, mem_inst, instance; /* Pipe Instance. */ 37854 uint8 valid_enable; 37855 soc_field_t vfp_en_flds[4] = {SLICE_ENABLE_SLICE_0f, 37856 SLICE_ENABLE_SLICE_1f, 37857 SLICE_ENABLE_SLICE_2f, 37858 SLICE_ENABLE_SLICE_3f}; 37859 37860 soc_reg_t vfp_control_1_reg; 37861 soc_reg_t vfp_control_2_reg; 37862 soc_reg_t vfp_slice_control_reg; 37863 soc_mem_t vfp_tcam; 37864 soc_mem_t vfp_policy_table; 37865 37866 int size; 37867 int slice_size; 37868 _field_sliceidx_bmp_t sliceidx_bmp; 37869 int slice_offset; 37870 37871 /* VALIDf in VFP_TCAM on TH2 only has one bit */ 37872 int vfp_tcam_enabled; 37873 _field_action_bmp_t action_bmp; 37874 _field_entry_wb_info_t f_ent_wb_info; 37875 sliceidx_bmp.w = NULL; 37876 slice_size = 0; 37877 slice_offset = 0; 37878 #if defined(BCM_TOMAHAWK2_SUPPORT) || defined (BCM_TOMAHAWK3_SUPPORT) 37879 if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced) || 37880 SOC_IS_TOMAHAWK3(unit)) { 37881 vfp_tcam_enabled = 1; 37882 } else 37883 #endif /* BCM_TOMAHAWK2_SUPPORT */ 37884 { 37885 vfp_tcam_enabled = 3; 37886 } 37887 37888 /* Reset Action bitmap to NULL. */ 37889 action_bmp.w = NULL; 37890 SOC_PBMP_CLEAR(entry_pbmp); 37891 sal_memset(expanded, 0, 4 * _FP_MAX_NUM_PIPES * sizeof(int)); 37892 sal_memset(slice_master_idx, 0, 4 * _FP_MAX_NUM_PIPES * sizeof(int)); 37893 37894 /* Valid entry value */ 37895 if ((soc_feature(unit, soc_feature_td3_style_fp)) || 37896 (soc_feature(unit, soc_feature_th3_style_fp))) { 37897 valid_enable = 1; 37898 } else { 37899 valid_enable = 3; 37900 } 37901 37902 if (fc->l2warm) { 37903 rv = _field_scache_stage_hdr_chk(fc, _FIELD_VFP_DATA_START); 37904 if (BCM_FAILURE(rv)) { 37905 return (rv); 37906 } 37907 37908 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_10) { 37909 bcm_field_group_oper_mode_t oper_mode; 37910 37911 /* Retrieve Stage Operational Mode. */ 37912 oper_mode = buf[fc->scache_pos]; 37913 37914 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit, 37915 "%s(): Recovering oper_mode:%d @ byte %d...\n\r"), 37916 __func__, oper_mode, fc->scache_pos)); 37917 37918 fc->scache_pos++; 37919 37920 if (stage_fc->oper_mode != oper_mode) { 37921 /* Initialize the stage with the given operational mode. */ 37922 rv = _bcm_field_th_group_oper_mode_set(unit, 37923 bcmFieldQualifyStageLookup, 37924 oper_mode); 37925 if (BCM_FAILURE(rv)) { 37926 return rv; 37927 } 37928 37929 rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_LOOKUP, 37930 &stage_fc); 37931 BCM_IF_ERROR_RETURN(rv); 37932 } 37933 } 37934 } 37935 37936 for (inst = 0; inst < stage_fc->num_instances; inst++) { 37937 if (!(fc->pipe_map & (1 << inst))) { 37938 continue; 37939 } 37940 mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 37941 _FP_GLOBAL_INST : inst; 37942 instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 37943 _FP_MAX_NUM_PIPES : inst; 37944 37945 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 37946 VFP_KEY_CONTROL_1r, 37947 mem_inst, 37948 &vfp_control_1_reg)); 37949 BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, 37950 VFP_KEY_CONTROL_2r, 37951 mem_inst, 37952 &vfp_control_2_reg)); 37953 37954 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, VFP_TCAMm, 37955 mem_inst, &vfp_tcam)); 37956 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, 37957 VFP_POLICY_TABLEm, 37958 mem_inst, 37959 &vfp_policy_table)); 37960 37961 /* DMA various tables */ 37962 vfp_tcam_buf = soc_cm_salloc(unit, sizeof(vfp_tcam_entry_t) * 37963 soc_mem_index_count(unit, vfp_tcam), 37964 "VFP TCAM buffer"); 37965 if (NULL == vfp_tcam_buf) { 37966 rv = BCM_E_MEMORY; 37967 goto cleanup; 37968 } 37969 37970 sal_memset(vfp_tcam_buf, 0, sizeof(vfp_tcam_entry_t) * 37971 soc_mem_index_count(unit, vfp_tcam)); 37972 index_min = soc_mem_index_min(unit, vfp_tcam); 37973 index_max = soc_mem_index_max(unit, vfp_tcam); 37974 37975 fs = stage_fc->slices[inst]; 37976 37977 if (stage_fc->flags & _FP_STAGE_HALF_SLICE) { 37978 slice_ent_cnt = fs->entry_count * 2; 37979 /* DMA in chunks */ 37980 for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) { 37981 fs = stage_fc->slices[inst] + slice_idx; 37982 if ((rv = soc_mem_read_range(unit, vfp_tcam, 37983 MEM_BLOCK_ALL, slice_idx * slice_ent_cnt, 37984 slice_idx * slice_ent_cnt + fs->entry_count / 2 - 1, 37985 vfp_tcam_buf + slice_idx * slice_ent_cnt * 37986 soc_mem_entry_words(unit, vfp_tcam))) < 0) { 37987 goto cleanup; 37988 } 37989 37990 if ((rv = soc_mem_read_range(unit, vfp_tcam, 37991 MEM_BLOCK_ALL, 37992 slice_idx * slice_ent_cnt + fs->entry_count, 37993 slice_idx * slice_ent_cnt + fs->entry_count + 37994 fs->entry_count / 2 - 1, vfp_tcam_buf + 37995 (slice_idx * slice_ent_cnt + fs->entry_count) 37996 * soc_mem_entry_words(unit, vfp_tcam))) < 0 ) { 37997 goto cleanup; 37998 } 37999 } 38000 } else { 38001 slice_ent_cnt = fs->entry_count; 38002 if ((rv = soc_mem_read_range(unit, vfp_tcam, MEM_BLOCK_ALL, 38003 index_min, index_max, vfp_tcam_buf)) < 0 ) { 38004 goto cleanup; 38005 } 38006 } 38007 38008 vfp_policy_buf = soc_cm_salloc(unit, 38009 SOC_MEM_TABLE_BYTES(unit, vfp_policy_table), 38010 "VFP POLICY TABLE buffer"); 38011 if (NULL == vfp_policy_buf) { 38012 rv = BCM_E_MEMORY; 38013 goto cleanup; 38014 } 38015 sal_memset(vfp_policy_buf, 0, SOC_MEM_TABLE_BYTES 38016 (unit, vfp_policy_table)); 38017 index_min = soc_mem_index_min(unit, vfp_policy_table); 38018 index_max = soc_mem_index_max(unit, vfp_policy_table); 38019 if ((rv = soc_mem_read_range(unit, vfp_policy_table, 38020 MEM_BLOCK_ALL, index_min, index_max, 38021 vfp_policy_buf)) < 0 ) { 38022 goto cleanup; 38023 } 38024 38025 vfp_tcam_pipe_buf[instance] = vfp_tcam_buf; 38026 vfp_policy_pipe_buf[instance] = vfp_policy_buf; 38027 vfp_tcam_buf = NULL; 38028 vfp_policy_buf = NULL; 38029 } 38030 38031 /* Get slice expansion status and virtual map for all the instances */ 38032 for (inst = 0; inst < stage_fc->num_instances; inst++) { 38033 if (!(fc->pipe_map & (1 << inst))) { 38034 continue; 38035 } 38036 if ((rv = _field_th_slice_expanded_status_get(unit, inst, fc, stage_fc, 38037 expanded[inst], slice_master_idx[inst])) < 0) { 38038 goto cleanup; 38039 } 38040 } 38041 38042 slice_offset = 0; 38043 if ((fc->l2warm) && 38044 ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_27)) { 38045 /* get the total slice size*/ 38046 slice_size = stage_fc->tcam_sz; 38047 size = SHR_BITALLOCSIZE(slice_size * _FP_MAX_NUM_PIPES); 38048 _FP_XGS3_ALLOC(sliceidx_bmp.w, size, "Sliceidx Bitmap"); 38049 if (NULL == sliceidx_bmp.w) { 38050 rv = BCM_E_MEMORY; 38051 goto cleanup; 38052 } 38053 sal_memcpy (sliceidx_bmp.w, &buf[fc->scache_pos], size); 38054 fc->scache_pos += size; 38055 } 38056 38057 38058 /* Iterate over the instances. */ 38059 for (inst = 0; inst < stage_fc->num_instances; inst++) { 38060 if (!(fc->pipe_map & (1 << inst))) { 38061 continue; 38062 } 38063 mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 38064 _FP_GLOBAL_INST : inst; 38065 instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 38066 _FP_MAX_NUM_PIPES : inst; 38067 slice_offset = inst * slice_size; 38068 38069 rv = _bcm_field_reg_instance_get(unit, 38070 VFP_KEY_CONTROL_1r, 38071 mem_inst, &vfp_control_1_reg); 38072 if (BCM_FAILURE(rv)) { 38073 goto cleanup; 38074 } 38075 rv = _bcm_field_reg_instance_get(unit, 38076 VFP_KEY_CONTROL_2r, 38077 mem_inst, &vfp_control_2_reg); 38078 if (BCM_FAILURE(rv)) { 38079 goto cleanup; 38080 } 38081 rv = _bcm_field_reg_instance_get(unit, 38082 VFP_SLICE_CONTROLr, 38083 mem_inst, &vfp_slice_control_reg); 38084 if (BCM_FAILURE(rv)) { 38085 goto cleanup; 38086 } 38087 rv = _bcm_field_mem_instance_get(unit, VFP_TCAMm, 38088 mem_inst, &vfp_tcam); 38089 if (BCM_FAILURE(rv)) { 38090 goto cleanup; 38091 } 38092 rv = _bcm_field_mem_instance_get(unit, 38093 VFP_POLICY_TABLEm, 38094 mem_inst, 38095 &vfp_policy_table); 38096 if (BCM_FAILURE(rv)) { 38097 goto cleanup; 38098 } 38099 38100 /* Iterate over the slices */ 38101 if ((rv = soc_reg32_get(unit, vfp_slice_control_reg, 38102 REG_PORT_ANY, 0, &rval)) < 0) { 38103 goto cleanup; 38104 } 38105 38106 if ((rv = soc_reg_get(unit, vfp_control_1_reg, REG_PORT_ANY, 38107 0, &vfp_key_1)) < 0) { 38108 goto cleanup; 38109 } 38110 /* In TD3, vfp_key_control_2 register is not avaliable. 38111 * we cannot match on Inner Ip header fields */ 38112 if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) { 38113 if ((rv = soc_reg32_get(unit, vfp_control_2_reg, REG_PORT_ANY, 38114 0, &vfp_key2)) < 0) { 38115 goto cleanup; 38116 } 38117 } 38118 for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) { 38119 /* Ignore disabled slice */ 38120 if (soc_reg_field_get(unit, vfp_slice_control_reg, 38121 rval, vfp_en_flds[slice_idx]) == 0) { 38122 continue; 38123 } 38124 /* Ignore secondary slice in paired mode */ 38125 fld = _bcm_field_trx_slice_pairing_field[slice_idx / 2]; 38126 paired = soc_reg64_field32_get(unit, vfp_control_1_reg, 38127 vfp_key_1, fld); 38128 38129 fld = vfp_slice_wide_mode_flds[slice_idx]; 38130 intraslice = soc_reg64_field32_get(unit, 38131 vfp_control_1_reg, 38132 vfp_key_1, fld); 38133 if (paired && (slice_idx % 2)) { 38134 continue; 38135 } 38136 38137 /* Don't need to read selectors for expanded slice */ 38138 if (expanded[inst][slice_idx]) { 38139 continue; 38140 } 38141 38142 /* Skip if slice has no valid groups and entries */ 38143 fs = stage_fc->slices[inst] + slice_idx; 38144 for (idx = 0; idx < slice_ent_cnt; idx++) { 38145 vfp_tcam_entry = soc_mem_table_idx_to_pointer 38146 (unit, 38147 vfp_tcam, 38148 vfp_tcam_entry_t *, 38149 vfp_tcam_pipe_buf[instance], 38150 idx + slice_ent_cnt * slice_idx); 38151 if (soc_mem_field32_get(unit, vfp_tcam, 38152 vfp_tcam_entry, VALIDf) != 0) { 38153 break; 38154 } else { 38155 if ((fc->l2warm) && 38156 ((fc->wb_recovered_version) >= 38157 BCM_FIELD_WB_VERSION_1_27) && 38158 (_FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 38159 (idx + slice_ent_cnt * slice_idx) + slice_offset))) { 38160 break; 38161 } 38162 } 38163 } 38164 if (idx == slice_ent_cnt && !fc->l2warm) { 38165 continue; 38166 } 38167 /* If Level 2, retrieve the GIDs in this slice */ 38168 if (fc->l2warm) { 38169 rv = _field_trx_scache_slice_group_recover(unit, 38170 fc, inst, 38171 slice_idx, 38172 NULL, 38173 stage_fc, 38174 0); 38175 if (BCM_FAILURE(rv) && (rv != BCM_E_NOT_FOUND)) { 38176 fc->l2warm = 0; 38177 goto cleanup; 38178 } 38179 if (rv == BCM_E_NOT_FOUND) { 38180 rv = BCM_E_NONE; 38181 continue; 38182 } 38183 } 38184 38185 /* Construct the group based on HW selector values */ 38186 _FIELD_SELCODE_CLEAR(hw_sels.pri_slice[0]); 38187 hw_sels.pri_slice[0].intraslice = _FP_SELCODE_DONT_USE; 38188 _FIELD_SELCODE_CLEAR(hw_sels.pri_slice[1]); 38189 hw_sels.pri_slice[1].intraslice = _FP_SELCODE_DONT_USE; 38190 _FIELD_SELCODE_CLEAR(hw_sels.sec_slice[0]); 38191 hw_sels.sec_slice[0].intraslice = _FP_SELCODE_DONT_USE; 38192 _FIELD_SELCODE_CLEAR(hw_sels.sec_slice[1]); 38193 hw_sels.sec_slice[1].intraslice = _FP_SELCODE_DONT_USE; 38194 38195 /* Get primary slice's selectors */ 38196 hw_sels.pri_slice[0].fpf1 = 0; 38197 hw_sels.pri_slice[0].fpf2 38198 = soc_reg64_field32_get(unit, vfp_control_1_reg, 38199 vfp_key_1, _bcm_field_trx_vfp_field_sel[slice_idx][0]); 38200 38201 hw_sels.pri_slice[0].fpf3 38202 = soc_reg64_field32_get(unit, vfp_control_1_reg, 38203 vfp_key_1, _bcm_field_trx_vfp_field_sel[slice_idx][1]); 38204 hw_sels.pri_slice[0].ip_header_sel = 0; 38205 /* In TD3, vfp_key_control_2 register is not avaliable. 38206 * we cannot match on Inner Ip header fields */ 38207 if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) { 38208 hw_sels.pri_slice[0].ip_header_sel 38209 = soc_reg_field_get(unit, vfp_control_2_reg, 38210 vfp_key2, _bcm_field_trx_vfp_ip_header_sel[slice_idx]); 38211 } 38212 /* If intraslice, get double-wide key - only 2 options */ 38213 if (intraslice) { 38214 dbl_wide_key = soc_reg64_field32_get(unit, 38215 vfp_control_1_reg, 38216 vfp_key_1, 38217 _bcm_field_trx_vfp_double_wide_sel[slice_idx]); 38218 38219 hw_sels.pri_slice[1].intraslice = TRUE; 38220 hw_sels.pri_slice[1].fpf2 = dbl_wide_key; 38221 hw_sels.pri_slice[1].fpf3 = 0; 38222 hw_sels.pri_slice[1].ip_header_sel = 0; 38223 /* In TD3, vfp_key_control_2 register is not avaliable. 38224 * we cannot match on Inner Ip header fields */ 38225 if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) { 38226 hw_sels.pri_slice[1].ip_header_sel 38227 = soc_reg_field_get(unit, vfp_control_2_reg, 38228 vfp_key2, _bcm_field_trx_vfp_ip_header_sel[slice_idx]); 38229 } 38230 } 38231 38232 /* If paired, get secondary slice's selectors */ 38233 if (paired) { 38234 hw_sels.sec_slice[0].fpf1 = 0; 38235 hw_sels.sec_slice[0].fpf2 38236 = soc_reg64_field32_get(unit, vfp_control_1_reg, 38237 vfp_key_1, _bcm_field_trx_vfp_field_sel[slice_idx + 1][0]); 38238 38239 hw_sels.sec_slice[0].fpf3 38240 = soc_reg64_field32_get(unit, vfp_control_1_reg, 38241 vfp_key_1, _bcm_field_trx_vfp_field_sel[slice_idx + 1][1]); 38242 hw_sels.sec_slice[0].ip_header_sel = 0; 38243 /* In TD3, vfp_key_control_2 register is not avaliable. 38244 * we cannot match on Inner Ip header fields */ 38245 if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) { 38246 hw_sels.sec_slice[0].ip_header_sel 38247 = soc_reg_field_get(unit, vfp_control_2_reg, 38248 vfp_key2, _bcm_field_trx_vfp_ip_header_sel[slice_idx + 1]); 38249 } 38250 /* If in intraslie double wide mode, get DW keysel value. */ 38251 if (intraslice) { 38252 dbl_wide_key_sec 38253 = soc_reg64_field32_get(unit, 38254 vfp_control_1_reg, vfp_key_1, 38255 _bcm_field_trx_vfp_double_wide_sel[slice_idx + 1]); 38256 38257 hw_sels.sec_slice[1].intraslice = TRUE; 38258 hw_sels.sec_slice[1].fpf2 = dbl_wide_key_sec; 38259 hw_sels.sec_slice[1].fpf3 = 0; 38260 hw_sels.sec_slice[1].ip_header_sel = 0; 38261 /* In TD3, vfp_key_control_2 register is not avaliable. 38262 * we cannot match on Inner Ip header fields */ 38263 if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) { 38264 hw_sels.sec_slice[1].ip_header_sel 38265 = soc_reg_field_get(unit, 38266 vfp_control_2_reg, vfp_key2, 38267 _bcm_field_trx_vfp_ip_header_sel[slice_idx + 1]); 38268 } 38269 } 38270 } 38271 38272 /* Create a group based on HW qualifiers (or find existing) */ 38273 rv = _field_tr2_group_construct(unit, inst, &hw_sels, intraslice, 38274 paired, fc, -1, _BCM_FIELD_STAGE_LOOKUP, slice_idx); 38275 38276 if (BCM_FAILURE(rv)) { 38277 goto cleanup; 38278 } 38279 /* Now go over the entries */ 38280 fs = stage_fc->slices[inst] + slice_idx; 38281 if (fs->group_flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) { 38282 fs->free_count >>= 1; 38283 ratio = 2; 38284 } else { 38285 ratio = 1; 38286 } 38287 prev_prio = -1; 38288 for (idx = 0; idx < slice_ent_cnt / ratio; idx++) { 38289 vfp_tcam_entry = soc_mem_table_idx_to_pointer 38290 (unit, vfp_tcam, 38291 vfp_tcam_entry_t *, 38292 vfp_tcam_pipe_buf[instance], 38293 idx + slice_ent_cnt * slice_idx); 38294 if (soc_mem_field32_get(unit, vfp_tcam, 38295 vfp_tcam_entry, VALIDf) == 0) { 38296 if (!(fc->l2warm)) { 38297 continue; 38298 } else { 38299 if ((fc->wb_recovered_version) < 38300 BCM_FIELD_WB_VERSION_1_27) { 38301 continue; 38302 } else if (!(_FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 38303 (idx + slice_ent_cnt * slice_idx)+slice_offset))) { 38304 continue; 38305 } 38306 } 38307 } 38308 38309 /* Search groups to find match */ 38310 fg = fc->groups; 38311 while (fg != NULL) { 38312 /* Check if group is in this slice */ 38313 fs = &fg->slices[0]; 38314 if ((fg->instance != inst) || 38315 (fg->stage_id != stage_fc->stage_id) || 38316 (fs->slice_number != slice_idx)) { 38317 fg = fg->next; 38318 continue; 38319 } 38320 break; 38321 } 38322 38323 if (fg == NULL) { 38324 rv = BCM_E_INTERNAL; 38325 goto cleanup; 38326 } 38327 38328 SOC_PBMP_CLEAR(entry_pbmp); 38329 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 38330 SOC_PBMP_ASSIGN(entry_pbmp, PBMP_PORT_ALL(unit)); 38331 SOC_PBMP_OR(entry_pbmp, PBMP_CMIC(unit)); 38332 } else { 38333 SOC_PBMP_ASSIGN(entry_pbmp, PBMP_PIPE(unit, fg->instance)); 38334 BCM_PBMP_REMOVE(entry_pbmp, PBMP_LB(unit)); 38335 } 38336 SOC_PBMP_ASSIGN(fg->pbmp, entry_pbmp); 38337 BCM_PBMP_OR(fs->pbmp, fg->pbmp); 38338 38339 /* Allocate memory for the entry */ 38340 rv = _bcm_field_entry_tcam_parts_count(unit, fg->stage_id, 38341 fg->flags, &parts_count); 38342 if (BCM_FAILURE(rv)) { 38343 goto cleanup; 38344 } 38345 38346 mem_sz = parts_count * sizeof (_field_entry_t); 38347 _FP_XGS3_ALLOC(f_ent, mem_sz, "field entry"); 38348 if (f_ent == NULL) { 38349 rv = BCM_E_MEMORY; 38350 goto cleanup; 38351 } 38352 for (idx1 = 0; idx1 < _FP_POLICER_LEVEL_COUNT; idx1++) { 38353 f_ent->policer[idx1].pid = _FP_INVALID_INDEX; 38354 } 38355 38356 38357 sal_memset(&f_ent_wb_info, 0, sizeof(_field_entry_wb_info_t)); 38358 f_ent_wb_info.action_bmp = &action_bmp; 38359 f_ent_wb_info.sid = f_ent_wb_info.pid = -1; 38360 if (fc->l2warm) { 38361 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) { 38362 action_bmp.w = NULL; 38363 _FP_XGS3_ALLOC(action_bmp.w, 38364 SHR_BITALLOCSIZE(_bcmFieldActionNoParamCount), 38365 "Action No Param Bitmap"); 38366 if (action_bmp.w == NULL) { 38367 rv = BCM_E_MEMORY; 38368 sal_free(f_ent); 38369 goto cleanup; 38370 } 38371 } 38372 rv = _field_trx_entry_info_retrieve(unit, fc, stage_fc, 38373 0, &prev_prio, 38374 &f_ent_wb_info); 38375 if (BCM_FAILURE(rv)) { 38376 sal_free(f_ent); 38377 goto cleanup; 38378 } 38379 } else { 38380 _bcm_field_last_alloc_eid_incr(unit); 38381 } 38382 38383 pri_tcam_idx = idx + slice_ent_cnt * slice_idx; 38384 for (i = 0; i < parts_count; i++) { 38385 if (fc->l2warm) { 38386 /* Use retrieved EID */ 38387 f_ent[i].eid = f_ent_wb_info.eid; 38388 /* Set retrieved dvp_type and svp_type */ 38389 f_ent[i].dvp_type = f_ent_wb_info.dvp_type[i]; 38390 f_ent[i].svp_type = f_ent_wb_info.svp_type[i]; 38391 f_ent[i].prio = f_ent_wb_info.prio; 38392 } else { 38393 f_ent[i].eid = _bcm_field_last_alloc_eid_get(unit); 38394 } 38395 f_ent[i].group = fg; 38396 38397 rv = _bcm_field_tcam_part_to_entry_flags 38398 (unit, i, fg, &f_ent[i].flags); 38399 if (BCM_FAILURE(rv)) { 38400 sal_free(f_ent); 38401 goto cleanup; 38402 } 38403 38404 if (f_ent_wb_info.color_independent) { 38405 f_ent[i].flags |= _FP_ENTRY_COLOR_INDEPENDENT; 38406 } 38407 rv = _bcm_field_entry_part_tcam_idx_get 38408 (unit, f_ent, pri_tcam_idx, i, &part_index); 38409 if (BCM_FAILURE(rv)) { 38410 sal_free(f_ent); 38411 goto cleanup; 38412 } 38413 rv = _bcm_field_tcam_idx_to_slice_offset(unit, stage_fc, 38414 inst, part_index, &slice_number, 38415 (int *)&f_ent[i].slice_idx); 38416 if (BCM_FAILURE(rv)) { 38417 sal_free(f_ent); 38418 goto cleanup; 38419 } 38420 f_ent[i].fs = stage_fc->slices[inst] + slice_number; 38421 if (0 == (f_ent[i].flags & _FP_ENTRY_SECOND_HALF)) { 38422 /* Decrement slice free entry count for primary 38423 entries. */ 38424 f_ent[i].fs->free_count--; 38425 } 38426 38427 f_ent[i].fs->hw_ent_count++; 38428 38429 /* Assign entry to a slice */ 38430 f_ent[i].fs->entries[f_ent[i].slice_idx] = f_ent + i; 38431 BCM_PBMP_OR(f_ent[i].fs->pbmp, fg->pbmp); 38432 f_ent[i].flags |= _FP_ENTRY_INSTALLED; 38433 38434 if (soc_mem_field32_get(unit, vfp_tcam, 38435 vfp_tcam_entry, VALIDf) == valid_enable) { 38436 f_ent[i].flags |= _FP_ENTRY_ENABLED; 38437 } else { 38438 if ((fc->l2warm) && (i != 0) && 38439 ((fc->wb_recovered_version) >= 38440 BCM_FIELD_WB_VERSION_1_27) && 38441 ( _FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 38442 pri_tcam_idx + slice_offset) )) { 38443 38444 f_ent[i].flags |= _FP_ENTRY_ENABLED; 38445 } 38446 } 38447 38448 /* Get the actions associated with this part of the entry */ 38449 vfp_policy_entry = soc_mem_table_idx_to_pointer 38450 (unit, 38451 vfp_policy_table, 38452 vfp_policy_table_entry_t *, 38453 vfp_policy_pipe_buf[instance], 38454 part_index); 38455 rv = _field_tr2_actions_recover 38456 (unit, 38457 vfp_policy_table, 38458 (uint32 *) vfp_policy_entry, 38459 f_ent, i, &f_ent_wb_info); 38460 if (BCM_FAILURE(rv)) { 38461 sal_free(f_ent); 38462 goto cleanup; 38463 } 38464 if (action_bmp.w != NULL) { 38465 _FP_ACTION_BMP_FREE(action_bmp); 38466 action_bmp.w = NULL; 38467 } 38468 38469 if (soc_feature(unit, soc_feature_advanced_flex_counter)) { 38470 _field_adv_flex_stat_info_retrieve(unit, 38471 f_ent->statistic.sid); 38472 } 38473 } 38474 rv = _field_group_entry_add(unit, fg, f_ent); 38475 if (BCM_FAILURE(rv)) { 38476 sal_free(f_ent); 38477 goto cleanup; 38478 } 38479 f_ent = NULL; 38480 } 38481 /* Free up the temporary slice group info */ 38482 if (fc->l2warm) { 38483 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_18) { 38484 /* update selcode and construct group qual offset */ 38485 rv = _field_tr2_group_construct_quals_with_sel_update(unit, fc, stage_fc); 38486 if (BCM_FAILURE(rv)) { 38487 goto cleanup; 38488 } 38489 } 38490 _field_scache_slice_group_free(unit, fc, slice_idx); 38491 } 38492 } 38493 } 38494 38495 /* Iterate over the instances. */ 38496 for (inst = 0; inst < stage_fc->num_instances; inst++) { 38497 if (!(fc->pipe_map & (1 << inst))) { 38498 continue; 38499 } 38500 mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 38501 _FP_GLOBAL_INST : inst; 38502 instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 38503 _FP_MAX_NUM_PIPES : inst; 38504 slice_offset = inst * slice_size; 38505 38506 rv = _bcm_field_reg_instance_get(unit, 38507 VFP_KEY_CONTROL_1r, 38508 mem_inst, 38509 &vfp_control_1_reg); 38510 if (BCM_FAILURE(rv)) { 38511 goto cleanup; 38512 } 38513 rv = _bcm_field_reg_instance_get(unit, 38514 VFP_KEY_CONTROL_2r, 38515 mem_inst, 38516 &vfp_control_2_reg); 38517 if (BCM_FAILURE(rv)) { 38518 goto cleanup; 38519 } 38520 rv = _bcm_field_mem_instance_get(unit, VFP_TCAMm, 38521 mem_inst, &vfp_tcam); 38522 if (BCM_FAILURE(rv)) { 38523 goto cleanup; 38524 } 38525 rv = _bcm_field_mem_instance_get(unit, 38526 VFP_POLICY_TABLEm, 38527 mem_inst, 38528 &vfp_policy_table); 38529 if (BCM_FAILURE(rv)) { 38530 goto cleanup; 38531 } 38532 38533 /* Now go over the expanded slices */ 38534 for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) { 38535 if (!expanded[inst][slice_idx]) { 38536 continue; 38537 } 38538 /* Ignore secondary slice in paired mode */ 38539 fld = _bcm_field_trx_slice_pairing_field[slice_idx / 2]; 38540 paired = soc_reg64_field32_get 38541 (unit, vfp_control_1_reg, 38542 vfp_key_1, fld); 38543 if (paired && (slice_idx % 2)) { 38544 continue; 38545 } 38546 /* Skip if slice has no valid groups and entries */ 38547 fs = stage_fc->slices[inst] + slice_idx; 38548 for (idx = 0; idx < slice_ent_cnt; idx++) { 38549 vfp_tcam_entry = soc_mem_table_idx_to_pointer 38550 (unit, vfp_tcam, 38551 vfp_tcam_entry_t *, 38552 vfp_tcam_pipe_buf[instance], 38553 idx + slice_ent_cnt * slice_idx); 38554 if (soc_mem_field32_get(unit, vfp_tcam, 38555 vfp_tcam_entry, VALIDf) != 0) { 38556 break; 38557 } else { 38558 if ((fc->l2warm) && 38559 ((fc->wb_recovered_version) >= 38560 BCM_FIELD_WB_VERSION_1_27) && 38561 (_FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 38562 (idx + slice_ent_cnt * slice_idx) + slice_offset))) { 38563 break; 38564 } 38565 } 38566 } 38567 38568 if (idx == slice_ent_cnt) { 38569 continue; 38570 } 38571 38572 /* If Level 2, retrieve the GIDs in this slice */ 38573 if (fc->l2warm) { 38574 rv = _field_trx_scache_slice_group_recover 38575 (unit, 38576 fc, inst, 38577 slice_idx, 38578 NULL, 38579 stage_fc, 38580 0); 38581 if (BCM_FAILURE(rv) && (rv != BCM_E_NOT_FOUND)) { 38582 fc->l2warm = 0; 38583 goto cleanup; 38584 } 38585 if (rv == BCM_E_NOT_FOUND) { 38586 rv = BCM_E_NONE; 38587 continue; 38588 } 38589 } 38590 38591 /* Now find the master slice for this virtual group */ 38592 vslice_idx = _field_physical_to_virtual(unit, inst, 38593 slice_idx, stage_fc); 38594 if (vslice_idx < 0) { 38595 rv = BCM_E_INTERNAL; 38596 goto cleanup; 38597 } 38598 38599 if (fc->l2warm 38600 && ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_8)) { 38601 master_slice = slice_master_idx[inst][slice_idx]; 38602 } else { 38603 max = -1; 38604 for (i = 0; i < stage_fc->tcam_slices; i++) { 38605 if ((stage_fc->vmap[inst][0][vslice_idx].virtual_group == 38606 stage_fc->vmap[inst][0][i].virtual_group) && 38607 (i != vslice_idx)) { 38608 if (i > max) { 38609 max = i; 38610 } 38611 } 38612 } 38613 if (max < 0) { 38614 rv = BCM_E_INTERNAL; 38615 goto cleanup; 38616 } 38617 38618 master_slice = stage_fc->vmap[inst][0][max].vmap_key; 38619 } 38620 /* See which group is in this slice - can be only one */ 38621 fg = fc->groups; 38622 while (fg != NULL) { 38623 /* Check if group is in this slice */ 38624 fs = &fg->slices[0]; 38625 if ((fg->instance == inst) && 38626 (fg->stage_id == stage_fc->stage_id) && 38627 (fs->slice_number == master_slice)) { 38628 break; 38629 } 38630 fg = fg->next; 38631 } 38632 if (fg == NULL) { 38633 rv = BCM_E_INTERNAL; 38634 goto cleanup; 38635 } 38636 38637 /* Get number of entry parts for the group. */ 38638 rv = _bcm_field_entry_tcam_parts_count (unit, fg->stage_id, 38639 fg->flags, &parts_count); 38640 if (BCM_FAILURE(rv)) { 38641 goto cleanup; 38642 } 38643 38644 old_physical_slice = fs->slice_number; 38645 38646 /* Set up the new physical slice parameters in Software */ 38647 for(part_index = parts_count - 1; part_index >= 0; part_index--) { 38648 /* Get entry flags. */ 38649 rv = _bcm_field_tcam_part_to_entry_flags(unit, part_index, fg, 38650 &entry_flags); 38651 if (BCM_FAILURE(rv)) { 38652 goto cleanup; 38653 } 38654 38655 /* Get slice id for entry part */ 38656 rv = _bcm_field_tcam_part_to_slice_number(unit, part_index, 38657 fg, &slice_num); 38658 if (BCM_FAILURE(rv)) { 38659 goto cleanup; 38660 } 38661 38662 /* Get slice pointer. */ 38663 fs = stage_fc->slices[inst] + slice_idx + slice_num; 38664 38665 if (0 == (entry_flags & _FP_ENTRY_SECOND_HALF)) { 38666 /* Set per slice configuration & number of 38667 * free entries in the slice.*/ 38668 fs->free_count = fs->entry_count; 38669 if (fg->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) { 38670 fs->free_count >>= 1; 38671 } 38672 /* Set group flags in in slice.*/ 38673 fs->group_flags = fg->flags & _FP_GROUP_STATUS_MASK; 38674 38675 /* Add slice to slices linked list . */ 38676 fs_temp = stage_fc->slices[inst] + 38677 old_physical_slice + slice_num; 38678 /* To handle more than one auto expanded slice in a group */ 38679 while (fs_temp->next != NULL) { 38680 fs_temp = fs_temp->next; 38681 } 38682 fs_temp->next = fs; 38683 fs->prev = fs_temp; 38684 } 38685 } 38686 38687 /* Now go over the entries */ 38688 fs = stage_fc->slices[inst] + slice_idx; 38689 fs->group_flags = fg->flags & _FP_GROUP_STATUS_MASK; 38690 if (fs->group_flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) { 38691 ratio = 2; 38692 } else { 38693 ratio = 1; 38694 } 38695 38696 prev_prio = -1; 38697 for (idx = 0; idx < slice_ent_cnt / ratio; idx++) { 38698 vfp_tcam_entry = soc_mem_table_idx_to_pointer 38699 (unit, 38700 vfp_tcam, 38701 vfp_tcam_entry_t *, 38702 vfp_tcam_pipe_buf[instance], 38703 idx + slice_ent_cnt * slice_idx); 38704 if (soc_mem_field32_get(unit, vfp_tcam, 38705 vfp_tcam_entry, VALIDf) == 0) { 38706 if (!(fc->l2warm)) { 38707 continue; 38708 } else { 38709 if ((fc->wb_recovered_version) < 38710 BCM_FIELD_WB_VERSION_1_27){ 38711 continue; 38712 } else if (!(_FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 38713 (idx + slice_ent_cnt * slice_idx)+slice_offset))) { 38714 continue; 38715 } 38716 } 38717 } 38718 38719 /* All ports are applicable to this entry */ 38720 SOC_PBMP_CLEAR(entry_pbmp); 38721 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) { 38722 SOC_PBMP_ASSIGN(entry_pbmp, PBMP_PORT_ALL(unit)); 38723 SOC_PBMP_OR(entry_pbmp, PBMP_CMIC(unit)); 38724 } else { 38725 SOC_PBMP_ASSIGN(entry_pbmp, PBMP_PIPE(unit, fg->instance)); 38726 BCM_PBMP_REMOVE(entry_pbmp, PBMP_LB(unit)); 38727 } 38728 38729 38730 /* Search groups to find match */ 38731 fg = fc->groups; 38732 while (fg != NULL) { 38733 /* Check if group is in this slice */ 38734 fs = &fg->slices[0]; 38735 if ((fg->instance != inst) || 38736 (fg->stage_id != stage_fc->stage_id) || 38737 (fs->slice_number != master_slice)) { 38738 fg = fg->next; 38739 continue; 38740 } 38741 38742 /* Check if entry_pbmp is a subset of group pbmp */ 38743 SOC_PBMP_ASSIGN(temp_pbmp, fg->pbmp); 38744 SOC_PBMP_AND(temp_pbmp, entry_pbmp); 38745 if (SOC_PBMP_EQ(temp_pbmp, entry_pbmp)) { 38746 break; 38747 } 38748 fg = fg->next; 38749 } 38750 38751 if (fg == NULL) { 38752 goto cleanup; 38753 } 38754 38755 /* Allocate memory for the entry */ 38756 rv = _bcm_field_entry_tcam_parts_count(unit,fg->stage_id, 38757 fg->flags, &parts_count); 38758 if (BCM_FAILURE(rv)) { 38759 goto cleanup; 38760 } 38761 mem_sz = parts_count * sizeof (_field_entry_t); 38762 _FP_XGS3_ALLOC(f_ent, mem_sz, "field entry"); 38763 if (f_ent == NULL) { 38764 rv = BCM_E_MEMORY; 38765 goto cleanup; 38766 } 38767 38768 for (idx1 = 0; idx1 < _FP_POLICER_LEVEL_COUNT; idx1++) { 38769 f_ent->policer[idx1].pid = _FP_INVALID_INDEX; 38770 } 38771 38772 sal_memset(&f_ent_wb_info, 0, sizeof(_field_entry_wb_info_t)); 38773 f_ent_wb_info.action_bmp = &action_bmp; 38774 f_ent_wb_info.sid = f_ent_wb_info.pid = -1; 38775 if (fc->l2warm) { 38776 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) { 38777 action_bmp.w = NULL; 38778 _FP_XGS3_ALLOC(action_bmp.w, 38779 SHR_BITALLOCSIZE(_bcmFieldActionNoParamCount), 38780 "Action No Param Bitmap"); 38781 if (action_bmp.w == NULL) { 38782 rv = BCM_E_MEMORY; 38783 sal_free(f_ent); 38784 goto cleanup; 38785 } 38786 } 38787 rv = _field_trx_entry_info_retrieve 38788 (unit, fc, stage_fc, 0, &prev_prio, 38789 &f_ent_wb_info); 38790 if (BCM_FAILURE(rv)) { 38791 sal_free(f_ent); 38792 goto cleanup; 38793 } 38794 } else { 38795 _bcm_field_last_alloc_eid_incr(unit); 38796 } 38797 pri_tcam_idx = idx + slice_ent_cnt * slice_idx; 38798 for (i = 0; i < parts_count; i++) { 38799 if (fc->l2warm) { 38800 /* Use retrieved EID */ 38801 f_ent[i].eid = f_ent_wb_info.eid; 38802 /* Set retrieved dvp_type and svp_type */ 38803 f_ent[i].dvp_type = f_ent_wb_info.dvp_type[i]; 38804 f_ent[i].svp_type = f_ent_wb_info.svp_type[i]; 38805 f_ent[i].prio = f_ent_wb_info.prio; 38806 } else { 38807 f_ent[i].eid = _bcm_field_last_alloc_eid_get(unit); 38808 } 38809 f_ent[i].group = fg; 38810 38811 rv = _bcm_field_tcam_part_to_entry_flags(unit, i, fg, 38812 &f_ent[i].flags); 38813 if (BCM_FAILURE(rv)) { 38814 sal_free(f_ent); 38815 goto cleanup; 38816 } 38817 38818 if (f_ent_wb_info.color_independent) { 38819 f_ent[i].flags |= _FP_ENTRY_COLOR_INDEPENDENT; 38820 } 38821 rv = _bcm_field_entry_part_tcam_idx_get(unit, f_ent, 38822 pri_tcam_idx, i, &part_index); 38823 if (BCM_FAILURE(rv)) { 38824 sal_free(f_ent); 38825 goto cleanup; 38826 } 38827 rv = _bcm_field_tcam_idx_to_slice_offset(unit, stage_fc, 38828 inst, part_index, &slice_number, 38829 (int *)&f_ent[i].slice_idx); 38830 if (BCM_FAILURE(rv)) { 38831 sal_free(f_ent); 38832 goto cleanup; 38833 } 38834 f_ent[i].fs = stage_fc->slices[inst] + slice_number; 38835 if (0 == (f_ent[i].flags & _FP_ENTRY_SECOND_HALF)) { 38836 /* Decrement slice free entry count for primary 38837 entries. */ 38838 f_ent[i].fs->free_count--; 38839 } 38840 38841 f_ent[i].fs->hw_ent_count++; 38842 38843 /* Assign entry to a slice */ 38844 f_ent[i].fs->entries[f_ent[i].slice_idx] = f_ent + i; 38845 BCM_PBMP_OR(f_ent[i].fs->pbmp, fg->pbmp); 38846 f_ent[i].flags |= _FP_ENTRY_INSTALLED; 38847 38848 if (soc_mem_field32_get(unit, vfp_tcam, 38849 vfp_tcam_entry, VALIDf) == vfp_tcam_enabled) { 38850 f_ent[i].flags |= _FP_ENTRY_ENABLED; 38851 } else { 38852 if ((fc->l2warm) && (i != 0) && 38853 ((fc->wb_recovered_version) >= 38854 BCM_FIELD_WB_VERSION_1_27) && 38855 ( _FP_SLICEIDX_BMP_TEST(sliceidx_bmp, 38856 pri_tcam_idx + slice_offset) )) { 38857 f_ent[i].flags |= _FP_ENTRY_ENABLED; 38858 } 38859 } 38860 38861 /* Get the actions associated with this part of the entry */ 38862 vfp_policy_entry = soc_mem_table_idx_to_pointer 38863 (unit, 38864 vfp_policy_table, 38865 vfp_policy_table_entry_t *, 38866 vfp_policy_pipe_buf[instance], 38867 part_index); 38868 rv = _field_tr2_actions_recover(unit, 38869 vfp_policy_table, 38870 (uint32 *) vfp_policy_entry, f_ent, 38871 i, &f_ent_wb_info); 38872 if (BCM_FAILURE(rv)) { 38873 sal_free(f_ent); 38874 goto cleanup; 38875 } 38876 if (action_bmp.w != NULL) { 38877 _FP_ACTION_BMP_FREE(action_bmp); 38878 action_bmp.w = NULL; 38879 } 38880 38881 if (soc_feature(unit, soc_feature_advanced_flex_counter)) { 38882 _field_adv_flex_stat_info_retrieve(unit, 38883 f_ent->statistic.sid); 38884 } 38885 } 38886 rv = _field_group_entry_add(unit, fg, f_ent); 38887 if (BCM_FAILURE(rv)) { 38888 sal_free(f_ent); 38889 goto cleanup; 38890 } 38891 f_ent = NULL; 38892 } 38893 /* Free up the temporary slice group info */ 38894 if (fc->l2warm) { 38895 _field_scache_slice_group_free(unit, fc, slice_idx); 38896 } 38897 } 38898 } 38899 38900 38901 if (fc->l2warm) { 38902 38903 /* Mark end of Slice Info */ 38904 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) { 38905 fc->scache_pos++; 38906 } 38907 38908 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) { 38909 if (stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP) { 38910 LOG_DEBUG(BSL_LS_BCM_FP, 38911 (BSL_META_U(unit,"Recovering hint Ids " 38912 "from pos = %d\r\n"), fc->scache_pos)); 38913 rv = _bcm_hints_scache_hintid_recover(unit, stage_fc, 38914 fc, &buf[fc->scache_pos]); 38915 if (BCM_FAILURE(rv)) { 38916 goto cleanup; 38917 } 38918 } 38919 } 38920 38921 /* Group Slice Selectors */ 38922 if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) { 38923 rv = (_field_group_slice_selectors_recover(unit, 38924 &buf[fc->scache_pos], stage_fc->stage_id)); 38925 if (BCM_FAILURE(rv)) { 38926 goto cleanup; 38927 } 38928 } 38929 38930 temp = 0; 38931 temp |= buf[fc->scache_pos]; 38932 fc->scache_pos++; 38933 temp |= buf[fc->scache_pos] << 8; 38934 fc->scache_pos++; 38935 temp |= buf[fc->scache_pos] << 16; 38936 fc->scache_pos++; 38937 temp |= buf[fc->scache_pos] << 24; 38938 fc->scache_pos++; 38939 if (temp != _FIELD_VFP_DATA_END) { 38940 fc->l2warm = 0; 38941 rv = BCM_E_INTERNAL; 38942 } 38943 38944 if (NULL != buf1) { 38945 temp = 0; 38946 temp |= buf1[fc->scache_pos1]; 38947 fc->scache_pos1++; 38948 temp |= buf1[fc->scache_pos1] << 8; 38949 fc->scache_pos1++; 38950 temp |= buf1[fc->scache_pos1] << 16; 38951 fc->scache_pos1++; 38952 temp |= buf1[fc->scache_pos1] << 24; 38953 fc->scache_pos1++; 38954 if (temp != _FIELD_VFP_DATA_END) { 38955 fc->l2warm = 0; 38956 rv = BCM_E_INTERNAL; 38957 } 38958 } 38959 } 38960 38961 if (BCM_SUCCESS(rv)) { 38962 _field_group_slice_vmap_recovery(unit, fc, stage_fc); 38963 } 38964 38965 _field_tr2_stage_reinit_all_groups_cleanup(unit, fc, 38966 _BCM_FIELD_STAGE_LOOKUP, NULL); 38967 38968 cleanup: 38969 for (inst = 0; inst < stage_fc->num_instances; inst++) { 38970 if (!(fc->pipe_map & (1 << inst))) { 38971 38972 continue; 38973 } 38974 instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ? 38975 _FP_MAX_NUM_PIPES : inst; 38976 38977 if (vfp_tcam_pipe_buf[instance]) { 38978 soc_cm_sfree(unit, vfp_tcam_pipe_buf[instance]); 38979 } 38980 if (vfp_policy_pipe_buf[instance]) { 38981 soc_cm_sfree(unit, vfp_policy_pipe_buf[instance]); 38982 } 38983 } 38984 if (vfp_tcam_buf) { 38985 soc_cm_sfree(unit, vfp_tcam_buf); 38986 } 38987 if (vfp_policy_buf) { 38988 soc_cm_sfree(unit, vfp_policy_buf); 38989 } 38990 if (action_bmp.w != NULL) { 38991 _FP_ACTION_BMP_FREE(action_bmp); 38992 action_bmp.w = NULL; 38993 } 38994 if (NULL != sliceidx_bmp.w) { 38995 sal_free(sliceidx_bmp.w); 38996 sliceidx_bmp.w = NULL; 38997 } 38998 return rv; 38999 39000 } 39001 39002 39003 /* END OF WARMBOOT ROUTINES */ 39004 #endif /* BCM_WARM_BOOT_SUPPORT */ 39005 39006 #else /* BCM_TOMAHAWK_SUPPORT && BCM_FIELD_SUPPORT */ 39007 int _th_field_not_empty; 39008 #endif /* BCM_TOMAHAWK_SUPPORT && BCM_FIELD_SUPPORT */