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

flex_ctr.h (92062B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2020 Broadcom Inc. All rights reserved.
      6  *
      7  * File:        flex_ctr.h
      8  * Purpose:     Contains all internal function and structure required for
      9  *              flex counter.
     10  */
     11 
     12 #ifndef __BCM_FLEX_CTR_H__
     13 #define __BCM_FLEX_CTR_H__
     14 
     15 #include <sal/core/libc.h>
     16 #include <soc/mem.h>
     17 #include <soc/debug.h>
     18 #include <soc/drv.h>
     19 #include <soc/l2x.h>
     20 #include <bcm/l2.h>
     21 #include <bcm/error.h>
     22 #include <bcm_int/esw/mbcm.h>
     23 #include <bcm_int/esw/l2.h>
     24 #include <bcm_int/esw/vlan.h>
     25 #include <bcm_int/esw/trunk.h>
     26 #include <bcm_int/esw/stack.h>
     27 #include <bcm_int/esw/mpls.h>
     28 #include <bcm_int/esw/mim.h>
     29 #include <bcm_int/esw_dispatch.h>
     30 #include <bcm_int/esw/trident.h>
     31 #include <soc/firebolt6.h>
     32 #include <bcm_int/esw/stat.h>
     33 
     34 /*
     35  ADDITIONAL INFO
     36  Packet attributes are of three types
     37  1) Packet Attributes                i.e. uncompressed mode
     38  2) UDF attributes                   i.e. udf mode
     39  3) Compressed Packet Attributes     i.e. compressed mode
     40 */
     41 
     42 typedef enum bcm_stat_flex_packet_attr_type_e {
     43     bcmStatFlexPacketAttrTypeUncompressed=0,
     44     bcmStatFlexPacketAttrTypeCompressed=1,
     45     bcmStatFlexPacketAttrTypeUdf=2
     46 }bcm_stat_flex_packet_attr_type_t;
     47 
     48 /*
     49  ========================================================================
     50  Total 12 packets attributes are supported in ingress packet flow direction
     51  This includes
     52 
     53  1) cng             (2b: Pre FP packet color)
     54  2) IFP_CNG         (2b: Post FP packet color)
     55  3) INT_PRI         (4b: Packet internal priority)
     56 
     57  ######################################################################
     58  ****** In compressed mode, attributes(cng,IFP_CNG,INT_PRI) are
     59  ****** grouped into PRI_CNG_MAP map table.
     60  ######################################################################
     61 
     62  4) VLAN_FORMAT     (2b:Incoming PacketInner&Outer Vlan tag present indicators)
     63  5) OUTER_DOT1P     (3b: Incoming packet outer vlan tag priority.)
     64  6) INNER_DOT1P     (3b: Incoming packet inner vlan tag priority.)
     65  ######################################################################
     66  ****** In compressed mode, attributes(VLAN_FORMAT,OUTER_DOT1P,INNER_DOT1P) are
     67  ****** grouped into PKT_PRI_MAP map table
     68  ######################################################################
     69 
     70  7) INGRESS_PORT    (6b: Packet local ingress port.)
     71  ######################################################################
     72  ****** In compressed mode, attributes(INGRESS_PORT) are
     73  ****** grouped into PORT_MAP map table
     74  ######################################################################
     75 
     76  8) TOS             (8b: Incoming IP packet TOS byte.)
     77  ######################################################################
     78  ****** In compressed mode, attributes(TOS) are
     79  ****** grouped into TOS_MAP map table
     80  ######################################################################
     81 
     82  9) PACKET_RESOLUTION(6b: IFP packet resolution vector.)
     83  10)SVP_TYPE         (1b:SVP(SourceVirtualPortNumber)is network port indication)
     84  11)DROP             (1b: Drop indication.)
     85  ######################################################################
     86  ****** In compressed mode, attributes(PACKET_RESOLUTION,SVP_TYPE,DROP) are
     87  ****** grouped into PKT_RES_MAP map table
     88  ######################################################################
     89 
     90  12)IP Packet         (1b: Packet is IP.)
     91  Total 12 Packet attributes with 39 bits
     92  ========================================================================
     93 */
     94 
     95 typedef struct bcm_stat_flex_ing_pkt_attr_bits_s {
     96     /* 2 bits for Flow control packet type */
     97     uint8 fc_type;
     98     uint8 fc_type_pos;
     99     uint8 fc_type_mask;
    100 
    101     /* Addition of TCP Flags and Internal Congestion selectors
    102      * Total additional Bits : 8 + 2
    103      *                       : 10 bits
    104      */
    105     uint8 int_cn;
    106     uint8 int_cn_pos;
    107     uint8 int_cn_mask;
    108 
    109     uint8 tcp_flags;
    110     uint8 tcp_flags_pos;
    111     uint8 tcp_flags_mask;
    112 
    113     /*
    114     Below are default bits for uncompressed format.
    115     Need to be set for compressed format
    116     Total Bits :(2+2+4)+(2+3+3)+(6)+(8)+(6+1+1) + (1)
    117                : 8     + 8     + 6 + 8 + 8      + 1
    118                : 39 bits
    119     */
    120     /*
    121      * APACHE has Extended Flex Counter Packet Attributes
    122      * Total Bits : (4+4+4+4+4+4) + Existing as above
    123      *            : 24 + 39
    124      *            : 63 bits
    125      */
    126     uint8   cng_3;                /* 2 for uncompressed frmt   */
    127     uint8   cng_3_pos;
    128     uint8   cng_3_mask;
    129 
    130     uint8   phb_3;                /* 4 for uncompressed frmt   */
    131     uint8   phb_3_pos;
    132     uint8   phb_3_mask;
    133 
    134     uint8   cng_2;                /* 2 for uncompressed frmt   */
    135     uint8   cng_2_pos;
    136     uint8   cng_2_mask;
    137 
    138     uint8   phb_2;                /* 4 for uncompressed frmt   */
    139     uint8   phb_2_pos;
    140     uint8   phb_2_mask;
    141 
    142     uint8   cng_1;                /* 2 for uncompressed frmt   */
    143     uint8   cng_1_pos;
    144     uint8   cng_1_mask;
    145 
    146     uint8   phb_1;                /* 4 for uncompressed frmt   */
    147     uint8   phb_1_pos;
    148     uint8   phb_1_mask;
    149     /* PRI_CNF Group for compressed format */
    150     uint8   cng;                  /* 2 for uncompressed frmt   */
    151     uint8   cng_pos;
    152     uint8   cng_mask;
    153 
    154     uint8   ifp_cng;              /* 2 for uncompressed format */
    155     uint8   ifp_cng_pos;
    156     uint8   ifp_cng_mask;
    157 
    158     uint8   int_pri;              /* 4 for uncompressed format */
    159     uint8   int_pri_pos;
    160     uint8   int_pri_mask;
    161 
    162     /* PKT_PRI vlan Group for compressed format */
    163     uint8   vlan_format;          /* 2 for uncompressed format */
    164     uint8   vlan_format_pos;
    165     uint8   vlan_format_mask;
    166     uint8   outer_dot1p;          /* 3 for uncompressed format */
    167     uint8   outer_dot1p_pos;
    168     uint8   outer_dot1p_mask;
    169     uint8   inner_dot1p;          /* 3 for uncompressed format */
    170     uint8   inner_dot1p_pos;
    171     uint8   inner_dot1p_mask;
    172 
    173     /* Port Group for compressed format */
    174     uint8   ing_port;             /* 6 for uncompressed format */
    175     uint8   ing_port_pos;
    176     uint8   ing_port_mask;
    177 
    178     /* TOS Group for compressed format  */
    179     uint8   tos_dscp;                  /* 8 for uncompressed format */
    180     uint8   tos_dscp_pos;
    181     uint8   tos_dscp_mask;
    182     uint8   tos_ecn;                  /* 8 for uncompressed format */
    183     uint8   tos_ecn_pos;
    184     uint8   tos_ecn_mask;
    185     /* PKT_RESOLTION Group for compressed format */
    186     uint8   pkt_resolution;       /* 6 for uncompressed format */
    187     uint8   pkt_resolution_pos;
    188     uint8   pkt_resolution_mask;
    189 
    190     uint8   svp_type;             /* 1 for uncompressed format */
    191     uint8   svp_type_pos;
    192     uint8   svp_type_mask;
    193 
    194     uint8   drop;                 /* 1 for uncompressed format */
    195     uint8   drop_pos;
    196     uint8   drop_mask;
    197 
    198     uint8   ip_pkt;               /* 1 for uncompressed format */
    199     uint8    ip_pkt_pos;
    200     uint8    ip_pkt_mask;
    201 }bcm_stat_flex_ing_pkt_attr_bits_t;
    202 
    203 
    204 /*
    205  ========================================================================
    206  Total 12 packets attributes are supported in egress packet flow direction
    207  This includes
    208 
    209  1) cng            (2b: Post FP packet color)
    210  2) INT_PRI        (4b: Packet internal priority)
    211  ######################################################################
    212  ****** In compressed mode, attributes(cng,INT_PRI) are
    213  ****** grouped into PRI_CNG_MAP map table.
    214  ######################################################################
    215 
    216  3) VLAN_FORMAT    (2b: OutgoingPacketInner&Outer Vlan tag present indicators.)
    217  4) OUTER_DOT1P    (3b: Incoming packet outer vlan tag priority.)
    218  5) INNER_DOT1P    (3b: Incoming packet inner vlan tag priority.)
    219  ######################################################################
    220  ****** In compressed mode, attributes(VLAN_FORMAT,OUTER_DOT1P,INNER_DOT1P) are
    221  ****** grouped into PKT_PRI_MAP map table
    222  ######################################################################
    223 
    224  6) EGRESS_PORT     (6b: Packet local egress port.)
    225  ######################################################################
    226  ****** In compressed mode, attributes(EGRESS_PORT) are
    227  ****** grouped into PORT_MAP map table
    228  ######################################################################
    229 
    230  7) TOS             (8b: Outgoing IP packet TOS byte.)
    231  ######################################################################
    232  ****** In compressed mode, attributes(TOS) are
    233  ****** grouped into TOS_MAP map table
    234  ######################################################################
    235 
    236  8) PACKET_RESOLUTION(1b: IFP packet resolution vector.)
    237  9)SVP_TYPE          (1b: SVP(SourceVirtualPortNumber) is NetworkPortindication)
    238  10)DVP_TYPE         (1b: DVP(DestinationVirtualPortNumber) is
    239                           NetworkPortIndication.)
    240  11)DROP             (1b: Drop indication.)
    241  ######################################################################
    242  ****** In compressed mode, attributes(PACKET_RESOLUTION,SVP_TYPE,DVP,DROP) are
    243  ****** grouped into PKT_RES_MAP map table
    244  12)IP Packet         (1b: Packet is IP.)
    245  Total 12 Packet attributes with 33 bits
    246  ========================================================================
    247 */
    248 typedef struct bcm_stat_flex_egr_pkt_attr_bits_s {
    249     /* Addition of Internal Congestion selectors
    250      * Total additional Bits : 2 bits
    251      */
    252     uint8 int_cn;
    253     uint8 int_cn_pos;
    254     uint8 int_cn_mask;
    255 
    256     /*
    257     Below are default bits for uncompressed
    258     format. Need to be set for compressed format
    259     Total Bits :(2+4)+(2+3+3)+(6)+(8)+(1+1+1+1) + (1)
    260                : 6     + 8   + 6 + 8 + 4      + 1
    261                : 33 bits
    262     */
    263     uint8   mmu_cos;
    264     uint8   mmu_cos_pos;
    265     uint8   mmu_cos_mask;
    266 
    267     uint8   uc_queueing;
    268     uint8   uc_queueing_pos;
    269     uint8   uc_queueing_mask;
    270 
    271     uint8   congestion_marked;
    272     uint8   congestion_marked_pos;
    273     uint8   congestion_marked_mask;
    274 
    275     /*
    276      * APACHE has Extended Flex Counter Packet Attributes
    277      * Total Bits : (4+4+4+4+4+4) + Existing as above
    278      *            : 24 + 39
    279      *            : 63 bits
    280      */
    281     uint8   cng_3;                /* 2 for uncompressed frmt   */
    282     uint8   cng_3_pos;
    283     uint8   cng_3_mask;
    284 
    285     uint8   phb_3;                /* 4 for uncompressed frmt   */
    286     uint8   phb_3_pos;
    287     uint8   phb_3_mask;
    288 
    289     uint8   cng_2;                /* 2 for uncompressed frmt   */
    290     uint8   cng_2_pos;
    291     uint8   cng_2_mask;
    292 
    293     uint8   phb_2;                /* 4 for uncompressed frmt   */
    294     uint8   phb_2_pos;
    295     uint8   phb_2_mask;
    296 
    297     uint8   cng_1;                /* 2 for uncompressed frmt   */
    298     uint8   cng_1_pos;
    299     uint8   cng_1_mask;
    300 
    301     uint8   phb_1;                /* 4 for uncompressed frmt   */
    302     uint8   phb_1_pos;
    303     uint8   phb_1_mask;
    304     /* PRI_CNF Group for compressed format */
    305     uint8   cng;                  /* 2 for uncompressed frmt   */
    306     uint8   cng_pos;
    307     uint8   cng_mask;
    308 
    309     uint8   int_pri;              /* 4 for uncompressed format */
    310     uint8   int_pri_pos;
    311     uint8   int_pri_mask;
    312 
    313     /* PKT_PRI vlan Group for compressed format */
    314     uint8   vlan_format;         /* 2 for uncompressed format  */
    315     uint8   vlan_format_pos;
    316     uint8   vlan_format_mask;
    317 
    318     uint8   outer_dot1p;         /* 3 for uncompressed format  */
    319     uint8   outer_dot1p_pos;
    320     uint8   outer_dot1p_mask;
    321 
    322     uint8   inner_dot1p;         /* 3 for uncompressed format   */
    323     uint8   inner_dot1p_pos;
    324     uint8   inner_dot1p_mask;
    325 
    326     /* Port Group for compressed format */
    327     uint8   egr_port;            /* 6 for uncompressed format  */
    328     uint8   egr_port_pos;
    329     uint8   egr_port_mask;
    330 
    331     /* TOS Group for compressed format */
    332     uint8   tos_dscp;                 /* 8 for uncompressed format  */
    333     uint8   tos_dscp_pos;
    334     uint8   tos_dscp_mask;
    335     uint8   tos_ecn;                 /* 8 for uncompressed format  */
    336     uint8   tos_ecn_pos;
    337     uint8   tos_ecn_mask;
    338 
    339     /* PKT_RESOLTION Group for compressed format               */
    340     uint8   pkt_resolution;     /* 1 for uncompressed format   */
    341     uint8   pkt_resolution_pos;
    342     uint8   pkt_resolution_mask;
    343 
    344     uint8   svp_type;           /* 1 for uncompressed format   */
    345     uint8   svp_type_pos;
    346     uint8   svp_type_mask;
    347 
    348     uint8   dvp_type;           /* 1 for uncompressed format   */
    349     uint8   dvp_type_pos;
    350     uint8   dvp_type_mask;
    351 
    352     uint8   drop;               /* 1 for uncompressed format   */
    353     uint8   drop_pos;
    354     uint8   drop_mask;
    355 
    356     uint8   ip_pkt;             /* 1 for uncompressed format   */
    357     uint8   ip_pkt_pos;
    358     uint8   ip_pkt_mask;
    359 }bcm_stat_flex_egr_pkt_attr_bits_t;
    360 
    361 /*
    362  There are two UDF (UserDefinedFields) chunks each contains one 16-bit UDF bit.
    363  Each UDF chunk has a valid bit associated with it. UDF attributes are 35-bits
    364  and contains following fields
    365  1) UDF0 (16-bits)
    366  2) UDF1 (16-bits)
    367  3) UDF_VALID0 (1-bit)
    368  4) UDF_VALID1 (1-bit)
    369  5) Drop (1-bit)
    370  For a packet, one or both of the udf valid bits might be invalid..
    371 
    372  UDF configuration happens separately and for configuring flex-counter we need
    373  below two udf(16b) masks only
    374 */
    375 
    376 
    377 typedef struct bcm_stat_flex_udf_pkt_attr_bits_s {
    378     uint16  udf0;
    379     uint16  udf1;
    380 }bcm_stat_flex_udf_pkt_attr_bits_t;
    381 
    382 /* For UncompressedIngressMode,PacketAttributes bits are fixed i.e.cng 2 bits */
    383 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_CNG_ATTR_BITS            0x1
    384 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_IFP_CNG_ATTR_BITS        0x2
    385 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_INT_PRI_ATTR_BITS        0x4
    386 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_VLAN_FORMAT_ATTR_BITS    0x8
    387 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_OUTER_DOT1P_ATTR_BITS    0x10
    388 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_INNER_DOT1P_ATTR_BITS    0x20
    389 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_INGRESS_PORT_ATTR_BITS   0x40
    390 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_TOS_DSCP_ATTR_BITS       0x80
    391 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_TOS_ECN_ATTR_BITS        0x100
    392 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_PKT_RESOLUTION_ATTR_BITS 0x200
    393 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_SVP_TYPE_ATTR_BITS       0x400
    394 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_DROP_ATTR_BITS           0x800
    395 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_IP_PKT_ATTR_BITS         0x1000
    396 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_CNG_3_ATTR_BITS          0x2000
    397 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_PHB_3_ATTR_BITS          0x4000
    398 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_CNG_2_ATTR_BITS          0x8000
    399 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_PHB_2_ATTR_BITS          0x10000
    400 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_CNG_1_ATTR_BITS          0x20000
    401 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_PHB_1_ATTR_BITS          0x40000
    402 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_TCP_FLAG_ATTR_BITS       0x80000
    403 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_INT_CN_ATTR_BITS         0x100000
    404 #define BCM_STAT_FLEX_ING_UNCOMPRESSED_USE_FC_TYPE_ATTR_BITS        0x200000
    405 
    406 /* For UncompressedEgressMode,PacketAttributes bits are fixed i.e.cng 2 bits */
    407 
    408 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_CNG_ATTR_BITS            0x1
    409 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_INT_PRI_ATTR_BITS        0x2
    410 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_VLAN_FORMAT_ATTR_BITS    0x4
    411 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_OUTER_DOT1P_ATTR_BITS    0x8
    412 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_INNER_DOT1P_ATTR_BITS    0x10
    413 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_EGRESS_PORT_ATTR_BITS    0x20
    414 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_TOS_DSCP_ATTR_BITS       0x40
    415 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_TOS_ECN_ATTR_BITS        0x80
    416 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_PKT_RESOLUTION_ATTR_BITS 0x100
    417 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_SVP_TYPE_ATTR_BITS       0x200
    418 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_DVP_TYPE_ATTR_BITS       0x400
    419 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_DROP_ATTR_BITS           0x800
    420 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_IP_PKT_ATTR_BITS         0x1000
    421 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_CNG_3_ATTR_BITS          0x2000
    422 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_PHB_3_ATTR_BITS          0x4000
    423 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_CNG_2_ATTR_BITS          0x8000
    424 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_PHB_2_ATTR_BITS          0x10000
    425 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_CNG_1_ATTR_BITS          0x20000
    426 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_PHB_1_ATTR_BITS          0x40000
    427 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_MMU_COS_ATTR_BITS        0x80000
    428 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_UC_QUEUEING_ATTR_BITS    0x100000
    429 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_CONGESTION_MARKED_ATTR_BITS     0x200000
    430 #define BCM_STAT_FLEX_EGR_UNCOMPRESSED_USE_INT_CN_ATTR_BITS                0x400000
    431 
    432 /* Packet attributes are mapped down to an 8 bit key before being used
    433  * to index the counter offset table
    434  */
    435 #define BCM_STAT_FLEX_MAX_PKT_ATTR_SEL_KEY_SIZE                     8
    436 
    437 
    438 typedef struct bcm_stat_flex_offset_table_entry_s {
    439     uint8    offset;
    440     uint8    count_enable;
    441 }bcm_stat_flex_offset_table_entry_t;
    442 
    443 typedef struct bcm_stat_flex_ing_uncmprsd_attr_selectors_s {
    444     uint32                             uncmprsd_attr_bits_selector;
    445     uint16                             total_counters;
    446     bcm_stat_flex_offset_table_entry_t offset_table_map[256];
    447 }bcm_stat_flex_ing_uncmprsd_attr_selectors_t;
    448 
    449 typedef struct bcm_stat_flex_egr_uncmprsd_attr_selectors_s {
    450     uint32                             uncmprsd_attr_bits_selector;
    451     uint16                             total_counters;
    452     bcm_stat_flex_offset_table_entry_t offset_table_map[256];
    453 }bcm_stat_flex_egr_uncmprsd_attr_selectors_t;
    454 
    455 
    456 /*
    457    ###################################################
    458    Ingress side compressed mode maps
    459    ###################################################
    460 
    461    PRI_CNG_MAP[2^(cng:2b + ifp_cng:2b +int_pri:4b=8)=256]  *  8
    462    PKT_PRI_MAP[2^(VLAN_FORMAT:2b + OUTER_DOT1P:3b + INNER_DOT1P:3b=8)=256] * 8
    463    PORT_MAP[2^(INGRESS_PORT:6b=6)=64] * 8
    464    TOS_MAP[2^(TOS:8b=8)=256] * 8
    465    PKT_RES_MAP[2^(PACKET_RESOLUTION:6b + SVP_TYPE:1b + DROP:1b=8)=256]  * 8
    466 
    467 */
    468 typedef uint8 bcm_stat_flex_ing_cmprsd_pri_cnf_attr_map_t[256]; /*256 * 8 */
    469 typedef uint8 bcm_stat_flex_ing_cmprsd_pkt_pri_attr_map_t[256]; /*256 * 8 */
    470 typedef uint8 bcm_stat_flex_ing_cmprsd_port_attr_map_t[512];    /*64  * 8 */
    471                                                                 /*TD2:128*8 */
    472                                                                 /*KT2:170*8 */
    473 typedef uint8 bcm_stat_flex_ing_cmprsd_tos_attr_map_t[256];     /*256 * 8 */
    474                                                          /* KT:256 KT2:1024 */
    475 typedef uint8 bcm_stat_flex_ing_cmprsd_pkt_res_attr_map_t[1024]; /*256 * 8 */
    476 
    477 typedef struct bcm_stat_flex_ing_cmprsd_attr_selectors_s {
    478     uint8                                           cng_3;
    479     uint8                                           phb_3;
    480     uint8                                           cng_2;
    481     uint8                                           phb_2;
    482     uint8                                           cng_1;
    483     uint8                                           phb_1;
    484     bcm_stat_flex_ing_pkt_attr_bits_t               pkt_attr_bits;
    485     bcm_stat_flex_ing_cmprsd_pri_cnf_attr_map_t     pri_cnf_attr_map;
    486     bcm_stat_flex_ing_cmprsd_pkt_pri_attr_map_t     pkt_pri_attr_map;
    487     bcm_stat_flex_ing_cmprsd_port_attr_map_t        port_attr_map;
    488     bcm_stat_flex_ing_cmprsd_tos_attr_map_t         tos_attr_map;
    489     bcm_stat_flex_ing_cmprsd_pkt_res_attr_map_t     pkt_res_attr_map;
    490     uint8                                           total_counters;
    491     bcm_stat_flex_offset_table_entry_t              offset_table_map[256];
    492 }bcm_stat_flex_ing_cmprsd_attr_selectors_t;
    493 
    494 /*
    495    ###################################################
    496    Egress side compressed mode maps
    497    ###################################################
    498 
    499    PRI_CNG_MAP[2^(cng:2b + int_pri:4b=6)=64]  *  8
    500    PKT_PRI_MAP[2^(VLAN_FORMAT:2b + OUTER_DOT1P:3b + INNER_DOT1P:3b=8)=256] * 8
    501    PORT_MAP[2^(EGRESS_PORT:6b=6)=64] * 8
    502    TOS_MAP[2^(TOS:8b=8)=256] * 8
    503    PKT_RES_MAP[2^(PACKET_RESOLUTION:1b +
    504                   SVP_TYPE:1b +
    505                   DVP_TYPE:1b +
    506                   DROP:1b=4)=16]  * 8
    507 */
    508 typedef uint8 bcm_stat_flex_egr_cmprsd_pri_cnf_attr_map_t[64];
    509 typedef uint8 bcm_stat_flex_egr_cmprsd_pkt_pri_attr_map_t[256];
    510 typedef uint8 bcm_stat_flex_egr_cmprsd_port_attr_map_t[170]; /* KT:64,KT2:169 */
    511 typedef uint8 bcm_stat_flex_egr_cmprsd_tos_attr_map_t[256];
    512 typedef uint8 bcm_stat_flex_egr_cmprsd_pkt_res_attr_map_t[256];
    513 typedef uint8 bcm_stat_flex_egr_cmprsd_cos_uc_attr_map_t[64];
    514 
    515 typedef struct bcm_stat_flex_egr_cmprsd_attr_selectors_s {
    516     uint8                                           cng_3;
    517     uint8                                           phb_3;
    518     uint8                                           cng_2;
    519     uint8                                           phb_2;
    520     uint8                                           cng_1;
    521     uint8                                           phb_1;
    522     bcm_stat_flex_egr_pkt_attr_bits_t           pkt_attr_bits;
    523     bcm_stat_flex_egr_cmprsd_pri_cnf_attr_map_t pri_cnf_attr_map;
    524     bcm_stat_flex_egr_cmprsd_pkt_pri_attr_map_t pkt_pri_attr_map;
    525     bcm_stat_flex_egr_cmprsd_port_attr_map_t    port_attr_map;
    526     bcm_stat_flex_egr_cmprsd_tos_attr_map_t     tos_attr_map;
    527     bcm_stat_flex_egr_cmprsd_pkt_res_attr_map_t pkt_res_attr_map;
    528     bcm_stat_flex_egr_cmprsd_cos_uc_attr_map_t  cos_uc_attr_map;
    529     uint8                                       total_counters;
    530     bcm_stat_flex_offset_table_entry_t          offset_table_map[256];
    531 }bcm_stat_flex_egr_cmprsd_attr_selectors_t;
    532 
    533 typedef struct bcm_stat_flex_udf_pkt_attr_selectors_s {
    534     bcm_stat_flex_udf_pkt_attr_bits_t    udf_pkt_attr_bits;
    535     uint32 drop_enable;
    536     uint8  total_counters;
    537 }bcm_stat_flex_udf_pkt_attr_selectors_t;
    538 
    539 
    540 typedef    struct bcm_stat_flex_ing_attr_s {
    541     bcm_stat_flex_packet_attr_type_t                packet_attr_type;
    542     /* union of all possible ingress packet attributes selectors
    543     i.e. uncompressed,compressed and udf */
    544     bcm_stat_flex_ing_uncmprsd_attr_selectors_t     uncmprsd_attr_selectors;
    545     bcm_stat_flex_ing_cmprsd_attr_selectors_t       cmprsd_attr_selectors;
    546     bcm_stat_flex_udf_pkt_attr_selectors_t          udf_pkt_attr_selectors;
    547 }bcm_stat_flex_ing_attr_t;
    548 
    549 typedef    struct bcm_stat_flex_egr_attr_s {
    550     bcm_stat_flex_packet_attr_type_t                packet_attr_type;
    551     /* union of all possible egress packet attributes selectors i.e.
    552     uncompressed,compressed and udf */
    553     bcm_stat_flex_egr_uncmprsd_attr_selectors_t     uncmprsd_attr_selectors;
    554     bcm_stat_flex_egr_cmprsd_attr_selectors_t       cmprsd_attr_selectors;
    555     bcm_stat_flex_udf_pkt_attr_selectors_t          udf_pkt_attr_selectors;
    556 }bcm_stat_flex_egr_attr_t;
    557 
    558 typedef    struct bcm_stat_flex_attr_s {
    559     bcm_stat_flex_direction_t   direction;
    560     bcm_stat_flex_ing_attr_t    ing_attr;
    561     bcm_stat_flex_egr_attr_t    egr_attr;
    562 }bcm_stat_flex_attr_t;
    563 
    564 /* flex counter mode. */
    565 /* MSB bit will indicate ingress or egress mode. */
    566 typedef uint32  bcm_stat_flex_mode_t;
    567 
    568 
    569 typedef struct bcm_stat_flex_counter_value_s {
    570     uint32    pkt_counter_value;
    571     uint64    byte_counter_value;
    572     uint64    pkt64_counter_value;
    573 }bcm_stat_flex_counter_value_t;
    574 
    575 typedef struct bcm_stat_flex_ctr_offset_info_s {
    576     uint8    all_counters_flag;
    577     uint32   offset_index; /* Valid only when all_counters_flag is false=0*/
    578 }bcm_stat_flex_ctr_offset_info_t;
    579 
    580 
    581 /*  FLEX COUNTER COMMON DECLARATION */
    582 
    583 #define BCM_STAT_FLEX_COUNTER_MAX_DIRECTION         2
    584 #define BCM_STAT_FLEX_COUNTER_MAX_MODE              4
    585 #define BCM_STAT_FLEX_COUNTER_MAX_POOL              16
    586 #define BCM_STAT_FLEX_COUNTER_MAX_INGRESS_TABLE     16
    587 #define BCM_STAT_FLEX_COUNTER_MAX_TH_IFP_INGRESS_TABLE  20
    588 #define BCM_STAT_FLEX_COUNTER_MAX_EGRESS_TABLE      8
    589 #define BCM_STAT_FLEX_COUNTER_MAX_SCACHE_SIZE       32
    590 #define BCM_STAT_FLEX_COUNTER_MAX_TOTAL_BITS        8
    591 #define BCM_STAT_FLEX_COUNTER_POOLS_PER_GROUP       4
    592 #define BCM_STAT_FLEX_COUNTER_MAX_GROUPS     (BCM_STAT_FLEX_COUNTER_MAX_POOL/ \
    593                                               BCM_STAT_FLEX_COUNTER_POOLS_PER_GROUP)
    594 #define BCM_STAT_TH_FLEX_COUNTER_MAX_POOL           20 
    595 #define BCM_STAT_AP_FLEX_COUNTER_MAX_PKT_ATTR_SEL   32
    596 
    597 
    598 #define BCM_STAT_DEF_FLEX_COUNTER_MAX_GROUPS  1
    599 #define BCM_STAT_TR3_FLEX_COUNTER_MAX_GROUPS  2
    600 #define BCM_STAT_TD2_FLEX_COUNTER_MAX_GROUPS  2
    601 
    602 #define BCM_STAT_AP_FLEX_COUNTER_MAX_GROUPS   8
    603 
    604 
    605 /* Tomahawk has 4 additional pools */
    606 #define BCM_STAT_TH_FLEX_COUNTER_MAX_GROUPS  (BCM_STAT_TH_FLEX_COUNTER_MAX_POOL/ \
    607                                               BCM_STAT_FLEX_COUNTER_POOLS_PER_GROUP)
    608 
    609 #define BCM_STAT_GROUP_MODE_ID_OAM_SUFFIX 0x10000000 /* Suffix for Stat Group Mode With OAM */
    610 #define BCM_STAT_GROUP_MODE_ID_OAM_MASK   0xF0000000 /* Mask for Stat Group Mode With OAM */
    611 
    612 
    613 
    614 #define BCM_STAT_FLEX_COUNTER_MAX_ATTR_SEL_BITS 8
    615 #define BCM_STAT_FLEX_MAX_COUNTERS_PER_MODE     256
    616 #define BCM_FLEX_STAT_TH_RSVD_IFP_POOL_MIN      12
    617 #define BCM_FLEX_STAT_TH_RSVD_IFP_POOL_MAX      19
    618 
    619 #define BCM_FLEX_STAT_HX5_RSVD_IFP_POOL_MIN      8
    620 
    621 #define BCM_STAT_TD3_FLEX_COUNTER_MAX_EGR_POOL   4
    622 
    623 typedef struct bcm_stat_flex_table_mode_info_t {
    624     soc_mem_t            soc_mem_v;
    625     bcm_stat_flex_mode_t mode;
    626 }bcm_stat_flex_table_mode_info_t;
    627 
    628 
    629 /* POOL NUMBERS for INGRESS Tables */
    630 
    631 
    632 #define FLEX_COUNTER_DEFAULT_PORT_TABLE_POOL_NUMBER                        0
    633 #define FLEX_COUNTER_DEFAULT_VFP_POLICY_TABLE_POOL_NUMBER                  1
    634 /* VFI and VLAN sharing same pool id */
    635 #define FLEX_COUNTER_DEFAULT_VFI_TABLE_POOL_NUMBER                         2
    636 #define FLEX_COUNTER_DEFAULT_VLAN_TABLE_POOL_NUMBER                        2
    637 #define FLEX_COUNTER_DEFAULT_VXLAN_TABLE_POOL_NUMBER                       2
    638 
    639 /* VLAN_XLATE and MPLS_TUNNEL_LABEL sharing same pool id */
    640 #define FLEX_COUNTER_DEFAULT_VLAN_XLATE_TABLE_POOL_NUMBER                  3
    641 #define FLEX_COUNTER_DEFAULT_MPLS_ENTRY_TABLE_POOL_NUMBER                  3
    642 
    643 /* MPLS_ENTRY_VC_LABEL and VRF can share same pool */
    644 #define FLEX_COUNTER_DEFAULT_VRF_TABLE_POOL_NUMBER                         4
    645 #define FLEX_COUNTER_DEFAULT_AGM_MONITOR_TABLE_POOL_NUMBER                 4
    646 
    647 #if defined(BCM_TRIDENT2PLUS_SUPPORT)
    648 #define FLEX_COUNTER_DEFAULT_VLAN_XLATE_SCND_LKUP_TABLE_POOL_NUMBER        4
    649 #endif /* BCM_TRIDENT2PLUS_SUPPORT */
    650 
    651 /* Source VP and L3_iif sharing same pool id */
    652 #define FLEX_COUNTER_DEFAULT_L3_IIF_TABLE_POOL_NUMBER                      5
    653 #define FLEX_COUNTER_DEFAULT_SOURCE_VP_TABLE_POOL_NUMBER                   5
    654 #define FLEX_COUNTER_DEFAULT_AGM_MONITOR_TABLE_SCND_LKUP_POOL_NUMBER       5
    655 
    656 #if defined(BCM_APACHE_SUPPORT)
    657 #define FLEX_COUNTER_DEFAULT_MPLS_ENTRY_SCND_LKUP_TABLE_POOL_NUMBER        5
    658 #endif /* BCM_APACHE_SUPPORT */
    659 
    660 
    661 #define FLEX_COUNTER_DEFAULT_L3_TUNNEL_TABLE_POOL_NUMBER                   6
    662 #define FLEX_COUNTER_DEFAULT_FCOE_TABLE_POOL_NUMBER                        6
    663 
    664 /* L3_ENTRY_2/4 + EXT_IPV4_UCAST_WIDE/EXT_IPV6_UCAST_WIDE share same pool id */
    665 #define FLEX_COUNTER_DEFAULT_L3_ENTRY_TABLE_POOL_NUMBER                    7
    666 #define FLEX_COUNTER_DEFAULT_L3_ROUTE_TABLE_POOL_NUMBER                    7
    667 
    668 #define FLEX_COUNTER_DEFAULT_EXT_FP_POLICY_TABLE_POOL_NUMBER               8
    669 #define FLEX_COUNTER_DEFAULT_IFP_POLICY_TABLE_POOL_NUMBER                  8
    670 
    671 #define FLEX_COUNTER_DEFAULT_EM_POLICY_TABLE_POOL_NUMBER                   9
    672 
    673 #ifdef BCM_HELIX5_SUPPORT
    674 #define FLEX_COUNTER_HX5_DEFAULT_EM_POLICY_TABLE_POOL_NUMBER               7
    675 #define FLEX_COUNTER_HX5_EXT_FP_POLICY_TABLE_POOL_NUMBER                   7
    676 #endif
    677 
    678 /* Support for MetroLite*/
    679 #if defined(BCM_METROLITE_SUPPORT)
    680 #define FLEX_COUNTER_ML_DEFAULT_VRF_TABLE_POOL_NUMBER                      2
    681 #define FLEX_COUNTER_ML_DEFAULT_AGM_MONITOR_TABLE_POOL_NUMBER              2
    682 
    683 #define FLEX_COUNTER_ML_DEFAULT_L3_IIF_TABLE_POOL_NUMBER                   3
    684 #define FLEX_COUNTER_ML_DEFAULT_SOURCE_VP_TABLE_POOL_NUMBER                3
    685 
    686 #define FLEX_COUNTER_ML_DEFAULT_L3_TUNNEL_TABLE_POOL_NUMBER                2
    687 #define FLEX_COUNTER_ML_DEFAULT_FCOE_TABLE_POOL_NUMBER                     2
    688 
    689 /* L3_ENTRY_2/4 + EXT_IPV4_UCAST_WIDE/EXT_IPV6_UCAST_WIDE share same pool id */
    690 #define FLEX_COUNTER_ML_DEFAULT_L3_ENTRY_TABLE_POOL_NUMBER                 3
    691 #define FLEX_COUNTER_ML_DEFAULT_L3_ROUTE_TABLE_POOL_NUMBER                 3
    692 
    693 #define FLEX_COUNTER_ML_DEFAULT_EXT_FP_POLICY_TABLE_POOL_NUMBER            2
    694 #define FLEX_COUNTER_ML_DEFAULT_IFP_POLICY_TABLE_POOL_NUMBER               2
    695 
    696 #define FLEX_COUNTER_ML_DEFAULT_EM_POLICY_TABLE_POOL_NUMBER                2
    697 #endif /* BCM_METROLITE_SUPPORT */
    698 
    699 
    700 /* POOL MASKS for INGRESS Tables */
    701 #define FLEX_COUNTER_POOL_USED_BY_PORT_TABLE                               0x1
    702 #define FLEX_COUNTER_POOL_USED_BY_VFP_POLICY_TABLE                         0x2
    703 #define FLEX_COUNTER_POOL_USED_BY_VLAN_TABLE                               0x4
    704 #define FLEX_COUNTER_POOL_USED_BY_VFI_TABLE                                0x8
    705 #define FLEX_COUNTER_POOL_USED_BY_VLAN_XLATE_TABLE                         0x10
    706 #define FLEX_COUNTER_POOL_USED_BY_MPLS_ENTRY_TABLE                         0x20
    707 #define FLEX_COUNTER_POOL_USED_BY_VRF_TABLE                                0x40
    708 #define FLEX_COUNTER_POOL_USED_BY_L3_IIF_TABLE                             0x80
    709 #define FLEX_COUNTER_POOL_USED_BY_SOURCE_VP_TABLE                          0x100
    710 #define FLEX_COUNTER_POOL_USED_BY_L3_TUNNEL_TABLE                          0x200
    711 #define FLEX_COUNTER_POOL_USED_BY_L3_ENTRY_TABLE                           0x400
    712 #define FLEX_COUNTER_POOL_USED_BY_EXT_FP_POLICY_TABLE                      0x800
    713 #define FLEX_COUNTER_POOL_USED_BY_VXLAN_TABLE                              0x1000
    714 #define FLEX_COUNTER_POOL_USED_BY_FCOE_TABLE                               0x2000
    715 #define FLEX_COUNTER_POOL_USED_BY_VSAN_TABLE                               0x4000
    716 #define FLEX_COUNTER_POOL_USED_BY_L3_ROUTE_TABLE                           0x8000
    717 #define FLEX_COUNTER_POOL_USED_BY_IFP_POLICY_TABLE                         0x10000
    718 #define FLEX_COUNTER_POOL_USED_BY_AGM_MONITOR_TABLE                        0x20000
    719 #define FLEX_COUNTER_POOL_USED_BY_EM_POLICY_TABLE                          0x40000
    720 #define FLEX_COUNTER_POOL_USED_BY_VLAN_XLATE_TABLE_FOR_SCND_LKUP           0x80000
    721 #define FLEX_COUNTER_POOL_USED_BY_MPLS_ENTRY_TABLE_FOR_SCND_LKUP           0x100000
    722 #define FLEX_COUNTER_POOL_USED_BY_AGM_MONITOR_TABLE_FOR_SCND_LKUP          0x200000
    723 
    724 /* POOL NUMBERS for EGRESS Tables */
    725 #define FLEX_COUNTER_DEFAULT_EGR_L3_NEXT_HOP_TABLE_POOL_NUMBER             0
    726 #define FLEX_COUNTER_DEFAULT_EGR_VFI_TABLE_POOL_NUMBER                     1
    727 #define FLEX_COUNTER_DEFAULT_EGR_PORT_TABLE_POOL_NUMBER                    2
    728 #define FLEX_COUNTER_DEFAULT_EGR_VLAN_TABLE_POOL_NUMBER                    3
    729 #define FLEX_COUNTER_DEFAULT_EGR_VLAN_XLATE_TABLE_POOL_NUMBER              4
    730 #define FLEX_COUNTER_DEFAULT_EGR_DVP_ATTRIBUTE_1_TABLE_POOL_NUMBER         5
    731 #define FLEX_COUNTER_DEFAULT_L3_NAT_TABLE_POOL_NUMBER                      7
    732 #if defined(BCM_TOMAHAWK3_SUPPORT)
    733 #define FLEX_COUNTER_DEFAULT_LATENCY_MONITOR_POOL_NUMBER                   3
    734 #endif
    735 
    736 #if defined(BCM_TRIDENT2_SUPPORT) || defined(BCM_METROLITE_SUPPORT)
    737 #define FLEX_COUNTER_TD2_DEFAULT_EGR_VLAN_XLATE_TABLE_POOL_NUMBER          0
    738 #define FLEX_COUNTER_TD2_DEFAULT_EGR_DVP_ATTRIBUTE_1_TABLE_POOL_NUMBER     1
    739 #define FLEX_COUNTER_TD2_DEFAULT_L3_NAT_TABLE_POOL_NUMBER                  2
    740 #endif
    741 
    742 #if defined(BCM_TRIDENT2PLUS_SUPPORT)
    743 #define FLEX_COUNTER_DEFAULT_EGR_IP_TUNNEL_MPLS_POOL_NUMBER                2
    744 #define FLEX_COUNTER_DEFAULT_EGR_IP_TUNNEL_MPLS_SCND_LBL_POOL_NUMBER       3
    745 #define FLEX_COUNTER_DEFAULT_EGR_EFP_POLICY_TABLE_POOL_NUMBER              3
    746 #endif /* BCM_TRIDENT2PLUS_SUPPORT */
    747 
    748  #if defined(BCM_APACHE_SUPPORT) || defined(BCM_TRIDENT3_SUPPORT)
    749  #define FLEX_COUNTER_DEFAULT_EGR_VLAN_XLATE_SCND_LKUP_POOL_NUMBER         2
    750  #endif /* BCM_APACHE_SUPPORT */
    751 
    752 /* POOL MASKS for EGRESS Tables */
    753 #define FLEX_COUNTER_POOL_USED_BY_EGR_L3_NEXT_HOP_TABLE                    0x1
    754 #define FLEX_COUNTER_POOL_USED_BY_EGR_VFI_TABLE                            0x2
    755 #define FLEX_COUNTER_POOL_USED_BY_EGR_PORT_TABLE                           0x4
    756 #define FLEX_COUNTER_POOL_USED_BY_EGR_VLAN_TABLE                           0x8
    757 #define FLEX_COUNTER_POOL_USED_BY_EGR_VLAN_XLATE_TABLE                     0x10
    758 #define FLEX_COUNTER_POOL_USED_BY_EGR_DVP_ATTRIBUTE_1_TABLE                0x20
    759 #define FLEX_COUNTER_POOL_USED_BY_EGR_L3_NAT_TABLE                         0x40
    760 #define FLEX_COUNTER_POOL_USED_BY_EGR_EFP_POLICY_TABLE                     0x80
    761 #define FLEX_COUNTER_POOL_USED_BY_EGR_IP_TUNNEL_MPLS_TABLE                0x100
    762 #define FLEX_COUNTER_POOL_USED_BY_EGR_VLAN_XLATE_TABLE_FOR_SCND_LKUP      0x200
    763 #define FLEX_COUNTER_POOL_USED_BY_EGR_IP_TUNNEL_MPLS_SCND_LBL_TABLE       0x400
    764 #define FLEX_COUNTER_POOL_USED_BY_LATENCY_MONITOR_TABLE                   0x800
    765 
    766 
    767 #define TABLE_INDEPENDENT_POOL_MASK  0x80000000
    768 
    769 /* ================================================================= */
    770 /* Pkt Resolution bits for Triumph3 is 6 bits so max value is 64     */
    771 /* Below values are just index and nothing to do with actual value   */
    772 /* Actual chip specific values will be determined  in init function  */
    773 /* ================================================================= */
    774 #define _UNKNOWN_PKT       0       /* unknown packet */
    775 #define _CONTROL_PKT       1       /* pkt(12, 13) == 0x8808 */
    776 #define _BPDU_PKT          2       /* L2 USER ENTRY table BPDU bit */
    777 #define _L2BC_PKT          3       /* L2 Broadcast pkt */
    778 #define _L2UC_PKT          4       /* L2 Unicast pkt */
    779 #define _L2DLF_PKT         5       /* L2 destination lookup failure */
    780 #define _UNKNOWN_IPMC_PKT  6       /* Unknown IP Multicast pkt */
    781 #define _KNOWN_IPMC_PKT    7       /* Known IP Multicast pkt */
    782 #define _KNOWN_L2MC_PKT    8       /* Known L2 multicast pkt */
    783 #define _UNKNOWN_L2MC_PKT  9       /* Unknown L2 multicast pkt */
    784 #define _KNOWN_L3UC_PKT    10       /* Known L3 Unicast pkt */
    785 #define _UNKNOWN_L3UC_PKT  11       /* Unknown L3 Unicast pkt */
    786 #define _KNOWN_MPLS_PKT    12       /* Known MPLS pkt */
    787 #define _KNOWN_MPLS_L3_PKT 13       /* Known L3 MPLS pkt */
    788 #define _KNOWN_MPLS_L2_PKT 14       /* Known L2 MPLS pkt */
    789 #define _UNKNOWN_MPLS_PKT  15       /* Unknown MPLS pkt */
    790 #define _KNOWN_MIM_PKT     16       /* Known MIM pkt */
    791 #define _UNKNOWN_MIM_PKT   17       /* Unknown MIM pkt */
    792 #define _KNOWN_MPLS_MULTICAST_PKT    18       /* Known MPLS multicast pkt */
    793 
    794 /* Additional Control Packets */
    795 #define _OAM_PKT           19       /* OAM packet that needs to be 
    796                                        terminated locally */
    797 #define _BFD_PKT           20       /* BFD packet that needs to be 
    798                                        terminated locally */
    799 #define _ICNM_PKT          21       /* ICNM packet that needs to be 
    800                                        terminated locally */
    801 #define _1588_PKT          22       /* ICNM packet that needs to be 
    802                                        terminated locally */
    803 #define _KNOWN_TRILL_PKT   23       /* Known EgressRbridgeTRILL transit pkt */
    804 #define _UNKNOWN_TRILL_PKT 24       /* UnKnown EgressRbridgeTRILL transit pkt */
    805 #define _KNOWN_NIV_PKT     25       /* Known DestinationVifDownstream pkt */
    806 #define _UNKNOWN_NIV_PKT   26       /* UnKnown DestinationVifDownstream pkt */
    807 #define _KNOWN_L2GRE_PKT   27       /* Known L2 Gre pkt */
    808 #define _KNOWN_VXLAN_PKT   28       /* Known VXLAN pkt */
    809 #define _KNOWN_FCOE_PKT    29       /* Known FCoE pkt */
    810 #define _UNKNOWN_FCOE_PKT  30       /* UnKnown FCoE pkt */
    811 
    812 
    813 
    814 #define _UNKNOWN_PKT_KATANA       0x00       /* unknown packet */
    815 #define _CONTROL_PKT_KATANA       0x01       /* pkt(12, 13) == 0x8808 */
    816 #define _BPDU_PKT_KATANA          0x02       /* L2 USER ENTRY table BPDU bit */
    817 #define _L2BC_PKT_KATANA          0x03       /* L2 Broadcast pkt */
    818 #define _L2UC_PKT_KATANA          0x04       /* L2 Unicast pkt */
    819 #define _L2DLF_PKT_KATANA         0x05       /* L2 destination lookup failure */
    820 #define _UNKNOWN_IPMC_PKT_KATANA  0x06       /* Unknown IP Multicast pkt */
    821 #define _KNOWN_IPMC_PKT_KATANA    0x07       /* Known IP Multicast pkt */
    822 #define _KNOWN_L2MC_PKT_KATANA    0x08       /* Known L2 multicast pkt */
    823 #define _UNKNOWN_L2MC_PKT_KATANA  0x09       /* Unknown L2 multicast pkt */
    824 #define _KNOWN_L3UC_PKT_KATANA    0x0a       /* Known L3 Unicast pkt */
    825 #define _UNKNOWN_L3UC_PKT_KATANA  0x0b       /* Unknown L3 Unicast pkt */
    826 #define _KNOWN_MPLS_PKT_KATANA    0x0c       /* Known MPLS pkt */
    827 #define _KNOWN_MPLS_L3_PKT_KATANA 0x0d       /* Known L3 MPLS pkt */
    828 #define _KNOWN_MPLS_L2_PKT_KATANA 0x0e       /* Known L2 MPLS pkt */
    829 #define _UNKNOWN_MPLS_PKT_KATANA  0x0f       /* Unknown MPLS pkt */
    830 #define _KNOWN_MIM_PKT_KATANA     0x10       /* Known MIM pkt */
    831 #define _UNKNOWN_MIM_PKT_KATANA   0x11       /* Unknown MIM pkt */
    832 #define _KNOWN_MPLS_MULTICAST_PKT_KATANA    0x12  /* Known MPLS multicast pkt */
    833 
    834 #define _UNKNOWN_PKT_TR3       0       /* unknown packet */
    835 #define _CONTROL_PKT_TR3       1       /* pkt(12, 13) == 0x8808 */
    836 #define _OAM_PKT_TR3           2       /* OAM packet            */
    837 #define _BFD_PKT_TR3           3       /* BFD packet            */
    838 #define _BPDU_PKT_TR3          4       /* L2 USER ENTRY table BPDU bit */
    839 #define _ICNM_PKT_TR3          5       /* ICNM packet            */
    840 #define _1588_PKT_TR3          6       /* 1588 packet            */
    841 #define _KNOWN_L2UC_PKT_TR3    8       /* Known destination L2 unicast packet*/
    842 #define _L2UC_PKT_TR3          _KNOWN_L2UC_PKT_TR3
    843                                        /* L2UC_PKT_TR3: L2 Unicast pkt */
    844 #define _UNKNOWN_L2UC_PKT_TR   9       /* Unknown destination L2 UnicastPacket*/
    845 #define _L2DLF_PKT_TR3         _UNKNOWN_L2UC_PKT_TR
    846                                        /* L2 destination lookup failure */
    847 #define _KNOWN_L2MC_PKT_TR3    10       /* Known L2 multicast pkt */
    848 #define _UNKNOWN_L2MC_PKT_TR3  11       /* Unknown L2 multicast pkt */
    849 #define _L2BC_PKT_TR3          12      /* L2 Broadcast pkt */
    850 #define _KNOWN_L3UC_PKT_TR3    16       /* Known L3 Unicast pkt */
    851 #define _UNKNOWN_L3UC_PKT_TR3  17       /* Unknown L3 Unicast pkt */
    852 #define _KNOWN_IPMC_PKT_TR3    18       /* Known IP Multicast pkt */
    853 #define _UNKNOWN_IPMC_PKT_TR3  19       /* Unknown IP Multicast pkt */
    854 #define _KNOWN_MPLS_L2_PKT_TR3 24       /* Known L2 MPLS pkt */
    855 #define _UNKNOWN_MPLS_PKT_TR3  25       /* Unknown MPLS pkt */
    856 #define _KNOWN_MPLS_L3_PKT_TR3 26       /* Known L3 MPLS pkt */
    857 #define _KNOWN_MPLS_PKT_TR3    28       /* Known MPLS pkt */
    858 #define _KNOWN_MPLS_MULTICAST_PKT_TR3    29       /* Known MPLS multicast pkt */
    859 #define _KNOWN_MIM_PKT_TR3     32       /* Known MIM pkt */
    860 #define _UNKNOWN_MIM_PKT_TR3   33       /* Unknown MIM pkt */
    861 #define _KNOWN_TRILL_PKT_TR3   40       /* Known EgressRbridgeTRILL Transit 
    862                                            pkt */
    863 #define _UNKNOWN_TRILL_PKT_TR3 41       /* UnKnown EgressRbridgeTRILL Transit
    864                                            Pkt */
    865 #define _KNOWN_NIV_PKT_TR3     48       /* Known DestinationVifDownstream pkt */
    866 #define _UNKNOWN_NIV_PKT_TR3   49       /* UnKnown DestinationVifDownstream 
    867                                            pkt */
    868 /* added in TD2 */
    869 #define _KNOWN_L2GRE_PKT_TD2   50       /* Known L2 Gre pkt */
    870 #define _KNOWN_VXLAN_PKT_TD2   51       /* Known VXLAN pkt */
    871 #define _KNOWN_FCOE_PKT_TD2    52       /* Known FCoE pkt */
    872 #define _UNKNOWN_FCOE_PKT_TD2  53       /* Unknown FCoE pkt */
    873 
    874 /* Egress packet types */
    875 #define _L2_UC_PKT_EGR       0       /* Egr L2 UC pkt */
    876 #define _L2_NON_UC_PKT_EGR   1       /* Egr L2 Non UC pkt */
    877 
    878 
    879 #define BCM_FLEX_INGRESS_POOL               0x1
    880 #define BCM_FLEX_EGRESS_POOL                0x2
    881 #define BCM_FLEX_ALLOCATE_POOL              0x4
    882 #define BCM_FLEX_DEALLOCATE_POOL            0x8
    883 #define BCM_FLEX_SHARED_POOL                0x10
    884 #define BCM_FLEX_NOT_SHARED_POOL            0x20
    885 
    886 /* For internal use only */
    887 typedef enum bcm_int_stat_object_e {
    888     bcmIntStatObjectIngAgm = bcmStatObjectMaxValue,
    889     bcmIntStatObjectIngAgmSecondLookup,
    890     bcmIntStatObjectEgrLatencyMonitor0,
    891     bcmIntStatObjectEgrLatencyMonitor1,
    892     bcmIntStatObjectEgrLatencyMonitor2,
    893     bcmIntStatObjectEgrLatencyMonitor3,
    894     bcmIntStatObjectMaxValue
    895 } bcm_int_stat_object_t;
    896 
    897 typedef enum bcm_int_stat_group_mode_e {
    898     bcmIntStatGroupModeLatencyMonitor = bcmStatGroupModeCount
    899 } bcm_int_stat_group_mode_t;
    900 
    901 typedef enum bcm_int_stat_group_mode_hint_type_e {
    902     bcmIntStatGroupAllocHintIngressAgmGroup = bcmStatGroupAllocHintCount, 
    903     bcmIntStatGroupAllocHintCount
    904 } bcm_int_stat_group_mode_hint_type_t;
    905 
    906 typedef struct  bcm_stat_flex_pool_stat_s {
    907     uint32  used_by_tables;
    908     SHR_BITDCL used_by_objects[_SHR_BITDCLSIZE(bcmIntStatObjectMaxValue)];
    909     uint32  used_entries;
    910     uint32  attached_entries;
    911 } bcm_stat_flex_pool_stat_t;
    912 
    913 #define BCM_FLEX_POOL_GROUP_USED_BY_NONE  0
    914 #define BCM_FLEX_POOL_GROUP_USED_BY_OAM   1
    915 #define BCM_FLEX_POOL_GROUP_USED_BY_OTHER 2
    916 
    917 typedef struct  bcm_stat_flex_pool_group_s {
    918     uint32  group_type;
    919     uint32  free_pools;
    920     uint32  base_pool;
    921 }bcm_stat_flex_pool_group_t;
    922 
    923 
    924 
    925 /* ******************************************************************* */
    926 /* counter-id-specific reference count will be added later i.e. after
    927    basic functionality starts working */
    928 /* ******************************************************************* */
    929 typedef struct  bcm_stat_flex_ingress_mode_s {
    930     uint32        available;
    931     uint32        reference_count;
    932     uint32        total_counters;
    933     bcm_stat_group_mode_t    group_mode;
    934     uint32                              flags;
    935     uint32                              oam_flags;
    936     uint32                              num_selectors;
    937     bcm_stat_group_mode_attr_selector_t *attr_selectors;
    938     bcm_stat_flex_ing_attr_t ing_attr;
    939 }bcm_stat_flex_ingress_mode_t;
    940 
    941 #define BCM_CUSTOM_INGRESS_MODE_START (16)
    942 #define BCM_CUSTOM_INGRESS_MODE_MAX_COUNT (152*1024)
    943 #define BCM_STAT_FLEX_CUSTOM_INGRESS_COUNTER_MAX_MODE (BCM_CUSTOM_INGRESS_MODE_MAX_COUNT + BCM_CUSTOM_INGRESS_MODE_START) /*152K custom modes to handle maximum possible */
    944 
    945 #define BCM_CUSTOM_EGRESS_MODE_START (BCM_STAT_FLEX_CUSTOM_INGRESS_COUNTER_MAX_MODE)
    946 #define BCM_CUSTOM_EGRESS_MODE_MAX_COUNT (32*1024)
    947 #define BCM_STAT_FLEX_CUSTOM_EGRESS_COUNTER_MAX_MODE (BCM_CUSTOM_EGRESS_MODE_START + BCM_CUSTOM_EGRESS_MODE_MAX_COUNT)
    948 
    949 typedef struct _bcm_stat_counter_map {
    950 	uint32                mode;
    951 	uint32                pool;
    952 	uint32                base_idx;
    953     bcm_stat_object_t     object;
    954     bcm_stat_group_mode_t group;
    955     uint8                 pipe;
    956 	int                   used;
    957 }bcm_stat_counter_map_t;
    958 
    959 /*"Wrapper" Modes for custom IFP stats*/
    960 typedef struct  bcm_stat_flex_custom_ingress_mode_s {
    961     uint8        used;
    962     uint8        offset_mode;
    963     int8         AllocPool; /* Pool actually allocated for IFP. Group ID cannot identify the exact pool */
    964     bcm_stat_group_mode_hint_t hint; 
    965     uint32                              num_selectors;
    966     bcm_stat_group_mode_attr_selector_t *attr_selectors;
    967     uint32        total_counters;
    968 }bcm_stat_flex_custom_ingress_mode_t;
    969 
    970 #if defined(BCM_TRIDENT3_SUPPORT) || defined(BCM_TOMAHAWK3_SUPPORT)
    971 /*"Wrapper" Modes for custom EFP stats*/
    972 typedef struct  bcm_stat_flex_custom_egress_mode_s {
    973     uint8        used;
    974     uint8        offset_mode;
    975     int8         AllocPool;
    976     bcm_stat_group_mode_hint_t hint;
    977     uint32                              num_selectors;
    978     bcm_stat_group_mode_attr_selector_t *attr_selectors;
    979     uint32        total_counters;
    980 }bcm_stat_flex_custom_egress_mode_t;
    981 
    982 #ifdef BCM_WARM_BOOT_SUPPORT
    983 typedef struct bcm_stat_flex_custom_mode_info_s {
    984     uint32 custom_mode;
    985     uint8  offset_mode;
    986     uint8  AllocPool;
    987     uint32 fg_id; /*field group id - 0xffffffff means invalid */
    988 }bcm_stat_flex_custom_mode_info_t;
    989 
    990 typedef struct bcm_stat_flex_counter_id_info_s {
    991     uint32 mode;
    992     uint8  pool;
    993     uint8  used;
    994     uint32 base_idx;
    995     uint16 object;
    996     uint16 group;
    997 }bcm_stat_flex_counter_id_info_t;
    998 #endif
    999 #endif
   1000 
   1001 typedef struct  bcm_stat_flex_egress_mode_s {
   1002     uint32        available;
   1003     uint32        reference_count;
   1004     uint32        total_counters;
   1005     uint32        group_mode;
   1006     uint32                              flags;
   1007     uint32                              num_selectors;
   1008     bcm_stat_group_mode_attr_selector_t *attr_selectors;
   1009     bcm_stat_flex_egr_attr_t egr_attr;
   1010 }bcm_stat_flex_egress_mode_t;
   1011 
   1012 typedef struct bcm_stat_flex_table_info_s {
   1013     soc_mem_t                 table;
   1014     uint32                    index;
   1015     bcm_stat_flex_direction_t direction;
   1016 }bcm_stat_flex_table_info_t;
   1017 
   1018 typedef struct  bcm_stat_flex_pool_attribute_t {
   1019         int    module_type;
   1020         int    pool_size;
   1021         uint32 flags ;
   1022         int    pool_id;
   1023         int    offset;
   1024 }bcm_stat_flex_pool_attribute_t;
   1025 
   1026 typedef enum bcm_stat_flex_group_mode_e {
   1027    bcmStatGroupModeFlex1 = bcmStatGroupModeCount,
   1028    bcmStatGroupModeFlex2, 
   1029    bcmStatGroupModeFlex3, 
   1030    bcmStatGroupModeFlex4 
   1031 }bcm_stat_flex_group_mode_t;
   1032 
   1033 /* BEGIN: NEW FLEX FEATURE RELATED STUFF */
   1034 #define BCM_STAT_FLEX_MAX_COUNTER 256
   1035 #define BCM_STAT_FLEX_MAX_SELECTORS 512
   1036 
   1037 #define SHR_BITWID 32
   1038 #define BCM_STAT_FLEX_VALUE_SET(_array, _value)    \
   1039         (((_array)[(_value) / SHR_BITWID]) |= (1U << ((_value) % SHR_BITWID)))
   1040 
   1041 #define BCM_STAT_FLEX_VALUE_GET(_array, _value)    \
   1042         (((_array)[(_value) / SHR_BITWID]) & (1U << ((_value) % SHR_BITWID)))
   1043 
   1044 #define BCM_STAT_FLEX_BIT_ARRAY_SIZE 32
   1045 
   1046 #define BCM_STAT_FLEX_DETACH_RV_SET(rv, _array)                \
   1047     if (BCM_E_NONE == (_array)[bcmStatFlexDirectionIngress]) { \
   1048         if (BCM_E_NOT_FOUND ==                                 \
   1049             (_array)[bcmStatFlexDirectionEgress]) {            \
   1050             rv = BCM_E_NONE;                                   \
   1051         } else {                                               \
   1052             rv = (_array)[bcmStatFlexDirectionEgress];         \
   1053         }                                                      \
   1054     } else if (BCM_E_NOT_FOUND ==                              \
   1055                 (_array)[bcmStatFlexDirectionIngress]){        \
   1056         rv = (_array)[bcmStatFlexDirectionEgress];             \
   1057     } else {                                                   \
   1058         rv = (_array)[bcmStatFlexDirectionIngress];            \
   1059     }
   1060 
   1061 
   1062 #define BCM_STAT_FLEX_DETACH_RETURN(_array)                    \
   1063     if (BCM_E_NONE == (_array)[bcmStatFlexDirectionIngress]) { \
   1064         if (BCM_E_NOT_FOUND ==                                 \
   1065             (_array)[bcmStatFlexDirectionEgress]) {            \
   1066             return BCM_E_NONE;                                 \
   1067         } else {                                               \
   1068             return (_array)[bcmStatFlexDirectionEgress];       \
   1069         }                                                      \
   1070     } else if (BCM_E_NOT_FOUND ==                              \
   1071                 (_array)[bcmStatFlexDirectionIngress]){        \
   1072         return (_array)[bcmStatFlexDirectionEgress];           \
   1073     } else {                                                   \
   1074         return (_array)[bcmStatFlexDirectionIngress];          \
   1075     }
   1076 
   1077 typedef enum bcm_stat_flex_attr_with_value_e {
   1078               bcmStatFlexAttrPort = 0,
   1079               bcmStatFlexAttrTosDscp = 1,
   1080               bcmStatFlexAttrTosEcn = 2,
   1081               bcmStatFlexAttrSvp = 3,
   1082               bcmStatFlexAttrDvp = 4,
   1083               bcmStatFlexAttrUdf = 5,
   1084               bcmStatFlexAttrComb = 6,
   1085               bcmStatFlexAttrMax = 7
   1086 }bcm_stat_flex_attr_with_value_t;
   1087 
   1088 #define BCM_MAX_IFP_COLOR_COUNTERS 3
   1089 #define BCM_MAX_IFP_COLORS         3
   1090 
   1091 typedef struct _bcm_ifp_color_map_s {
   1092     uint8 map[BCM_MAX_IFP_COLOR_COUNTERS];
   1093 } _bcm_ifp_color_map_t;
   1094 
   1095 typedef struct bcm_stat_flex_combine_attr_counter_s { 
   1096        uint32 fc_type;
   1097 
   1098 #define BCM_STAT_FLEX_TCP_FLAG_TYPE_FIN                   0x00000001
   1099 #define BCM_STAT_FLEX_TCP_FLAG_TYPE_SYN                   0x00000002
   1100 #define BCM_STAT_FLEX_TCP_FLAG_TYPE_RST                   0x00000004
   1101 #define BCM_STAT_FLEX_TCP_FLAG_TYPE_PSH                   0x00000008
   1102 #define BCM_STAT_FLEX_TCP_FLAG_TYPE_ACK                   0x00000010
   1103 #define BCM_STAT_FLEX_TCP_FLAG_TYPE_URG                   0x00000020
   1104 #define BCM_STAT_FLEX_TCP_FLAG_TYPE_ECE                   0x00000040
   1105 #define BCM_STAT_FLEX_TCP_FLAG_TYPE_CWR                   0x00000080
   1106        uint32 tcp_flags;
   1107 
   1108 #define BCM_STAT_FLEX_INT_CN0                             0x00000001
   1109 #define BCM_STAT_FLEX_INT_CN1                             0x00000002
   1110 #define BCM_STAT_FLEX_INT_CN2                             0x00000004
   1111 #define BCM_STAT_FLEX_INT_CN3                             0x00000008
   1112        uint32 int_cn;
   1113 
   1114 #define BCM_STAT_FLEX_COS0                                0x00000001
   1115 #define BCM_STAT_FLEX_COS1                                0x00000002
   1116 #define BCM_STAT_FLEX_COS2                                0x00000004
   1117 #define BCM_STAT_FLEX_COS3                                0x00000008
   1118 #define BCM_STAT_FLEX_COS4                                0x00000010
   1119 #define BCM_STAT_FLEX_COS5                                0x00000020
   1120 #define BCM_STAT_FLEX_COS6                                0x00000040
   1121 #define BCM_STAT_FLEX_COS7                                0x00000080
   1122 #define BCM_STAT_FLEX_COS8                                0x00000100
   1123 #define BCM_STAT_FLEX_COS9                                0x00000200
   1124 #define BCM_STAT_FLEX_COS10                               0x00000400
   1125 #define BCM_STAT_FLEX_COS11                               0x00000800
   1126 #define BCM_STAT_FLEX_COS12                               0x00001000
   1127 #define BCM_STAT_FLEX_COS13                               0x00002000
   1128 #define BCM_STAT_FLEX_COS14                               0x00004000
   1129 #define BCM_STAT_FLEX_COS15                               0x00008000
   1130         uint32 mmu_cos_flags;
   1131 
   1132 #define BCM_STAT_FLEX_UC_QUEUEING_ENABLE              0x00000001
   1133 #define BCM_STAT_FLEX_UC_QUEUEING_DISABLE             0x00000002
   1134         uint32 uc_queueing_flags;
   1135 
   1136 #define BCM_STAT_FLEX_CONGESTION_MARKED_ENABLE              0x00000001
   1137 #define BCM_STAT_FLEX_CONGESTION_MARKED_DISABLE             0x00000002
   1138         uint32 congestion_marked_flags;
   1139 
   1140 #define BCM_STAT_FLEX_COLOR_GREEN                     0x00000001
   1141 #define BCM_STAT_FLEX_COLOR_YELLOW                    0x00000002
   1142 #define BCM_STAT_FLEX_COLOR_RED                       0x00000004
   1143         uint32 pre_ifp_color_flags; 
   1144         uint32 ifp_color_flags; 
   1145         uint32 pre_ifp_color_mpls_label3_flags;
   1146         uint32 pre_ifp_color_mpls_label2_flags;
   1147         uint32 pre_ifp_color_mpls_label1_flags;
   1148 
   1149 #define BCM_STAT_FLEX_PRI0                                0x00000001
   1150 #define BCM_STAT_FLEX_PRI1                                0x00000002
   1151 #define BCM_STAT_FLEX_PRI2                                0x00000004
   1152 #define BCM_STAT_FLEX_PRI3                                0x00000008
   1153 #define BCM_STAT_FLEX_PRI4                                0x00000010
   1154 #define BCM_STAT_FLEX_PRI5                                0x00000020
   1155 #define BCM_STAT_FLEX_PRI6                                0x00000040
   1156 #define BCM_STAT_FLEX_PRI7                                0x00000080
   1157 #define BCM_STAT_FLEX_PRI8                                0x00000100
   1158 #define BCM_STAT_FLEX_PRI9                                0x00000200
   1159 #define BCM_STAT_FLEX_PRI10                               0x00000400
   1160 #define BCM_STAT_FLEX_PRI11                               0x00000800
   1161 #define BCM_STAT_FLEX_PRI12                               0x00001000
   1162 #define BCM_STAT_FLEX_PRI13                               0x00002000
   1163 #define BCM_STAT_FLEX_PRI14                               0x00004000
   1164 #define BCM_STAT_FLEX_PRI15                               0x00008000
   1165         uint32 int_pri_flags; 
   1166         uint32 int_pri_mpls_label3_flags;
   1167         uint32 int_pri_mpls_label2_flags;
   1168         uint32 int_pri_mpls_label1_flags;
   1169 
   1170 #define BCM_STAT_FLEX_VLAN_FORMAT_UNTAGGED                    0x00000001
   1171 #define BCM_STAT_FLEX_VLAN_FORMAT_INNER                       0x00000002
   1172 #define BCM_STAT_FLEX_VLAN_FORMAT_OUTER                       0x00000004
   1173 #define BCM_STAT_FLEX_VLAN_FORMAT_BOTH                        0x00000008
   1174         uint32 vlan_format_flags; 
   1175 
   1176 /* #define BCM_STAT_FLEX_PRI0..7 */
   1177         uint32 outer_dot1p_flags; 
   1178         uint32 inner_dot1p_flags; 
   1179 
   1180 #define BCM_STAT_FLEX_PKT_TYPE_UNKNOWN_PKT                    0x00000001
   1181 #define BCM_STAT_FLEX_PKT_TYPE_CONTROL_PKT                    0x00000002
   1182 #define BCM_STAT_FLEX_PKT_TYPE_OAM_PKT                        0x00000004
   1183 #define BCM_STAT_FLEX_PKT_TYPE_BFD_PKT                        0x00000008
   1184 #define BCM_STAT_FLEX_PKT_TYPE_BPDU_PKT                       0x00000010
   1185 #define BCM_STAT_FLEX_PKT_TYPE_ICNM_PKT                       0x00000020
   1186 #define BCM_STAT_FLEX_PKT_TYPE_PKT_IS_1588                    0x00000040
   1187 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_L2UC_PKT                 0x00000080
   1188 #define BCM_STAT_FLEX_PKT_TYPE_UNKNOWN_L2UC_PKT               0x00000100
   1189 #define BCM_STAT_FLEX_PKT_TYPE_L2BC_PKT                       0x00000200
   1190 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_L2MC_PKT                 0x00000400
   1191 #define BCM_STAT_FLEX_PKT_TYPE_UNKNOWN_L2MC_PKT               0x00000800
   1192 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_L3UC_PKT                 0x00001000
   1193 #define BCM_STAT_FLEX_PKT_TYPE_UNKNOWN_L3UC_PKT               0x00002000
   1194 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_IPMC_PKT                 0x00004000
   1195 #define BCM_STAT_FLEX_PKT_TYPE_UNKNOWN_IPMC_PKT               0x00008000
   1196 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_MPLS_L2_PKT              0x00010000
   1197 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_MPLS_L3_PKT              0x00020000
   1198 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_MPLS_PKT                 0x00040000
   1199 #define BCM_STAT_FLEX_PKT_TYPE_UNKNOWN_MPLS_PKT               0x00080000
   1200 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_MPLS_MULTICAST_PKT       0x00100000
   1201 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_MIM_PKT                  0x00200000
   1202 #define BCM_STAT_FLEX_PKT_TYPE_UNKNOWN_MIM_PKT                0x00400000
   1203 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_TRILL_PKT                0x00800000
   1204 #define BCM_STAT_FLEX_PKT_TYPE_UNKNOWN_TRILL_PKT              0x01000000
   1205 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_NIV_PKT                  0x02000000
   1206 #define BCM_STAT_FLEX_PKT_TYPE_UNKNOWN_NIV_PKT                0x04000000
   1207 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_L2GRE_PKT                0x08000000
   1208 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_VXLAN_PKT                0x10000000
   1209 #define BCM_STAT_FLEX_PKT_TYPE_KNOWN_FCOE_PKT                 0x20000000
   1210 #define BCM_STAT_FLEX_PKT_TYPE_UNKNOWN_FCOE_PKT               0x40000000
   1211 
   1212         uint32 pkt_resolution_flags;
   1213 
   1214         /* These new defines go into pkt_resolution_high_flags */        
   1215 #define BCM_STAT_FLEX_PKT_TYPE_2_L2_UC_PKT                    0x00000001
   1216 #define BCM_STAT_FLEX_PKT_TYPE_2_L2_NON_UC_PKT                0x00000002
   1217         
   1218         uint32 pkt_resolution_high_flags;
   1219 
   1220 #define BCM_STAT_FLEX_DROP_ENABLE                             0x00000001
   1221 #define BCM_STAT_FLEX_DROP_DISABLE                            0x00000002
   1222         uint32 drop_flags; 
   1223 #define BCM_STAT_FLEX_IP_PKT_ENABLE                           0x00000001
   1224 #define BCM_STAT_FLEX_IP_PKT_DISABLE                          0x00000002
   1225         uint32 ip_pkt_flags;
   1226         /* Bit Value array for port,tos,svp & dvp considering max value as 1024
   1227         =uint32=32 bits *                 size=BCM_STAT_FLEX_BIT_ARRAY_SIZE)*/
   1228         uint32 value_array[bcmStatFlexAttrMax][BCM_STAT_FLEX_BIT_ARRAY_SIZE];
   1229 
   1230 }bcm_stat_flex_combine_attr_counter_t ;
   1231 
   1232 typedef struct bcm_stat_flex_attribute_s {
   1233         uint32 fc_type;
   1234         uint32 tcp_flags;
   1235         uint32 int_cn;
   1236         uint32 mmu_cos;
   1237         uint32 uc_queueing;
   1238         uint32 congestion_marked;
   1239         uint32 cng_3;
   1240         uint32 phb_3;
   1241         uint32 cng_2;
   1242         uint32 phb_2;
   1243         uint32 cng_1;
   1244         uint32 phb_1;
   1245         uint32 pre_ifp_color; 
   1246         uint32 ifp_color;     
   1247         uint32 int_pri;    
   1248         uint32 vlan_format;
   1249         uint32 outer_dot1p;  
   1250         uint32 inner_dot1p;  
   1251         uint32  port;
   1252         uint32  tos_dscp;
   1253         uint32  tos_ecn;
   1254         uint32 pkt_resolution;  
   1255         uint32 svp;
   1256         uint32 dvp;
   1257         uint32 drop;
   1258         uint32 ip_pkt;
   1259         uint32 udf;
   1260         uint32 udf_bitmap;
   1261         uint32 subport;
   1262         uint32 total_counters;
   1263         uint32 total_selectors;
   1264         uint32 combine_mmu_cos_flags;
   1265         uint32 combine_uc_queueing_flags;
   1266         uint32 combine_congestion_marked_flags;
   1267         uint32 combine_pre_ifp_color_flags;
   1268         uint32 combine_ifp_color_flags;
   1269         uint32 combine_int_pri_flags;
   1270         uint32 combine_vlan_format_flags;
   1271         uint32 combine_outer_dot1p_flags;
   1272         uint32 combine_inner_dot1p_flags;
   1273         uint32 combine_pkt_resolution_flags;
   1274         uint32 combine_drop_flags;
   1275         uint32 combine_ip_pkt_flags;
   1276         uint32 combine_value_array[bcmStatFlexAttrMax][BCM_STAT_FLEX_BIT_ARRAY_SIZE];
   1277         bcm_stat_flex_combine_attr_counter_t  *combine_attr_counter;
   1278         /* combine_pkt_resolution_flags is expanded with 'high below */
   1279         uint32 combine_pkt_resolution_high_flags;
   1280 }bcm_stat_flex_attribute_t;
   1281 
   1282 typedef enum pkt_cmprsd_attr_map_e {
   1283     ing_pkt_attr_pri_cng_map = 0,    /* ING_FLEX_CTR_PRI_CNG_MAPm*/
   1284     ing_pkt_attr_pkt_pri_map = 1,    /* ING_FLEX_CTR_PKT_PRI_MAPm */
   1285     ing_pkt_attr_port_map = 2,       /* ING_FLEX_CTR_PORT_MAPm */
   1286     ing_pkt_attr_tos_map = 3,        /* ING_FLEX_CTR_TOS_MAPm */
   1287     ing_pkt_attr_pkt_res_map = 4,    /* ING_FLEX_CTR_PKT_RES_MAPm */
   1288     ing_pkt_attr_ip_pkt_map = 5,     /* no map for IP_PKT in h/w */
   1289     egr_pkt_attr_pri_cng_map = 6,/* EGR_FLEX_CTR_PRI_CNG_MAP */
   1290     egr_pkt_attr_pkt_pri_map = 7,/* EGR_FLEX_CTR_PKT_PRI_MAP */
   1291     egr_pkt_attr_port_map = 8,   /* EGR_FLEX_CTR_PORT_MAPm  */
   1292     egr_pkt_attr_tos_map = 9,    /* EGR_FLEX_CTR_TOS_MAPm */
   1293     egr_pkt_attr_pkt_res_map = 10,/* EGR_FLEX_CTR_PKT_RES_MAPm */
   1294     pkt_attr_map_count = 11
   1295 } pkt_cmprsd_attrs_map_t;
   1296 
   1297 /* Structure for global compression table attribute selectors map */
   1298 typedef struct _bcm_stat_flex_compressed_mode_attr_sel_map_s {
   1299     uint8  ref_counts[12];
   1300     uint32 direction;
   1301     uint32 combine_mmu_cos_flags;
   1302     uint32 combine_uc_queueing_flags;
   1303     uint32 combine_congestion_marked_flags;
   1304     uint32 cng;
   1305     uint32 ifp_cng;
   1306     uint32 pre_ifp_color;
   1307     uint32 ifp_color;
   1308     uint32 combine_pre_ifp_color_flags;
   1309     uint32 combine_ifp_color_flags;
   1310     uint32 int_pri;
   1311     uint32 combine_int_pri_flags;
   1312     uint32 vlan_format;
   1313     uint32 combine_vlan_format_flags;
   1314     uint32 outer_dot1p;
   1315     uint32 combine_outer_dot1p_flags;
   1316     uint32 inner_dot1p;
   1317     uint32 combine_inner_dot1p_flags;
   1318     uint32 port;
   1319     uint32 tos_dscp;
   1320     uint32 tos_ecn;
   1321     uint32 pkt_resolution;
   1322     uint32 combine_pkt_resolution_flags;
   1323     uint32 svp_type;
   1324     uint32 dvp_type;
   1325     uint32 drop;
   1326     uint32 combine_drop_flags;
   1327     uint32 ip_pkt;
   1328     uint32 combine_ip_pkt_flags;
   1329     uint32 combine_value_array[bcmStatFlexAttrMax][BCM_STAT_FLEX_BIT_ARRAY_SIZE];
   1330     uint32 combine_pkt_resolution_high_flags;
   1331 } _bcm_stat_flex_compressed_mode_attr_sel_map_t;
   1332 
   1333 #ifdef BCM_WARM_BOOT_SUPPORT
   1334 /* Stat Flex Group Attribute Selector info that needs level 2 WB*/
   1335 typedef struct bcm_stat_group_mode_attr_selector_wb_s {
   1336     uint32 counter_offset;              /* Counter Offset */
   1337     bcm_stat_group_mode_attr_t attr;    /* Attribute Selector */
   1338     uint32 attr_value;                  /* Attribute Values */
   1339 }bcm_stat_group_mode_attr_selector_wb_t;
   1340 typedef struct bcm_stat_flex_group_mode_related_info_s {
   1341     uint32 flags;
   1342     uint32 total_counters;
   1343     uint32 num_selectors;
   1344     bcm_stat_group_mode_attr_selector_wb_t attr_selectors
   1345                                         [BCM_STAT_FLEX_MAX_SELECTORS];
   1346 }bcm_stat_flex_group_mode_related_info_t;
   1347 
   1348 typedef struct bcm_stat_flex_group_mode_related_info_old_s {
   1349     uint32 flags;
   1350     uint32 total_counters;
   1351     uint32 num_selectors;
   1352     bcm_stat_group_mode_attr_selector_wb_t attr_selectors
   1353                                         [256];
   1354 }bcm_stat_flex_group_mode_related_info_old_t;
   1355 typedef struct bcm_stat_flex_custom_mode_related_info_s {
   1356     uint16 custom_mode;
   1357     uint8  offset_mode;
   1358     uint8  AllocPool;
   1359     uint32 fg_id; /*field group id - 0xffffffff means invalid */
   1360 }bcm_stat_flex_custom_mode_related_info_t;
   1361 
   1362 typedef struct bcm_stat_flex_counter_id_related_info_s {
   1363     uint16 mode;
   1364     uint8  pool;
   1365     uint8  used; 
   1366     uint32 base_idx;
   1367     uint16 object;
   1368     uint16 group;
   1369 }bcm_stat_flex_counter_id_related_info_t;
   1370 
   1371 #endif
   1372 #define BCM_MAX_STAT_COUNTER_IDS (152*1024)
   1373 
   1374 typedef struct bcm_stat_flex_flowtracker_pool_info_s {
   1375     uint8  pool_id;
   1376     uint32 start_idx;
   1377     uint32 end_idx;
   1378 }bcm_stat_flex_flowtracker_pool_info_t;
   1379 
   1380 typedef struct bcm_stat_flex_flowtracker_counter_info_s {
   1381     uint8 offset_mode;
   1382     uint8 pool_num;
   1383     bcm_stat_flex_flowtracker_pool_info_t  pool_info[BCM_STAT_TH_FLEX_COUNTER_MAX_POOL];
   1384 }bcm_stat_flex_flowtracker_counter_info_t;
   1385 
   1386 
   1387 #ifdef BCM_WARM_BOOT_SUPPORT
   1388 #include <bcm_int/esw/switch.h>
   1389 #define BCM_STAT_WB_VERSION_1_3                SOC_SCACHE_VERSION(1,3)
   1390 #define BCM_STAT_WB_VERSION_1_4                SOC_SCACHE_VERSION(1,4)
   1391 #define BCM_STAT_WB_VERSION_1_5                SOC_SCACHE_VERSION(1,5)
   1392 #define BCM_STAT_WB_VERSION_1_6                SOC_SCACHE_VERSION(1,6)
   1393 #define BCM_STAT_WB_VERSION_1_7                SOC_SCACHE_VERSION(1,7)
   1394 #define BCM_STAT_WB_VERSION_1_8                SOC_SCACHE_VERSION(1,8)
   1395 #define BCM_STAT_WB_VERSION_1_9                SOC_SCACHE_VERSION(1,9)
   1396 #define BCM_STAT_WB_VERSION_1_10               SOC_SCACHE_VERSION(1,10)
   1397 #define BCM_STAT_WB_VERSION_1_11               SOC_SCACHE_VERSION(1,11)
   1398 #define BCM_STAT_WB_VERSION_1_12               SOC_SCACHE_VERSION(1,12)
   1399 #define BCM_STAT_WB_DEFAULT_VERSION        BCM_STAT_WB_VERSION_1_12
   1400 #endif
   1401 
   1402 /* END: NEW FLEX FEATURE RELATED STUFF */
   1403 
   1404 extern bcm_error_t _bcm_esw_stat_group_create (
   1405                    int                   unit,
   1406                    bcm_stat_object_t     object,
   1407                    bcm_stat_group_mode_t group_mode,
   1408                    uint32                *stat_counter_id,
   1409                    uint32                *num_entries);
   1410 extern bcm_error_t _bcm_esw_stat_group_destroy(
   1411                    int    unit,
   1412                    uint32 stat_counter_id);
   1413 extern bcm_error_t _bcm_esw_stat_flex_get_ingress_mode_info(
   1414                    int                          unit,
   1415                    bcm_stat_flex_mode_t         mode,
   1416                    bcm_stat_flex_ingress_mode_t *ingress_mode);
   1417 extern bcm_error_t _bcm_esw_stat_flex_get_custom_ingress_mode_info(
   1418             int                          unit,
   1419             bcm_stat_flex_mode_t         mode,
   1420             bcm_stat_flex_custom_ingress_mode_t *flex_ingress_mode);
   1421 
   1422 extern bcm_error_t _bcm_esw_stat_flex_update_custom_ingress_mode_info(
   1423             int                          unit,
   1424             bcm_stat_flex_mode_t         mode,
   1425             bcm_stat_flex_custom_ingress_mode_t *flex_ingress_mode);
   1426 
   1427 extern bcm_error_t _bcm_esw_stat_flex_get_egress_mode_info(
   1428                    int                         unit,
   1429                    bcm_stat_flex_mode_t        mode,
   1430                    bcm_stat_flex_egress_mode_t *egress_mode);
   1431 extern bcm_error_t _bcm_esw_stat_flex_get_available_mode(
   1432                    int                       unit,
   1433                    bcm_stat_flex_direction_t direction,
   1434                    bcm_stat_flex_mode_t      *mode);
   1435 extern bcm_error_t _bcm_esw_stat_flex_update_selector_keys_enable_fields(
   1436                    int       unit,
   1437                    soc_reg_t pkt_attr_selector_key_reg,
   1438                    uint64    *pkt_attr_selector_key_reg_value,
   1439                    uint32    ctr_pkt_attr_bit_position,
   1440                    uint32    ctr_pkt_attr_total_bits,
   1441                    uint8     pkt_attr_field_mask_v,
   1442                    uint8     *ctr_current_bit_selector_position);
   1443 extern bcm_error_t _bcm_esw_stat_flex_update_offset_table(
   1444                    int                                unit,
   1445                    bcm_stat_flex_direction_t          direction,
   1446                    soc_mem_t                          flex_ctr_offset_table_mem,
   1447                    bcm_stat_flex_mode_t               mode,
   1448                    uint32                             total_counters,
   1449                    bcm_stat_flex_offset_table_entry_t offset_table_map[256]);
   1450 extern bcm_error_t _bcm_esw_stat_flex_egress_reserve_mode(
   1451                    int                      unit,
   1452                    bcm_stat_flex_mode_t     mode,
   1453                    uint32                   total_counters,
   1454                    bcm_stat_flex_egr_attr_t *egr_attr);
   1455 extern bcm_error_t _bcm_esw_stat_flex_ingress_reserve_mode(
   1456                    int                      unit,
   1457                    bcm_stat_flex_mode_t     mode,
   1458                    uint32                   total_counters,
   1459                    bcm_stat_flex_ing_attr_t *ing_attr);
   1460 extern bcm_error_t _bcm_esw_stat_flex_unreserve_mode(
   1461                    int                       unit,
   1462                    bcm_stat_flex_direction_t direction,
   1463                    bcm_stat_flex_mode_t      mode);
   1464 extern bcm_error_t _bcm_esw_stat_flex_unreserve_flags(
   1465                    int                       unit,
   1466                    bcm_stat_flex_mode_t      mode,
   1467                    uint32                    flags);
   1468 extern 
   1469 bcm_error_t _bcm_esw_stat_flex_update_udf_selector_keys(
   1470             int                                    unit,
   1471             bcm_stat_flex_direction_t              direction,
   1472             soc_reg_t                              pkt_attr_selector_key_reg,
   1473             bcm_stat_flex_udf_pkt_attr_selectors_t *udf_pkt_attr_selectors,
   1474             uint32                                 *total_udf_bits);
   1475 extern bcm_error_t _bcm_esw_stat_flex_init(int unit);
   1476 extern bcm_error_t _bcm_esw_stat_flex_cleanup(int unit);
   1477 extern bcm_error_t _bcm_esw_stat_flex_sync(int unit);
   1478 extern void _bcm_esw_stat_flex_callback(int unit);
   1479 #if defined(BCM_TOMAHAWK_SUPPORT)
   1480 extern bcm_error_t
   1481 bcm_flex_ctr_field_stat_types_get(int unit, uint32 flex_sid, 
   1482                                    bcm_stat_group_mode_attr_selector_t *attr_selectors,
   1483                                    uint32                              *num_selectors);
   1484 extern bcm_stat_counter_map_t *stat_counter_map[SOC_MAX_NUM_DEVICES]; /* Stat counter IDs start from 1 */
   1485 
   1486 extern void 
   1487 _bcm_fill_stat_counter_map(int unit, int id, uint32 mode, uint32 pool, uint32 base_idx,
   1488                         bcm_stat_object_t object, bcm_stat_group_mode_t group);
   1489 extern void 
   1490 _bcm_get_stat_counter_map(int unit, int id, bcm_stat_counter_map_t *stat_ctr_map);
   1491 
   1492 #endif
   1493 #if defined(BCM_TRIUMPH2_SUPPORT) && defined(INCLUDE_L3)
   1494 /* Need to remove it later */
   1495 extern int _bcm_tr2_subport_gport_used(int unit, bcm_gport_t port);
   1496 #endif
   1497 
   1498 extern bcm_error_t _bcm_esw_stat_flex_create_egress_mode (
   1499                    int                      unit,
   1500                    bcm_stat_flex_egr_attr_t *egr_attr,
   1501                    bcm_stat_flex_mode_t     *mode,
   1502                    bcm_stat_flex_attribute_t  *flex_attribute);
   1503 extern bcm_error_t _bcm_esw_stat_flex_create_ingress_mode (
   1504                    int                      unit,
   1505                    bcm_stat_flex_ing_attr_t *ing_attr,
   1506                    bcm_stat_flex_mode_t     *mode,
   1507                    bcm_stat_flex_attribute_t  *flex_attribute);
   1508 extern bcm_error_t _bcm_esw_stat_flex_delete_egress_mode(
   1509                    int                  unit,
   1510                    bcm_stat_flex_mode_t mode);
   1511 extern bcm_error_t _bcm_esw_stat_flex_delete_ingress_flags(
   1512                    int                  unit,
   1513                    bcm_stat_flex_mode_t mode,
   1514                    uint32               flags);
   1515 extern bcm_error_t _bcm_esw_stat_flex_delete_egress_flags(
   1516                    int                  unit,
   1517                    bcm_stat_flex_mode_t mode,
   1518                    uint32               flags);
   1519 extern bcm_error_t _bcm_esw_stat_flex_delete_ingress_mode(
   1520                    int                  unit,
   1521                    bcm_stat_flex_mode_t mode);
   1522 
   1523 
   1524 extern bcm_error_t _bcm_esw_stat_flex_destroy_egress_table_counters(
   1525                    int                  unit,
   1526                    soc_mem_t            egress_table,
   1527                    int                  lookup,
   1528                    bcm_stat_object_t    object,
   1529                    bcm_stat_flex_mode_t offset_mode,
   1530                    uint32               base_idx,
   1531                    uint32               pool_number);
   1532 extern bcm_error_t _bcm_esw_stat_flex_detach_egress_table_counters(
   1533                    int       unit,
   1534                    bcm_stat_object_t object_id,
   1535                    soc_mem_t egress_table,
   1536                    uint32    index);
   1537 extern bcm_error_t _bcm_esw_stat_flex_destroy_ingress_table_counters(
   1538                    int                  unit,
   1539                    soc_mem_t            ingress_table,
   1540                    int                  lookup,
   1541                    bcm_stat_object_t    object,
   1542                    bcm_stat_flex_mode_t offset_mode,
   1543                    uint32               base_idx,
   1544                    uint32               pool_number);
   1545 extern bcm_error_t _bcm_esw_stat_flex_detach_ingress_table_counters1(
   1546                    int                  unit,
   1547                    soc_mem_t            ingress_table,
   1548                    uint32               index,
   1549                    bcm_stat_object_t    object);
   1550 extern bcm_error_t _bcm_esw_stat_flex_detach_ingress_table_counters(
   1551                    int       unit,
   1552                    soc_mem_t ingress_table,
   1553                    uint32    index);
   1554 extern bcm_error_t _bcm_esw_stat_flex_detach_ingress_table_counters_sw(
   1555                     int       unit,
   1556                     soc_mem_t ingress_table,
   1557                     uint32    index,
   1558                     bcm_stat_flex_mode_t offset_mode,
   1559                     uint32               base_idx,
   1560                     uint32               pool_number);
   1561 extern bcm_error_t _bcm_esw_stat_flex_attach_egress_table_counters1(
   1562                    int                  unit,
   1563                    soc_mem_t            egress_table,
   1564                    uint32               index,
   1565                    bcm_stat_flex_mode_t mode,
   1566                    uint32               base_idx,
   1567                    uint32               pool_number,
   1568                    void                 *egress_entry_data1);
   1569 extern bcm_error_t _bcm_esw_stat_flex_attach_egress_table_counters(
   1570                    int                  unit,
   1571                    soc_mem_t            egress_table,
   1572                    uint32               index,
   1573                    bcm_stat_object_t    object_id,
   1574                    bcm_stat_flex_mode_t mode,
   1575                    uint32               base_idx,
   1576                    uint32               pool_number);
   1577 extern bcm_error_t _bcm_esw_stat_flex_create_egress_table_counters(
   1578                    int                  unit,
   1579                    soc_mem_t            egress_table,
   1580                    int                  lookup,
   1581                    bcm_stat_object_t    object,
   1582                    bcm_stat_flex_mode_t mode,
   1583                    uint32               *base_idx,
   1584                    uint32               *pool_number);
   1585 extern bcm_error_t _bcm_esw_stat_flex_attach_ingress_table_counters_update(
   1586                    int                  unit,
   1587                    uint32               pool_number,
   1588                    uint32               pipe_num,
   1589                    uint32               base_idx,
   1590                    bcm_stat_flex_mode_t mode);  
   1591 extern bcm_error_t _bcm_esw_stat_flex_detach_ingress_table_counters_update(
   1592                    int                  unit,
   1593                    uint32               pool_number,
   1594                    uint32               base_idx,
   1595                    bcm_stat_flex_mode_t mode);  
   1596 extern bcm_error_t _bcm_esw_stat_flex_attach_ingress_table_counters2(
   1597                    int                  unit,
   1598                    soc_mem_t            ingress_table,
   1599                    uint32               index,
   1600                    bcm_stat_flex_mode_t mode,
   1601                    uint32               base_idx,
   1602                    uint32               pool_number,
   1603                    bcm_stat_object_t    object,
   1604                    void                 *ingress_entry_data1);
   1605 extern bcm_error_t _bcm_esw_stat_flex_attach_ingress_table_counters1(
   1606                    int                  unit,
   1607                    soc_mem_t            ingress_table,
   1608                    uint32               index,
   1609                    bcm_stat_flex_mode_t mode,
   1610                    uint32               base_idx,
   1611                    uint32               pool_number,
   1612                    void                 *ingress_entry_data1);
   1613 extern bcm_error_t _bcm_esw_stat_flex_attach_ingress_table_counters(
   1614                    int                  unit,
   1615                    soc_mem_t            ingress_table,
   1616                    uint32               index,
   1617                    bcm_stat_flex_mode_t mode,
   1618                    uint32               base_idx,
   1619                    uint32               pool_number);
   1620 extern bcm_error_t _bcm_esw_stat_flex_create_ingress_table_counters(
   1621                    int                  unit,
   1622                    soc_mem_t            ingress_table,
   1623                    int                  lookup,
   1624                    bcm_stat_object_t    object,
   1625                    bcm_stat_flex_mode_t mode,
   1626                    uint32               *base_idx,
   1627                    uint32               *pool_number);
   1628 extern bcm_error_t _bcm_esw_stat_counter_get(
   1629                    int              unit,
   1630                    int              sync_mode,
   1631                    uint32           index,
   1632                    soc_mem_t        table,
   1633                    bcm_stat_object_t object,
   1634                    uint32           byte_flag,
   1635                    uint32           counter_index,
   1636                    bcm_stat_value_t *value);
   1637 extern bcm_error_t _bcm_esw_stat_counter_set(
   1638                    int              unit,
   1639                    uint32           index,
   1640                    soc_mem_t        table,
   1641                    bcm_stat_object_t object,
   1642                    uint32           byte_flag,
   1643                    uint32           counter_index,
   1644                    bcm_stat_value_t *value);
   1645 extern bcm_error_t _bcm_esw_stat_counter_raw_get(
   1646                    int              unit,
   1647                    int              sync_mode,
   1648                    uint32           stat_counter_id,
   1649                    uint32           byte_flag,
   1650                    uint32           counter_index,
   1651                    bcm_stat_value_t *value);
   1652 extern bcm_error_t _bcm_esw_stat_counter_raw_set(
   1653             int              unit,
   1654             uint32           stat_counter_id,
   1655             uint32           byte_flag,
   1656             uint32           counter_index,
   1657             bcm_stat_value_t *value);
   1658 extern bcm_error_t _bcm_esw_stat_flex_get_table_info(
   1659                    int                       unit,
   1660                    bcm_stat_object_t         object,
   1661                    uint32                    expected_num_tables,
   1662                    uint32                    *actual_num_tables,
   1663                    soc_mem_t                 *table,
   1664                    bcm_stat_flex_direction_t *direction);
   1665 extern bcm_error_t _bcm_esw_stat_flex_reset_group_mode(
   1666                    int                       unit,
   1667                    bcm_stat_flex_direction_t direction,
   1668                    uint32                    offset_mode,
   1669                    bcm_stat_group_mode_t     group_mode);
   1670 extern bcm_error_t _bcm_esw_stat_flex_set_group_mode(
   1671                    int                       unit,
   1672                    bcm_stat_flex_direction_t direction,
   1673                    uint32                    offset_mode,
   1674                    bcm_stat_group_mode_t     group_mode);
   1675 extern void  _bcm_esw_stat_flex_show_mode_info(int unit); 
   1676 extern bcm_error_t _bcm_esw_stat_flex_get_ingress_object(
   1677                    int               unit,
   1678                    soc_mem_t         ingress_table,
   1679                    uint32            table_index,
   1680                    void              *ingress_entry,
   1681                    bcm_stat_object_t *object);
   1682 extern bcm_error_t _bcm_esw_stat_flex_get_egress_object(
   1683                    int               unit,
   1684                    soc_mem_t         egress_table,
   1685                    uint32            table_index,
   1686                    void              *ingress_entry,
   1687                    bcm_stat_object_t *object);
   1688 extern bcm_error_t _bcm_esw_stat_flex_get_counter_id(
   1689                    int                        unit,
   1690                    uint32                     num_of_tables,
   1691                    bcm_stat_flex_table_info_t *table_info,
   1692                    uint32                     *num_stat_counter_ids,
   1693                    uint32                     *stat_counter_id);
   1694 #if defined(BCM_TRIDENT2PLUS_SUPPORT) && defined (INCLUDE_L3)
   1695 extern bcm_error_t _bcm_esw_stat_flex_get_multi_counter_id(
   1696                    int                        unit,
   1697                    bcm_stat_flex_table_info_t *table_info,
   1698                    int                        *num_stat_counter_ids,
   1699                    uint32                     *stat_counter_id);
   1700 #endif
   1701 extern void _bcm_esw_stat_group_dump_info(
   1702             int unit,
   1703             int all_flag,
   1704             bcm_stat_object_t object,
   1705             bcm_stat_group_mode_t group);
   1706 extern void _bcm_esw_stat_get_counter_id(
   1707             int                   unit,
   1708             bcm_stat_group_mode_t group,
   1709             bcm_stat_object_t     object,
   1710             uint32                mode,
   1711             uint32                pool_number,
   1712             uint32                base_idx,
   1713             uint32                *stat_counter_id);
   1714 extern void _bcm_esw_stat_counter_id_retrieve(
   1715             int                   unit,
   1716             bcm_stat_group_mode_t group,
   1717             bcm_stat_object_t     object,
   1718             uint32                mode,
   1719             uint32                pool_number,
   1720             uint32                base_idx,
   1721             uint32                *stat_counter_id);
   1722 extern void _bcm_esw_stat_get_counter_id_info(
   1723             int                   unit,
   1724             uint32                stat_counter_id,
   1725             bcm_stat_group_mode_t *group,
   1726             bcm_stat_object_t     *object,
   1727             uint32                *mode,
   1728             uint32                *pool_number,
   1729             uint32                *base_idx);
   1730 
   1731 extern bcm_error_t _bcm_esw_stat_id_validate(int unit, uint32 stat_counter_id);
   1732 
   1733 extern bcm_error_t _bcm_esw_stat_total_counters_get(int unit, uint32  stat_counter_id, uint32 *total_counters);
   1734 
   1735 extern bcm_error_t _bcm_flex_ctr_field_stat_types_get(int unit, uint32 flex_sid,
   1736                             bcm_stat_group_mode_attr_selector_t *attr_selectors,
   1737                                                       uint32 *num_selectors);
   1738 
   1739 extern void _bcm_esw_stat_flex_init_pkt_attr_bits(int unit);
   1740 extern void _bcm_esw_stat_flex_init_pkt_res_fields(int unit);
   1741 extern uint32 _bcm_esw_stat_flex_get_pkt_res_value(
   1742               int unit,
   1743               uint32 pkt_res_field);
   1744 extern bcm_error_t _bcm_esw_get_flex_counter_fields_values(int unit, 
   1745                                                            uint32 index,
   1746                                                            soc_mem_t table,
   1747                                                            void *data,
   1748                                                            bcm_stat_object_t object,
   1749                                                            uint32 *offset_mode,
   1750                                                            uint32 *pool_number,
   1751                                                            uint32 *base_idx);
   1752 extern bcm_error_t _bcm_esw_set_flex_counter_fields_values(int       unit,
   1753                                                            uint32    index, 
   1754                                                            soc_mem_t table,
   1755                                                            void      *data,
   1756                                                            bcm_stat_object_t object,
   1757                                                            uint32    offset_mode,
   1758                                                            uint32    pool_number,
   1759                                                            uint32    base_idx
   1760 );
   1761 extern bcm_error_t _bcm_esw_stat_validate_object(
   1762                    int                       unit,
   1763                    bcm_stat_object_t         object,
   1764                    bcm_stat_flex_direction_t *direction);
   1765 extern bcm_error_t _bcm_esw_stat_validate_group(
   1766                    int                   unit,
   1767                    bcm_stat_group_mode_t group);
   1768 extern bcm_error_t _bcm_esw_stat_flex_pool_operation(
   1769                    int                            unit,
   1770                    bcm_stat_flex_pool_attribute_t *flex_pool_attribute);
   1771 
   1772 extern bcm_error_t _bcm_esw_stat_id_get_all( int unit, bcm_stat_object_t object,
   1773                                      int stat_max, uint32 *stat_array,
   1774                                      int *stat_count);
   1775 
   1776 extern bcm_error_t _bcm_esw_stat_object_pool_num_get( int unit,
   1777                                  bcm_stat_object_t object, uint32 *pool_num);
   1778 
   1779 /* Retrieves the flex counter details for a given direction and pipe */
   1780 extern int _bcm_esw_stat_flex_pipe_pool_info_multi_get(
   1781     int unit,
   1782     bcm_stat_flex_direction_t direction,
   1783     uint32 pipe_num,
   1784     uint32 num_pools,
   1785     bcm_stat_flex_pool_stat_info_t *flex_pool_stat_info,
   1786     uint32 *actual_num_pools);
   1787 
   1788 extern int _bcm_esw_stat_flex_pool_info_multi_get(
   1789     int unit,
   1790     bcm_stat_flex_direction_t direction,
   1791     uint32 num_pools,
   1792     bcm_stat_flex_pool_stat_info_t *flex_pool_stat,
   1793     uint32 *actual_num_pools);
   1794 /* Create Customized Stat Group mode for given Counter Attributes */
   1795 extern int _bcm_esw_stat_group_mode_id_create(
   1796     int unit,
   1797     uint32 flags,
   1798     uint32 total_counters,
   1799     uint32 num_selectors,
   1800     bcm_stat_group_mode_attr_selector_t *attr_selectors,
   1801     uint32 *mode_id);
   1802 
   1803 /* Retrieves Customized Stat Group mode Attributes for given mode_id */
   1804 extern int _bcm_esw_stat_group_mode_id_get(
   1805     int unit,
   1806     uint32 mode_id,
   1807     uint32 *flags,
   1808     uint32 *total_counters,
   1809     uint32 num_selectors,
   1810     bcm_stat_group_mode_attr_selector_t *attr_selectors,
   1811     uint32 *actual_num_selectors);
   1812 
   1813 /* Destroys Customized Group mode */
   1814 extern int _bcm_esw_stat_group_mode_id_destroy(
   1815     int unit,
   1816     uint32 mode_id);
   1817 
   1818 /* Associate an accounting object to customized group mode */
   1819 extern int _bcm_esw_stat_custom_group_create(
   1820     int unit,
   1821     uint32 mode_id,
   1822     bcm_stat_object_t object,
   1823     uint32 *stat_counter_id,
   1824     uint32 *num_entries);
   1825 
   1826 extern int _bcm_esw_stat_group_mode_id_config_create(
   1827     int unit,
   1828     uint32 options,
   1829     bcm_stat_group_mode_id_config_t *stat_config,
   1830     uint32 num_selectors,
   1831     bcm_stat_group_mode_attr_selector_t *attr_sel,
   1832     uint32 *mode_id);
   1833 
   1834 bcm_error_t 
   1835 _bcm_esw_stat_group_mode_id_config_get(
   1836     int unit,
   1837     uint32 mode_id,
   1838     bcm_stat_group_mode_id_config_t *stat_config,
   1839     uint32 num_selectors,
   1840     bcm_stat_group_mode_attr_selector_t *attr_sel,
   1841     uint32 *actual_num_selectors);
   1842 
   1843 extern bcm_stat_flex_ing_pkt_attr_bits_t ing_pkt_attr_uncmprsd_bits_g[BCM_MAX_NUM_UNITS];
   1844 extern bcm_stat_flex_ing_pkt_attr_bits_t ing_pkt_attr_cmprsd_bits_g[BCM_MAX_NUM_UNITS];
   1845 extern bcm_stat_flex_egr_pkt_attr_bits_t egr_pkt_attr_uncmprsd_bits_g[BCM_MAX_NUM_UNITS];
   1846 extern bcm_stat_flex_egr_pkt_attr_bits_t egr_pkt_attr_cmprsd_bits_g[BCM_MAX_NUM_UNITS];
   1847 extern bcm_error_t _bcm_esw_stat_flex_update_ingress_flex_info(
   1848             int                                 unit,
   1849             bcm_stat_flex_mode_t                mode,
   1850             uint32                              flags,
   1851             uint32                              num_selectors,
   1852             bcm_stat_group_mode_attr_selector_t *attr_selectors);
   1853 extern bcm_error_t _bcm_esw_stat_flex_update_egress_flex_info(
   1854             int                                 unit,
   1855             bcm_stat_flex_mode_t                mode,
   1856             uint32                              flags,
   1857             uint32                              num_selectors,
   1858             bcm_stat_group_mode_attr_selector_t *attr_selectors);
   1859 
   1860 extern void _bcm_esw_stat_flex_check_egress_mpls_tunnel_table(int unit);
   1861 
   1862 extern
   1863 int _bcm_esw_stat_flex_compress_mode_id_compare(
   1864         int                                       unit,
   1865         bcm_stat_flex_direction_t                 direction,
   1866         bcm_stat_flex_mode_t                      *mode,
   1867         bcm_stat_flex_attribute_t  *flex_attribute);
   1868 
   1869 extern
   1870 int _bcm_stat_flex_compressed_attr_tbl_write(int unit,
   1871         bcm_stat_flex_direction_t direction,
   1872         bcm_stat_flex_ing_cmprsd_attr_selectors_t *cmprsd_attr_selectors,
   1873         bcm_stat_flex_egr_cmprsd_attr_selectors_t *egr_cmprsd_attr_selectors);
   1874 extern
   1875 int _bcm_stat_flex_compressed_attr_tbl_clear(int unit,
   1876         bcm_stat_flex_direction_t direction,
   1877         bcm_stat_flex_ing_cmprsd_attr_selectors_t *cmprsd_attr_selectors,
   1878         bcm_stat_flex_egr_cmprsd_attr_selectors_t *egr_cmprsd_attr_selectors);
   1879 
   1880 extern
   1881 int _bcm_esw_stat_flex_compressed_shared_attr_map_init(int unit,int alloc);
   1882 
   1883 extern
   1884 int _bcm_esw_stat_flex_compressed_attr_flags_recover(int unit,
   1885     uint8 **scache_position);
   1886 
   1887 extern
   1888 int _bcm_esw_stat_flex_compressed_attr_flags_sync(int unit,
   1889         uint8 **scache_position);
   1890 
   1891 /* FLEX COUNTER FLEXIBLE POOL ALLOCATION AND
   1892  * COMPACTION SUPPORT
   1893  */
   1894 typedef struct compaction_status_s {
   1895    uint32 pool_number;
   1896    uint32 base_idx;
   1897    int    in_progress;
   1898 }compaction_status_t;
   1899 
   1900 extern
   1901 int _bcm_esw_stat_custom_group_id_create(int  unit,
   1902         uint32                         mode_id,
   1903         bcm_stat_object_t              object,
   1904         uint32                         pool_id,
   1905         uint32                         base_idx,
   1906         bcm_stat_custom_counter_info_t *counter_info);
   1907 
   1908 extern
   1909 int _bcm_stat_flex_reserve_base_index(int unit,
   1910         bcm_stat_flex_direction_t direction, 
   1911         uint32 pool_number_l, uint32 total_counters,
   1912         uint32 base_idx, uint32 used_by_table,
   1913         uint32 pipe_num, bcm_stat_object_t object);
   1914 
   1915 extern
   1916 int _bcm_stat_flex_counter_id_move (int   unit,
   1917         bcm_stat_custom_base_index_action_t idx_action,
   1918         bcm_stat_custom_counter_info_t   counter_info_old,
   1919         bcm_stat_custom_counter_info_t   *counter_info_new);
   1920 
   1921 extern
   1922 int _bcm_stat_flex_counter_base_idx_move(int unit,
   1923         bcm_stat_custom_counter_info_t   counter_info_old,
   1924         bcm_stat_custom_counter_info_t   *counter_info_new);
   1925 extern
   1926 int _bcm_stat_flex_dump_pool_info(int unit);
   1927 
   1928 extern
   1929 int _bcm_esw_stat_validate_counter_info(int unit,
   1930         bcm_stat_custom_counter_info_t   counter_info_old,
   1931         bcm_stat_custom_counter_info_t   *counter_info_new);
   1932 #if defined(BCM_TOMAHAWK_SUPPORT)
   1933 /* Accessor functions to set/get ifp color map database */
   1934 extern bcm_error_t _bcm_esw_ifp_color_map_set(
   1935         int                   unit,
   1936         uint32                stat_counter_id,
   1937         _bcm_ifp_color_map_t  *color_map);
   1938 extern bcm_error_t _bcm_esw_ifp_color_map_get(
   1939         int                   unit,
   1940         uint32                stat_counter_id,
   1941         _bcm_ifp_color_map_t  *color_map);
   1942 bcm_error_t _bcm_esw_get_fp_pipe_from_mode(int unit, int offset_mode, bcm_field_qualify_t stage, int *pipe);
   1943 int _bcm_esw_get_fp_mode_global(int unit, bcm_field_qualify_t stage);
   1944 bcm_field_qualify_t _bcm_esw_stat_get_field_stage_from_stat_ctr(int unit,
   1945                                                  uint32 stat_counter_id);
   1946 bcm_error_t _bcm_esw_stat_flex_get_hw_mode(int unit, uint32 mode_id, uint32 *hw_mode_id);
   1947 bcm_error_t _bcm_esw_stat_flex_check_ingress_em_table_entry(
   1948     int               unit,
   1949     soc_mem_t         ingress_table,
   1950     _field_stage_id_t field_stage,
   1951     uint32            offset_mode,
   1952     uint32            pool_number,
   1953     uint32            base_idx);
   1954 void stat_ctr_map_init(int unit);
   1955 void stat_ctr_map_deinit(int unit);
   1956 int _bcm_esw_stat_pool_reserved(int unit,
   1957                             bcm_stat_flex_direction_t direction, int pool);
   1958 int _bcm_esw_stat_mod_reserved(int unit, int mode_id);
   1959 extern bcm_error_t _bcm_stat_flex_flowtracker_counter_info_get(int unit,
   1960                             bcm_stat_flex_flowtracker_counter_info_t *info);
   1961 #endif /* BCM_TOMAHAWK_SUPPORT */
   1962 #if defined(BCM_TOMAHAWK_SUPPORT) || defined(BCM_TRIDENT2PLUS_SUPPORT)
   1963 bcm_field_qualify_t _bcm_esw_stat_get_field_stage_from_table(soc_mem_t ingress_table); 
   1964 #if defined(BCM_TRIDENT3_SUPPORT) || defined(BCM_TOMAHAWK3_SUPPORT)
   1965 extern bcm_error_t _bcm_esw_stat_flex_get_custom_egress_mode_info(
   1966             int                          unit,
   1967             bcm_stat_flex_mode_t         mode,
   1968             bcm_stat_flex_custom_egress_mode_t *flex_egress_mode);
   1969 
   1970 extern bcm_error_t _bcm_esw_stat_flex_update_custom_egress_mode_info(
   1971             int                          unit,
   1972             bcm_stat_flex_mode_t         mode,
   1973             bcm_stat_flex_custom_egress_mode_t *flex_egress_mode);
   1974 #endif
   1975 
   1976 #endif
   1977 
   1978 #if defined(BCM_KATANA2_SUPPORT)
   1979 
   1980 typedef struct class_attr_combine_s {
   1981     uint32 **class_pkt_attr_comb;
   1982 }class_attr_combine_t;
   1983 
   1984 extern int _bcm_esw_stat_group_mode_attr_class_id_create(
   1985                int unit,
   1986                bcm_stat_group_mode_attr_t attr,
   1987                int num_of_attr_values,
   1988                uint32 *attr_values,
   1989                bcm_stat_group_mode_attr_class_id_t *attr_class_id);
   1990 
   1991 extern int _bcm_esw_stat_group_mode_attr_class_id_destroy(
   1992                 int unit,
   1993                 bcm_stat_group_mode_attr_class_id_t attr_class_id);
   1994 
   1995 extern int _bcm_esw_stat_group_mode_attr_class_id_cleanup(int unit);
   1996 
   1997 extern int _bcm_esw_stat_combine_attr_matrix_init(int unit,
   1998                int *size);
   1999 
   2000 extern int _bcm_esw_stat_flex_compressed_attr_matrix_sync(int unit,
   2001                uint8 **scache_position);
   2002 
   2003 extern int _bcm_esw_stat_flex_compressed_attr_matrix_recover(int unit,
   2004                uint8 **scache_position);
   2005 
   2006 #endif
   2007 
   2008 #if defined(BCM_TRIDENT3_SUPPORT) || defined(BCM_APACHE_SUPPORT)
   2009 typedef struct stat_port_group_s {
   2010     pbmp_t port_grp_id_bmap;
   2011     pbmp_t *port_grp_bmap;
   2012 }stat_port_group_t;
   2013 
   2014 extern int
   2015 _bcm_esw_stat_combine_port_bitmap_cleanup(int unit);
   2016 
   2017 extern int
   2018 _bcm_esw_stat_combine_port_bitmap_init(int unit,
   2019                                        int *size);
   2020 
   2021 extern int
   2022 _bcm_esw_stat_port_group_create(int unit,
   2023         uint32 num_gports,
   2024         bcm_gport_t *gport,
   2025         uint32 *group_id);
   2026 
   2027 extern int
   2028 _bcm_esw_stat_port_group_destroy(int unit,
   2029         uint32 group_id);
   2030 
   2031 extern int
   2032 _bcm_esw_stat_combine_port_bitmap_sync(int unit,
   2033         uint8 **scache_position);
   2034 
   2035 extern int
   2036 _bcm_esw_stat_combine_port_bitmap_recover(int unit,
   2037         uint8 **scache_position);
   2038 
   2039 extern int
   2040 bcmi_flex_ctr_update_portmap(int unit, int mode, int valid, int dir);
   2041 
   2042 extern int
   2043 bcmi_flex_ctr_cmpsd_port_sanitize(int unit, int mode, int dir,
   2044         bcm_stat_flex_ing_cmprsd_attr_selectors_t *icmprsd_attr_selectors,
   2045         bcm_stat_flex_egr_cmprsd_attr_selectors_t *ecmprsd_attr_selectors,
   2046         int match);
   2047 
   2048 extern int
   2049 _bcm_esw_stat_attr_subport_only(int unit,
   2050                     bcm_stat_group_mode_attr_selector_t *attr_selectors,
   2051                     int num_selectors);
   2052 
   2053 #if defined(BCM_CHANNELIZED_SWITCHING_SUPPORT)
   2054 /* FlexCounter Related */
   2055 typedef struct bcmi_flex_ctr_subport_info_s {
   2056     int port_map_valid;
   2057     int pool;
   2058     uint8 portmap[FB6_TOTAL_NUM_SUBPORT];
   2059 } bcmi_flex_ctr_subport_info_t;
   2060 
   2061 /* ING and EGR portmap for 4 modes */
   2062 extern bcmi_flex_ctr_subport_info_t ing_port_map_info[BCM_MAX_NUM_UNITS][BCM_STAT_FLEX_COUNTER_MAX_MODE];
   2063 extern bcmi_flex_ctr_subport_info_t egr_port_map_info[BCM_MAX_NUM_UNITS][BCM_STAT_FLEX_COUNTER_MAX_MODE];
   2064 
   2065 extern void
   2066 bcmi_flex_ctr_portmap_info_init(int unit);
   2067 #endif
   2068 
   2069 #endif
   2070 #endif /* __BCM_FLEX_CTR_H__ */