diff options
Diffstat (limited to 'meta-facebook/meta-yosemite/recipes-yosemite/gpiod')
3 files changed, 78 insertions, 30 deletions
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/gpiod.c b/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/gpiod.c index 9282e00..f4bf9f9 100644 --- a/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/gpiod.c +++ b/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/gpiod.c @@ -41,7 +41,7 @@ #define GETMASK(y) (1 << y) #define MAX_NUM_SLOTS 4 -#define GPIOD_READ_DELAY 1 +#define DELAY_GPIOD_READ 500000 // Polls each slot gpio values every 4*x usec #define SOCK_PATH_GPIO "/tmp/gpio_socket" /* To hold the gpio info and status */ @@ -77,7 +77,7 @@ get_struct_gpio_pin(uint8_t fru) { gpios = gpio_slot4; break; default: - syslog(LOG_ALERT, "get_struct_gpio_pin: Wrong SLOT ID %d\n", fru); + syslog(LOG_WARNING, "get_struct_gpio_pin: Wrong SLOT ID %d\n", fru); return NULL; } @@ -116,7 +116,7 @@ enable_gpio_intr_config(uint8_t fru, uint8_t gpio) { } if (verify_cfg.ie != cfg.ie) { - syslog(LOG_ALERT, "Slot_id: %u,Interrupt enabling FAILED for GPIO pin# %d", + syslog(LOG_WARNING, "Slot_id: %u,Interrupt enabling FAILED for GPIO pin# %d", fru, gpio); return -1; } @@ -133,22 +133,24 @@ enable_gpio_intr(uint8_t fru) { gpios = get_struct_gpio_pin(fru); if (gpios == NULL) { - syslog(LOG_ALERT, "enable_gpio_intr: get_struct_gpio_pin failed."); + 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) { - gpios[i].flag = 0; - syslog(LOG_ALERT, "enable_gpio_intr: Slot: %d, Pin %d interrupt enabling" + syslog(LOG_WARNING, "enable_gpio_intr: Slot: %d, Pin %d interrupt enabling" " failed", fru, gpio_pin_list[i]); - syslog(LOG_ALERT, "enable_gpio_intr: Disable check for Slot %d, Pin %d", + 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_ALERT, "enable_gpio_intr: Enabled check for Slot: %d, Pin %d", + syslog(LOG_WARNING, "enable_gpio_intr: Enabled check for Slot: %d, Pin %d", fru, gpio_pin_list[i]); #endif /* DEBUG */ } @@ -164,12 +166,14 @@ populate_gpio_pins(uint8_t fru) { gpios = get_struct_gpio_pin(fru); if (gpios == NULL) { - syslog(LOG_ALERT, "populate_gpio_pins: get_struct_gpio_pin failed."); + syslog(LOG_WARNING, "populate_gpio_pins: get_struct_gpio_pin failed."); return; } for(i = 0; i < gpio_pin_cnt; i++) { - gpios[gpio_pin_list[i]].flag = 1; + // Only monitor the PWRGOOD_CPU pin + if (i == PWRGOOD_CPU) + gpios[gpio_pin_list[i]].flag = 1; } @@ -200,6 +204,7 @@ gpio_monitor_poll(uint8_t fru_flag) { 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}; @@ -211,14 +216,16 @@ gpio_monitor_poll(uint8_t fru_flag) { ret = bic_get_gpio(fru, &gpio); if (ret) { - syslog(LOG_ALERT, "populate_gpio_pins: bic_get_gpio failed for " +#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_ALERT, "gpio_monitor_poll: get_struct_gpio_pin failed for" + syslog(LOG_WARNING, "gpio_monitor_poll: get_struct_gpio_pin failed for" " fru %u", fru); continue; } @@ -227,7 +234,7 @@ gpio_monitor_poll(uint8_t fru_flag) { o_pin_val[fru] = 0; - for (i = 0; i <= MAX_GPIO_PINS; i++) { + for (i = 0; i < MAX_GPIO_PINS; i++) { if (gpios[i].flag == 0) continue; @@ -238,8 +245,8 @@ gpio_monitor_poll(uint8_t fru_flag) { 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); + syslog(LOG_CRIT, "ASSERT: fru: %u, num: %d, gpio pin: %-20s", + fru, i, gpios[i].name); } } } @@ -248,48 +255,68 @@ gpio_monitor_poll(uint8_t fru_flag) { while(1) { for (fru = 1; fru <= MAX_NUM_SLOTS; fru++) { if (!(GETBIT(fru_flag, fru))) { - sleep(GPIOD_READ_DELAY); + usleep(DELAY_GPIOD_READ); continue; } gpios = get_struct_gpio_pin(fru); if (gpios == NULL) { - syslog(LOG_ALERT, "gpio_monitor_poll: get_struct_gpio_pin failed for" + 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) { - syslog(LOG_ALERT, "gpio_monitor_poll: bic_get_gpio failed for " - " fru %u", fru); + /* 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; - sleep(GPIOD_READ_DELAY); + 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) { + 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) { - syslog(LOG_CRIT, "ASSERT: fru: %u, gpio pin: %-20s, num: %d", - fru, gpios[i].name, i); + /* + * 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 { - syslog(LOG_CRIT, "DEASSERT: fru: %u, gpio pin: %-20s, num: %d", - fru, gpios[i].name, i); + + 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; - sleep(GPIOD_READ_DELAY); + usleep(DELAY_GPIOD_READ); } /* For Loop for each fru */ } /* while loop */ @@ -297,7 +324,7 @@ gpio_monitor_poll(uint8_t fru_flag) { static void print_usage() { - printf("Usage: gpiod [ %s ]\n", "slot1, slot2, slot3, slot4"); + printf("Usage: gpiod [ %s ]\n", pal_server_list); } /* Spawns a pthread for each fru to monitor all the sensors on it */ diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/setup-gpiod.sh b/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/setup-gpiod.sh index 9e532f2..01df2cd 100644 --- a/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/setup-gpiod.sh +++ b/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/setup-gpiod.sh @@ -27,7 +27,28 @@ # Short-Description: Setup sensor monitoring ### END INIT INFO -# TODO: check for the if slot/server is present before starting the daemon +. /usr/local/fbpackages/utils/ast-functions + echo -n "Setup gpio monitoring for yosemite... " -/usr/local/bin/gpiod slot1 slot2 slot3 slot4 + +# Check for the slots present and run sensord for those slots only. +SLOTS= + if [ $(is_server_prsnt 1) == "1" ]; then + SLOTS="$SLOTS slot1" + fi + + if [ $(is_server_prsnt 2) == "1" ]; then + SLOTS="$SLOTS slot2" + fi + + if [ $(is_server_prsnt 3) == "1" ]; then + SLOTS="$SLOTS slot3" + fi + + if [ $(is_server_prsnt 4) == "1" ]; then + SLOTS="$SLOTS slot4" + fi + +/usr/local/bin/gpiod $SLOTS + echo "done." diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/gpiod_0.1.bb b/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/gpiod_0.1.bb index 2193a92..a815f36 100644 --- a/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/gpiod_0.1.bb +++ b/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/gpiod_0.1.bb @@ -50,7 +50,7 @@ do_install() { install -d ${D}${sysconfdir}/init.d install -d ${D}${sysconfdir}/rcS.d install -m 755 setup-gpiod.sh ${D}${sysconfdir}/init.d/setup-gpiod.sh - update-rc.d -r ${D} setup-gpiod.sh start 91 S . + update-rc.d -r ${D} setup-gpiod.sh start 91 5 . } FBPACKAGEDIR = "${prefix}/local/fbpackages" |