meta-facebook/meta-minipack/recipes-minipack/platform-lib/files/pal/pal.c (7,035 lines of code) (raw):

/* * * Copyright 2018-present Facebook. All Rights Reserved. * * This file contains code to support IPMI2.0 Specificaton available @ * http://www.intel.com/content/www/us/en/servers/ipmi/ipmi-specifications.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * This file contains functions and logics that depends on Wedge100 specific * hardware and kernel drivers. Here, some of the empty "default" functions * are overridden with simple functions that returns non-zero error code. * This is for preventing any potential escape of failures through the * default functions that will return 0 no matter what. */ // #define DEBUG #include <stdio.h> #include <string.h> #include <errno.h> #include <syslog.h> #include <time.h> #include <unistd.h> #include <pthread.h> #include <ctype.h> #include <linux/limits.h> #include <linux/version.h> #include "pal.h" #include "pal_sensors.h" #include <math.h> #include <facebook/bic.h> #include <openbmc/kv.h> #include <openbmc/obmc-i2c.h> #include <openbmc/sensor-correction.h> #include <openbmc/misc-utils.h> #include <openbmc/log.h> #define RUN_SHELL_CMD(_cmd) \ do { \ int _ret = system(_cmd); \ if (_ret != 0) \ OBMC_WARN("'%s' command returned %d", _cmd, _ret); \ } while (0) typedef struct { char name[32]; } sensor_desc_t; struct threadinfo { uint8_t is_running; uint8_t fru; pthread_t pt; }; typedef struct { uint16_t flag; float ucr; float unc; float unr; float lcr; float lnc; float lnr; float pos_hyst; float neg_hyst; int curr_st; char name[32]; } _sensor_thresh_t; typedef struct { char name[NAME_MAX]; } sensor_path_t; static sensor_desc_t m_snr_desc[MAX_NUM_FRUS][MAX_SENSOR_NUM + 1] = {0}; static struct threadinfo t_dump[MAX_NUM_FRUS] = {0, }; static sensor_path_t snr_path[MAX_NUM_FRUS][MAX_SENSOR_NUM + 1] = {0}; /* List of BIC Discrete sensors to be monitored */ const uint8_t bic_discrete_list[] = { BIC_SENSOR_SYSTEM_STATUS, BIC_SENSOR_PROC_FAIL, BIC_SENSOR_SYS_BOOT_STAT, BIC_SENSOR_CPU_DIMM_HOT, BIC_SENSOR_VR_HOT, BIC_SENSOR_POWER_THRESH_EVENT, BIC_SENSOR_POST_ERR, BIC_SENSOR_POWER_ERR, BIC_SENSOR_PROC_HOT_EXT, BIC_SENSOR_MACHINE_CHK_ERR, BIC_SENSOR_PCIE_ERR, BIC_SENSOR_OTHER_IIO_ERR, BIC_SENSOR_MEM_ECC_ERR, BIC_SENSOR_SPS_FW_HLTH, BIC_SENSOR_CAT_ERR, }; // List of BIC sensors which need to do negative reading handle const uint8_t bic_neg_reading_sensor_support_list[] = { /* Temperature sensors*/ BIC_SENSOR_MB_OUTLET_TEMP, BIC_SENSOR_MB_INLET_TEMP, BIC_SENSOR_PCH_TEMP, BIC_SENSOR_SOC_TEMP, BIC_SENSOR_SOC_DIMMA0_TEMP, BIC_SENSOR_SOC_DIMMB0_TEMP, BIC_SENSOR_VCCIN_VR_CURR, }; /* List of SCM sensors to be monitored */ const uint8_t scm_sensor_list[] = { SCM_SENSOR_OUTLET_LOCAL_TEMP, SCM_SENSOR_OUTLET_REMOTE_TEMP, SCM_SENSOR_INLET_LOCAL_TEMP, SCM_SENSOR_INLET_REMOTE_TEMP, SCM_SENSOR_HSC_VOLT, SCM_SENSOR_HSC_CURR, SCM_SENSOR_HSC_POWER, }; /* List of SCM and BIC sensors to be monitored */ const uint8_t scm_all_sensor_list[] = { SCM_SENSOR_OUTLET_LOCAL_TEMP, SCM_SENSOR_OUTLET_REMOTE_TEMP, SCM_SENSOR_INLET_LOCAL_TEMP, SCM_SENSOR_INLET_REMOTE_TEMP, SCM_SENSOR_HSC_VOLT, SCM_SENSOR_HSC_CURR, SCM_SENSOR_HSC_POWER, BIC_SENSOR_MB_OUTLET_TEMP, BIC_SENSOR_MB_INLET_TEMP, BIC_SENSOR_PCH_TEMP, BIC_SENSOR_VCCIN_VR_TEMP, BIC_SENSOR_1V05MIX_VR_TEMP, BIC_SENSOR_SOC_TEMP, BIC_SENSOR_SOC_THERM_MARGIN, BIC_SENSOR_VDDR_VR_TEMP, BIC_SENSOR_SOC_DIMMA0_TEMP, BIC_SENSOR_SOC_DIMMB0_TEMP, BIC_SENSOR_SOC_PACKAGE_PWR, BIC_SENSOR_VCCIN_VR_POUT, BIC_SENSOR_VDDR_VR_POUT, BIC_SENSOR_SOC_TJMAX, BIC_SENSOR_P3V3_MB, BIC_SENSOR_P12V_MB, BIC_SENSOR_P1V05_PCH, BIC_SENSOR_P3V3_STBY_MB, BIC_SENSOR_P5V_STBY_MB, BIC_SENSOR_PV_BAT, BIC_SENSOR_PVDDR, BIC_SENSOR_P1V05_MIX, BIC_SENSOR_1V05MIX_VR_CURR, BIC_SENSOR_VDDR_VR_CURR, BIC_SENSOR_VCCIN_VR_CURR, BIC_SENSOR_VCCIN_VR_VOL, BIC_SENSOR_VDDR_VR_VOL, BIC_SENSOR_P1V05MIX_VR_VOL, BIC_SENSOR_P1V05MIX_VR_POUT, BIC_SENSOR_INA230_POWER, BIC_SENSOR_INA230_VOL, }; /* List of SMB sensors to be monitored */ const uint8_t smb_sensor_list[] = { #if 0 /* * mikechoi@fb.com : Jul 11 2019, * Temporarily disable the sensor reading of this power chip, as per * FB Network HW team's request. Reading the sensor of this chip rarely * causes this power chip to go to a bad state, and turn off the * power to TH3. Until we have a new revision of HW (with verified HW fix), * we will skip reading these sensors. */ SMB_SENSOR_1220_VMON1, SMB_SENSOR_1220_VMON2, SMB_SENSOR_1220_VMON3, SMB_SENSOR_1220_VMON4, SMB_SENSOR_1220_VMON5, SMB_SENSOR_1220_VMON6, SMB_SENSOR_1220_VMON7, SMB_SENSOR_1220_VMON8, SMB_SENSOR_1220_VMON9, SMB_SENSOR_1220_VMON10, SMB_SENSOR_1220_VMON11, SMB_SENSOR_1220_VMON12, SMB_SENSOR_1220_VCCA, SMB_SENSOR_1220_VCCINP, #endif SMB_SENSOR_TH3_SERDES_VOLT, SMB_SENSOR_TH3_SERDES_CURR, SMB_SENSOR_TH3_SERDES_TEMP, SMB_SENSOR_TH3_CORE_VOLT, SMB_SENSOR_TH3_CORE_CURR, SMB_SENSOR_TH3_CORE_TEMP, SMB_SENSOR_TEMP1, SMB_SENSOR_TEMP2, SMB_SENSOR_TEMP3, SMB_SENSOR_TEMP4, SMB_SENSOR_TEMP5, SMB_SENSOR_TH3_DIE_TEMP1, SMB_SENSOR_TH3_DIE_TEMP2, /* Sensors on PDB */ SMB_SENSOR_PDB_L_TEMP1, SMB_SENSOR_PDB_L_TEMP2, SMB_SENSOR_PDB_R_TEMP1, SMB_SENSOR_PDB_R_TEMP2, /* Sensors on FCM */ SMB_SENSOR_FCM_T_TEMP1, SMB_SENSOR_FCM_T_TEMP2, SMB_SENSOR_FCM_B_TEMP1, SMB_SENSOR_FCM_B_TEMP2, SMB_SENSOR_FCM_T_HSC_VOLT, SMB_SENSOR_FCM_T_HSC_CURR, SMB_SENSOR_FCM_T_HSC_POWER, SMB_SENSOR_FCM_B_HSC_VOLT, SMB_SENSOR_FCM_B_HSC_CURR, SMB_SENSOR_FCM_B_HSC_POWER, /* Sensors FAN Speed */ SMB_SENSOR_FAN1_FRONT_TACH, SMB_SENSOR_FAN1_REAR_TACH, SMB_SENSOR_FAN2_FRONT_TACH, SMB_SENSOR_FAN2_REAR_TACH, SMB_SENSOR_FAN3_FRONT_TACH, SMB_SENSOR_FAN3_REAR_TACH, SMB_SENSOR_FAN4_FRONT_TACH, SMB_SENSOR_FAN4_REAR_TACH, SMB_SENSOR_FAN5_FRONT_TACH, SMB_SENSOR_FAN5_REAR_TACH, SMB_SENSOR_FAN6_FRONT_TACH, SMB_SENSOR_FAN6_REAR_TACH, SMB_SENSOR_FAN7_FRONT_TACH, SMB_SENSOR_FAN7_REAR_TACH, SMB_SENSOR_FAN8_FRONT_TACH, SMB_SENSOR_FAN8_REAR_TACH, }; const uint8_t pim1_sensor_list[] = { PIM1_SENSOR_TEMP1, PIM1_SENSOR_TEMP2, PIM1_SENSOR_QSFP_TEMP, PIM1_SENSOR_HSC_VOLT, PIM1_SENSOR_HSC_CURR, PIM1_SENSOR_HSC_POWER, PIM1_SENSOR_34461_VOLT1, PIM1_SENSOR_34461_VOLT2, PIM1_SENSOR_34461_VOLT3, PIM1_SENSOR_34461_VOLT4, PIM1_SENSOR_34461_VOLT5, PIM1_SENSOR_34461_VOLT6, PIM1_SENSOR_34461_VOLT7, PIM1_SENSOR_34461_VOLT8, PIM1_SENSOR_34461_VOLT9, PIM1_SENSOR_34461_VOLT10, PIM1_SENSOR_34461_VOLT11, PIM1_SENSOR_34461_VOLT12, PIM1_SENSOR_34461_VOLT13, PIM1_SENSOR_34461_VOLT14, PIM1_SENSOR_34461_VOLT15, PIM1_SENSOR_34461_VOLT16, }; const uint8_t pim2_sensor_list[] = { PIM2_SENSOR_TEMP1, PIM2_SENSOR_TEMP2, PIM2_SENSOR_QSFP_TEMP, PIM2_SENSOR_HSC_VOLT, PIM2_SENSOR_HSC_CURR, PIM2_SENSOR_HSC_POWER, PIM2_SENSOR_34461_VOLT1, PIM2_SENSOR_34461_VOLT2, PIM2_SENSOR_34461_VOLT3, PIM2_SENSOR_34461_VOLT4, PIM2_SENSOR_34461_VOLT5, PIM2_SENSOR_34461_VOLT6, PIM2_SENSOR_34461_VOLT7, PIM2_SENSOR_34461_VOLT8, PIM2_SENSOR_34461_VOLT9, PIM2_SENSOR_34461_VOLT10, PIM2_SENSOR_34461_VOLT11, PIM2_SENSOR_34461_VOLT12, PIM2_SENSOR_34461_VOLT13, PIM2_SENSOR_34461_VOLT14, PIM2_SENSOR_34461_VOLT15, PIM2_SENSOR_34461_VOLT16, }; const uint8_t pim3_sensor_list[] = { PIM3_SENSOR_TEMP1, PIM3_SENSOR_TEMP2, PIM3_SENSOR_QSFP_TEMP, PIM3_SENSOR_HSC_VOLT, PIM3_SENSOR_HSC_CURR, PIM3_SENSOR_HSC_POWER, PIM3_SENSOR_34461_VOLT1, PIM3_SENSOR_34461_VOLT2, PIM3_SENSOR_34461_VOLT3, PIM3_SENSOR_34461_VOLT4, PIM3_SENSOR_34461_VOLT5, PIM3_SENSOR_34461_VOLT6, PIM3_SENSOR_34461_VOLT7, PIM3_SENSOR_34461_VOLT8, PIM3_SENSOR_34461_VOLT9, PIM3_SENSOR_34461_VOLT10, PIM3_SENSOR_34461_VOLT11, PIM3_SENSOR_34461_VOLT12, PIM3_SENSOR_34461_VOLT13, PIM3_SENSOR_34461_VOLT14, PIM3_SENSOR_34461_VOLT15, PIM3_SENSOR_34461_VOLT16, }; const uint8_t pim4_sensor_list[] = { PIM4_SENSOR_TEMP1, PIM4_SENSOR_TEMP2, PIM4_SENSOR_QSFP_TEMP, PIM4_SENSOR_HSC_VOLT, PIM4_SENSOR_HSC_CURR, PIM4_SENSOR_HSC_POWER, PIM4_SENSOR_34461_VOLT1, PIM4_SENSOR_34461_VOLT2, PIM4_SENSOR_34461_VOLT3, PIM4_SENSOR_34461_VOLT4, PIM4_SENSOR_34461_VOLT5, PIM4_SENSOR_34461_VOLT6, PIM4_SENSOR_34461_VOLT7, PIM4_SENSOR_34461_VOLT8, PIM4_SENSOR_34461_VOLT9, PIM4_SENSOR_34461_VOLT10, PIM4_SENSOR_34461_VOLT11, PIM4_SENSOR_34461_VOLT12, PIM4_SENSOR_34461_VOLT13, PIM4_SENSOR_34461_VOLT14, PIM4_SENSOR_34461_VOLT15, PIM4_SENSOR_34461_VOLT16, }; const uint8_t pim5_sensor_list[] = { PIM5_SENSOR_TEMP1, PIM5_SENSOR_TEMP2, PIM5_SENSOR_QSFP_TEMP, PIM5_SENSOR_HSC_VOLT, PIM5_SENSOR_HSC_CURR, PIM5_SENSOR_HSC_POWER, PIM5_SENSOR_34461_VOLT1, PIM5_SENSOR_34461_VOLT2, PIM5_SENSOR_34461_VOLT3, PIM5_SENSOR_34461_VOLT4, PIM5_SENSOR_34461_VOLT5, PIM5_SENSOR_34461_VOLT6, PIM5_SENSOR_34461_VOLT7, PIM5_SENSOR_34461_VOLT8, PIM5_SENSOR_34461_VOLT9, PIM5_SENSOR_34461_VOLT10, PIM5_SENSOR_34461_VOLT11, PIM5_SENSOR_34461_VOLT12, PIM5_SENSOR_34461_VOLT13, PIM5_SENSOR_34461_VOLT14, PIM5_SENSOR_34461_VOLT15, PIM5_SENSOR_34461_VOLT16, }; const uint8_t pim6_sensor_list[] = { PIM6_SENSOR_TEMP1, PIM6_SENSOR_TEMP2, PIM6_SENSOR_QSFP_TEMP, PIM6_SENSOR_HSC_VOLT, PIM6_SENSOR_HSC_CURR, PIM6_SENSOR_HSC_POWER, PIM6_SENSOR_34461_VOLT1, PIM6_SENSOR_34461_VOLT2, PIM6_SENSOR_34461_VOLT3, PIM6_SENSOR_34461_VOLT4, PIM6_SENSOR_34461_VOLT5, PIM6_SENSOR_34461_VOLT6, PIM6_SENSOR_34461_VOLT7, PIM6_SENSOR_34461_VOLT8, PIM6_SENSOR_34461_VOLT9, PIM6_SENSOR_34461_VOLT10, PIM6_SENSOR_34461_VOLT11, PIM6_SENSOR_34461_VOLT12, PIM6_SENSOR_34461_VOLT13, PIM6_SENSOR_34461_VOLT14, PIM6_SENSOR_34461_VOLT15, PIM6_SENSOR_34461_VOLT16, }; const uint8_t pim7_sensor_list[] = { PIM7_SENSOR_TEMP1, PIM7_SENSOR_TEMP2, PIM7_SENSOR_QSFP_TEMP, PIM7_SENSOR_HSC_VOLT, PIM7_SENSOR_HSC_CURR, PIM7_SENSOR_HSC_POWER, PIM7_SENSOR_34461_VOLT1, PIM7_SENSOR_34461_VOLT2, PIM7_SENSOR_34461_VOLT3, PIM7_SENSOR_34461_VOLT4, PIM7_SENSOR_34461_VOLT5, PIM7_SENSOR_34461_VOLT6, PIM7_SENSOR_34461_VOLT7, PIM7_SENSOR_34461_VOLT8, PIM7_SENSOR_34461_VOLT9, PIM7_SENSOR_34461_VOLT10, PIM7_SENSOR_34461_VOLT11, PIM7_SENSOR_34461_VOLT12, PIM7_SENSOR_34461_VOLT13, PIM7_SENSOR_34461_VOLT14, PIM7_SENSOR_34461_VOLT15, PIM7_SENSOR_34461_VOLT16, }; const uint8_t pim8_sensor_list[] = { PIM8_SENSOR_TEMP1, PIM8_SENSOR_TEMP2, PIM8_SENSOR_QSFP_TEMP, PIM8_SENSOR_HSC_VOLT, PIM8_SENSOR_HSC_CURR, PIM8_SENSOR_HSC_POWER, PIM8_SENSOR_34461_VOLT1, PIM8_SENSOR_34461_VOLT2, PIM8_SENSOR_34461_VOLT3, PIM8_SENSOR_34461_VOLT4, PIM8_SENSOR_34461_VOLT5, PIM8_SENSOR_34461_VOLT6, PIM8_SENSOR_34461_VOLT7, PIM8_SENSOR_34461_VOLT8, PIM8_SENSOR_34461_VOLT9, PIM8_SENSOR_34461_VOLT10, PIM8_SENSOR_34461_VOLT11, PIM8_SENSOR_34461_VOLT12, PIM8_SENSOR_34461_VOLT13, PIM8_SENSOR_34461_VOLT14, PIM8_SENSOR_34461_VOLT15, PIM8_SENSOR_34461_VOLT16, }; const uint8_t psu1_sensor_list[] = { PSU1_SENSOR_IN_VOLT, PSU1_SENSOR_12V_VOLT, PSU1_SENSOR_STBY_VOLT, PSU1_SENSOR_IN_CURR, PSU1_SENSOR_12V_CURR, PSU1_SENSOR_STBY_CURR, PSU1_SENSOR_IN_POWER, PSU1_SENSOR_12V_POWER, PSU1_SENSOR_STBY_POWER, PSU1_SENSOR_FAN_TACH, PSU1_SENSOR_TEMP1, PSU1_SENSOR_TEMP2, PSU1_SENSOR_TEMP3, }; const uint8_t psu2_sensor_list[] = { PSU2_SENSOR_IN_VOLT, PSU2_SENSOR_12V_VOLT, PSU2_SENSOR_STBY_VOLT, PSU2_SENSOR_IN_CURR, PSU2_SENSOR_12V_CURR, PSU2_SENSOR_STBY_CURR, PSU2_SENSOR_IN_POWER, PSU2_SENSOR_12V_POWER, PSU2_SENSOR_STBY_POWER, PSU2_SENSOR_FAN_TACH, PSU2_SENSOR_TEMP1, PSU2_SENSOR_TEMP2, PSU2_SENSOR_TEMP3, }; const uint8_t psu3_sensor_list[] = { PSU3_SENSOR_IN_VOLT, PSU3_SENSOR_12V_VOLT, PSU3_SENSOR_STBY_VOLT, PSU3_SENSOR_IN_CURR, PSU3_SENSOR_12V_CURR, PSU3_SENSOR_STBY_CURR, PSU3_SENSOR_IN_POWER, PSU3_SENSOR_12V_POWER, PSU3_SENSOR_STBY_POWER, PSU3_SENSOR_FAN_TACH, PSU3_SENSOR_TEMP1, PSU3_SENSOR_TEMP2, PSU3_SENSOR_TEMP3, }; const uint8_t psu4_sensor_list[] = { PSU4_SENSOR_IN_VOLT, PSU4_SENSOR_12V_VOLT, PSU4_SENSOR_STBY_VOLT, PSU4_SENSOR_IN_CURR, PSU4_SENSOR_12V_CURR, PSU4_SENSOR_STBY_CURR, PSU4_SENSOR_IN_POWER, PSU4_SENSOR_12V_POWER, PSU4_SENSOR_STBY_POWER, PSU4_SENSOR_FAN_TACH, PSU4_SENSOR_TEMP1, PSU4_SENSOR_TEMP2, PSU4_SENSOR_TEMP3, }; float scm_sensor_threshold[MAX_SENSOR_NUM + 1][MAX_SENSOR_THRESHOLD + 1] = {0}; float smb_sensor_threshold[MAX_SENSOR_NUM + 1][MAX_SENSOR_THRESHOLD + 1] = {0}; float pim_sensor_threshold[MAX_SENSOR_NUM + 1][MAX_SENSOR_THRESHOLD + 1] = {0}; float psu_sensor_threshold[MAX_SENSOR_NUM + 1][MAX_SENSOR_THRESHOLD + 1] = {0}; size_t bic_discrete_cnt = sizeof(bic_discrete_list)/sizeof(uint8_t); size_t scm_sensor_cnt = sizeof(scm_sensor_list)/sizeof(uint8_t); size_t scm_all_sensor_cnt = sizeof(scm_all_sensor_list)/sizeof(uint8_t); size_t smb_sensor_cnt = sizeof(smb_sensor_list)/sizeof(uint8_t); size_t pim1_sensor_cnt = sizeof(pim1_sensor_list)/sizeof(uint8_t); size_t pim2_sensor_cnt = sizeof(pim2_sensor_list)/sizeof(uint8_t); size_t pim3_sensor_cnt = sizeof(pim3_sensor_list)/sizeof(uint8_t); size_t pim4_sensor_cnt = sizeof(pim4_sensor_list)/sizeof(uint8_t); size_t pim5_sensor_cnt = sizeof(pim5_sensor_list)/sizeof(uint8_t); size_t pim6_sensor_cnt = sizeof(pim6_sensor_list)/sizeof(uint8_t); size_t pim7_sensor_cnt = sizeof(pim7_sensor_list)/sizeof(uint8_t); size_t pim8_sensor_cnt = sizeof(pim8_sensor_list)/sizeof(uint8_t); size_t psu1_sensor_cnt = sizeof(psu1_sensor_list)/sizeof(uint8_t); size_t psu2_sensor_cnt = sizeof(psu2_sensor_list)/sizeof(uint8_t); size_t psu3_sensor_cnt = sizeof(psu3_sensor_list)/sizeof(uint8_t); size_t psu4_sensor_cnt = sizeof(psu4_sensor_list)/sizeof(uint8_t); static sensor_info_t g_sinfo[MAX_NUM_FRUS][MAX_SENSOR_NUM + 1] = {0}; static float hsc_rsense[MAX_NUM_FRUS] = {0}; static int hsc_power_div = 1; const char pal_fru_list[] = "all, scm, smb, pim1, pim2, pim3, \ pim4, pim5, pim6, pim7, pim8, psu1, psu2, psu3, psu4"; char * key_list[] = { "pwr_server_last_state", "sysfw_ver_server", "timestamp_sled", "server_por_cfg", "server_sel_error", "scm_sensor_health", "smb_sensor_health", "pim1_sensor_health", "pim2_sensor_health", "pim3_sensor_health", "pim4_sensor_health", "pim5_sensor_health", "pim6_sensor_health", "pim7_sensor_health", "pim8_sensor_health", "psu1_sensor_health", "psu2_sensor_health", "psu3_sensor_health", "psu4_sensor_health", "server_boot_order", "server_restart_cause", "server_cpu_ppin", /* Add more Keys here */ LAST_KEY /* This is the last key of the list */ }; char * def_val_list[] = { "on", /* pwr_server_last_state */ "0", /* sysfw_ver_server */ "0", /* timestamp_sled */ "lps", /* server_por_cfg */ "1", /* server_sel_error */ "1", /* scm_sensor_health */ "1", /* smb_sensor_health */ "1", /* pim1_sensor_health */ "1", /* pim2_sensor_health */ "1", /* pim3_sensor_health */ "1", /* pim4_sensor_health */ "1", /* pim5_sensor_health */ "1", /* pim6_sensor_health */ "1", /* pim7_sensor_health */ "1", /* pim8_sensor_health */ "1", /* psu1_sensor_health */ "1", /* psu2_sensor_health */ "1", /* psu3_sensor_health */ "1", /* psu4_sensor_health */ "0000000", /* scm_boot_order */ "3", /* scm_restart_cause */ "0", /* scm_cpu_ppin */ /* Add more def values for the correspoding keys*/ LAST_KEY /* Same as last entry of the key_list */ }; // Helper Functions static int read_device(const char *device, int *value) { FILE *fp; int rc; fp = fopen(device, "r"); if (!fp) { int err = errno; #ifdef DEBUG syslog(LOG_INFO, "failed to open device %s", device); #endif return err; } rc = fscanf(fp, "%i", value); fclose(fp); if (rc != 1) { #ifdef DEBUG syslog(LOG_INFO, "failed to read device %s", device); #endif return ENOENT; } else { return 0; } } // Helper Functions static int read_device_float(const char *device, float *value) { FILE *fp; int rc; fp = fopen(device, "r"); if (!fp) { int err = errno; #ifdef DEBUG syslog(LOG_INFO, "failed to open device %s", device); #endif return err; } rc = fscanf(fp, "%f", value); fclose(fp); if (rc != 1) { #ifdef DEBUG syslog(LOG_INFO, "failed to read device %s", device); #endif return ENOENT; } else { return 0; } } static int write_device(const char *device, const char *value) { FILE *fp; int rc; fp = fopen(device, "w"); if (!fp) { int err = errno; #ifdef DEBUG syslog(LOG_INFO, "failed to open device for write %s", device); #endif return err; } rc = fputs(value, fp); fclose(fp); if (rc < 0) { #ifdef DEBUG syslog(LOG_INFO, "failed to write device %s", device); #endif return ENOENT; } else { return 0; } } int pal_detect_i2c_device(uint8_t bus, uint8_t addr, uint8_t mode, uint8_t force) { int fd = -1, rc = -1; char fn[32]; uint32_t funcs; snprintf(fn, sizeof(fn), "/dev/i2c-%d", bus); fd = open(fn, O_RDWR); if (fd == -1) { syslog(LOG_WARNING, "Failed to open i2c device %s", fn); return I2C_BUS_ERROR; } if (ioctl(fd, I2C_FUNCS, &funcs) < 0) { syslog(LOG_WARNING, "Failed to get %s functionality matrix", fn); close(fd); return I2C_FUNC_ERROR; } if (force) { if (ioctl(fd, I2C_SLAVE_FORCE, addr)) { syslog(LOG_WARNING, "Failed to open slave @ address 0x%x", addr); close(fd); return I2C_DEVICE_ERROR; } } else { if (ioctl(fd, I2C_SLAVE, addr) < 0) { syslog(LOG_WARNING, "Failed to open slave @ address 0x%x", addr); close(fd); return I2c_DRIVER_EXIST; } } /* Probe this address */ switch (mode) { case MODE_QUICK: /* This is known to corrupt the Atmel AT24RF08 EEPROM */ rc = i2c_smbus_write_quick(fd, I2C_SMBUS_WRITE); break; case MODE_READ: /* This is known to lock SMBus on various write-only chips (mainly clock chips) */ rc = i2c_smbus_read_byte(fd); break; default: if ((addr >= 0x30 && addr <= 0x37) || (addr >= 0x50 && addr <= 0x5F)) rc = i2c_smbus_read_byte(fd); else rc = i2c_smbus_write_quick(fd, I2C_SMBUS_WRITE); } close(fd); if (rc < 0) { return I2C_DEVICE_ERROR; } else { return 0; } } int pal_add_i2c_device(uint8_t bus, uint8_t addr, char *device_name) { int ret = -1; char cmd[64]; snprintf(cmd, sizeof(cmd), "echo %s %d > /sys/bus/i2c/devices/i2c-%d/new_device", device_name, addr, bus); #if DEBUG syslog(LOG_WARNING, "[%s] Cmd: %s", __func__, cmd); #endif ret = run_command(cmd); return ret; } int pal_del_i2c_device(uint8_t bus, uint8_t addr) { int ret = -1; char cmd[64]; sprintf(cmd, "echo %d > /sys/bus/i2c/devices/i2c-%d/delete_device", addr, bus); #if DEBUG syslog(LOG_WARNING, "[%s] Cmd: %s", __func__, cmd); #endif ret = run_command(cmd); return ret; } int pal_get_pim_type(uint8_t fru, int retry) { int ret = -1, val; char path[LARGEST_DEVICE_NAME + 1]; uint8_t bus = ((fru - FRU_PIM1) * 8) + 80; snprintf(path, LARGEST_DEVICE_NAME, I2C_SYSFS_DEVICES"/%d-0060/board_ver", bus); if (retry < 0) { retry = 0; } while ((ret = read_device(path, &val)) != 0 && retry--) { msleep(500); } if (ret) { return -1; } #if DEBUG syslog(LOG_WARNING, "[%s] val: 0x%x", __func__, val); #endif if (val == 0x0) { ret = PIM_TYPE_16Q; } else if ((val & 0xf0) == 0xf0) { ret = PIM_TYPE_16O; } else if (val == 0x10) { ret = PIM_TYPE_4DD; } else { return -1; } return ret; } int pal_set_pim_type_to_file(uint8_t fru, char *type) { char fru_name[16]; char key[MAX_KEY_LEN]; pal_get_fru_name(fru, fru_name); sprintf(key, "%s_type", fru_name); return kv_set(key, type, 0, 0); } int pal_get_pim_type_from_file(uint8_t fru) { char fru_name[16]; char key[MAX_KEY_LEN]; char type[12] = {0}; pal_get_fru_name(fru, fru_name); sprintf(key, "%s_type", fru_name); if (kv_get(key, type, NULL, 0)) { #if DEBUG syslog(LOG_WARNING, "pal_get_pim_type_from_file: %s get tpye fail", fru_name); #endif return -1; } if (!strncmp(type, "16q", sizeof("16q"))) { return PIM_TYPE_16Q; } else if (!strncmp(type, "16o", sizeof("16o"))) { return PIM_TYPE_16O; } else if (!strncmp(type, "4dd", sizeof("4dd"))) { return PIM_TYPE_4DD; } else if (!strncmp(type, "unplug", sizeof("unplug"))) { return PIM_TYPE_UNPLUG; } else { return PIM_TYPE_NONE; } } static void pim_thresh_array_init(uint8_t fru) { int i = 0; int type; switch (fru) { case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: i = fru - FRU_PIM1; pim_sensor_threshold[PIM1_SENSOR_TEMP1+(i*0x15)][UCR_THRESH] = 70; pim_sensor_threshold[PIM1_SENSOR_TEMP2+(i*0x15)][UCR_THRESH] = 80; pim_sensor_threshold[PIM1_SENSOR_HSC_VOLT+(i*0x15)][UCR_THRESH] = 12.6; pim_sensor_threshold[PIM1_SENSOR_HSC_VOLT+(i*0x15)][LCR_THRESH] = 11.4; pim_sensor_threshold[PIM1_SENSOR_HSC_CURR+(i*0x15)][UCR_THRESH] = 12; pim_sensor_threshold[PIM1_SENSOR_HSC_POWER+(i*0x15)][UCR_THRESH] = 144; type = pal_get_pim_type_from_file(fru); if (type == PIM_TYPE_16Q) { pim_sensor_threshold[PIM1_SENSOR_QSFP_TEMP+i][UCR_THRESH] = 58; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT1+(i*0x15)][UCR_THRESH] = 0.82; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT1+(i*0x15)][LCR_THRESH] = 0.56; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT2+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT2+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT3+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT3+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT4+(i*0x15)][UCR_THRESH] = 1.944; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT4+(i*0x15)][LCR_THRESH] = 1.656; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT5+(i*0x15)][UCR_THRESH] = 0.82; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT5+(i*0x15)][LCR_THRESH] = 0.56; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT6+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT6+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT7+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT7+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT8+(i*0x15)][UCR_THRESH] = 1.944; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT8+(i*0x15)][LCR_THRESH] = 1.656; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT9+(i*0x15)][UCR_THRESH] = 0.82; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT9+(i*0x15)][LCR_THRESH] = 0.56; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT10+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT10+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT11+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT11+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT12+(i*0x15)][UCR_THRESH] = 1.944; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT12+(i*0x15)][LCR_THRESH] = 1.656; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT13+(i*0x15)][UCR_THRESH] = 0.82; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT13+(i*0x15)][LCR_THRESH] = 0.56; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT14+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT14+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT15+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT15+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT16+(i*0x15)][UCR_THRESH] = 1.944; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT16+(i*0x15)][LCR_THRESH] = 1.656; } else if (type == PIM_TYPE_16O) { pim_sensor_threshold[PIM1_SENSOR_QSFP_TEMP+i][UCR_THRESH] = 60; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT1+(i*0x15)][UCR_THRESH] = 5.25; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT1+(i*0x15)][LCR_THRESH] = 4.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT2+(i*0x15)][UCR_THRESH] = 3.465; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT2+(i*0x15)][LCR_THRESH] = 3.135; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT3+(i*0x15)][UCR_THRESH] = 1.89; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT3+(i*0x15)][LCR_THRESH] = 1.71; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT4+(i*0x15)][UCR_THRESH] = 1.155; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT4+(i*0x15)][LCR_THRESH] = 1.045; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT5+(i*0x15)][UCR_THRESH] = 0.84; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT5+(i*0x15)][LCR_THRESH] = 0.76; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT6+(i*0x15)][UCR_THRESH] = 0.84; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT6+(i*0x15)][LCR_THRESH] = 0.61; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT7+(i*0x15)][UCR_THRESH] = 0.84; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT7+(i*0x15)][LCR_THRESH] = 0.61; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT8+(i*0x15)][UCR_THRESH] = 0.84; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT8+(i*0x15)][LCR_THRESH] = 0.61; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT9+(i*0x15)][UCR_THRESH] = 0.84; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT9+(i*0x15)][LCR_THRESH] = 0.61; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT10+(i*0x15)][UCR_THRESH] = 3.465; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT10+(i*0x15)][LCR_THRESH] = 3.135; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT11+(i*0x15)][UCR_THRESH] = 2.625; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT11+(i*0x15)][LCR_THRESH] = 2.375; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT12+(i*0x15)][UCR_THRESH] = 1.89; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT12+(i*0x15)][LCR_THRESH] = 1.71; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT13+(i*0x15)][UCR_THRESH] = 100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT13+(i*0x15)][LCR_THRESH] = -100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT14+(i*0x15)][UCR_THRESH] = 100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT14+(i*0x15)][LCR_THRESH] = -100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT15+(i*0x15)][UCR_THRESH] = 100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT15+(i*0x15)][LCR_THRESH] = -100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT16+(i*0x15)][UCR_THRESH] = 100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT16+(i*0x15)][LCR_THRESH] = -100; } else if (type == PIM_TYPE_4DD) { pim_sensor_threshold[PIM1_SENSOR_QSFP_TEMP+i][UCR_THRESH] = 58; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT1+(i*0x15)][UCR_THRESH] = 0.82; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT1+(i*0x15)][LCR_THRESH] = 0.56; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT2+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT2+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT3+(i*0x15)][UCR_THRESH] = 1.944; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT3+(i*0x15)][LCR_THRESH] = 1.656; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT4+(i*0x15)][UCR_THRESH] = 100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT4+(i*0x15)][LCR_THRESH] = -100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT5+(i*0x15)][UCR_THRESH] = 0.82; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT5+(i*0x15)][LCR_THRESH] = 0.56; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT6+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT6+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT7+(i*0x15)][UCR_THRESH] = 1.944; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT7+(i*0x15)][LCR_THRESH] = 1.656; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT8+(i*0x15)][UCR_THRESH] = 100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT8+(i*0x15)][LCR_THRESH] = -100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT9+(i*0x15)][UCR_THRESH] = 0.82; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT9+(i*0x15)][LCR_THRESH] = 0.56; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT10+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT10+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT11+(i*0x15)][UCR_THRESH] = 1.944; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT11+(i*0x15)][LCR_THRESH] = 1.656; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT12+(i*0x15)][UCR_THRESH] = 100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT12+(i*0x15)][LCR_THRESH] = -100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT13+(i*0x15)][UCR_THRESH] = 0.82; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT13+(i*0x15)][LCR_THRESH] = 0.56; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT14+(i*0x15)][UCR_THRESH] = 0.864; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT14+(i*0x15)][LCR_THRESH] = 0.75; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT15+(i*0x15)][UCR_THRESH] = 1.944; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT15+(i*0x15)][LCR_THRESH] = 1.656; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT16+(i*0x15)][UCR_THRESH] = 100; pim_sensor_threshold[PIM1_SENSOR_34461_VOLT16+(i*0x15)][LCR_THRESH] = -100; } break; } } int pal_set_pim_thresh(uint8_t fru) { uint8_t snr_num; pim_thresh_array_init(fru); switch(fru) { case FRU_PIM1: for (snr_num = PIM1_SENSOR_TEMP1; snr_num <= PIM1_SENSOR_34461_VOLT16; snr_num++) { pal_sensor_thresh_modify(fru, snr_num, UCR_THRESH, pim_sensor_threshold[snr_num][UCR_THRESH]); pal_sensor_thresh_modify(fru, snr_num, LCR_THRESH, pim_sensor_threshold[snr_num][LCR_THRESH]); } break; case FRU_PIM2: for (snr_num = PIM2_SENSOR_TEMP1; snr_num <= PIM2_SENSOR_34461_VOLT16; snr_num++) { pal_sensor_thresh_modify(fru, snr_num, UCR_THRESH, pim_sensor_threshold[snr_num][UCR_THRESH]); pal_sensor_thresh_modify(fru, snr_num, LCR_THRESH, pim_sensor_threshold[snr_num][LCR_THRESH]); } break; case FRU_PIM3: for (snr_num = PIM3_SENSOR_TEMP1; snr_num <= PIM3_SENSOR_34461_VOLT16; snr_num++) { pal_sensor_thresh_modify(fru, snr_num, UCR_THRESH, pim_sensor_threshold[snr_num][UCR_THRESH]); pal_sensor_thresh_modify(fru, snr_num, LCR_THRESH, pim_sensor_threshold[snr_num][LCR_THRESH]); } break; case FRU_PIM4: for (snr_num = PIM4_SENSOR_TEMP1; snr_num <= PIM4_SENSOR_34461_VOLT16; snr_num++) { pal_sensor_thresh_modify(fru, snr_num, UCR_THRESH, pim_sensor_threshold[snr_num][UCR_THRESH]); pal_sensor_thresh_modify(fru, snr_num, LCR_THRESH, pim_sensor_threshold[snr_num][LCR_THRESH]); } break; case FRU_PIM5: for (snr_num = PIM5_SENSOR_TEMP1; snr_num <= PIM5_SENSOR_34461_VOLT16; snr_num++) { pal_sensor_thresh_modify(fru, snr_num, UCR_THRESH, pim_sensor_threshold[snr_num][UCR_THRESH]); pal_sensor_thresh_modify(fru, snr_num, LCR_THRESH, pim_sensor_threshold[snr_num][LCR_THRESH]); } break; case FRU_PIM6: for (snr_num = PIM6_SENSOR_TEMP1; snr_num <= PIM6_SENSOR_34461_VOLT16; snr_num++) { pal_sensor_thresh_modify(fru, snr_num, UCR_THRESH, pim_sensor_threshold[snr_num][UCR_THRESH]); pal_sensor_thresh_modify(fru, snr_num, LCR_THRESH, pim_sensor_threshold[snr_num][LCR_THRESH]); } break; case FRU_PIM7: for (snr_num = PIM7_SENSOR_TEMP1; snr_num <= PIM7_SENSOR_34461_VOLT16; snr_num++) { pal_sensor_thresh_modify(fru, snr_num, UCR_THRESH, pim_sensor_threshold[snr_num][UCR_THRESH]); pal_sensor_thresh_modify(fru, snr_num, LCR_THRESH, pim_sensor_threshold[snr_num][LCR_THRESH]); } break; case FRU_PIM8: for (snr_num = PIM8_SENSOR_TEMP1; snr_num <= PIM8_SENSOR_34461_VOLT16; snr_num++) { pal_sensor_thresh_modify(fru, snr_num, UCR_THRESH, pim_sensor_threshold[snr_num][UCR_THRESH]); pal_sensor_thresh_modify(fru, snr_num, LCR_THRESH, pim_sensor_threshold[snr_num][LCR_THRESH]); } break; default: return -1; } return 0; } int pal_clear_thresh_value(uint8_t fru) { int ret; char fpath[64]; char cmd[128]; char fruname[16] = {0}; ret = pal_get_fru_name(fru, fruname); if (ret < 0) { printf("%s: Fail to get fru%d name\n",__func__,fru); return ret; } snprintf(fpath, sizeof(fpath), THRESHOLD_BIN, fruname); snprintf(cmd, sizeof(cmd), "rm -rf %s",fpath); RUN_SHELL_CMD(cmd); snprintf(fpath, sizeof(fpath), THRESHOLD_RE_FLAG, fruname); snprintf(cmd, sizeof(cmd), "touch %s",fpath); RUN_SHELL_CMD(cmd); return 0; } void pal_inform_bic_mode(uint8_t fru, uint8_t mode) { switch(mode) { case BIC_MODE_NORMAL: // Bridge IC entered normal mode // Inform BIOS that BMC is ready bic_set_gpio(fru, BMC_READY_N, 0); break; case BIC_MODE_UPDATE: // Bridge IC entered update mode // TODO: Might need to handle in future break; default: break; } } //For OEM command "CMD_OEM_GET_PLAT_INFO" 0x7e int pal_get_plat_sku_id(void){ return 0x06; // Minipack } //Use part of the function for OEM Command "CMD_OEM_GET_POSS_PCIE_CONFIG" 0xF4 int pal_get_poss_pcie_config(uint8_t slot, uint8_t *req_data, uint8_t req_len, uint8_t *res_data, uint8_t *res_len) { uint8_t completion_code = CC_SUCCESS; uint8_t pcie_conf = 0x02;//Minipack uint8_t *data = res_data; *data++ = pcie_conf; *res_len = data - res_data; return completion_code; } static int pal_key_check(char *key) { int i; i = 0; while(strcmp(key_list[i], LAST_KEY)) { // If Key is valid, return success if (!strcmp(key, key_list[i])) return 0; i++; } #ifdef DEBUG syslog(LOG_WARNING, "pal_key_check: invalid key - %s", key); #endif return -1; } int pal_get_key_value(char *key, char *value) { int ret; // Check is key is defined and valid if (pal_key_check(key)) return -1; ret = kv_get(key, value, NULL, KV_FPERSIST); return ret; } int pal_set_key_value(char *key, char *value) { // Check is key is defined and valid if (pal_key_check(key)) return -1; return kv_set(key, value, 0, KV_FPERSIST); } int pal_set_sysfw_ver(uint8_t slot, uint8_t *ver) { int i; char key[MAX_KEY_LEN]; char str[MAX_VALUE_LEN] = {0}; char tstr[10]; sprintf(key, "%s", "sysfw_ver_server"); for (i = 0; i < SIZE_SYSFW_VER; i++) { sprintf(tstr, "%02x", ver[i]); strcat(str, tstr); } return pal_set_key_value(key, str); } int pal_get_sysfw_ver(uint8_t slot, uint8_t *ver) { int i; int j = 0; int ret; int msb, lsb; char key[MAX_KEY_LEN]; char str[MAX_VALUE_LEN] = {0}; char tstr[4]; sprintf(key, "%s", "sysfw_ver_server"); ret = pal_get_key_value(key, str); if (ret) { return ret; } for (i = 0; i < 2*SIZE_SYSFW_VER; i += 2) { sprintf(tstr, "%c\n", str[i]); msb = strtol(tstr, NULL, 16); sprintf(tstr, "%c\n", str[i+1]); lsb = strtol(tstr, NULL, 16); ver[j++] = (msb << 4) | lsb; } return 0; } int pal_get_fru_list(char *list) { strcpy(list, pal_fru_list); return 0; } int pal_get_fru_capability(uint8_t fru, unsigned int *caps) { int ret = 0; switch (fru) { case FRU_SMB: *caps = FRU_CAPABILITY_SENSOR_ALL | FRU_CAPABILITY_MANAGEMENT_CONTROLLER; break; case FRU_SCM: *caps = FRU_CAPABILITY_FRUID_ALL | FRU_CAPABILITY_SENSOR_ALL; break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: case FRU_PSU1: case FRU_PSU2: case FRU_PSU3: case FRU_PSU4: case FRU_FAN1: case FRU_FAN2: case FRU_FAN3: case FRU_FAN4: case FRU_FAN5: case FRU_FAN6: case FRU_FAN7: case FRU_FAN8: *caps = FRU_CAPABILITY_SENSOR_ALL; break; default: ret = -1; break; } return ret; } int pal_get_fru_id(char *str, uint8_t *fru) { if (!strcmp(str, "all")) { *fru = FRU_ALL; } else if (!strcmp(str, "smb") || !strcmp(str, "bmc")) { *fru = FRU_SMB; } else if (!strcmp(str, "scm")) { *fru = FRU_SCM; } else if (!strcmp(str, "pim1")) { *fru = FRU_PIM1; } else if (!strcmp(str, "pim2")) { *fru = FRU_PIM2; } else if (!strcmp(str, "pim3")) { *fru = FRU_PIM3; } else if (!strcmp(str, "pim4")) { *fru = FRU_PIM4; } else if (!strcmp(str, "pim5")) { *fru = FRU_PIM5; } else if (!strcmp(str, "pim6")) { *fru = FRU_PIM6; } else if (!strcmp(str, "pim7")) { *fru = FRU_PIM7; } else if (!strcmp(str, "pim8")) { *fru = FRU_PIM8; } else if (!strcmp(str, "psu1")) { *fru = FRU_PSU1; } else if (!strcmp(str, "psu2")) { *fru = FRU_PSU2; } else if (!strcmp(str, "psu3")) { *fru = FRU_PSU3; } else if (!strcmp(str, "psu4")) { *fru = FRU_PSU4; } else if (!strcmp(str, "fan1")) { *fru = FRU_FAN1; } else if (!strcmp(str, "fan2")) { *fru = FRU_FAN2; } else if (!strcmp(str, "fan3")) { *fru = FRU_FAN3; } else if (!strcmp(str, "fan4")) { *fru = FRU_FAN4; } else if (!strcmp(str, "fan5")) { *fru = FRU_FAN5; } else if (!strcmp(str, "fan6")) { *fru = FRU_FAN6; } else if (!strcmp(str, "fan7")) { *fru = FRU_FAN7; } else if (!strcmp(str, "fan8")) { *fru = FRU_FAN8; } else { syslog(LOG_WARNING, "pal_get_fru_id: Wrong fru#%s", str); return -1; } return 0; } int pal_get_fru_name(uint8_t fru, char *name) { switch(fru) { case FRU_SMB: strcpy(name, "smb"); break; case FRU_SCM: strcpy(name, "scm"); break; case FRU_PIM1: strcpy(name, "pim1"); break; case FRU_PIM2: strcpy(name, "pim2"); break; case FRU_PIM3: strcpy(name, "pim3"); break; case FRU_PIM4: strcpy(name, "pim4"); break; case FRU_PIM5: strcpy(name, "pim5"); break; case FRU_PIM6: strcpy(name, "pim6"); break; case FRU_PIM7: strcpy(name, "pim7"); break; case FRU_PIM8: strcpy(name, "pim8"); break; case FRU_PSU1: strcpy(name, "psu1"); break; case FRU_PSU2: strcpy(name, "psu2"); break; case FRU_PSU3: strcpy(name, "psu3"); break; case FRU_PSU4: strcpy(name, "psu4"); break; case FRU_FAN1: strcpy(name, "fan1"); break; case FRU_FAN2: strcpy(name, "fan2"); break; case FRU_FAN3: strcpy(name, "fan3"); break; case FRU_FAN4: strcpy(name, "fan4"); break; case FRU_FAN5: strcpy(name, "fan5"); break; case FRU_FAN6: strcpy(name, "fan6"); break; case FRU_FAN7: strcpy(name, "fan7"); break; case FRU_FAN8: strcpy(name, "fan8"); break; default: if (fru > MAX_NUM_FRUS) return -1; sprintf(name, "fru%d", fru); break; } return 0; } // Platform Abstraction Layer (PAL) Functions int pal_get_platform_name(char *name) { strcpy(name, PLATFORM_NAME); return 0; } int pal_is_fru_prsnt(uint8_t fru, uint8_t *status) { int val; char tmp[LARGEST_DEVICE_NAME]; char path[LARGEST_DEVICE_NAME + 1]; *status = 0; switch (fru) { case FRU_SMB: *status = 1; return 0; case FRU_SCM: snprintf(path, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, SCM_PRSNT_STATUS); break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: snprintf(tmp, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, PIM_PRSNT_STATUS); snprintf(path, LARGEST_DEVICE_NAME, tmp, fru - 2); break; case FRU_PSU1: snprintf(tmp, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, PSU_L_PRSNT_STATUS); snprintf(path, LARGEST_DEVICE_NAME, tmp, 2); break; case FRU_PSU2: snprintf(tmp, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, PSU_L_PRSNT_STATUS); snprintf(path, LARGEST_DEVICE_NAME, tmp, 1); break; case FRU_PSU3: snprintf(tmp, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, PSU_R_PRSNT_STATUS); snprintf(path, LARGEST_DEVICE_NAME, tmp, 2); break; case FRU_PSU4: snprintf(tmp, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, PSU_R_PRSNT_STATUS); snprintf(path, LARGEST_DEVICE_NAME, tmp, 1); break; case FRU_FAN1: case FRU_FAN3: case FRU_FAN5: case FRU_FAN7: snprintf(tmp, LARGEST_DEVICE_NAME, TOP_FCMCPLD_PATH_FMT, FAN_PRSNT_STATUS); snprintf(path, LARGEST_DEVICE_NAME, tmp, ((fru - 14) / 2) + 1); break; case FRU_FAN2: case FRU_FAN4: case FRU_FAN6: case FRU_FAN8: snprintf(tmp, LARGEST_DEVICE_NAME, BOTTOM_FCMCPLD_PATH_FMT, FAN_PRSNT_STATUS); snprintf(path, LARGEST_DEVICE_NAME, tmp, (fru - 14) / 2); break; default: return -1; } if (read_device(path, &val)) { return -1; } if (val == 0x0) { *status = 1; } else { *status = 0; } return 0; } int pal_is_fru_ready(uint8_t fru, uint8_t *status) { *status = 1; return 0; } int pal_get_fru_sensor_list(uint8_t fru, uint8_t **sensor_list, int *cnt) { switch(fru) { case FRU_SCM: *sensor_list = (uint8_t *) scm_all_sensor_list; *cnt = scm_all_sensor_cnt; break; case FRU_SMB: *sensor_list = (uint8_t *) smb_sensor_list; *cnt = smb_sensor_cnt; break; case FRU_PIM1: *sensor_list = (uint8_t *) pim1_sensor_list; *cnt = pim1_sensor_cnt; break; case FRU_PIM2: *sensor_list = (uint8_t *) pim2_sensor_list; *cnt = pim2_sensor_cnt; break; case FRU_PIM3: *sensor_list = (uint8_t *) pim3_sensor_list; *cnt = pim3_sensor_cnt; break; case FRU_PIM4: *sensor_list = (uint8_t *) pim4_sensor_list; *cnt = pim4_sensor_cnt; break; case FRU_PIM5: *sensor_list = (uint8_t *) pim5_sensor_list; *cnt = pim5_sensor_cnt; break; case FRU_PIM6: *sensor_list = (uint8_t *) pim6_sensor_list; *cnt = pim6_sensor_cnt; break; case FRU_PIM7: *sensor_list = (uint8_t *) pim7_sensor_list; *cnt = pim7_sensor_cnt; break; case FRU_PIM8: *sensor_list = (uint8_t *) pim8_sensor_list; *cnt = pim8_sensor_cnt; break; case FRU_PSU1: *sensor_list = (uint8_t *) psu1_sensor_list; *cnt = psu1_sensor_cnt; break; case FRU_PSU2: *sensor_list = (uint8_t *) psu2_sensor_list; *cnt = psu2_sensor_cnt; break; case FRU_PSU3: *sensor_list = (uint8_t *) psu3_sensor_list; *cnt = psu3_sensor_cnt; break; case FRU_PSU4: *sensor_list = (uint8_t *) psu4_sensor_list; *cnt = psu4_sensor_cnt; break; default: if (fru > MAX_NUM_FRUS) return -1; // Nothing to read yet. *sensor_list = NULL; *cnt = 0; } return 0; } void pal_update_ts_sled(void) { char key[MAX_KEY_LEN]; char tstr[MAX_VALUE_LEN] = {0}; struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); sprintf(tstr, "%ld", ts.tv_sec); sprintf(key, "timestamp_sled"); pal_set_key_value(key, tstr); } int pal_get_fru_discrete_list(uint8_t fru, uint8_t **sensor_list, int *cnt) { switch(fru) { case FRU_SCM: *sensor_list = (uint8_t *) bic_discrete_list; *cnt = bic_discrete_cnt; break; default: if (fru > MAX_NUM_FRUS) return -1; // Nothing to read yet. *sensor_list = NULL; *cnt = 0; } return 0; } static void _print_sensor_discrete_log(uint8_t fru, uint8_t snr_num, char *snr_name, uint8_t val, char *event) { if (val) { syslog(LOG_CRIT, "ASSERT: %s discrete - raised - FRU: %d, num: 0x%X," " snr: %-16s val: %d", event, fru, snr_num, snr_name, val); } else { syslog(LOG_CRIT, "DEASSERT: %s discrete - settled - FRU: %d, num: 0x%X," " snr: %-16s val: %d", event, fru, snr_num, snr_name, val); } pal_update_ts_sled(); } int pal_sensor_discrete_check(uint8_t fru, uint8_t snr_num, char *snr_name, uint8_t o_val, uint8_t n_val) { char name[32], crisel[128]; bool valid = false; uint8_t diff = o_val ^ n_val; if (GETBIT(diff, 0)) { if (fru == FRU_SCM) { switch(snr_num) { case BIC_SENSOR_SYSTEM_STATUS: snprintf(name, sizeof(name), "SOC_Thermal_Trip"); valid = true; snprintf(crisel, sizeof(crisel), "%s - %s,FRU:%u", name, GETBIT(n_val, 0)?"ASSERT":"DEASSERT", fru); pal_add_cri_sel(crisel); break; case BIC_SENSOR_VR_HOT: snprintf(name, sizeof(name), "SOC_VR_Hot"); valid = true; break; } if (valid) { _print_sensor_discrete_log(fru, snr_num, snr_name, GETBIT(n_val, 0), name); valid = false; } } } if (GETBIT(diff, 1)) { if (fru == FRU_SCM) { switch(snr_num) { case BIC_SENSOR_SYSTEM_STATUS: snprintf(name, sizeof(name), "SOC_FIVR_Fault"); valid = true; break; case BIC_SENSOR_VR_HOT: snprintf(name, sizeof(name), "SOC_DIMM_AB_VR_Hot"); valid = true; break; case BIC_SENSOR_CPU_DIMM_HOT: snprintf(name, sizeof(name), "SOC_MEMHOT"); valid = true; break; } if (valid) { _print_sensor_discrete_log(fru, snr_num, snr_name, GETBIT(n_val, 1), name); valid = false; } } } if (GETBIT(diff, 2)) { if (fru == FRU_SCM) { switch(snr_num) { case BIC_SENSOR_SYSTEM_STATUS: snprintf(name, sizeof(name), "SYS_Throttle"); valid = true; break; case BIC_SENSOR_VR_HOT: snprintf(name, sizeof(name), "SOC_DIMM_DE_VR_Hot"); valid = true; break; } if (valid) { _print_sensor_discrete_log(fru, snr_num, snr_name, GETBIT(n_val, 2), name); valid = false; } } } if (GETBIT(diff, 4)) { if (fru == FRU_SCM) { if (snr_num == BIC_SENSOR_PROC_FAIL) { _print_sensor_discrete_log(fru, snr_num, snr_name, GETBIT(n_val, 4), "FRB3"); } } } return 0; } int pal_is_debug_card_prsnt(uint8_t *status) { int val; char path[LARGEST_DEVICE_NAME + 1]; snprintf(path, LARGEST_DEVICE_NAME, GPIO_SCM_USB_PRSNT, "value"); if (read_device(path, &val)) { return -1; } if (val) { *status = 1; } else { *status = 0; } return 0; } // Enable POST buffer for the server in given slot int pal_post_enable(uint8_t slot) { int ret; bic_config_t config = {0}; bic_config_u *t = (bic_config_u *) &config; ret = bic_get_config(IPMB_BUS, &config); if (ret) { #ifdef DEBUG syslog(LOG_WARNING, "post_enable: bic_get_config failed for fru: %d\n", slot); #endif return ret; } if (0 == t->bits.post) { t->bits.post = 1; ret = bic_set_config(IPMB_BUS, &config); if (ret) { #ifdef DEBUG syslog(LOG_WARNING, "post_enable: bic_set_config failed\n"); #endif return ret; } } return 0; } // Disable POST buffer for the server in given slot int pal_post_disable(uint8_t slot) { int ret; bic_config_t config = {0}; bic_config_u *t = (bic_config_u *) &config; ret = bic_get_config(IPMB_BUS, &config); if (ret) { return ret; } t->bits.post = 0; ret = bic_set_config(IPMB_BUS, &config); if (ret) { return ret; } return 0; } // Get the last post code of the given slot int pal_post_get_last(uint8_t slot, uint8_t *status) { int ret; uint8_t buf[MAX_IPMB_RES_LEN] = {0x0}; uint8_t len; ret = bic_get_post_buf(IPMB_BUS, buf, &len); if (ret) { return ret; } *status = buf[0]; return 0; } // Display the given POST code using GPIO port static int pal_post_display(uint8_t status) { char path[LARGEST_DEVICE_NAME + 1]; int ret; char *val; #ifdef DEBUG syslog(LOG_WARNING, "pal_post_display: status is %d\n", status); #endif snprintf(path, LARGEST_DEVICE_NAME, GPIO_POSTCODE_0, "value"); if (BIT(status, 0)) { val = "1"; } else { val = "0"; } ret = write_device(path, val); if (ret) { goto post_exit; } snprintf(path, LARGEST_DEVICE_NAME, GPIO_POSTCODE_1, "value"); if (BIT(status, 1)) { val = "1"; } else { val = "0"; } ret = write_device(path, val); if (ret) { goto post_exit; } snprintf(path, LARGEST_DEVICE_NAME, GPIO_POSTCODE_2, "value"); if (BIT(status, 2)) { val = "1"; } else { val = "0"; } ret = write_device(path, val); if (ret) { goto post_exit; } snprintf(path, LARGEST_DEVICE_NAME, GPIO_POSTCODE_3, "value"); if (BIT(status, 3)) { val = "1"; } else { val = "0"; } ret = write_device(path, val); if (ret) { goto post_exit; } snprintf(path, LARGEST_DEVICE_NAME, GPIO_POSTCODE_4, "value"); if (BIT(status, 4)) { val = "1"; } else { val = "0"; } ret = write_device(path, val); if (ret) { goto post_exit; } snprintf(path, LARGEST_DEVICE_NAME, GPIO_POSTCODE_5, "value"); if (BIT(status, 5)) { val = "1"; } else { val = "0"; } ret = write_device(path, val); if (ret) { goto post_exit; } snprintf(path, LARGEST_DEVICE_NAME, GPIO_POSTCODE_6, "value"); if (BIT(status, 6)) { val = "1"; } else { val = "0"; } ret = write_device(path, val); if (ret) { goto post_exit; } snprintf(path, LARGEST_DEVICE_NAME, GPIO_POSTCODE_7, "value"); if (BIT(status, 7)) { val = "1"; } else { val = "0"; } ret = write_device(path, val); if (ret) { goto post_exit; } post_exit: if (ret) { #ifdef DEBUG syslog(LOG_WARNING, "write_device failed for %s\n", path); #endif return -1; } else { return 0; } } // Handle the received post code, for now display it on debug card int pal_post_handle(uint8_t slot, uint8_t status) { uint8_t prsnt, pos; int ret; // Check for debug card presence ret = pal_is_debug_card_prsnt(&prsnt); if (ret) { return ret; } // No debug card present, return if (!prsnt) { return 0; } // Get the hand switch position ret = pal_get_hand_sw(&pos); if (ret) { return ret; } /* If the give server is not selected, return */ if (pos != HAND_SW_SERVER) { return 0; } /* Enable POST codes for SCM slot */ ret = pal_post_enable(slot); if (ret) { return ret; } // Display the post code in the debug card ret = pal_post_display(status); if (ret) { return ret; } return 0; } // Return the Front panel Power Button int pal_get_board_rev(int *rev) { char path[LARGEST_DEVICE_NAME + 1]; int val_id_0, val_id_1, val_id_2; snprintf(path, LARGEST_DEVICE_NAME, GPIO_SMB_REV_ID_0, "value"); if (read_device(path, &val_id_0)) { return -1; } snprintf(path, LARGEST_DEVICE_NAME, GPIO_SMB_REV_ID_1, "value"); if (read_device(path, &val_id_1)) { return -1; } snprintf(path, LARGEST_DEVICE_NAME, GPIO_SMB_REV_ID_2, "value"); if (read_device(path, &val_id_2)) { return -1; } *rev = val_id_0 | (val_id_1 << 1) | (val_id_2 << 2); syslog(LOG_ERR, "Board rev: %d\n", *rev); return 0; } int pal_get_cpld_board_rev(int *rev, const char *device) { char full_name[LARGEST_DEVICE_NAME + 1]; snprintf(full_name, LARGEST_DEVICE_NAME, device, "board_ver"); if (read_device(full_name, rev)) { return -1; } return 0; } int pal_get_cpld_fpga_fw_ver(uint8_t fru, const char *device, uint8_t* ver) { int val = -1, bus = 0; char ver_path[PATH_MAX]; char sub_ver_path[PATH_MAX]; switch(fru) { case FRU_SCM: if (!(strncmp(device, "scmcpld", strlen("scmcpld")))) { snprintf(ver_path, sizeof(ver_path), SCMCPLD_PATH_FMT, "cpld_ver"); snprintf(sub_ver_path, sizeof(sub_ver_path), SCMCPLD_PATH_FMT, "cpld_sub_ver"); } else { return -1; } break; case FRU_SMB: if (!(strncmp(device, "left_pdbcpld", strlen("left_pdbcpld")))) { snprintf(ver_path, sizeof(ver_path), LEFT_PDBCPLD_PATH_FMT, "cpld_ver"); snprintf(sub_ver_path, sizeof(sub_ver_path), LEFT_PDBCPLD_PATH_FMT, "cpld_sub_ver"); } else if (!(strncmp(device, "right_pdbcpld", strlen("right_pdbcpld")))) { snprintf(ver_path, sizeof(ver_path), RIGHT_PDBCPLD_PATH_FMT, "cpld_ver"); snprintf(sub_ver_path, sizeof(sub_ver_path), RIGHT_PDBCPLD_PATH_FMT, "cpld_sub_ver"); } else if (!(strncmp(device, "top_fcmcpld", strlen("top_fcmcpld")))) { snprintf(ver_path, sizeof(ver_path), TOP_FCMCPLD_PATH_FMT, "cpld_ver"); snprintf(sub_ver_path, sizeof(sub_ver_path), TOP_FCMCPLD_PATH_FMT, "cpld_sub_ver"); } else if (!(strncmp(device, "bottom_fcmcpld", strlen("bottom_fcmcpld")))) { snprintf(ver_path, sizeof(ver_path), BOTTOM_FCMCPLD_PATH_FMT, "cpld_ver"); snprintf(sub_ver_path, sizeof(sub_ver_path), BOTTOM_FCMCPLD_PATH_FMT, "cpld_sub_ver"); } else if (!(strncmp(device, "smbcpld", strlen("smbcpld")))) { snprintf(ver_path, sizeof(ver_path), SMBCPLD_PATH_FMT, "cpld_ver"); snprintf(sub_ver_path, sizeof(sub_ver_path), SMBCPLD_PATH_FMT, "cpld_sub_ver"); } else if (!(strncmp(device, "iobfpga", strlen("iobfpga")))) { snprintf(ver_path, sizeof(ver_path), IOBFPGA_PATH_FMT, "fpga_ver"); snprintf(sub_ver_path, sizeof(sub_ver_path), IOBFPGA_PATH_FMT, "fpga_sub_ver"); } else { return -1; } break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: bus = ((fru - FRU_PIM1) * 8) + 80; if (!(strncmp(device, "domfpga", strlen("domfpga")))) { snprintf(ver_path, sizeof(ver_path), I2C_SYSFS_DEVICES"/%d-0060/fpga_ver", bus); snprintf(sub_ver_path, sizeof(sub_ver_path), I2C_SYSFS_DEVICES"/%d-0060/fpga_sub_ver", bus); } else { return -1; } break; default: return -1; } if (!read_device(ver_path, &val)) { ver[0] = (uint8_t)val; } else { return -1; } if (!read_device(sub_ver_path, &val)) { ver[1] = (uint8_t)val; } else { return -1; } return 0; } int pal_set_last_pwr_state(uint8_t fru, char *state) { int ret; char key[MAX_KEY_LEN]; sprintf(key, "%s", "pwr_server_last_state"); ret = pal_set_key_value(key, state); if (ret < 0) { #ifdef DEBUG syslog(LOG_WARNING, "pal_set_last_pwr_state: pal_set_key_value failed for " "fru %u", fru); #endif } return ret; } int pal_get_last_pwr_state(uint8_t fru, char *state) { int ret; char key[MAX_KEY_LEN]; sprintf(key, "%s", "pwr_server_last_state"); ret = pal_get_key_value(key, state); if (ret < 0) { #ifdef DEBUG syslog(LOG_WARNING, "pal_get_last_pwr_state: pal_get_key_value failed for " "fru %u", fru); #endif } return ret; } int pal_set_com_pwr_btn_n(char *status) { int ret; ret = write_device(SCM_COM_PWR_BTN, status); if (ret) { #ifdef DEBUG syslog(LOG_WARNING, "write_device failed for %s\n", SCM_COM_PWR_BTN); #endif return -1; } return 0; } int pal_get_com_pwr_btn_n(void) { int ret; int val; ret = read_device(SCM_COM_PWR_BTN, &val); if (ret) { #ifdef DEBUG syslog(LOG_WARNING, "read_device failed for %s\n", SCM_COM_PWR_BTN); #endif return -1; } return val; } static bool is_server_on(void) { int ret; uint8_t status; ret = pal_get_server_power(FRU_SCM, &status); if (ret || status != SERVER_POWER_ON) { return false; } return true; } // Power On the server static int server_power_on(void) { int ret, val; ret = read_device(SCM_COM_PWR_ENBLE, &val); if (ret || val) { if (pal_set_com_pwr_btn_n("1")) { return -1; } sleep(1); if (pal_get_com_pwr_btn_n() != 1){ syslog(LOG_WARNING, "%s: Failed to write to com_pwr_btn_n", __func__); return -1; } if (pal_set_com_pwr_btn_n("0")) { return -1; } sleep(1); if (pal_get_com_pwr_btn_n() != 0){ syslog(LOG_WARNING, "%s: Failed to write to com_pwr_btn_n", __func__); return -1; } if (pal_set_com_pwr_btn_n("1")) { return -1; } /* Wait for server power good ready */ sleep(1); if (pal_get_com_pwr_btn_n() != 1){ syslog(LOG_WARNING, "%s: Failed to write to com_pwr_btn_n", __func__); return -1; } if (!is_server_on()) { return -1; } } else { ret = write_device(SCM_COM_PWR_ENBLE, "1"); if (ret) { syslog(LOG_WARNING, "%s: Power on is failed", __func__); return -1; } } return 0; } // Power Off the server in given slot static int server_power_off(bool gs_flag) { int ret; if (gs_flag) { ret = pal_set_com_pwr_btn_n("0"); if (ret) { return -1; } sleep(DELAY_GRACEFUL_SHUTDOWN); if (pal_get_com_pwr_btn_n() != 0){ syslog(LOG_WARNING, "%s: Failed to write to com_pwr_btn_n", __func__); return -1; } ret = pal_set_com_pwr_btn_n("1"); if (ret) { return -1; } sleep(1); if (pal_get_com_pwr_btn_n() != 1){ syslog(LOG_WARNING, "%s: Failed to write to com_pwr_btn_n", __func__); return -1; } } else { ret = write_device(SCM_COM_PWR_ENBLE, "0"); if (ret) { syslog(LOG_WARNING, "%s: Power off is failed",__func__); return -1; } } return 0; } int pal_get_server_power(uint8_t slot_id, uint8_t *status) { int ret; char value[MAX_VALUE_LEN]; bic_gpio_t gpio; uint8_t retry = MAX_READ_RETRY; /* check if the CPU is turned on or not */ while (retry) { ret = bic_get_gpio(IPMB_BUS, &gpio); if (!ret) break; msleep(50); retry--; } if (ret) { // Check for if the BIC is irresponsive due to 12V_OFF or 12V_CYCLE syslog(LOG_INFO, "pal_get_server_power: bic_get_gpio returned error hence" " reading the kv_store for last power state for fru %d", slot_id); pal_get_last_pwr_state(slot_id, value); if (!(strncmp(value, "off", strlen("off")))) { *status = SERVER_POWER_OFF; } else if (!(strncmp(value, "on", strlen("on")))) { *status = SERVER_POWER_ON; } else { return ret; } return 0; } if (gpio.pwrgood_cpu) { *status = SERVER_POWER_ON; } else { *status = SERVER_POWER_OFF; } return 0; } // Power Off, Power On, or Power Reset the server in given slot int pal_set_server_power(uint8_t slot_id, uint8_t cmd) { int ret; uint8_t status; bool gs_flag = false; if (pal_get_server_power(slot_id, &status) < 0) { return -1; } switch(cmd) { case SERVER_POWER_ON: if (status == SERVER_POWER_ON) return 1; else return server_power_on(); break; case SERVER_POWER_OFF: if (status == SERVER_POWER_OFF) return 1; else return server_power_off(gs_flag); break; case SERVER_POWER_CYCLE: if (status == SERVER_POWER_ON) { if (server_power_off(gs_flag)) return -1; sleep(DELAY_POWER_CYCLE); return server_power_on(); } else if (status == SERVER_POWER_OFF) { return (server_power_on()); } break; case SERVER_POWER_RESET: if (status == SERVER_POWER_ON) { ret = pal_set_rst_btn(slot_id, 0); if (ret < 0) { syslog(LOG_CRIT, "Micro-server can't power reset"); return ret; } msleep(100); //some server miss to detect a quick pulse, so delay 100ms between low high ret = pal_set_rst_btn(slot_id, 1); if (ret < 0) { syslog(LOG_CRIT, "Micro-server in reset state, " "can't go back to normal state"); return ret; } } else if (status == SERVER_POWER_OFF) { syslog(LOG_CRIT, "Micro-server power status is off, " "ignore power reset action"); return -2; } break; case SERVER_GRACEFUL_SHUTDOWN: if (status == SERVER_POWER_OFF) { return 1; } else { gs_flag = true; return server_power_off(gs_flag); } break; default: return -1; } return 0; } static int get_current_dir(const char *device, char *dir_name) { char cmd[LARGEST_DEVICE_NAME + 1]; FILE *fp; int size; // Get current working directory snprintf(cmd, sizeof(cmd), "cd %s;pwd", device); fp = popen(cmd, "r"); if(NULL == fp) return -1; if (fgets(dir_name, LARGEST_DEVICE_NAME, fp) == NULL) { pclose(fp); return -1; } if (pclose(fp) == -1) OBMC_ERROR(errno, "pclose(%s) failed", cmd); // Remove the newline character at the end size = strlen(dir_name); if (size > 0 && isspace(dir_name[size - 1])) dir_name[size - 1] = '\0'; return 0; } static int check_and_read_sensor_value(uint8_t fru, uint8_t snr_num, const char *device, const char *attr, int *value) { char dir_name[LARGEST_DEVICE_NAME + 1]; if (snr_path[fru][snr_num].name != NULL) { if (!read_device(snr_path[fru][snr_num].name, value)) return 0; } if (strstr(device, "hwmon*") != NULL) { /* Get current working directory */ if (get_current_dir(device, dir_name)) { return -1; } snprintf(snr_path[fru][snr_num].name, sizeof(snr_path[fru][snr_num].name), "%s/%s", dir_name, attr); } else { snprintf(snr_path[fru][snr_num].name, sizeof(snr_path[fru][snr_num].name), "%s/%s", device, attr); } if (read_device(snr_path[fru][snr_num].name, value)) { return -1; } return 0; } static int read_attr(uint8_t fru, uint8_t snr_num, const char *device, const char *attr, float *value) { int tmp; if (check_and_read_sensor_value(fru, snr_num, device, attr, &tmp)) return -1; *value = ((float)tmp)/UNIT_DIV; return 0; } /* * Determine extra divisor of hotswap power output * - kernel 4.1.x: * pmbus_core.c use milliwatt for direct format power output, * thus we keep hsc_power_div equal to 1. * - Higher kernel versions: * pmbus_core.c use microwatt for direct format power output, * thus we need to set hsc_power_div equal to 1000. */ static int hsc_power_div_init(void) { k_version_t kernel_ver; kernel_ver = get_kernel_version(); if (kernel_ver != 0) { if (kernel_ver < KERNEL_VERSION(4, 2, 0)) hsc_power_div = 1; else hsc_power_div = 1000; } else { return -1; } return 0; } static int read_hsc_attr(uint8_t fru, uint8_t snr_num, const char *device, const char* attr, float r_sense, float *value) { int tmp; if (check_and_read_sensor_value(fru, snr_num, device, attr, &tmp)) return -1; *value = ((float)tmp)/r_sense/UNIT_DIV; return 0; } static int read_hsc_volt(uint8_t fru, uint8_t snr_num, const char *device, float r_sense, float *value) { return read_hsc_attr(fru, snr_num, device, VOLT(1), r_sense, value); } static int read_hsc_curr(uint8_t fru, uint8_t snr_num, const char *device, float r_sense, float *value) { return read_hsc_attr(fru, snr_num, device, CURR(1), r_sense, value); } static int read_hsc_power(uint8_t fru, uint8_t snr_num, const char *device, float r_sense, float *value) { int ret = -1; static bool hsc_power_div_inited = false; if (!hsc_power_div_inited && !hsc_power_div_init()) { hsc_power_div_inited = true; } ret = read_hsc_attr(fru, snr_num, device, POWER(1), r_sense, value); if (!ret) *value = *value / hsc_power_div; return ret; } static int read_fan_rpm_f(const char *device, uint8_t fan, float *value) { char full_name[LARGEST_DEVICE_NAME + 1]; char device_name[11]; int tmp; snprintf(device_name, 11, "fan%d_input", fan); snprintf(full_name, sizeof(full_name), "%s/%s", device, device_name); if (read_device(full_name, &tmp)) { return -1; } *value = (float)tmp; return 0; } static int read_fan_rpm(const char *device, uint8_t fan, int *value) { char full_name[LARGEST_DEVICE_NAME + 1]; char device_name[11]; int tmp; snprintf(device_name, 11, "fan%d_input", fan); snprintf(full_name, sizeof(full_name), "%s/%s", device, device_name); if (read_device(full_name, &tmp)) { return -1; } *value = tmp; return 0; } int pal_get_fan_speed(uint8_t fan, int *rpm) { if (fan > 15) { syslog(LOG_INFO, "get_fan_speed: invalid fan#:%d", fan); return -1; } if (fan <= 7) { fan = fan + 1; return read_fan_rpm(SMB_FCM_T_TACH_DEVICE, (fan + 1), rpm); } else { return read_fan_rpm(SMB_FCM_B_TACH_DEVICE, (fan - 7), rpm); } } static int bic_sensor_sdr_path(uint8_t fru, char *path) { char fru_name[16]; switch(fru) { case FRU_SCM: sprintf(fru_name, "%s", "scm"); break; default: #ifdef DEBUG syslog(LOG_WARNING, "bic_sensor_sdr_path: Wrong Slot ID\n"); #endif return -1; } sprintf(path, MINIPACK_SDR_PATH, fru_name); if (access(path, F_OK) == -1) { return -1; } return 0; } /* Populates all sensor_info_t struct using the path to SDR dump */ static int sdr_init(char *path, sensor_info_t *sinfo) { int fd; int ret = 0; uint8_t buf[MAX_SDR_LEN] = {0}; uint8_t bytes_rd = 0; uint8_t snr_num = 0; sdr_full_t *sdr; while (access(path, F_OK) == -1) { sleep(5); } fd = open(path, O_RDONLY); if (fd < 0) { syslog(LOG_ERR, "%s: open failed for %s\n", __func__, path); return -1; } ret = pal_flock_retry(fd); if (ret == -1) { syslog(LOG_WARNING, "%s: failed to flock on %s", __func__, path); close(fd); return -1; } while ((bytes_rd = read(fd, buf, sizeof(sdr_full_t))) > 0) { if (bytes_rd != sizeof(sdr_full_t)) { syslog(LOG_ERR, "%s: read returns %d bytes\n", __func__, bytes_rd); pal_unflock_retry(fd); close(fd); return -1; } sdr = (sdr_full_t *) buf; snr_num = sdr->sensor_num; sinfo[snr_num].valid = true; memcpy(&sinfo[snr_num].sdr, sdr, sizeof(sdr_full_t)); } ret = pal_unflock_retry(fd); if (ret == -1) { syslog(LOG_WARNING, "%s: failed to unflock on %s", __func__, path); close(fd); return -1; } close(fd); return 0; } static int bic_sensor_sdr_init(uint8_t fru, sensor_info_t *sinfo) { char path[64]; int retry = 0; switch(fru) { case FRU_SCM: if (bic_sensor_sdr_path(fru, path) < 0) { #ifdef DEBUG syslog(LOG_WARNING, "bic_sensor_sdr_path: get_fru_sdr_path failed\n"); #endif return ERR_NOT_READY; } while (retry <= 3) { if (sdr_init(path, sinfo) < 0) { if (retry == 3) { //if the third retry still failed, return -1 #ifdef DEBUG syslog(LOG_ERR, "bic_sensor_sdr_init: sdr_init failed for FRU %d", fru); #endif return -1; } retry++; sleep(1); } else { break; } } break; } return 0; } static int bic_sdr_init(uint8_t fru) { static bool init_done[MAX_NUM_FRUS] = {false}; if (!init_done[fru - 1]) { sensor_info_t *sinfo = g_sinfo[fru-1]; if (bic_sensor_sdr_init(fru, sinfo) < 0) return ERR_NOT_READY; init_done[fru - 1] = true; } return 0; } /* Get the threshold values from the SDRs */ static int bic_get_sdr_thresh_val(uint8_t fru, uint8_t snr_num, uint8_t thresh, void *value) { int ret, retry = 0; int8_t b_exp, r_exp; uint8_t x, m_lsb, m_msb, b_lsb, b_msb, thresh_val; uint16_t m = 0, b = 0; sdr_full_t *sdr; char cvalue[MAX_VALUE_LEN] = {0}; ret = kv_get(SCM_INIT_THRESH_STATUS, cvalue, NULL, 0); if (!strncmp(cvalue, "done", sizeof("done"))) { ret = bic_sdr_init(fru); } else { while ((ret = bic_sdr_init(fru)) == ERR_NOT_READY && retry++ < MAX_SDR_THRESH_RETRY) { sleep(1); } } if (ret < 0) { syslog(LOG_CRIT, "BIC threshold value can't get"); return -1; } sdr = &g_sinfo[fru-1][snr_num].sdr; switch (thresh) { case UCR_THRESH: thresh_val = sdr->uc_thresh; break; case UNC_THRESH: thresh_val = sdr->unc_thresh; break; case UNR_THRESH: thresh_val = sdr->unr_thresh; break; case LCR_THRESH: thresh_val = sdr->lc_thresh; break; case LNC_THRESH: thresh_val = sdr->lnc_thresh; break; case LNR_THRESH: thresh_val = sdr->lnr_thresh; break; case POS_HYST: thresh_val = sdr->pos_hyst; break; case NEG_HYST: thresh_val = sdr->neg_hyst; break; default: #ifdef DEBUG syslog(LOG_ERR, "bic_get_sdr_thresh_val: reading unknown threshold val"); #endif return -1; } // y = (mx + b * 10^b_exp) * 10^r_exp x = thresh_val; m_lsb = sdr->m_val; m_msb = sdr->m_tolerance >> 6; m = (m_msb << 8) | m_lsb; b_lsb = sdr->b_val; b_msb = sdr->b_accuracy >> 6; b = (b_msb << 8) | b_lsb; // exponents are 2's complement 4-bit number b_exp = sdr->rb_exp & 0xF; if (b_exp > 7) { b_exp = (~b_exp + 1) & 0xF; b_exp = -b_exp; } r_exp = (sdr->rb_exp >> 4) & 0xF; if (r_exp > 7) { r_exp = (~r_exp + 1) & 0xF; r_exp = -r_exp; } * (float *) value = ((m * x) + (b * pow(10, b_exp))) * (pow(10, r_exp)); return 0; } static int bic_read_sensor_wrapper(uint8_t fru, uint8_t sensor_num, bool discrete, void *value) { int ret, i; ipmi_sensor_reading_t sensor; sdr_full_t *sdr; ret = bic_read_sensor(IPMB_BUS, sensor_num, &sensor); if (ret) { return ret; } if (sensor.flags & BIC_SENSOR_READ_NA) { #ifdef DEBUG syslog(LOG_ERR, "bic_read_sensor_wrapper: Reading Not Available"); syslog(LOG_ERR, "bic_read_sensor_wrapper: sensor_num: 0x%X, flag: 0x%X", sensor_num, sensor.flags); #endif return -1; } if (discrete) { *(float *) value = (float) sensor.status; return 0; } sdr = &g_sinfo[fru-1][sensor_num].sdr; // If the SDR is not type1, no need for conversion if (sdr->type !=1) { *(float *) value = sensor.value; return 0; } // y = (mx + b * 10^b_exp) * 10^r_exp uint8_t x; uint8_t m_lsb, m_msb; uint16_t m = 0; uint8_t b_lsb, b_msb; uint16_t b = 0; int8_t b_exp, r_exp; x = sensor.value; m_lsb = sdr->m_val; m_msb = sdr->m_tolerance >> 6; m = (m_msb << 8) | m_lsb; b_lsb = sdr->b_val; b_msb = sdr->b_accuracy >> 6; b = (b_msb << 8) | b_lsb; // exponents are 2's complement 4-bit number b_exp = sdr->rb_exp & 0xF; if (b_exp > 7) { b_exp = (~b_exp + 1) & 0xF; b_exp = -b_exp; } r_exp = (sdr->rb_exp >> 4) & 0xF; if (r_exp > 7) { r_exp = (~r_exp + 1) & 0xF; r_exp = -r_exp; } * (float *) value = ((m * x) + (b * pow(10, b_exp))) * (pow(10, r_exp)); if ((sensor_num == BIC_SENSOR_SOC_THERM_MARGIN) && (* (float *) value > 0)) { * (float *) value -= (float) THERMAL_CONSTANT; } if (*(float *) value > MAX_POS_READING_MARGIN) { //Negative reading handle for(i=0;i<sizeof(bic_neg_reading_sensor_support_list)/sizeof(uint8_t);i++) { if (sensor_num == bic_neg_reading_sensor_support_list[i]) { * (float *) value -= (float) THERMAL_CONSTANT; } } } return 0; } static int get_fan_speed(uint8_t snr_num, float *rpm) { int tmp; char device_name[LARGEST_DEVICE_NAME + 1]; if (snr_num >= SMB_SENSOR_FAN1_FRONT_TACH && snr_num <= SMB_SENSOR_FAN8_REAR_TACH) { snprintf(device_name, LARGEST_DEVICE_NAME, "/tmp/cache_store/smb_sensor%d", snr_num); if (read_device(device_name, &tmp)) { return -1; } *rpm = (float)tmp; } else { return -1; } return 0; } static void apply_inlet_correction(float *value) { float rpm[16] = {0}; float avg_rpm = 0; uint8_t i; uint8_t cnt = 0; static bool inited = false; /* Get RPM value */ for (i = SMB_SENSOR_FAN1_FRONT_TACH; i <= SMB_SENSOR_FAN8_REAR_TACH; i++) { if (get_fan_speed(i, &rpm[cnt]) == 0) { avg_rpm += rpm[cnt]; cnt++; } } if (cnt) { avg_rpm = avg_rpm / (float)cnt; if (!inited) { if (sensor_correction_init("/etc/sensor-correction-conf.json")) { syslog(LOG_ERR, "sensor_correction_init fail!"); } inited = true; } sensor_correction_apply(FRU_SCM, SCM_SENSOR_INLET_REMOTE_TEMP, avg_rpm, value); } } static void hsc_rsense_init(uint8_t hsc_id, const char* device) { static bool rsense_inited[MAX_NUM_FRUS] = {false}; if (!rsense_inited[hsc_id]) { int brd_rev = -1; /* * Config FCM Rsense value at different hardware version. * Kernel driver use Rsense equal to 1 milliohm. We need to correct Rsense * value, and all values are from hardware team. */ pal_get_cpld_board_rev(&brd_rev, device); switch (brd_rev) { case 0x7: case 0x2: /* R0A, R0B or R0C FCM */ hsc_rsense[hsc_id] = 0.33; break; case 0x4: case 0x5: /* R0D or R01 FCM */ if (hsc_id == HSC_FCM_T) hsc_rsense[hsc_id] = 0.377; else hsc_rsense[hsc_id] = 0.376; break; default: /* * Default, keep Rsense to 1, if we have new FCM version, * we can use default Rsense value as a base to correct real value. */ hsc_rsense[hsc_id] = 1; break; } rsense_inited[hsc_id] = true; } } static int scm_sensor_read(uint8_t fru, uint8_t sensor_num, float *value) { int ret = -1; int i = 0; int j = 0; bool discrete = false; bool scm_sensor = false; while (i < scm_sensor_cnt) { if (sensor_num == scm_sensor_list[i++]) { scm_sensor = true; break; } } if (scm_sensor) { switch(sensor_num) { case SCM_SENSOR_OUTLET_LOCAL_TEMP: ret = read_attr(fru, sensor_num, SCM_OUTLET_TEMP_DEVICE, TEMP(1), value); break; case SCM_SENSOR_OUTLET_REMOTE_TEMP: ret = read_attr(fru, sensor_num, SCM_OUTLET_TEMP_DEVICE, TEMP(2), value); break; case SCM_SENSOR_INLET_LOCAL_TEMP: ret = read_attr(fru, sensor_num, SCM_INLET_TEMP_DEVICE, TEMP(1), value); break; case SCM_SENSOR_INLET_REMOTE_TEMP: ret = read_attr(fru, sensor_num, SCM_INLET_TEMP_DEVICE, TEMP(2), value); if (!ret) apply_inlet_correction(value); break; case SCM_SENSOR_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, SCM_HSC_DEVICE, 1, value); break; case SCM_SENSOR_HSC_CURR: ret = read_hsc_curr(fru, sensor_num, SCM_HSC_DEVICE, SCM_RSENSE, value); break; case SCM_SENSOR_HSC_POWER: ret = read_hsc_power(fru, sensor_num, SCM_HSC_DEVICE, SCM_RSENSE, value); break; default: ret = READING_NA; break; } } else if (!scm_sensor && is_server_on()) { ret = bic_sdr_init(FRU_SCM); if (ret < 0) { #ifdef DEBUG syslog(LOG_INFO, "bic_sdr_init fail\n"); #endif return ret; } while (j < bic_discrete_cnt) { if (sensor_num == bic_discrete_list[j++]) { discrete = true; break; } } ret = bic_read_sensor_wrapper(FRU_SCM, sensor_num, discrete, value); } else { ret = READING_NA; } return ret; } static int cor_th3_volt(void) { int tmp_volt, i; int val_volt = 0; char str[32]; char tmp[LARGEST_DEVICE_NAME]; char path[LARGEST_DEVICE_NAME + 1]; snprintf(tmp, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, SMB_MAC_CPLD_ROV); for(i = SMB_MAC_CPLD_ROV_NUM - 1; i >= 0; i--) { snprintf(path, LARGEST_DEVICE_NAME, tmp, i); if(read_device(path, &tmp_volt)) { syslog(LOG_ERR, "%s, Cannot read th3 voltage from smbcpld\n", __func__); return -1; } val_volt += tmp_volt; if(i) val_volt = (val_volt << 1); } val_volt = (int)(round((1.6 - (((double)val_volt - 3) * 0.00625)) * 1000)); if(val_volt > TH3_VOL_MAX || val_volt < TH3_VOL_MIN) return -1; snprintf(str, sizeof(str), "%d", val_volt); snprintf(path, LARGEST_DEVICE_NAME, SMB_ISL_DEVICE"/%s", VOLT_SET(0)); if(write_device(path, str)) { syslog(LOG_ERR, "%s, Cannot write th3 voltage into ISL68127\n", __func__); return -1; } return 0; } static int smb_sensor_read(uint8_t fru, uint8_t sensor_num, float *value) { int ret = -1, th3_ret = -1; static uint8_t bootup_check = 0; switch(sensor_num) { case SMB_SENSOR_TH3_SERDES_TEMP: ret = read_attr(fru, sensor_num, SMB_IR_DEVICE, TEMP(1), value); break; case SMB_SENSOR_TH3_CORE_TEMP: ret = read_attr(fru, sensor_num, SMB_ISL_DEVICE, TEMP(1), value); break; case SMB_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, SMB_TEMP1_DEVICE, TEMP(1), value); break; case SMB_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, SMB_TEMP2_DEVICE, TEMP(1), value); break; case SMB_SENSOR_TEMP3: ret = read_attr(fru, sensor_num, SMB_TEMP3_DEVICE, TEMP(1), value); break; case SMB_SENSOR_TEMP4: ret = read_attr(fru, sensor_num, SMB_TEMP4_DEVICE, TEMP(1), value); break; case SMB_SENSOR_TEMP5: ret = read_attr(fru, sensor_num, SMB_TH3_TEMP_DEVICE, TEMP(1), value); break; case SMB_SENSOR_TH3_DIE_TEMP1: ret = read_attr(fru, sensor_num, SMB_TH3_TEMP_DEVICE, TEMP(2), value); break; case SMB_SENSOR_TH3_DIE_TEMP2: ret = read_attr(fru, sensor_num, SMB_TH3_TEMP_DEVICE, TEMP(3), value); break; case SMB_SENSOR_PDB_L_TEMP1: ret = read_attr(fru, sensor_num, SMB_PDB_L_TEMP1_DEVICE, TEMP(1), value); break; case SMB_SENSOR_PDB_L_TEMP2: ret = read_attr(fru, sensor_num, SMB_PDB_L_TEMP2_DEVICE, TEMP(1), value); break; case SMB_SENSOR_PDB_R_TEMP1: ret = read_attr(fru, sensor_num, SMB_PDB_R_TEMP1_DEVICE, TEMP(1), value); break; case SMB_SENSOR_PDB_R_TEMP2: ret = read_attr(fru, sensor_num, SMB_PDB_R_TEMP2_DEVICE, TEMP(1), value); break; case SMB_SENSOR_FCM_T_TEMP1: ret = read_attr(fru, sensor_num, SMB_FCM_T_TEMP1_DEVICE, TEMP(1), value); break; case SMB_SENSOR_FCM_T_TEMP2: ret = read_attr(fru, sensor_num, SMB_FCM_T_TEMP2_DEVICE, TEMP(1), value); break; case SMB_SENSOR_FCM_B_TEMP1: ret = read_attr(fru, sensor_num, SMB_FCM_B_TEMP1_DEVICE, TEMP(1), value); break; case SMB_SENSOR_FCM_B_TEMP2: ret = read_attr(fru, sensor_num, SMB_FCM_B_TEMP2_DEVICE, TEMP(1), value); break; case SMB_SENSOR_1220_VMON1: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(0), value); break; case SMB_SENSOR_1220_VMON2: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(1), value); break; case SMB_SENSOR_1220_VMON3: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(2), value); break; case SMB_SENSOR_1220_VMON4: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(3), value); break; case SMB_SENSOR_1220_VMON5: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(4), value); break; case SMB_SENSOR_1220_VMON6: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(5), value); break; case SMB_SENSOR_1220_VMON7: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(6), value); break; case SMB_SENSOR_1220_VMON8: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(7), value); break; case SMB_SENSOR_1220_VMON9: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(8), value); break; case SMB_SENSOR_1220_VMON10: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(9), value); break; case SMB_SENSOR_1220_VMON11: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(10), value); break; case SMB_SENSOR_1220_VMON12: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(11), value); break; case SMB_SENSOR_1220_VCCA: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(12), value); break; case SMB_SENSOR_1220_VCCINP: ret = read_attr(fru, sensor_num, SMB_1220_DEVICE, VOLT(13), value); break; case SMB_SENSOR_TH3_SERDES_VOLT: ret = read_attr(fru, sensor_num, SMB_IR_DEVICE, VOLT(0), value); break; case SMB_SENSOR_TH3_CORE_VOLT: ret = read_attr(fru, sensor_num, SMB_ISL_DEVICE, VOLT(0), value); if (bootup_check == 0) { th3_ret = cor_th3_volt(); if (!th3_ret) bootup_check = 1; } break; case SMB_SENSOR_FCM_T_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, SMB_FCM_T_HSC_DEVICE, 1, value); break; case SMB_SENSOR_FCM_B_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, SMB_FCM_B_HSC_DEVICE, 1, value); break; case SMB_SENSOR_TH3_SERDES_CURR: ret = read_attr(fru, sensor_num, SMB_IR_DEVICE, CURR(1), value); break; case SMB_SENSOR_TH3_CORE_CURR: ret = read_attr(fru, sensor_num, SMB_ISL_DEVICE, CURR(1), value); break; case SMB_SENSOR_FCM_T_HSC_CURR: hsc_rsense_init(HSC_FCM_T, TOP_FCMCPLD_PATH_FMT); ret = read_hsc_curr(fru, sensor_num, SMB_FCM_T_HSC_DEVICE, hsc_rsense[HSC_FCM_T], value); break; case SMB_SENSOR_FCM_B_HSC_CURR: hsc_rsense_init(HSC_FCM_B, BOTTOM_FCMCPLD_PATH_FMT); ret = read_hsc_curr(fru, sensor_num, SMB_FCM_B_HSC_DEVICE, hsc_rsense[HSC_FCM_B], value); break; case SMB_SENSOR_FCM_T_HSC_POWER: hsc_rsense_init(HSC_FCM_T, TOP_FCMCPLD_PATH_FMT); ret = read_hsc_power(fru, sensor_num, SMB_FCM_T_HSC_DEVICE, hsc_rsense[HSC_FCM_T], value); break; case SMB_SENSOR_FCM_B_HSC_POWER: hsc_rsense_init(HSC_FCM_B, BOTTOM_FCMCPLD_PATH_FMT); ret = read_hsc_power(fru, sensor_num, SMB_FCM_B_HSC_DEVICE, hsc_rsense[HSC_FCM_B], value); break; case SMB_SENSOR_FAN1_FRONT_TACH: ret = read_fan_rpm_f(SMB_FCM_T_TACH_DEVICE, 1, value); break; case SMB_SENSOR_FAN1_REAR_TACH: ret = read_fan_rpm_f(SMB_FCM_T_TACH_DEVICE, 2, value); break; case SMB_SENSOR_FAN2_FRONT_TACH: ret = read_fan_rpm_f(SMB_FCM_B_TACH_DEVICE, 1, value); break; case SMB_SENSOR_FAN2_REAR_TACH: ret = read_fan_rpm_f(SMB_FCM_B_TACH_DEVICE, 2, value); break; case SMB_SENSOR_FAN3_FRONT_TACH: ret = read_fan_rpm_f(SMB_FCM_T_TACH_DEVICE, 3, value); break; case SMB_SENSOR_FAN3_REAR_TACH: ret = read_fan_rpm_f(SMB_FCM_T_TACH_DEVICE, 4, value); break; case SMB_SENSOR_FAN4_FRONT_TACH: ret = read_fan_rpm_f(SMB_FCM_B_TACH_DEVICE, 3, value); break; case SMB_SENSOR_FAN4_REAR_TACH: ret = read_fan_rpm_f(SMB_FCM_B_TACH_DEVICE, 4, value); break; case SMB_SENSOR_FAN5_FRONT_TACH: ret = read_fan_rpm_f(SMB_FCM_T_TACH_DEVICE, 5, value); break; case SMB_SENSOR_FAN5_REAR_TACH: ret = read_fan_rpm_f(SMB_FCM_T_TACH_DEVICE, 6, value); break; case SMB_SENSOR_FAN6_FRONT_TACH: ret = read_fan_rpm_f(SMB_FCM_B_TACH_DEVICE, 5, value); break; case SMB_SENSOR_FAN6_REAR_TACH: ret = read_fan_rpm_f(SMB_FCM_B_TACH_DEVICE, 6, value); break; case SMB_SENSOR_FAN7_FRONT_TACH: ret = read_fan_rpm_f(SMB_FCM_T_TACH_DEVICE, 7, value); break; case SMB_SENSOR_FAN7_REAR_TACH: ret = read_fan_rpm_f(SMB_FCM_T_TACH_DEVICE, 8, value); break; case SMB_SENSOR_FAN8_FRONT_TACH: ret = read_fan_rpm_f(SMB_FCM_B_TACH_DEVICE, 7, value); break; case SMB_SENSOR_FAN8_REAR_TACH: ret = read_fan_rpm_f(SMB_FCM_B_TACH_DEVICE, 8, value); break; default: ret = READING_NA; break; } return ret; } static int pim_sensor_read(uint8_t fru, uint8_t sensor_num, float *value) { int ret = -1; int type = pal_get_pim_type_from_file(fru); switch(sensor_num) { case PIM1_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PIM1_TEMP1_DEVICE, TEMP(1), value); break; case PIM1_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PIM1_TEMP2_DEVICE, TEMP(1), value); break; case PIM1_SENSOR_QSFP_TEMP: ret = read_attr(fru, sensor_num, PIM1_DOM_DEVICE, TEMP(1), value); break; case PIM1_SENSOR_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, PIM1_HSC_DEVICE, 1, value); break; case PIM1_SENSOR_HSC_CURR: if (type == PIM_TYPE_16O) { ret = read_hsc_curr(fru, sensor_num, PIM1_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_curr(fru, sensor_num, PIM1_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM1_SENSOR_HSC_POWER: if (type == PIM_TYPE_16O) { ret = read_hsc_power(fru, sensor_num, PIM1_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_power(fru, sensor_num, PIM1_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM1_SENSOR_34461_VOLT1: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(1), value); if (type == PIM_TYPE_16O) *value = *value * 4; break; case PIM1_SENSOR_34461_VOLT2: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(2), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM1_SENSOR_34461_VOLT3: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(3), value); break; case PIM1_SENSOR_34461_VOLT4: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(4), value); break; case PIM1_SENSOR_34461_VOLT5: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(5), value); break; case PIM1_SENSOR_34461_VOLT6: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(6), value); break; case PIM1_SENSOR_34461_VOLT7: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(7), value); break; case PIM1_SENSOR_34461_VOLT8: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(8), value); break; case PIM1_SENSOR_34461_VOLT9: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(9), value); break; case PIM1_SENSOR_34461_VOLT10: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(10), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM1_SENSOR_34461_VOLT11: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(11), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM1_SENSOR_34461_VOLT12: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(12), value); break; case PIM1_SENSOR_34461_VOLT13: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(13), value); break; case PIM1_SENSOR_34461_VOLT14: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(14), value); break; case PIM1_SENSOR_34461_VOLT15: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(15), value); break; case PIM1_SENSOR_34461_VOLT16: ret = read_attr(fru, sensor_num, PIM1_34461_DEVICE, VOLT(16), value); break; case PIM2_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PIM2_TEMP1_DEVICE, TEMP(1), value); break; case PIM2_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PIM2_TEMP2_DEVICE, TEMP(1), value); break; case PIM2_SENSOR_QSFP_TEMP: ret = read_attr(fru, sensor_num, PIM2_DOM_DEVICE, TEMP(1), value); break; case PIM2_SENSOR_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, PIM2_HSC_DEVICE, 1, value); break; case PIM2_SENSOR_HSC_CURR: if (type == PIM_TYPE_16O) { ret = read_hsc_curr(fru, sensor_num, PIM2_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_curr(fru, sensor_num, PIM2_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM2_SENSOR_HSC_POWER: if (type == PIM_TYPE_16O) { ret = read_hsc_power(fru, sensor_num, PIM2_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_power(fru, sensor_num, PIM2_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM2_SENSOR_34461_VOLT1: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(1), value); if (type == PIM_TYPE_16O) *value = *value * 4; break; case PIM2_SENSOR_34461_VOLT2: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(2), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM2_SENSOR_34461_VOLT3: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(3), value); break; case PIM2_SENSOR_34461_VOLT4: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(4), value); break; case PIM2_SENSOR_34461_VOLT5: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(5), value); break; case PIM2_SENSOR_34461_VOLT6: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(6), value); break; case PIM2_SENSOR_34461_VOLT7: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(7), value); break; case PIM2_SENSOR_34461_VOLT8: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(8), value); break; case PIM2_SENSOR_34461_VOLT9: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(9), value); break; case PIM2_SENSOR_34461_VOLT10: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(10), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM2_SENSOR_34461_VOLT11: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(11), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM2_SENSOR_34461_VOLT12: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(12), value); break; case PIM2_SENSOR_34461_VOLT13: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(13), value); break; case PIM2_SENSOR_34461_VOLT14: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(14), value); break; case PIM2_SENSOR_34461_VOLT15: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(15), value); break; case PIM2_SENSOR_34461_VOLT16: ret = read_attr(fru, sensor_num, PIM2_34461_DEVICE, VOLT(16), value); break; case PIM3_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PIM3_TEMP1_DEVICE, TEMP(1), value); break; case PIM3_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PIM3_TEMP2_DEVICE, TEMP(1), value); break; case PIM3_SENSOR_QSFP_TEMP: ret = read_attr(fru, sensor_num, PIM3_DOM_DEVICE, TEMP(1), value); break; case PIM3_SENSOR_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, PIM3_HSC_DEVICE, 1, value); break; case PIM3_SENSOR_HSC_CURR: if (type == PIM_TYPE_16O) { ret = read_hsc_curr(fru, sensor_num, PIM3_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_curr(fru, sensor_num, PIM3_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM3_SENSOR_HSC_POWER: if (type == PIM_TYPE_16O) { ret = read_hsc_power(fru, sensor_num, PIM3_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_power(fru, sensor_num, PIM3_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM3_SENSOR_34461_VOLT1: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(1), value); if (type == PIM_TYPE_16O) *value = *value * 4; break; case PIM3_SENSOR_34461_VOLT2: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(2), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM3_SENSOR_34461_VOLT3: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(3), value); break; case PIM3_SENSOR_34461_VOLT4: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(4), value); break; case PIM3_SENSOR_34461_VOLT5: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(5), value); break; case PIM3_SENSOR_34461_VOLT6: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(6), value); break; case PIM3_SENSOR_34461_VOLT7: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(7), value); break; case PIM3_SENSOR_34461_VOLT8: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(8), value); break; case PIM3_SENSOR_34461_VOLT9: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(9), value); break; case PIM3_SENSOR_34461_VOLT10: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(10), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM3_SENSOR_34461_VOLT11: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(11), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM3_SENSOR_34461_VOLT12: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(12), value); break; case PIM3_SENSOR_34461_VOLT13: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(13), value); break; case PIM3_SENSOR_34461_VOLT14: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(14), value); break; case PIM3_SENSOR_34461_VOLT15: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(15), value); break; case PIM3_SENSOR_34461_VOLT16: ret = read_attr(fru, sensor_num, PIM3_34461_DEVICE, VOLT(16), value); break; case PIM4_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PIM4_TEMP1_DEVICE, TEMP(1), value); break; case PIM4_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PIM4_TEMP2_DEVICE, TEMP(1), value); break; case PIM4_SENSOR_QSFP_TEMP: ret = read_attr(fru, sensor_num, PIM4_DOM_DEVICE, TEMP(1), value); break; case PIM4_SENSOR_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, PIM4_HSC_DEVICE, 1, value); break; case PIM4_SENSOR_HSC_CURR: if (type == PIM_TYPE_16O) { ret = read_hsc_curr(fru, sensor_num, PIM4_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_curr(fru, sensor_num, PIM4_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM4_SENSOR_HSC_POWER: if (type == PIM_TYPE_16O) { ret = read_hsc_power(fru, sensor_num, PIM4_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_power(fru, sensor_num, PIM4_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM4_SENSOR_34461_VOLT1: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(1), value); if (type == PIM_TYPE_16O) *value = *value * 4; break; case PIM4_SENSOR_34461_VOLT2: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(2), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM4_SENSOR_34461_VOLT3: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(3), value); break; case PIM4_SENSOR_34461_VOLT4: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(4), value); break; case PIM4_SENSOR_34461_VOLT5: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(5), value); break; case PIM4_SENSOR_34461_VOLT6: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(6), value); break; case PIM4_SENSOR_34461_VOLT7: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(7), value); break; case PIM4_SENSOR_34461_VOLT8: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(8), value); break; case PIM4_SENSOR_34461_VOLT9: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(9), value); break; case PIM4_SENSOR_34461_VOLT10: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(10), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM4_SENSOR_34461_VOLT11: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(11), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM4_SENSOR_34461_VOLT12: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(12), value); break; case PIM4_SENSOR_34461_VOLT13: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(13), value); break; case PIM4_SENSOR_34461_VOLT14: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(14), value); break; case PIM4_SENSOR_34461_VOLT15: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(15), value); break; case PIM4_SENSOR_34461_VOLT16: ret = read_attr(fru, sensor_num, PIM4_34461_DEVICE, VOLT(16), value); break; case PIM5_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PIM5_TEMP1_DEVICE, TEMP(1), value); break; case PIM5_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PIM5_TEMP2_DEVICE, TEMP(1), value); break; case PIM5_SENSOR_QSFP_TEMP: ret = read_attr(fru, sensor_num, PIM5_DOM_DEVICE, TEMP(1), value); break; case PIM5_SENSOR_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, PIM5_HSC_DEVICE, 1, value); break; case PIM5_SENSOR_HSC_CURR: if (type == PIM_TYPE_16O) { ret = read_hsc_curr(fru, sensor_num, PIM5_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_curr(fru, sensor_num, PIM5_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM5_SENSOR_HSC_POWER: if (type == PIM_TYPE_16O) { ret = read_hsc_power(fru, sensor_num, PIM5_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_power(fru, sensor_num, PIM5_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM5_SENSOR_34461_VOLT1: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(1), value); if (type == PIM_TYPE_16O) *value = *value * 4; break; case PIM5_SENSOR_34461_VOLT2: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(2), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM5_SENSOR_34461_VOLT3: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(3), value); break; case PIM5_SENSOR_34461_VOLT4: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(4), value); break; case PIM5_SENSOR_34461_VOLT5: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(5), value); break; case PIM5_SENSOR_34461_VOLT6: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(6), value); break; case PIM5_SENSOR_34461_VOLT7: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(7), value); break; case PIM5_SENSOR_34461_VOLT8: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(8), value); break; case PIM5_SENSOR_34461_VOLT9: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(9), value); break; case PIM5_SENSOR_34461_VOLT10: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(10), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM5_SENSOR_34461_VOLT11: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(11), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM5_SENSOR_34461_VOLT12: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(12), value); break; case PIM5_SENSOR_34461_VOLT13: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(13), value); break; case PIM5_SENSOR_34461_VOLT14: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(14), value); break; case PIM5_SENSOR_34461_VOLT15: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(15), value); break; case PIM5_SENSOR_34461_VOLT16: ret = read_attr(fru, sensor_num, PIM5_34461_DEVICE, VOLT(16), value); break; case PIM6_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PIM6_TEMP1_DEVICE, TEMP(1), value); break; case PIM6_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PIM6_TEMP2_DEVICE, TEMP(1), value); break; case PIM6_SENSOR_QSFP_TEMP: ret = read_attr(fru, sensor_num, PIM6_DOM_DEVICE, TEMP(1), value); break; case PIM6_SENSOR_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, PIM6_HSC_DEVICE, 1, value); break; case PIM6_SENSOR_HSC_CURR: if (type == PIM_TYPE_16O) { ret = read_hsc_curr(fru, sensor_num, PIM6_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_curr(fru, sensor_num, PIM6_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM6_SENSOR_HSC_POWER: if (type == PIM_TYPE_16O) { ret = read_hsc_power(fru, sensor_num, PIM6_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_power(fru, sensor_num, PIM6_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM6_SENSOR_34461_VOLT1: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(1), value); if (type == PIM_TYPE_16O) *value = *value * 4; break; case PIM6_SENSOR_34461_VOLT2: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(2), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM6_SENSOR_34461_VOLT3: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(3), value); break; case PIM6_SENSOR_34461_VOLT4: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(4), value); break; case PIM6_SENSOR_34461_VOLT5: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(5), value); break; case PIM6_SENSOR_34461_VOLT6: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(6), value); break; case PIM6_SENSOR_34461_VOLT7: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(7), value); break; case PIM6_SENSOR_34461_VOLT8: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(8), value); break; case PIM6_SENSOR_34461_VOLT9: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(9), value); break; case PIM6_SENSOR_34461_VOLT10: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(10), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM6_SENSOR_34461_VOLT11: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(11), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM6_SENSOR_34461_VOLT12: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(12), value); break; case PIM6_SENSOR_34461_VOLT13: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(13), value); break; case PIM6_SENSOR_34461_VOLT14: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(14), value); break; case PIM6_SENSOR_34461_VOLT15: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(15), value); break; case PIM6_SENSOR_34461_VOLT16: ret = read_attr(fru, sensor_num, PIM6_34461_DEVICE, VOLT(16), value); break; case PIM7_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PIM7_TEMP1_DEVICE, TEMP(1), value); break; case PIM7_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PIM7_TEMP2_DEVICE, TEMP(1), value); break; case PIM7_SENSOR_QSFP_TEMP: ret = read_attr(fru, sensor_num, PIM7_DOM_DEVICE, TEMP(1), value); break; case PIM7_SENSOR_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, PIM7_HSC_DEVICE, 1, value); break; case PIM7_SENSOR_HSC_CURR: if (type == PIM_TYPE_16O) { ret = read_hsc_curr(fru, sensor_num, PIM7_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_curr(fru, sensor_num, PIM7_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM7_SENSOR_HSC_POWER: if (type == PIM_TYPE_16O) { ret = read_hsc_power(fru, sensor_num, PIM7_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_power(fru, sensor_num, PIM7_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM7_SENSOR_34461_VOLT1: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(1), value); if (type == PIM_TYPE_16O) *value = *value * 4; break; case PIM7_SENSOR_34461_VOLT2: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(2), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM7_SENSOR_34461_VOLT3: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(3), value); break; case PIM7_SENSOR_34461_VOLT4: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(4), value); break; case PIM7_SENSOR_34461_VOLT5: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(5), value); break; case PIM7_SENSOR_34461_VOLT6: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(6), value); break; case PIM7_SENSOR_34461_VOLT7: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(7), value); break; case PIM7_SENSOR_34461_VOLT8: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(8), value); break; case PIM7_SENSOR_34461_VOLT9: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(9), value); break; case PIM7_SENSOR_34461_VOLT10: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(10), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM7_SENSOR_34461_VOLT11: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(11), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM7_SENSOR_34461_VOLT12: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(12), value); break; case PIM7_SENSOR_34461_VOLT13: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(13), value); break; case PIM7_SENSOR_34461_VOLT14: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(14), value); break; case PIM7_SENSOR_34461_VOLT15: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(15), value); break; case PIM7_SENSOR_34461_VOLT16: ret = read_attr(fru, sensor_num, PIM7_34461_DEVICE, VOLT(16), value); break; case PIM8_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PIM8_TEMP1_DEVICE, TEMP(1), value); break; case PIM8_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PIM8_TEMP2_DEVICE, TEMP(1), value); break; case PIM8_SENSOR_QSFP_TEMP: ret = read_attr(fru, sensor_num, PIM8_DOM_DEVICE, TEMP(1), value); break; case PIM8_SENSOR_HSC_VOLT: ret = read_hsc_volt(fru, sensor_num, PIM8_HSC_DEVICE, 1, value); break; case PIM8_SENSOR_HSC_CURR: if (type == PIM_TYPE_16O) { ret = read_hsc_curr(fru, sensor_num, PIM8_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_curr(fru, sensor_num, PIM8_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM8_SENSOR_HSC_POWER: if (type == PIM_TYPE_16O) { ret = read_hsc_power(fru, sensor_num, PIM8_HSC_DEVICE, PIM16O_RSENSE, value); } else { ret = read_hsc_power(fru, sensor_num, PIM8_HSC_DEVICE, PIM_RSENSE, value); } break; case PIM8_SENSOR_34461_VOLT1: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(1), value); if (type == PIM_TYPE_16O) *value = *value * 4; break; case PIM8_SENSOR_34461_VOLT2: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(2), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM8_SENSOR_34461_VOLT3: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(3), value); break; case PIM8_SENSOR_34461_VOLT4: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(4), value); break; case PIM8_SENSOR_34461_VOLT5: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(5), value); break; case PIM8_SENSOR_34461_VOLT6: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(6), value); break; case PIM8_SENSOR_34461_VOLT7: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(7), value); break; case PIM8_SENSOR_34461_VOLT8: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(8), value); break; case PIM8_SENSOR_34461_VOLT9: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(9), value); break; case PIM8_SENSOR_34461_VOLT10: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(10), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM8_SENSOR_34461_VOLT11: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(11), value); if (type == PIM_TYPE_16O) *value = *value * 2; break; case PIM8_SENSOR_34461_VOLT12: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(12), value); break; case PIM8_SENSOR_34461_VOLT13: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(13), value); break; case PIM8_SENSOR_34461_VOLT14: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(14), value); break; case PIM8_SENSOR_34461_VOLT15: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(15), value); break; case PIM8_SENSOR_34461_VOLT16: ret = read_attr(fru, sensor_num, PIM8_34461_DEVICE, VOLT(16), value); break; default: ret = READING_NA; break; } return ret; } static int psu_init_acok_key(uint8_t fru) { uint8_t psu_num; char key[MAX_KEY_LEN + 1]; if ((fru >= FRU_PSU1) && (fru <= FRU_PSU4)) { psu_num = (fru - FRU_PSU1 + 1); /* 1-based index */ snprintf(key, MAX_KEY_LEN, "psu%d_acok_state", psu_num); kv_set(key, "1", 0, KV_FCREATE); } return 0; } static int psu_acok_log(uint8_t fru, uint8_t curr_state) { uint8_t psu_num = fru - 10; int ret, old_state; char key[MAX_KEY_LEN + 1]; char cvalue[MAX_VALUE_LEN] = {0}; snprintf(key, MAX_KEY_LEN, "psu%d_acok_state", psu_num); ret = kv_get(key, cvalue, NULL, 0); if (ret < 0) { return ret; } old_state = atoi(cvalue); if (curr_state != old_state) { if (curr_state == PSU_ACOK_UP) { pal_update_ts_sled(); syslog(LOG_CRIT, "DEASSERT: PSU%d AC OK state - AC power up - FRU: %d", psu_num, fru); kv_set(key, "1", 0, 0); } else { pal_update_ts_sled(); syslog(LOG_CRIT, "ASSERT: PSU%d AC OK state - AC power down - FRU: %d", psu_num, fru); kv_set(key, "0", 0, 0); } } return 0; } static int psu_acok_check(uint8_t fru) { int val; char path[LARGEST_DEVICE_NAME + 1]; if (fru == FRU_PSU1) { snprintf(path, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, "psu_L2_input_ok"); } else if (fru == FRU_PSU2) { snprintf(path, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, "psu_L1_input_ok"); } else if (fru == FRU_PSU3) { snprintf(path, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, "psu_R2_input_ok"); } else if (fru == FRU_PSU4) { snprintf(path, LARGEST_DEVICE_NAME, SMBCPLD_PATH_FMT, "psu_R1_input_ok"); } if (read_device(path, &val)) { syslog(LOG_ERR, "%s cannot get value from %s", __func__, path); return 0; } if (!val) { return READING_NA; } return val; } static int psu_sensor_read(uint8_t fru, uint8_t sensor_num, float *value) { int ret = -1; ret = psu_acok_check(fru); if (ret == READING_NA) { psu_acok_log(fru, PSU_ACOK_DOWN); goto psu_out; } psu_acok_log(fru, PSU_ACOK_UP); switch(sensor_num) { case PSU1_SENSOR_IN_VOLT: ret = read_attr(fru, sensor_num, PSU1_DEVICE, VOLT(0), value); break; case PSU1_SENSOR_12V_VOLT: ret = read_attr(fru, sensor_num, PSU1_DEVICE, VOLT(1), value); break; case PSU1_SENSOR_STBY_VOLT: ret = read_attr(fru, sensor_num, PSU1_DEVICE, VOLT(2), value); break; case PSU1_SENSOR_IN_CURR: ret = read_attr(fru, sensor_num, PSU1_DEVICE, CURR(1), value); break; case PSU1_SENSOR_12V_CURR: ret = read_attr(fru, sensor_num, PSU1_DEVICE, CURR(2), value); break; case PSU1_SENSOR_STBY_CURR: ret = read_attr(fru, sensor_num, PSU1_DEVICE, CURR(3), value); break; case PSU1_SENSOR_IN_POWER: ret = read_attr(fru, sensor_num, PSU1_DEVICE, POWER(1), value); break; case PSU1_SENSOR_12V_POWER: ret = read_attr(fru, sensor_num, PSU1_DEVICE, POWER(2), value); break; case PSU1_SENSOR_STBY_POWER: ret = read_attr(fru, sensor_num, PSU1_DEVICE, POWER(3), value); break; case PSU1_SENSOR_FAN_TACH: ret = read_fan_rpm_f(PSU1_DEVICE, 1, value); break; case PSU1_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PSU1_DEVICE, TEMP(1), value); break; case PSU1_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PSU1_DEVICE, TEMP(2), value); break; case PSU1_SENSOR_TEMP3: ret = read_attr(fru, sensor_num, PSU1_DEVICE, TEMP(3), value); break; case PSU2_SENSOR_IN_VOLT: ret = read_attr(fru, sensor_num, PSU2_DEVICE, VOLT(0), value); break; case PSU2_SENSOR_12V_VOLT: ret = read_attr(fru, sensor_num, PSU2_DEVICE, VOLT(1), value); break; case PSU2_SENSOR_STBY_VOLT: ret = read_attr(fru, sensor_num, PSU2_DEVICE, VOLT(2), value); break; case PSU2_SENSOR_IN_CURR: ret = read_attr(fru, sensor_num, PSU2_DEVICE, CURR(1), value); break; case PSU2_SENSOR_12V_CURR: ret = read_attr(fru, sensor_num, PSU2_DEVICE, CURR(2), value); break; case PSU2_SENSOR_STBY_CURR: ret = read_attr(fru, sensor_num, PSU2_DEVICE, CURR(3), value); break; case PSU2_SENSOR_IN_POWER: ret = read_attr(fru, sensor_num, PSU2_DEVICE, POWER(1), value); break; case PSU2_SENSOR_12V_POWER: ret = read_attr(fru, sensor_num, PSU2_DEVICE, POWER(2), value); break; case PSU2_SENSOR_STBY_POWER: ret = read_attr(fru, sensor_num, PSU2_DEVICE, POWER(3), value); break; case PSU2_SENSOR_FAN_TACH: ret = read_fan_rpm_f(PSU2_DEVICE, 1, value); break; case PSU2_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PSU2_DEVICE, TEMP(1), value); break; case PSU2_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PSU2_DEVICE, TEMP(2), value); break; case PSU2_SENSOR_TEMP3: ret = read_attr(fru, sensor_num, PSU2_DEVICE, TEMP(3), value); break; case PSU3_SENSOR_IN_VOLT: ret = read_attr(fru, sensor_num, PSU3_DEVICE, VOLT(0), value); break; case PSU3_SENSOR_12V_VOLT: ret = read_attr(fru, sensor_num, PSU3_DEVICE, VOLT(1), value); break; case PSU3_SENSOR_STBY_VOLT: ret = read_attr(fru, sensor_num, PSU3_DEVICE, VOLT(2), value); break; case PSU3_SENSOR_IN_CURR: ret = read_attr(fru, sensor_num, PSU3_DEVICE, CURR(1), value); break; case PSU3_SENSOR_12V_CURR: ret = read_attr(fru, sensor_num, PSU3_DEVICE, CURR(2), value); break; case PSU3_SENSOR_STBY_CURR: ret = read_attr(fru, sensor_num, PSU3_DEVICE, CURR(3), value); break; case PSU3_SENSOR_IN_POWER: ret = read_attr(fru, sensor_num, PSU3_DEVICE, POWER(1), value); break; case PSU3_SENSOR_12V_POWER: ret = read_attr(fru, sensor_num, PSU3_DEVICE, POWER(2), value); break; case PSU3_SENSOR_STBY_POWER: ret = read_attr(fru, sensor_num, PSU3_DEVICE, POWER(3), value); break; case PSU3_SENSOR_FAN_TACH: ret = read_fan_rpm_f(PSU3_DEVICE, 1, value); break; case PSU3_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PSU3_DEVICE, TEMP(1), value); break; case PSU3_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PSU3_DEVICE, TEMP(2), value); break; case PSU3_SENSOR_TEMP3: ret = read_attr(fru, sensor_num, PSU3_DEVICE, TEMP(3), value); break; case PSU4_SENSOR_IN_VOLT: ret = read_attr(fru, sensor_num, PSU4_DEVICE, VOLT(0), value); break; case PSU4_SENSOR_12V_VOLT: ret = read_attr(fru, sensor_num, PSU4_DEVICE, VOLT(1), value); break; case PSU4_SENSOR_STBY_VOLT: ret = read_attr(fru, sensor_num, PSU4_DEVICE, VOLT(2), value); break; case PSU4_SENSOR_IN_CURR: ret = read_attr(fru, sensor_num, PSU4_DEVICE, CURR(1), value); break; case PSU4_SENSOR_12V_CURR: ret = read_attr(fru, sensor_num, PSU4_DEVICE, CURR(2), value); break; case PSU4_SENSOR_STBY_CURR: ret = read_attr(fru, sensor_num, PSU4_DEVICE, CURR(3), value); break; case PSU4_SENSOR_IN_POWER: ret = read_attr(fru, sensor_num, PSU4_DEVICE, POWER(1), value); break; case PSU4_SENSOR_12V_POWER: ret = read_attr(fru, sensor_num, PSU4_DEVICE, POWER(2), value); break; case PSU4_SENSOR_STBY_POWER: ret = read_attr(fru, sensor_num, PSU4_DEVICE, POWER(3), value); break; case PSU4_SENSOR_FAN_TACH: ret = read_fan_rpm_f(PSU4_DEVICE, 1, value); break; case PSU4_SENSOR_TEMP1: ret = read_attr(fru, sensor_num, PSU4_DEVICE, TEMP(1), value); break; case PSU4_SENSOR_TEMP2: ret = read_attr(fru, sensor_num, PSU4_DEVICE, TEMP(2), value); break; case PSU4_SENSOR_TEMP3: ret = read_attr(fru, sensor_num, PSU4_DEVICE, TEMP(3), value); break; default: ret = READING_NA; break; } psu_out: return ret; } int pal_sensor_read_raw(uint8_t fru, uint8_t sensor_num, void *value) { char key[MAX_KEY_LEN]; char fru_name[32]; int ret , delay = 500; uint8_t prsnt = 0; pal_get_fru_name(fru, fru_name); ret = pal_is_fru_prsnt(fru, &prsnt); if (ret) { return ret; } if (!prsnt) { #ifdef DEBUG syslog(LOG_INFO, "pal_sensor_read_raw(): %s is not present\n", fru_name); #endif return -1; } sprintf(key, "%s_sensor%d", fru_name, sensor_num); switch(fru) { case FRU_SCM: ret = scm_sensor_read(fru, sensor_num, value); if (sensor_num == SCM_SENSOR_INLET_REMOTE_TEMP) { delay = 100; } break; case FRU_SMB: ret = smb_sensor_read(fru, sensor_num, value); if (sensor_num == SMB_SENSOR_TH3_DIE_TEMP1 || sensor_num == SMB_SENSOR_TH3_DIE_TEMP2) { delay = 100; } break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: ret = pim_sensor_read(fru, sensor_num, value); if (sensor_num >= PIM1_SENSOR_QSFP_TEMP && sensor_num <= PIM8_SENSOR_QSFP_TEMP) { delay = 100; } break; case FRU_PSU1: case FRU_PSU2: case FRU_PSU3: case FRU_PSU4: ret = psu_sensor_read(fru, sensor_num, value); break; default: return -1; } if (ret == READING_NA || ret == -1) { return READING_NA; } msleep(delay); return 0; } static int get_scm_sensor_name(uint8_t sensor_num, char *name) { switch(sensor_num) { case SCM_SENSOR_OUTLET_LOCAL_TEMP: sprintf(name, "SCM_OUTLET_LOCAL_TEMP"); break; case SCM_SENSOR_OUTLET_REMOTE_TEMP: sprintf(name, "SCM_OUTLET_REMOTE_TEMP"); break; case SCM_SENSOR_INLET_LOCAL_TEMP: sprintf(name, "SCM_INLET_LOCAL_TEMP"); break; case SCM_SENSOR_INLET_REMOTE_TEMP: sprintf(name, "SCM_INLET_REMOTE_TEMP"); break; case SCM_SENSOR_HSC_VOLT: sprintf(name, "SCM_HSC_VOLT"); break; case SCM_SENSOR_HSC_CURR: sprintf(name, "SCM_HSC_CURR"); break; case SCM_SENSOR_HSC_POWER: sprintf(name, "SCM_HSC_POWER"); break; case BIC_SENSOR_MB_OUTLET_TEMP: sprintf(name, "MB_OUTLET_TEMP"); break; case BIC_SENSOR_MB_INLET_TEMP: sprintf(name, "MB_INLET_TEMP"); break; case BIC_SENSOR_PCH_TEMP: sprintf(name, "PCH_TEMP"); break; case BIC_SENSOR_VCCIN_VR_TEMP: sprintf(name, "VCCIN_VR_TEMP"); break; case BIC_SENSOR_1V05MIX_VR_TEMP: sprintf(name, "1V05MIX_VR_TEMP"); break; case BIC_SENSOR_SOC_TEMP: sprintf(name, "SOC_TEMP"); break; case BIC_SENSOR_SOC_THERM_MARGIN: sprintf(name, "SOC_THERM_MARGIN_TEMP"); break; case BIC_SENSOR_VDDR_VR_TEMP: sprintf(name, "VDDR_VR_TEMP"); break; case BIC_SENSOR_SOC_DIMMA0_TEMP: sprintf(name, "SOC_DIMMA0_TEMP"); break; case BIC_SENSOR_SOC_DIMMB0_TEMP: sprintf(name, "SOC_DIMMB0_TEMP"); break; case BIC_SENSOR_SOC_PACKAGE_PWR: sprintf(name, "SOC_PACKAGE_POWER"); break; case BIC_SENSOR_VCCIN_VR_POUT: sprintf(name, "VCCIN_VR_OUT_POWER"); break; case BIC_SENSOR_VDDR_VR_POUT: sprintf(name, "VDDR_VR_OUT_POWER"); break; case BIC_SENSOR_SOC_TJMAX: sprintf(name, "SOC_TJMAX_TEMP"); break; case BIC_SENSOR_P3V3_MB: sprintf(name, "P3V3_MB_VOLT"); break; case BIC_SENSOR_P12V_MB: sprintf(name, "P12V_MB_VOLT"); break; case BIC_SENSOR_P1V05_PCH: sprintf(name, "P1V05_PCH_VOLT"); break; case BIC_SENSOR_P3V3_STBY_MB: sprintf(name, "P3V3_STBY_MB_VOLT"); break; case BIC_SENSOR_P5V_STBY_MB: sprintf(name, "P5V_STBY_MB_VOLT"); break; case BIC_SENSOR_PV_BAT: sprintf(name, "PV_BAT_VOLT"); break; case BIC_SENSOR_PVDDR: sprintf(name, "PVDDR_VOLT"); break; case BIC_SENSOR_P1V05_MIX: sprintf(name, "P1V05_MIX_VOLT"); break; case BIC_SENSOR_1V05MIX_VR_CURR: sprintf(name, "1V05MIX_VR_CURR"); break; case BIC_SENSOR_VDDR_VR_CURR: sprintf(name, "VDDR_VR_CURR"); break; case BIC_SENSOR_VCCIN_VR_CURR: sprintf(name, "VCCIN_VR_CURR"); break; case BIC_SENSOR_VCCIN_VR_VOL: sprintf(name, "VCCIN_VR_VOLT"); break; case BIC_SENSOR_VDDR_VR_VOL: sprintf(name, "VDDR_VR_VOLT"); break; case BIC_SENSOR_P1V05MIX_VR_VOL: sprintf(name, "1V05MIX_VR_VOLT"); break; case BIC_SENSOR_P1V05MIX_VR_POUT: sprintf(name, "1V05MIX_VR_OUT_POWER"); break; case BIC_SENSOR_INA230_POWER: sprintf(name, "INA230_POWER"); break; case BIC_SENSOR_INA230_VOL: sprintf(name, "INA230_VOLT"); break; case BIC_SENSOR_SYSTEM_STATUS: sprintf(name, "SYSTEM_STATUS"); break; case BIC_SENSOR_SYS_BOOT_STAT: sprintf(name, "SYS_BOOT_STAT"); break; case BIC_SENSOR_CPU_DIMM_HOT: sprintf(name, "CPU_DIMM_HOT"); break; case BIC_SENSOR_PROC_FAIL: sprintf(name, "PROC_FAIL"); break; case BIC_SENSOR_VR_HOT: sprintf(name, "VR_HOT"); break; default: return -1; } return 0; } static int get_smb_sensor_name(uint8_t sensor_num, char *name) { switch(sensor_num) { case SMB_SENSOR_TH3_SERDES_TEMP: sprintf(name, "TH3_SERDES_TEMP"); break; case SMB_SENSOR_TH3_CORE_TEMP: sprintf(name, "TH3_CORE_TEMP"); break; case SMB_SENSOR_TEMP1: sprintf(name, "SMB_TEMP1"); break; case SMB_SENSOR_TEMP2: sprintf(name, "SMB_TEMP2"); break; case SMB_SENSOR_TEMP3: sprintf(name, "SMB_TEMP3"); break; case SMB_SENSOR_TEMP4: sprintf(name, "SMB_TEMP4"); break; case SMB_SENSOR_TEMP5: sprintf(name, "SMB_TEMP5"); break; case SMB_SENSOR_TH3_DIE_TEMP1: sprintf(name, "TH3_DIE_TEMP1"); break; case SMB_SENSOR_TH3_DIE_TEMP2: sprintf(name, "TH3_DIE_TEMP2"); break; case SMB_SENSOR_PDB_L_TEMP1: sprintf(name, "PDB_L_TEMP1"); break; case SMB_SENSOR_PDB_L_TEMP2: sprintf(name, "PDB_L_TEMP2"); break; case SMB_SENSOR_PDB_R_TEMP1: sprintf(name, "PDB_R_TEMP1"); break; case SMB_SENSOR_PDB_R_TEMP2: sprintf(name, "PDB_R_TEMP2"); break; case SMB_SENSOR_FCM_T_TEMP1: sprintf(name, "FCM_T_TEMP1"); break; case SMB_SENSOR_FCM_T_TEMP2: sprintf(name, "FCM_T_TEMP2"); break; case SMB_SENSOR_FCM_B_TEMP1: sprintf(name, "FCM_B_TEMP1"); break; case SMB_SENSOR_FCM_B_TEMP2: sprintf(name, "FCM_B_TEMP2"); break; case SMB_SENSOR_1220_VMON1: sprintf(name, "POWR1220_VMON1"); break; case SMB_SENSOR_1220_VMON2: sprintf(name, "POWR1220_VMON2"); break; case SMB_SENSOR_1220_VMON3: sprintf(name, "POWR1220_VMON3"); break; case SMB_SENSOR_1220_VMON4: sprintf(name, "POWR1220_VMON4"); break; case SMB_SENSOR_1220_VMON5: sprintf(name, "POWR1220_VMON5"); break; case SMB_SENSOR_1220_VMON6: sprintf(name, "POWR1220_VMON6"); break; case SMB_SENSOR_1220_VMON7: sprintf(name, "POWR1220_VMON7"); break; case SMB_SENSOR_1220_VMON8: sprintf(name, "POWR1220_VMON8"); break; case SMB_SENSOR_1220_VMON9: sprintf(name, "POWR1220_VMON9"); break; case SMB_SENSOR_1220_VMON10: sprintf(name, "POWR1220_VMON10"); break; case SMB_SENSOR_1220_VMON11: sprintf(name, "POWR1220_VMON11"); break; case SMB_SENSOR_1220_VMON12: sprintf(name, "POWR1220_VMON12"); break; case SMB_SENSOR_1220_VCCA: sprintf(name, "POWR1220_VCCA"); break; case SMB_SENSOR_1220_VCCINP: sprintf(name, "POWR1220_VCCINP"); break; case SMB_SENSOR_TH3_SERDES_VOLT: sprintf(name, "TH3_SERDES_VOLT"); break; case SMB_SENSOR_TH3_CORE_VOLT: sprintf(name, "TH3_CORE_VOLT"); break; case SMB_SENSOR_FCM_T_HSC_VOLT: sprintf(name, "FCM_T_HSC_VOLT"); break; case SMB_SENSOR_FCM_B_HSC_VOLT: sprintf(name, "FCM_B_HSC_VOLT"); break; case SMB_SENSOR_TH3_SERDES_CURR: sprintf(name, "TH3_SERDES_CURR"); break; case SMB_SENSOR_TH3_CORE_CURR: sprintf(name, "TH3_CORE_CURR"); break; case SMB_SENSOR_FCM_T_HSC_CURR: sprintf(name, "FCM_T_HSC_CURR"); break; case SMB_SENSOR_FCM_B_HSC_CURR: sprintf(name, "FCM_B_HSC_CURR"); break; case SMB_SENSOR_FCM_T_HSC_POWER: sprintf(name, "FCM_T_HSC_POWER"); break; case SMB_SENSOR_FCM_B_HSC_POWER: sprintf(name, "FCM_B_HSC_POWER"); break; case SMB_SENSOR_FAN1_FRONT_TACH: sprintf(name, "FAN1_FRONT_SPEED"); break; case SMB_SENSOR_FAN1_REAR_TACH: sprintf(name, "FAN1_REAR_SPEED"); break; case SMB_SENSOR_FAN2_FRONT_TACH: sprintf(name, "FAN2_FRONT_SPEED"); break; case SMB_SENSOR_FAN2_REAR_TACH: sprintf(name, "FAN2_REAR_SPEED"); break; case SMB_SENSOR_FAN3_FRONT_TACH: sprintf(name, "FAN3_FRONT_SPEED"); break; case SMB_SENSOR_FAN3_REAR_TACH: sprintf(name, "FAN3_REAR_SPEED"); break; case SMB_SENSOR_FAN4_FRONT_TACH: sprintf(name, "FAN4_FRONT_SPEED"); break; case SMB_SENSOR_FAN4_REAR_TACH: sprintf(name, "FAN4_REAR_SPEED"); break; case SMB_SENSOR_FAN5_FRONT_TACH: sprintf(name, "FAN5_FRONT_SPEED"); break; case SMB_SENSOR_FAN5_REAR_TACH: sprintf(name, "FAN5_REAR_SPEED"); break; case SMB_SENSOR_FAN6_FRONT_TACH: sprintf(name, "FAN6_FRONT_SPEED"); break; case SMB_SENSOR_FAN6_REAR_TACH: sprintf(name, "FAN6_REAR_SPEED"); break; case SMB_SENSOR_FAN7_FRONT_TACH: sprintf(name, "FAN7_FRONT_SPEED"); break; case SMB_SENSOR_FAN7_REAR_TACH: sprintf(name, "FAN7_REAR_SPEED"); break; case SMB_SENSOR_FAN8_FRONT_TACH: sprintf(name, "FAN8_FRONT_SPEED"); break; case SMB_SENSOR_FAN8_REAR_TACH: sprintf(name, "FAN8_REAR_SPEED"); break; default: return -1; } return 0; } static int get_pim_sensor_name(uint8_t sensor_num, char *name) { switch(sensor_num) { case PIM1_SENSOR_TEMP1: sprintf(name, "PIM1_TEMP1"); break; case PIM1_SENSOR_TEMP2: sprintf(name, "PIM1_TEMP2"); break; case PIM1_SENSOR_QSFP_TEMP: sprintf(name, "PIM1_QSFP_TEMP"); break; case PIM1_SENSOR_HSC_VOLT: sprintf(name, "PIM1_HSC_VOLT"); break; case PIM1_SENSOR_HSC_CURR: sprintf(name, "PIM1_HSC_CURR"); break; case PIM1_SENSOR_HSC_POWER: sprintf(name, "PIM1_HSC_POWER"); break; case PIM1_SENSOR_34461_VOLT1: sprintf(name, "PIM1_MAX34461_VOLT1"); break; case PIM1_SENSOR_34461_VOLT2: sprintf(name, "PIM1_MAX34461_VOLT2"); break; case PIM1_SENSOR_34461_VOLT3: sprintf(name, "PIM1_MAX34461_VOLT3"); break; case PIM1_SENSOR_34461_VOLT4: sprintf(name, "PIM1_MAX34461_VOLT4"); break; case PIM1_SENSOR_34461_VOLT5: sprintf(name, "PIM1_MAX34461_VOLT5"); break; case PIM1_SENSOR_34461_VOLT6: sprintf(name, "PIM1_MAX34461_VOLT6"); break; case PIM1_SENSOR_34461_VOLT7: sprintf(name, "PIM1_MAX34461_VOLT7"); break; case PIM1_SENSOR_34461_VOLT8: sprintf(name, "PIM1_MAX34461_VOLT8"); break; case PIM1_SENSOR_34461_VOLT9: sprintf(name, "PIM1_MAX34461_VOLT9"); break; case PIM1_SENSOR_34461_VOLT10: sprintf(name, "PIM1_MAX34461_VOLT10"); break; case PIM1_SENSOR_34461_VOLT11: sprintf(name, "PIM1_MAX34461_VOLT11"); break; case PIM1_SENSOR_34461_VOLT12: sprintf(name, "PIM1_MAX34461_VOLT12"); break; case PIM1_SENSOR_34461_VOLT13: sprintf(name, "PIM1_MAX34461_VOLT13"); break; case PIM1_SENSOR_34461_VOLT14: sprintf(name, "PIM1_MAX34461_VOLT14"); break; case PIM1_SENSOR_34461_VOLT15: sprintf(name, "PIM1_MAX34461_VOLT15"); break; case PIM1_SENSOR_34461_VOLT16: sprintf(name, "PIM1_MAX34461_VOLT16"); break; case PIM2_SENSOR_TEMP1: sprintf(name, "PIM2_TEMP1"); break; case PIM2_SENSOR_TEMP2: sprintf(name, "PIM2_TEMP2"); break; case PIM2_SENSOR_QSFP_TEMP: sprintf(name, "PIM2_QSFP_TEMP"); break; case PIM2_SENSOR_HSC_VOLT: sprintf(name, "PIM2_HSC_VOLT"); break; case PIM2_SENSOR_HSC_CURR: sprintf(name, "PIM2_HSC_CURR"); break; case PIM2_SENSOR_HSC_POWER: sprintf(name, "PIM2_HSC_POWER"); break; case PIM2_SENSOR_34461_VOLT1: sprintf(name, "PIM2_MAX34461_VOLT1"); break; case PIM2_SENSOR_34461_VOLT2: sprintf(name, "PIM2_MAX34461_VOLT2"); break; case PIM2_SENSOR_34461_VOLT3: sprintf(name, "PIM2_MAX34461_VOLT3"); break; case PIM2_SENSOR_34461_VOLT4: sprintf(name, "PIM2_MAX34461_VOLT4"); break; case PIM2_SENSOR_34461_VOLT5: sprintf(name, "PIM2_MAX34461_VOLT5"); break; case PIM2_SENSOR_34461_VOLT6: sprintf(name, "PIM2_MAX34461_VOLT6"); break; case PIM2_SENSOR_34461_VOLT7: sprintf(name, "PIM2_MAX34461_VOLT7"); break; case PIM2_SENSOR_34461_VOLT8: sprintf(name, "PIM2_MAX34461_VOLT8"); break; case PIM2_SENSOR_34461_VOLT9: sprintf(name, "PIM2_MAX34461_VOLT9"); break; case PIM2_SENSOR_34461_VOLT10: sprintf(name, "PIM2_MAX34461_VOLT10"); break; case PIM2_SENSOR_34461_VOLT11: sprintf(name, "PIM2_MAX34461_VOLT11"); break; case PIM2_SENSOR_34461_VOLT12: sprintf(name, "PIM2_MAX34461_VOLT12"); break; case PIM2_SENSOR_34461_VOLT13: sprintf(name, "PIM2_MAX34461_VOLT13"); break; case PIM2_SENSOR_34461_VOLT14: sprintf(name, "PIM2_MAX34461_VOLT14"); break; case PIM2_SENSOR_34461_VOLT15: sprintf(name, "PIM2_MAX34461_VOLT15"); break; case PIM2_SENSOR_34461_VOLT16: sprintf(name, "PIM2_MAX34461_VOLT16"); break; case PIM3_SENSOR_TEMP1: sprintf(name, "PIM3_TEMP1"); break; case PIM3_SENSOR_TEMP2: sprintf(name, "PIM3_TEMP2"); break; case PIM3_SENSOR_QSFP_TEMP: sprintf(name, "PIM3_QSFP_TEMP"); break; case PIM3_SENSOR_HSC_VOLT: sprintf(name, "PIM3_HSC_VOLT"); break; case PIM3_SENSOR_HSC_CURR: sprintf(name, "PIM3_HSC_CURR"); break; case PIM3_SENSOR_HSC_POWER: sprintf(name, "PIM3_HSC_POWER"); break; case PIM3_SENSOR_34461_VOLT1: sprintf(name, "PIM3_MAX34461_VOLT1"); break; case PIM3_SENSOR_34461_VOLT2: sprintf(name, "PIM3_MAX34461_VOLT2"); break; case PIM3_SENSOR_34461_VOLT3: sprintf(name, "PIM3_MAX34461_VOLT3"); break; case PIM3_SENSOR_34461_VOLT4: sprintf(name, "PIM3_MAX34461_VOLT4"); break; case PIM3_SENSOR_34461_VOLT5: sprintf(name, "PIM3_MAX34461_VOLT5"); break; case PIM3_SENSOR_34461_VOLT6: sprintf(name, "PIM3_MAX34461_VOLT6"); break; case PIM3_SENSOR_34461_VOLT7: sprintf(name, "PIM3_MAX34461_VOLT7"); break; case PIM3_SENSOR_34461_VOLT8: sprintf(name, "PIM3_MAX34461_VOLT8"); break; case PIM3_SENSOR_34461_VOLT9: sprintf(name, "PIM3_MAX34461_VOLT9"); break; case PIM3_SENSOR_34461_VOLT10: sprintf(name, "PIM3_MAX34461_VOLT10"); break; case PIM3_SENSOR_34461_VOLT11: sprintf(name, "PIM3_MAX34461_VOLT11"); break; case PIM3_SENSOR_34461_VOLT12: sprintf(name, "PIM3_MAX34461_VOLT12"); break; case PIM3_SENSOR_34461_VOLT13: sprintf(name, "PIM3_MAX34461_VOLT13"); break; case PIM3_SENSOR_34461_VOLT14: sprintf(name, "PIM3_MAX34461_VOLT14"); break; case PIM3_SENSOR_34461_VOLT15: sprintf(name, "PIM3_MAX34461_VOLT15"); break; case PIM3_SENSOR_34461_VOLT16: sprintf(name, "PIM3_MAX34461_VOLT16"); break; case PIM4_SENSOR_TEMP1: sprintf(name, "PIM4_TEMP1"); break; case PIM4_SENSOR_TEMP2: sprintf(name, "PIM4_TEMP2"); break; case PIM4_SENSOR_QSFP_TEMP: sprintf(name, "PIM4_QSFP_TEMP"); break; case PIM4_SENSOR_HSC_VOLT: sprintf(name, "PIM4_HSC_VOLT"); break; case PIM4_SENSOR_HSC_CURR: sprintf(name, "PIM4_HSC_CURR"); break; case PIM4_SENSOR_HSC_POWER: sprintf(name, "PIM4_HSC_POWER"); break; case PIM4_SENSOR_34461_VOLT1: sprintf(name, "PIM4_MAX34461_VOLT1"); break; case PIM4_SENSOR_34461_VOLT2: sprintf(name, "PIM4_MAX34461_VOLT2"); break; case PIM4_SENSOR_34461_VOLT3: sprintf(name, "PIM4_MAX34461_VOLT3"); break; case PIM4_SENSOR_34461_VOLT4: sprintf(name, "PIM4_MAX34461_VOLT4"); break; case PIM4_SENSOR_34461_VOLT5: sprintf(name, "PIM4_MAX34461_VOLT5"); break; case PIM4_SENSOR_34461_VOLT6: sprintf(name, "PIM4_MAX34461_VOLT6"); break; case PIM4_SENSOR_34461_VOLT7: sprintf(name, "PIM4_MAX34461_VOLT7"); break; case PIM4_SENSOR_34461_VOLT8: sprintf(name, "PIM4_MAX34461_VOLT8"); break; case PIM4_SENSOR_34461_VOLT9: sprintf(name, "PIM4_MAX34461_VOLT9"); break; case PIM4_SENSOR_34461_VOLT10: sprintf(name, "PIM4_MAX34461_VOLT10"); break; case PIM4_SENSOR_34461_VOLT11: sprintf(name, "PIM4_MAX34461_VOLT11"); break; case PIM4_SENSOR_34461_VOLT12: sprintf(name, "PIM4_MAX34461_VOLT12"); break; case PIM4_SENSOR_34461_VOLT13: sprintf(name, "PIM4_MAX34461_VOLT13"); break; case PIM4_SENSOR_34461_VOLT14: sprintf(name, "PIM4_MAX34461_VOLT14"); break; case PIM4_SENSOR_34461_VOLT15: sprintf(name, "PIM4_MAX34461_VOLT15"); break; case PIM4_SENSOR_34461_VOLT16: sprintf(name, "PIM4_MAX34461_VOLT16"); break; case PIM5_SENSOR_TEMP1: sprintf(name, "PIM5_TEMP1"); break; case PIM5_SENSOR_TEMP2: sprintf(name, "PIM5_TEMP2"); break; case PIM5_SENSOR_QSFP_TEMP: sprintf(name, "PIM5_QSFP_TEMP"); break; case PIM5_SENSOR_HSC_VOLT: sprintf(name, "PIM5_HSC_VOLT"); break; case PIM5_SENSOR_HSC_CURR: sprintf(name, "PIM5_HSC_CURR"); break; case PIM5_SENSOR_HSC_POWER: sprintf(name, "PIM5_HSC_POWER"); break; case PIM5_SENSOR_34461_VOLT1: sprintf(name, "PIM5_MAX34461_VOLT1"); break; case PIM5_SENSOR_34461_VOLT2: sprintf(name, "PIM5_MAX34461_VOLT2"); break; case PIM5_SENSOR_34461_VOLT3: sprintf(name, "PIM5_MAX34461_VOLT3"); break; case PIM5_SENSOR_34461_VOLT4: sprintf(name, "PIM5_MAX34461_VOLT4"); break; case PIM5_SENSOR_34461_VOLT5: sprintf(name, "PIM5_MAX34461_VOLT5"); break; case PIM5_SENSOR_34461_VOLT6: sprintf(name, "PIM5_MAX34461_VOLT6"); break; case PIM5_SENSOR_34461_VOLT7: sprintf(name, "PIM5_MAX34461_VOLT7"); break; case PIM5_SENSOR_34461_VOLT8: sprintf(name, "PIM5_MAX34461_VOLT8"); break; case PIM5_SENSOR_34461_VOLT9: sprintf(name, "PIM5_MAX34461_VOLT9"); break; case PIM5_SENSOR_34461_VOLT10: sprintf(name, "PIM5_MAX34461_VOLT10"); break; case PIM5_SENSOR_34461_VOLT11: sprintf(name, "PIM5_MAX34461_VOLT11"); break; case PIM5_SENSOR_34461_VOLT12: sprintf(name, "PIM5_MAX34461_VOLT12"); break; case PIM5_SENSOR_34461_VOLT13: sprintf(name, "PIM5_MAX34461_VOLT13"); break; case PIM5_SENSOR_34461_VOLT14: sprintf(name, "PIM5_MAX34461_VOLT14"); break; case PIM5_SENSOR_34461_VOLT15: sprintf(name, "PIM5_MAX34461_VOLT15"); break; case PIM5_SENSOR_34461_VOLT16: sprintf(name, "PIM5_MAX34461_VOLT16"); break; case PIM6_SENSOR_TEMP1: sprintf(name, "PIM6_TEMP1"); break; case PIM6_SENSOR_TEMP2: sprintf(name, "PIM6_TEMP2"); break; case PIM6_SENSOR_QSFP_TEMP: sprintf(name, "PIM6_QSFP_TEMP"); break; case PIM6_SENSOR_HSC_VOLT: sprintf(name, "PIM6_HSC_VOLT"); break; case PIM6_SENSOR_HSC_CURR: sprintf(name, "PIM6_HSC_CURR"); break; case PIM6_SENSOR_HSC_POWER: sprintf(name, "PIM6_HSC_POWER"); break; case PIM6_SENSOR_34461_VOLT1: sprintf(name, "PIM6_MAX34461_VOLT1"); break; case PIM6_SENSOR_34461_VOLT2: sprintf(name, "PIM6_MAX34461_VOLT2"); break; case PIM6_SENSOR_34461_VOLT3: sprintf(name, "PIM6_MAX34461_VOLT3"); break; case PIM6_SENSOR_34461_VOLT4: sprintf(name, "PIM6_MAX34461_VOLT4"); break; case PIM6_SENSOR_34461_VOLT5: sprintf(name, "PIM6_MAX34461_VOLT5"); break; case PIM6_SENSOR_34461_VOLT6: sprintf(name, "PIM6_MAX34461_VOLT6"); break; case PIM6_SENSOR_34461_VOLT7: sprintf(name, "PIM6_MAX34461_VOLT7"); break; case PIM6_SENSOR_34461_VOLT8: sprintf(name, "PIM6_MAX34461_VOLT8"); break; case PIM6_SENSOR_34461_VOLT9: sprintf(name, "PIM6_MAX34461_VOLT9"); break; case PIM6_SENSOR_34461_VOLT10: sprintf(name, "PIM6_MAX34461_VOLT10"); break; case PIM6_SENSOR_34461_VOLT11: sprintf(name, "PIM6_MAX34461_VOLT11"); break; case PIM6_SENSOR_34461_VOLT12: sprintf(name, "PIM6_MAX34461_VOLT12"); break; case PIM6_SENSOR_34461_VOLT13: sprintf(name, "PIM6_MAX34461_VOLT13"); break; case PIM6_SENSOR_34461_VOLT14: sprintf(name, "PIM6_MAX34461_VOLT14"); break; case PIM6_SENSOR_34461_VOLT15: sprintf(name, "PIM6_MAX34461_VOLT15"); break; case PIM6_SENSOR_34461_VOLT16: sprintf(name, "PIM6_MAX34461_VOLT16"); break; case PIM7_SENSOR_TEMP1: sprintf(name, "PIM7_TEMP1"); break; case PIM7_SENSOR_TEMP2: sprintf(name, "PIM7_TEMP2"); break; case PIM7_SENSOR_QSFP_TEMP: sprintf(name, "PIM7_QSFP_TEMP"); break; case PIM7_SENSOR_HSC_VOLT: sprintf(name, "PIM7_HSC_VOLT"); break; case PIM7_SENSOR_HSC_CURR: sprintf(name, "PIM7_HSC_CURR"); break; case PIM7_SENSOR_HSC_POWER: sprintf(name, "PIM7_HSC_POWER"); break; case PIM7_SENSOR_34461_VOLT1: sprintf(name, "PIM7_MAX34461_VOLT1"); break; case PIM7_SENSOR_34461_VOLT2: sprintf(name, "PIM7_MAX34461_VOLT2"); break; case PIM7_SENSOR_34461_VOLT3: sprintf(name, "PIM7_MAX34461_VOLT3"); break; case PIM7_SENSOR_34461_VOLT4: sprintf(name, "PIM7_MAX34461_VOLT4"); break; case PIM7_SENSOR_34461_VOLT5: sprintf(name, "PIM7_MAX34461_VOLT5"); break; case PIM7_SENSOR_34461_VOLT6: sprintf(name, "PIM7_MAX34461_VOLT6"); break; case PIM7_SENSOR_34461_VOLT7: sprintf(name, "PIM7_MAX34461_VOLT7"); break; case PIM7_SENSOR_34461_VOLT8: sprintf(name, "PIM7_MAX34461_VOLT8"); break; case PIM7_SENSOR_34461_VOLT9: sprintf(name, "PIM7_MAX34461_VOLT9"); break; case PIM7_SENSOR_34461_VOLT10: sprintf(name, "PIM7_MAX34461_VOLT10"); break; case PIM7_SENSOR_34461_VOLT11: sprintf(name, "PIM7_MAX34461_VOLT11"); break; case PIM7_SENSOR_34461_VOLT12: sprintf(name, "PIM7_MAX34461_VOLT12"); break; case PIM7_SENSOR_34461_VOLT13: sprintf(name, "PIM7_MAX34461_VOLT13"); break; case PIM7_SENSOR_34461_VOLT14: sprintf(name, "PIM7_MAX34461_VOLT14"); break; case PIM7_SENSOR_34461_VOLT15: sprintf(name, "PIM7_MAX34461_VOLT15"); break; case PIM7_SENSOR_34461_VOLT16: sprintf(name, "PIM7_MAX34461_VOLT16"); break; case PIM8_SENSOR_TEMP1: sprintf(name, "PIM8_TEMP1"); break; case PIM8_SENSOR_TEMP2: sprintf(name, "PIM8_TEMP2"); break; case PIM8_SENSOR_QSFP_TEMP: sprintf(name, "PIM8_QSFP_TEMP"); break; case PIM8_SENSOR_HSC_VOLT: sprintf(name, "PIM8_HSC_VOLT"); break; case PIM8_SENSOR_HSC_CURR: sprintf(name, "PIM8_HSC_CURR"); break; case PIM8_SENSOR_HSC_POWER: sprintf(name, "PIM8_HSC_POWER"); break; case PIM8_SENSOR_34461_VOLT1: sprintf(name, "PIM8_MAX34461_VOLT1"); break; case PIM8_SENSOR_34461_VOLT2: sprintf(name, "PIM8_MAX34461_VOLT2"); break; case PIM8_SENSOR_34461_VOLT3: sprintf(name, "PIM8_MAX34461_VOLT3"); break; case PIM8_SENSOR_34461_VOLT4: sprintf(name, "PIM8_MAX34461_VOLT4"); break; case PIM8_SENSOR_34461_VOLT5: sprintf(name, "PIM8_MAX34461_VOLT5"); break; case PIM8_SENSOR_34461_VOLT6: sprintf(name, "PIM8_MAX34461_VOLT6"); break; case PIM8_SENSOR_34461_VOLT7: sprintf(name, "PIM8_MAX34461_VOLT7"); break; case PIM8_SENSOR_34461_VOLT8: sprintf(name, "PIM8_MAX34461_VOLT8"); break; case PIM8_SENSOR_34461_VOLT9: sprintf(name, "PIM8_MAX34461_VOLT9"); break; case PIM8_SENSOR_34461_VOLT10: sprintf(name, "PIM8_MAX34461_VOLT10"); break; case PIM8_SENSOR_34461_VOLT11: sprintf(name, "PIM8_MAX34461_VOLT11"); break; case PIM8_SENSOR_34461_VOLT12: sprintf(name, "PIM8_MAX34461_VOLT12"); break; case PIM8_SENSOR_34461_VOLT13: sprintf(name, "PIM8_MAX34461_VOLT13"); break; case PIM8_SENSOR_34461_VOLT14: sprintf(name, "PIM8_MAX34461_VOLT14"); break; case PIM8_SENSOR_34461_VOLT15: sprintf(name, "PIM8_MAX34461_VOLT15"); break; case PIM8_SENSOR_34461_VOLT16: sprintf(name, "PIM8_MAX34461_VOLT16"); break; default: return -1; } return 0; } static int get_psu_sensor_name(uint8_t sensor_num, char *name) { switch(sensor_num) { case PSU1_SENSOR_IN_VOLT: sprintf(name, "PSU1_IN_VOLT"); break; case PSU1_SENSOR_12V_VOLT: sprintf(name, "PSU1_12V_VOLT"); break; case PSU1_SENSOR_STBY_VOLT: sprintf(name, "PSU1_STBY_VOLT"); break; case PSU1_SENSOR_IN_CURR: sprintf(name, "PSU1_IN_CURR"); break; case PSU1_SENSOR_12V_CURR: sprintf(name, "PSU1_12V_CURR"); break; case PSU1_SENSOR_STBY_CURR: sprintf(name, "PSU1_STBY_CURR"); break; case PSU1_SENSOR_IN_POWER: sprintf(name, "PSU1_IN_POWER"); break; case PSU1_SENSOR_12V_POWER: sprintf(name, "PSU1_12V_POWER"); break; case PSU1_SENSOR_STBY_POWER: sprintf(name, "PSU1_STBY_POWER"); break; case PSU1_SENSOR_FAN_TACH: sprintf(name, "PSU1_FAN_SPEED"); break; case PSU1_SENSOR_TEMP1: sprintf(name, "PSU1_TEMP1"); break; case PSU1_SENSOR_TEMP2: sprintf(name, "PSU1_TEMP2"); break; case PSU1_SENSOR_TEMP3: sprintf(name, "PSU1_TEMP3"); break; case PSU2_SENSOR_IN_VOLT: sprintf(name, "PSU2_IN_VOLT"); break; case PSU2_SENSOR_12V_VOLT: sprintf(name, "PSU2_12V_VOLT"); break; case PSU2_SENSOR_STBY_VOLT: sprintf(name, "PSU2_STBY_VOLT"); break; case PSU2_SENSOR_IN_CURR: sprintf(name, "PSU2_IN_CURR"); break; case PSU2_SENSOR_12V_CURR: sprintf(name, "PSU2_12V_CURR"); break; case PSU2_SENSOR_STBY_CURR: sprintf(name, "PSU2_STBY_CURR"); break; case PSU2_SENSOR_IN_POWER: sprintf(name, "PSU2_IN_POWER"); break; case PSU2_SENSOR_12V_POWER: sprintf(name, "PSU2_12V_POWER"); break; case PSU2_SENSOR_STBY_POWER: sprintf(name, "PSU2_STBY_POWER"); break; case PSU2_SENSOR_FAN_TACH: sprintf(name, "PSU2_FAN_SPEED"); break; case PSU2_SENSOR_TEMP1: sprintf(name, "PSU2_TEMP1"); break; case PSU2_SENSOR_TEMP2: sprintf(name, "PSU2_TEMP2"); break; case PSU2_SENSOR_TEMP3: sprintf(name, "PSU2_TEMP3"); break; case PSU3_SENSOR_IN_VOLT: sprintf(name, "PSU3_IN_VOLT"); break; case PSU3_SENSOR_12V_VOLT: sprintf(name, "PSU3_12V_VOLT"); break; case PSU3_SENSOR_STBY_VOLT: sprintf(name, "PSU3_STBY_VOLT"); break; case PSU3_SENSOR_IN_CURR: sprintf(name, "PSU3_IN_CURR"); break; case PSU3_SENSOR_12V_CURR: sprintf(name, "PSU3_12V_CURR"); break; case PSU3_SENSOR_STBY_CURR: sprintf(name, "PSU3_STBY_CURR"); break; case PSU3_SENSOR_IN_POWER: sprintf(name, "PSU3_IN_POWER"); break; case PSU3_SENSOR_12V_POWER: sprintf(name, "PSU3_12V_POWER"); break; case PSU3_SENSOR_STBY_POWER: sprintf(name, "PSU3_STBY_POWER"); break; case PSU3_SENSOR_FAN_TACH: sprintf(name, "PSU3_FAN_SPEED"); break; case PSU3_SENSOR_TEMP1: sprintf(name, "PSU3_TEMP1"); break; case PSU3_SENSOR_TEMP2: sprintf(name, "PSU3_TEMP2"); break; case PSU3_SENSOR_TEMP3: sprintf(name, "PSU3_TEMP3"); break; case PSU4_SENSOR_IN_VOLT: sprintf(name, "PSU4_IN_VOLT"); break; case PSU4_SENSOR_12V_VOLT: sprintf(name, "PSU4_12V_VOLT"); break; case PSU4_SENSOR_STBY_VOLT: sprintf(name, "PSU4_STBY_VOLT"); break; case PSU4_SENSOR_IN_CURR: sprintf(name, "PSU4_IN_CURR"); break; case PSU4_SENSOR_12V_CURR: sprintf(name, "PSU4_12V_CURR"); break; case PSU4_SENSOR_STBY_CURR: sprintf(name, "PSU4_STBY_CURR"); break; case PSU4_SENSOR_IN_POWER: sprintf(name, "PSU4_IN_POWER"); break; case PSU4_SENSOR_12V_POWER: sprintf(name, "PSU4_12V_POWER"); break; case PSU4_SENSOR_STBY_POWER: sprintf(name, "PSU4_STBY_POWER"); break; case PSU4_SENSOR_FAN_TACH: sprintf(name, "PSU4_FAN_SPEED"); break; case PSU4_SENSOR_TEMP1: sprintf(name, "PSU4_TEMP1"); break; case PSU4_SENSOR_TEMP2: sprintf(name, "PSU4_TEMP2"); break; case PSU4_SENSOR_TEMP3: sprintf(name, "PSU4_TEMP3"); break; default: return -1; } return 0; } int pal_get_sensor_name(uint8_t fru, uint8_t sensor_num, char *name) { int ret = -1; switch(fru) { case FRU_SCM: ret = get_scm_sensor_name(sensor_num, name); break; case FRU_SMB: ret = get_smb_sensor_name(sensor_num, name); break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: ret = get_pim_sensor_name(sensor_num, name); break; case FRU_PSU1: case FRU_PSU2: case FRU_PSU3: case FRU_PSU4: ret = get_psu_sensor_name(sensor_num, name); break; default: return -1; } return ret; } static int get_scm_sensor_units(uint8_t sensor_num, char *units) { switch(sensor_num) { case SCM_SENSOR_OUTLET_LOCAL_TEMP: case SCM_SENSOR_OUTLET_REMOTE_TEMP: case SCM_SENSOR_INLET_LOCAL_TEMP: case SCM_SENSOR_INLET_REMOTE_TEMP: case BIC_SENSOR_MB_OUTLET_TEMP: case BIC_SENSOR_MB_INLET_TEMP: case BIC_SENSOR_PCH_TEMP: case BIC_SENSOR_VCCIN_VR_TEMP: case BIC_SENSOR_1V05MIX_VR_TEMP: case BIC_SENSOR_SOC_TEMP: case BIC_SENSOR_SOC_THERM_MARGIN: case BIC_SENSOR_VDDR_VR_TEMP: case BIC_SENSOR_SOC_DIMMA0_TEMP: case BIC_SENSOR_SOC_DIMMB0_TEMP: case BIC_SENSOR_SOC_TJMAX: sprintf(units, "C"); break; case SCM_SENSOR_HSC_VOLT: case BIC_SENSOR_P3V3_MB: case BIC_SENSOR_P12V_MB: case BIC_SENSOR_P1V05_PCH: case BIC_SENSOR_P3V3_STBY_MB: case BIC_SENSOR_P5V_STBY_MB: case BIC_SENSOR_PV_BAT: case BIC_SENSOR_PVDDR: case BIC_SENSOR_P1V05_MIX: case BIC_SENSOR_VCCIN_VR_VOL: case BIC_SENSOR_VDDR_VR_VOL: case BIC_SENSOR_P1V05MIX_VR_VOL: case BIC_SENSOR_INA230_VOL: sprintf(units, "Volts"); break; case SCM_SENSOR_HSC_CURR: case BIC_SENSOR_1V05MIX_VR_CURR: case BIC_SENSOR_VDDR_VR_CURR: case BIC_SENSOR_VCCIN_VR_CURR: sprintf(units, "Amps"); break; case SCM_SENSOR_HSC_POWER: case BIC_SENSOR_SOC_PACKAGE_PWR: case BIC_SENSOR_VCCIN_VR_POUT: case BIC_SENSOR_VDDR_VR_POUT: case BIC_SENSOR_P1V05MIX_VR_POUT: case BIC_SENSOR_INA230_POWER: sprintf(units, "Watts"); break; default: return -1; } return 0; } static int get_smb_sensor_units(uint8_t sensor_num, char *units) { switch(sensor_num) { case SMB_SENSOR_TH3_SERDES_TEMP: case SMB_SENSOR_TH3_CORE_TEMP: case SMB_SENSOR_TEMP1: case SMB_SENSOR_TEMP2: case SMB_SENSOR_TEMP3: case SMB_SENSOR_TEMP4: case SMB_SENSOR_TEMP5: case SMB_SENSOR_TH3_DIE_TEMP1: case SMB_SENSOR_TH3_DIE_TEMP2: case SMB_SENSOR_PDB_L_TEMP1: case SMB_SENSOR_PDB_L_TEMP2: case SMB_SENSOR_PDB_R_TEMP1: case SMB_SENSOR_PDB_R_TEMP2: case SMB_SENSOR_FCM_T_TEMP1: case SMB_SENSOR_FCM_T_TEMP2: case SMB_SENSOR_FCM_B_TEMP1: case SMB_SENSOR_FCM_B_TEMP2: sprintf(units, "C"); break; case SMB_SENSOR_1220_VMON1: case SMB_SENSOR_1220_VMON2: case SMB_SENSOR_1220_VMON3: case SMB_SENSOR_1220_VMON4: case SMB_SENSOR_1220_VMON5: case SMB_SENSOR_1220_VMON6: case SMB_SENSOR_1220_VMON7: case SMB_SENSOR_1220_VMON8: case SMB_SENSOR_1220_VMON9: case SMB_SENSOR_1220_VMON10: case SMB_SENSOR_1220_VMON11: case SMB_SENSOR_1220_VMON12: case SMB_SENSOR_1220_VCCA: case SMB_SENSOR_1220_VCCINP: case SMB_SENSOR_TH3_SERDES_VOLT: case SMB_SENSOR_TH3_CORE_VOLT: case SMB_SENSOR_FCM_T_HSC_VOLT: case SMB_SENSOR_FCM_B_HSC_VOLT: sprintf(units, "Volts"); break; case SMB_SENSOR_TH3_SERDES_CURR: case SMB_SENSOR_TH3_CORE_CURR: case SMB_SENSOR_FCM_T_HSC_CURR: case SMB_SENSOR_FCM_B_HSC_CURR: sprintf(units, "Amps"); break; case SMB_SENSOR_FCM_T_HSC_POWER: case SMB_SENSOR_FCM_B_HSC_POWER: sprintf(units, "Watts"); break; case SMB_SENSOR_FAN1_FRONT_TACH: case SMB_SENSOR_FAN1_REAR_TACH: case SMB_SENSOR_FAN2_FRONT_TACH: case SMB_SENSOR_FAN2_REAR_TACH: case SMB_SENSOR_FAN3_FRONT_TACH: case SMB_SENSOR_FAN3_REAR_TACH: case SMB_SENSOR_FAN4_FRONT_TACH: case SMB_SENSOR_FAN4_REAR_TACH: case SMB_SENSOR_FAN5_FRONT_TACH: case SMB_SENSOR_FAN5_REAR_TACH: case SMB_SENSOR_FAN6_FRONT_TACH: case SMB_SENSOR_FAN6_REAR_TACH: case SMB_SENSOR_FAN7_FRONT_TACH: case SMB_SENSOR_FAN7_REAR_TACH: case SMB_SENSOR_FAN8_FRONT_TACH: case SMB_SENSOR_FAN8_REAR_TACH: sprintf(units, "RPM"); break; default: return -1; } return 0; } static int get_pim_sensor_units(uint8_t sensor_num, char *units) { switch(sensor_num) { case PIM1_SENSOR_TEMP1: case PIM1_SENSOR_TEMP2: case PIM2_SENSOR_TEMP1: case PIM2_SENSOR_TEMP2: case PIM3_SENSOR_TEMP1: case PIM3_SENSOR_TEMP2: case PIM4_SENSOR_TEMP1: case PIM4_SENSOR_TEMP2: case PIM5_SENSOR_TEMP1: case PIM5_SENSOR_TEMP2: case PIM6_SENSOR_TEMP1: case PIM6_SENSOR_TEMP2: case PIM7_SENSOR_TEMP1: case PIM7_SENSOR_TEMP2: case PIM8_SENSOR_TEMP1: case PIM8_SENSOR_TEMP2: case PIM1_SENSOR_QSFP_TEMP: case PIM2_SENSOR_QSFP_TEMP: case PIM3_SENSOR_QSFP_TEMP: case PIM4_SENSOR_QSFP_TEMP: case PIM5_SENSOR_QSFP_TEMP: case PIM6_SENSOR_QSFP_TEMP: case PIM7_SENSOR_QSFP_TEMP: case PIM8_SENSOR_QSFP_TEMP: sprintf(units, "C"); break; case PIM1_SENSOR_HSC_CURR: case PIM2_SENSOR_HSC_CURR: case PIM3_SENSOR_HSC_CURR: case PIM4_SENSOR_HSC_CURR: case PIM5_SENSOR_HSC_CURR: case PIM6_SENSOR_HSC_CURR: case PIM7_SENSOR_HSC_CURR: case PIM8_SENSOR_HSC_CURR: sprintf(units, "Amps"); break; case PIM1_SENSOR_HSC_POWER: case PIM2_SENSOR_HSC_POWER: case PIM3_SENSOR_HSC_POWER: case PIM4_SENSOR_HSC_POWER: case PIM5_SENSOR_HSC_POWER: case PIM6_SENSOR_HSC_POWER: case PIM7_SENSOR_HSC_POWER: case PIM8_SENSOR_HSC_POWER: sprintf(units, "Watts"); break; case PIM1_SENSOR_HSC_VOLT: case PIM2_SENSOR_HSC_VOLT: case PIM3_SENSOR_HSC_VOLT: case PIM4_SENSOR_HSC_VOLT: case PIM5_SENSOR_HSC_VOLT: case PIM6_SENSOR_HSC_VOLT: case PIM7_SENSOR_HSC_VOLT: case PIM8_SENSOR_HSC_VOLT: case PIM1_SENSOR_34461_VOLT1: case PIM1_SENSOR_34461_VOLT2: case PIM1_SENSOR_34461_VOLT3: case PIM1_SENSOR_34461_VOLT4: case PIM1_SENSOR_34461_VOLT5: case PIM1_SENSOR_34461_VOLT6: case PIM1_SENSOR_34461_VOLT7: case PIM1_SENSOR_34461_VOLT8: case PIM1_SENSOR_34461_VOLT9: case PIM1_SENSOR_34461_VOLT10: case PIM1_SENSOR_34461_VOLT11: case PIM1_SENSOR_34461_VOLT12: case PIM1_SENSOR_34461_VOLT13: case PIM1_SENSOR_34461_VOLT14: case PIM1_SENSOR_34461_VOLT15: case PIM1_SENSOR_34461_VOLT16: case PIM2_SENSOR_34461_VOLT1: case PIM2_SENSOR_34461_VOLT2: case PIM2_SENSOR_34461_VOLT3: case PIM2_SENSOR_34461_VOLT4: case PIM2_SENSOR_34461_VOLT5: case PIM2_SENSOR_34461_VOLT6: case PIM2_SENSOR_34461_VOLT7: case PIM2_SENSOR_34461_VOLT8: case PIM2_SENSOR_34461_VOLT9: case PIM2_SENSOR_34461_VOLT10: case PIM2_SENSOR_34461_VOLT11: case PIM2_SENSOR_34461_VOLT12: case PIM2_SENSOR_34461_VOLT13: case PIM2_SENSOR_34461_VOLT14: case PIM2_SENSOR_34461_VOLT15: case PIM2_SENSOR_34461_VOLT16: case PIM3_SENSOR_34461_VOLT1: case PIM3_SENSOR_34461_VOLT2: case PIM3_SENSOR_34461_VOLT3: case PIM3_SENSOR_34461_VOLT4: case PIM3_SENSOR_34461_VOLT5: case PIM3_SENSOR_34461_VOLT6: case PIM3_SENSOR_34461_VOLT7: case PIM3_SENSOR_34461_VOLT8: case PIM3_SENSOR_34461_VOLT9: case PIM3_SENSOR_34461_VOLT10: case PIM3_SENSOR_34461_VOLT11: case PIM3_SENSOR_34461_VOLT12: case PIM3_SENSOR_34461_VOLT13: case PIM3_SENSOR_34461_VOLT14: case PIM3_SENSOR_34461_VOLT15: case PIM3_SENSOR_34461_VOLT16: case PIM4_SENSOR_34461_VOLT1: case PIM4_SENSOR_34461_VOLT2: case PIM4_SENSOR_34461_VOLT3: case PIM4_SENSOR_34461_VOLT4: case PIM4_SENSOR_34461_VOLT5: case PIM4_SENSOR_34461_VOLT6: case PIM4_SENSOR_34461_VOLT7: case PIM4_SENSOR_34461_VOLT8: case PIM4_SENSOR_34461_VOLT9: case PIM4_SENSOR_34461_VOLT10: case PIM4_SENSOR_34461_VOLT11: case PIM4_SENSOR_34461_VOLT12: case PIM4_SENSOR_34461_VOLT13: case PIM4_SENSOR_34461_VOLT14: case PIM4_SENSOR_34461_VOLT15: case PIM4_SENSOR_34461_VOLT16: case PIM5_SENSOR_34461_VOLT1: case PIM5_SENSOR_34461_VOLT2: case PIM5_SENSOR_34461_VOLT3: case PIM5_SENSOR_34461_VOLT4: case PIM5_SENSOR_34461_VOLT5: case PIM5_SENSOR_34461_VOLT6: case PIM5_SENSOR_34461_VOLT7: case PIM5_SENSOR_34461_VOLT8: case PIM5_SENSOR_34461_VOLT9: case PIM5_SENSOR_34461_VOLT10: case PIM5_SENSOR_34461_VOLT11: case PIM5_SENSOR_34461_VOLT12: case PIM5_SENSOR_34461_VOLT13: case PIM5_SENSOR_34461_VOLT14: case PIM5_SENSOR_34461_VOLT15: case PIM5_SENSOR_34461_VOLT16: case PIM6_SENSOR_34461_VOLT1: case PIM6_SENSOR_34461_VOLT2: case PIM6_SENSOR_34461_VOLT3: case PIM6_SENSOR_34461_VOLT4: case PIM6_SENSOR_34461_VOLT5: case PIM6_SENSOR_34461_VOLT6: case PIM6_SENSOR_34461_VOLT7: case PIM6_SENSOR_34461_VOLT8: case PIM6_SENSOR_34461_VOLT9: case PIM6_SENSOR_34461_VOLT10: case PIM6_SENSOR_34461_VOLT11: case PIM6_SENSOR_34461_VOLT12: case PIM6_SENSOR_34461_VOLT13: case PIM6_SENSOR_34461_VOLT14: case PIM6_SENSOR_34461_VOLT15: case PIM6_SENSOR_34461_VOLT16: case PIM7_SENSOR_34461_VOLT1: case PIM7_SENSOR_34461_VOLT2: case PIM7_SENSOR_34461_VOLT3: case PIM7_SENSOR_34461_VOLT4: case PIM7_SENSOR_34461_VOLT5: case PIM7_SENSOR_34461_VOLT6: case PIM7_SENSOR_34461_VOLT7: case PIM7_SENSOR_34461_VOLT8: case PIM7_SENSOR_34461_VOLT9: case PIM7_SENSOR_34461_VOLT10: case PIM7_SENSOR_34461_VOLT11: case PIM7_SENSOR_34461_VOLT12: case PIM7_SENSOR_34461_VOLT13: case PIM7_SENSOR_34461_VOLT14: case PIM7_SENSOR_34461_VOLT15: case PIM7_SENSOR_34461_VOLT16: case PIM8_SENSOR_34461_VOLT1: case PIM8_SENSOR_34461_VOLT2: case PIM8_SENSOR_34461_VOLT3: case PIM8_SENSOR_34461_VOLT4: case PIM8_SENSOR_34461_VOLT5: case PIM8_SENSOR_34461_VOLT6: case PIM8_SENSOR_34461_VOLT7: case PIM8_SENSOR_34461_VOLT8: case PIM8_SENSOR_34461_VOLT9: case PIM8_SENSOR_34461_VOLT10: case PIM8_SENSOR_34461_VOLT11: case PIM8_SENSOR_34461_VOLT12: case PIM8_SENSOR_34461_VOLT13: case PIM8_SENSOR_34461_VOLT14: case PIM8_SENSOR_34461_VOLT15: case PIM8_SENSOR_34461_VOLT16: sprintf(units, "Volts"); break; default: return -1; } return 0; } static int get_psu_sensor_units(uint8_t sensor_num, char *units) { switch(sensor_num) { case PSU1_SENSOR_IN_VOLT: case PSU1_SENSOR_12V_VOLT: case PSU1_SENSOR_STBY_VOLT: case PSU2_SENSOR_IN_VOLT: case PSU2_SENSOR_12V_VOLT: case PSU2_SENSOR_STBY_VOLT: case PSU3_SENSOR_IN_VOLT: case PSU3_SENSOR_12V_VOLT: case PSU3_SENSOR_STBY_VOLT: case PSU4_SENSOR_IN_VOLT: case PSU4_SENSOR_12V_VOLT: case PSU4_SENSOR_STBY_VOLT: sprintf(units, "Volts"); break; case PSU1_SENSOR_IN_CURR: case PSU1_SENSOR_12V_CURR: case PSU1_SENSOR_STBY_CURR: case PSU2_SENSOR_IN_CURR: case PSU2_SENSOR_12V_CURR: case PSU2_SENSOR_STBY_CURR: case PSU3_SENSOR_IN_CURR: case PSU3_SENSOR_12V_CURR: case PSU3_SENSOR_STBY_CURR: case PSU4_SENSOR_IN_CURR: case PSU4_SENSOR_12V_CURR: case PSU4_SENSOR_STBY_CURR: sprintf(units, "Amps"); break; case PSU1_SENSOR_IN_POWER: case PSU1_SENSOR_12V_POWER: case PSU1_SENSOR_STBY_POWER: case PSU2_SENSOR_IN_POWER: case PSU2_SENSOR_12V_POWER: case PSU2_SENSOR_STBY_POWER: case PSU3_SENSOR_IN_POWER: case PSU3_SENSOR_12V_POWER: case PSU3_SENSOR_STBY_POWER: case PSU4_SENSOR_IN_POWER: case PSU4_SENSOR_12V_POWER: case PSU4_SENSOR_STBY_POWER: sprintf(units, "Watts"); break; case PSU1_SENSOR_FAN_TACH: case PSU2_SENSOR_FAN_TACH: case PSU3_SENSOR_FAN_TACH: case PSU4_SENSOR_FAN_TACH: sprintf(units, "RPM"); break; case PSU1_SENSOR_TEMP1: case PSU1_SENSOR_TEMP2: case PSU1_SENSOR_TEMP3: case PSU2_SENSOR_TEMP1: case PSU2_SENSOR_TEMP2: case PSU2_SENSOR_TEMP3: case PSU3_SENSOR_TEMP1: case PSU3_SENSOR_TEMP2: case PSU3_SENSOR_TEMP3: case PSU4_SENSOR_TEMP1: case PSU4_SENSOR_TEMP2: case PSU4_SENSOR_TEMP3: sprintf(units, "C"); break; default: return -1; } return 0; } int pal_get_sensor_units(uint8_t fru, uint8_t sensor_num, char *units) { int ret = -1; switch(fru) { case FRU_SCM: ret = get_scm_sensor_units(sensor_num, units); break; case FRU_SMB: ret = get_smb_sensor_units(sensor_num, units); break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: ret = get_pim_sensor_units(sensor_num, units); break; case FRU_PSU1: case FRU_PSU2: case FRU_PSU3: case FRU_PSU4: ret = get_psu_sensor_units(sensor_num, units); break; default: return -1; } return ret; } static void sensor_thresh_array_init(uint8_t fru) { static bool init_done[MAX_NUM_FRUS] = {false}; int i = 0, j; float fvalue; if (init_done[fru]) return; switch (fru) { case FRU_SCM: scm_sensor_threshold[SCM_SENSOR_OUTLET_LOCAL_TEMP][UCR_THRESH] = 53; scm_sensor_threshold[SCM_SENSOR_OUTLET_REMOTE_TEMP][UCR_THRESH] = 53; scm_sensor_threshold[SCM_SENSOR_INLET_LOCAL_TEMP][UCR_THRESH] = 50; scm_sensor_threshold[SCM_SENSOR_INLET_REMOTE_TEMP][UCR_THRESH] = 50; scm_sensor_threshold[SCM_SENSOR_HSC_VOLT][UCR_THRESH] = 12.6; scm_sensor_threshold[SCM_SENSOR_HSC_VOLT][LCR_THRESH] = 11.4; scm_sensor_threshold[SCM_SENSOR_HSC_CURR][UCR_THRESH] = 5.8; scm_sensor_threshold[SCM_SENSOR_HSC_POWER][UCR_THRESH] = 70; for (i = scm_sensor_cnt; i < scm_all_sensor_cnt; i++) { for (j = 1; j <= MAX_SENSOR_THRESHOLD; j++) { if (!bic_get_sdr_thresh_val(fru, scm_all_sensor_list[i], j, &fvalue)){ scm_sensor_threshold[scm_all_sensor_list[i]][j] = fvalue; } else { /* Error case, if get BIC data retry more than 30 times(30s), * it means BIC get wrong, skip init BIC threshold value */ goto scm_thresh_done; } } } scm_thresh_done: kv_set(SCM_INIT_THRESH_STATUS, "done", 0, 0); break; case FRU_SMB: smb_sensor_threshold[SMB_SENSOR_1220_VMON1][UCR_THRESH] = 4.32; smb_sensor_threshold[SMB_SENSOR_1220_VMON1][LCR_THRESH] = 3.68; smb_sensor_threshold[SMB_SENSOR_1220_VMON2][UCR_THRESH] = 3.564; smb_sensor_threshold[SMB_SENSOR_1220_VMON2][LCR_THRESH] = 3.036; smb_sensor_threshold[SMB_SENSOR_1220_VMON3][UCR_THRESH] = 5.4; smb_sensor_threshold[SMB_SENSOR_1220_VMON3][LCR_THRESH] = 4.6; smb_sensor_threshold[SMB_SENSOR_1220_VMON4][UCR_THRESH] = 3.564; smb_sensor_threshold[SMB_SENSOR_1220_VMON4][LCR_THRESH] = 3.036; smb_sensor_threshold[SMB_SENSOR_1220_VMON5][UCR_THRESH] = 2.7; smb_sensor_threshold[SMB_SENSOR_1220_VMON5][LCR_THRESH] = 2.3; smb_sensor_threshold[SMB_SENSOR_1220_VMON6][UCR_THRESH] = 1.296; smb_sensor_threshold[SMB_SENSOR_1220_VMON6][LCR_THRESH] = 1.104; smb_sensor_threshold[SMB_SENSOR_1220_VMON7][UCR_THRESH] = 1.296; smb_sensor_threshold[SMB_SENSOR_1220_VMON7][LCR_THRESH] = 1.104; smb_sensor_threshold[SMB_SENSOR_1220_VMON8][UCR_THRESH] = 3.564; smb_sensor_threshold[SMB_SENSOR_1220_VMON8][LCR_THRESH] = 3.036; smb_sensor_threshold[SMB_SENSOR_1220_VMON9][UCR_THRESH] = 0.927; smb_sensor_threshold[SMB_SENSOR_1220_VMON9][LCR_THRESH] = 0.727; smb_sensor_threshold[SMB_SENSOR_1220_VMON10][UCR_THRESH] = 0.927; smb_sensor_threshold[SMB_SENSOR_1220_VMON10][LCR_THRESH] = 0.736; smb_sensor_threshold[SMB_SENSOR_1220_VMON11][UCR_THRESH] = 1.944; smb_sensor_threshold[SMB_SENSOR_1220_VMON11][LCR_THRESH] = 1.656; smb_sensor_threshold[SMB_SENSOR_1220_VMON12][UCR_THRESH] = 1.296; smb_sensor_threshold[SMB_SENSOR_1220_VMON12][LCR_THRESH] = 1.104; smb_sensor_threshold[SMB_SENSOR_1220_VCCA][UCR_THRESH] = 3.564; smb_sensor_threshold[SMB_SENSOR_1220_VCCA][LCR_THRESH] = 3.036; smb_sensor_threshold[SMB_SENSOR_1220_VCCINP][UCR_THRESH] = 3.564; smb_sensor_threshold[SMB_SENSOR_1220_VCCINP][LCR_THRESH] = 3.036; smb_sensor_threshold[SMB_SENSOR_TH3_SERDES_VOLT][UCR_THRESH] = 0.927; smb_sensor_threshold[SMB_SENSOR_TH3_SERDES_VOLT][LCR_THRESH] = 0.736; smb_sensor_threshold[SMB_SENSOR_TH3_SERDES_CURR][UCR_THRESH] = 80; smb_sensor_threshold[SMB_SENSOR_TH3_SERDES_TEMP][UCR_THRESH] = 90; smb_sensor_threshold[SMB_SENSOR_TH3_CORE_VOLT][UCR_THRESH] = 0.927; smb_sensor_threshold[SMB_SENSOR_TH3_CORE_VOLT][LCR_THRESH] = 0.727; smb_sensor_threshold[SMB_SENSOR_TH3_CORE_CURR][UCR_THRESH] = 300; smb_sensor_threshold[SMB_SENSOR_TH3_CORE_TEMP][UCR_THRESH] = 90; smb_sensor_threshold[SMB_SENSOR_TEMP1][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_TEMP2][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_TEMP3][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_TEMP4][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_TEMP5][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_TH3_DIE_TEMP1][UCR_THRESH] = 105; smb_sensor_threshold[SMB_SENSOR_TH3_DIE_TEMP2][UCR_THRESH] = 105; smb_sensor_threshold[SMB_SENSOR_PDB_L_TEMP1][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_PDB_L_TEMP2][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_PDB_R_TEMP1][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_PDB_R_TEMP2][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_FCM_T_TEMP1][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_FCM_T_TEMP2][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_FCM_B_TEMP1][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_FCM_B_TEMP2][UCR_THRESH] = 70; smb_sensor_threshold[SMB_SENSOR_FCM_T_HSC_VOLT][UCR_THRESH] = 12.6; smb_sensor_threshold[SMB_SENSOR_FCM_T_HSC_VOLT][LCR_THRESH] = 11.4; smb_sensor_threshold[SMB_SENSOR_FCM_T_HSC_CURR][UCR_THRESH] = 29; smb_sensor_threshold[SMB_SENSOR_FCM_T_HSC_POWER][UCR_THRESH] = 350; smb_sensor_threshold[SMB_SENSOR_FCM_B_HSC_VOLT][UCR_THRESH] = 12.6; smb_sensor_threshold[SMB_SENSOR_FCM_B_HSC_VOLT][LCR_THRESH] = 11.4; smb_sensor_threshold[SMB_SENSOR_FCM_B_HSC_CURR][UCR_THRESH] = 29; smb_sensor_threshold[SMB_SENSOR_FCM_B_HSC_POWER][UCR_THRESH] = 350; smb_sensor_threshold[SMB_SENSOR_FAN1_FRONT_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN1_FRONT_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN1_REAR_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN1_REAR_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN2_FRONT_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN2_FRONT_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN2_REAR_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN2_REAR_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN3_FRONT_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN3_FRONT_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN3_REAR_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN3_REAR_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN4_FRONT_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN4_FRONT_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN4_REAR_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN4_REAR_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN5_FRONT_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN5_FRONT_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN5_REAR_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN5_REAR_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN6_FRONT_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN6_FRONT_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN6_REAR_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN6_REAR_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN7_FRONT_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN7_FRONT_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN7_REAR_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN7_REAR_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN8_FRONT_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN8_FRONT_TACH][LCR_THRESH] = 800; smb_sensor_threshold[SMB_SENSOR_FAN8_REAR_TACH][UCR_THRESH] = 12000; smb_sensor_threshold[SMB_SENSOR_FAN8_REAR_TACH][LCR_THRESH] = 800; break; case FRU_PSU1: case FRU_PSU2: case FRU_PSU3: case FRU_PSU4: i = fru - 11; psu_sensor_threshold[PSU1_SENSOR_IN_VOLT+(i*0x0d)][UCR_THRESH] = 310; psu_sensor_threshold[PSU1_SENSOR_IN_VOLT+(i*0x0d)][LCR_THRESH] = 92; psu_sensor_threshold[PSU1_SENSOR_12V_VOLT+(i*0x0d)][UCR_THRESH] = 13; psu_sensor_threshold[PSU1_SENSOR_12V_VOLT+(i*0x0d)][LCR_THRESH] = 11; psu_sensor_threshold[PSU1_SENSOR_STBY_VOLT+(i*0x0d)][UCR_THRESH] = 3.6; psu_sensor_threshold[PSU1_SENSOR_STBY_VOLT+(i*0x0d)][LCR_THRESH] = 3.0; psu_sensor_threshold[PSU1_SENSOR_IN_CURR+(i*0x0d)][UCR_THRESH] = 10; psu_sensor_threshold[PSU1_SENSOR_12V_CURR+(i*0x0d)][UCR_THRESH] = 125; psu_sensor_threshold[PSU1_SENSOR_STBY_CURR+(i*0x0d)][UCR_THRESH] = 5; psu_sensor_threshold[PSU1_SENSOR_IN_POWER+(i*0x0d)][UCR_THRESH] = 1500; psu_sensor_threshold[PSU1_SENSOR_12V_POWER+(i*0x0d)][UCR_THRESH] = 1500; psu_sensor_threshold[PSU1_SENSOR_STBY_POWER+(i*0x0d)][UCR_THRESH] = 15; psu_sensor_threshold[PSU1_SENSOR_FAN_TACH+(i*0x0d)][LCR_THRESH] = 500; psu_sensor_threshold[PSU1_SENSOR_TEMP1+(i*0x0d)][UCR_THRESH] = 60; psu_sensor_threshold[PSU1_SENSOR_TEMP2+(i*0x0d)][UCR_THRESH] = 80; psu_sensor_threshold[PSU1_SENSOR_TEMP3+(i*0x0d)][UCR_THRESH] = 95; break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: pim_thresh_array_init(fru); break; } init_done[fru] = true; } int pal_get_sensor_threshold(uint8_t fru, uint8_t sensor_num, uint8_t thresh, void *value) { float *val = (float*) value; sensor_thresh_array_init(fru); switch(fru) { case FRU_SCM: *val = scm_sensor_threshold[sensor_num][thresh]; break; case FRU_SMB: *val = smb_sensor_threshold[sensor_num][thresh]; break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: *val = pim_sensor_threshold[sensor_num][thresh]; break; case FRU_PSU1: case FRU_PSU2: case FRU_PSU3: case FRU_PSU4: *val = psu_sensor_threshold[sensor_num][thresh]; break; default: return -1; } return 0; } int pal_get_fw_info(uint8_t fru, unsigned char target, unsigned char* res, unsigned char* res_len) { return -1; } static sensor_desc_t * get_sensor_desc(uint8_t fru, uint8_t snr_num) { if (fru < 1 || fru > MAX_NUM_FRUS) { syslog(LOG_WARNING, "get_sensor_desc: Wrong FRU ID %d\n", fru); return NULL; } return &m_snr_desc[fru-1][snr_num]; } static int _set_pim_sts_led(uint8_t fru, uint8_t color) { char path[LARGEST_DEVICE_NAME]; uint8_t bus = 80 + ((fru - 3) * 8); snprintf(path, LARGEST_DEVICE_NAME, I2C_SYSFS_DEVICES"/%d-0060/system_led", bus); if(color == FPGA_STS_CLR_BLUE) write_device(path, "1"); else if(color == FPGA_STS_CLR_YELLOW) write_device(path, "0"); return 0; } void pal_set_pim_sts_led(uint8_t fru) { int val; char tmp[LARGEST_DEVICE_NAME]; char path[LARGEST_DEVICE_NAME + 1]; snprintf(tmp, LARGEST_DEVICE_NAME, KV_PATH, KV_PIM_HEALTH); /* FRU_PIM1 = 3, FRU_PIM2 = 4, ...., FRU_PIM8 = 10 */ /* KV_PIM1 = 1, KV_PIM2 = 2, ...., KV_PIM8 = 8 */ snprintf(path, LARGEST_DEVICE_NAME, tmp, fru - 2); if(read_device(path, &val)) { syslog(LOG_ERR, "%s cannot get value from %s", __func__, path); return; } if(val) _set_pim_sts_led(fru, FPGA_STS_CLR_BLUE); else _set_pim_sts_led(fru, FPGA_STS_CLR_YELLOW); return; } void pal_sensor_assert_handle(uint8_t fru, uint8_t snr_num, float val, uint8_t thresh) { char crisel[128]; char thresh_name[10]; sensor_desc_t *snr_desc; switch (thresh) { case UNR_THRESH: sprintf(thresh_name, "UNR"); break; case UCR_THRESH: sprintf(thresh_name, "UCR"); break; case UNC_THRESH: sprintf(thresh_name, "UNCR"); break; case LNR_THRESH: sprintf(thresh_name, "LNR"); break; case LCR_THRESH: sprintf(thresh_name, "LCR"); break; case LNC_THRESH: sprintf(thresh_name, "LNCR"); break; default: syslog(LOG_WARNING, "pal_sensor_assert_handle: wrong thresh enum value"); exit(-1); } switch (fru) { case FRU_SCM: switch(snr_num) { case SCM_SENSOR_INLET_REMOTE_TEMP: snr_desc = get_sensor_desc(fru, snr_num); snprintf(crisel, sizeof(crisel), "%s %s %.2fV - ASSERT,FRU:%u", snr_desc->name, thresh_name, val, fru); break; default: return; } break; case FRU_SMB: switch(snr_num) { case SMB_SENSOR_TH3_DIE_TEMP1: case SMB_SENSOR_TH3_DIE_TEMP2: snr_desc = get_sensor_desc(fru, snr_num); snprintf(crisel, sizeof(crisel), "%s %s %.2fV - ASSERT,FRU:%u", snr_desc->name, thresh_name, val, fru); break; default: return; } break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: switch(snr_num) { case PIM1_SENSOR_QSFP_TEMP: case PIM2_SENSOR_QSFP_TEMP: case PIM3_SENSOR_QSFP_TEMP: case PIM4_SENSOR_QSFP_TEMP: case PIM5_SENSOR_QSFP_TEMP: case PIM6_SENSOR_QSFP_TEMP: case PIM7_SENSOR_QSFP_TEMP: case PIM8_SENSOR_QSFP_TEMP: snr_desc = get_sensor_desc(fru, snr_num); snprintf(crisel, sizeof(crisel), "%s %s %.2fV - ASSERT,FRU:%u", snr_desc->name, thresh_name, val, fru); break; default: return; } break; default: return; } pal_add_cri_sel(crisel); return; } void pal_sensor_deassert_handle(uint8_t fru, uint8_t snr_num, float val, uint8_t thresh) { char crisel[128]; char thresh_name[8]; sensor_desc_t *snr_desc; switch (thresh) { case UNR_THRESH: sprintf(thresh_name, "UNR"); break; case UCR_THRESH: sprintf(thresh_name, "UCR"); break; case UNC_THRESH: sprintf(thresh_name, "UNCR"); break; case LNR_THRESH: sprintf(thresh_name, "LNR"); break; case LCR_THRESH: sprintf(thresh_name, "LCR"); break; case LNC_THRESH: sprintf(thresh_name, "LNCR"); break; default: syslog(LOG_WARNING, "pal_sensor_deassert_handle: wrong thresh enum value"); return; } switch (fru) { case FRU_SCM: switch (snr_num) { case SCM_SENSOR_INLET_REMOTE_TEMP: snr_desc = get_sensor_desc(FRU_SCM, snr_num); snprintf(crisel, sizeof(crisel), "%s %s %.2fV - DEASSERT,FRU:%u", snr_desc->name, thresh_name, val, fru); break; default: return; } case FRU_SMB: switch(snr_num) { case SMB_SENSOR_TH3_DIE_TEMP1: case SMB_SENSOR_TH3_DIE_TEMP2: snr_desc = get_sensor_desc(fru, snr_num); snprintf(crisel, sizeof(crisel), "%s %s %.2fV - DEASSERT,FRU:%u", snr_desc->name, thresh_name, val, fru); break; default: return; } break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: switch(snr_num) { case PIM1_SENSOR_QSFP_TEMP: case PIM2_SENSOR_QSFP_TEMP: case PIM3_SENSOR_QSFP_TEMP: case PIM4_SENSOR_QSFP_TEMP: case PIM5_SENSOR_QSFP_TEMP: case PIM6_SENSOR_QSFP_TEMP: case PIM7_SENSOR_QSFP_TEMP: case PIM8_SENSOR_QSFP_TEMP: snr_desc = get_sensor_desc(fru, snr_num); snprintf(crisel, sizeof(crisel), "%s %s %.2fV - ASSERT,FRU:%u", snr_desc->name, thresh_name, val, fru); break; default: return; } break; default: return; } pal_add_cri_sel(crisel); return; } int pal_sensor_threshold_flag(uint8_t fru, uint8_t snr_num, uint16_t *flag) { switch(fru) { case FRU_SCM: if (snr_num == BIC_SENSOR_SOC_THERM_MARGIN) *flag = GETMASK(SENSOR_VALID) | GETMASK(UCR_THRESH); else if (snr_num == BIC_SENSOR_SOC_PACKAGE_PWR) *flag = GETMASK(SENSOR_VALID); else if (snr_num == BIC_SENSOR_SOC_TJMAX) *flag = GETMASK(SENSOR_VALID); break; default: break; } return 0; } static void scm_sensor_poll_interval(uint8_t sensor_num, uint32_t *value) { switch(sensor_num) { case SCM_SENSOR_OUTLET_LOCAL_TEMP: case SCM_SENSOR_OUTLET_REMOTE_TEMP: case SCM_SENSOR_INLET_LOCAL_TEMP: *value = 30; break; case SCM_SENSOR_INLET_REMOTE_TEMP: *value = 2; break; case SCM_SENSOR_HSC_VOLT: case SCM_SENSOR_HSC_CURR: case SCM_SENSOR_HSC_POWER: *value = 30; break; default: *value = 30; break; } } static void smb_sensor_poll_interval(uint8_t sensor_num, uint32_t *value) { switch(sensor_num) { case SMB_SENSOR_TH3_SERDES_TEMP: case SMB_SENSOR_TH3_CORE_TEMP: case SMB_SENSOR_TEMP1: case SMB_SENSOR_TEMP2: case SMB_SENSOR_TEMP3: case SMB_SENSOR_TEMP4: case SMB_SENSOR_TEMP5: case SMB_SENSOR_PDB_L_TEMP1: case SMB_SENSOR_PDB_L_TEMP2: case SMB_SENSOR_PDB_R_TEMP1: case SMB_SENSOR_PDB_R_TEMP2: case SMB_SENSOR_FCM_T_TEMP1: case SMB_SENSOR_FCM_T_TEMP2: case SMB_SENSOR_FCM_B_TEMP1: case SMB_SENSOR_FCM_B_TEMP2: *value = 30; break; case SMB_SENSOR_TH3_DIE_TEMP1: case SMB_SENSOR_TH3_DIE_TEMP2: *value = 2; break; case SMB_SENSOR_1220_VMON1: case SMB_SENSOR_1220_VMON2: case SMB_SENSOR_1220_VMON3: case SMB_SENSOR_1220_VMON4: case SMB_SENSOR_1220_VMON5: case SMB_SENSOR_1220_VMON6: case SMB_SENSOR_1220_VMON7: case SMB_SENSOR_1220_VMON8: case SMB_SENSOR_1220_VMON9: case SMB_SENSOR_1220_VMON10: case SMB_SENSOR_1220_VMON11: case SMB_SENSOR_1220_VMON12: case SMB_SENSOR_1220_VCCA: case SMB_SENSOR_1220_VCCINP: case SMB_SENSOR_TH3_SERDES_VOLT: case SMB_SENSOR_TH3_CORE_VOLT: case SMB_SENSOR_FCM_T_HSC_VOLT: case SMB_SENSOR_FCM_B_HSC_VOLT: case SMB_SENSOR_TH3_SERDES_CURR: case SMB_SENSOR_TH3_CORE_CURR: case SMB_SENSOR_FCM_T_HSC_CURR: case SMB_SENSOR_FCM_B_HSC_CURR: case SMB_SENSOR_FCM_T_HSC_POWER: case SMB_SENSOR_FCM_B_HSC_POWER: *value = 30; break; case SMB_SENSOR_FAN1_FRONT_TACH: case SMB_SENSOR_FAN1_REAR_TACH: case SMB_SENSOR_FAN2_FRONT_TACH: case SMB_SENSOR_FAN2_REAR_TACH: case SMB_SENSOR_FAN3_FRONT_TACH: case SMB_SENSOR_FAN3_REAR_TACH: case SMB_SENSOR_FAN4_FRONT_TACH: case SMB_SENSOR_FAN4_REAR_TACH: case SMB_SENSOR_FAN5_FRONT_TACH: case SMB_SENSOR_FAN5_REAR_TACH: case SMB_SENSOR_FAN6_FRONT_TACH: case SMB_SENSOR_FAN6_REAR_TACH: case SMB_SENSOR_FAN7_FRONT_TACH: case SMB_SENSOR_FAN7_REAR_TACH: case SMB_SENSOR_FAN8_FRONT_TACH: case SMB_SENSOR_FAN8_REAR_TACH: *value = 2; break; default: *value = 10; break; } } static void pim_sensor_poll_interval(uint8_t sensor_num, uint32_t *value) { switch(sensor_num) { case PIM1_SENSOR_TEMP1: case PIM1_SENSOR_TEMP2: case PIM1_SENSOR_HSC_VOLT: case PIM1_SENSOR_HSC_CURR: case PIM1_SENSOR_HSC_POWER: *value = 30; break; case PIM1_SENSOR_34461_VOLT1: case PIM1_SENSOR_34461_VOLT2: case PIM1_SENSOR_34461_VOLT3: case PIM1_SENSOR_34461_VOLT4: case PIM1_SENSOR_34461_VOLT5: case PIM1_SENSOR_34461_VOLT6: case PIM1_SENSOR_34461_VOLT7: case PIM1_SENSOR_34461_VOLT8: case PIM1_SENSOR_34461_VOLT9: case PIM1_SENSOR_34461_VOLT10: case PIM1_SENSOR_34461_VOLT11: case PIM1_SENSOR_34461_VOLT12: case PIM1_SENSOR_34461_VOLT13: case PIM1_SENSOR_34461_VOLT14: case PIM1_SENSOR_34461_VOLT15: case PIM1_SENSOR_34461_VOLT16: *value = 60; break; case PIM2_SENSOR_TEMP1: case PIM2_SENSOR_TEMP2: case PIM2_SENSOR_HSC_VOLT: case PIM2_SENSOR_HSC_CURR: case PIM2_SENSOR_HSC_POWER: *value = 30; break; case PIM2_SENSOR_34461_VOLT1: case PIM2_SENSOR_34461_VOLT2: case PIM2_SENSOR_34461_VOLT3: case PIM2_SENSOR_34461_VOLT4: case PIM2_SENSOR_34461_VOLT5: case PIM2_SENSOR_34461_VOLT6: case PIM2_SENSOR_34461_VOLT7: case PIM2_SENSOR_34461_VOLT8: case PIM2_SENSOR_34461_VOLT9: case PIM2_SENSOR_34461_VOLT10: case PIM2_SENSOR_34461_VOLT11: case PIM2_SENSOR_34461_VOLT12: case PIM2_SENSOR_34461_VOLT13: case PIM2_SENSOR_34461_VOLT14: case PIM2_SENSOR_34461_VOLT15: case PIM2_SENSOR_34461_VOLT16: *value = 60; break; case PIM3_SENSOR_TEMP1: case PIM3_SENSOR_TEMP2: case PIM3_SENSOR_HSC_VOLT: case PIM3_SENSOR_HSC_CURR: case PIM3_SENSOR_HSC_POWER: *value = 30; break; case PIM3_SENSOR_34461_VOLT1: case PIM3_SENSOR_34461_VOLT2: case PIM3_SENSOR_34461_VOLT3: case PIM3_SENSOR_34461_VOLT4: case PIM3_SENSOR_34461_VOLT5: case PIM3_SENSOR_34461_VOLT6: case PIM3_SENSOR_34461_VOLT7: case PIM3_SENSOR_34461_VOLT8: case PIM3_SENSOR_34461_VOLT9: case PIM3_SENSOR_34461_VOLT10: case PIM3_SENSOR_34461_VOLT11: case PIM3_SENSOR_34461_VOLT12: case PIM3_SENSOR_34461_VOLT13: case PIM3_SENSOR_34461_VOLT14: case PIM3_SENSOR_34461_VOLT15: case PIM3_SENSOR_34461_VOLT16: *value = 60; break; case PIM4_SENSOR_TEMP1: case PIM4_SENSOR_TEMP2: case PIM4_SENSOR_HSC_VOLT: case PIM4_SENSOR_HSC_CURR: case PIM4_SENSOR_HSC_POWER: *value = 30; break; case PIM4_SENSOR_34461_VOLT1: case PIM4_SENSOR_34461_VOLT2: case PIM4_SENSOR_34461_VOLT3: case PIM4_SENSOR_34461_VOLT4: case PIM4_SENSOR_34461_VOLT5: case PIM4_SENSOR_34461_VOLT6: case PIM4_SENSOR_34461_VOLT7: case PIM4_SENSOR_34461_VOLT8: case PIM4_SENSOR_34461_VOLT9: case PIM4_SENSOR_34461_VOLT10: case PIM4_SENSOR_34461_VOLT11: case PIM4_SENSOR_34461_VOLT12: case PIM4_SENSOR_34461_VOLT13: case PIM4_SENSOR_34461_VOLT14: case PIM4_SENSOR_34461_VOLT15: case PIM4_SENSOR_34461_VOLT16: *value = 60; break; case PIM5_SENSOR_TEMP1: case PIM5_SENSOR_TEMP2: case PIM5_SENSOR_HSC_VOLT: case PIM5_SENSOR_HSC_CURR: case PIM5_SENSOR_HSC_POWER: *value = 30; break; case PIM5_SENSOR_34461_VOLT1: case PIM5_SENSOR_34461_VOLT2: case PIM5_SENSOR_34461_VOLT3: case PIM5_SENSOR_34461_VOLT4: case PIM5_SENSOR_34461_VOLT5: case PIM5_SENSOR_34461_VOLT6: case PIM5_SENSOR_34461_VOLT7: case PIM5_SENSOR_34461_VOLT8: case PIM5_SENSOR_34461_VOLT9: case PIM5_SENSOR_34461_VOLT10: case PIM5_SENSOR_34461_VOLT11: case PIM5_SENSOR_34461_VOLT12: case PIM5_SENSOR_34461_VOLT13: case PIM5_SENSOR_34461_VOLT14: case PIM5_SENSOR_34461_VOLT15: case PIM5_SENSOR_34461_VOLT16: *value = 60; break; case PIM6_SENSOR_TEMP1: case PIM6_SENSOR_TEMP2: case PIM6_SENSOR_HSC_VOLT: case PIM6_SENSOR_HSC_CURR: case PIM6_SENSOR_HSC_POWER: *value = 30; break; case PIM6_SENSOR_34461_VOLT1: case PIM6_SENSOR_34461_VOLT2: case PIM6_SENSOR_34461_VOLT3: case PIM6_SENSOR_34461_VOLT4: case PIM6_SENSOR_34461_VOLT5: case PIM6_SENSOR_34461_VOLT6: case PIM6_SENSOR_34461_VOLT7: case PIM6_SENSOR_34461_VOLT8: case PIM6_SENSOR_34461_VOLT9: case PIM6_SENSOR_34461_VOLT10: case PIM6_SENSOR_34461_VOLT11: case PIM6_SENSOR_34461_VOLT12: case PIM6_SENSOR_34461_VOLT13: case PIM6_SENSOR_34461_VOLT14: case PIM6_SENSOR_34461_VOLT15: case PIM6_SENSOR_34461_VOLT16: *value = 60; break; case PIM7_SENSOR_TEMP1: case PIM7_SENSOR_TEMP2: case PIM7_SENSOR_HSC_VOLT: case PIM7_SENSOR_HSC_CURR: case PIM7_SENSOR_HSC_POWER: *value = 30; break; case PIM7_SENSOR_34461_VOLT1: case PIM7_SENSOR_34461_VOLT2: case PIM7_SENSOR_34461_VOLT3: case PIM7_SENSOR_34461_VOLT4: case PIM7_SENSOR_34461_VOLT5: case PIM7_SENSOR_34461_VOLT6: case PIM7_SENSOR_34461_VOLT7: case PIM7_SENSOR_34461_VOLT8: case PIM7_SENSOR_34461_VOLT9: case PIM7_SENSOR_34461_VOLT10: case PIM7_SENSOR_34461_VOLT11: case PIM7_SENSOR_34461_VOLT12: case PIM7_SENSOR_34461_VOLT13: case PIM7_SENSOR_34461_VOLT14: case PIM7_SENSOR_34461_VOLT15: case PIM7_SENSOR_34461_VOLT16: *value = 60; break; case PIM8_SENSOR_TEMP1: case PIM8_SENSOR_TEMP2: case PIM8_SENSOR_HSC_VOLT: case PIM8_SENSOR_HSC_CURR: case PIM8_SENSOR_HSC_POWER: *value = 30; break; case PIM8_SENSOR_34461_VOLT1: case PIM8_SENSOR_34461_VOLT2: case PIM8_SENSOR_34461_VOLT3: case PIM8_SENSOR_34461_VOLT4: case PIM8_SENSOR_34461_VOLT5: case PIM8_SENSOR_34461_VOLT6: case PIM8_SENSOR_34461_VOLT7: case PIM8_SENSOR_34461_VOLT8: case PIM8_SENSOR_34461_VOLT9: case PIM8_SENSOR_34461_VOLT10: case PIM8_SENSOR_34461_VOLT11: case PIM8_SENSOR_34461_VOLT12: case PIM8_SENSOR_34461_VOLT13: case PIM8_SENSOR_34461_VOLT14: case PIM8_SENSOR_34461_VOLT15: case PIM8_SENSOR_34461_VOLT16: *value = 60; break; case PIM1_SENSOR_QSFP_TEMP: case PIM2_SENSOR_QSFP_TEMP: case PIM3_SENSOR_QSFP_TEMP: case PIM4_SENSOR_QSFP_TEMP: case PIM5_SENSOR_QSFP_TEMP: case PIM6_SENSOR_QSFP_TEMP: case PIM7_SENSOR_QSFP_TEMP: case PIM8_SENSOR_QSFP_TEMP: *value = 2; break; default: *value = 10; break; } } static void psu_sensor_poll_interval(uint8_t sensor_num, uint32_t *value) { switch(sensor_num) { case PSU1_SENSOR_IN_VOLT: case PSU1_SENSOR_12V_VOLT: case PSU1_SENSOR_STBY_VOLT: case PSU1_SENSOR_IN_CURR: case PSU1_SENSOR_12V_CURR: case PSU1_SENSOR_STBY_CURR: case PSU1_SENSOR_IN_POWER: case PSU1_SENSOR_12V_POWER: case PSU1_SENSOR_STBY_POWER: case PSU1_SENSOR_FAN_TACH: case PSU1_SENSOR_TEMP1: case PSU1_SENSOR_TEMP2: case PSU1_SENSOR_TEMP3: case PSU2_SENSOR_IN_VOLT: case PSU2_SENSOR_12V_VOLT: case PSU2_SENSOR_STBY_VOLT: case PSU2_SENSOR_IN_CURR: case PSU2_SENSOR_12V_CURR: case PSU2_SENSOR_STBY_CURR: case PSU2_SENSOR_IN_POWER: case PSU2_SENSOR_12V_POWER: case PSU2_SENSOR_STBY_POWER: case PSU2_SENSOR_FAN_TACH: case PSU2_SENSOR_TEMP1: case PSU2_SENSOR_TEMP2: case PSU2_SENSOR_TEMP3: case PSU3_SENSOR_IN_VOLT: case PSU3_SENSOR_12V_VOLT: case PSU3_SENSOR_STBY_VOLT: case PSU3_SENSOR_IN_CURR: case PSU3_SENSOR_12V_CURR: case PSU3_SENSOR_STBY_CURR: case PSU3_SENSOR_IN_POWER: case PSU3_SENSOR_12V_POWER: case PSU3_SENSOR_STBY_POWER: case PSU3_SENSOR_FAN_TACH: case PSU3_SENSOR_TEMP1: case PSU3_SENSOR_TEMP2: case PSU3_SENSOR_TEMP3: case PSU4_SENSOR_IN_VOLT: case PSU4_SENSOR_12V_VOLT: case PSU4_SENSOR_STBY_VOLT: case PSU4_SENSOR_IN_CURR: case PSU4_SENSOR_12V_CURR: case PSU4_SENSOR_STBY_CURR: case PSU4_SENSOR_IN_POWER: case PSU4_SENSOR_12V_POWER: case PSU4_SENSOR_STBY_POWER: case PSU4_SENSOR_FAN_TACH: case PSU4_SENSOR_TEMP1: case PSU4_SENSOR_TEMP2: case PSU4_SENSOR_TEMP3: *value = 30; break; default: *value = 10; break; } } int pal_get_sensor_poll_interval(uint8_t fru, uint8_t sensor_num, uint32_t *value) { switch(fru) { case FRU_SCM: scm_sensor_poll_interval(sensor_num, value); break; case FRU_SMB: smb_sensor_poll_interval(sensor_num, value); break; case FRU_PIM1: case FRU_PIM2: case FRU_PIM3: case FRU_PIM4: case FRU_PIM5: case FRU_PIM6: case FRU_PIM7: case FRU_PIM8: pim_sensor_poll_interval(sensor_num, value); break; case FRU_PSU1: case FRU_PSU2: case FRU_PSU3: case FRU_PSU4: psu_sensor_poll_interval(sensor_num, value); break; default: *value = 2; break; } return 0; } void pal_get_chassis_status(uint8_t slot, uint8_t *req_data, uint8_t *res_data, uint8_t *res_len) { char key[MAX_KEY_LEN]; char buff[MAX_VALUE_LEN]; int policy = 3; uint8_t status, ret; unsigned char *data = res_data; /* Platform Power Policy */ sprintf(key, "%s", "server_por_cfg"); if (pal_get_key_value(key, buff) == 0) { if (!memcmp(buff, "off", strlen("off"))) policy = 0; else if (!memcmp(buff, "lps", strlen("lps"))) policy = 1; else if (!memcmp(buff, "on", strlen("on"))) policy = 2; else policy = 3; } /* Current Power State */ ret = pal_get_server_power(FRU_SCM, &status); if (ret >= 0) { *data++ = status | (policy << 5); } else { /* load default */ syslog(LOG_WARNING, "ipmid: pal_get_server_power failed for server\n"); *data++ = 0x00 | (policy << 5); } *data++ = 0x00; /* Last Power Event */ *data++ = 0x40; /* Misc. Chassis Status */ *data++ = 0x00; /* Front Panel Button Disable */ *res_len = data - res_data; } uint8_t pal_set_power_restore_policy(uint8_t slot, uint8_t *pwr_policy, uint8_t *res_data) { uint8_t completion_code; char key[MAX_KEY_LEN]; unsigned char policy = *pwr_policy & 0x07; /* Power restore policy */ completion_code = CC_SUCCESS; /* Fill response with default values */ sprintf(key, "%s", "server_por_cfg"); switch (policy) { case 0: if (pal_set_key_value(key, "off") != 0) completion_code = CC_UNSPECIFIED_ERROR; break; case 1: if (pal_set_key_value(key, "lps") != 0) completion_code = CC_UNSPECIFIED_ERROR; break; case 2: if (pal_set_key_value(key, "on") != 0) completion_code = CC_UNSPECIFIED_ERROR; break; case 3: /* no change (just get present policy support) */ break; default: completion_code = CC_PARAM_OUT_OF_RANGE; break; } return completion_code; } void * generate_dump(void *arg) { uint8_t fru = *(uint8_t *) arg; char cmd[128]; char fname[128]; char fruname[16]; // Usually the pthread cancel state are enable by default but // here we explicitly would like to enable them pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); pal_get_fru_name(fru, fruname);//scm snprintf(fname, sizeof(fname), "/var/run/autodump%d.pid", fru); if (access(fname, F_OK) == 0) { if (unlink(fname) != 0) { OBMC_ERROR(errno, "failed to delete %s", fname); } } // Execute automatic crashdump snprintf(cmd, sizeof(cmd), "%s %s", CRASHDUMP_BIN, fruname); RUN_SHELL_CMD(cmd); syslog(LOG_CRIT, "Crashdump for FRU: %d is generated.", fru); t_dump[fru-1].is_running = 0; return 0; } static int pal_store_crashdump(uint8_t fru) { int ret; char cmd[100]; // Check if the crashdump script exist if (access(CRASHDUMP_BIN, F_OK) == -1) { syslog(LOG_CRIT, "Crashdump for FRU: %d failed : " "auto crashdump binary is not preset", fru); return 0; } // Check if a crashdump for that fru is already running. // If yes, kill that thread and start a new one. if (t_dump[fru-1].is_running) { ret = pthread_cancel(t_dump[fru-1].pt); if (ret == ESRCH) { syslog(LOG_INFO, "pal_store_crashdump: No Crashdump pthread exists"); } else { pthread_join(t_dump[fru-1].pt, NULL); snprintf(cmd, sizeof(cmd), "ps | grep '{dump.sh}' | grep 'scm' " "| awk '{print $1}'| xargs kill"); RUN_SHELL_CMD(cmd); snprintf(cmd, sizeof(cmd), "ps | grep 'bic-util' | grep 'scm' " "| awk '{print $1}'| xargs kill"); RUN_SHELL_CMD(cmd); #ifdef DEBUG syslog(LOG_INFO, "pal_store_crashdump:" " Previous crashdump thread is cancelled"); #endif } } // Start a thread to generate the crashdump t_dump[fru-1].fru = fru; if (pthread_create(&(t_dump[fru-1].pt), NULL, generate_dump, (void*) &t_dump[fru-1].fru) < 0) { syslog(LOG_WARNING, "pal_store_crashdump: pthread_create for" " FRU %d failed\n", fru); return -1; } t_dump[fru-1].is_running = 1; syslog(LOG_INFO, "Crashdump for FRU: %d is being generated.", fru); return 0; } int pal_sel_handler(uint8_t fru, uint8_t snr_num, uint8_t *event_data) { char key[MAX_KEY_LEN] = {0}; char cvalue[MAX_VALUE_LEN] = {0}; static int assert_cnt[MINIPACK_MAX_NUM_SLOTS] = {0}; switch(fru) { case FRU_SCM: switch(snr_num) { case CATERR_B: pal_store_crashdump(fru); break; case 0x00: // don't care sensor number 00h return 0; } sprintf(key, "server_sel_error"); if ((event_data[2] & 0x80) == 0) { // 0: Assertion, 1: Deassertion assert_cnt[fru-1]++; } else { if (--assert_cnt[fru-1] < 0) assert_cnt[fru-1] = 0; } sprintf(cvalue, "%s", (assert_cnt[fru-1] > 0) ? "0" : "1"); break; default: return -1; } /* Write the value "0" which means FRU_STATUS_BAD */ return pal_set_key_value(key, cvalue); } void init_led(void) { int dev, ret; dev = open("/dev/i2c-50", O_RDWR); if(dev < 0) { syslog(LOG_ERR, "%s: open() failed\n", __func__); return; } ret = ioctl(dev, I2C_SLAVE, I2C_ADDR_SIM_LED); if(ret < 0) { syslog(LOG_ERR, "%s: ioctl() assigned i2c addr failed\n", __func__); close(dev); return; } i2c_smbus_write_byte_data(dev, 0x06, 0x00); i2c_smbus_write_byte_data(dev, 0x07, 0x00); close(dev); return; } int set_sled(int brd_rev, uint8_t color, int led_name) { int dev, ret; uint8_t io0_reg = 0x02, io1_reg = 0x03; uint8_t clr_val, val_io0, val_io1; dev = open("/dev/i2c-50", O_RDWR); if(dev < 0) { syslog(LOG_ERR, "%s: open() failed\n", __func__); return -1; } ret = ioctl(dev, I2C_SLAVE, I2C_ADDR_SIM_LED); if(ret < 0) { syslog(LOG_ERR, "%s: ioctl() assigned i2c addr failed\n", __func__); close(dev); return -1; } val_io0 = i2c_smbus_read_byte_data(dev, 0x02); if(val_io0 < 0) { close(dev); syslog(LOG_ERR, "%s: i2c_smbus_read_byte_data failed\n", __func__); return -1; } val_io1 = i2c_smbus_read_byte_data(dev, 0x03); if(val_io1 < 0) { close(dev); syslog(LOG_ERR, "%s: i2c_smbus_read_byte_data failed\n", __func__); return -1; } clr_val = color; if(brd_rev == 0 || brd_rev == 4) { if(led_name == SLED_SMB || led_name == SLED_PSU) { clr_val = clr_val << 3; val_io0 = (val_io0 & 0x7) | clr_val; val_io1 = (val_io1 & 0x7) | clr_val; } else if(led_name == SLED_SYS || led_name == SLED_FAN) { val_io0 = (val_io0 & 0x38) | clr_val; val_io1 = (val_io1 & 0x38) | clr_val; } else syslog(LOG_WARNING, "%s: unknown led name\n", __func__); if(led_name == SLED_PSU || led_name == SLED_FAN) { i2c_smbus_write_byte_data(dev, io0_reg, val_io0); } else { i2c_smbus_write_byte_data(dev, io1_reg, val_io1); } } else { if(led_name == SLED_FAN || led_name == SLED_SMB) { clr_val = clr_val << 3; val_io0 = (val_io0 & 0x7) | clr_val; val_io1 = (val_io1 & 0x7) | clr_val; } else if(led_name == SLED_SYS || led_name == SLED_PSU) { val_io0 = (val_io0 & 0x38) | clr_val; val_io1 = (val_io1 & 0x38) | clr_val; } else { syslog(LOG_WARNING, "%s: unknown led name\n", __func__); } if(led_name == SLED_SYS || led_name == SLED_FAN) { i2c_smbus_write_byte_data(dev, io0_reg, val_io0); } else { i2c_smbus_write_byte_data(dev, io1_reg, val_io1); } } close(dev); return 0; } static void upgrade_led_blink(int brd_rev, uint8_t sys_ug, uint8_t fan_ug, uint8_t psu_ug, uint8_t smb_ug) { static uint8_t sys_alter = 0, fan_alter = 0, psu_alter = 0, smb_alter = 0; if(sys_ug) { if(sys_alter == 0) { set_sled(brd_rev, SLED_CLR_BLUE, SLED_SYS); sys_alter = 1; } else { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_SYS); sys_alter = 0; } } if(fan_ug) { if(fan_alter == 0) { set_sled(brd_rev, SLED_CLR_BLUE, SLED_FAN); fan_alter = 1; } else { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_FAN); fan_alter = 0; } } if(psu_ug) { if(psu_alter == 0) { set_sled(brd_rev, SLED_CLR_BLUE, SLED_PSU); psu_alter = 1; } else { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_PSU); psu_alter = 0; } } if(smb_ug) { if(smb_alter == 0) { set_sled(brd_rev, SLED_CLR_BLUE, SLED_SMB); smb_alter = 1; } else { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_SMB); smb_alter = 0; } } } int pal_mon_fw_upgrade (int brd_rev, uint8_t *sys_ug, uint8_t *fan_ug, uint8_t *psu_ug, uint8_t *smb_ug) { char cmd[5]; FILE *fp; int ret=-1; char *buf_ptr; int buf_size = 1000; int str_size = 200; int tmp_size; char str[200]; snprintf(cmd, sizeof(cmd), "ps w"); fp = popen(cmd, "r"); if(NULL == fp) return -1; buf_ptr = (char *)malloc(buf_size * sizeof(char) + sizeof(char)); memset(buf_ptr, 0, sizeof(char)); tmp_size = str_size; while(fgets(str, str_size, fp) != NULL) { tmp_size = tmp_size + str_size; if(tmp_size + str_size >= buf_size) { buf_ptr = realloc(buf_ptr, sizeof(char) * buf_size * 2 + sizeof(char)); buf_size *= 2; } if(!buf_ptr) { syslog(LOG_ERR, "%s realloc() fail, please check memory remaining", __func__); goto free_buf; } strncat(buf_ptr, str, str_size); } //check whether sys led need to blink *sys_ug = strstr(buf_ptr, "write spi2") != NULL ? 1 : 0; if(*sys_ug) goto fan_state; *sys_ug = strstr(buf_ptr, "write spi1 BACKUP_BIOS") != NULL ? 1 : 0; if(*sys_ug) goto fan_state; *sys_ug = (strstr(buf_ptr, "scmcpld_update") != NULL) ? 1 : 0; if(*sys_ug) goto fan_state; *sys_ug = (strstr(buf_ptr, "pimcpld_update") != NULL) ? 1 : 0; if(*sys_ug) goto fan_state; *sys_ug = (strstr(buf_ptr, "fw-util") != NULL) ? ((strstr(buf_ptr, "--update") != NULL) ? 1 : 0) : 0; if(*sys_ug) goto fan_state; //check whether fan led need to blink fan_state: *fan_ug = (strstr(buf_ptr, "fcmcpld_update") != NULL) ? 1 : 0; //check whether fan led need to blink *psu_ug = (strstr(buf_ptr, "psu-util") != NULL) ? ((strstr(buf_ptr, "--update") != NULL) ? 1 : 0) : 0; //check whether smb led need to blink *smb_ug = (strstr(buf_ptr, "smbcpld_update") != NULL) ? 1 : 0; if(*smb_ug) goto close_fp; *smb_ug = (strstr(buf_ptr, "pdbcpld_update") != NULL) ? 1 : 0; if(*smb_ug) goto close_fp; *smb_ug = (strstr(buf_ptr, "flashcp") != NULL) ? 1 : 0; if(*smb_ug) goto close_fp; *smb_ug = strstr(buf_ptr, "write spi1 IOB_FPGA_FLASH") != NULL ? 1 : 0; if(*smb_ug) goto close_fp; *smb_ug = strstr(buf_ptr, "write spi1 TH3_FLASH") != NULL ? 1 : 0; if(*smb_ug) goto close_fp; *smb_ug = strstr(buf_ptr, "write spi1 BCM5396_EE") != NULL ? 1 : 0; if(*smb_ug) goto close_fp; close_fp: ret = pclose(fp); if(-1 == ret) syslog(LOG_ERR, "%s pclose() fail ", __func__); upgrade_led_blink(brd_rev, *sys_ug, *fan_ug, *psu_ug, *smb_ug); free_buf: free(buf_ptr); return 0; } void set_sys_led(int brd_rev) { uint8_t fru; uint8_t ret = 0; uint8_t prsnt = 0; ret = pal_is_fru_prsnt(FRU_SCM, &prsnt); if (ret) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_SYS); return; } if (!prsnt) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_SYS); return; } for(fru = FRU_PIM1; fru <= FRU_PIM8; fru++){ ret = pal_is_fru_prsnt(fru, &prsnt); if (ret) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_SYS); return; } if (!prsnt) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_SYS); return; } } set_sled(brd_rev, SLED_CLR_BLUE, SLED_SYS); return; } void set_fan_led(int brd_rev) { int i, val; uint8_t fan_num = 16;//rear:8 && front:8 char path[LARGEST_DEVICE_NAME + 1]; int sensor_num[] = {42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57}; for(i = 0; i < fan_num; i++) { snprintf(path, LARGEST_DEVICE_NAME, SENSORD_FILE_SMB, sensor_num[i]); if(read_device(path, &val)) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_FAN); return; } if(val <= 800) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_FAN); return; } } set_sled(brd_rev, SLED_CLR_BLUE, SLED_FAN); return; } void set_psu_led(int brd_rev) { int i, val_in, val_out12; float val_out3; int vin_min = 92; int vin_max = 310; int vout_12_min = 11; int vout_12_max = 13; float vout_3_min = 3.00; float vout_3_max = 3.60; uint8_t psu_num = 4; uint8_t prsnt; int sensor_num[] = {1, 14, 27, 40}; char path[LARGEST_DEVICE_NAME + 1]; for(i = FRU_PSU1; i <= FRU_PSU4; i++) { pal_is_fru_prsnt(i, &prsnt); if(!prsnt) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_PSU); return; } } for(i = 0; i < psu_num; i++) { snprintf(path, LARGEST_DEVICE_NAME, SENSORD_FILE_PSU, i+1, sensor_num[i]); if(read_device(path, &val_in)) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_PSU); return; } if(val_in > vin_max || val_in < vin_min) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_PSU); return; } snprintf(path, LARGEST_DEVICE_NAME, SENSORD_FILE_PSU, i+1, sensor_num[i] + 1); if(read_device(path, &val_out12)) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_PSU); return; } if(val_out12 > vout_12_max || val_out12 < vout_12_min) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_PSU); return; } snprintf(path, LARGEST_DEVICE_NAME, SENSORD_FILE_PSU, i+1, sensor_num[i] + 2); if(read_device_float(path, &val_out3)) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_PSU); return; } if(val_out3 > vout_3_max || val_out3 < vout_3_min) { set_sled(brd_rev, SLED_CLR_YELLOW, SLED_PSU); return; } } set_sled(brd_rev, SLED_CLR_BLUE, SLED_PSU); return; } void set_smb_led(int brd_rev) { set_sled(brd_rev, SLED_CLR_BLUE, SLED_SMB); return; } int pal_light_scm_led(uint8_t led_color) { int ret; char *val; if(led_color == SCM_LED_BLUE) val = "0"; else val = "1"; ret = write_device(SCM_SYS_LED_COLOR, val); if (ret) { #ifdef DEBUG syslog(LOG_WARNING, "write_device failed for %s\n", SCM_SYS_LED_COLOR); #endif return -1; } return 0; } int pal_set_def_key_value(void) { int i, ret; char path[LARGEST_DEVICE_NAME + 1]; for (i = 0; strcmp(key_list[i], LAST_KEY) != 0; i++) { snprintf(path, LARGEST_DEVICE_NAME, KV_PATH, key_list[i]); if ((ret = kv_set(key_list[i], def_val_list[i], 0, KV_FPERSIST | KV_FCREATE)) < 0) { #ifdef DEBUG syslog(LOG_WARNING, "pal_set_def_key_value: kv_set failed. %d", ret); #endif } } return 0; } int pal_init_sensor_check(uint8_t fru, uint8_t snr_num, void *snr) { _sensor_thresh_t *psnr = (_sensor_thresh_t *)snr; sensor_desc_t *snr_desc; snr_desc = get_sensor_desc(fru, snr_num); strncpy(snr_desc->name, psnr->name, sizeof(snr_desc->name)); snr_desc->name[sizeof(snr_desc->name)-1] = 0; pal_set_def_key_value(); psu_init_acok_key(fru); return 0; } int pal_get_fru_health(uint8_t fru, uint8_t *value) { char cvalue[MAX_VALUE_LEN] = {0}; char key[MAX_KEY_LEN] = {0}; int ret; switch(fru) { case FRU_SCM: sprintf(key, "scm_sensor_health"); break; case FRU_SMB: sprintf(key, "smb_sensor_health"); break; case FRU_PIM1: sprintf(key, "pim1_sensor_health"); break; case FRU_PIM2: sprintf(key, "pim2_sensor_health"); break; case FRU_PIM3: sprintf(key, "pim3_sensor_health"); break; case FRU_PIM4: sprintf(key, "pim4_sensor_health"); break; case FRU_PIM5: sprintf(key, "pim5_sensor_health"); break; case FRU_PIM6: sprintf(key, "pim6_sensor_health"); break; case FRU_PIM7: sprintf(key, "pim7_sensor_health"); break; case FRU_PIM8: sprintf(key, "pim8_sensor_health"); break; case FRU_PSU1: sprintf(key, "psu1_sensor_health"); break; case FRU_PSU2: sprintf(key, "psu2_sensor_health"); break; case FRU_PSU3: sprintf(key, "psu3_sensor_health"); break; case FRU_PSU4: sprintf(key, "psu4_sensor_health"); break; default: return -1; } ret = pal_get_key_value(key, cvalue); if (ret) { return ret; } *value = atoi(cvalue); *value = *value & atoi(cvalue); return 0; } int pal_set_sensor_health(uint8_t fru, uint8_t value) { char key[MAX_KEY_LEN] = {0}; char cvalue[MAX_VALUE_LEN] = {0}; switch(fru) { case FRU_SCM: sprintf(key, "scm_sensor_health"); break; case FRU_SMB: sprintf(key, "smb_sensor_health"); break; case FRU_PIM1: sprintf(key, "pim1_sensor_health"); break; case FRU_PIM2: sprintf(key, "pim2_sensor_health"); break; case FRU_PIM3: sprintf(key, "pim3_sensor_health"); break; case FRU_PIM4: sprintf(key, "pim4_sensor_health"); break; case FRU_PIM5: sprintf(key, "pim5_sensor_health"); break; case FRU_PIM6: sprintf(key, "pim6_sensor_health"); break; case FRU_PIM7: sprintf(key, "pim7_sensor_health"); break; case FRU_PIM8: sprintf(key, "pim8_sensor_health"); break; case FRU_PSU1: sprintf(key, "psu1_sensor_health"); break; case FRU_PSU2: sprintf(key, "psu2_sensor_health"); break; case FRU_PSU3: sprintf(key, "psu3_sensor_health"); break; case FRU_PSU4: sprintf(key, "psu4_sensor_health"); break; default: return -1; } sprintf(cvalue, (value > 0) ? "1": "0"); return pal_set_key_value(key, cvalue); } int pal_parse_sel(uint8_t fru, uint8_t *sel, char *error_log) { uint8_t snr_num = sel[11]; uint8_t *event_data = &sel[10]; uint8_t *ed = &event_data[3]; char temp_log[512] = {0}; uint8_t sen_type = event_data[0]; uint8_t chn_num, dimm_num; bool parsed = false; switch(snr_num) { case BIC_SENSOR_SYSTEM_STATUS: strcpy(error_log, ""); switch (ed[0] & 0x0F) { case 0x00: strcat(error_log, "SOC_Thermal_Trip"); break; case 0x01: strcat(error_log, "SOC_FIVR_Fault"); break; case 0x02: strcat(error_log, "SOC_Throttle"); break; case 0x03: strcat(error_log, "PCH_HOT"); break; } parsed = true; break; case BIC_SENSOR_CPU_DIMM_HOT: strcpy(error_log, ""); switch (ed[0] & 0x0F) { case 0x01: strcat(error_log, "SOC_MEMHOT"); break; } parsed = true; break; case MEMORY_ECC_ERR: case MEMORY_ERR_LOG_DIS: strcpy(error_log, ""); if (snr_num == MEMORY_ECC_ERR) { // SEL from MEMORY_ECC_ERR Sensor if ((ed[0] & 0x0F) == 0x0) { if (sen_type == 0x0C) { strcat(error_log, "Correctable"); sprintf(temp_log, "DIMM%02X ECC err", ed[2]); pal_add_cri_sel(temp_log); } else if (sen_type == 0x10) strcat(error_log, "Correctable ECC error Logging Disabled"); } else if ((ed[0] & 0x0F) == 0x1) { strcat(error_log, "Uncorrectable"); sprintf(temp_log, "DIMM%02X UECC err", ed[2]); pal_add_cri_sel(temp_log); } else if ((ed[0] & 0x0F) == 0x5) strcat(error_log, "Correctable ECC error Logging Limit Reached"); else strcat(error_log, "Unknown"); } else { // SEL from MEMORY_ERR_LOG_DIS Sensor if ((ed[0] & 0x0F) == 0x0) strcat(error_log, "Correctable Memory Error Logging Disabled"); else strcat(error_log, "Unknown"); } // DIMM number (ed[2]): // Bit[7:5]: Socket number (Range: 0-7) // Bit[4:3]: Channel number (Range: 0-3) // Bit[2:0]: DIMM number (Range: 0-7) if (((ed[1] & 0xC) >> 2) == 0x0) { /* All Info Valid */ chn_num = (ed[2] & 0x18) >> 3; dimm_num = ed[2] & 0x7; /* If critical SEL logging is available, do it */ if (sen_type == 0x0C) { if ((ed[0] & 0x0F) == 0x0) { sprintf(temp_log, "DIMM%c%d ECC err,FRU:%u", 'A'+chn_num, dimm_num, fru); pal_add_cri_sel(temp_log); } else if ((ed[0] & 0x0F) == 0x1) { sprintf(temp_log, "DIMM%c%d UECC err,FRU:%u", 'A'+chn_num, dimm_num, fru); pal_add_cri_sel(temp_log); } } /* Then continue parse the error into a string. */ /* All Info Valid */ sprintf(temp_log, " DIMM %c%d Logical Rank %d (CPU# %d, CHN# %d, DIMM# %d)", 'A'+chn_num, dimm_num, ed[1] & 0x03, (ed[2] & 0xE0) >> 5, chn_num, dimm_num); } else if (((ed[1] & 0xC) >> 2) == 0x1) { /* DIMM info not valid */ sprintf(temp_log, " (CPU# %d, CHN# %d)", (ed[2] & 0xE0) >> 5, (ed[2] & 0x18) >> 3); } else if (((ed[1] & 0xC) >> 2) == 0x2) { /* CHN info not valid */ sprintf(temp_log, " (CPU# %d, DIMM# %d)", (ed[2] & 0xE0) >> 5, ed[2] & 0x7); } else if (((ed[1] & 0xC) >> 2) == 0x3) { /* CPU info not valid */ sprintf(temp_log, " (CHN# %d, DIMM# %d)", (ed[2] & 0x18) >> 3, ed[2] & 0x7); } strcat(error_log, temp_log); parsed = true; break; } if (parsed == true) { if ((event_data[2] & 0x80) == 0) { strcat(error_log, " Assertion"); } else { strcat(error_log, " Deassertion"); } return 0; } pal_parse_sel_helper(fru, sel, error_log); return 0; } int minipack_sensor_name(uint8_t fru, uint8_t sensor_num, char *name) { switch(fru) { case FRU_SCM: switch(sensor_num) { case BIC_SENSOR_SYSTEM_STATUS: sprintf(name, "SYSTEM_STATUS"); break; case BIC_SENSOR_SYS_BOOT_STAT: sprintf(name, "SYS_BOOT_STAT"); break; case BIC_SENSOR_CPU_DIMM_HOT: sprintf(name, "CPU_DIMM_HOT"); break; case BIC_SENSOR_PROC_FAIL: sprintf(name, "PROC_FAIL"); break; case BIC_SENSOR_VR_HOT: sprintf(name, "VR_HOT"); break; default: return -1; } break; } return 0; } int pal_get_event_sensor_name(uint8_t fru, uint8_t *sel, char *name) { uint8_t snr_type = sel[10]; uint8_t snr_num = sel[11]; // If SNR_TYPE is OS_BOOT, sensor name is OS switch (snr_type) { case OS_BOOT: // OS_BOOT used by OS sprintf(name, "OS"); return 0; default: if (minipack_sensor_name(fru, snr_num, name) != 0) { break; } return 0; } // Otherwise, translate it based on snr_num return pal_get_x86_event_sensor_name(fru, snr_num, name); } /* Read the Front Panel Hand Switch and return the position */ int pal_get_hand_sw_physically(uint8_t *pos) { char path[LARGEST_DEVICE_NAME + 1]; int loc; snprintf(path, sizeof(path), GPIO_BMC_UART_SEL5, "value"); if (read_device(path, &loc)) { return -1; } *pos = loc; return 0; } int pal_get_hand_sw(uint8_t *pos) { char value[MAX_VALUE_LEN]; uint8_t loc; int ret; ret = kv_get("scm_hand_sw", value, NULL, 0); if (!ret) { loc = atoi(value); if (loc > HAND_SW_BMC) { return pal_get_hand_sw_physically(pos); } *pos = loc; return 0; } return pal_get_hand_sw_physically(pos); } /* Return the Front Panel Power Button */ int pal_get_dbg_pwr_btn(uint8_t *status) { int val; if (read_device(SCM_DBG_PWR_BTN, &val)) { return -1; } if (val) { *status = 0; } else { *status = 1; } return 0; } /* Return the Debug Card Reset Button status */ int pal_get_dbg_rst_btn(uint8_t *status) { int val; if (read_device(SCM_DBG_RST_BTN, &val)) { return -1; } if (val) { *status = 1; /* RST BTN status pressed */ } else { *status = 0; /* RST BTN status clear */ } return 0; } /* Clear Debug Card Reset Button status */ int pal_clr_dbg_rst_btn() { if (write_device(SCM_DBG_RST_BTN_CLR, "0")) { syslog(LOG_ERR, "Reset button status not clear"); return -1; } msleep(5); if (write_device(SCM_DBG_RST_BTN_CLR, "1")) { syslog(LOG_ERR, "Reset button status can't recover to normal"); return -2; } return 0; } /* Update the Reset button input to the server at given slot */ int pal_set_rst_btn(uint8_t slot, uint8_t status) { char *val; if (slot != FRU_SCM) { return -1; } if (status) { val = "1"; } else { val = "0"; } if (write_device(SCM_COM_RST_BTN, val)) { return -1; } return 0; } /* Return the Debug Card UART Sel Button status */ int pal_get_dbg_uart_btn(uint8_t *status) { int val; if (read_device(SCM_DBG_UART_BTN, &val)) { return -1; } if (val) { *status = 1; /* UART BTN status pressed */ } else { *status = 0; /* UART BTN status clear */ } return 0; } /* Clear Debug Card UART Sel Button status */ int pal_clr_dbg_uart_btn() { if (write_device(SCM_DBG_UART_BTN_CLR, "0")) { syslog(LOG_ERR, "UART Sel button status not clear"); return -1; } msleep(5); if (write_device(SCM_DBG_UART_BTN_CLR, "1")) { syslog(LOG_ERR, "UART Sel button status can't recover to normal"); return -2; } return 0; } /* Switch the UART mux to userver or BMC */ int pal_switch_uart_mux(uint8_t slot) { char path[LARGEST_DEVICE_NAME + 1]; char *val; uint8_t prsnt; if (pal_is_debug_card_prsnt(&prsnt)) { return -1; } /* Refer the UART select table in schematic */ if (slot == HAND_SW_SERVER) { val = "0"; } else { val = "1"; } snprintf(path, sizeof(path), GPIO_BMC_UART_SEL5, "value"); if (write_device(path, val)) { #ifdef DEBUG syslog(LOG_WARNING, "pal_switch_uart_mux: write_device fail: %s\n", path); #endif return -1; } return 0; } int pal_get_boot_order(uint8_t slot, uint8_t *req_data, uint8_t *boot, uint8_t *res_len) { int ret, msb, lsb, i, j = 0; char str[MAX_VALUE_LEN] = {0}; char tstr[4]; ret = pal_get_key_value("server_boot_order", str); if (ret) { *res_len = 0; return ret; } for (i = 0; i < 2*SIZE_BOOT_ORDER; i += 2) { snprintf(tstr, sizeof(tstr), "%c\n", str[i]); msb = strtol(tstr, NULL, 16); snprintf(tstr, sizeof(tstr), "%c\n", str[i+1]); lsb = strtol(tstr, NULL, 16); boot[j++] = (msb << 4) | lsb; } *res_len = SIZE_BOOT_ORDER; return 0; } int pal_set_boot_order(uint8_t slot, uint8_t *boot, uint8_t *res_data, uint8_t *res_len) { int i, j, offset, network_dev = 0; char str[MAX_VALUE_LEN] = {0}; enum { BOOT_DEVICE_IPV4 = 0x1, BOOT_DEVICE_IPV6 = 0x9, }; *res_len = 0; for (i = offset = 0; i < SIZE_BOOT_ORDER && offset < sizeof(str); i++) { if (i > 0) { // byte[0] is boot mode, byte[1:5] are boot order for (j = i+1; j < SIZE_BOOT_ORDER; j++) { if (boot[i] == boot[j]) return CC_INVALID_PARAM; } // If bit[2:0] is 001b (Network), bit[3] is IPv4/IPv6 order // bit[3]=0b: IPv4 first // bit[3]=1b: IPv6 first if ((boot[i] == BOOT_DEVICE_IPV4) || (boot[i] == BOOT_DEVICE_IPV6)) network_dev++; } offset += snprintf(str + offset, sizeof(str) - offset, "%02x", boot[i]); } // not allow having more than 1 network boot device in the boot order if (network_dev > 1) return CC_INVALID_PARAM; return pal_set_key_value("server_boot_order", str); } int pal_get_restart_cause(uint8_t slot, uint8_t *restart_cause) { char value[MAX_VALUE_LEN] = {0}; unsigned int cause; if (kv_get("server_restart_cause", value, NULL, KV_FPERSIST)) { return -1; } if(sscanf(value, "%u", &cause) != 1) { return -1; } *restart_cause = cause; return 0; } int pal_set_restart_cause(uint8_t slot, uint8_t restart_cause) { char value[MAX_VALUE_LEN] = {0}; sprintf(value, "%d", restart_cause); if (kv_set("server_restart_cause", value, 0, KV_FPERSIST)) { return -1; } return 0; } int pal_set_ppin_info(uint8_t slot, uint8_t *req_data, uint8_t req_len, uint8_t *res_data, uint8_t *res_len) { char str[MAX_VALUE_LEN] = {0}; char tstr[10]; int i; int completion_code = CC_UNSPECIFIED_ERROR; *res_len = 0; for (i = 0; i < SIZE_CPU_PPIN; i++) { snprintf(tstr, sizeof(tstr), "%02x", req_data[i]); strcat(str, tstr); } if (pal_set_key_value("server_cpu_ppin", str) != 0) return completion_code; completion_code = CC_SUCCESS; return completion_code; } int pal_get_fruid_path(uint8_t fru, char *path) { if (fru != FRU_SCM) return -1; sprintf(path, MINIPACK_FRU_PATH, "scm"); return 0; } int pal_ipmb_processing(int bus, void *buf, uint16_t size) { char key[MAX_KEY_LEN]; char value[MAX_VALUE_LEN]; struct timespec ts; static time_t last_time = 0; if ((bus == 4) && (((uint8_t *)buf)[0] == 0x20)) { // OCP LCD debug card clock_gettime(CLOCK_MONOTONIC, &ts); if (ts.tv_sec >= (last_time + 5)) { last_time = ts.tv_sec; ts.tv_sec += 30; snprintf(key, sizeof(key), "ocpdbg_lcd"); snprintf(value, sizeof(value), "%ld", ts.tv_sec); if (kv_set(key, value, 0, 0) < 0) { return -1; } } } return 0; } bool pal_is_mcu_working(void) { char key[MAX_KEY_LEN] = {0}; char value[MAX_VALUE_LEN] = {0}; struct timespec ts; snprintf(key, sizeof(key), "ocpdbg_lcd"); if (kv_get(key, value, NULL, 0)) { return false; } clock_gettime(CLOCK_MONOTONIC, &ts); if (strtoul(value, NULL, 10) > ts.tv_sec) { return true; } return false; } int pal_is_slot_server(uint8_t fru) { if (fru == FRU_SCM) { return 1; } return 0; } int pal_parse_oem_sel(uint8_t fru, uint8_t *sel, char *error_log) { char crisel[128]; uint8_t mfg_id[] = {0x4c, 0x1c, 0x00}; error_log[0] = '\0'; // Record Type: 0xC0 (OEM) if ((sel[2] == 0xC0) && !memcmp(&sel[7], mfg_id, sizeof(mfg_id))) { snprintf(crisel, sizeof(crisel), "Slot %u PCIe err,FRU:%u", sel[14], fru); pal_add_cri_sel(crisel); } return 0; }