avs.h (9863B)
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.h 8 * Purpose: 9 */ 10 #ifndef __SOC_AVS_H__ 11 #define __SOC_AVS_H__ 12 13 #ifdef INCLUDE_AVS 14 #include <soc/drv.h> 15 #include <soc/i2c.h> 16 17 #define SOC_AVS_NUM_CENT_XBMP 4 18 #define SOC_AVS_NUM_RMT_XBMP 8 19 20 typedef enum { 21 SOC_AVS_BOOL_FALSE = 0, 22 SOC_AVS_BOOL_TRUE = 1 23 } soc_avs_bool_t; 24 25 26 typedef enum { 27 SOC_AVS_CTRL_OSC_INIT = 0, 28 SOC_AVS_CTRL_OSC_THRESHOLD = 1, 29 SOC_AVS_CTRL_SEQUENCER_INIT = 2, 30 SOC_AVS_CTRL_PVTMON_INIT = 3, 31 SOC_AVS_CTRL_OSC_MNTR_INIT = 4, 32 SOC_AVS_CTRL_HW_MNTR_SW_CONTROL = 5, 33 SOC_AVS_CTRL_QUERY_TRACK_STEP_SIZE = 6, 34 SOC_AVS_CTRL_QUERY_NEW_THR_INC = 7, 35 SOC_AVS_CTRL_LVM_MODE = 8, 36 SOC_AVS_CTRL_PVTMON_TEMP_GET = 9, 37 SOC_AVS_CTRL_PVTMON_VOLTAGE_GET = 10, 38 SOC_AVS_CTRL_PVTMON_VOLTAGE_SET = 11 39 } soc_avs_ioctl_t; 40 41 typedef enum { 42 SOC_AVS_PVT_TEMPERATURE = 0, /* Bit 0 - Temperature measurement */ 43 SOC_AVS_PVT_0P85V_0 = 1, /* Bit 1 - Voltage 0p85V<0> measurement */ 44 SOC_AVS_PVT_0P85V_1 = 2, /* Bit 2 - Voltage 0p85V<1> measurement */ 45 SOC_AVS_PVT_1V_0 = 3, /* Bit 3 - Voltage 1V<0> measurement */ 46 SOC_AVS_PVT_1V_1 = 4, /* Bit 4 - Voltage 1V<1> measurement */ 47 SOC_AVS_PVT_1P8V = 5, /* Bit 5 - Voltage 1p8V measurement */ 48 SOC_AVS_PVT_3P3V = 6, /* Bit 6 - Voltage 3p3V measurement */ 49 SOC_AVS_PVT_TESTMODE = 7 /* Bit 7 - Testmode measurement */ 50 } soc_avs_pvt_t; 51 52 typedef struct { 53 soc_reg_t reg_name; 54 soc_field_t reg_field; 55 } soc_avs_reg_info_t; 56 57 typedef struct soc_avs_info_s { 58 int first_cent; 59 int num_centrals; 60 uint32 cent_xbmp[SOC_AVS_NUM_CENT_XBMP]; 61 int first_rmt; 62 int num_remotes; 63 uint32 rmt_xbmp[SOC_AVS_NUM_RMT_XBMP]; 64 int vmin_avs; 65 int vmax_avs; 66 int vmargin_low; 67 int vmargin_high; 68 int rosc_count_mode; 69 int ref_clk_freq; /* in MHz*/ 70 int measurement_time_control; 71 soc_avs_reg_info_t *osc_cen_init_info; 72 soc_avs_reg_info_t *osc_cen_thr_en_info; 73 soc_avs_reg_info_t *osc_seq_reset_info; 74 uint32 avs_flags; 75 int rw_delta; /* in 0.1 mV */ 76 #ifdef BCM_SBUSDMA_SUPPORT 77 /* regitsers retrived from dma */ 78 soc_reg_t cen_osc_reg; 79 soc_reg_t rmt_osc_reg; 80 #endif 81 } soc_avs_info_t; 82 83 typedef struct soc_avs_debug_xbmp_s{ 84 uint32 cent_xbmp[SOC_AVS_NUM_CENT_XBMP]; 85 uint32 rmt_xbmp[SOC_AVS_NUM_RMT_XBMP]; 86 }soc_avs_debug_xbmp_t; 87 88 typedef struct soc_avs_debug_margin_s{ 89 int vmargin_low; 90 int vmargin_high; 91 }soc_avs_debug_margin_t; 92 93 typedef struct soc_avs_functions_s{ 94 /* function required for close loop */ 95 int (*info_init)(int unit, soc_avs_info_t* avs_info ); /* initialization function */ 96 int (*info_deinit)(int unit); /* deinitialization function */ 97 int (*ioctl)(int unit, soc_avs_ioctl_t opcode, void* data, int len); 98 /* function required for open loop */ 99 int (*openloop_voltage_get)(int unit, uint32 *voltage); 100 }soc_avs_functions_t; 101 102 typedef struct soc_avs_vrm_access_s { 103 int (*vrm_init)(int unit); 104 int (*vrm_deinit)(int unit); 105 int (*voltage_get)(int unit, uint32 *voltage); 106 int (*voltage_set)(int unit, uint32 voltage); 107 } soc_avs_vrm_access_t; 108 109 /* Use PMBUS device driver */ 110 typedef struct soc_avs_vrm_profile_s { 111 char mux_name[SOC_I2C_DEV_NAME_MAX]; 112 char vrm_name[SOC_I2C_DEV_NAME_MAX]; 113 uint8 mux_enable_value; 114 } soc_avs_vrm_profile_t; 115 116 typedef struct soc_avs_vrm_info_s { 117 soc_avs_vrm_profile_t profile; 118 int mux_id; 119 int vrm_id; 120 } soc_avs_vrm_info_t; 121 122 typedef struct soc_avs_control_s { 123 soc_avs_functions_t *avs_functions; 124 soc_avs_info_t *avs_info; 125 soc_avs_vrm_access_t *vrm_access; /* use customer vrm driver */ 126 soc_avs_vrm_info_t *vrm_info; /* use i2c pmbus driver */ 127 sal_mutex_t avsMutex; 128 sal_thread_t avs_track_pid; 129 char avs_track_name[16]; 130 sal_usecs_t avs_track_interval; 131 sal_sem_t avs_track_notify; 132 #ifdef BCM_SBUSDMA_SUPPORT 133 int rmt_rosc_count_sync; 134 int cent_rosc_count_sync; 135 uint32 *rmt_desc_buff; 136 uint32 *cent_desc_buff; 137 #endif 138 int *cen_freq_thr; 139 int *rmt_freq_thr; 140 int *cen_fth_slope; 141 uint32 *saved_voltage; 142 int32 slope_margin; 143 int32 intercept_margin; 144 soc_avs_debug_xbmp_t *avs_debug_xbmp; 145 soc_avs_debug_margin_t *avs_debug_margin; 146 uint32 v1r_cache; 147 uint32 *cent_v1s_osc_cache; 148 uint32 *rmt_v1s_h_osc_cache; 149 uint32 *rmt_v1s_s_osc_cache; 150 uint32 *cent_lo_thr_cache; 151 uint32 *cent_hi_thr_cache; 152 uint32 *rmt_h_thr_cache; 153 uint32 *rmt_s_thr_cache; 154 int track_step_size; /* in 0.1 mv */ 155 int new_thr_inc; /* in 0.1 mv */ 156 int flags; 157 }soc_avs_control_t; 158 159 extern int soc_avs_function_register(int unit, 160 soc_avs_functions_t *avs_functions); 161 162 #define SOC_AVS_CONTROL(unit) (soc_avs_ctrl[unit]) 163 #define SOC_AVS_FUNCTIONS(unit) (SOC_AVS_CONTROL(unit)->avs_functions) 164 #define SOC_AVS_VRM_ACCESS(unit) (SOC_AVS_CONTROL(unit)->vrm_access) 165 #define SOC_AVS_VRM_INFO(unit) (SOC_AVS_CONTROL(unit)->vrm_info) 166 #define SOC_AVS_INFO(unit) (SOC_AVS_CONTROL(unit)->avs_info) 167 #define SOC_AVS_XBMP(unit) (SOC_AVS_CONTROL(unit)->avs_debug_xbmp) 168 #define SOC_AVS_MARGIN(unit) (SOC_AVS_CONTROL(unit)->avs_debug_margin) 169 170 #define SOC_AVS_LOCK(s) sal_mutex_take(s->avsMutex, sal_mutex_FOREVER) 171 #define SOC_AVS_UNLOCK(s) sal_mutex_give(s->avsMutex) 172 173 /* unit in 0.1 mv*/ 174 #define SOC_AVS_MAX_VOLTAGE 10500 175 #define SOC_AVS_MIN_VOLTAGE 8500 176 #define SOC_AVS_DEFAULT_VMIN_AVS 8500 /* 0.85 V*/ 177 #define SOC_AVS_DEFAULT_VMAX_AVS 10200 /* 1.02 V*/ 178 #define SOC_AVS_DEFAULT_VMARGIN_HIGH 0 179 #define SOC_AVS_DEFAULT_VMARGIN_LOW 0 180 181 #define SOC_AVS_ALL_ONES 0xFFFFFFFF 182 183 /* make this larger to get more precision in 184 * the numbers (but be careful of overflow) */ 185 #define SOC_AVS_SCALING_FACTOR 10000 186 /* WARNING: DO NOT CHANGE THIS -- it MUST match the definition used 187 * to build the library */ 188 #define SOC_AVS_S1 1 189 #define SOC_AVS_S2 SOC_AVS_SCALING_FACTOR 190 191 #define SOC_AVS_UINT(_x_) ((uint32)((_x_)*SOC_AVS_S1)) 192 #define SOC_AVS_INT(_x_) ((int)((_x_)*SOC_AVS_S1)) 193 194 195 #define SOC_AVS_ROSC_COUNT_MODE_1EDGE 1 /* 1 is for one-edge (only rise edge) */ 196 #define SOC_AVS_ROSC_COUNT_MODE_2EDGES 0 /* 0 is for 2 edges (both rise, fall) */ 197 198 199 #define SOC_AVS_F_INITED (1 << 0) 200 #define SOC_AVS_F_TRACK_INITED (1 << 1) 201 #define SOC_AVS_F_THRESHOLD_SET (1 << 2) 202 #define SOC_AVS_F_VRM_INITED (1 << 3) 203 204 #define SOC_AVS_INFO_F_USE_SOFTWARE_TAKEOVER (1 << 0) 205 #define SOC_AVS_INFO_F_USE_READ_PVTMON_VOLTAGE (1 << 1) 206 #define SOC_AVS_INFO_F_USE_LVM_FLAG (1 << 2) 207 #define SOC_AVS_INFO_F_USE_OTP_VTRAP_DATA (1 << 3) 208 #define SOC_AVS_INFO_F_SET_THRESHOLDS (1 << 4) 209 #define SOC_AVS_INFO_F_DO_NOT_ACCESS_XOSC (1 << 5) 210 #define SOC_AVS_INFO_F_RSOC_COUNT_DMA (1 << 6) 211 #define SOC_AVS_INFO_F_RSOC_THRESHOLD_CACHE (1 << 7) 212 213 /* helper macro */ 214 #define SOC_AVS_OSC_EXCLUDED(i,xbmp) (((((xbmp) >> ((i)%32)) & 0x1) == 0) ? \ 215 FALSE : TRUE) 216 217 #define SOC_AVS_FREE_IF_ERROR_RETURN(op,ptr) \ 218 do { int _rv; \ 219 if (SOC_FAILURE((_rv = (op)))) { \ 220 sal_free((ptr));\ 221 _SHR_ERROR_TRACE(_rv);\ 222 return(_rv);\ 223 }\ 224 } while(0) 225 226 #define SOC_AVS_IF_ERROR_NOT_UNAVAIL_RETURN(op) \ 227 _SHR_E_IF_ERROR_NOT_UNAVAIL_RETURN(op) 228 229 230 #define SOC_AVS_MAX(a,b) ((a) > (b) ? (a) : (b)) 231 #define SOC_AVS_MIN(a,b) ((a) < (b) ? (a) : (b)) 232 #define SOC_AVS_ABS(x) (((x) >= 0)? (x) : -(x)) 233 #define SOC_AVS_ASSERT(x) assert(x) 234 235 #define SOC_AVS_DAC_DELAY 100 236 #define SOC_AVS_REMOTE_DELAY 0 237 #define NUM_BITS_PER_XBMP 32 238 #define SOC_AVS_SEQUENCER_DELAY 32 239 #define SOC_AVS_PVT_DISABLE_DELAY 200 240 #define SOC_AVS_OPENLOOP_DELAY 100 241 242 #define SOC_AVS_ROSC_TYPE_CENTRAL 0 243 #define SOC_AVS_ROSC_TYPE_REMOTE 1 244 #define SOC_AVS_ROSC_TYPE_ALL 2 245 246 extern int soc_avs_init(int unit); 247 extern int soc_avs_deinit(int unit); 248 extern int soc_avs_start(int unit); 249 extern int soc_avs_xbmp_dump(int unit, int type); 250 extern int soc_avs_xbmp_set(int unit, int type, int start_osc, 251 int num_osc, int value); 252 extern int soc_avs_voltage_set(int unit, uint32 voltage); 253 extern int soc_avs_voltage_get(int unit, uint32 *voltage); 254 extern int _soc_avs_predict_vpred(int unit, int pass, uint32 dac_code_low, uint32 255 dac_code_high, uint32 *vpred, uint32 *vlow, uint32 *vhigh); 256 extern int _soc_avs_initialize_oscs(int unit); 257 extern int soc_avs_track_start(int unit, int interval); 258 extern int soc_avs_track_stop(int unit); 259 extern int soc_avs_track(int unit); 260 extern int soc_avs_info_dump(int unit); 261 extern int soc_avs_osc_count_dump(int unit, int type); 262 extern int soc_avs_debug_margin_get(int unit, 263 soc_avs_debug_margin_t *avs_debug_margin); 264 extern int soc_avs_debug_margin_set(int unit, 265 soc_avs_debug_margin_t *avs_debug_margin); 266 extern int soc_avs_temperature_get(int unit, int *temperature); 267 extern int soc_avs_pvtmon_voltage_get(int unit, uint32 *voltage); 268 extern int soc_avs_pvtmon_voltage_set(int unit, uint32 voltage); 269 270 extern int 271 soc_avs_vrm_access_func_register(int unit, soc_avs_vrm_access_t *vrm_access); 272 extern int soc_avs_openloop_main(int unit); 273 extern int soc_avs_vrm_profile_add(int unit, soc_avs_vrm_profile_t *vrm_profile); 274 #endif /* INCLUDE_AVS */ 275 #endif /* __SOC_AVS_H__ */