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

rx.h (10327B)


      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  * IPMC Internal header
      8  */
      9 
     10 #ifndef _BCM_INT_DPP_RX_H_
     11 #define _BCM_INT_DPP_RX_H_
     12 
     13 #include <sal/types.h>
     14 #include <bcm/types.h>
     15 #include <bcm/rx.h>
     16 #include <soc/dpp/PPD/ppd_api_trap_mgmt.h>
     17 
     18 /* Defines BCM no action profile */
     19 #define _BCM_DPP_TRAP_EG_NO_ACTION (0)
     20 #define _BCM_DPP_TRAP_PREVENT_SWAPPING (-1)
     21 #define _BCM_DPP_TRAP_INVALID_VIRTUAL_ID (-2)
     22 
     23 /*
     24  *  Egress traps don't really work that way.  The 'trap' action takes a profile
     25  *  (not a trap) as an argument, and follows the profile action.  Still, need a
     26  *  way to manage these profiles, but until then, just take the top one.
     27  */
     28 #define _BCM_PPD_TRAP_MGMT_EG_ACTION_PROFILE_MAX       (7) 
     29 #define _DPP_SWITCH_TRAP_TO_CPU_PROFILE_INDEX          (0x2)
     30 #define _DPP_SWITCH_EG_TRAP_DROP_PROFILE_INDEX         (0x1)
     31 #define _BCM_DPP_RX_TRAP_SUB_TYPE_SHIFT                (10)
     32 #define _BCM_DPP_RX_TRAP_ETPP_TYPE_SHIFT               (17)
     33 #define _BCM_DPP_RX_TRAP_ETPP_TYPE_MASK                (1)
     34 #define _BCM_DPP_RX_TRAP_TYPE_MASK                     (0x3)
     35 #define _BCM_DPP_RX_TRAP_ID_MASK                       (0x3ff)
     36 #define _BCM_DPP_RX_TRAP_ID_BIT_MAP_SHIFT              (16)
     37 
     38 #define _BCM_NUMBER_OF_VIRTUAL_TRAPS_MC_RESERVED       (8) /*Number of FRWRD profiles in IHB_FWD_ACT_PROFILE for reserved MC traps*/
     39 #define _BCM_NUMBER_OF_VIRTUAL_TRAPS_PROG              (4) /*Number of FRWRD profiles in IHB_FWD_ACT_PROFILE for Prog traps*/
     40 #define _BCM_NUMBER_OF_VIRTUAL_TRAPS                   (_BCM_NUMBER_OF_VIRTUAL_TRAPS_MC_RESERVED + _BCM_NUMBER_OF_VIRTUAL_TRAPS_PROG)
     41 
     42 
     43 
     44 typedef enum
     45 {
     46   /*
     47    *  ingress trap.
     48    */
     49   _BCM_DPP_RX_TRAP_INGRESS = 0x0,
     50   /*
     51    *  TBD trap.
     52    */
     53   _BCM_DPP_RX_TRAP_OAMP_ERROR = 0x1,
     54   /*
     55    *  egress trap.
     56    */
     57   _BCM_DPP_RX_TRAP_EGRESS = 0x2,
     58   /*
     59    *  virtual trap.
     60    */
     61   _BCM_DPP_RX_TRAP_VIRTUAL = 0x3,
     62   /*
     63    *  Number of types in _BCM_DPP_RX_TRAP_TYPE_SIZES
     64    */
     65   _BCM_DPP_RX_TRAP_TYPE_SIZES = 0x4
     66 }_BCM_DPP_RX_TRAP_TYPE;
     67 
     68 typedef struct bcm_dpp_rx_virtual_traps_s {
     69     uint32 gport_trap_id;                       /* Virtual trap id. Range: 0-11 */
     70     SOC_PPC_TRAP_FRWRD_ACTION_PROFILE_INFO trap_info;   /* Trap info profile */
     71     SOC_PPC_TRAP_SNOOP_ACTION_PROFILE_INFO snoop_info;  /* Snoop info */
     72     SOC_PPC_TRAP_CODE soc_ppc_trap_code;    /*For Virtual traps, one of SOC_PPC_TRAP_CODE_RESERVED_MC_X or SOC_PPC_TRAP_CODE_PROG_TRAP_X*/
     73     uint32            flags;
     74 } bcm_dpp_rx_virtual_traps_t;
     75 
     76 typedef struct bcm_dpp_rx_info_s {
     77     bcm_dpp_rx_virtual_traps_t virtual_traps[_BCM_NUMBER_OF_VIRTUAL_TRAPS];
     78 } bcm_dpp_rx_info_t;
     79 
     80 typedef struct _bcm_rx_trap_to_ppd_map_s {
     81     uint8 valid;
     82     SOC_PPC_TRAP_CODE ppc_trap_code;
     83 } _bcm_rx_trap_to_ppd_map_t ;
     84 
     85 /* gport trap full encoding:
     86    bits 0:9 trap id
     87    bits 10:11 virtual/egress symbol
     88    bits 12:15 trap strength
     89    bits 16:19 snoop strength
     90    bits 17:17 is etpp trap
     91    bits 26:31 trap type
     92 */
     93 #define _BCM_TRAP_ID_IS_VIRTUAL(_virtual_trap) (((_virtual_trap >> _BCM_DPP_RX_TRAP_SUB_TYPE_SHIFT) & _BCM_DPP_RX_TRAP_TYPE_MASK) == _BCM_DPP_RX_TRAP_VIRTUAL) /* Bits 11:10 == 0x3 mark the trap is virtual */
     94 #define _BCM_TRAP_ID_IS_EGRESS(_eg_trap)       (((_eg_trap >> _BCM_DPP_RX_TRAP_SUB_TYPE_SHIFT) & _BCM_DPP_RX_TRAP_TYPE_MASK) == _BCM_DPP_RX_TRAP_EGRESS) /* Bits 11:10 == 0x2 mark the trap is virtual */
     95 #define _BCM_TRAP_ID_IS_OAM(_oam_trap)         (((_oam_trap >> _BCM_DPP_RX_TRAP_SUB_TYPE_SHIFT) & _BCM_DPP_RX_TRAP_TYPE_MASK) == _BCM_DPP_RX_TRAP_OAMP_ERROR) /* Bits 11:10 == 0x1 mark the trap is oam */
     96 #define _BCM_TRAP_ID_IS_ETPP(_etpp_trap)       ((_etpp_trap >> _BCM_DPP_RX_TRAP_ETPP_TYPE_SHIFT ) & _BCM_DPP_RX_TRAP_ETPP_TYPE_MASK) /* Bit 17 == 0x1 mark the trap is etpp */
     97 
     98 /*create egress bit*/         
     99 #define _BCM_TRAP_EG_TYPE_TO_ID(_eg_trap)  ((_BCM_DPP_RX_TRAP_EGRESS << _BCM_DPP_RX_TRAP_SUB_TYPE_SHIFT) | (((_eg_trap) <= SOC_PPC_TRAP_EG_TYPE_CFM_TRAP)? (_bcm_dpp_rx_trap_egrr_calc(_eg_trap)) : (_eg_trap>>_BCM_DPP_RX_TRAP_ID_BIT_MAP_SHIFT) + _BCM_DPP_RX_TRAP_ID_BIT_MAP_SHIFT))
    100 #define _BCM_TRAP_EG_TYPE_BITS_TO_ID(_eg_trap_bits)  ((_BCM_DPP_RX_TRAP_EGRESS << _BCM_DPP_RX_TRAP_SUB_TYPE_SHIFT) | _eg_trap_bits)
    101 #define _BCM_TRAP_VIRTUAL_TO_ID(_virtual_trap)  ((_BCM_DPP_RX_TRAP_VIRTUAL << _BCM_DPP_RX_TRAP_SUB_TYPE_SHIFT) | _virtual_trap)
    102 
    103 /* create etpp bit */
    104 #define _BCM_TRAP_ETPP_TO_ID(_etpp_trap)  (_etpp_trap  | (_BCM_DPP_RX_TRAP_ETPP_TYPE_MASK << _BCM_DPP_RX_TRAP_ETPP_TYPE_SHIFT))
    105 
    106 #define _BCM_RX_TRAP_IS_REGULAR(trap_id) ( !(_BCM_TRAP_ID_IS_VIRTUAL(trap_id))  && !(_BCM_TRAP_ID_IS_EGRESS(trap_id)) && !( _BCM_TRAP_ID_IS_OAM(trap_id)) && !( _BCM_TRAP_ID_IS_ETPP(trap_id))) /* not a l2 cache,oam and egress trap */
    107 #define _BCM_RX_EXPOSE_HW_ID(unit)  (SOC_DPP_CONFIG(unit)->dpp_general.use_hw_trap_id_flag)
    108 
    109 /* converts the SW trap id to HW trap in the GPORT */
    110 #define _BCM_RX_CONVERT_SW_GPORT_TO_HW_GPORT(unit, gport, rv) \
    111         do { \
    112                 if (BCM_GPORT_IS_TRAP((gport)) &&  _BCM_RX_EXPOSE_HW_ID(unit) ) \
    113                 { \
    114                         uint32 trap_id_hw; \
    115                         int trap_strength; \
    116                         int snoop_strength; \
    117                         int trap_id_sw = BCM_GPORT_TRAP_GET_ID((gport));  \
    118                         if (_BCM_RX_EXPOSE_HW_ID(unit) && _BCM_RX_TRAP_IS_REGULAR(trap_id_sw))   \
    119                         { \
    120                             rv = _bcm_dpp_field_trap_ppd_to_hw(unit,trap_id_sw,&trap_id_hw);    /* exposing the hw id*/ \
    121                             if( rv == BCM_E_NONE){\
    122                                 trap_strength = BCM_GPORT_TRAP_GET_STRENGTH((gport)); \
    123                                 snoop_strength = BCM_GPORT_TRAP_GET_SNOOP_STRENGTH((gport)); \
    124                                 BCM_GPORT_TRAP_SET((gport), trap_id_hw, trap_strength, snoop_strength);      \
    125                             }\
    126                         }       \
    127                 } \
    128           } while (0) 
    129 
    130  /* converts the HW trap id to SW trap in the GPORT */
    131 #define _BCM_RX_CONVERT_HW_GPORT_TO_SW_GPORT(unit, gport) \
    132         do { \
    133                 if (BCM_GPORT_IS_TRAP((gport)) &&  _BCM_RX_EXPOSE_HW_ID(unit)) \
    134                 { \
    135                         int rv; \
    136                         int trap_id_sw; \
    137                         SOC_PPC_TRAP_CODE ppd_trap_code_temp; \
    138                         int trap_strength; \
    139                         int snoop_strength; \
    140                         int trap_id_hw = BCM_GPORT_TRAP_GET_ID((gport)); \
    141                         if (_BCM_RX_EXPOSE_HW_ID(unit) && _BCM_RX_TRAP_IS_REGULAR(trap_id_hw)) \
    142                         { \
    143                             rv = _bcm_dpp_field_trap_ppd_from_hw(unit,trap_id_hw,&ppd_trap_code_temp); /* converting the HW trap id back to ppd trap code */ \
    144                             trap_id_sw  = ppd_trap_code_temp; \
    145                             BCMDNX_IF_ERR_EXIT(rv); \
    146                             trap_strength = BCM_GPORT_TRAP_GET_STRENGTH((gport)); \
    147                             snoop_strength = BCM_GPORT_TRAP_GET_SNOOP_STRENGTH((gport)); \
    148                             BCM_GPORT_TRAP_SET((gport), trap_id_sw, trap_strength, snoop_strength); \
    149                         } \
    150                 } \
    151             } while (0)
    152 
    153 
    154 /*clears virtual bit*/
    155 #define _BCM_TRAP_ID_TO_VIRTUAL(_virtual_trap)  ( _BCM_DPP_RX_TRAP_ID_MASK & _virtual_trap) /*set the bit 11:10 to zero, , total number of bits for traps is 10*/
    156 #define _BCM_TRAP_ID_TO_OAM(_oam_trap)  ( _BCM_DPP_RX_TRAP_ID_MASK & _oam_trap) /*set the bit 11:10 to zero, , total number of bits for traps is 10*/
    157 
    158 extern int _packet_counter[BCM_MAX_NUM_UNITS];
    159 
    160 int _bcm_dpp_rx_virtual_trap_get(int unit, int virtual_trap_id, bcm_dpp_rx_virtual_traps_t *virtual_trap_str);
    161 int _bcm_dpp_rx_virtual_trap_set(int unit, int virtual_trap_id, bcm_dpp_rx_virtual_traps_t *virtual_trap_str);
    162 int _bcm_dpp_rx_egress_set(int unit,int trap_id, SOC_PPC_TRAP_EG_ACTION_PROFILE_INFO *prm_egr_profile_info);
    163 int _bcm_dpp_rx_egress_set_to_drop_info(int unit, SOC_PPC_TRAP_EG_ACTION_PROFILE_INFO *eg_drop_info);
    164 int _bcm_dpp_rx_egress_set_to_cpu_drop_info(int unit, SOC_PPC_TRAP_EG_ACTION_PROFILE_INFO *eg_cpu_drop_info);
    165 int _bcm_dpp_rx_trap_set(int unit, int trap_id, bcm_rx_trap_config_t *config, uint8 trap_fwd_offset_index);
    166 int _bcm_petra_rx_partial_init(int);
    167 int _bcm_dpp_rx_trap_id_to_egress(int _eg_trap);
    168 int _bcm_dpp_rx_trap_id_to_etpp(int _etpp_trap);
    169 int _bcm_dpp_rx_egress_to_trap_id(int _eg_trap);
    170 int _bcm_dpp_rx_ppd_to_forwarding_type(SOC_TMC_PKT_FRWRD_TYPE ppdForwardingType, bcm_forwarding_type_t *bcmForwardingType);
    171 int _bcm_dpp_rx_forwarding_type_to_ppd(bcm_forwarding_type_t bcmForwardingType, SOC_TMC_PKT_FRWRD_TYPE *ppdForwardingType);
    172 
    173 int _bcm_dpp_rx_ppd_trap_get(int unit, bcm_rx_trap_t trap_type, int *soc_ppd_trap_id);
    174 void _bcm_dpp_rx_trap_type_get(int unit, uint8 convert_flag, int soc_ppd_trap_id, uint8 *found, bcm_rx_trap_t *trap_type);
    175 void _bcm_dpp_rx_trap_type_get_from_array(int soc_ppd_trap_id, bcm_rx_trap_t *trap_type, uint8 *found);
    176 
    177 int _bcm_dpp_rx_packet_parse(int unit, bcm_pkt_t *pkt, uint8 device_access_allowed);
    178 void _bcm_dpp_rx_packet_cos_parse(int unit, bcm_pkt_t *pkt);
    179 
    180 int _bcm_rx_ppd_trap_code_from_trap_id(int unit, int trap_id, SOC_PPC_TRAP_CODE *ppd_trap_code);
    181 int _bcm_dpp_rx_trap_sw_id_to_virtual_id(int unit, int trap_id_sw,int *trap_id_virtual);
    182 
    183 int _bcm_dpp_rx_trap_sw_id_to_hw_id(int unit, int trap_id_sw, int *trap_id_converted);
    184 int _bcm_dpp_rx_trap_hw_id_to_sw_id(int unit, int trap_id,  int *trap_id_converted);
    185 int _bcm_dpp_rx_bcm_forwarding_header_to_ppd(bcm_rx_trap_forwarding_header_t fwd_header,uint32 *ppd_fwd_header);
    186 int _bcm_dpp_rx_bcm_ppd_to_forwarding_header(uint32 ppd_fwd_header, bcm_rx_trap_forwarding_header_t* fwd_header);
    187 int _bcm_dpp_rx_get_next_eg_soc_ppc_trap(SOC_PPC_TRAP_EG_TYPE current_eg_trap_id,SOC_PPC_TRAP_EG_TYPE *next_eg_trap_id);
    188 void _bcm_dpp_rx_egress_trap_to_soc_ppc_trap(int trap_id_eg, SOC_PPC_TRAP_EG_TYPE *trap_id_ppc);
    189 int _bcm_dpp_rx_trap_egrr_calc(int egrr_trap);
    190 
    191 int bcm_petra_rx_detach(int unit);
    192 
    193 void rx_adapter_process_packet(int unit, bcm_pkt_t *pkt);
    194 int _bcm_adapter_rx_start(int unit, bcm_rx_cfg_t *cfg);
    195 
    196 #endif /* _BCM_INT_DPP_RX_H_ */