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

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