alpm.h (10555B)
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 * trie data structure for ALPM 7 */ 8 9 #define ALPM_IPV4_BKT_COUNT 24 10 #define ALPM_IPV4_BKT_COUNT_FLEX 16 11 #define ALPM_IPV6_64_BKT_COUNT 16 12 #define ALPM_IPV6_64_BKT_COUNT_FLEX 12 13 #define ALPM_IPV6_128_BKT_COUNT 8 14 #define ALPM_RAW_BKT_COUNT_DW 8 /* Double Wide */ 15 #define ALPM_RAW_BKT_COUNT 4 16 17 #define SOC_ALPM_V6_SCALE_CHECK(u, v6) \ 18 ((v6) \ 19 && !soc_alpm_mode_get((u)) && !SOC_URPF_STATUS_GET((u))) 20 21 #define SOC_ALPM_RPF_SRC_DISCARD (1) 22 #define SOC_ALPM_STAT_FLEX (1 << 1) 23 24 25 #define SOC_ALPM_LOOKUP_HIT (1 << 31) 26 #define SOC_ALPM_DELETE_ALL (1 << 30) 27 #define SOC_ALPM_COOKIE_FLEX (1 << 29) 28 #define SOC_ALPM_LPM_LOOKUP_HIT (1 << 28) 29 30 #define SOC_ALPM_TCAM_INDEX_MASK (~(SOC_ALPM_LOOKUP_HIT |\ 31 SOC_ALPM_DELETE_ALL |\ 32 SOC_ALPM_COOKIE_FLEX)) 33 34 #define SOC_ALPM_BKT_ENTRY_TO_IDX(idx) (((idx) >> 2) & 0x3FFF) 35 /* given bucket index shift left to bucket entry idx position */ 36 #define SOC_ALPM_BKT_IDX_TO_ENTRY(idx) ((idx) << 2) 37 38 /* size of individual l3 defip tcam in no. of entries */ 39 #define SOC_L3_DEFIP_TCAM_SIZE(u) SOC_CONTROL(u)->l3_defip_tcam_size 40 41 /* size of individual l3_defip tcam in no. of bits to represent size */ 42 #define SOC_L3_DEFIP_TCAM_SIZE_SHIFT 10 43 44 /* for TD2 this is: ((addr << 1) & ~0x7ff) + (addr & 0x3ff) */ 45 #define SOC_ALPM_128_ADDR_LWR(u, addr) \ 46 ((((addr) << 1) & ~(2*SOC_L3_DEFIP_TCAM_SIZE(u) - 1)) + \ 47 ((addr) & (SOC_L3_DEFIP_TCAM_SIZE(u) - 1))) 48 49 #define SOC_ALPM_128_ADDR_UPR(u, addr) \ 50 (SOC_ALPM_128_ADDR_LWR((u), (addr)) + SOC_L3_DEFIP_TCAM_SIZE(u)) 51 52 /* get pair tcam index given underlying defip index */ 53 #define SOC_ALPM_128_DEFIP_TO_PAIR(u, idx) \ 54 (((idx) & (SOC_L3_DEFIP_TCAM_SIZE(u) - 1)) + \ 55 (((idx) >> 1) & ~(SOC_L3_DEFIP_TCAM_SIZE(u) - 1))) 56 57 #define SOC_ALPM_RAW_BUCKET_SIZE(u, v6) \ 58 (SOC_ALPM_V6_SCALE_CHECK((u), (v6))? \ 59 ALPM_RAW_BKT_COUNT_DW : \ 60 ALPM_RAW_BKT_COUNT) 61 62 #define SOC_ALPM_RAW_INDEX_DECODE(u, v6, alpm_index, raw_id, ent_id)\ 63 do { \ 64 (raw_id) = (alpm_index) % SOC_ALPM_RAW_BUCKET_SIZE((u), (v6)); \ 65 (ent_id) = (alpm_index) >> 16; \ 66 } while (0) 67 68 /* for ALPM debug show */ 69 #define SOC_ALPM_DEBUG_SHOW_FLAG_PVT (1U << 0) 70 #define SOC_ALPM_DEBUG_SHOW_FLAG_BKT (1U << 1) 71 #define SOC_ALPM_DEBUG_SHOW_FLAG_BKTUSG (1U << 2) 72 #define SOC_ALPM_DEBUG_SHOW_FLAG_CNT (1U << 3) 73 #define SOC_ALPM_DEBUG_SHOW_FLAG_INTDBG (1U << 4) 74 #define SOC_ALPM_DEBUG_SHOW_FLAG_ALL (~0U) 75 76 extern int soc_alpm_init(int u); 77 extern int soc_alpm_deinit(int u); 78 extern int soc_alpm_insert(int u, void *entry_data, uint32 src_flags, 79 int bkt_idx, int pivot_info); 80 extern int soc_alpm_warmboot_lpm_reinit(int, int, int, void *); 81 extern int soc_alpm_warmboot_lpm_reinit_done(int); 82 extern int soc_alpm_warmboot_bucket_bitmap_set(int, int, int); 83 extern int soc_alpm_warmboot_pivot_add(int, int, void *, int, int); 84 extern int soc_alpm_warmboot_prefix_insert(int, int, int, void *, void *, 85 int, int, int); 86 extern int soc_alpm_128_warmboot_lpm_reinit(int, int, int, void *); 87 extern int soc_alpm_128_warmboot_lpm_reinit_done(int); 88 extern int soc_alpm_128_warmboot_bucket_bitmap_set(int, int, int); 89 extern int soc_alpm_128_warmboot_pivot_add(int, int, void *, int, int); 90 extern int soc_alpm_128_warmboot_prefix_insert(int, int, void *, void *, 91 int, int, int); 92 extern int soc_alpm_debug_show(int u, int vrf_id, uint32 flags); 93 extern int soc_alpm_debug_brief_show(int u, int phy_bkt, int index); 94 95 #ifdef ALPM_WARM_BOOT_DEBUG 96 extern void soc_alpm_lpm_sw_dump(int); 97 extern void soc_alpm_128_warmboot_lpm_sw_dump(int); 98 #endif 99 extern int soc_alpm_delete(int u, void *entry_data, int bkt_idx, 100 int pivot_info); 101 extern int soc_alpm_lookup(int u, void *key_data, 102 void *e, /* return entry data if found */ 103 int *index_ptr, int *cookie); 104 extern int soc_alpm_find_best_match(int u, void *key_data, void *e, 105 int *index_ptr, int do_urpf); 106 extern int soc_alpm_128_insert(int u, void *entry_data, uint32 src_flags, 107 int bkt_idx, int pivot_info); 108 extern int soc_alpm_128_delete(int u, void *entry_data, int bkt_idx, 109 int pivot_info); 110 extern int soc_alpm_128_lookup(int u, void *key_data, 111 void *e, /* return entry data if found */ 112 int *index_ptr, int *cookie); 113 extern int soc_alpm_128_find_best_match(int u, void *key_data, void *e, 114 int *index_ptr, int do_urpf); 115 extern int soc_alpm_urpf_enable(int unit, int enable); 116 extern int soc_alpm_ipmc_war(int unit, int install); 117 extern int soc_alpm_128_ipmc_war(int unit, int install); 118 119 extern int soc_alpm_lpm_ip4entry0_to_0(int u, void *src, void *dst, int copy_hit); 120 extern int soc_alpm_lpm_ip4entry1_to_1(int u, void *src, void *dst, int copy_hit); 121 extern int soc_alpm_lpm_ip4entry0_to_1(int u, void *src, void *dst, int copy_hit); 122 extern int soc_alpm_lpm_ip4entry1_to_0(int u, void *src, void *dst, int copy_hit); 123 extern int soc_alpm_lpm_vrf_get(int unit, void *lpm_entry, int *vrf_id, int *vrf); 124 extern int soc_alpm_128_lpm_vrf_get(int unit, void *lpm_entry, int *vrf_id, int *vrf); 125 extern int soc_alpm_mode_get(int u); 126 127 /* For Tomahawk */ 128 #define SOC_TH_ALPM_SCALE_CHECK(u, v6) \ 129 ((l3_alpm_ipv4_double_wide[(u)] || (v6)) && \ 130 ((ALPM_CTRL(u).alpm_mode != SOC_ALPM_MODE_PARALLEL) && !SOC_URPF_STATUS_GET((u)))) 131 132 extern int soc_th_alpm_warmboot_lpm_reinit(int, int, int, void *); 133 extern int soc_th_alpm_warmboot_lpm_reinit_done(int); 134 extern int soc_th_alpm_warmboot_bucket_bitmap_set(int, int, int, int); 135 extern int soc_th_alpm_warmboot_pivot_add(int, int, void *, int, int); 136 extern int soc_th_alpm_warmboot_pivot_bmp_len_update(int unit, int ipv6, 137 void *lpm_entry, int tcam_idx); 138 extern int soc_th_alpm_warmboot_prefix_insert(int, int, int, void *, void *, 139 int, int, int); 140 extern int soc_th_alpm_128_warmboot_lpm_reinit(int, int, int, void *); 141 extern int soc_th_alpm_128_warmboot_lpm_reinit_done(int); 142 extern int soc_th_alpm_128_warmboot_bucket_bitmap_set(int, int, int, int); 143 extern int soc_th_alpm_128_warmboot_pivot_add(int, int, void *, int, int); 144 extern int soc_th_alpm_128_warmboot_pivot_bmp_len_update(int unit, int ipv6, 145 void *lpm_entry, int tcam_idx); 146 extern int soc_th_alpm_128_warmboot_prefix_insert(int, int, void *, void *, 147 int, int, int); 148 extern int soc_th_alpm_delete(int u, void *entry_data, int bkt_idx, 149 int pivot_info); 150 extern int soc_th_alpm_lookup(int u, void *key_data, 151 void *e, /* return entry data if found */ 152 int *index_ptr, int *cookie); 153 extern int soc_th_alpm_128_insert(int u, void *entry_data, uint32 src_flags, 154 int bkt_idx, int pivot_info); 155 extern int soc_th_alpm_128_delete(int u, void *entry_data, int bkt_idx, 156 int pivot_info); 157 extern int soc_th_alpm_128_lookup(int u, void *key_data, 158 void *e, /* return entry data if found */ 159 int *index_ptr, int *cookie); 160 extern int soc_th_alpm_urpf_enable(int unit, int enable); 161 162 extern int soc_th_alpm_lpm_vrf_get(int unit, void *lpm_entry, int *vrf_id, int *vrf); 163 extern int soc_th_alpm_128_lpm_vrf_get(int unit, void *lpm_entry, int *vrf_id, int *vrf); 164 extern int soc_th_alpm_init(int u); 165 extern int soc_th_alpm_deinit(int u); 166 extern int soc_th_alpm_insert(int u, void *entry_data, uint32 src_flags, 167 int bkt_idx, int pivot_info); 168 extern int soc_th_alpm_lpm_ip4entry0_to_0(int u, void *src, 169 void *dst, int copy_hit); 170 extern int soc_th_alpm_lpm_ip4entry1_to_1(int u, void *src, void *dst, 171 int copy_hit); 172 extern int soc_th_alpm_lpm_ip4entry0_to_1(int u, void *src, void *dst, 173 int copy_hit); 174 extern int soc_th_alpm_lpm_ip4entry1_to_0(int u, void *src, void *dst, 175 int copy_hit); 176 extern void soc_th_alpm_lpm_state_dump(int u); 177 extern int soc_th_alpm_debug_show(int u, int vrf_id, uint32 flags); 178 extern int soc_th_alpm_debug_brief_show(int u, int bucket, int index); 179 180 extern int soc_th_alpm_find_best_match(int u, void *key_data, void *e, 181 int *index_ptr, int do_urpf); 182 extern int soc_th_alpm_128_find_best_match(int u, void *key_data, void *e, 183 int *index_ptr, int do_urpf); 184 #ifndef BCM_SW_STATE_DUMP_DISABLE 185 extern void soc_th_alpm_sw_dump(int unit); 186 extern void soc_alpm_sw_dump(int unit); 187 #endif 188 189 /* ALPM Sanity Checker */ 190 extern int soc_alpm_sanity_check(int u, soc_mem_t mem, int index, int check_sw); 191 extern int soc_th_alpm_sanity_check(int u, soc_mem_t mem, int index, int check_sw); 192 193 extern int soc_alpm_ipmc_war(int unit, int install); 194 extern int soc_alpm_128_ipmc_war(int unit, int install); 195 196 /* ALPM common */ 197 extern int soc_alpm_l3_defip_index_map(int unit, soc_mem_t mem, int index); 198 extern int soc_alpm_l3_defip_index_remap(int unit, soc_mem_t mem, int index); 199 extern soc_mem_t soc_alpm_cmn_bkt_view_get(int unit, int index); 200 extern void soc_alpm_cmn_bkt_view_set(int unit, int index, soc_mem_t view); 201 extern int soc_alpm_cmn_banks_get(int unit); 202 extern int soc_alpm_cmn_mode_get(int unit); 203 204 /* ALPM Capacity get*/ 205 extern int soc_alpm_route_capacity_get(int unit, int route_type, 206 int *max_entries, int *min_entries); 207 extern int soc_th_alpm_route_capacity_get(int unit, int route_type, 208 int *max_entries, int *min_entries); 209 210