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

bondoptions.c (6033B)


      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:        bondoptions.c
      8  * Purpose:     Populates Metrolite Bond Options Info.
      9  * Requires:    SOC Common Bond Options Initializer.
     10  */
     11 
     12 #include <shared/bsl.h>
     13 
     14 #include <soc/defs.h>
     15 
     16 #ifdef BCM_METROLITE_SUPPORT
     17 
     18 #include <shared/bitop.h>
     19 #include <soc/iproc.h>
     20 
     21 #include <soc/metrolite.h>
     22 #include <soc/bondoptions.h>
     23 
     24 
     25 /*
     26  * Function to initialize the bondoptions cache based on the
     27  * Bond Info read from the relevant registers.
     28  */
     29 int
     30 soc_metrolite_bond_info_init(int unit)
     31 {
     32 
     33     int i, bit_val;
     34     uint32 val, addr;
     35     soc_bond_info_t *bond_info = SOC_BOND_INFO(unit);
     36     soc_reg_t soc_metrolite_bond_info_regs[] = {
     37         DMU_PCU_OTP_CONFIG_0r,
     38         DMU_PCU_OTP_CONFIG_1r,
     39         DMU_PCU_OTP_CONFIG_2r,
     40         DMU_PCU_OTP_CONFIG_3r,
     41         DMU_PCU_OTP_CONFIG_4r,
     42         DMU_PCU_OTP_CONFIG_5r,
     43         DMU_PCU_OTP_CONFIG_6r,
     44         DMU_PCU_OTP_CONFIG_7r,
     45         DMU_PCU_OTP_CONFIG_8r,
     46         DMU_PCU_OTP_CONFIG_9r,
     47         DMU_PCU_OTP_CONFIG_10r,
     48         DMU_PCU_OTP_CONFIG_11r,
     49         DMU_PCU_OTP_CONFIG_12r,
     50         DMU_PCU_OTP_CONFIG_13r,
     51         DMU_PCU_OTP_CONFIG_14r,
     52         DMU_PCU_OTP_CONFIG_15r
     53     };
     54     int reg_num = COUNTOF(soc_metrolite_bond_info_regs);
     55     SHR_BITDCL bond_info_regval[_SHR_BITDCLSIZE(COUNTOF(soc_metrolite_bond_info_regs) * 32)] = {0};
     56 
     57     int feature_enables[][3] = {
     58         /* Bit */  /* Bool Invert?  */    /* Feature Enum */ /* Desc */
     59         {25, 1, socBondInfoFeatureNoL3          },  /* L3_ENABLE               */
     60         {26, 1, socBondInfoFeatureNoSat         },  /* SAT_ENABLE              */
     61         {27, 1, socBondInfoFeatureNoFpRouting   },  /* FP_ROUTE_ENABLE         */
     62         {28, 1, socBondInfoFeatureNoServiceMeter},  /* SVM_ENABLE              */
     63         {30, 1, socBondInfoFeatureNoMpls        },  /* MPLS_ENABLE             */
     64         {34, 1, socBondInfoFeatureNoMim         },  /* MIM_ENABLE              */
     65         {35, 1, socBondInfoFeatureNoOam         },  /* OAM_ENABLE              */
     66         {37, 1, socBondInfoFeatureNoSubTagCoe   },  /* SUBPORT_TAG_ENABLE      */
     67         {38, 1, socBondInfoFeatureNoLinkPhy     },  /* LINKPHY_ENABLE          */
     68         {127, 1, socBondInfoFeatureNoPTP        },  /* NTS_1588_ENABLE         */
     69         {141, 1, socBondInfoFeatureNoAvs        },  /* AVS_DISABLE             */
     70 
     71         {-1,  0, -1                              }  /* Always last             */
     72     };
     73 
     74     for (i = 0; i < reg_num; i++) {
     75         addr = soc_reg_addr(unit, soc_metrolite_bond_info_regs[i], REG_PORT_ANY, 0);
     76         soc_iproc_getreg(unit, addr, &val);
     77         SHR_BITCOPY_RANGE(bond_info_regval, (i * 32), &val, 0, 32);
     78     }
     79 
     80     SOC_BOND_OPTIONS_COPY(bond_info->rev_id, uint16, bond_info_regval, 0, 7);
     81     SOC_BOND_OPTIONS_COPY(bond_info->dev_id, uint16, bond_info_regval, 8, 23);
     82 
     83     /* MMU Buffers */
     84     SOC_BOND_OPTIONS_COPY(val, uint32, bond_info_regval, 62, 62);
     85     if (val == 0x0) {
     86         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureMmu2Mb);
     87     } else if (val == 0x1) {
     88         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureMmu1Mb);
     89     } else {
     90         /* unknown mmu size */
     91         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureMmu2Mb);
     92     }
     93 
     94     /* L2 ENTRY Size */
     95     SOC_BOND_OPTIONS_COPY(val, uint32, bond_info_regval, 24, 24);
     96     if (val == 0x0) {
     97         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureL2Entry8k);
     98     } else if (val == 0x1) {
     99         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureL2Entry32k);
    100     } else {
    101         /* unknown size */
    102         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureL2Entry32k);
    103     }
    104 
    105     /* IP VLAN_XLATE Size */
    106     SOC_BOND_OPTIONS_COPY(val, uint32, bond_info_regval, 33, 33);
    107     if (val == 0x0) {
    108         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureIpVlanXlate1k);
    109     } else if (val == 0x1) {
    110         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureIpVlanXlate4k);
    111     } else {
    112         /* unknown size */
    113         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureIpVlanXlate4k);
    114     }
    115 
    116     /* IP MPLS Size */
    117     SOC_BOND_OPTIONS_COPY(val, uint32, bond_info_regval, 29, 29);
    118     if (val == 0x0) {
    119         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureMpls1k);
    120     } else if (val == 0x1) {
    121         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureMpls2k);
    122     } else {
    123         /* unknown size */
    124         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureMpls2k);
    125     }
    126 
    127     /* L3_ENTRY size */
    128     SOC_BOND_OPTIONS_COPY(val, uint32, bond_info_regval, 31, 31);
    129     if (val == 0x0) {
    130         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureL3Entry1k);
    131     }
    132 
    133     /* L3_NEXT_HOP size */
    134     SOC_BOND_OPTIONS_COPY(val, uint32, bond_info_regval, 32, 32);
    135     if (val == 0x0) {
    136         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureL3NextHop1k);
    137     } else if (val == 0x1) {
    138         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureL3NextHop2k);
    139     } else {
    140         /* unknown size */
    141         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureL3NextHop2k);
    142     }
    143 
    144     SOC_BOND_OPTIONS_COPY(val, uint32, bond_info_regval, 45, 48);
    145     if (val == 0x0) {
    146         SOC_BOND_INFO_FEATURE_SET(unit, socBondInfoFeatureL3DefIpDisable);
    147     }
    148 
    149     SOC_BOND_OPTIONS_COPY(bond_info->ifp_slice_map, uint32, bond_info_regval, 53, 60);
    150     SOC_BOND_OPTIONS_COPY(bond_info->efp_slice_map, uint32, bond_info_regval, 41, 44);
    151     SOC_BOND_OPTIONS_COPY(bond_info->vfp_slice_map, uint32, bond_info_regval, 49, 52);
    152 
    153     for(i = 0; i < COUNTOF(feature_enables); i++) {
    154         bit_val = SHR_BITGET(bond_info_regval, feature_enables[i][0]);
    155         if (feature_enables[i][1]) {
    156             /* Boolean invert  */
    157             bit_val = !bit_val;
    158         }
    159 
    160         if (bit_val) {
    161             SOC_BOND_INFO_FEATURE_SET(unit, feature_enables[i][2]);
    162         }
    163     }
    164 
    165     return SOC_E_NONE;
    166 }
    167 
    168 #endif /* BCM_METROLITE_SUPPORT */
    169