diff options
Diffstat (limited to 'meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c')
-rw-r--r-- | meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c | 609 |
1 files changed, 357 insertions, 252 deletions
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c index 0f25e54..9d075ce 100644 --- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c +++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c @@ -24,6 +24,7 @@ #include <stdint.h> #include <stdbool.h> #include <math.h> +#include <string.h> #include <fcntl.h> #include <errno.h> #include <syslog.h> @@ -51,6 +52,10 @@ #define UNIT_DIV 1000 +#define MEZZ_SENSOR_I2CBUS "11" +#define MEZZ_SENSOR_I2C_BUS_ADDR "0x1f" +#define MEZZ_SENSOR_TEMP_REGISTER "0x01" + #define BIC_SENSOR_READ_NA 0x20 #define MAX_SENSOR_NUM 0xFF @@ -77,6 +82,7 @@ const uint8_t bic_sensor_list[] = { BIC_SENSOR_VCCIN_VR_CURR, BIC_SENSOR_VCCIN_VR_VOL, BIC_SENSOR_INA230_POWER, + BIC_SENSOR_INA230_VOL, BIC_SENSOR_SOC_PACKAGE_PWR, BIC_SENSOR_SOC_TJMAX, BIC_SENSOR_VDDR_VR_POUT, @@ -88,6 +94,7 @@ const uint8_t bic_sensor_list[] = { BIC_SENSOR_VCC_SCSUS_VR_POUT, BIC_SENSOR_VCC_GBE_VR_POUT, BIC_SENSOR_VCC_GBE_VR_VOL, + BIC_SENSOR_1V05_PCH_VR_POUT, BIC_SENSOR_1V05_PCH_VR_VOL, BIC_SENSOR_SOC_DIMMA0_TEMP, BIC_SENSOR_SOC_DIMMA1_TEMP, @@ -101,22 +108,13 @@ const uint8_t bic_sensor_list[] = { BIC_SENSOR_PV_BAT, BIC_SENSOR_PVDDR, BIC_SENSOR_PVCC_GBE, +}; + +const uint8_t bic_discrete_list[] = { /* Discrete sensors */ - //BIC_SENSOR_SYSTEM_STATUS, - //BIC_SENSOR_SYS_BOOT_STAT, - //BIC_SENSOR_CPU_DIMM_HOT, - //BIC_SENSOR_PROC_FAIL, - //BIC_SENSOR_VR_HOT, - /* Event-only sensors */ - //BIC_SENSOR_POST_ERR, - //BIC_SENSOR_SPS_FW_HLTH, - //BIC_SENSOR_POWER_THRESH_EVENT, - //BIC_SENSOR_MACHINE_CHK_ERR, - //BIC_SENSOR_PCIE_ERR, - //BIC_SENSOR_OTHER_IIO_ERR, - //BIC_SENSOR_PROC_HOT_EXT, - //BIC_SENSOR_POWER_ERR, - //BIC_SENSOR_CAT_ERR, + BIC_SENSOR_SYSTEM_STATUS, + BIC_SENSOR_VR_HOT, + BIC_SENSOR_CPU_DIMM_HOT, }; // List of SPB sensors to be monitored @@ -130,10 +128,10 @@ const uint8_t spb_sensor_list[] = { SP_SENSOR_P5V, SP_SENSOR_P12V, SP_SENSOR_P3V3_STBY, - SP_SENSOR_P12V_SLOT0, SP_SENSOR_P12V_SLOT1, SP_SENSOR_P12V_SLOT2, SP_SENSOR_P12V_SLOT3, + SP_SENSOR_P12V_SLOT4, SP_SENSOR_P3V3, SP_SENSOR_HSC_IN_VOLT, SP_SENSOR_HSC_OUT_CURR, @@ -141,10 +139,63 @@ const uint8_t spb_sensor_list[] = { SP_SENSOR_HSC_IN_POWER, }; +// List of NIC sensors to be monitored +const uint8_t nic_sensor_list[] = { + MEZZ_SENSOR_TEMP, +}; + +float spb_sensor_threshold[MAX_SENSOR_NUM][MAX_SENSOR_THRESHOLD + 1] = {0}; +float nic_sensor_threshold[MAX_SENSOR_NUM][MAX_SENSOR_THRESHOLD + 1] = {0}; + +static void +sensor_thresh_array_init() { + static bool init_done = false; + + if (init_done) + return; + + spb_sensor_threshold[SP_SENSOR_INLET_TEMP][UCR_THRESH] = 40; + spb_sensor_threshold[SP_SENSOR_OUTLET_TEMP][UCR_THRESH] = 70; + spb_sensor_threshold[SP_SENSOR_FAN0_TACH][UCR_THRESH] = 10000; + spb_sensor_threshold[SP_SENSOR_FAN0_TACH][LCR_THRESH] = 500; + spb_sensor_threshold[SP_SENSOR_FAN1_TACH][UCR_THRESH] = 10000; + spb_sensor_threshold[SP_SENSOR_FAN1_TACH][LCR_THRESH] = 500; + //spb_sensor_threshold[SP_SENSOR_AIR_FLOW][UCR_THRESH] = {75.0, 0, 0, 0, 0, 0, 0, 0}; + spb_sensor_threshold[SP_SENSOR_P5V][UCR_THRESH] = 5.493; + spb_sensor_threshold[SP_SENSOR_P5V][LCR_THRESH] = 4.501; + spb_sensor_threshold[SP_SENSOR_P12V][UCR_THRESH] = 13.216; + spb_sensor_threshold[SP_SENSOR_P12V][LCR_THRESH] = 11.269; + spb_sensor_threshold[SP_SENSOR_P3V3_STBY][UCR_THRESH] = 3.625; + spb_sensor_threshold[SP_SENSOR_P3V3_STBY][LCR_THRESH] = 2.973; + spb_sensor_threshold[SP_SENSOR_P12V_SLOT1][UCR_THRESH] = 13.216; + spb_sensor_threshold[SP_SENSOR_P12V_SLOT1][LCR_THRESH] = 11.269; + spb_sensor_threshold[SP_SENSOR_P12V_SLOT2][UCR_THRESH] = 13.216; + spb_sensor_threshold[SP_SENSOR_P12V_SLOT2][LCR_THRESH] = 11.269; + spb_sensor_threshold[SP_SENSOR_P12V_SLOT3][UCR_THRESH] = 13.216; + spb_sensor_threshold[SP_SENSOR_P12V_SLOT3][LCR_THRESH] = 11.269; + spb_sensor_threshold[SP_SENSOR_P12V_SLOT4][UCR_THRESH] = 13.216; + spb_sensor_threshold[SP_SENSOR_P12V_SLOT4][LCR_THRESH] = 11.269; + spb_sensor_threshold[SP_SENSOR_P3V3][UCR_THRESH] = 3.625; + spb_sensor_threshold[SP_SENSOR_P3V3][LCR_THRESH] = 2.973; + spb_sensor_threshold[SP_SENSOR_HSC_IN_VOLT][UCR_THRESH] = 13.2; + spb_sensor_threshold[SP_SENSOR_HSC_IN_VOLT][LCR_THRESH] = 10.8; + spb_sensor_threshold[SP_SENSOR_HSC_OUT_CURR][UCR_THRESH] = 47.705; + spb_sensor_threshold[SP_SENSOR_HSC_TEMP][UCR_THRESH] = 120; + spb_sensor_threshold[SP_SENSOR_HSC_IN_POWER][UCR_THRESH] = 525; + + nic_sensor_threshold[MEZZ_SENSOR_TEMP][UCR_THRESH] = 80; + + init_done = true; +} + size_t bic_sensor_cnt = sizeof(bic_sensor_list)/sizeof(uint8_t); +size_t bic_discrete_cnt = sizeof(bic_discrete_list)/sizeof(uint8_t); + size_t spb_sensor_cnt = sizeof(spb_sensor_list)/sizeof(uint8_t); +size_t nic_sensor_cnt = sizeof(nic_sensor_list)/sizeof(uint8_t); + enum { FAN0 = 0, FAN1, @@ -161,12 +212,7 @@ enum { ADC_PIN7, }; -static sensor_info_t g_sinfo1[MAX_SENSOR_NUM] = {0}; -static sensor_info_t g_sinfo2[MAX_SENSOR_NUM] = {0}; -static sensor_info_t g_sinfo3[MAX_SENSOR_NUM] = {0}; -static sensor_info_t g_sinfo4[MAX_SENSOR_NUM] = {0}; -static sensor_info_t g_sinfo_spb[MAX_SENSOR_NUM] = {0}; -static sensor_info_t g_sinfo_nic[MAX_SENSOR_NUM] = {0}; +static sensor_info_t g_sinfo[MAX_NUM_FRUS][MAX_SENSOR_NUM] = {0}; static int read_device(const char *device, int *value) { @@ -177,7 +223,9 @@ read_device(const char *device, int *value) { if (!fp) { int err = errno; +#ifdef DEBUG syslog(LOG_INFO, "failed to open device %s", device); +#endif return err; } @@ -185,7 +233,9 @@ read_device(const char *device, int *value) { fclose(fp); if (rc != 1) { +#ifdef DEBUG syslog(LOG_INFO, "failed to read device %s", device); +#endif return ENOENT; } else { return 0; @@ -201,8 +251,9 @@ read_device_float(const char *device, float *value) { fp = fopen(device, "r"); if (!fp) { int err = errno; - +#ifdef DEBUG syslog(LOG_INFO, "failed to open device %s", device); +#endif return err; } @@ -210,7 +261,9 @@ read_device_float(const char *device, float *value) { fclose(fp); if (rc != 1) { +#ifdef DEBUG syslog(LOG_INFO, "failed to read device %s", device); +#endif return ENOENT; } @@ -271,46 +324,52 @@ read_hsc_value(const char *device, float *value) { } static int -bic_read_sensor_wrapper(uint8_t slot_id, uint8_t sensor_num, void *value) { +read_nic_temp(uint8_t snr_num, float *value) { + char command[64]; + char tmp[8]; + + if (snr_num == MEZZ_SENSOR_TEMP) { + sprintf(command, "i2cget -y %s %s %s b", MEZZ_SENSOR_I2CBUS, + MEZZ_SENSOR_I2C_BUS_ADDR, MEZZ_SENSOR_TEMP_REGISTER); + + FILE *fp = popen(command, "r"); + fscanf(fp, "%s", tmp); + pclose(fp); + + *value = (float) strtol(tmp, NULL, 16); + } + + return 0; +} + +static int +bic_read_sensor_wrapper(uint8_t fru, uint8_t sensor_num, bool discrete, + void *value) { + int ret; + sdr_full_t *sdr; ipmi_sensor_reading_t sensor; - ret = bic_read_sensor(slot_id, sensor_num, &sensor); + ret = bic_read_sensor(fru, 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 (sensor.status) { - //printf("bic_read_sensor_wrapper: Status Asserted: 0x%X\n", sensor.status); + if (discrete) { + *(float *) value = (float) sensor.status; + return 0; } - // Check SDR to convert raw value to actual - sdr_full_t *sdr; - - switch (slot_id) { - case 1: - sdr = &g_sinfo1[sensor_num].sdr; - break; - case 2: - sdr = &g_sinfo2[sensor_num].sdr; - break; - case 3: - sdr = &g_sinfo3[sensor_num].sdr; - break; - case 4: - sdr = &g_sinfo4[sensor_num].sdr; - break; - default: - syslog(LOG_ALERT, "bic_read_sensor_wrapper: Wrong Slot ID\n"); - return -1; - } + sdr = &g_sinfo[fru-1][sensor_num].sdr; // If the SDR is not type1, no need for conversion if (sdr->type !=1) { @@ -350,106 +409,148 @@ bic_read_sensor_wrapper(uint8_t slot_id, uint8_t sensor_num, void *value) { * (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; + } + return 0; } -/* Returns the all the SDRs for the particular fru# */ -static sensor_info_t * -get_struct_sensor_info(uint8_t fru) { - sensor_info_t *sinfo; - switch(fru) { +int +yosemite_sensor_sdr_path(uint8_t fru, char *path) { + +char fru_name[16] = {0}; + +switch(fru) { case FRU_SLOT1: - sinfo = g_sinfo1; + sprintf(fru_name, "%s", "slot1"); break; case FRU_SLOT2: - sinfo = g_sinfo2; + sprintf(fru_name, "%s", "slot2"); break; case FRU_SLOT3: - sinfo = g_sinfo3; + sprintf(fru_name, "%s", "slot3"); break; case FRU_SLOT4: - sinfo = g_sinfo4; + sprintf(fru_name, "%s", "slot4"); break; case FRU_SPB: - sinfo = g_sinfo_spb; + sprintf(fru_name, "%s", "spb"); break; case FRU_NIC: - sinfo = g_sinfo_nic; + sprintf(fru_name, "%s", "nic"); break; default: - syslog(LOG_ALERT, "yosemite_sdr_init: Wrong Slot ID\n"); - return NULL; - } - return sinfo; +#ifdef DEBUG + syslog(LOG_WARNING, "yosemite_sensor_sdr_path: Wrong Slot ID\n"); +#endif + return -1; } +sprintf(path, YOSEMITE_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 */ int -get_fru_sdr_path(uint8_t fru, char *path) { +sdr_init(char *path, sensor_info_t *sinfo) { +int fd; +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, "sdr_init: open failed for %s\n", path); + return -1; +} + +while ((bytes_rd = read(fd, buf, sizeof(sdr_full_t))) > 0) { + if (bytes_rd != sizeof(sdr_full_t)) { + syslog(LOG_ERR, "sdr_init: read returns %d bytes\n", bytes_rd); + 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)); +} + +return 0; +} - char fru_name[16] = {0}; +int +yosemite_sensor_sdr_init(uint8_t fru, sensor_info_t *sinfo) { + int fd; + uint8_t buf[MAX_SDR_LEN] = {0}; + uint8_t bytes_rd = 0; + uint8_t sn = 0; + char path[64] = {0}; switch(fru) { case FRU_SLOT1: - sprintf(fru_name, "%s", "slot1"); - break; case FRU_SLOT2: - sprintf(fru_name, "%s", "slot2"); - break; case FRU_SLOT3: - sprintf(fru_name, "%s", "slot3"); - break; case FRU_SLOT4: - sprintf(fru_name, "%s", "slot4"); + if (yosemite_sensor_sdr_path(fru, path) < 0) { +#ifdef DEBUG + syslog(LOG_WARNING, "yosemite_sensor_sdr_init: get_fru_sdr_path failed\n"); +#endif + return ERR_NOT_READY; + } + + if (sdr_init(path, sinfo) < 0) { +#ifdef DEBUG + syslog(LOG_ERR, "yosemite_sensor_sdr_init: sdr_init failed for FRU %d", fru); +#endif + } break; + case FRU_SPB: - sprintf(fru_name, "%s", "spb"); - break; case FRU_NIC: - sprintf(fru_name, "%s", "nic"); - break; - default: - syslog(LOG_ALERT, "yosemite_sdr_init: Wrong Slot ID\n"); return -1; + break; } - sprintf(path, YOSEMITE_SDR_PATH, fru_name); - return 0; } static int yosemite_sdr_init(uint8_t fru) { - int fd; - uint8_t buf[MAX_SDR_LEN] = {0}; - uint8_t bytes_rd = 0; - uint8_t sn = 0; - char path[64] = {0}; - sensor_info_t *sinfo; - if (get_fru_sdr_path(fru, path) < 0) { - syslog(LOG_ALERT, "yosemite_sdr_init: get_fru_sdr_path failed\n"); - return -1; - } - sinfo = get_struct_sensor_info(fru); - if (sinfo == NULL) { - syslog(LOG_ALERT, "yosemite_sdr_init: get_struct_sensor_info failed\n"); - return -1; - } + static bool init_done[MAX_NUM_FRUS] = {false}; + + if (!init_done[fru - 1]) { + + sensor_info_t *sinfo = g_sinfo[fru-1]; + + if (yosemite_sensor_sdr_init(fru, sinfo) < 0) + return ERR_NOT_READY; - if (sdr_init(path, sinfo) < 0) { - syslog(LOG_ERR, "yosemite_sdr_init: sdr_init failed for FRU %d", fru); + init_done[fru - 1] = true; } return 0; } static bool -is_server_prsnt(uint8_t slot_id) { +is_server_prsnt(uint8_t fru) { uint8_t gpio; int val; char path[64] = {0}; - switch(slot_id) { + switch(fru) { case 1: gpio = 61; break; @@ -482,44 +583,21 @@ is_server_prsnt(uint8_t slot_id) { /* Get the units for the sensor */ int yosemite_sensor_units(uint8_t fru, uint8_t sensor_num, char *units) { - static bool init_done = false; uint8_t op, modifier; sensor_info_t *sinfo; - if (!init_done) { - - if (is_server_prsnt(1) && (yosemite_sdr_init(FRU_SLOT1) != 0)) { + if (is_server_prsnt(fru) && (yosemite_sdr_init(fru) != 0)) { return -1; } - if (is_server_prsnt(2) && (yosemite_sdr_init(FRU_SLOT2) != 0)) { - return -1; - } - if (is_server_prsnt(3) && (yosemite_sdr_init(FRU_SLOT3) != 0)) { - return -1; - } - if (is_server_prsnt(4) && (yosemite_sdr_init(FRU_SLOT4) != 0)) { - return -1; - } - init_done = true; - } switch(fru) { case FRU_SLOT1: case FRU_SLOT2: case FRU_SLOT3: case FRU_SLOT4: - sinfo = get_struct_sensor_info(fru); - if (sinfo == NULL) { - syslog(LOG_ALERT, "yosemite_sensor_units: get_struct_sensor_info failed\n"); - return -1; - } + sprintf(units, ""); + break; - if (sdr_get_sensor_units(&sinfo[sensor_num].sdr, &op, &modifier, units)) { - syslog(LOG_ALERT, "yosemite_sensor_units: FRU %d: num 0x%2X: reading units" - " from SDR failed.", fru, sensor_num); - return -1; - } - break; case FRU_SPB: switch(sensor_num) { case SP_SENSOR_INLET_TEMP: @@ -549,16 +627,10 @@ yosemite_sensor_units(uint8_t fru, uint8_t sensor_num, char *units) { case SP_SENSOR_P3V3_STBY: sprintf(units, "Volts"); break; - case SP_SENSOR_P12V_SLOT0: - sprintf(units, "Volts"); - break; case SP_SENSOR_P12V_SLOT1: - sprintf(units, "Volts"); - break; case SP_SENSOR_P12V_SLOT2: - sprintf(units, "Volts"); - break; case SP_SENSOR_P12V_SLOT3: + case SP_SENSOR_P12V_SLOT4: sprintf(units, "Volts"); break; case SP_SENSOR_P3V3: @@ -579,114 +651,132 @@ yosemite_sensor_units(uint8_t fru, uint8_t sensor_num, char *units) { } break; case FRU_NIC: - sprintf(units, ""); - break; + switch(sensor_num) { + case MEZZ_SENSOR_TEMP: + sprintf(units, "C"); + break; + } + break; } return 0; } -/* Get the name for the sensor */ int -yosemite_sensor_name(uint8_t fru, uint8_t sensor_num, char *name) { - static bool init_done = false; - uint8_t op, modifier; - sensor_info_t *sinfo; +yosemite_sensor_threshold(uint8_t fru, uint8_t sensor_num, uint8_t thresh, float *value) { - if (!init_done) { + sensor_thresh_array_init(); - if (is_server_prsnt(1) && (yosemite_sdr_init(FRU_SLOT1) != 0)) { - return -1; - } - if (is_server_prsnt(2) && (yosemite_sdr_init(FRU_SLOT2) != 0)) { - return -1; - } - if (is_server_prsnt(3) && (yosemite_sdr_init(FRU_SLOT3) != 0)) { - return -1; - } - if (is_server_prsnt(4) && (yosemite_sdr_init(FRU_SLOT4) != 0)) { - return -1; - } - init_done = true; + switch(fru) { + case FRU_SLOT1: + case FRU_SLOT2: + case FRU_SLOT3: + case FRU_SLOT4: + break; + case FRU_SPB: + *value = spb_sensor_threshold[sensor_num][thresh]; + break; + case FRU_NIC: + *value = nic_sensor_threshold[sensor_num][thresh]; + break; } + return 0; +} + +/* Get the name for the sensor */ +int +yosemite_sensor_name(uint8_t fru, uint8_t sensor_num, char *name) { switch(fru) { case FRU_SLOT1: case FRU_SLOT2: case FRU_SLOT3: case FRU_SLOT4: - sinfo = get_struct_sensor_info(fru); - if (sinfo == NULL) { - syslog(LOG_ALERT, "yosemite_sensor_name: get_struct_sensor_info failed\n"); - return -1; - } - - if (sdr_get_sensor_name(&sinfo[sensor_num].sdr, name)) { - syslog(LOG_ALERT, "yosemite_sensor_name: FRU %d: num 0x%2X: reading units" - " from SDR failed.", fru, sensor_num); - return -1; + 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: + sprintf(name, ""); + break; } - break; + case FRU_SPB: switch(sensor_num) { case SP_SENSOR_INLET_TEMP: - sprintf(name, "SP_SENSOR_INLET_TEMP"); + sprintf(name, "SP_INLET_TEMP"); break; case SP_SENSOR_OUTLET_TEMP: - sprintf(name, "SP_SENSOR_OUTLET_TEMP"); + sprintf(name, "SP_OUTLET_TEMP"); break; case SP_SENSOR_MEZZ_TEMP: - sprintf(name, "SP_SENSOR_MEZZ_TEMP"); + sprintf(name, "SP_MEZZ_TEMP"); break; case SP_SENSOR_FAN0_TACH: - sprintf(name, "SP_SENSOR_FAN0_TACH"); + sprintf(name, "SP_FAN0_TACH"); break; case SP_SENSOR_FAN1_TACH: - sprintf(name, "SP_SENSOR_FAN1_TACH"); + sprintf(name, "SP_FAN1_TACH"); break; case SP_SENSOR_AIR_FLOW: - sprintf(name, "SP_SENSOR_AIR_FLOW"); + sprintf(name, "SP_AIR_FLOW"); break; case SP_SENSOR_P5V: - sprintf(name, "SP_SENSOR_P5V"); + sprintf(name, "SP_P5V"); break; case SP_SENSOR_P12V: - sprintf(name, "SP_SENSOR_P12V"); + sprintf(name, "SP_P12V"); break; case SP_SENSOR_P3V3_STBY: - sprintf(name, "SP_SENSOR_P3V3_STBY"); - break; - case SP_SENSOR_P12V_SLOT0: - sprintf(name, "SP_SENSOR_P12V_SLOT0"); + sprintf(name, "SP_P3V3_STBY"); break; case SP_SENSOR_P12V_SLOT1: - sprintf(name, "SP_SENSOR_P12V_SLOT1"); + sprintf(name, "SP_P12V_SLOT1"); break; case SP_SENSOR_P12V_SLOT2: - sprintf(name, "SP_SENSOR_P12V_SLOT2"); + sprintf(name, "SP_P12V_SLOT2"); break; case SP_SENSOR_P12V_SLOT3: - sprintf(name, "SP_SENSOR_P12V_SLOT3"); + sprintf(name, "SP_P12V_SLOT3"); + break; + case SP_SENSOR_P12V_SLOT4: + sprintf(name, "SP_P12V_SLOT4"); break; case SP_SENSOR_P3V3: - sprintf(name, "SP_SENSOR_P3V3"); + sprintf(name, "SP_P3V3"); break; case SP_SENSOR_HSC_IN_VOLT: - sprintf(name, "SP_SENSOR_HSC_IN_VOLT"); + sprintf(name, "SP_HSC_IN_VOLT"); break; case SP_SENSOR_HSC_OUT_CURR: - sprintf(name, "SP_SENSOR_HSC_OUT_CURR"); + sprintf(name, "SP_HSC_OUT_CURR"); break; case SP_SENSOR_HSC_TEMP: - sprintf(name, "SP_SENSOR_HSC_TEMP"); + sprintf(name, "SP_HSC_TEMP"); break; case SP_SENSOR_HSC_IN_POWER: - sprintf(name, "SP_SENSOR_HSC_IN_POWER"); + sprintf(name, "SP_HSC_IN_POWER"); break; } break; case FRU_NIC: - sprintf(name, ""); + switch(sensor_num) { + case MEZZ_SENSOR_TEMP: + sprintf(name, "MEZZ_SENSOR_TEMP"); + break; + } break; } return 0; @@ -694,85 +784,100 @@ yosemite_sensor_name(uint8_t fru, uint8_t sensor_num, char *name) { int -yosemite_sensor_read(uint8_t slot_id, uint8_t sensor_num, void *value) { - static bool init_done = false; +yosemite_sensor_read(uint8_t fru, uint8_t sensor_num, void *value) { + float volt; float curr; + int ret; + bool discrete; + int i; - if (!init_done) { + switch (fru) { + case FRU_SLOT1: + case FRU_SLOT2: + case FRU_SLOT3: + case FRU_SLOT4: - if (is_server_prsnt(1) && (yosemite_sdr_init(FRU_SLOT1) != 0)) { - return -1; - } + if (!(is_server_prsnt(fru))) { + return -1; + } - if (is_server_prsnt(2) && (yosemite_sdr_init(FRU_SLOT2) != 0)) { - return -1; - } + ret = yosemite_sdr_init(fru); + if (ret < 0) { + return ret; + } - if (is_server_prsnt(3) && (yosemite_sdr_init(FRU_SLOT3) != 0)) { - return -1; - } + discrete = false; - if (is_server_prsnt(4) && (yosemite_sdr_init(FRU_SLOT4) != 0)) { - return -1; - } + i = 0; + while (i < bic_discrete_cnt) { + if (sensor_num == bic_discrete_list[i++]) { + discrete = true; + break; + } + } - init_done = true; - } + return bic_read_sensor_wrapper(fru, sensor_num, discrete, value); - switch(sensor_num) { - // Inlet, Outlet Temp - - case SP_SENSOR_INLET_TEMP: - return read_temp(SP_INLET_TEMP_DEVICE, (float*) value); - case SP_SENSOR_OUTLET_TEMP: - return read_temp(SP_OUTLET_TEMP_DEVICE, (float*) value); - - // Fan Tach Values - case SP_SENSOR_FAN0_TACH: - return read_fan_value(FAN0, FAN_TACH_RPM, (float*) value); - case SP_SENSOR_FAN1_TACH: - return read_fan_value(FAN1, FAN_TACH_RPM, (float*) value); - - // Various Voltages - case SP_SENSOR_P5V: - return read_adc_value(ADC_PIN0, ADC_VALUE, (float*) value); - case SP_SENSOR_P12V: - return read_adc_value(ADC_PIN1, ADC_VALUE, (float*) value); - case SP_SENSOR_P3V3_STBY: - return read_adc_value(ADC_PIN2, ADC_VALUE, (float*) value); - case SP_SENSOR_P12V_SLOT0: - return read_adc_value(ADC_PIN3, ADC_VALUE, (float*) value); - case SP_SENSOR_P12V_SLOT1: - return read_adc_value(ADC_PIN4, ADC_VALUE, (float*) value); - case SP_SENSOR_P12V_SLOT2: - return read_adc_value(ADC_PIN5, ADC_VALUE, (float*) value); - case SP_SENSOR_P12V_SLOT3: - return read_adc_value(ADC_PIN6, ADC_VALUE, (float*) value); - case SP_SENSOR_P3V3: - return read_adc_value(ADC_PIN7, ADC_VALUE, (float*) value); - - // Hot Swap Controller - case SP_SENSOR_HSC_IN_VOLT: - return read_hsc_value(HSC_IN_VOLT, (float*) value); - case SP_SENSOR_HSC_OUT_CURR: - return read_hsc_value(HSC_OUT_CURR, (float*) value); - case SP_SENSOR_HSC_TEMP: - return read_hsc_value(HSC_TEMP, (float*) value); - case SP_SENSOR_HSC_IN_POWER: - if (read_hsc_value(HSC_IN_VOLT, &volt)) { - return -1; - } + case FRU_SPB: + switch(sensor_num) { - if (read_hsc_value(HSC_OUT_CURR, &curr)) { - return -1; - } + // Inlet, Outlet Temp + case SP_SENSOR_INLET_TEMP: + return read_temp(SP_INLET_TEMP_DEVICE, (float*) value); + case SP_SENSOR_OUTLET_TEMP: + return read_temp(SP_OUTLET_TEMP_DEVICE, (float*) value); - * (float*) value = volt * curr; - return 0; - default: - // For all others we assume the sensors are on Monolake - return bic_read_sensor_wrapper(slot_id, sensor_num, value); + // Fan Tach Values + case SP_SENSOR_FAN0_TACH: + return read_fan_value(FAN0, FAN_TACH_RPM, (float*) value); + case SP_SENSOR_FAN1_TACH: + return read_fan_value(FAN1, FAN_TACH_RPM, (float*) value); + + // Various Voltages + case SP_SENSOR_P5V: + return read_adc_value(ADC_PIN0, ADC_VALUE, (float*) value); + case SP_SENSOR_P12V: + return read_adc_value(ADC_PIN1, ADC_VALUE, (float*) value); + case SP_SENSOR_P3V3_STBY: + return read_adc_value(ADC_PIN2, ADC_VALUE, (float*) value); + case SP_SENSOR_P12V_SLOT1: + return read_adc_value(ADC_PIN4, ADC_VALUE, (float*) value); + case SP_SENSOR_P12V_SLOT2: + return read_adc_value(ADC_PIN3, ADC_VALUE, (float*) value); + case SP_SENSOR_P12V_SLOT3: + return read_adc_value(ADC_PIN6, ADC_VALUE, (float*) value); + case SP_SENSOR_P12V_SLOT4: + return read_adc_value(ADC_PIN5, ADC_VALUE, (float*) value); + case SP_SENSOR_P3V3: + return read_adc_value(ADC_PIN7, ADC_VALUE, (float*) value); + + // Hot Swap Controller + case SP_SENSOR_HSC_IN_VOLT: + return read_hsc_value(HSC_IN_VOLT, (float*) value); + case SP_SENSOR_HSC_OUT_CURR: + return read_hsc_value(HSC_OUT_CURR, (float*) value); + case SP_SENSOR_HSC_TEMP: + return read_hsc_value(HSC_TEMP, (float*) value); + case SP_SENSOR_HSC_IN_POWER: + if (read_hsc_value(HSC_IN_VOLT, &volt)) { + return -1; + } + if (read_hsc_value(HSC_OUT_CURR, &curr)) { + return -1; + } + * (float*) value = volt * curr; + return 0; + } + break; + + case FRU_NIC: + switch(sensor_num) { + // Mezz Temp + case MEZZ_SENSOR_TEMP: + return read_nic_temp(MEZZ_SENSOR_TEMP, (float*) value); + } + break; } } |