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