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 (364918B)


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