static int check_pem_threshold_sensors()

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;
}