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

ft_common.h (6978B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2020 Broadcom Inc. All rights reserved.
      6  *
      7  * File:    ft_common.h
      8  * Purpose: Function declarations for common flowtracker routines.
      9  */
     10 
     11 #ifndef _BCM_INT_FT_COMMON_H_
     12 #define _BCM_INT_FT_COMMON_H_
     13 
     14 #if defined(BCM_FLOWTRACKER_SUPPORT)
     15 #include <bcm/flowtracker.h>
     16 
     17 /*
     18  * Donot change enum sequence. Append in last always
     19  * FlowTracker types in pipeline.
     20  */
     21 typedef enum bcmi_ft_type_e {
     22     bcmiFtTypeNone = 0,
     23     bcmiFtTypeIFT = 1,
     24     bcmiFtTypeMFT = 2,
     25     bcmiFtTypeEFT = 3,
     26     bcmiFtTypeAIFT = 4,
     27     bcmiFtTypeAMFT = 5,
     28     bcmiFtTypeAEFT = 6,
     29     bcmiFtTypeCount = 7
     30 } bcmi_ft_type_t;
     31 
     32 #define BCMI_FT_TYPE_STRINGS \
     33 { \
     34     "None", \
     35     "Ingress", \
     36     "Mmu", \
     37     "Egress", \
     38     "AggregateIngress", \
     39     "AggregateMmu", \
     40     "AggregateEgress", \
     41     "Count"  \
     42 }
     43 
     44 /* Flowtracker Type Flags */
     45 #define BCMI_FT_TYPE_F_IFT          (1 << bcmiFtTypeIFT)
     46 #define BCMI_FT_TYPE_F_MFT          (1 << bcmiFtTypeMFT)
     47 #define BCMI_FT_TYPE_F_EFT          (1 << bcmiFtTypeEFT)
     48 #define BCMI_FT_TYPE_F_AIFT         (1 << bcmiFtTypeAIFT)
     49 #define BCMI_FT_TYPE_F_AMFT         (1 << bcmiFtTypeAMFT)
     50 #define BCMI_FT_TYPE_F_AEFT         (1 << bcmiFtTypeAEFT)
     51 
     52 #define BCMI_FT_TYPE_F_MICRO        (BCMI_FT_TYPE_F_IFT  |          \
     53                                      BCMI_FT_TYPE_F_MFT  |          \
     54                                      BCMI_FT_TYPE_F_EFT)
     55 
     56 #define BCMI_FT_TYPE_F_AGG          (BCMI_FT_TYPE_F_AIFT |          \
     57                                      BCMI_FT_TYPE_F_AMFT |          \
     58                                      BCMI_FT_TYPE_F_AEFT)
     59 
     60 #define BCMI_FT_TYPE_F_ANY          (BCMI_FT_TYPE_F_MICRO |         \
     61                                      BCMI_FT_TYPE_F_AGG)
     62 
     63 /* Check if only one of the ft type is set */
     64 #define BCMI_FT_TYPE_F_IS_UNIQUE(_ft_type_flags_)                   \
     65     (!((_ft_type_flags_) & ((_ft_type_flags_) - 1)))
     66 
     67 /* Get ft type when only 1b is set */
     68 #define BCMI_FT_TYPE_F_UNIQUE_GET(_ft_type_flags_, _ft_type_)       \
     69     do {                                                            \
     70         int idx = 0;                                                \
     71         for (idx = 0; idx < bcmiFtTypeCount; idx++) {               \
     72             if ((_ft_type_flags_) & (1 << idx)) {                   \
     73                 (_ft_type_) = idx;                                  \
     74             }                                                       \
     75         }                                                           \
     76     } while (0)
     77 
     78 #define BCMI_FT_GROUP_FT_TYPE_BMP_GET(_gt_, _ft_type_bmp_)              \
     79     do {                                                                \
     80         if ((_gt_) == bcmFlowtrackerGroupTypeNone) {                    \
     81             (_ft_type_bmp_) = BCMI_FT_TYPE_F_MICRO;                     \
     82         } else if ((_gt_) == bcmFlowtrackerGroupTypeAggregateIngress) { \
     83             (_ft_type_bmp_) = BCMI_FT_TYPE_F_AIFT;                      \
     84         } else if ((_gt_) == bcmFlowtrackerGroupTypeAggregateMmu) {     \
     85             (_ft_type_bmp_) = BCMI_FT_TYPE_F_AMFT;                      \
     86         } else { /* bcmFlowtrackerGroupTypeAggregateEgress */           \
     87             (_ft_type_bmp_) = BCMI_FT_TYPE_F_AEFT;                      \
     88         }                                                               \
     89     } while(0)
     90 
     91 #define BCMI_FT_GROUP_CHECK_FT_TYPE_GET(_gftbmp_, _cftbmp_, _fftbmp_,_fft_)  \
     92     do {                                                            \
     93         _fftbmp_ = (_gftbmp_ & _cftbmp_);                           \
     94         if (BCMI_FT_TYPE_F_IS_UNIQUE(_fftbmp_)) {                   \
     95             BCMI_FT_TYPE_F_UNIQUE_GET(_fftbmp_, _fft_);             \
     96         } else {                                                    \
     97             /* Could not determine ft_type for the check, Lets take \
     98                first ft_type */                                     \
     99             if (_fftbmp_ & BCMI_FT_TYPE_F_IFT) {                    \
    100                 _fft_ = bcmiFtTypeIFT;                              \
    101             } else if (_fftbmp_ & BCMI_FT_TYPE_F_MFT) {             \
    102                 _fft_ = bcmiFtTypeMFT;                              \
    103             } else {                                                \
    104                 _fft_ = bcmiFtTypeEFT;                              \
    105             }                                                       \
    106         }                                                           \
    107     } while(0)
    108 
    109 
    110 /* Generic memory allocation routine. */
    111 #define BCMI_FT_ALLOC(_ptr_, _size_, _descr_)                       \
    112     do {                                                            \
    113         int _lsize_;                                                \
    114         _lsize_ = (_size_ );                                        \
    115         if (NULL == (_ptr_)) {                                      \
    116             (_ptr_) = sal_alloc((_lsize_), (_descr_));              \
    117         }                                                           \
    118         if((_ptr_) != NULL) {                                       \
    119             sal_memset((_ptr_), 0, (_lsize_));                      \
    120         }  else {                                                   \
    121             LOG_ERROR(BSL_LS_BCM_FLOWTRACKER,                       \
    122                     (BSL_META("FT Error: Allocation"                \
    123                               " failure %s\n"), (_descr_)));        \
    124         }                                                           \
    125     } while (0)
    126 
    127 /* Generic memory allocation. If error, cleanup */
    128 #define BCMI_FT_ALLOC_IF_ERR_CLEANUP(_ptr_, _size_, _descr_)        \
    129     do {                                                            \
    130         BCMI_FT_ALLOC(_ptr_, _size_, _descr_);                      \
    131         if ((_ptr_) == NULL) {                                      \
    132             rv = BCM_E_MEMORY;                                      \
    133             goto cleanup;                                           \
    134         }                                                           \
    135     } while (0)
    136 
    137 /* Generic memory free routine. */
    138 #define BCMI_FT_FREE(_ptr_)                                         \
    139     do {                                                            \
    140         if (NULL != (_ptr_)) {                                      \
    141             sal_free((_ptr_));                                      \
    142         }                                                           \
    143         (_ptr_) = NULL;                                             \
    144     } while (0)
    145 
    146 int
    147 bcmi_ft_group_type_mem_get(
    148     int unit,
    149     int key_or_data,
    150     bcm_flowtracker_group_type_t group_type,
    151     soc_mem_t *mem);
    152 
    153 int
    154 bcmi_ft_type_support_check(
    155     int unit,
    156     bcmi_ft_type_t ft_type,
    157     int *support);
    158 
    159 #endif /* BCM_FLOWTRACKER_SUPPORT */
    160 #endif /* _BCM_INT_FT_COMMON_H_ */