in meta-facebook/recipes-utils/pemd/files/pemd.c [317:484]
static int check_pem_threshold_sensors(uint8_t pem_num, struct pem_t *pem) {
int ret = PEM_HANDLER_NORMAL;
pem->fan_fail_cnt = 0;
for (int i = 0; i < PEM_THRESHOLD_NUM; i++) {
switch(check_threshold_sensor_status(&pem->sensors[i])) {
case SENSOR_UCR:
/* prevent duplicate log */
if(pem->sensors[i].fail_flag & SENSOR_UCR) {
continue;
}
pem->sensors[i].fail_flag |= SENSOR_UCR;
switch(pem->sensors[i].index) {
case PEM1_SENSOR_IN_VOLT:
case PEM1_SENSOR_OUT_VOLT:
case PEM1_SENSOR_POWER:
case PEM1_SENSOR_CURR:
case PEM1_SENSOR_FAN1_TACH:
case PEM1_SENSOR_FAN2_TACH:
case PEM2_SENSOR_IN_VOLT:
case PEM2_SENSOR_OUT_VOLT:
case PEM2_SENSOR_POWER:
case PEM2_SENSOR_CURR:
case PEM2_SENSOR_FAN1_TACH:
case PEM2_SENSOR_FAN2_TACH:
#if (PEM_NUM == 4)
case PEM3_SENSOR_IN_VOLT:
case PEM3_SENSOR_OUT_VOLT:
case PEM3_SENSOR_POWER:
case PEM3_SENSOR_CURR:
case PEM3_SENSOR_FAN1_TACH:
case PEM3_SENSOR_FAN2_TACH:
case PEM4_SENSOR_IN_VOLT:
case PEM4_SENSOR_OUT_VOLT:
case PEM4_SENSOR_POWER:
case PEM4_SENSOR_CURR:
case PEM4_SENSOR_FAN1_TACH:
case PEM4_SENSOR_FAN2_TACH:
#endif
OBMC_CRIT("PEM %d sensor %s UCR Error", pem_num + 1,
pem->sensors[i].sensor_name);
break;
case PEM1_SENSOR_TEMP1:
case PEM2_SENSOR_TEMP1:
#if (PEM_NUM == 4)
case PEM3_SENSOR_TEMP1:
case PEM4_SENSOR_TEMP1:
#endif
ret |= (PEM_HANDLER_ARCHIVE | PEM_HANDLER_SHUTDOWN);
OBMC_CRIT("PEM %d sensor %s (OTP) UCR Error", pem_num + 1,
pem->sensors[i].sensor_name);
break;
case PEM1_SENSOR_TEMP2:
case PEM1_SENSOR_TEMP3:
case PEM2_SENSOR_TEMP2:
case PEM2_SENSOR_TEMP3:
#if (PEM_NUM == 4)
case PEM3_SENSOR_TEMP2:
case PEM3_SENSOR_TEMP3:
case PEM4_SENSOR_TEMP2:
case PEM4_SENSOR_TEMP3:
#endif
OBMC_CRIT("PEM %d sensor %s UCR Error", pem_num + 1,
pem->sensors[i].sensor_name);
break;
}
break;
case SENSOR_UNC:
/* Check if UCR recovery */
if(pem->sensors[i].fail_flag & SENSOR_UCR) {
pem->sensors[i].fail_flag &= (~SENSOR_UCR);
pem->sensors[i].threshold_cnt[SENSOR_UCR_THRESH] = 0;
OBMC_INFO("PEM %d sensor %s UCR recovery", pem_num + 1,
pem->sensors[i].sensor_name);
}
/* prevent duplicate log */
if(pem->sensors[i].fail_flag & SENSOR_UNC) {
break;
}
pem->sensors[i].fail_flag |= SENSOR_UNC;
switch(pem->sensors[i].index) {
case PEM1_SENSOR_TEMP1:
case PEM2_SENSOR_TEMP1:
#if (PEM_NUM == 4)
case PEM3_SENSOR_TEMP1:
case PEM4_SENSOR_TEMP1:
#endif
ret |= PEM_HANDLER_ARCHIVE;
OBMC_CRIT("PEM %d sensor %s (OTP) UNC Error",
pem_num + 1, pem->sensors[i].sensor_name);
break;
}
break;
case SENSOR_LCR:
/* prevent duplicate log */
if(pem->sensors[i].fail_flag & SENSOR_LCR) {
break;
}
pem->sensors[i].fail_flag |= SENSOR_LCR;
switch(pem->sensors[i].index) {
case PEM1_SENSOR_IN_VOLT:
case PEM1_SENSOR_OUT_VOLT:
case PEM2_SENSOR_IN_VOLT:
case PEM2_SENSOR_OUT_VOLT:
#if (PEM_NUM == 4)
case PEM3_SENSOR_IN_VOLT:
case PEM3_SENSOR_OUT_VOLT:
case PEM4_SENSOR_IN_VOLT:
case PEM4_SENSOR_OUT_VOLT:
#endif
OBMC_CRIT("PEM %d sensor %s LCR Error", pem_num + 1,
pem->sensors[i].sensor_name);
break;
case PEM1_SENSOR_FAN1_TACH:
case PEM1_SENSOR_FAN2_TACH:
case PEM2_SENSOR_FAN1_TACH:
case PEM2_SENSOR_FAN2_TACH:
#if (PEM_NUM == 4)
case PEM3_SENSOR_FAN1_TACH:
case PEM3_SENSOR_FAN2_TACH:
case PEM4_SENSOR_FAN1_TACH:
case PEM4_SENSOR_FAN2_TACH:
#endif
pem->fan_fail_cnt++;
OBMC_CRIT("PEM %d sensor %s LCR Error", pem_num + 1,
pem->sensors[i].sensor_name);
break;
}
break;
case SENSOR_LNC:
/* Check if LCR recovery */
if(pem->sensors[i].fail_flag & SENSOR_LCR) {
pem->sensors[i].fail_flag &= (~SENSOR_LCR);
pem->sensors[i].threshold_cnt[SENSOR_LCR_THRESH] = 0;
OBMC_INFO("PEM %d sensor %s LCR recovery", pem_num + 1,
pem->sensors[i].sensor_name);
}
break;
default:
/* If last is normal, skip to check failure recovery */
if(pem->sensors[i].fail_flag == SENSOR_NORMAL)
break;
if(pem->sensors[i].fail_flag & SENSOR_UCR) {
pem->sensors[i].fail_flag &= (~SENSOR_UCR);
OBMC_INFO("PEM %d sensor %s UCR recovery", pem_num + 1,
pem->sensors[i].sensor_name);
}
if(pem->sensors[i].fail_flag & SENSOR_UNC) {
pem->sensors[i].fail_flag &= (~SENSOR_UNC);
OBMC_INFO("PEM %d sensor %s UNC recovery", pem_num + 1,
pem->sensors[i].sensor_name);
}
if(pem->sensors[i].fail_flag & SENSOR_LCR) {
pem->sensors[i].fail_flag &= (~SENSOR_LCR);
OBMC_INFO("PEM %d sensor %s LCR recovery", pem_num + 1,
pem->sensors[i].sensor_name);
}
if(pem->sensors[i].fail_flag & SENSOR_LNC) {
pem->sensors[i].fail_flag &= (~SENSOR_LNC);
OBMC_INFO("PEM %d sensor %s LNC recovery", pem_num + 1,
pem->sensors[i].sensor_name);
}
break;
}
}
if(pem->fan_fail_cnt >= PEM_FAN_NUM)
ret |= PEM_HANDLER_SHUTDOWN;
return ret;
}