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