summaryrefslogtreecommitdiffstats
path: root/meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/gpiod.c
diff options
context:
space:
mode:
Diffstat (limited to 'meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/gpiod.c')
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/gpiod.c81
1 files changed, 54 insertions, 27 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 */
OpenPOWER on IntegriCloud