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

hash.c (79325B)


      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  *
      7  * File:        hash.c
      8  * Purpose:     Trident3 hash table calculation routines
      9  * Requires:
     10  */
     11 
     12 #include <shared/bsl.h>
     13 
     14 #include <soc/drv.h>
     15 #include <soc/mem.h>
     16 #include <soc/debug.h>
     17 #include <soc/hash.h>
     18 #include <soc/trident3.h>
     19 
     20 #if defined(BCM_HELIX5_SUPPORT)
     21 
     22 #include <soc/helix5.h>
     23 
     24 int
     25 soc_hx5_shared_hash_mem_bucket_read(int unit, int ent, int key_type, int *width,
     26                                     soc_mem_t base_mem, soc_mem_t *mem, 
     27                                     void *bkt_entry, void *entry)
     28 {
     29 
     30     soc_mem_info_t meminfo;
     31     soc_field_info_t fieldinfo;
     32     /* Exclude HIT bit */
     33     int entry_bits = 0;
     34 
     35     switch (base_mem) {
     36     case L3_ENTRY_SINGLEm:
     37     case L3_ENTRY_ONLY_SINGLEm:
     38     case L3_ENTRY_DOUBLEm:
     39     case L3_ENTRY_QUADm:
     40         switch (key_type) {
     41         case TD3_L3_HASH_KEY_TYPE_V4UC:
     42         case TD3_L3_HASH_KEY_TYPE_TRILL:
     43         case TD3_L3_HASH_KEY_TYPE_FCOE_DOMAIN:
     44         case TD3_L3_HASH_KEY_TYPE_FCOE_HOST:
     45         case TD3_L3_HASH_KEY_TYPE_FCOE_SOURCE_MAP:
     46             *width = 1;
     47             *mem = L3_ENTRY_SINGLEm;
     48             break;
     49         case TD3_L3_HASH_KEY_TYPE_V4MC:
     50         case TD3_L3_HASH_KEY_TYPE_L2_IPV4_MULTICAST:
     51         case TD3_L3_HASH_KEY_TYPE_L2VP_IPV4_MULTICAST:
     52         case TD3_L3_HASH_KEY_TYPE_DST_NAT:
     53         case TD3_L3_HASH_KEY_TYPE_DST_NAPT:
     54         case TD3_L3_HASH_KEY_TYPE_V6UC:
     55             *width = 2;
     56             *mem = L3_ENTRY_DOUBLEm;
     57             break;
     58         case TD3_L3_HASH_KEY_TYPE_V6MC:
     59         case TD3_L3_HASH_KEY_TYPE_L2_IPV6_MULTICAST:
     60         case TD3_L3_HASH_KEY_TYPE_L2VP_IPV6_MULTICAST:
     61         default:
     62             *width = 4;
     63             *mem = L3_ENTRY_QUADm;
     64         }
     65         entry_bits = (soc_mem_entry_bits(unit, L3_ENTRY_SINGLEm) - 1) * (*width);
     66         meminfo.bytes = SOC_MEM_WORDS(unit, L3_ENTRY_QUADm) * 4;
     67         break;
     68 
     69     case EXACT_MATCH_2m:
     70     case EXACT_MATCH_4m:
     71         switch (key_type) {
     72         case TD3_FPEM_HASH_KEY_TYPE_128B:
     73         case TD3_FPEM_HASH_KEY_TYPE_160B:
     74             *width = 2;
     75             *mem = EXACT_MATCH_2m;
     76             break;
     77         case TD3_FPEM_HASH_KEY_TYPE_320B:
     78         default:
     79             *width = 4;
     80             *mem = EXACT_MATCH_4m;
     81         }
     82         entry_bits = (soc_mem_entry_bits(unit, EXACT_MATCH_2m) - 1) * ((*width)/2);
     83         meminfo.bytes = SOC_MEM_WORDS(unit, EXACT_MATCH_4m) * 4;
     84         break;
     85 
     86     case VLAN_XLATE_1_SINGLEm:
     87     case VLAN_XLATE_1_DOUBLEm:
     88     case VLAN_XLATE_2_SINGLEm:
     89     case VLAN_XLATE_2_DOUBLEm:
     90         switch (key_type) {
     91         case TD3_VLXLT_HASH_KEY_TYPE_L2GRE_DIP:
     92         case TD3_VLXLT_HASH_KEY_TYPE_VXLAN_DIP:
     93             *width = 1;
     94             *mem = VLAN_XLATE_1_SINGLEm;
     95             break;
     96         case TD3_VLXLT_HASH_KEY_TYPE_IVID:
     97         case TD3_VLXLT_HASH_KEY_TYPE_IVID_VSAN:
     98         case TD3_VLXLT_HASH_KEY_TYPE_OVID:
     99         case TD3_VLXLT_HASH_KEY_TYPE_OVID_VSAN:
    100         case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID:
    101         case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID_VSAN:
    102         case TD3_VLXLT_HASH_KEY_TYPE_OTAG:
    103         case TD3_VLXLT_HASH_KEY_TYPE_ITAG:
    104         case TD3_VLXLT_HASH_KEY_TYPE_VIF_OTAG:
    105         case TD3_VLXLT_HASH_KEY_TYPE_VIF_ITAG:
    106         case TD3_VLXLT_HASH_KEY_TYPE_VIF_VLAN:
    107         case TD3_VLXLT_HASH_KEY_TYPE_VIF_CVLAN:
    108         case TD3_VLXLT_HASH_KEY_TYPE_VIF:
    109         case TD3_VLXLT_HASH_KEY_TYPE_HPAE:
    110         case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC:
    111         case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC_PORT:
    112         case TD3_VLXLT_HASH_KEY_TYPE_PRI_CFI:
    113         default:
    114             *width = 2;
    115             *mem = VLAN_XLATE_1_DOUBLEm;
    116         }
    117         entry_bits = (soc_mem_entry_bits(unit, VLAN_XLATE_1_SINGLEm) - 1)
    118                                                                 * (*width);
    119         meminfo.bytes = SOC_MEM_WORDS(unit, VLAN_XLATE_1_DOUBLEm) * 4 * 2;
    120         
    121         break;
    122 
    123     case EGR_VLAN_XLATE_1_SINGLEm:
    124     case EGR_VLAN_XLATE_1_DOUBLEm:
    125     case EGR_VLAN_XLATE_2_SINGLEm:
    126     case EGR_VLAN_XLATE_2_DOUBLEm:
    127         switch (key_type) {
    128         case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI:
    129         case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI_DVP:
    130         case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI:
    131         case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI_DVP:
    132             *width = 1;
    133             *mem = EGR_VLAN_XLATE_1_SINGLEm;
    134             break;
    135         case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE:
    136         case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE_DVP:
    137         case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE:
    138         case TD3_EVLXLT_HASH_KEY_TYPE_ISID_XLATE:
    139         case TD3_EVLXLT_HASH_KEY_TYPE_ISID_DVP_XLATE:
    140         case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE_DVP:
    141         case TD3_ELVXLT_HASH_KEY_TYPE_VFI_DVP_GROUP:
    142         case TD3_ELVXLT_HASH_KEY_TYPE_VRF_MAPPING:
    143         case TD3_ELVXLT_HASH_KEY_TYPE_VLAN_XLATE_VFI:
    144         default:
    145             *width = 2;
    146             *mem = EGR_VLAN_XLATE_1_DOUBLEm;
    147         }
    148         entry_bits = (soc_mem_entry_bits(unit, EGR_VLAN_XLATE_1_SINGLEm) - 1) 
    149                                                                     * (*width);
    150         meminfo.bytes = SOC_MEM_WORDS(unit, EGR_VLAN_XLATE_1_DOUBLEm) * 4 * 2;
    151         break;
    152 
    153     case MPLS_ENTRY_SINGLEm:
    154     case MPLS_ENTRYm:
    155         switch (key_type) {
    156         case TD3_MPLS_HASH_KEY_TYPE_MPLS:
    157         case TD3_MPLS_HASH_KEY_TYPE_MIM_NVP:
    158         case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID:
    159         case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID_SVP:
    160         case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID_SIP:
    161         case TD3_MPLS_HASH_KEY_TYPE_TRILL:
    162         case TD3_MPLS_HASH_KEY_TYPE_L2GRE_SIP:
    163         case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID:
    164         case TD3_MPLS_HASH_KEY_TYPE_VXLAN_SIP:
    165         case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID:
    166         case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID_SIP:
    167         default:
    168             *width = 2;
    169             *mem = MPLS_ENTRYm;
    170         }
    171         entry_bits = (soc_mem_entry_bits(unit, MPLS_ENTRY_SINGLEm) - 1) 
    172                                                                     * (*width);
    173         meminfo.bytes = SOC_MEM_WORDS(unit, MPLS_ENTRYm) * 4 * 2;
    174         break;
    175     default:
    176         return SOC_E_PARAM;
    177     }
    178 
    179     meminfo.flags = 0;
    180     fieldinfo.flags = SOCF_LE;
    181     fieldinfo.bp =  entry_bits * (ent / *width);
    182     fieldinfo.len = entry_bits;
    183 
    184     (void)soc_meminfo_fieldinfo_field_get(bkt_entry, &meminfo,
    185                                           &fieldinfo, entry);
    186     return SOC_E_NONE;
    187 
    188 }
    189 
    190 
    191 int
    192 soc_hx5_hash_mem_status_get(int unit, soc_mem_t mem, void* entry, uint32 *v) {
    193     int i;
    194     v[0] = v[1] = v[2] = v[3] = 0;
    195 
    196     switch (mem) {
    197     case L3_ENTRY_QUADm:
    198     case EXACT_MATCH_4m:
    199         soc_mem_field_get(unit, mem, entry, BASE_VALID_3f, &v[3]);
    200         soc_mem_field_get(unit, mem, entry, BASE_VALID_2f, &v[2]);
    201         /* pass through */
    202     case L3_ENTRY_DOUBLEm:
    203     case EXACT_MATCH_2m:
    204     case MPLS_ENTRYm:
    205     case VLAN_XLATE_1_DOUBLEm:
    206     case VLAN_XLATE_2_DOUBLEm:
    207     case EGR_VLAN_XLATE_1_DOUBLEm:
    208     case EGR_VLAN_XLATE_2_DOUBLEm:
    209         soc_mem_field_get(unit, mem, entry, BASE_VALID_1f, &v[1]);
    210         soc_mem_field_get(unit, mem, entry, BASE_VALID_0f, &v[0]);
    211         break;
    212     case L3_ENTRY_SINGLEm:
    213     case L3_ENTRY_ONLY_SINGLEm:
    214     case MPLS_ENTRY_SINGLEm:
    215     case VLAN_XLATE_1_SINGLEm:
    216     case VLAN_XLATE_2_SINGLEm:
    217     case EGR_VLAN_XLATE_1_SINGLEm:
    218     case EGR_VLAN_XLATE_2_SINGLEm:
    219         soc_mem_field_get(unit, mem, entry, BASE_VALIDf, &v[0]);
    220         break;
    221     default:
    222         v[0] = v[1] = v[2] = v[3] = 1;
    223         break;
    224 
    225     }
    226     /* Use v[i] for constructing a valid bitmap */
    227     for (i = 0; i < 4; i++) {
    228         v[i] = (v[i] > 0);
    229     }
    230     return SOC_E_NONE;
    231 }
    232 
    233 /* Get number of banks for the hash table according to the config
    234  */
    235 int
    236 soc_helix5_hash_bank_count_get(int unit, soc_mem_t mem, int *num_banks)
    237 {
    238     int count;
    239 
    240     switch (mem) {
    241     case L2Xm:
    242         /*
    243          * 8k single wide entries in each of 2 dedicated L2 bank
    244          * 16k single wide entries in each shared bank (6 shared banks max)
    245          */
    246         count = soc_mem_index_count(unit, mem);
    247         *num_banks = 2 + (count - 2 * 8 * 1024) / (16 * 1024);
    248         break;
    249     case L3_ENTRY_ONLY_SINGLEm:
    250     case L3_ENTRY_ONLY_DOUBLEm:
    251     case L3_ENTRY_ONLY_QUADm:
    252     case L3_ENTRY_SINGLEm:
    253     case L3_ENTRY_DOUBLEm:
    254     case L3_ENTRY_QUADm:
    255         /*
    256          * 8k single wide entries in each of 2 dedicated L3 bank
    257          * 16k entries in each shared bank (6 shared banks max)
    258          */
    259         count = soc_mem_index_count(unit, L3_ENTRY_ONLY_SINGLEm);
    260         *num_banks = 2 + (count - 2 * 8 * 1024) / (16 * 1024);
    261         break;
    262 
    263     case EXACT_MATCH_2m:
    264     case EXACT_MATCH_2_ENTRY_ONLYm:
    265     case EXACT_MATCH_4m:
    266     case EXACT_MATCH_4_ENTRY_ONLYm:
    267         /*
    268          * 8k double wide entries in each shared bank
    269          */
    270         count = soc_mem_index_count(unit, EXACT_MATCH_2m);
    271         *num_banks = count / (8 * 1024);
    272         break;
    273 
    274     /* EUAT
    275      * 4k single wide entries in each shared bank
    276      */
    277     case EGR_VLAN_XLATE_1_SINGLEm:
    278     case EGR_VLAN_XLATE_1_DOUBLEm:
    279         count = soc_mem_index_count(unit, EGR_VLAN_XLATE_1_SINGLEm);
    280         *num_banks = count / (4 * 1024);
    281         break;
    282 
    283     case EGR_VLAN_XLATE_2_SINGLEm:
    284     case EGR_VLAN_XLATE_2_DOUBLEm:
    285         count = soc_mem_index_count(unit, EGR_VLAN_XLATE_2_SINGLEm);
    286         *num_banks = count / (4 * 1024);
    287         break;
    288 
    289     case ING_VP_VLAN_MEMBERSHIPm:
    290     case EGR_VP_VLAN_MEMBERSHIPm:
    291         *num_banks = 2;
    292         break;
    293 
    294     /* IUAT
    295      * 4k single wide entries in each shared bank
    296      */
    297     case MPLS_ENTRY_SINGLEm:
    298     case MPLS_ENTRYm:
    299         count = soc_mem_index_count(unit, MPLS_ENTRY_SINGLEm);
    300         *num_banks = count / (4 * 1024);
    301         break;
    302 
    303     case VLAN_XLATE_1_SINGLEm:
    304     case VLAN_XLATE_1_DOUBLEm:
    305         count = soc_mem_index_count(unit, VLAN_XLATE_1_SINGLEm);
    306         *num_banks = count / (4 * 1024);
    307         break;
    308 
    309     case VLAN_XLATE_2_SINGLEm:
    310     case VLAN_XLATE_2_DOUBLEm:
    311         count = soc_mem_index_count(unit, VLAN_XLATE_2_SINGLEm);
    312         *num_banks = count / (4 * 1024);
    313         break;
    314 
    315     default:
    316         return SOC_E_INTERNAL;
    317     }
    318 
    319     return SOC_E_NONE;
    320 }
    321 
    322 /* Map logical bank to physical bank for a memory 
    323  * mem          - memory
    324  * log_bank     - logical bank number
    325  * phy_bank_id  - physical bank number
    326  */
    327 int
    328 soc_hx5_log_to_phy_bank_map(int unit, soc_mem_t mem, int log_bank,
    329                             int *phy_bank_id)
    330 {
    331     uint32 hash_control_entry[4];
    332     int done = 0;
    333     static const soc_field_t logical_to_physical_fields[] = {
    334         LOGICAL_BANK_0_PHYSICAL_BANK_LOCATIONf,
    335         LOGICAL_BANK_1_PHYSICAL_BANK_LOCATIONf,
    336         LOGICAL_BANK_2_PHYSICAL_BANK_LOCATIONf,
    337         LOGICAL_BANK_3_PHYSICAL_BANK_LOCATIONf,
    338         LOGICAL_BANK_4_PHYSICAL_BANK_LOCATIONf,
    339         LOGICAL_BANK_5_PHYSICAL_BANK_LOCATIONf,
    340         LOGICAL_BANK_6_PHYSICAL_BANK_LOCATIONf,
    341         LOGICAL_BANK_7_PHYSICAL_BANK_LOCATIONf
    342     };
    343     int logical_to_physical_fields_num = sizeof(logical_to_physical_fields)/
    344                                          sizeof(soc_field_t);
    345 
    346     if(log_bank < 0 || log_bank >= logical_to_physical_fields_num) {
    347         return SOC_E_PARAM;
    348     }
    349 
    350     sal_memset(hash_control_entry, 0, sizeof(hash_control_entry));
    351 
    352     switch(mem) {
    353     case L2Xm:
    354         /* Dedicated Banks */
    355         if (log_bank < 2) {
    356             *phy_bank_id = log_bank;
    357             done = 1;
    358         } else { /* Shared Banks */
    359             mem = L2_ENTRY_HASH_CONTROLm;
    360         }
    361         break;
    362     case L3_ENTRY_SINGLEm:
    363     case L3_ENTRY_ONLY_SINGLEm:
    364     case L3_ENTRY_DOUBLEm:
    365     case L3_ENTRY_ONLY_DOUBLEm:
    366     case L3_ENTRY_QUADm:
    367     case L3_ENTRY_ONLY_QUADm:
    368         /* Dedicated Banks */
    369         if (log_bank < 2) {
    370             *phy_bank_id = log_bank + 8;
    371             done = 1;
    372         } else { /* Shared Banks */
    373             mem = L3_ENTRY_HASH_CONTROLm;
    374         }
    375         break;
    376     case EXACT_MATCH_2m:
    377     case EXACT_MATCH_2_PIPE0m:
    378     case EXACT_MATCH_4m:
    379     case EXACT_MATCH_4_PIPE0m:
    380         if (log_bank < 0 || log_bank > 5) {
    381             return SOC_E_PARAM;
    382         } else {
    383             mem = EXACT_MATCH_HASH_CONTROLm;
    384         }
    385         break;
    386     case MPLS_ENTRY_SINGLEm:
    387     case MPLS_ENTRYm:
    388         if (log_bank < 0 || log_bank > 7) {
    389             return SOC_E_PARAM;
    390         } else {
    391             mem = MPLS_ENTRY_HASH_CONTROLm;
    392         }
    393         break;
    394     case VLAN_XLATE_1_SINGLEm:
    395     case VLAN_XLATE_1_DOUBLEm:
    396         if (log_bank < 0 || log_bank > 7) {
    397             return SOC_E_PARAM;
    398         } else {
    399             mem = VLAN_XLATE_1_HASH_CONTROLm;
    400         }
    401         break;
    402     case VLAN_XLATE_2_SINGLEm:
    403     case VLAN_XLATE_2_DOUBLEm:
    404         if (log_bank < 0 || log_bank > 7) {
    405             return SOC_E_PARAM;
    406         } else {
    407             mem = VLAN_XLATE_2_HASH_CONTROLm;
    408         }
    409         break;
    410     case EGR_VLAN_XLATE_1_SINGLEm:
    411     case EGR_VLAN_XLATE_1_DOUBLEm:
    412         if (log_bank < 0 || log_bank > 3) {
    413             return SOC_E_PARAM;
    414         } else {
    415             mem = EGR_VLAN_XLATE_1_HASH_CONTROLm;
    416         }
    417         break;
    418     case EGR_VLAN_XLATE_2_SINGLEm:
    419     case EGR_VLAN_XLATE_2_DOUBLEm:
    420         if (log_bank < 0 || log_bank > 3) {
    421             return SOC_E_PARAM;
    422         } else {
    423             mem = EGR_VLAN_XLATE_2_HASH_CONTROLm;
    424         }
    425         break;
    426     default:
    427         *phy_bank_id = log_bank;
    428         done = 1;
    429     }
    430     /* Shared Banks */
    431     if (done == 0) {
    432         SOC_IF_ERROR_RETURN(soc_mem_read(unit, mem, MEM_BLOCK_ALL, 0,
    433                                          hash_control_entry));
    434         *phy_bank_id = soc_mem_field32_get(unit, mem, hash_control_entry,
    435                                            logical_to_physical_fields[log_bank]);
    436     }
    437     return SOC_E_NONE;
    438 }
    439 
    440 /* Map physical to logical bank for a memory 
    441  * mem      - memory
    442  * phy_bank - physical bank number
    443  * log_bank - logical bank number
    444  */
    445 int
    446 soc_hx5_phy_to_log_bank_map(int unit, soc_mem_t mem, int phy_bank,
    447                             int *log_bank)
    448 {
    449     uint32 hash_control_entry[4];
    450     int i, done = 0;
    451     int bank_min, bank_max;
    452     static const soc_field_t logical_to_physical_fields[] = {
    453         LOGICAL_BANK_0_PHYSICAL_BANK_LOCATIONf,
    454         LOGICAL_BANK_1_PHYSICAL_BANK_LOCATIONf,
    455         LOGICAL_BANK_2_PHYSICAL_BANK_LOCATIONf,
    456         LOGICAL_BANK_3_PHYSICAL_BANK_LOCATIONf,
    457         LOGICAL_BANK_4_PHYSICAL_BANK_LOCATIONf,
    458         LOGICAL_BANK_5_PHYSICAL_BANK_LOCATIONf,
    459         LOGICAL_BANK_6_PHYSICAL_BANK_LOCATIONf,
    460         LOGICAL_BANK_7_PHYSICAL_BANK_LOCATIONf
    461     };
    462 
    463     sal_memset(hash_control_entry, 0, sizeof(hash_control_entry));
    464 
    465     switch(mem) {
    466     case L2Xm:
    467         bank_min = 2;
    468         bank_max = 7;
    469         /* Dedicated Banks */
    470         if (phy_bank < 2) {
    471             *log_bank = phy_bank;
    472             done = 1;
    473         } else { /* Shared Banks */
    474             mem = L2_ENTRY_HASH_CONTROLm;
    475         }
    476         break;
    477     case L3_ENTRY_SINGLEm:
    478     case L3_ENTRY_ONLY_SINGLEm:
    479     case L3_ENTRY_DOUBLEm:
    480     case L3_ENTRY_ONLY_DOUBLEm:
    481     case L3_ENTRY_QUADm:
    482     case L3_ENTRY_ONLY_QUADm:
    483         bank_min = 2;
    484         bank_max = 9;
    485         /* Dedicated Banks */
    486         if (phy_bank > 7) {
    487             *log_bank = phy_bank - 8;
    488             done = 1;
    489         } else { /* Shared Banks */
    490             mem = L3_ENTRY_HASH_CONTROLm;
    491         }
    492         break;
    493     case EXACT_MATCH_2m:
    494     case EXACT_MATCH_2_PIPE0m:
    495     case EXACT_MATCH_4m:
    496     case EXACT_MATCH_4_PIPE0m:
    497         bank_min = 0;
    498         bank_max = 5;
    499         mem = EXACT_MATCH_HASH_CONTROLm;
    500         break;
    501     case MPLS_ENTRY_SINGLEm:
    502     case MPLS_ENTRYm:
    503         bank_min = 0;
    504         bank_max = 7;
    505         mem = MPLS_ENTRY_HASH_CONTROLm;
    506         break;
    507     case VLAN_XLATE_1_SINGLEm:
    508     case VLAN_XLATE_1_DOUBLEm:
    509         bank_min = 0;
    510         bank_max = 7;
    511         mem = VLAN_XLATE_1_HASH_CONTROLm;
    512         break;
    513     case VLAN_XLATE_2_SINGLEm:
    514     case VLAN_XLATE_2_DOUBLEm:
    515         bank_min = 0;
    516         bank_max = 7;
    517         mem = VLAN_XLATE_2_HASH_CONTROLm;
    518         break;
    519     case EGR_VLAN_XLATE_1_SINGLEm:
    520     case EGR_VLAN_XLATE_1_DOUBLEm:
    521         bank_min = 0;
    522         bank_max = 7;
    523         mem = EGR_VLAN_XLATE_1_HASH_CONTROLm;
    524         break;
    525     case EGR_VLAN_XLATE_2_SINGLEm:
    526     case EGR_VLAN_XLATE_2_DOUBLEm:
    527         bank_min = 0;
    528         bank_max = 7;
    529         mem = EGR_VLAN_XLATE_2_HASH_CONTROLm;
    530         break;
    531     default:
    532         *log_bank = phy_bank;
    533         done = 1;
    534     }
    535 
    536     /* Shared Banks */
    537     if (done == 0) {
    538         /* Sanity */
    539         if (phy_bank < bank_min || phy_bank > bank_max) {
    540             return SOC_E_PARAM;
    541         }
    542 
    543         SOC_IF_ERROR_RETURN(soc_mem_read(unit, mem, MEM_BLOCK_ALL, 0,
    544                                          hash_control_entry));
    545         for (i = bank_min; i <= bank_max; i++) { 
    546             if(soc_mem_field32_get(unit, mem, hash_control_entry,
    547                                    logical_to_physical_fields[i]) == phy_bank) {
    548                 *log_bank = i;
    549                 done = 1;
    550                 break;
    551             }
    552         }
    553     }
    554     return (done ? SOC_E_NONE : SOC_E_PARAM);
    555 }
    556 
    557 /* Get bank bitmap for the hash table 
    558  * Required only for shared hash tables
    559  */
    560 int
    561 soc_hx5_hash_bank_phy_bitmap_get(int unit, soc_mem_t mem, uint32 *bitmap)
    562 {
    563     uint32 hash_control_entry[4];
    564     switch(mem) {
    565     case L2Xm:
    566         mem = L2_ENTRY_HASH_CONTROLm;
    567         break;
    568     case L3_ENTRY_SINGLEm:
    569     case L3_ENTRY_ONLY_SINGLEm:
    570     case L3_ENTRY_DOUBLEm:
    571     case L3_ENTRY_ONLY_DOUBLEm:
    572     case L3_ENTRY_QUADm:
    573     case L3_ENTRY_ONLY_QUADm:
    574         mem = L3_ENTRY_HASH_CONTROLm;
    575         break;
    576     case EXACT_MATCH_2m:
    577     case EXACT_MATCH_2_PIPE0m:
    578     case EXACT_MATCH_4m:
    579     case EXACT_MATCH_4_PIPE0m:
    580         mem = EXACT_MATCH_HASH_CONTROLm;
    581         break;
    582     case MPLS_ENTRY_SINGLEm:
    583     case MPLS_ENTRYm:
    584         mem = MPLS_ENTRY_HASH_CONTROLm;
    585         break;
    586     case VLAN_XLATE_1_SINGLEm:
    587     case VLAN_XLATE_1_DOUBLEm:
    588         mem = VLAN_XLATE_1_HASH_CONTROLm;
    589         break;
    590     case VLAN_XLATE_2_SINGLEm:
    591     case VLAN_XLATE_2_DOUBLEm:
    592         mem = VLAN_XLATE_2_HASH_CONTROLm;
    593         break;
    594     case EGR_VLAN_XLATE_1_SINGLEm:
    595     case EGR_VLAN_XLATE_1_DOUBLEm:
    596         mem = EGR_VLAN_XLATE_1_HASH_CONTROLm;
    597         break;
    598     case EGR_VLAN_XLATE_2_SINGLEm:
    599     case EGR_VLAN_XLATE_2_DOUBLEm:
    600         mem = EGR_VLAN_XLATE_2_HASH_CONTROLm;
    601         break;
    602     default:
    603         return SOC_E_PARAM;
    604     }
    605 
    606     SOC_IF_ERROR_RETURN(soc_mem_read(unit, mem, MEM_BLOCK_ALL, 0,
    607                                      hash_control_entry));
    608     *bitmap = soc_mem_field32_get(unit, mem, hash_control_entry,
    609                                   HASH_TABLE_BANK_CONFIGf);
    610 
    611     return SOC_E_NONE;
    612 }
    613 
    614 /* Map bank sequence number to physical bank number */
    615 int
    616 soc_hx5_hash_bank_number_get(int unit, soc_mem_t mem, int seq_num,
    617                              int *bank_num) {
    618     int count;
    619 
    620     SOC_IF_ERROR_RETURN(soc_helix5_hash_bank_count_get(unit, mem, &count));
    621     if (seq_num < 0 || seq_num >= count) {
    622         return SOC_E_INTERNAL;
    623     }
    624     SOC_IF_ERROR_RETURN(soc_hx5_log_to_phy_bank_map(unit, mem, seq_num,
    625                                                         bank_num));
    626 
    627     return SOC_E_NONE;
    628 }
    629 
    630 int
    631 soc_hx5_hash_seq_number_get(int unit, soc_mem_t mem, int bank_num, int *seq_num)
    632 {
    633     int count;
    634 
    635     SOC_IF_ERROR_RETURN(soc_hx5_phy_to_log_bank_map(unit, mem, bank_num,
    636                                                     seq_num));
    637 
    638     SOC_IF_ERROR_RETURN(soc_helix5_hash_bank_count_get(unit, mem, &count));
    639     if (*seq_num < 0 || *seq_num >= count) {
    640         return SOC_E_INTERNAL;
    641     }
    642 
    643     return SOC_E_NONE;
    644 }
    645 
    646 
    647 int
    648 soc_hx5_hash_bank_info_get(int unit, soc_mem_t mem, int bank,
    649                            int *entries_per_bank, int *entries_per_row,
    650                            int *entries_per_bucket, int *bank_base,
    651                            int *bucket_offset)
    652 {
    653     int bank_size, row_size, bucket_size, base, offset;
    654     int seq_num = 0;
    655     /* int uat_8k_banks = 0, uat_16k_banks = 0; */
    656 
    657     /* Get logical bank number from input physical bank number */
    658     SOC_IF_ERROR_RETURN(soc_hx5_phy_to_log_bank_map(unit, mem, bank, &seq_num));
    659     bank = seq_num;
    660 
    661     switch(mem) {
    662     case L2Xm:
    663         /*
    664          * 4 entries per bucket (1 bucket per row)
    665          * bank 0 - 1 -> dedicated banks - 8k entries each
    666          * bank 2 - 7 -> shared banks - 16k entries each
    667          */
    668         row_size = 4;
    669         bucket_size = 4;
    670         offset = 0;
    671         if (bank < 0 || bank > 7) {
    672             return SOC_E_INTERNAL;
    673         } else if (bank < 2) { /* Dedicated bank */
    674             bank_size = 8192;
    675             base = bank * bank_size;
    676         } else { /* Shared bank */
    677             bank_size = 16384;
    678             base = 16384 + (bank - 2) * bank_size;
    679         }
    680         break;
    681     case L3_ENTRY_ONLY_SINGLEm:
    682 #ifdef BCM_HELIX5_SUPPORT
    683     case L3_ENTRY_SINGLEm:
    684     case L3_ENTRY_DOUBLEm:
    685     case L3_ENTRY_QUADm:
    686 #endif /* BCM_HELIX5_SUPPORT */
    687         /*
    688          * 4 entries per bucket (1 bucket per row)
    689          * bank 0 - 1 -> dedicated banks - 8k entries each
    690          * bank 2 - 7 -> shared banks - 16k entries each
    691          */
    692         row_size = 4;
    693         bucket_size = 4;
    694         offset = 0;
    695         if (bank < 0 || bank > 7) {
    696             return SOC_E_INTERNAL;
    697         } else if (bank < 2) { /* Dedicated bank */
    698             if (mem == L3_ENTRY_QUADm) {
    699                 bank_size = 8192/4;
    700                 base = bank * bank_size;
    701                 row_size = 4;
    702             } else if (mem == L3_ENTRY_DOUBLEm) {
    703                 bank_size = 8192/2;
    704                 base = bank * bank_size;
    705                 row_size = 4;
    706             } else {
    707                 bank_size = 8192;
    708                 base = bank * bank_size;
    709             }
    710         } else { /* Shared bank */
    711             bank_size = 16384;
    712             if (mem == L3_ENTRY_QUADm) {
    713                 bank_size = bank_size/4;
    714                 base = 16384/4;
    715                 row_size = 1;
    716             } else if (mem == L3_ENTRY_DOUBLEm) {
    717                 bank_size = bank_size/2;
    718                 base = 16384/2;
    719                 row_size = 2;
    720             } else {
    721                 base = 16384;
    722             }
    723             base += ((bank-2)*bank_size);
    724         }
    725         break;
    726     case EXACT_MATCH_2m:
    727     case EXACT_MATCH_2_PIPE0m:
    728         /* 2 entries per bucket
    729          * bank 0 - 5 -> shared banks - 8k entries each
    730          */
    731         row_size = 2;
    732         bucket_size = 2;
    733         offset = 0;
    734         bank_size = 8192;
    735         base = bank * bank_size;
    736         break;
    737     case EXACT_MATCH_4m:
    738     case EXACT_MATCH_4_PIPE0m:
    739         /* 1 entries per bucket
    740          * bank 0 - 5 -> shared banks - 4k entries each
    741          */
    742         row_size = 1;
    743         bucket_size = 1;
    744         offset = 0;
    745         bank_size = 4096;
    746         base = bank * bank_size;
    747         break;
    748     case EGR_VLAN_XLATE_1_DOUBLEm:
    749     case EGR_VLAN_XLATE_2_DOUBLEm:
    750     case EGR_VLAN_XLATE_1_SINGLEm:
    751     case EGR_VLAN_XLATE_2_SINGLEm:
    752         /* 2 entries per bucket
    753          * bank 0 - 3 -> shared banks - 4k entries each
    754          */
    755         row_size = ((mem == EGR_VLAN_XLATE_1_DOUBLEm) ||
    756                     (mem == EGR_VLAN_XLATE_2_DOUBLEm)) ? 2 : 4;
    757         offset = 0;
    758         bucket_size = 4;
    759         bank_size = 4096;
    760         base = bank * bank_size;
    761         if ((mem == EGR_VLAN_XLATE_1_DOUBLEm) ||
    762             (mem == EGR_VLAN_XLATE_2_DOUBLEm)) {
    763             base /= 2;
    764         }
    765         break;
    766     case MPLS_ENTRY_SINGLEm:
    767     case MPLS_ENTRYm:
    768     case VLAN_XLATE_1_SINGLEm:
    769     case VLAN_XLATE_1_DOUBLEm:
    770     case VLAN_XLATE_2_SINGLEm:
    771     case VLAN_XLATE_2_DOUBLEm:
    772 
    773         row_size = ((mem == VLAN_XLATE_1_DOUBLEm) ||
    774                     (mem == VLAN_XLATE_2_DOUBLEm) ||
    775                     (mem == MPLS_ENTRYm)) ? 2 : 4;
    776 
    777         bucket_size = 4;
    778         offset = 0;
    779         bank_size = 4096;
    780         base = bank * bank_size;
    781 
    782         if ((mem == MPLS_ENTRYm) ||
    783             (mem == VLAN_XLATE_1_DOUBLEm) ||
    784             (mem == VLAN_XLATE_2_DOUBLEm)) {
    785             base /= 2;
    786         }
    787 
    788         break;
    789 
    790     case ING_VP_VLAN_MEMBERSHIPm:
    791     case EGR_VP_VLAN_MEMBERSHIPm:
    792         /* 
    793          * First half of entries in each row are for bank 0
    794          * Second half of entries are for bank 1
    795          */
    796         bank_size = soc_mem_index_count(unit, mem) / 2;
    797         row_size = 4;
    798         bucket_size = 4;
    799         base = 0;
    800         offset = bank * bucket_size;
    801         break;
    802     default:
    803         return SOC_E_INTERNAL;
    804     }
    805 
    806     if (entries_per_bank != NULL) {
    807         *entries_per_bank = bank_size;
    808     }
    809     if (entries_per_row != NULL) {
    810         *entries_per_row = row_size;
    811     }
    812     if (entries_per_bucket != NULL) {
    813         *entries_per_bucket = bucket_size;
    814     }
    815     if (bank_base != NULL) {
    816         *bank_base = base;
    817     }
    818     if (bucket_offset != NULL) {
    819         *bucket_offset = offset;
    820     }
    821     return SOC_E_NONE;
    822 }
    823 
    824 STATIC int
    825 _soc_hx5_hash_entry_to_key(int unit, int bank, void *entry, uint8 *key,
    826                            soc_mem_t mem, soc_field_t *field_list, soc_mem_t mem_view)
    827 {
    828     soc_field_t field;
    829     int index, key_index, val_index, fval_index;
    830     int right_shift_count, left_shift_count;
    831     uint32 val[SOC_MAX_MEM_WORDS], fval[SOC_MAX_MEM_WORDS];
    832     int bits, val_bits, fval_bits, nbits;
    833     int8 field_length[16];
    834 
    835 #ifdef SOC_ROBUST_HASH
    836     soc_robust_hash_config_t *rbh_cfg = NULL;
    837 #endif /* SOC_ROBUST_HASH */
    838 
    839     val_bits = 0;
    840     for (index = 0; field_list[index] != INVALIDf; index++) {
    841         field = field_list[index];
    842         field_length[index] = soc_mem_field_length(unit, mem, field);
    843         val_bits += field_length[index];
    844     }
    845 
    846     switch (mem) {
    847     case L2Xm:
    848         val_bits = SOC_TD3_L2_MAX_KEY_WIDTH;
    849         break;
    850     case L3_ENTRY_ONLY_SINGLEm:
    851     case L3_ENTRY_SINGLEm:
    852     case L3_ENTRY_DOUBLEm:
    853     case L3_ENTRY_QUADm:
    854         val_bits = SOC_TD3_L3_MAX_KEY_WIDTH;
    855         break;
    856     case EXACT_MATCH_2m:
    857         val_bits = SOC_TD3_EXACT_MATCH_MAX_KEY_WIDTH;
    858         break;
    859     case MPLS_ENTRY_SINGLEm:
    860     case MPLS_ENTRYm:
    861         val_bits = SOC_TD3_MPLS_MAX_KEY_WIDTH;
    862         break;
    863     case VLAN_XLATE_1_SINGLEm:
    864     case VLAN_XLATE_1_DOUBLEm:
    865     case VLAN_XLATE_2_SINGLEm:
    866     case VLAN_XLATE_2_DOUBLEm:
    867         val_bits = SOC_TD3_VLAN_XLATE_MAX_KEY_WIDTH;
    868         break;
    869     case EGR_VLAN_XLATE_1_SINGLEm:
    870     case EGR_VLAN_XLATE_1_DOUBLEm:
    871     case EGR_VLAN_XLATE_2_SINGLEm:
    872     case EGR_VLAN_XLATE_2_DOUBLEm:
    873         val_bits = SOC_TD3_EGR_VLAN_XLATE_MAX_KEY_WIDTH;
    874         break;
    875     case ING_VP_VLAN_MEMBERSHIPm:
    876         val_bits = SOC_TD3_ING_VP_VLAN_MEMBERSHIP_MAX_KEY_WIDTH;
    877         break;
    878     case EGR_VP_VLAN_MEMBERSHIPm:
    879         val_bits = SOC_TD3_EGR_VP_VLAN_MEMBERSHIP_MAX_KEY_WIDTH;
    880         break;
    881     default:
    882         break;
    883     }
    884 
    885     nbits = val_bits;
    886 
    887 #ifdef SOC_ROBUST_HASH
    888     if (soc_feature(unit, soc_feature_robust_hash)) {
    889         switch (mem) {
    890         case L2Xm:
    891             rbh_cfg = &(ROBUSTHASH(unit)->l2);
    892             break;
    893         case L3_ENTRY_ONLY_SINGLEm:
    894         case L3_ENTRY_SINGLEm:
    895         case L3_ENTRY_DOUBLEm:
    896         case L3_ENTRY_QUADm:
    897             rbh_cfg = &(ROBUSTHASH(unit)->l3);
    898             break;
    899         case EXACT_MATCH_2m:
    900             rbh_cfg = &(ROBUSTHASH(unit)->exact_match);
    901             break;
    902         case VLAN_XLATE_1_SINGLEm:
    903         case VLAN_XLATE_1_DOUBLEm:
    904             rbh_cfg = &(ROBUSTHASH(unit)->ing_xlate_1);
    905             break;
    906         case VLAN_XLATE_2_SINGLEm:
    907         case VLAN_XLATE_2_DOUBLEm:
    908             rbh_cfg = &(ROBUSTHASH(unit)->ing_xlate_2);
    909             break;
    910         case MPLS_ENTRY_SINGLEm:
    911         case MPLS_ENTRYm:
    912             rbh_cfg = &(ROBUSTHASH(unit)->mpls_entry);
    913             break;
    914         case EGR_VLAN_XLATE_1_SINGLEm:
    915         case EGR_VLAN_XLATE_1_DOUBLEm:
    916             rbh_cfg = &(ROBUSTHASH(unit)->egr_xlate_1);
    917             break;
    918         case EGR_VLAN_XLATE_2_SINGLEm:
    919         case EGR_VLAN_XLATE_2_DOUBLEm:
    920             rbh_cfg = &(ROBUSTHASH(unit)->egr_xlate_2);
    921             break;
    922         case ING_VP_VLAN_MEMBERSHIPm:
    923             rbh_cfg = &(ROBUSTHASH(unit)->ing_vp_vlan_member);
    924             break;
    925         case EGR_VP_VLAN_MEMBERSHIPm:
    926             rbh_cfg = &(ROBUSTHASH(unit)->egr_vp_vlan_member);
    927             break;
    928         default:
    929             break;
    930         }
    931     }
    932 
    933 #endif /* SOC_ROBUST_HASH */
    934     bits = val_bits;
    935     val_bits = 0;
    936 
    937     sal_memset(val, 0, sizeof(val));
    938     for (index = 0; field_list[index] != INVALIDf; index++) {
    939         field = field_list[index];
    940         soc_mem_field_get(unit, mem, entry, field, fval);
    941         fval_bits = field_length[index];
    942 
    943         val_index = val_bits >> 5;
    944         fval_index = 0;
    945         left_shift_count = val_bits & 0x1f;
    946         right_shift_count = 32 - left_shift_count;
    947         val_bits += fval_bits;
    948 
    949         if (left_shift_count) {
    950             for (; fval_bits > 0; fval_bits -= 32) {
    951                 val[val_index++] |= fval[fval_index] << left_shift_count;
    952                 val[val_index] |= fval[fval_index++] >> right_shift_count;
    953             }
    954         } else {
    955             for (; fval_bits > 0; fval_bits -= 32) {
    956                 val[val_index++] = fval[fval_index++];
    957             }
    958         }
    959     }
    960 
    961     key_index = 0;
    962     for (val_index = 0; val_bits > 0; val_index++) {
    963         for (right_shift_count = 0; right_shift_count < 32;
    964              right_shift_count += 8) {
    965             if (val_bits <= 0) {
    966                 break;
    967             }
    968             key[key_index++] = (val[val_index] >> right_shift_count) & 0xff;
    969             val_bits -= 8;
    970         }
    971     }
    972 
    973     if ((bits + 7) / 8 > key_index) {
    974         sal_memset(&key[key_index], 0, (bits + 7) / 8 - key_index);
    975     }
    976 
    977     bits = (((nbits - 1) / 32) + 1) * 32;
    978 
    979 #ifdef SOC_ROBUST_HASH
    980     if (soc_feature(unit, soc_feature_robust_hash)) {
    981         if (rbh_cfg) {
    982             if (rbh_cfg->enable) {
    983                 (void) soc_robust_hash_get(unit, rbh_cfg, bank, key, nbits);
    984             }
    985 
    986             bits += ROBUST_HASH_KEY_SPACE_WIDTH;
    987         }
    988     }
    989 
    990 #endif /* SOC_ROBUST_HASH */
    991 
    992     return bits;
    993 }
    994 
    995 int
    996 soc_hx5_hash_offset_get(int unit, soc_mem_t mem, int bank, int *hash_offset,
    997                         int *use_lsb)
    998 {
    999     uint32 hash_control_entry[4];
   1000     int is_shared = 1;
   1001     soc_mem_t shared_mem = INVALIDm;
   1002     soc_field_t field;
   1003     static const soc_field_t uft_fields[] = {
   1004         HASH_OFFSET_DEDICATED_BANK_0f, HASH_OFFSET_DEDICATED_BANK_1f,
   1005         B0_HASH_OFFSETf, B1_HASH_OFFSETf, B2_HASH_OFFSETf, B3_HASH_OFFSETf,
   1006         B4_HASH_OFFSETf, B5_HASH_OFFSETf
   1007 
   1008     };
   1009     static const soc_field_t uat_fields[] = {
   1010         B0_HASH_OFFSETf, B1_HASH_OFFSETf, B2_HASH_OFFSETf, B3_HASH_OFFSETf,
   1011         B4_HASH_OFFSETf, B5_HASH_OFFSETf, B6_HASH_OFFSETf, B7_HASH_OFFSETf,
   1012     };
   1013 
   1014     sal_memset(hash_control_entry, 0, sizeof(hash_control_entry));
   1015 
   1016     switch(mem) {
   1017     case L2Xm:
   1018         /* Sanity Check */
   1019         if (bank < 0 || bank > 7) {
   1020             return SOC_E_PARAM;
   1021         }
   1022         mem = L2_ENTRY_HASH_CONTROLm;
   1023         shared_mem = UFT_SHARED_BANKS_CONTROLm;
   1024         is_shared = bank > 1;
   1025         field = uft_fields[bank];
   1026         break;
   1027     case L3_ENTRY_ONLY_SINGLEm:
   1028 #ifdef BCM_HELIX5_SUPPORT
   1029     case L3_ENTRY_SINGLEm:
   1030     case L3_ENTRY_DOUBLEm:
   1031     case L3_ENTRY_QUADm:
   1032 #endif /* BCM_HELIX5_SUPPORT */
   1033         if (bank < 2 || bank > 9) {
   1034             return SOC_E_PARAM;
   1035         }
   1036         /* Dedicated banks */
   1037         if (bank >= 8 && bank <= 9) {
   1038             bank = bank - 8;
   1039             is_shared = 0;
   1040         }
   1041         mem = L3_ENTRY_HASH_CONTROLm;
   1042         shared_mem = UFT_SHARED_BANKS_CONTROLm;
   1043         field = uft_fields[bank];
   1044         break;
   1045     case EXACT_MATCH_2m:
   1046     case EXACT_MATCH_4m:
   1047         if (bank < 2 || bank > 7) {
   1048             return SOC_E_PARAM;
   1049         }
   1050         mem = EXACT_MATCH_HASH_CONTROLm;
   1051         shared_mem = UFT_SHARED_BANKS_CONTROLm;
   1052         field = uft_fields[bank];
   1053         break;
   1054     case EGR_VLAN_XLATE_1_SINGLEm:
   1055     case EGR_VLAN_XLATE_1_DOUBLEm:
   1056         if (bank < 0 || bank > 3) {
   1057             return SOC_E_PARAM;
   1058         }
   1059         mem = EGR_VLAN_XLATE_1_HASH_CONTROLm;
   1060         shared_mem = EP_UAT_SHARED_BANKS_CONTROLm;
   1061         field = uat_fields[bank];
   1062         break;
   1063     case EGR_VLAN_XLATE_2_SINGLEm:
   1064     case EGR_VLAN_XLATE_2_DOUBLEm:
   1065         if (bank < 0 || bank > 3) {
   1066             return SOC_E_PARAM;
   1067         }
   1068         mem = EGR_VLAN_XLATE_2_HASH_CONTROLm;
   1069         shared_mem = EP_UAT_SHARED_BANKS_CONTROLm;
   1070         field = uat_fields[bank];
   1071         break;
   1072     case MPLS_ENTRY_SINGLEm:
   1073     case MPLS_ENTRYm:
   1074         if (bank < 0 || bank > 7) {
   1075             return SOC_E_PARAM;
   1076         }
   1077         mem = MPLS_ENTRY_HASH_CONTROLm;
   1078         shared_mem = IP_UAT_SHARED_BANKS_CONTROLm;
   1079         field = uat_fields[bank];
   1080         break;
   1081     case VLAN_XLATE_1_SINGLEm:
   1082     case VLAN_XLATE_1_DOUBLEm:
   1083         if (bank < 0 || bank > 7) {
   1084             return SOC_E_PARAM;
   1085         }
   1086         mem = VLAN_XLATE_1_HASH_CONTROLm;
   1087         shared_mem = IP_UAT_SHARED_BANKS_CONTROLm;
   1088         field = uat_fields[bank];
   1089         break;
   1090     case VLAN_XLATE_2_SINGLEm:
   1091     case VLAN_XLATE_2_DOUBLEm:
   1092         if (bank < 0 || bank > 7) {
   1093             return SOC_E_PARAM;
   1094         }
   1095         mem = VLAN_XLATE_2_HASH_CONTROLm;
   1096         shared_mem = IP_UAT_SHARED_BANKS_CONTROLm;
   1097         field = uat_fields[bank];
   1098         break;
   1099     case ING_VP_VLAN_MEMBERSHIPm:
   1100         if (bank < 0 || bank > 2) {
   1101             return SOC_E_PARAM;
   1102         }
   1103         mem = ING_VP_VLAN_MEMBERSHIP_HASH_CONTROLm;
   1104         field = uft_fields[bank];
   1105         is_shared = 0;
   1106         break;
   1107     case EGR_VP_VLAN_MEMBERSHIPm:
   1108         if (bank < 0 || bank > 2) {
   1109             return SOC_E_PARAM;
   1110         }
   1111         mem = EGR_VP_VLAN_MEMBERSHIP_HASH_CONTROLm;
   1112         field = uft_fields[bank];
   1113         is_shared = 0;  
   1114         break;
   1115     default:
   1116         return SOC_E_INTERNAL;
   1117     }
   1118 
   1119     SOC_IF_ERROR_RETURN(soc_mem_read(unit, mem, MEM_BLOCK_ALL, 0,
   1120                                      hash_control_entry));
   1121     *use_lsb = soc_mem_field32_get(unit, mem, hash_control_entry,
   1122                                    HASH_TABLE_TEST_MODEf);
   1123 
   1124     /* Shared Banks */
   1125     if (is_shared > 0) {
   1126         sal_memset(hash_control_entry, 0, sizeof(hash_control_entry));
   1127         SOC_IF_ERROR_RETURN(soc_mem_read(unit, shared_mem, MEM_BLOCK_ALL, 0,
   1128                                          hash_control_entry));
   1129         *hash_offset = soc_mem_field32_get(unit, shared_mem,
   1130                                            hash_control_entry, field);
   1131     } else {
   1132         *hash_offset = soc_mem_field32_get(unit, mem, hash_control_entry, field);
   1133     }
   1134 
   1135     return SOC_E_NONE;
   1136 
   1137 }
   1138 
   1139 int
   1140 soc_hx5_hash_offset_set(int unit, soc_mem_t mem, int bank, int hash_offset,
   1141                         int use_lsb)
   1142 {
   1143     uint32 hash_control_entry[4];
   1144     int is_shared = 1;
   1145     soc_mem_t shared_mem = INVALIDm;
   1146     soc_field_t field;
   1147     static const soc_field_t uft_fields[] = {
   1148         HASH_OFFSET_DEDICATED_BANK_0f, HASH_OFFSET_DEDICATED_BANK_1f,
   1149         B0_HASH_OFFSETf, B1_HASH_OFFSETf, B2_HASH_OFFSETf, B3_HASH_OFFSETf,
   1150         B4_HASH_OFFSETf, B5_HASH_OFFSETf
   1151 
   1152     };
   1153     static const soc_field_t uat_fields[] = {
   1154         B0_HASH_OFFSETf, B1_HASH_OFFSETf, B2_HASH_OFFSETf, B3_HASH_OFFSETf
   1155     };
   1156 
   1157     sal_memset(hash_control_entry, 0, sizeof(hash_control_entry));
   1158 
   1159     switch(mem) {
   1160     case L2Xm:
   1161         /* Sanity Check */
   1162         if (bank < 0 || bank > 7) {
   1163             return SOC_E_PARAM;
   1164         }
   1165         mem = L2_ENTRY_HASH_CONTROLm;
   1166         shared_mem = UFT_SHARED_BANKS_CONTROLm;
   1167         is_shared = bank > 1;
   1168         field = uft_fields[bank];
   1169         break;
   1170     case L3_ENTRY_ONLY_SINGLEm:
   1171         if (bank < 2 || bank > 9) {
   1172             return SOC_E_PARAM;
   1173         }
   1174         /* Dedicated banks */
   1175         if (bank >= 8 && bank <= 9) {
   1176             is_shared = 0;
   1177         }
   1178         mem = L3_ENTRY_HASH_CONTROLm;
   1179         shared_mem = UFT_SHARED_BANKS_CONTROLm;
   1180         field = uft_fields[(bank > 7)? (bank - 8) : bank];
   1181         break;
   1182     case EXACT_MATCH_2m:
   1183     case EXACT_MATCH_4m:
   1184         if (bank < 2 || bank > 7) {
   1185             return SOC_E_PARAM;
   1186         }
   1187         mem = EXACT_MATCH_HASH_CONTROLm;
   1188         shared_mem = UFT_SHARED_BANKS_CONTROLm;
   1189         field = uft_fields[bank];
   1190         break;
   1191     case EGR_VLAN_XLATE_1_SINGLEm:
   1192         if (bank < 0 || bank > 3) {
   1193             return SOC_E_PARAM;
   1194         }
   1195         mem = EGR_VLAN_XLATE_1_HASH_CONTROLm;
   1196         shared_mem = EP_UAT_SHARED_BANKS_CONTROLm;
   1197         field = uat_fields[bank];
   1198         break;
   1199     case EGR_VLAN_XLATE_2_SINGLEm:
   1200         if (bank < 0 || bank > 3) {
   1201             return SOC_E_PARAM;
   1202         }
   1203         mem = EGR_VLAN_XLATE_2_HASH_CONTROLm;
   1204         shared_mem = EP_UAT_SHARED_BANKS_CONTROLm;
   1205         field = uat_fields[bank];
   1206         break;
   1207     case MPLS_ENTRY_SINGLEm:
   1208     case MPLS_ENTRYm:
   1209         if (bank < 0 || bank > 3) {
   1210             return SOC_E_PARAM;
   1211         }
   1212         mem = MPLS_ENTRY_HASH_CONTROLm;
   1213         shared_mem = IP_UAT_SHARED_BANKS_CONTROLm;
   1214         field = uat_fields[bank];
   1215         break;
   1216     case VLAN_XLATE_1_SINGLEm:
   1217         if (bank < 0 || bank > 3) {
   1218             return SOC_E_PARAM;
   1219         }
   1220         mem = VLAN_XLATE_1_HASH_CONTROLm;
   1221         shared_mem = IP_UAT_SHARED_BANKS_CONTROLm;
   1222         field = uat_fields[bank];
   1223         break;
   1224     case VLAN_XLATE_2_SINGLEm:
   1225         if (bank < 0 || bank > 3) {
   1226             return SOC_E_PARAM;
   1227         }
   1228         mem = VLAN_XLATE_2_HASH_CONTROLm;
   1229         shared_mem = IP_UAT_SHARED_BANKS_CONTROLm;
   1230         field = uat_fields[bank];
   1231         break;
   1232     case ING_VP_VLAN_MEMBERSHIPm:
   1233         if (bank < 0 || bank > 2) {
   1234             return SOC_E_PARAM;
   1235         }
   1236         mem = ING_VP_VLAN_MEMBERSHIP_HASH_CONTROLm;
   1237         field = uft_fields[bank];
   1238         is_shared = 0;
   1239         break;
   1240     case EGR_VP_VLAN_MEMBERSHIPm:
   1241         if (bank < 0 || bank > 2) {
   1242             return SOC_E_PARAM;
   1243         }
   1244         mem = EGR_VP_VLAN_MEMBERSHIP_HASH_CONTROLm;
   1245         field = uft_fields[bank];
   1246         is_shared = 0;  
   1247         break;
   1248     default:
   1249         return SOC_E_INTERNAL;
   1250     }
   1251 
   1252     SOC_IF_ERROR_RETURN(soc_mem_read(unit, mem, MEM_BLOCK_ALL, 0,
   1253                                      hash_control_entry));
   1254     soc_mem_field32_set(unit, mem, hash_control_entry, HASH_TABLE_TEST_MODEf,
   1255                         use_lsb);
   1256     if (is_shared == 0) {
   1257         soc_mem_field32_set(unit, mem, hash_control_entry, field, hash_offset);
   1258     }
   1259     SOC_IF_ERROR_RETURN(soc_mem_write(unit, mem, MEM_BLOCK_ALL, 0,
   1260                                         hash_control_entry));
   1261 
   1262     if (is_shared > 0) {
   1263         sal_memset(hash_control_entry, 0, sizeof(hash_control_entry));
   1264         SOC_IF_ERROR_RETURN(soc_mem_read(unit, shared_mem, MEM_BLOCK_ALL, 0,
   1265                                             hash_control_entry));
   1266         soc_mem_field32_set(unit, shared_mem, hash_control_entry, field,
   1267                                 hash_offset);
   1268         SOC_IF_ERROR_RETURN(soc_mem_write(unit, shared_mem, MEM_BLOCK_ALL, 0,
   1269                                             hash_control_entry));
   1270     }
   1271     return SOC_E_NONE;
   1272 }
   1273 
   1274 STATIC int
   1275 _soc_hx5_shared_hash(int unit, int hash_offset, uint32 key_nbits, uint8 *keyA,
   1276                      uint8 *keyB, uint32 result_mask, uint16 lsb, int use_lsb)
   1277 {
   1278    uint32 crc_hi, crc_lo;
   1279    uint64 hash_vector, mask;
   1280 
   1281    if (use_lsb) {
   1282        /* Debug Mode 
   1283         * Hash Vector [63:48] ->  Zero
   1284         * Hash Vector [47:32] ->  Hash LSB
   1285         */
   1286        crc_hi = lsb;
   1287    } else {
   1288        crc_hi = soc_crc32b(keyB, key_nbits);
   1289    }
   1290 
   1291    crc_lo = soc_crc32b(keyA, key_nbits);
   1292 
   1293    COMPILER_64_SET(hash_vector, crc_hi, crc_lo);
   1294    COMPILER_64_SET(mask, 0, result_mask);
   1295    COMPILER_64_SHR(hash_vector, hash_offset);
   1296    COMPILER_64_AND(hash_vector, mask);
   1297    return (int)COMPILER_64_LO(hash_vector);
   1298 }
   1299 
   1300 int
   1301 soc_hx5_hash_index_get(int unit, int mem, int bank, int bucket)
   1302 {
   1303     int rv;
   1304     int index;
   1305     int entries_per_row, bank_base, bucket_offset, entries_per_bucket;
   1306 
   1307     switch(mem) {
   1308     case L2Xm:
   1309         rv = soc_hx5_hash_bank_info_get(unit, mem, bank, NULL, &entries_per_row,
   1310                                         NULL, &bank_base, &bucket_offset);
   1311         if (SOC_SUCCESS(rv)) {
   1312             return bank_base + bucket * entries_per_row + bucket_offset;
   1313         }
   1314         break;
   1315     case L3_ENTRY_ONLY_SINGLEm:
   1316     case L3_ENTRY_SINGLEm:
   1317     case L3_ENTRY_DOUBLEm:
   1318     case L3_ENTRY_QUADm:
   1319         rv = soc_hx5_hash_bank_info_get(unit, mem, bank, NULL,
   1320                                         &entries_per_row, NULL, &bank_base,
   1321                                         &bucket_offset);
   1322         if (SOC_SUCCESS(rv)) {
   1323             index = bank_base + bucket * entries_per_row + bucket_offset;
   1324             return index;
   1325         }
   1326         break;
   1327     case EXACT_MATCH_2m:
   1328     case EXACT_MATCH_2_PIPE0m:
   1329     case EXACT_MATCH_4m:
   1330     case EXACT_MATCH_4_PIPE0m:
   1331     case VLAN_XLATE_1_SINGLEm:
   1332     case VLAN_XLATE_1_DOUBLEm:
   1333     case EGR_VLAN_XLATE_1_SINGLEm:
   1334     case EGR_VLAN_XLATE_1_DOUBLEm:
   1335     case EGR_VLAN_XLATE_2_SINGLEm:
   1336     case EGR_VLAN_XLATE_2_DOUBLEm:
   1337     case MPLS_ENTRY_SINGLEm:
   1338     case MPLS_ENTRYm:
   1339         rv = soc_hx5_hash_bank_info_get(unit, mem, bank, NULL,
   1340                                         &entries_per_row, &entries_per_bucket,
   1341                                         &bank_base, &bucket_offset);
   1342         if (SOC_SUCCESS(rv)) {
   1343             index = bank_base + bucket * entries_per_bucket + bucket_offset;
   1344             return index;
   1345         }
   1346         break;
   1347     case ING_VP_VLAN_MEMBERSHIPm:
   1348     case EGR_VP_VLAN_MEMBERSHIPm:
   1349         rv = soc_hx5_hash_bank_info_get(unit, mem, bank, NULL,
   1350                                     &entries_per_row, NULL, &bank_base,
   1351                                     &bucket_offset);
   1352         if (SOC_SUCCESS(rv)) {
   1353             index = bank_base + bucket * entries_per_row + bucket_offset;
   1354             return index;
   1355         }
   1356         break;
   1357     default:
   1358         break;
   1359     }
   1360 
   1361     return 0;
   1362 
   1363 }
   1364 
   1365 uint32
   1366 soc_hx5_l2x_hash(int unit, int bank, int hash_offset, int use_lsb,
   1367                  int key_nbits, void *base_entry, uint8 *key1, uint8 *key2)
   1368 {
   1369     uint32 lsb_val;
   1370     uint32 hash_mask;
   1371     uint32 hash_bits;
   1372 
   1373     if (bank < 2) {
   1374         hash_mask = 0x07FF; /* 2k buckets per dedicated L2 bank */
   1375         hash_bits = 11;
   1376     } else {
   1377         hash_mask = 0x0FFF; /* 4k buckets per shared bank */
   1378         hash_bits = 12;
   1379     }
   1380 
   1381     if (use_lsb && (hash_offset + hash_bits > 32)) {
   1382         switch (soc_mem_field32_get(unit, L2Xm, base_entry, KEY_TYPEf)) {
   1383         case TD3_L2_HASH_KEY_TYPE_BRIDGE:
   1384         case TD3_L2_HASH_KEY_TYPE_VFI:
   1385         case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_ACCESS:
   1386             lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry,
   1387                                           L2__HASH_LSBf);
   1388             break;
   1389         case TD3_L2_HASH_KEY_TYPE_SINGLE_CROSS_CONNECT:
   1390         case TD3_L2_HASH_KEY_TYPE_DOUBLE_CROSS_CONNECT:
   1391             lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry,
   1392                                           VLAN__HASH_LSBf);
   1393             break;
   1394         case TD3_L2_HASH_KEY_TYPE_VIF:
   1395             lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry,
   1396                                           VIF__HASH_LSBf);
   1397             break;
   1398         case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_NETWORK_LONG:
   1399             lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry,
   1400                                           TRILL_NONUC_NETWORK_LONG__HASH_LSBf);
   1401             break;
   1402         case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_NETWORK_SHORT:
   1403             lsb_val = soc_mem_field32_get
   1404                 (unit, L2Xm, base_entry, TRILL_NONUC_NETWORK_SHORT__HASH_LSBf);
   1405             break;
   1406         case TD3_L2_HASH_KEY_TYPE_BFD:
   1407             lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry,
   1408                                           BFD__HASH_LSBf);
   1409             break;
   1410         case TD3_L2_HASH_KEY_TYPE_PE_VID:
   1411             lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry,
   1412                                           PE_VID__HASH_LSBf);
   1413             break;
   1414         case TD3_L2_HASH_KEY_TYPE_FCOE_ZONE:
   1415             lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry,
   1416                                           FCOE_ZONE__HASH_LSBf);
   1417             break;
   1418         default:
   1419             lsb_val = 0;
   1420             break;
   1421         }
   1422     } else {
   1423         lsb_val = 0;
   1424     }
   1425 
   1426     return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2,
   1427                                 hash_mask, lsb_val, use_lsb);
   1428 }
   1429 
   1430 int
   1431 soc_hx5_l2x_base_entry_to_key(int unit, int bank, uint32 *entry, uint8 *key)
   1432 {
   1433     soc_field_t field_list[2];
   1434     soc_mem_t   flex_mem_view = 0;
   1435 
   1436     field_list[1] = INVALIDf;
   1437 
   1438     switch (soc_mem_field32_get(unit, L2Xm, entry, KEY_TYPEf)) {
   1439     case TD3_L2_HASH_KEY_TYPE_BRIDGE:
   1440     case TD3_L2_HASH_KEY_TYPE_VFI:
   1441     case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_ACCESS:
   1442         field_list[0] = L2__KEYf;
   1443         break;
   1444     case TD3_L2_HASH_KEY_TYPE_SINGLE_CROSS_CONNECT:
   1445     case TD3_L2_HASH_KEY_TYPE_DOUBLE_CROSS_CONNECT:
   1446         field_list[0] = VLAN__KEYf;
   1447         break;
   1448     case TD3_L2_HASH_KEY_TYPE_VIF:
   1449         field_list[0] = VIF__KEYf;
   1450         break;
   1451     case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_NETWORK_LONG:
   1452         field_list[0] = TRILL_NONUC_NETWORK_LONG__KEYf;
   1453         break;
   1454     case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_NETWORK_SHORT:
   1455         field_list[0] = TRILL_NONUC_NETWORK_SHORT__KEYf;
   1456         break;
   1457     case TD3_L2_HASH_KEY_TYPE_BFD:
   1458         field_list[0] = BFD__KEYf;
   1459         break;
   1460     case TD3_L2_HASH_KEY_TYPE_PE_VID:
   1461         field_list[0] = PE_VID__KEYf;
   1462         break;
   1463     case TD3_L2_HASH_KEY_TYPE_FCOE_ZONE:
   1464         field_list[0] = FCOE_ZONE__KEYf;
   1465         break;
   1466     default:
   1467         return 0;
   1468     }
   1469 
   1470     return _soc_hx5_hash_entry_to_key(unit, bank, entry, key,
   1471                             L2Xm, field_list, flex_mem_view);
   1472 }
   1473 
   1474 uint32
   1475 soc_hx5_l2x_entry_hash(int unit, int bank, int hash_offset, int use_lsb,
   1476                       uint32 *entry) {
   1477     int key_nbits;
   1478     uint8 key1[SOC_MAX_MEM_WORDS * 4] = {0};
   1479     uint8 key2[SOC_MAX_MEM_WORDS * 4] = {0};
   1480 
   1481     /* Robust Hashed Key using Remap and Action Tables A */
   1482     key_nbits = soc_hx5_l2x_base_entry_to_key(unit, 0, entry, key1);
   1483     /* Robust Hashed Key using Remap and Action Tables B */
   1484     key_nbits = soc_hx5_l2x_base_entry_to_key(unit, 1, entry, key2);
   1485     
   1486     return soc_hx5_l2x_hash(unit, bank, hash_offset, use_lsb, key_nbits, entry,
   1487                             key1, key2);
   1488 }
   1489 
   1490 uint32
   1491 soc_hx5_l2x_bank_entry_hash(int unit, int bank, uint32 *entry) {
   1492     int rv, hash_offset, use_lsb;
   1493 
   1494     rv = soc_hx5_hash_offset_get(unit, L2Xm, bank, &hash_offset, &use_lsb);
   1495     if (SOC_FAILURE(rv)) {
   1496         return 0;
   1497     }
   1498     return soc_hx5_l2x_entry_hash(unit, bank, hash_offset, use_lsb, entry);
   1499 }
   1500 
   1501 uint32
   1502 soc_hx5_l3x_hash(int unit, int bank, int hash_offset, int use_lsb,
   1503                  int key_nbits, void *base_entry, uint8 *key1, uint8 *key2)
   1504 {
   1505     uint32 lsb_val;
   1506     uint32 hash_mask;
   1507     uint32 hash_bits;
   1508 
   1509     if (bank > 7) {
   1510         hash_mask = 0x7FF; /* 2k buckets per dedicated banks */
   1511         hash_bits = 11;
   1512     } else {
   1513         hash_mask = 0x0FFF; /* 4k buckets per shared bank */
   1514         hash_bits = 12;
   1515     }
   1516 
   1517     if (use_lsb && (hash_offset + hash_bits > 32)) {
   1518         switch (soc_mem_field32_get(unit, L3_ENTRY_ONLY_SINGLEm, base_entry,
   1519                                     KEY_TYPEf)) {
   1520         case TD3_L3_HASH_KEY_TYPE_V4UC:
   1521         case TD3_L3_HASH_KEY_TYPE_V4MC:
   1522         case TD3_L3_HASH_KEY_TYPE_V6UC:
   1523         case TD3_L3_HASH_KEY_TYPE_V6MC:
   1524             lsb_val = soc_mem_field32_get(unit, L3_ENTRY_SINGLEm,
   1525                                           base_entry, IPV4UC__HASH_LSBf);
   1526             break;
   1527         case TD3_L3_HASH_KEY_TYPE_TRILL:
   1528             lsb_val = soc_mem_field32_get(unit, L3_ENTRY_SINGLEm,
   1529                                           base_entry, TRILL__HASH_LSBf);
   1530             break;
   1531         case TD3_L3_HASH_KEY_TYPE_DST_NAT:
   1532         case TD3_L3_HASH_KEY_TYPE_DST_NAPT:
   1533             lsb_val = soc_mem_field32_get(unit, L3_ENTRY_DOUBLEm,
   1534                                           base_entry, NAT__HASH_LSBf);
   1535             break;
   1536         case TD3_L3_HASH_KEY_TYPE_FCOE_DOMAIN:
   1537         case TD3_L3_HASH_KEY_TYPE_FCOE_HOST:
   1538         case TD3_L3_HASH_KEY_TYPE_FCOE_SOURCE_MAP:
   1539             lsb_val = soc_mem_field32_get(unit, L3_ENTRY_SINGLEm, base_entry,
   1540                                           FCOE__HASH_LSBf);
   1541             break;
   1542         default:
   1543             lsb_val = 0;
   1544             break;
   1545         }
   1546     } else {
   1547         lsb_val = 0;
   1548     }
   1549     
   1550     return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2,
   1551                                 hash_mask, lsb_val, use_lsb);
   1552 }
   1553 
   1554 int
   1555 soc_hx5_l3x_base_entry_to_key(int unit, int bank, uint32 *entry, uint8 *key)
   1556 {
   1557     soc_mem_t mem;
   1558     soc_field_t field_list[5];
   1559     soc_mem_t   flex_mem_view = 0;
   1560     
   1561     switch (soc_mem_field32_get(unit, L3_ENTRY_ONLY_SINGLEm, entry, KEY_TYPEf)) {
   1562     case TD3_L3_HASH_KEY_TYPE_V4UC:
   1563         mem = L3_ENTRY_SINGLEm;
   1564         field_list[0] = IPV4UC__KEYf;
   1565         field_list[1] = INVALIDf;
   1566         break;
   1567     case TD3_L3_HASH_KEY_TYPE_V6UC:
   1568         mem = L3_ENTRY_DOUBLEm;
   1569         field_list[0] = IPV6UC__KEY_0f;
   1570         field_list[1] = IPV6UC__KEY_1f;
   1571         field_list[2] = INVALIDf;
   1572         break;
   1573     case TD3_L3_HASH_KEY_TYPE_V4MC:
   1574     case TD3_L3_HASH_KEY_TYPE_L2_IPV4_MULTICAST:
   1575     case TD3_L3_HASH_KEY_TYPE_L2VP_IPV4_MULTICAST:
   1576         mem = L3_ENTRY_DOUBLEm;
   1577         field_list[0] = IPV4MC__KEYf;
   1578         field_list[1] = INVALIDf;
   1579         break;
   1580     case TD3_L3_HASH_KEY_TYPE_V6MC:
   1581     case TD3_L3_HASH_KEY_TYPE_L2_IPV6_MULTICAST:
   1582     case TD3_L3_HASH_KEY_TYPE_L2VP_IPV6_MULTICAST:
   1583         mem = L3_ENTRY_QUADm;
   1584         field_list[0] = IPV6MC__KEY_0f;
   1585         field_list[1] = IPV6MC__KEY_1f;
   1586         field_list[2] = IPV6MC__KEY_2f;
   1587         field_list[3] = INVALIDf;
   1588         break;
   1589     case TD3_L3_HASH_KEY_TYPE_TRILL:
   1590         mem = L3_ENTRY_SINGLEm;
   1591         field_list[0] = TRILL__KEYf;
   1592         field_list[1] = INVALIDf;
   1593         break;
   1594     case TD3_L3_HASH_KEY_TYPE_FCOE_DOMAIN:
   1595     case TD3_L3_HASH_KEY_TYPE_FCOE_HOST:
   1596     case TD3_L3_HASH_KEY_TYPE_FCOE_SOURCE_MAP:
   1597         mem = L3_ENTRY_SINGLEm;
   1598         field_list[0] = FCOE__KEYf;
   1599         field_list[1] = INVALIDf;
   1600         break;
   1601     case TD3_L3_HASH_KEY_TYPE_DST_NAT:
   1602     case TD3_L3_HASH_KEY_TYPE_DST_NAPT:
   1603         mem = L3_ENTRY_DOUBLEm;
   1604         field_list[0] = NAT__KEY_0f;
   1605         field_list[1] = INVALIDf;
   1606         break;
   1607 
   1608     default:
   1609         mem = L3_ENTRY_DOUBLEm;
   1610         SOC_IF_ERROR_RETURN(soc_flex_hash_mem_view_get(unit,
   1611                    mem, entry, &flex_mem_view, field_list));
   1612         break;
   1613     }
   1614     return _soc_hx5_hash_entry_to_key(unit, bank, entry, key,
   1615                              mem, field_list, flex_mem_view);
   1616 }
   1617 
   1618 uint32
   1619 soc_hx5_l3x_entry_hash(int unit, int bank, int hash_offset, int use_lsb,
   1620                       uint32 *entry)
   1621 {
   1622     int             key_nbits;
   1623     uint8           key1[SOC_MAX_MEM_WORDS * 4] = {0};
   1624     uint8           key2[SOC_MAX_MEM_WORDS * 4] = {0};
   1625 
   1626     /* Robust Hashed Key using Remap and Action Tables A */
   1627     key_nbits = soc_hx5_l3x_base_entry_to_key(unit, 0, entry, key1);
   1628     /* Robust Hashed Key using Remap and Action Tables B */
   1629     key_nbits = soc_hx5_l3x_base_entry_to_key(unit, 1, entry, key2);
   1630 
   1631     return soc_hx5_l3x_hash(unit, bank, hash_offset, use_lsb, key_nbits,
   1632                             entry, key1, key2);
   1633 }
   1634 
   1635 uint32
   1636 soc_hx5_l3x_bank_entry_hash(int unit, int bank, uint32 *entry)
   1637 {
   1638     int rv, hash_offset, use_lsb;
   1639 
   1640     rv = soc_hx5_hash_offset_get(unit, L3_ENTRY_ONLY_SINGLEm, bank, &hash_offset,
   1641                                 &use_lsb);
   1642     if (SOC_FAILURE(rv)) {
   1643         return 0;
   1644     }
   1645 
   1646     return soc_hx5_l3x_entry_hash(unit, bank, hash_offset, use_lsb, entry);
   1647 }
   1648 
   1649 uint32
   1650 soc_hx5_exact_match_hash(int unit, int bank, int hash_offset, int use_lsb,
   1651                          int key_nbits, void *base_entry, uint8 *key1,
   1652                          uint8 *key2)
   1653 {
   1654     uint32 lsb_val;
   1655     uint32 hash_mask;
   1656     uint32 hash_bits;
   1657 
   1658     hash_mask = 0x7FF; /* 2k buckets per shared bank */
   1659     hash_bits = 11;
   1660 
   1661     if (use_lsb && (hash_offset + hash_bits > 32)) {
   1662         switch (soc_mem_field32_get(unit, EXACT_MATCH_2m, base_entry,
   1663                                     KEY_TYPEf)) {
   1664         case TD3_FPEM_HASH_KEY_TYPE_128B:
   1665             lsb_val = soc_mem_field32_get(unit, EXACT_MATCH_2m, base_entry,
   1666                                           MODE128__HASH_LSBf);
   1667             break;
   1668         case TD3_FPEM_HASH_KEY_TYPE_160B:
   1669             lsb_val = soc_mem_field32_get(unit, EXACT_MATCH_2m, base_entry,
   1670                                           MODE160__HASH_LSBf);
   1671             break;
   1672         case TD3_FPEM_HASH_KEY_TYPE_320B:
   1673             lsb_val = soc_mem_field32_get(unit, EXACT_MATCH_4m, base_entry,
   1674                                           MODE320__HASH_LSBf);
   1675             break;
   1676         default:
   1677             lsb_val = 0;
   1678             break;
   1679         }
   1680     } else {
   1681         lsb_val = 0;
   1682     }
   1683 
   1684     return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2,
   1685                                 hash_mask, lsb_val, use_lsb);
   1686 }
   1687 
   1688 int
   1689 soc_hx5_exact_match_base_entry_to_key(int unit, int bank, uint32 *entry,
   1690                                       uint8 *key) {
   1691     soc_mem_t mem;
   1692     soc_field_t field_list[5];
   1693     soc_mem_t   flex_mem_view = 0;
   1694     
   1695     switch (soc_mem_field32_get(unit, EXACT_MATCH_2m, entry, KEY_TYPEf)) {
   1696     case TD3_FPEM_HASH_KEY_TYPE_128B:
   1697         mem = EXACT_MATCH_2m;
   1698         field_list[0] = MODE128__KEY_0f;
   1699         field_list[1] = MODE128__KEY_1f;
   1700         field_list[2] = INVALIDf;
   1701         break;
   1702     case TD3_FPEM_HASH_KEY_TYPE_160B:
   1703         mem = EXACT_MATCH_2m;
   1704         field_list[0] = MODE160__KEY_0f;
   1705         field_list[1] = MODE160__KEY_1f;
   1706         field_list[2] = INVALIDf;
   1707         break;
   1708     case TD3_FPEM_HASH_KEY_TYPE_320B:
   1709         mem = EXACT_MATCH_4m;
   1710         field_list[0] = MODE320__KEY_0f;
   1711         field_list[1] = MODE320__KEY_1f;
   1712         field_list[2] = MODE320__KEY_2f;
   1713         field_list[3] = MODE320__KEY_3f;
   1714         field_list[4] = INVALIDf;
   1715         break;
   1716     default:
   1717         mem = EXACT_MATCH_4m;
   1718         SOC_IF_ERROR_RETURN(soc_flex_hash_mem_view_get(unit,
   1719                mem, entry, &flex_mem_view, field_list));
   1720         break;
   1721     }
   1722     return _soc_hx5_hash_entry_to_key(unit, bank, entry, key,
   1723                              mem, field_list, flex_mem_view);
   1724 }
   1725 
   1726 uint32
   1727 soc_hx5_exact_match_entry_hash(int unit, int bank, int hash_offset,
   1728                               int use_lsb, uint32 *entry)
   1729 {
   1730     int             key_nbits;
   1731     uint8           key1[SOC_MAX_MEM_WORDS * 4];
   1732     uint8           key2[SOC_MAX_MEM_WORDS * 4];
   1733 
   1734     /* Robust Hashed Key using Remap and Action Tables A */
   1735     key_nbits = soc_hx5_exact_match_base_entry_to_key(unit, 0, entry, key1);
   1736     /* Robust Hashed Key using Remap and Action Tables B */
   1737     key_nbits = soc_hx5_exact_match_base_entry_to_key(unit, 1, entry, key2);
   1738 
   1739     return soc_hx5_exact_match_hash(unit, bank, hash_offset, use_lsb,
   1740                                     key_nbits, entry, key1, key2);
   1741 }
   1742 
   1743 uint32
   1744 soc_hx5_exact_match_bank_entry_hash(int unit, int bank, uint32 *entry)
   1745 {
   1746     int rv, hash_offset, use_lsb;
   1747 
   1748     rv = soc_hx5_hash_offset_get(unit, EXACT_MATCH_2m, bank, &hash_offset,
   1749                                  &use_lsb);
   1750     if (SOC_FAILURE(rv)) {
   1751         return 0;
   1752     }
   1753 
   1754     return soc_hx5_exact_match_entry_hash(unit, bank, hash_offset, use_lsb,
   1755                                           entry);
   1756 }
   1757 
   1758 uint32
   1759 soc_hx5_mpls_hash(int unit, soc_mem_t mem, int bank, int hash_offset, int use_lsb,
   1760                   int key_nbits, void *base_entry, uint8 *key1, uint8 *key2)
   1761 {
   1762     uint32 lsb_val;
   1763     uint32 hash_mask;
   1764     uint32 hash_bits;
   1765 
   1766     hash_mask = 0x7FF; /* 2k buckets per shared bank of size 4k */
   1767     hash_bits = 11;
   1768 
   1769     if (use_lsb && (hash_offset + hash_bits > 32)) {
   1770         switch (soc_mem_field32_get(unit, mem, base_entry,
   1771                                     KEY_TYPEf)) {
   1772         case TD3_MPLS_HASH_KEY_TYPE_MPLS:
   1773             lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry,
   1774                                           MPLS__HASH_LSBf);
   1775             break;
   1776         case TD3_MPLS_HASH_KEY_TYPE_MIM_NVP:
   1777             lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry,
   1778                                           MIM_NVP__HASH_LSBf);
   1779             break;
   1780         case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID:
   1781         case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID_SVP:
   1782             lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry,
   1783                                           MIM_ISID__HASH_LSBf);
   1784             break;
   1785         case TD3_MPLS_HASH_KEY_TYPE_TRILL:
   1786             lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry,
   1787                                           TRILL__HASH_LSBf);
   1788             break;
   1789         case TD3_MPLS_HASH_KEY_TYPE_L2GRE_SIP:
   1790             lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry,
   1791                                           L2GRE_SIP__HASH_LSBf);
   1792         break;
   1793         case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID_SIP:
   1794         case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID:
   1795             lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry,
   1796                                           L2GRE_VPNID__HASH_LSBf);
   1797             break;
   1798         case TD3_MPLS_HASH_KEY_TYPE_VXLAN_SIP:
   1799             lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry,
   1800                                           VXLAN_SIP__HASH_LSBf);
   1801             break;
   1802         case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID:
   1803         case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID_SIP:
   1804             lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry,
   1805                                           VXLAN_VN_ID__HASH_LSBf);
   1806             break;
   1807 
   1808         default:
   1809             lsb_val = 0;
   1810             break;
   1811         }
   1812     } else {
   1813         lsb_val = 0;
   1814     }
   1815 
   1816     return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2,
   1817                                 hash_mask, lsb_val, use_lsb);
   1818 }
   1819 
   1820 int
   1821 soc_hx5_mpls_base_entry_to_key(int unit, soc_mem_t mem, int bank, void *entry, uint8 *key) {
   1822     
   1823     soc_field_t field_list[5];
   1824     soc_mem_t   flex_mem_view = 0;
   1825 
   1826     field_list[1] = INVALIDf;
   1827     switch (soc_mem_field32_get(unit, mem, entry, KEY_TYPEf)) {
   1828     case TD3_MPLS_HASH_KEY_TYPE_MPLS:
   1829         field_list[0] = MPLS__KEYf;
   1830         break;
   1831     case TD3_MPLS_HASH_KEY_TYPE_MIM_NVP:
   1832         field_list[0] = MIM_NVP__KEYf;
   1833         break;
   1834     case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID:
   1835     case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID_SVP:
   1836         field_list[0] = MIM_ISID__KEYf;
   1837         break;
   1838     case TD3_MPLS_HASH_KEY_TYPE_TRILL:
   1839         field_list[0] = TRILL__KEYf;
   1840         break;
   1841     case TD3_MPLS_HASH_KEY_TYPE_L2GRE_SIP:
   1842         field_list[0] = L2GRE_SIP__KEYf;
   1843         break;
   1844     case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID_SIP:
   1845     case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID:
   1846         field_list[0] = L2GRE_VPNID__KEYf;
   1847         break;
   1848     case TD3_MPLS_HASH_KEY_TYPE_VXLAN_SIP:
   1849         if (soc_feature(unit, soc_feature_vxlan_decoupled_mode) &&
   1850             (mem == MPLS_ENTRY_SINGLEm)) {
   1851             field_list[0] = KEY_TYPEf;
   1852             field_list[1] = VXLAN_FLEX_IPV4_SIP__SIPf;
   1853             field_list[2] = INVALIDf;
   1854         }
   1855         else {
   1856             field_list[0] = VXLAN_SIP__KEYf;
   1857         }
   1858         break;
   1859     case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID:
   1860     case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID_SIP:
   1861         field_list[0] = VXLAN_VN_ID__KEYf;
   1862         break;
   1863     default:
   1864         SOC_IF_ERROR_RETURN(soc_flex_hash_mem_view_get(unit,
   1865             mem, entry, &flex_mem_view, field_list));
   1866     }
   1867     return _soc_hx5_hash_entry_to_key(unit, bank, entry, key,
   1868                       mem, field_list, flex_mem_view);
   1869 }
   1870 
   1871 uint32
   1872 soc_hx5_mpls_entry_hash(int unit, soc_mem_t mem, int bank,
   1873                         int hash_offset, int use_lsb, uint32 *entry)
   1874 {
   1875     int             key_nbits;
   1876     uint8           key1[SOC_MAX_MEM_WORDS * 4] = {0};
   1877     uint8           key2[SOC_MAX_MEM_WORDS * 4] = {0};
   1878 
   1879     /* Robust Hashed Key using Remap and Action Tables A */
   1880     key_nbits = soc_hx5_mpls_base_entry_to_key(unit, mem, 0, entry, key1);
   1881     /* Robust Hashed Key using Remap and Action Tables B */
   1882     key_nbits = soc_hx5_mpls_base_entry_to_key(unit, mem, 1, entry, key2);
   1883 
   1884     return soc_hx5_mpls_hash(unit, mem, bank, hash_offset, use_lsb,
   1885                              key_nbits, entry, key1, key2);
   1886 }
   1887 
   1888 uint32
   1889 soc_hx5_mpls_bank_entry_hash(int unit, soc_mem_t mem,
   1890                              int bank, uint32 *entry)
   1891 {
   1892     int rv, hash_offset, use_lsb;
   1893 
   1894     rv = soc_hx5_hash_offset_get(unit, mem, bank, &hash_offset,
   1895                                  &use_lsb);
   1896     if (SOC_FAILURE(rv)) {
   1897         return 0;
   1898     }
   1899 
   1900     return soc_hx5_mpls_entry_hash(unit, mem, bank, hash_offset, use_lsb, entry);
   1901 }
   1902 
   1903 uint32
   1904 soc_hx5_vlan_xlate_hash(int unit, soc_mem_t mem, int bank, int hash_offset,
   1905                         int use_lsb, int key_nbits, void *base_entry,
   1906                         uint8 *key1, uint8 *key2)
   1907 {
   1908     uint32 lsb_val;
   1909     uint32 hash_mask;
   1910     uint32 hash_bits;
   1911 
   1912     hash_mask = 0x7FF; /* 2k buckets per shared bank of size 4k */
   1913     hash_bits = 11;
   1914 
   1915     if (use_lsb && (hash_offset + hash_bits > 32)) {
   1916         switch (soc_mem_field32_get(unit, mem, base_entry,
   1917                                     KEY_TYPEf)) {
   1918         case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID:
   1919         case TD3_VLXLT_HASH_KEY_TYPE_OTAG:
   1920         case TD3_VLXLT_HASH_KEY_TYPE_ITAG:
   1921         case TD3_VLXLT_HASH_KEY_TYPE_OVID:
   1922         case TD3_VLXLT_HASH_KEY_TYPE_IVID:
   1923         case TD3_VLXLT_HASH_KEY_TYPE_PRI_CFI:
   1924         case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID_VSAN:
   1925         case TD3_VLXLT_HASH_KEY_TYPE_IVID_VSAN:
   1926         case TD3_VLXLT_HASH_KEY_TYPE_OVID_VSAN:
   1927             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   1928                                           XLATE__HASH_LSBf);
   1929             break;
   1930         case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC:
   1931             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   1932                                           MAC__HASH_LSBf);
   1933             break;
   1934         case TD3_VLXLT_HASH_KEY_TYPE_HPAE:
   1935             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   1936                                           MAC_IP_BIND__HASH_LSBf);
   1937             break;
   1938         case TD3_VLXLT_HASH_KEY_TYPE_VIF:
   1939         case TD3_VLXLT_HASH_KEY_TYPE_VIF_VLAN:
   1940         case TD3_VLXLT_HASH_KEY_TYPE_VIF_CVLAN:
   1941         case TD3_VLXLT_HASH_KEY_TYPE_VIF_OTAG:
   1942         case TD3_VLXLT_HASH_KEY_TYPE_VIF_ITAG:
   1943             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   1944                                           VIF__HASH_LSBf);
   1945             break;
   1946         case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC_PORT:
   1947             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   1948                                           MAC_PORT__HASH_LSBf);
   1949             break;
   1950         case TD3_VLXLT_HASH_KEY_TYPE_L2GRE_DIP:
   1951             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   1952                                           L2GRE_DIP__HASH_LSBf);
   1953             break;
   1954         case TD3_VLXLT_HASH_KEY_TYPE_VXLAN_DIP:
   1955             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   1956                                           VXLAN_DIP__HASH_LSBf);
   1957             break;
   1958         default:
   1959             lsb_val = 0;
   1960             break;
   1961         }
   1962     } else {
   1963         lsb_val = 0;
   1964     }
   1965 
   1966     return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2,
   1967                                 hash_mask, lsb_val, use_lsb);
   1968 }
   1969 
   1970 int
   1971 soc_hx5_vlan_xlate_base_entry_to_key(int unit, soc_mem_t mem, int bank,
   1972                                      void *entry, uint8 *key)
   1973 {
   1974     soc_field_t field_list[5];
   1975     soc_mem_t   flex_mem_view = 0;
   1976 
   1977     field_list[1] = INVALIDf;
   1978     switch (soc_mem_field32_get(unit, mem, entry, KEY_TYPEf)) {
   1979     case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID:
   1980     case TD3_VLXLT_HASH_KEY_TYPE_OTAG:
   1981     case TD3_VLXLT_HASH_KEY_TYPE_ITAG:
   1982     case TD3_VLXLT_HASH_KEY_TYPE_OVID:
   1983     case TD3_VLXLT_HASH_KEY_TYPE_IVID:
   1984     case TD3_VLXLT_HASH_KEY_TYPE_PRI_CFI:
   1985     case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID_VSAN:
   1986     case TD3_VLXLT_HASH_KEY_TYPE_OVID_VSAN:
   1987     case TD3_VLXLT_HASH_KEY_TYPE_IVID_VSAN:
   1988         field_list[0] = XLATE__KEY_0f;
   1989         break;
   1990     case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC:
   1991         field_list[0] = MAC__KEY_0f;
   1992         break;
   1993     case TD3_VLXLT_HASH_KEY_TYPE_HPAE:
   1994         field_list[0] = MAC_IP_BIND__KEY_0f;
   1995         break;
   1996     case TD3_VLXLT_HASH_KEY_TYPE_VIF:
   1997     case TD3_VLXLT_HASH_KEY_TYPE_VIF_VLAN:
   1998     case TD3_VLXLT_HASH_KEY_TYPE_VIF_CVLAN:
   1999     case TD3_VLXLT_HASH_KEY_TYPE_VIF_OTAG:
   2000     case TD3_VLXLT_HASH_KEY_TYPE_VIF_ITAG:
   2001         field_list[0] = VIF__KEY_0f;
   2002         break;
   2003     case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC_PORT:
   2004         field_list[0] = MAC_PORT__KEY_0f;
   2005         break;
   2006     case TD3_VLXLT_HASH_KEY_TYPE_L2GRE_DIP:
   2007         field_list[0] = L2GRE_DIP__KEY_0f;
   2008         break;
   2009     case TD3_VLXLT_HASH_KEY_TYPE_VXLAN_DIP:
   2010         field_list[0] = VXLAN_DIP__KEY_0f;
   2011         break;
   2012     case TD3_VLXLT_HASH_KEY_TYPE_VXLAN_FLEX_VNID:
   2013         field_list[0] = KEY_TYPEf;
   2014         field_list[1] = VXLAN_FLEX__VNIDf;
   2015         field_list[2] = INVALIDf;
   2016         break;
   2017     case TD3_VLXLT_HASH_KEY_TYPE_VXLAN_FLEX_SIP_VNID:
   2018         field_list[0] = KEY_TYPEf;
   2019         field_list[1] = VXLAN_FLEX__VNIDf;
   2020         field_list[2] = VXLAN_FLEX__SIPf;
   2021         field_list[3] = INVALIDf;
   2022         break;
   2023     default:
   2024         SOC_IF_ERROR_RETURN(soc_flex_hash_mem_view_get(unit,
   2025                    mem, entry, &flex_mem_view, field_list));
   2026         break;
   2027     }
   2028     return _soc_hx5_hash_entry_to_key(unit, bank, entry, key,
   2029                              mem, field_list, flex_mem_view);
   2030 }
   2031 
   2032 uint32
   2033 soc_hx5_vlan_xlate_entry_hash(int unit, soc_mem_t mem, int bank, int hash_offset,
   2034                               int use_lsb, uint32 *entry)
   2035 {
   2036     int             key_nbits;
   2037     uint8           key1[SOC_MAX_MEM_WORDS * 4] = {0};
   2038     uint8           key2[SOC_MAX_MEM_WORDS * 4] = {0};
   2039 
   2040     /* Robust Hashed Key using Remap and Action Tables A */
   2041     key_nbits = soc_hx5_vlan_xlate_base_entry_to_key(unit, mem, 0, entry, key1);
   2042     /* Robust Hashed Key using Remap and Action Tables B */
   2043     key_nbits = soc_hx5_vlan_xlate_base_entry_to_key(unit, mem, 1, entry, key2);
   2044 
   2045     return soc_hx5_vlan_xlate_hash(unit, mem, bank, hash_offset, use_lsb,
   2046                                    key_nbits, entry, key1, key2);
   2047 }
   2048 
   2049 uint32
   2050 soc_hx5_vlan_xlate_bank_entry_hash(int unit, soc_mem_t mem, int bank,
   2051                                    uint32 *entry)
   2052 {
   2053     int rv, hash_offset, use_lsb;
   2054 
   2055     rv = soc_hx5_hash_offset_get(unit, mem, bank, &hash_offset,
   2056                                  &use_lsb);
   2057     if (SOC_FAILURE(rv)) {
   2058         return 0;
   2059     }
   2060 
   2061     return soc_hx5_vlan_xlate_entry_hash(unit, mem, bank, hash_offset, 
   2062                                          use_lsb, entry);
   2063 }
   2064 
   2065 uint32
   2066 soc_hx5_egr_vlan_xlate_hash(int unit, soc_mem_t mem, int bank, int hash_offset,
   2067                             int use_lsb, int key_nbits, void *base_entry,
   2068                             uint8 *key1, uint8 *key2)
   2069 {
   2070     uint32 lsb_val;
   2071     uint32 hash_mask;
   2072     uint32 hash_bits;
   2073 
   2074     hash_mask = 0x7FF; /* 2k buckets per shared bank of size 4k */
   2075     hash_bits = 11;
   2076 
   2077     if (use_lsb && (hash_offset + hash_bits > 32)) {
   2078         switch (soc_mem_field32_get(unit, mem, base_entry,
   2079                                     KEY_TYPEf)) {
   2080         case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE:
   2081         case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE_DVP:
   2082         case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE:
   2083         case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE_DVP:
   2084             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   2085                                           XLATE__HASH_LSBf);
   2086             break;
   2087         case TD3_EVLXLT_HASH_KEY_TYPE_ISID_XLATE:
   2088         case TD3_EVLXLT_HASH_KEY_TYPE_ISID_DVP_XLATE:
   2089             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   2090                                           MIM_ISID__HASH_LSBf);
   2091             break;
   2092         case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI:
   2093         case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI_DVP:
   2094             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   2095                                           L2GRE_VFI__HASH_LSBf);
   2096             break;
   2097         case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI:
   2098         case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI_DVP:
   2099             lsb_val = soc_mem_field32_get(unit, mem, base_entry,
   2100                                           VXLAN_VFI__HASH_LSBf);
   2101             break;
   2102         default:
   2103             lsb_val = 0;
   2104             break;
   2105         }
   2106     } else {
   2107         lsb_val = 0;
   2108     }
   2109 
   2110     return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2,
   2111                                 hash_mask, lsb_val, use_lsb);
   2112 }
   2113 
   2114 int
   2115 soc_hx5_egr_vlan_xlate_base_entry_to_key(int unit, soc_mem_t mem, int bank,
   2116                                          void *entry, uint8 *key)
   2117 {
   2118     soc_field_t field_list[2];
   2119     soc_mem_t   flex_mem_view = 0;
   2120 
   2121     field_list[1] = INVALIDf;
   2122     switch (soc_mem_field32_get(unit, mem, entry, KEY_TYPEf)) {
   2123     case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE:
   2124     case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE:
   2125     case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE_DVP:
   2126     case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE_DVP:
   2127         field_list[0] = XLATE__KEY_0f;
   2128         break;
   2129     case TD3_EVLXLT_HASH_KEY_TYPE_ISID_XLATE:
   2130     case TD3_EVLXLT_HASH_KEY_TYPE_ISID_DVP_XLATE:
   2131         field_list[0] = MIM_ISID__KEY_0f;
   2132         break;
   2133     case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI:
   2134     case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI_DVP:
   2135         field_list[0] = L2GRE_VFI__KEY_0f;
   2136         break;
   2137     case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI:
   2138     case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI_DVP:
   2139          if (soc_feature(unit, soc_feature_vxlan_decoupled_mode) &&
   2140             (mem == EGR_VLAN_XLATE_1_SINGLEm)) {
   2141             field_list[0] = VXLAN_VFI_FLEX__KEY_0f;
   2142          } else {
   2143             field_list[0] = VXLAN_VFI__KEY_0f;
   2144          }
   2145         break;
   2146     case TD3_ELVXLT_HASH_KEY_TYPE_VLAN_XLATE_VFI:
   2147         field_list[0] = VLAN_XLATE_VFI__KEY_0f;
   2148         break;
   2149     case TD3_ELVXLT_HASH_KEY_TYPE_VFI_DVP_GROUP:
   2150         field_list[0] = VFI_DVP_GROUP__KEY_0f;
   2151         break;
   2152     case TD3_ELVXLT_HASH_KEY_TYPE_VRF_MAPPING:
   2153         field_list[0] = VRF_MAPPING__KEY_0f;
   2154         break;
   2155     default:
   2156         SOC_IF_ERROR_RETURN(soc_flex_hash_mem_view_get(unit,
   2157                    mem, entry, &flex_mem_view, field_list));
   2158         break;
   2159     }
   2160     return _soc_hx5_hash_entry_to_key(unit, bank, entry,
   2161                    key, mem, field_list, flex_mem_view);
   2162 
   2163 }
   2164 
   2165 uint32
   2166 soc_hx5_egr_vlan_xlate_entry_hash(int unit, soc_mem_t mem, int bank,
   2167                                   int hash_offset, int use_lsb, uint32 *entry)
   2168 {
   2169     int             key_nbits;
   2170     uint8           key1[SOC_MAX_MEM_WORDS * 4] = {0};
   2171     uint8           key2[SOC_MAX_MEM_WORDS * 4] = {0};
   2172 
   2173     /* Robust Hashed Key using Remap and Action Tables A */
   2174     key_nbits = soc_hx5_egr_vlan_xlate_base_entry_to_key(unit, mem, 0,
   2175                                                             entry, key1);
   2176     /* Robust Hashed Key using Remap and Action Tables B */
   2177     key_nbits = soc_hx5_egr_vlan_xlate_base_entry_to_key(unit, mem, 1,
   2178                                                             entry, key2);
   2179 
   2180     return soc_hx5_egr_vlan_xlate_hash(unit, mem, bank, hash_offset, use_lsb,
   2181                                        key_nbits, entry, key1, key2);
   2182 }
   2183 
   2184 uint32
   2185 soc_hx5_egr_vlan_xlate_bank_entry_hash(int unit, soc_mem_t mem, int bank,
   2186                                        uint32 *entry)
   2187 {
   2188     int rv, hash_offset, use_lsb;
   2189 
   2190     rv = soc_hx5_hash_offset_get(unit, mem, bank, &hash_offset,
   2191                                  &use_lsb);
   2192     if (SOC_FAILURE(rv)) {
   2193         return 0;
   2194     }
   2195 
   2196     return soc_hx5_egr_vlan_xlate_entry_hash(unit, mem, bank, hash_offset, 
   2197                                              use_lsb, entry);
   2198 }
   2199 
   2200 uint32
   2201 soc_hx5_ing_vp_vlan_member_hash(int unit, int bank, int hash_offset,
   2202                                 int use_lsb, int key_nbits, void *base_entry,
   2203                                 uint8 *key1, uint8 *key2)
   2204 {
   2205     uint32 lsb_val;
   2206     uint32 hash_mask;
   2207     uint32 hash_bits;
   2208 
   2209         hash_mask = 0x7FF; /* 2k buckets per dedicated bank of size 8k */
   2210         hash_bits = 11;
   2211 
   2212     if (use_lsb && (hash_offset + hash_bits > 32)) {
   2213         lsb_val = soc_mem_field32_get(unit, ING_VP_VLAN_MEMBERSHIPm,
   2214                                       base_entry, HASH_LSBf);
   2215     } else {
   2216         lsb_val = 0;
   2217     }
   2218 
   2219     return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2,
   2220                                 hash_mask, lsb_val, use_lsb);
   2221 }
   2222 
   2223 int
   2224 soc_hx5_ing_vp_vlan_member_base_entry_to_key(int unit, int bank, void *entry, uint8 *key)
   2225 {
   2226     static soc_field_t field_list[] = {
   2227         KEYf,
   2228         INVALIDf
   2229     };
   2230 
   2231     return _soc_hx5_hash_entry_to_key(unit, bank, entry, key,
   2232                                       ING_VP_VLAN_MEMBERSHIPm, field_list, 0);
   2233 }
   2234 
   2235 uint32
   2236 soc_hx5_ing_vp_vlan_member_entry_hash(int unit, int bank, int hash_offset,
   2237                                       int use_lsb, uint32 *entry)
   2238 {
   2239     int             key_nbits;
   2240     uint8           key1[SOC_MAX_MEM_WORDS * 4] = {0};
   2241     uint8           key2[SOC_MAX_MEM_WORDS * 4] = {0};
   2242 
   2243     /* Robust Hashed Key using Remap and Action Tables A */
   2244     key_nbits = soc_hx5_ing_vp_vlan_member_base_entry_to_key(unit, 0,
   2245                                                              entry, key1);
   2246     /* Robust Hashed Key using Remap and Action Tables B */
   2247     key_nbits = soc_hx5_ing_vp_vlan_member_base_entry_to_key(unit, 1, 
   2248                                                              entry, key2);
   2249 
   2250     return soc_hx5_ing_vp_vlan_member_hash(unit, bank, hash_offset, use_lsb,
   2251                                            key_nbits, entry, key1, key2);
   2252 }
   2253 
   2254 uint32
   2255 soc_hx5_ing_vp_vlan_member_bank_entry_hash(int unit, int bank, uint32 *entry)
   2256 {
   2257     int rv, hash_offset, use_lsb;
   2258 
   2259     rv = soc_hx5_hash_offset_get(unit, ING_VP_VLAN_MEMBERSHIPm, bank,
   2260                                  &hash_offset, &use_lsb);
   2261     if (SOC_FAILURE(rv)) {
   2262         return 0;
   2263     }
   2264 
   2265     return soc_hx5_ing_vp_vlan_member_entry_hash(unit, bank, hash_offset,
   2266                                                  use_lsb, entry);
   2267 }
   2268 
   2269 uint32
   2270 soc_hx5_egr_vp_vlan_member_hash(int unit, int bank, int hash_offset,
   2271                                 int use_lsb, int key_nbits, void *base_entry,
   2272                                 uint8 *key1, uint8 *key2)
   2273 {
   2274     uint32 lsb_val;
   2275     uint32 hash_mask;
   2276     uint32 hash_bits;
   2277 
   2278         hash_mask = 0x7FF; /* 2k buckets per dedicated bank of size 8k */
   2279         hash_bits = 11;
   2280 
   2281     if (use_lsb && (hash_offset + hash_bits > 32)) {
   2282         lsb_val = soc_mem_field32_get(unit, EGR_VP_VLAN_MEMBERSHIPm,
   2283                                       base_entry, HASH_LSBf);
   2284     } else {
   2285         lsb_val = 0;
   2286     }
   2287 
   2288     return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2,
   2289                                 hash_mask, lsb_val, use_lsb);
   2290 }
   2291 
   2292 int
   2293 soc_hx5_egr_vp_vlan_member_base_entry_to_key(int unit, int bank, void *entry, uint8 *key)
   2294 {
   2295     static soc_field_t field_list[] = {
   2296         KEYf,
   2297         INVALIDf
   2298     };
   2299 
   2300     return _soc_hx5_hash_entry_to_key(unit, bank, entry, key,
   2301                                       EGR_VP_VLAN_MEMBERSHIPm, field_list, 0);
   2302 }
   2303 
   2304 uint32
   2305 soc_hx5_egr_vp_vlan_member_entry_hash(int unit, int bank, int hash_offset,
   2306                                       int use_lsb, uint32 *entry)
   2307 {
   2308     int             key_nbits;
   2309     uint8           key1[SOC_MAX_MEM_WORDS * 4] = {0};
   2310     uint8           key2[SOC_MAX_MEM_WORDS * 4] = {0};
   2311 
   2312     /* Robust Hashed Key using Remap and Action Tables A */
   2313     key_nbits = soc_hx5_egr_vp_vlan_member_base_entry_to_key(unit, 0,
   2314                                                              entry, key1);
   2315     /* Robust Hashed Key using Remap and Action Tables B */
   2316     key_nbits = soc_hx5_egr_vp_vlan_member_base_entry_to_key(unit, 1, 
   2317                                                              entry, key2);
   2318 
   2319     return soc_hx5_egr_vp_vlan_member_hash(unit, bank, hash_offset, use_lsb,
   2320                                            key_nbits, entry, key1, key2);
   2321 }
   2322 
   2323 uint32
   2324 soc_hx5_egr_vp_vlan_member_bank_entry_hash(int unit, int bank, uint32 *entry)
   2325 {
   2326     int rv, hash_offset, use_lsb;
   2327 
   2328     rv = soc_hx5_hash_offset_get(unit, EGR_VP_VLAN_MEMBERSHIPm, bank,
   2329                                  &hash_offset, &use_lsb);
   2330     if (SOC_FAILURE(rv)) {
   2331         return 0;
   2332     }
   2333 
   2334     return soc_hx5_egr_vp_vlan_member_entry_hash(unit, bank, hash_offset,
   2335                                                  use_lsb, entry);
   2336 }
   2337 
   2338 int
   2339 soc_hx5_hash_bucket_get(int unit, int mem, int bank, uint32 *entry,
   2340                         uint32 *bucket)
   2341 {
   2342     switch (mem) {
   2343     case L2Xm:
   2344         *bucket = soc_hx5_l2x_bank_entry_hash(unit, bank, entry);
   2345         break;
   2346     case L3_ENTRY_ONLY_SINGLEm:
   2347     case L3_ENTRY_SINGLEm:
   2348         *bucket = soc_hx5_l3x_bank_entry_hash(unit, bank, entry);
   2349         break;
   2350     case L3_ENTRY_DOUBLEm:
   2351         *bucket = soc_hx5_l3x_bank_entry_hash(unit, bank, entry);
   2352         *bucket &= (bank > 7) ? 0x3FF : 0x7FF;
   2353         break;
   2354     case L3_ENTRY_QUADm:
   2355         *bucket = soc_hx5_l3x_bank_entry_hash(unit, bank, entry);
   2356         *bucket &= (bank > 7) ? 0x1FF : 0x3FF;
   2357         break;
   2358     case EXACT_MATCH_2m:
   2359         /* 8K entries => 2K buckets => 0x800 buckets */
   2360         *bucket = soc_hx5_exact_match_bank_entry_hash(unit, bank, entry);
   2361         break;
   2362     case EXACT_MATCH_4m:
   2363         /* 4K entries => 1K buckets => 0x400 buckets */
   2364         *bucket = soc_hx5_exact_match_bank_entry_hash(unit, bank, entry) & 0x3FF;
   2365         break;
   2366     case MPLS_ENTRY_SINGLEm:
   2367     case MPLS_ENTRYm:
   2368         *bucket = soc_hx5_mpls_bank_entry_hash(unit, mem, bank, entry);
   2369         *bucket &= ((mem == MPLS_ENTRYm) ? 0x1FF : 0x3FF);
   2370         break;
   2371     case VLAN_XLATE_1_SINGLEm:
   2372     case VLAN_XLATE_2_SINGLEm:
   2373     case VLAN_XLATE_1_DOUBLEm:
   2374     case VLAN_XLATE_2_DOUBLEm:
   2375         *bucket = soc_hx5_vlan_xlate_bank_entry_hash(unit, mem, bank, entry);
   2376         *bucket &= (((mem == VLAN_XLATE_1_DOUBLEm) ||
   2377                      (mem == VLAN_XLATE_2_DOUBLEm)) ?
   2378                            0x1FF : 0x3FF);
   2379         break;
   2380 
   2381     case EGR_VLAN_XLATE_1_SINGLEm:
   2382     case EGR_VLAN_XLATE_2_SINGLEm:
   2383     case EGR_VLAN_XLATE_1_DOUBLEm:
   2384     case EGR_VLAN_XLATE_2_DOUBLEm:
   2385         *bucket = soc_hx5_egr_vlan_xlate_bank_entry_hash(unit, mem, bank, entry);
   2386         *bucket &= (((mem == EGR_VLAN_XLATE_1_DOUBLEm) ||
   2387                      (mem == EGR_VLAN_XLATE_2_DOUBLEm)) ?
   2388                            0x1FF : 0x3FF);
   2389        break;
   2390 
   2391     case ING_VP_VLAN_MEMBERSHIPm:
   2392         *bucket = soc_hx5_ing_vp_vlan_member_bank_entry_hash(unit,
   2393                                                              bank, entry);
   2394         break;
   2395     case EGR_VP_VLAN_MEMBERSHIPm:
   2396         *bucket = soc_hx5_egr_vp_vlan_member_bank_entry_hash(unit,
   2397                                                              bank, entry);
   2398         break;
   2399     default:
   2400         return SOC_E_PARAM;
   2401     }
   2402     return SOC_E_NONE;
   2403 }
   2404 #endif /* BCM_HELIX5_SUPPORT */