openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

field.h (372801B)


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