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_ */