openbcm

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

field.h (28130B)


      1 /*! \file field.h
      2  *
      3  * Field header file.
      4  * This file contains the management for Field.
      5  */
      6 /*
      7  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      8  * 
      9  * Copyright 2007-2020 Broadcom Inc. All rights reserved.
     10  */
     11 
     12 #ifndef BCMI_LTSW_FIELD_H
     13 #define BCMI_LTSW_FIELD_H
     14 
     15 #include <bcm/field.h>
     16 #include <bcm_int/ltsw/flexctr.h>
     17 
     18 /******************************************************************************
     19  * Defines
     20  */
     21 /*! Invalid field action. */
     22 #define BCMI_LTSW_FIELD_ACTION_INVALID  (0)
     23 
     24 /*! Divison factor to caliculate the depth of hash table for
     25  * entries.
     26  */
     27 #define BCMI_LTSW_FIELD_HASH_DIV_FACTOR (4)
     28 
     29 /* Flags for field qualifier type. */
     30 #define BCM_FIELD_F_ENUM    0x1
     31 #define BCM_FIELD_F_STRUCT  0x2
     32 #define BCM_FIELD_F_ARRAY   0x4
     33 #define BCM_FIELD_F_BMP     0x8
     34 
     35 /* Maximum LT field offset/width map */
     36 #define BCM_FIELD_QUAL_LT_FIELD_MAP_MAX     4
     37 
     38 /*! Maximum number of color action table pools. */
     39 #define BCM_FIELD_COLOR_ACTION_POOL_MAX     (8)
     40 
     41 /*! Macros to map the .em field of qualifier map */
     42 #define BCMI_FIELD_STAGE_LTMAP_ALL           0x00
     43 #define BCMI_FIELD_STAGE_LTMAP_IFP_ONLY      0x01
     44 #define BCMI_FIELD_STAGE_LTMAP_EM_ONLY       0x02
     45 #define BCMI_FIELD_STAGE_LTMAP_EM_WITHOUT_PDD 0x04
     46 
     47 /*
     48  * Internal version of qset add.
     49  */
     50 #define _BCMI_FIELD_BITS_OP(_a, _b, _max, _op)                        \
     51         {                                                        \
     52            int _ct;                                              \
     53            int _max_w = (_max + SHR_BITWID - 1)/SHR_BITWID;      \
     54            for (_ct = 0; _ct < (_max_w); _ct++) {                \
     55                (_a)[_ct] _op (_b)[_ct];                          \
     56            }                                                     \
     57         }
     58 #define BCMI_FIELD_QSET_ADD(qset, q)     SHR_BITSET(((qset).w), (q))
     59 #define BCMI_FIELD_QSET_REMOVE(qset, q)  SHR_BITCLR(((qset).w), (q))
     60 #define BCMI_FIELD_QSET_TEST(qset, q)    SHR_BITGET(((qset).w), (q))
     61 #define BCMI_FIELD_QSET_OR(_qset, _qset_new, _max_count)  \
     62         _BCMI_FIELD_BITS_OP(_qset.w, _qset_new.w, _max_count, |=)
     63 #define BCMI_FIELD_ASET_OR(_aset, _aset_new, _max_count)  \
     64         _BCMI_FIELD_BITS_OP(_aset.w, _aset_new.w, _max_count, |=)
     65 
     66 #define BCMI_FIELD_STAGE_STRINGS \
     67     {"Ingress",            \
     68      "Egress",             \
     69      "Lookup",             \
     70      "ExactMatch",         \
     71      "Flowtracker"}
     72 /******************************************************************************
     73  * LTSW field enumerations
     74  */
     75 
     76 /*!
     77  * \brief Field stages.
     78  */
     79 typedef enum bcmi_ltsw_field_stage_s {
     80 
     81     /*! IFP. */
     82     bcmiFieldStageIngress = 0,
     83 
     84     /*! EFP. */
     85     bcmiFieldStageEgress = 1,
     86 
     87     /*! VFP. */
     88     bcmiFieldStageVlan = 2,
     89 
     90     /*! EM. */
     91     bcmiFieldStageExactMatch = 3,
     92 
     93     /*! Flow Tracker. */
     94     bcmiFieldStageFlowTracker = 4,
     95 
     96     /*! Always last one. */
     97     bcmiFieldStageCount = 5
     98 
     99 } bcmi_ltsw_field_stage_t;
    100 
    101 /*!
    102  * \brief Field operational modes.
    103  */
    104 typedef enum bcmi_ltsw_field_oper_mode_s {
    105 
    106     /* Operation mode - Global. */
    107     bcmiFieldOperModeGlobal = 0,
    108 
    109     /* Operation mode - Pipe Unique. */
    110     bcmiFieldOperModePipeUnique = 1,
    111 
    112     /* Operation mode - Global Pipe Aware. */
    113     bcmiFieldOperModeGlobalPipeAware = 2,
    114 
    115     /*! Always last one. */
    116     bcmiFieldOperModeCount = 3
    117 
    118 } bcmi_ltsw_field_oper_mode_t;
    119 
    120 /* Enum for qualifier datatypes. */
    121 typedef enum bcm_qual_data_type_e {
    122     BCM_QUAL_DATA_TYPE_INT,
    123     BCM_QUAL_DATA_TYPE_UINT64,
    124     BCM_QUAL_DATA_TYPE_UINT32,
    125     BCM_QUAL_DATA_TYPE_UINT16,
    126     BCM_QUAL_DATA_TYPE_UINT8,
    127     BCM_QUAL_DATA_TYPE_MAC,
    128     BCM_QUAL_DATA_TYPE_IP,
    129     BCM_QUAL_DATA_TYPE_IP6,
    130     BCM_QUAL_DATA_TYPE_PBMP,
    131     BCM_QUAL_DATA_TYPE_PORT,
    132     BCM_QUAL_DATA_TYPE_GPORT,
    133     BCM_QUAL_DATA_TYPE_L4_PORT,
    134     BCM_QUAL_DATA_TYPE_TRUNK,
    135     BCM_QUAL_DATA_TYPE_VLAN,
    136     BCM_QUAL_DATA_TYPE_VPN,
    137     BCM_QUAL_DATA_TYPE_IF,
    138     BCM_QUAL_DATA_TYPE_IF_GROUP,
    139     BCM_QUAL_DATA_TYPE_VRF,
    140     BCM_QUAL_DATA_TYPE_COS,
    141     BCM_QUAL_DATA_TYPE_MULTICAST,
    142     BCM_QUAL_DATA_TYPE_MPLS_LABEL,
    143     BCM_QUAL_DATA_TYPE_NAT_ID,
    144     BCM_QUAL_DATA_TYPE_CLASS,
    145     BCM_QUAL_DATA_TYPE_TRILL_NAME,
    146     BCM_QUAL_DATA_TYPE_CUSTOM,
    147     BCM_QUAL_DATA_TYPE_STG,
    148     BCM_QUAL_DATA_TYPE_INVALID,
    149     BCM_QUAL_DATA_TYPE_LLC,
    150     BCM_QUAL_DATA_TYPE_SNAP,
    151 } bcm_qual_data_type_t;
    152 
    153 /* Internal qualifiers. */
    154 typedef enum bcmi_field_qualify_e {
    155     bcmiFieldQualifyB4Chunk0 = bcmFieldQualifyCount,
    156                                        /* [00] 1-byte chunk qualifier 0.  */
    157     bcmiFieldQualifyB4Chunk1,          /* [01] 1-byte chunk qualifier 1.  */
    158     bcmiFieldQualifyB4Chunk2,          /* [02] 1-byte chunk qualifier 2.  */
    159     bcmiFieldQualifyB4Chunk3,          /* [03] 1-byte chunk qualifier 3.  */
    160     bcmiFieldQualifyB4Chunk4,          /* [04] 1-byte chunk qualifier 4.  */
    161     bcmiFieldQualifyB4Chunk5,          /* [05] 1-byte chunk qualifier 5.  */
    162     bcmiFieldQualifyB4Chunk6,          /* [06] 1-byte chunk qualifier 6.  */
    163     bcmiFieldQualifyB4Chunk7,          /* [07] 1-byte chunk qualifier 7.  */
    164     bcmiFieldQualifyB4Chunk8,          /* [08] 1-byte chunk qualifier 8.  */
    165     bcmiFieldQualifyB4Chunk9,          /* [09] 1-byte chunk qualifier 9.  */
    166     bcmiFieldQualifyB4Chunk10,         /* [10] 1-byte chunk qualifier 10. */
    167     bcmiFieldQualifyB4Chunk11,         /* [11] 1-byte chunk qualifier 11. */
    168     bcmiFieldQualifyB4Chunk12,         /* [12] 1-byte chunk qualifier 12. */
    169     bcmiFieldQualifyB4Chunk13,         /* [13] 1-byte chunk qualifier 13. */
    170     bcmiFieldQualifyB4Chunk14,         /* [14] 1-byte chunk qualifier 14. */
    171     bcmiFieldQualifyB4Chunk15,         /* [15] 1-byte chunk qualifier 15. */
    172     bcmiFieldQualifyB4Chunk16,         /* [16] 1-byte chunk qualifier 16. */
    173     bcmiFieldQualifyB2Chunk0,          /* [17] 2-byte chunk qualifier 0.  */
    174     bcmiFieldQualifyB2Chunk1,          /* [18] 2-byte chunk qualifier 1.  */
    175     bcmiFieldQualifyB2Chunk2,          /* [19] 2-byte chunk qualifier 2.  */
    176     bcmiFieldQualifyB2Chunk3,          /* [20] 2-byte chunk qualifier 3.  */
    177     bcmiFieldQualifyB2Chunk4,          /* [21] 2-byte chunk qualifier 4.  */
    178     bcmiFieldQualifyB2Chunk5,          /* [22] 2-byte chunk qualifier 5.  */
    179     bcmiFieldQualifyB2Chunk6,          /* [23] 2-byte chunk qualifier 6.  */
    180     bcmiFieldQualifyB2Chunk7,          /* [24] 2-byte chunk qualifier 7.  */
    181     bcmiFieldQualifyB2Chunk8,          /* [25] 2-byte chunk qualifier 8.  */
    182     bcmiFieldQualifyB2Chunk9,          /* [26] 2-byte chunk qualifier 9.  */
    183     bcmiFieldQualifyB2Chunk10,         /* [27] 2-byte chunk qualifier 10. */
    184     bcmiFieldQualifyB2Chunk11,         /* [28] 2-byte chunk qualifier 11. */
    185     bcmiFieldQualifyB2Chunk12,         /* [29] 2-byte chunk qualifier 12. */
    186     bcmiFieldQualifyB2Chunk13,         /* [30] 2-byte chunk qualifier 13. */
    187     bcmiFieldQualifyB2Chunk14,         /* [31] 2-byte chunk qualifier 14. */
    188     bcmiFieldQualifyB2Chunk15,         /* [32] 2-byte chunk qualifier 15. */
    189     bcmiFieldQualifyB2Chunk16,         /* [33] 2-byte chunk qualifier 16. */
    190     bcmiFieldQualifyB1Chunk0,          /* [34] 4-byte chunk qualifier 0.  */
    191     bcmiFieldQualifyB1Chunk1,          /* [35] 4-byte chunk qualifier 1.  */
    192     bcmiFieldQualifyB1Chunk2,          /* [36] 4-byte chunk qualifier 2.  */
    193     bcmiFieldQualifyB1Chunk3,          /* [37] 4-byte chunk qualifier 3.  */
    194     bcmiFieldQualifyB1Chunk4,          /* [38] 4-byte chunk qualifier 4.  */
    195     bcmiFieldQualifyB1Chunk5,          /* [39] 4-byte chunk qualifier 5.  */
    196     bcmiFieldQualifyB1Chunk6,          /* [40] 4-byte chunk qualifier 6.  */
    197     bcmiFieldQualifyB1Chunk7,          /* [41] 4-byte chunk qualifier 7.  */
    198     bcmiFieldQualifyB1Chunk8,          /* [42] 4-byte chunk qualifier 8.  */
    199     bcmiFieldQualifyB1Chunk9,          /* [43] 4-byte chunk qualifier 9.  */
    200     bcmiFieldQualifyB1Chunk10,         /* [44] 4-byte chunk qualifier 10. */
    201     bcmiFieldQualifyB1Chunk11,         /* [45] 4-byte chunk qualifier 11. */
    202     bcmiFieldQualifyB1Chunk12,         /* [46] 4-byte chunk qualifier 12. */
    203     bcmiFieldQualifyB1Chunk13,         /* [47] 4-byte chunk qualifier 13. */
    204     bcmiFieldQualifyB1Chunk14,         /* [48] 4-byte chunk qualifier 14. */
    205     bcmiFieldQualifyB1Chunk15,         /* [49] 4-byte chunk qualifier 15. */
    206     bcmiFieldQualifyB1Chunk16,         /* [50] 4-byte chunk qualifier 16. */
    207     bcmiFieldQualifyUdfExtOuter,       /* [51] UDF Extraction Outer Payload. */
    208     bcmiFieldQualifyUdfExtInner,       /* [52] UDF Extraction Inner Payload. */
    209     bcmiFieldQualifyLastCount,         /* [53] Last Count                 */
    210 } bcmi_field_qualify_t;
    211 
    212 /* Internal qualifiers. */
    213 #define _BCMI_FIELD_QUALIFY_STRINGS \
    214 { \
    215     "B4Chunk0", \
    216     "B4Chunk1", \
    217     "B4Chunk2", \
    218     "B4Chunk3", \
    219     "B4Chunk4", \
    220     "B4Chunk5", \
    221     "B4Chunk6", \
    222     "B4Chunk7", \
    223     "B4Chunk8", \
    224     "B4Chunk9", \
    225     "B4Chunk10", \
    226     "B4Chunk11", \
    227     "B4Chunk12", \
    228     "B4Chunk13", \
    229     "B4Chunk14", \
    230     "B4Chunk15", \
    231     "B4Chunk16", \
    232     "B2Chunk0", \
    233     "B2Chunk1", \
    234     "B2Chunk2", \
    235     "B2Chunk3", \
    236     "B2Chunk4", \
    237     "B2Chunk5", \
    238     "B2Chunk6", \
    239     "B2Chunk7", \
    240     "B2Chunk8", \
    241     "B2Chunk9", \
    242     "B2Chunk10", \
    243     "B2Chunk11", \
    244     "B2Chunk12", \
    245     "B2Chunk13", \
    246     "B2Chunk14", \
    247     "B2Chunk15", \
    248     "B2Chunk16", \
    249     "B1Chunk0", \
    250     "B1Chunk1", \
    251     "B1Chunk2", \
    252     "B1Chunk3", \
    253     "B1Chunk4", \
    254     "B1Chunk5", \
    255     "B1Chunk6", \
    256     "B1Chunk7", \
    257     "B1Chunk8", \
    258     "B1Chunk9", \
    259     "B1Chunk10", \
    260     "B1Chunk11", \
    261     "B1Chunk12", \
    262     "B1Chunk13", \
    263     "B1Chunk14", \
    264     "B1Chunk15", \
    265     "B1Chunk16", \
    266     "UdfExtOuter", \
    267     "UdfExtInner" \
    268 }
    269 
    270 /* Internal Actions. */
    271 typedef enum bcmi_field_action_e {
    272     bcmiFieldActionFlexctrOpaque0 = bcmFieldActionCount,
    273     bcmiFieldActionFlexctrOpaque1,
    274     bcmiFieldActionFlexctrOpaque2,
    275     bcmiFieldActionFlexctrOpaque3,
    276     bcmiFieldActionFlexctrOpaque4,
    277     bcmiFieldActionFlexctrOpaque5,
    278     bcmiFieldActionFlexctrOpaque6,
    279     bcmiFieldActionFlexctrOpaque7,
    280     bcmiFieldActionFlexctrOpaque8,
    281     bcmiFieldActionFlexctrOpaque9,
    282     bcmiFieldActionFlexctrOpaque10,
    283     bcmiFieldActionCount
    284 } bcmi_field_action_t;
    285 
    286 #define BCMI_FIELD_MAX_ACTIONS_PER_DB 16
    287 /*
    288  * Internal Action ASET
    289  */
    290 typedef struct bcmi_field_aset_s {
    291     uint32_t w[_SHR_BITDCLSIZE(bcmiFieldActionCount)];
    292     bcm_field_action_width_t actions_width[BCMI_FIELD_MAX_ACTIONS_PER_DB];
    293 } bcmi_field_aset_t;
    294 
    295 #define BCMI_FIELD_ASET_INIT(aset)  \
    296     sal_memset(&(aset), 0, sizeof(bcmi_field_aset_t)) 
    297 
    298 /******************************************************************************
    299  * LTSW field structures
    300  */
    301 
    302 /*!
    303  * \brief Qual field information.
    304  *
    305  * This data structure is used to identify the qualifier, its type and value and mask.
    306  */
    307 typedef struct bcm_qual_field_s {
    308     /*! Field name. */
    309     bcm_field_qualify_t     sdk6_qual_enum;
    310 
    311     /*! Field attribute (ref BCM_FIELD_F_xxx). */
    312     uint16_t        flags;
    313 
    314     /*! To indicate max index in an array. */
    315     uint16_t        depth;
    316 
    317     /*! Qualifier data type. To represent different
    318      * enum types supported in FP like mac_t, IPType etc
    319      */
    320     bcm_qual_data_type_t data_type;
    321 
    322     /*! Qualifier data portion */
    323     void *qual_data;
    324 
    325     /*! Qualifier mask portion */
    326     void *qual_mask;
    327 
    328     /*! Enum value in string format. */
    329     const char *enum_name;
    330 
    331     /*! Enum value in number format. */
    332     uint32_t enum_value;
    333 
    334     /*! Mask for enum value in number format. */
    335     uint32_t enum_mask;
    336 } bcm_qual_field_t;
    337 
    338 /*!
    339  * \brief Qual field information values.
    340  *
    341  * This data structure is used to retreive supported values for a particular qualifier.
    342  */
    343 typedef struct bcm_qual_field_values_s {
    344 
    345     /* Macro Flags supported if qualifier is of macro type. */
    346     uint32 macro_flags[20];
    347 
    348     /* Macro Flag values supported if qualifier is of macro type. */
    349     uint8 macro_flags_value[20];
    350 
    351     /* Macro Flags mask values supported if qualifier is of macro type. */
    352     uint8 macro_flags_mask_value[20];
    353 
    354     /* Macro Flags mask width supported if qualifier is of macro type. */
    355     uint8 macro_flags_mask_width[20];
    356 
    357     /* Number of values filled. */
    358     uint8 num;
    359 } bcm_qual_field_values_t;
    360 
    361 /*!
    362  * \brief Field action internal logical field information.
    363  *
    364  * This data structure is used to map the SDK6 action with
    365  * the corresponding SDKLT internal/additional logical field.
    366  */
    367 typedef struct bcm_field_qual_internal_map_info_s {
    368     /*! Additional Logical field name corresponding to the qualifier. */
    369     const char      *lt_field_name;
    370 
    371     /*! Number of offsets within the logical field
    372      *  that additional info is mapped to. */
    373     uint8_t        num_offsets;
    374 
    375     /*! Offset of the additional info in the corresponding logical field. */
    376     uint16_t        offset[BCM_FIELD_QUAL_LT_FIELD_MAP_MAX];
    377 
    378     /*! Width occupied by the additional info in the
    379      *  corresponding logical field. */
    380     uint16_t        width[BCM_FIELD_QUAL_LT_FIELD_MAP_MAX];
    381 
    382     /*! Additional info Value */
    383     const void       *value;
    384 } bcm_field_qual_internal_map_info_t;
    385 
    386 /*!
    387  * \brief Field qualifier logical field information.
    388  *
    389  * This data structure is used to map the SDK6 qualifier with
    390  * the corresponding SDKLT logical field.
    391  */
    392 typedef struct bcm_field_qual_map_info_s {
    393     /*! Logical field name corresponding to the qualifier. */
    394     const char      *lt_field_name;
    395 
    396     /*! Additional logical field name corresponding to the qualifier
    397      *  in rule template table. If set to NULL, use name above. */
    398     const char   *lt_field_mask_name;
    399 
    400     /*! Additional logical field name corresponding to the qualifier
    401      *  in group template table. If set to NULL, use name above. */
    402     const char      *lt_group_field_name;
    403 
    404     /*! Number of offsets within the logical field
    405      * that qualifier is mapped to. */
    406     uint8_t        num_offsets;
    407 
    408     /*! Offset of the qualifier in the corresponding logical field. */
    409     uint16_t        offset[BCM_FIELD_QUAL_LT_FIELD_MAP_MAX];
    410 
    411     /*! Width occubpied by the qualifier in the corresponding logical field. */
    412     uint16_t        width[BCM_FIELD_QUAL_LT_FIELD_MAP_MAX];
    413 
    414     /*! Qualifier supported in Exact Match
    415      *  Possible values:
    416      *   BCMI_FIELD_STAGE_LTMAP_ALL      => Support all stages.
    417      *   BCMI_FIELD_STAGE_LTMAP_IFP_ONLY => Support IFP only.
    418      *   BCMI_FIELD_STAGE_LTMAP_EM_ONLY  => Support EM only.
    419      */
    420     uint8_t        em;
    421 
    422     /*! Additional info enum/Macro value needed for
    423      *  ENUM/MACRO fo SDK6 mapped to SDKLT qualifier.
    424      */
    425     uint32_t        value;
    426     /*! Number of internal additional maps */
    427     uint8_t         num_internal_maps;
    428 
    429     /*! Additional Field information */
    430     const bcm_field_qual_internal_map_info_t *internal_map;
    431 
    432 } bcm_field_qual_map_info_t;
    433 
    434 typedef enum bcmi_field_data_type_e {
    435     bcmiFieldDataTypeNone = 0,
    436     bcmFieldDataTypeEnumtoLtField = 1,
    437     bcmFieldDataTypeMacrotoLtField = 2
    438 } bcmi_field_data_type_t;
    439 
    440 /*!
    441  * \brief Field qualifier map information.
    442  *
    443  * This data structure is used to map the SDK6 qualifier with
    444  * the corresponding SDKLT logical field.
    445  */
    446 typedef struct bcm_field_qual_map_s {
    447     /*! Field name. */
    448     bcmi_field_qualify_t     qual;
    449 
    450     /*! Number of logical fields that the qualifier is mapped to. */
    451     uint32_t        num_maps;
    452 
    453     /*! Flag indicating if more than one qualifier share the LT field */
    454     uint8_t        flags;
    455 
    456     bcmi_field_data_type_t data_type;
    457     /*! List of logical fields that the qualifier is mapped to. */
    458     bcm_field_qual_map_info_t     *map;
    459 } bcm_field_qual_map_t;
    460 
    461 /*!
    462  * \brief Field action internal logical field information.
    463  *
    464  * This data structure is used to map the SDK6 action with
    465  * the corresponding SDKLT internal/additional logical field.
    466  */
    467 typedef struct bcm_field_action_internal_map_info_s {
    468     /*! Additional Logical field name corresponding to the action. */
    469     const char      *lt_field_name;
    470 
    471     /*! Additional logical field name corresponding to the action
    472      *  in PDD template table. If set to NULL, use name above. */
    473     const char      *lt_pdd_field_name;
    474 
    475     /*! Additional logical field name corresponding to the action
    476      *  in SBR template table. If set to NULL, use name above. */
    477     const char      *lt_sbr_field_name;
    478 
    479     /*! SBR configuration */
    480     bool            sbr_enabled;
    481 
    482     /*! Number of offsets within the logical field
    483      *  that additional info is mapped to. */
    484     uint8_t        num_offsets;
    485 
    486     /*! Offset of the additional info in the corresponding logical field. */
    487     uint16_t        offset[BCM_FIELD_QUAL_LT_FIELD_MAP_MAX];
    488 
    489     /*! Width occupied by the additional info in the
    490      *  corresponding logical field. */
    491     uint16_t        width[BCM_FIELD_QUAL_LT_FIELD_MAP_MAX];
    492 
    493     /*! Additional info Value */
    494     uint32_t        value;
    495 } bcm_field_action_internal_map_info_t;
    496 
    497 #if 0
    498 /* Internal 1-byte UDF chunk qualifiers. */
    499 typedef enum bcmi_field_qual_b1_chunk_e {
    500     bcmiFieldQualB4Chunk0 = 0,      /* [00] 1-byte chunk qualifier 0.  */
    501     bcmiFieldQualB4Chunk1,          /* [01] 1-byte chunk qualifier 1.  */
    502     bcmiFieldQualB4Chunk2,          /* [02] 1-byte chunk qualifier 2.  */
    503     bcmiFieldQualB4Chunk3,          /* [03] 1-byte chunk qualifier 3.  */
    504     bcmiFieldQualB4Chunk4,          /* [04] 1-byte chunk qualifier 4.  */
    505     bcmiFieldQualB4Chunk5,          /* [05] 1-byte chunk qualifier 5.  */
    506     bcmiFieldQualB4Chunk6,          /* [06] 1-byte chunk qualifier 6.  */
    507     bcmiFieldQualB4Chunk7,          /* [07] 1-byte chunk qualifier 7.  */
    508     bcmiFieldQualB4Chunk8,          /* [08] 1-byte chunk qualifier 8.  */
    509     bcmiFieldQualB4Chunk9,          /* [09] 1-byte chunk qualifier 9.  */
    510     bcmiFieldQualB4Chunk10,         /* [10] 1-byte chunk qualifier 10. */
    511     bcmiFieldQualB4Chunk11,         /* [11] 1-byte chunk qualifier 11. */
    512     bcmiFieldQualB4Chunk12,         /* [12] 1-byte chunk qualifier 12. */
    513     bcmiFieldQualB4Chunk13,         /* [13] 1-byte chunk qualifier 13. */
    514     bcmiFieldQualB4Chunk14,         /* [14] 1-byte chunk qualifier 14. */
    515     bcmiFieldQualB4Chunk15,         /* [15] 1-byte chunk qualifier 15. */
    516     bcmiFieldQualB4Chunk16,         /* [16] 1-byte chunk qualifier 16. */
    517     bcmiFieldQualB4ChunkLastCount,  /* [17] Last Count                 */
    518 } bcmi_field_qual_b1_chunk_t;
    519 
    520 /* Internal 2-byte UDF chunk qualifiers. */
    521 typedef enum bcmi_field_qual_b2_chunk_e {
    522     bcmiFieldQualB2Chunk0 = 0,      /* [00] 2-byte chunk qualifier 0.  */
    523     bcmiFieldQualB2Chunk1,          /* [01] 2-byte chunk qualifier 1.  */
    524     bcmiFieldQualB2Chunk2,          /* [02] 2-byte chunk qualifier 2.  */
    525     bcmiFieldQualB2Chunk3,          /* [03] 2-byte chunk qualifier 3.  */
    526     bcmiFieldQualB2Chunk4,          /* [04] 2-byte chunk qualifier 4.  */
    527     bcmiFieldQualB2Chunk5,          /* [05] 2-byte chunk qualifier 5.  */
    528     bcmiFieldQualB2Chunk6,          /* [06] 2-byte chunk qualifier 6.  */
    529     bcmiFieldQualB2Chunk7,          /* [07] 2-byte chunk qualifier 7.  */
    530     bcmiFieldQualB2Chunk8,          /* [08] 2-byte chunk qualifier 8.  */
    531     bcmiFieldQualB2Chunk9,          /* [09] 2-byte chunk qualifier 9.  */
    532     bcmiFieldQualB2Chunk10,         /* [10] 2-byte chunk qualifier 10. */
    533     bcmiFieldQualB2Chunk11,         /* [11] 2-byte chunk qualifier 11. */
    534     bcmiFieldQualB2Chunk12,         /* [12] 2-byte chunk qualifier 12. */
    535     bcmiFieldQualB2Chunk13,         /* [13] 2-byte chunk qualifier 13. */
    536     bcmiFieldQualB2Chunk14,         /* [14] 2-byte chunk qualifier 14. */
    537     bcmiFieldQualB2Chunk15,         /* [15] 2-byte chunk qualifier 15. */
    538     bcmiFieldQualB2Chunk16,         /* [16] 2-byte chunk qualifier 16. */
    539     bcmiFieldQualB2ChunkLastCount,  /* [17] Last Count                 */
    540 } bcmi_field_qual_b2_chunk_t;
    541 
    542 /* Internal 4-byte UDF chunk qualifiers. */
    543 typedef enum bcmi_field_qual_b4_chunk_e {
    544     bcmiFieldQualB4Chunk0 = 0,      /* [00] 4-byte chunk qualifier 0.  */
    545     bcmiFieldQualB4Chunk1,          /* [01] 4-byte chunk qualifier 1.  */
    546     bcmiFieldQualB4Chunk2,          /* [02] 4-byte chunk qualifier 2.  */
    547     bcmiFieldQualB4Chunk3,          /* [03] 4-byte chunk qualifier 3.  */
    548     bcmiFieldQualB4Chunk4,          /* [04] 4-byte chunk qualifier 4.  */
    549     bcmiFieldQualB4Chunk5,          /* [05] 4-byte chunk qualifier 5.  */
    550     bcmiFieldQualB4Chunk6,          /* [06] 4-byte chunk qualifier 6.  */
    551     bcmiFieldQualB4Chunk7,          /* [07] 4-byte chunk qualifier 7.  */
    552     bcmiFieldQualB4Chunk8,          /* [08] 4-byte chunk qualifier 8.  */
    553     bcmiFieldQualB4Chunk9,          /* [09] 4-byte chunk qualifier 9.  */
    554     bcmiFieldQualB4Chunk10,         /* [10] 4-byte chunk qualifier 10. */
    555     bcmiFieldQualB4Chunk11,         /* [11] 4-byte chunk qualifier 11. */
    556     bcmiFieldQualB4Chunk12,         /* [12] 4-byte chunk qualifier 12. */
    557     bcmiFieldQualB4Chunk13,         /* [13] 4-byte chunk qualifier 13. */
    558     bcmiFieldQualB4Chunk14,         /* [14] 4-byte chunk qualifier 14. */
    559     bcmiFieldQualB4Chunk15,         /* [15] 4-byte chunk qualifier 15. */
    560     bcmiFieldQualB4Chunk16,         /* [16] 4-byte chunk qualifier 16. */
    561     bcmiFieldQualB4ChunkLastCount,  /* [17] Last Count                 */
    562 } bcmi_field_qual_b4_chunk_t;
    563 #endif
    564 
    565 /* Enum to indicate param argument of field API */
    566 typedef enum bcmi_field_action_param_e {
    567     bcmiFieldActionParamNone = 0,
    568     bcmiFieldActionParam1 = 1,
    569 } bcmi_field_action_param_t;
    570 
    571 /*!
    572  * \brief Field action logical field information.
    573  *
    574  * This data structure is used to map the SDK6 action with
    575  * the corresponding SDKLT logical field.
    576  */
    577 typedef struct bcm_field_action_map_info_s {
    578     /*! Logical field name corresponding to the action. */
    579     const char      *lt_field_name;
    580 
    581     /*! Additional logical field name corresponding to the action
    582      *  in PDD template table. If set to NULL, use name above. */
    583     const char      *lt_pdd_field_name;
    584 
    585     /*! Additional logical field name corresponding to the action
    586      *  in SBR template table. If set to NULL, use name above. */
    587     const char      *lt_sbr_field_name;
    588 
    589     /*! Number of offsets within the logical field
    590      * that action is mapped to. */
    591     uint8_t         num_offsets;
    592 
    593     /*! Offset of the action in the corresponding logical field. */
    594     uint16_t        offset[BCM_FIELD_QUAL_LT_FIELD_MAP_MAX];
    595 
    596     /*! Width occubpied by the action in the corresponding logical field. */
    597     uint16_t        width[BCM_FIELD_QUAL_LT_FIELD_MAP_MAX];
    598 
    599     /*! SBR configuration */
    600     bool            sbr_enabled;
    601 
    602     /*! Action supported in Exact Match
    603      *  Possible values:
    604      *   BCMI_FIELD_STAGE_LTMAP_ALL      => Support all stages.
    605      *   BCMI_FIELD_STAGE_LTMAP_IFP_ONLY => support IFP only.
    606      *   BCMI_FIELD_STAGE_LTMAP_EM_ONLY  => Support EM only.
    607      */
    608     uint8_t         em;
    609 
    610     /*! Action is Policer action. */
    611     bool            policer;
    612 
    613     /*! Action is Policer action and this is a Policer PDD field. */
    614     bool            policer_pdd;
    615 
    616     /*! Pool number of color table index. */
    617     int             color_index;
    618 
    619     /*! PDD SBR index. */
    620     int             pdd_sbr_index;
    621 
    622     /*! Number of internal additional maps */
    623     uint8_t         num_internal_maps;
    624 
    625     /*! Additional Field information */
    626     const bcm_field_action_internal_map_info_t *internal_map;
    627 
    628     /*! Param argument of bcm API */
    629     bcmi_field_action_param_t param;
    630 } bcm_field_action_map_info_t;
    631 
    632 /*!
    633  * \brief Field action map information.
    634  *
    635  * This data structure is used to map the SDK6 action with
    636  * the corresponding SDKLT logical field.
    637  */
    638 typedef struct bcm_field_action_map_s {
    639     /*! Field name. */
    640     bcm_field_action_t     action;
    641 
    642     /*! Number of logical fields that the action is mapped to. */
    643     uint32_t        num_maps;
    644 
    645     /*! Flag indicating if more than one actions share the LT field */
    646     uint8_t        flags;
    647 
    648     /*! List of logical fields that the action is mapped to. */
    649     const bcm_field_action_map_info_t     *map;
    650 } bcm_field_action_map_t;
    651 
    652 /*! Set function for Field Control which has complex settings. */
    653 typedef int (*bcm_field_control_set_f)(int unit, uint32 state);
    654 
    655 /*! Get function for Field Control which has complex settings. */
    656 typedef int (*bcm_field_control_get_f)(int unit, uint32 *state);
    657 
    658 /*!
    659  * \brief Field control logical field information.
    660  *
    661  * This data structure is used to store the SDKLT logical field info.
    662  */
    663 typedef struct bcm_field_control_map_info_s {
    664     /*! Logical table name corresponding to the Field control. */
    665     const char      *lt_name;
    666 
    667     /*! Logical field name corresponding to the Field Control. */
    668     const char      *lt_field_name;
    669 
    670     /*! Set function for Field Control which has complex settings. */
    671     const bcm_field_control_set_f   func_set;
    672 
    673     /*! Get function for Field Control which has complex settings. */
    674     const bcm_field_control_get_f   func_get;
    675 } bcm_field_control_map_info_t;
    676 /*!
    677  * \brief Field Control map information.
    678  *
    679  * This data structure is used to map the SDK6 control Enum with
    680  * the corresponding SDKLT logical field.
    681  */
    682 typedef struct bcm_field_control_map_s {
    683     /*! Field name. */
    684     bcm_field_control_t     control;
    685 
    686     /*! Number of logical fields that the Field control is mapped to. */
    687     uint32_t        num_maps;
    688 
    689     /*! List of logical fields that the Field Control is mapped to. */
    690     const bcm_field_control_map_info_t     *map;
    691 } bcm_field_control_map_t;
    692 
    693 
    694 /*
    695  * This data structure is used by flexctr module, to retrive the group info
    696  * for a given group ID.
    697  */ 
    698 typedef struct bcmi_field_flexctr_group_info_s {
    699     /*! Group's Priority */
    700     int priority;
    701     /*! Flex Counter Object ID */
    702     uint32_t flex_ctr_obj_id;
    703     /*! Group's Pipe Instance */
    704     int pipe;
    705 } bcmi_field_flexctr_group_info_t;
    706 
    707 
    708 /* LT Map action flags */
    709 #define BCMI_FIELD_ACTION_INTERNAL 0x1
    710 
    711 /******************************************************************************
    712  * LTSW Field Module Functions
    713  */
    714 extern int
    715 bcmi_ltsw_field_qualifier_set(int unit,
    716                               bcm_field_entry_t entry,
    717                               bcm_qual_field_t *qual_info);
    718 
    719 extern int
    720 bcmi_ltsw_field_qualifier_get(int unit,
    721                               bcm_field_entry_t entry,
    722                               bcm_qual_field_t *qual_info);
    723 
    724 extern int
    725 bcmi_ltsw_field_mirror_index_get(
    726     int unit,
    727     int entry,
    728     bcm_field_action_t action,
    729     int mirror_cont,
    730     bool *enable,
    731     int *mirror_index);
    732 
    733 extern int
    734 bcmi_ltsw_field_destination_mirror_index_get(
    735     int unit,
    736     bcm_field_destination_match_t *match,
    737     int *mirror_index);
    738 
    739 extern int
    740 bcmi_ltsw_field_entry_policer_update_all(int unit,
    741                                          bcm_policer_t policer_id,
    742                                          uint8_t in_use);
    743 
    744 extern int
    745 bcmi_ltsw_field_oper_mode_status_get(int unit,
    746                                      bcmi_ltsw_field_stage_t stage,
    747                                      int *mode);
    748 extern int
    749 bcmi_field_flexctr_group_info_get(
    750     int unit,
    751     bcm_flexctr_source_t source,
    752     int group,
    753     bcmi_field_flexctr_group_info_t *info);
    754 
    755 extern int
    756 bcmi_ltsw_field_flex_port_update(int unit,
    757                             bcm_pbmp_t detached_pbmp,
    758                             bcm_pbmp_t attached_pbmp);
    759 extern int
    760 bcmi_field_group_dump_brief(int unit, bcm_field_group_t group);
    761 
    762 extern int
    763 bcmi_field_presel_dump(int unit, bcm_field_presel_t presel_id);
    764 
    765 extern int
    766 bcmi_field_entry_hit_index_get(int unit,
    767                                bcm_field_entry_t entry,
    768                                uint32_t *hit_index);
    769 extern int
    770 bcmi_field_group_is_empty(int unit,
    771                           bcm_field_group_t group,
    772                           bool *entry_present);
    773 extern int
    774 bcmi_field_group_active_entries_get(int unit,
    775                                     bcm_field_group_t group,
    776                                     uint64_t *entries_created);
    777 int
    778 bcmi_field_group_delete_slice_reserve_entry(int unit,
    779                                             bcm_field_group_t group);
    780 #endif /* BCMI_LTSW_FIELD_H */