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

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__ */