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


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