avs.c (6787B)
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: avs.c 8 */ 9 10 #include <shared/bsl.h> 11 12 #ifdef INCLUDE_AVS 13 #include <soc/avs.h> 14 #include <soc/tomahawk.h> 15 16 #define SOC_AVS_TOMAHAWK_NUMBER_OF_CENTRALS 36 17 #define SOC_AVS_TOMAHAWK_CENTRAL_XBMP0 0xFF000000 18 #define SOC_AVS_TOMAHAWK_CENTRAL_XBMP1 0xFFFFFFFF 19 #define SOC_AVS_TOMAHAWK_FIRST_CENTRAL 0 20 21 #define SOC_AVS_TOMAHAWK_NUMBER_OF_REMOTES 80 22 #define SOC_AVS_TOMAHAWK_REMOTE_XBMP0 0x0 23 #define SOC_AVS_TOMAHAWK_REMOTE_XBMP1 0x0 24 #define SOC_AVS_TOMAHAWK_REMOTE_XBMP2 0xFFFF3000 25 #define SOC_AVS_TOMAHAWK_FIRST_REMOTE 0 26 27 #define SOC_AVS_TOMAHAWK_VMIN_AVS 9000 28 #define SOC_AVS_TOMAHAWK_VMAX_AVS 10500 29 #define SOC_AVS_TOMAHAWK_VMARGIN_HIGH SOC_AVS_DEFAULT_VMARGIN_HIGH 30 #define SOC_AVS_TOMAHAWK_VMARGIN_LOW SOC_AVS_DEFAULT_VMARGIN_LOW 31 32 static soc_avs_reg_info_t _th_osc_cen_init_list[]={ 33 /* AVS_REG_HW_MNTR_ENABLE_DEFAULT_CEN_ROSC_0r */ 34 {AVS_REG_HW_MNTR_ENABLE_DEFAULT_CEN_ROSC_0r,CEN_ROSC_ENABLE_DEFAULTf}, 35 {AVS_REG_HW_MNTR_ENABLE_DEFAULT_CEN_ROSC_1r,CEN_ROSC_ENABLE_DEFAULTf}, 36 {INVALIDr,INVALIDf} 37 }; 38 39 static soc_avs_reg_info_t _th_osc_cen_thr_en_list[]={ 40 {AVS_REG_ROSC_THRESHOLD_1_CEN_ROSC_THRESHOLD1_EN_0r,IRQ_ENf}, 41 {AVS_REG_ROSC_THRESHOLD_1_CEN_ROSC_THRESHOLD1_EN_1r,IRQ_ENf}, 42 {AVS_REG_ROSC_THRESHOLD_2_CEN_ROSC_THRESHOLD2_EN_0r,IRQ_ENf}, 43 {AVS_REG_ROSC_THRESHOLD_2_CEN_ROSC_THRESHOLD2_EN_1r,IRQ_ENf}, 44 {INVALIDr,INVALIDf} 45 }; 46 47 /* reset osc measurement */ 48 static soc_avs_reg_info_t _th_osc_seq_reset_list[]={ 49 {AVS_REG_HW_MNTR_MEASUREMENTS_INIT_CEN_ROSC_0r,M_INIT_CEN_ROSCf}, 50 {AVS_REG_HW_MNTR_MEASUREMENTS_INIT_CEN_ROSC_1r,M_INIT_CEN_ROSCf}, 51 {AVS_REG_HW_MNTR_MEASUREMENTS_INIT_RMT_ROSC_0r,M_INIT_RMT_ROSCf}, 52 {AVS_REG_HW_MNTR_MEASUREMENTS_INIT_RMT_ROSC_1r,M_INIT_RMT_ROSCf}, 53 {AVS_REG_HW_MNTR_MEASUREMENTS_INIT_RMT_ROSC_2r,M_INIT_RMT_ROSCf}, 54 {AVS_REG_HW_MNTR_MEASUREMENTS_INIT_RMT_ROSC_3r,M_INIT_RMT_ROSCf}, 55 {AVS_REG_HW_MNTR_MEASUREMENTS_INIT_RMT_ROSC_4r,M_INIT_RMT_ROSCf}, 56 {INVALIDr,INVALIDf} 57 }; 58 59 STATIC int 60 _soc_th_avs_ioctl(int unit, soc_avs_ioctl_t opcode, void* data, int len) 61 { 62 uint32 value; 63 int rv = SOC_E_NONE; 64 switch (opcode) { 65 case SOC_AVS_CTRL_PVTMON_VOLTAGE_GET: 66 value = *(uint32 *)data; /* code */ 67 *(uint32 *)data = 10U*(value * 8800U) / 7168U; 68 /* = ((code/1024)*880.0/0.7)/1000 */ 69 break; 70 case SOC_AVS_CTRL_PVTMON_TEMP_GET: 71 value = *(uint32 *)data; /* code */ 72 *(int32 *)data = (41004000 - (signed)(value*48705))/100; 73 /* temper = 410.04 - (code * 0.48705); 74 * = (100000*410.04 - code * 48705)/100000 75 * = (41004000 - code*48705)/100000 76 * Above number represents Temperature in degrees 77 * To express temper in 1000th so multiply by 1000 78 * temper = (41004000 - code*48705)/100; //in 1000 milli-Degree 79 * 80 * When code = 0, temper = 410.04 81 * When code = 1023, temper = 41004000 - 49632891 82 * = -88.21 83 */ 84 break; 85 case SOC_AVS_CTRL_QUERY_TRACK_STEP_SIZE: 86 /* 5 mV */ 87 *(uint32 *)data = 50; 88 break; 89 default: 90 rv = SOC_E_UNAVAIL; 91 break; 92 } 93 return rv; 94 } 95 96 STATIC soc_error_t 97 _soc_th_avs_vcore_init(int unit) 98 { 99 /* defined in avs_vctl.c */ 100 return soc_th_avs_vcore_init(unit); 101 } 102 103 STATIC soc_error_t 104 _soc_th_avs_vcore_deinit(int unit) 105 { 106 /* defined in avs_vctl.c */ 107 return soc_th_avs_vcore_deinit(unit); 108 } 109 110 STATIC soc_error_t 111 _soc_th_avs_vcore_get(int unit, uint32 *voltage) 112 { 113 /* defined in avs_vctl.c */ 114 return soc_th_avs_vcore_get(unit, voltage); 115 } 116 117 STATIC soc_error_t 118 _soc_th_avs_vcore_set(int unit, uint32 voltage) 119 { 120 /* defined in avs_vctl.c */ 121 return soc_th_avs_vcore_set(unit, voltage); 122 } 123 124 STATIC soc_error_t 125 _soc_th_avs_init(int unit, soc_avs_info_t *avs_info) 126 { 127 if (avs_info == NULL) { 128 return (SOC_E_PARAM); 129 } 130 131 avs_info->num_centrals = SOC_AVS_TOMAHAWK_NUMBER_OF_CENTRALS; 132 avs_info->cent_xbmp[0] = SOC_AVS_TOMAHAWK_CENTRAL_XBMP0; 133 avs_info->cent_xbmp[1] = SOC_AVS_TOMAHAWK_CENTRAL_XBMP1; 134 avs_info->first_cent = SOC_AVS_TOMAHAWK_FIRST_CENTRAL; 135 136 avs_info->num_remotes = SOC_AVS_TOMAHAWK_NUMBER_OF_REMOTES; 137 avs_info->rmt_xbmp[0] = SOC_AVS_TOMAHAWK_REMOTE_XBMP0; 138 avs_info->rmt_xbmp[1] = SOC_AVS_TOMAHAWK_REMOTE_XBMP1; 139 avs_info->rmt_xbmp[2] = SOC_AVS_TOMAHAWK_REMOTE_XBMP2; 140 avs_info->first_rmt = SOC_AVS_TOMAHAWK_FIRST_REMOTE; 141 142 143 avs_info->vmargin_low = SOC_AVS_INT(SOC_AVS_TOMAHAWK_VMARGIN_LOW); 144 avs_info->vmargin_high = SOC_AVS_INT(SOC_AVS_TOMAHAWK_VMARGIN_HIGH); 145 146 avs_info->rosc_count_mode = SOC_AVS_ROSC_COUNT_MODE_1EDGE; 147 avs_info->ref_clk_freq = 25; 148 avs_info->measurement_time_control = 127; 149 avs_info->osc_cen_init_info = _th_osc_cen_init_list; 150 avs_info->osc_cen_thr_en_info = _th_osc_cen_thr_en_list; 151 avs_info->osc_seq_reset_info = _th_osc_seq_reset_list; 152 153 avs_info->avs_flags = SOC_AVS_INFO_F_SET_THRESHOLDS | 154 SOC_AVS_INFO_F_RSOC_THRESHOLD_CACHE ; 155 156 /* vmin_avs used for floor check */ 157 avs_info->vmin_avs = SOC_AVS_INT(SOC_AVS_TOMAHAWK_VMIN_AVS); 158 /* vmax_avs used for ceiling check */ 159 avs_info->vmax_avs = SOC_AVS_INT(SOC_AVS_TOMAHAWK_VMAX_AVS); 160 161 #ifdef BCM_SBUSDMA_SUPPORT 162 if (soc_feature(unit, soc_feature_sbusdma)) { 163 avs_info->avs_flags |= SOC_AVS_INFO_F_RSOC_COUNT_DMA; 164 avs_info->cen_osc_reg = AVS_REG_RO_REGISTERS_0_CEN_ROSC_STATUSr; 165 avs_info->rmt_osc_reg = AVS_REG_PMB_SLAVE_AVS_ROSC_COUNTr; 166 } 167 #endif 168 169 return SOC_E_NONE; 170 } 171 172 STATIC soc_error_t 173 _soc_th_avs_deinit(int unit) 174 { 175 /* voltage related deinit, if any */ 176 SOC_IF_ERROR_RETURN( 177 _soc_th_avs_vcore_deinit(unit)); 178 179 return SOC_E_NONE; 180 } 181 182 soc_avs_functions_t _th_avs_functions; 183 soc_avs_vrm_access_t _th_avs_vrm_access; 184 185 soc_error_t 186 soc_th_avs_init(int unit) 187 { 188 /* register avs functions*/ 189 memset(&_th_avs_functions, 0, sizeof(soc_avs_functions_t)); 190 _th_avs_functions.info_init = &_soc_th_avs_init; 191 _th_avs_functions.info_deinit = &_soc_th_avs_deinit; 192 _th_avs_functions.ioctl = &_soc_th_avs_ioctl; 193 soc_avs_function_register(unit, &_th_avs_functions); 194 195 memset(&_th_avs_vrm_access, 0, sizeof(soc_avs_vrm_access_t)); 196 _th_avs_vrm_access.vrm_init = &_soc_th_avs_vcore_init; 197 _th_avs_vrm_access.voltage_set = &_soc_th_avs_vcore_set; 198 _th_avs_vrm_access.voltage_get = &_soc_th_avs_vcore_get; 199 _th_avs_vrm_access.vrm_deinit = &_soc_th_avs_vcore_deinit; 200 soc_avs_vrm_access_func_register(unit, &_th_avs_vrm_access); 201 202 return SOC_E_NONE; 203 } 204 205 #endif /* INCLUDE_AVS */