/* Enable the interrupt mode for all the gpio sensors */ static void enable_gpio_intr(uint8_t fru) { int i, ret; gpio_pin_t *gpios; gpios = get_struct_gpio_pin(fru); if (gpios == NULL) { syslog(LOG_WARNING, "enable_gpio_intr: get_struct_gpio_pin failed."); return; } for (i = 0; i < gpio_pin_cnt; i++) { gpios[i].flag = 0; ret = enable_gpio_intr_config(fru, gpio_pin_list[i]); if (ret < 0) { syslog(LOG_WARNING, "enable_gpio_intr: Slot: %d, Pin %d interrupt enabling" " failed", fru, gpio_pin_list[i]); syslog(LOG_WARNING, "enable_gpio_intr: Disable check for Slot %d, Pin %d", fru, gpio_pin_list[i]); } else { gpios[i].flag = 1; #ifdef DEBUG syslog(LOG_WARNING, "enable_gpio_intr: Enabled check for Slot: %d, Pin %d", fru, gpio_pin_list[i]); #endif /* DEBUG */ } } }
static void populate_gpio_pins(uint8_t fru) { int i, ret; gpio_pin_t *gpios; gpios = get_struct_gpio_pin(fru); if (gpios == NULL) { syslog(LOG_WARNING, "populate_gpio_pins: get_struct_gpio_pin failed."); return; } for(i = 0; i < gpio_pin_cnt; i++) { // Only monitor the PWRGOOD_CPU pin if (i == PWRGOOD_CPU) gpios[gpio_pin_list[i]].flag = 1; } for(i = 0; i < MAX_GPIO_PINS; i++) { if (gpios[i].flag) { gpios[i].ass_val = GETBIT(gpio_ass_val, i); ret = yosemite_get_gpio_name(fru, i, gpios[i].name); if (ret < 0) continue; } } }
/* Monitor the gpio pins */ static int gpio_monitor_poll(uint8_t fru_flag) { int i, ret; uint8_t fru; uint32_t revised_pins, n_pin_val, o_pin_val[MAX_NUM_SLOTS + 1] = {0}; gpio_pin_t *gpios; char pwr_state[MAX_VALUE_LEN]; uint32_t status; bic_gpio_t gpio = {0}; /* Check for initial Asserts */ for (fru = 1; fru <= MAX_NUM_SLOTS; fru++) { if (GETBIT(fru_flag, fru) == 0) continue; ret = bic_get_gpio(fru, &gpio); if (ret) { #ifdef DEBUG syslog(LOG_WARNING, "gpio_monitor_poll: bic_get_gpio failed for " " fru %u", fru); #endif continue; } gpios = get_struct_gpio_pin(fru); if (gpios == NULL) { syslog(LOG_WARNING, "gpio_monitor_poll: get_struct_gpio_pin failed for" " fru %u", fru); continue; } memcpy(&status, (uint8_t *) &gpio, sizeof(status)); o_pin_val[fru] = 0; for (i = 0; i < MAX_GPIO_PINS; i++) { if (gpios[i].flag == 0) continue; gpios[i].status = GETBIT(status, i); if (gpios[i].status) o_pin_val[fru] = SETBIT(o_pin_val[fru], i); if (gpios[i].status == gpios[i].ass_val) { syslog(LOG_CRIT, "ASSERT: fru: %u, num: %d, gpio pin: %-20s", fru, i, gpios[i].name); } } } /* Keep monitoring each fru's gpio pins every 4 * GPIOD_READ_DELAY seconds */ while(1) { for (fru = 1; fru <= MAX_NUM_SLOTS; fru++) { if (!(GETBIT(fru_flag, fru))) { usleep(DELAY_GPIOD_READ); continue; } gpios = get_struct_gpio_pin(fru); if (gpios == NULL) { syslog(LOG_WARNING, "gpio_monitor_poll: get_struct_gpio_pin failed for" " fru %u", fru); continue; } memset(pwr_state, 0, MAX_VALUE_LEN); pal_get_last_pwr_state(fru, pwr_state); /* Get the GPIO pins */ if ((ret = bic_get_gpio(fru, (bic_gpio_t *) &n_pin_val)) < 0) { /* log the error message only when the CPU is on but not reachable. */ if (!(strcmp(pwr_state, "on"))) { #ifdef DEBUG syslog(LOG_WARNING, "gpio_monitor_poll: bic_get_gpio failed for " " fru %u", fru); #endif } continue; } if (o_pin_val[fru] == n_pin_val) { o_pin_val[fru] = n_pin_val; usleep(DELAY_GPIOD_READ); continue; } revised_pins = (n_pin_val ^ o_pin_val[fru]); for (i = 0; i < MAX_GPIO_PINS; i++) { if (GETBIT(revised_pins, i) && (gpios[i].flag == 1)) { gpios[i].status = GETBIT(n_pin_val, i); // Check if the new GPIO val is ASSERT if (gpios[i].status == gpios[i].ass_val) { /* * GPIO - PWRGOOD_CPU assert indicates that the CPU is turned off or in a bad shape. * Raise an error and change the LPS from on to off or vice versa for deassert. */ if (!(strcmp(pwr_state, "on"))) pal_set_last_pwr_state(fru, "off"); syslog(LOG_CRIT, "ASSERT: fru: %u, num: %d, gpio pin: %-20s", fru, i, gpios[i].name); } else { if (!(strcmp(pwr_state, "off"))) pal_set_last_pwr_state(fru, "on"); syslog(LOG_CRIT, "DEASSERT: fru: %u, num: %d, gpio pin: %-20s", fru, i, gpios[i].name); } } } o_pin_val[fru] = n_pin_val; usleep(DELAY_GPIOD_READ); } /* For Loop for each fru */ } /* while loop */ } /* function definition*/
/* Monitor the gpio pins */ static int gpio_monitor_poll(uint8_t fru_flag) { int i, ret; uint8_t fru; uint32_t revised_pins, n_pin_val, o_pin_val[MAX_NUM_SLOTS + 1] = {0}; gpio_pin_t *gpios; uint32_t status; bic_gpio_t gpio = {0}; /* Check for initial Asserts */ for (fru = 1; fru <= MAX_NUM_SLOTS; fru++) { if (GETBIT(fru_flag, fru) == 0) continue; ret = bic_get_gpio(fru, &gpio); if (ret) { syslog(LOG_ALERT, "populate_gpio_pins: bic_get_gpio failed for " " fru %u", fru); continue; } gpios = get_struct_gpio_pin(fru); if (gpios == NULL) { syslog(LOG_ALERT, "gpio_monitor_poll: get_struct_gpio_pin failed for" " fru %u", fru); continue; } memcpy(&status, (uint8_t *) &gpio, sizeof(status)); o_pin_val[fru] = 0; for (i = 0; i <= MAX_GPIO_PINS; i++) { if (gpios[i].flag == 0) continue; gpios[i].status = GETBIT(status, i); if (gpios[i].status) o_pin_val[fru] = SETBIT(o_pin_val[fru], i); if (gpios[i].status == gpios[i].ass_val) { syslog(LOG_CRIT, "ASSERT: fru: %u, gpio pin: %-20s, num: %d", fru, gpios[i].name, i); } } } /* Keep monitoring each fru's gpio pins every 4 * GPIOD_READ_DELAY seconds */ while(1) { for (fru = 1; fru <= MAX_NUM_SLOTS; fru++) { if (!(GETBIT(fru_flag, fru))) { sleep(GPIOD_READ_DELAY); continue; } gpios = get_struct_gpio_pin(fru); if (gpios == NULL) { syslog(LOG_ALERT, "gpio_monitor_poll: get_struct_gpio_pin failed for" " fru %u", fru); continue; } if ((ret = bic_get_gpio(fru, (bic_gpio_t *) &n_pin_val)) < 0) { syslog(LOG_ALERT, "gpio_monitor_poll: bic_get_gpio failed for " " fru %u", fru); continue; } if (o_pin_val[fru] == n_pin_val) { o_pin_val[fru] = n_pin_val; sleep(GPIOD_READ_DELAY); continue; } revised_pins = (n_pin_val ^ o_pin_val[fru]); for (i = 0; i < MAX_GPIO_PINS; i++) { if (GETBIT(revised_pins, i) & gpios[i].flag) { gpios[i].status = GETBIT(n_pin_val, i); // Check if the new GPIO val is ASSERT if (gpios[i].status == gpios[i].ass_val) { syslog(LOG_CRIT, "ASSERT: fru: %u, gpio pin: %-20s, num: %d", fru, gpios[i].name, i); } else { syslog(LOG_CRIT, "DEASSERT: fru: %u, gpio pin: %-20s, num: %d", fru, gpios[i].name, i); } } } o_pin_val[fru] = n_pin_val; sleep(GPIOD_READ_DELAY); } /* For Loop for each fru */ } /* while loop */ } /* function definition*/