summaryrefslogtreecommitdiffstats
path: root/meta-facebook/meta-yosemite/recipes-yosemite
diff options
context:
space:
mode:
Diffstat (limited to 'meta-facebook/meta-yosemite/recipes-yosemite')
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/bic-cached/bic-cached_0.1.bb2
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/bic-cached/files/bic-cached.c6
-rwxr-xr-xmeta-facebook/meta-yosemite/recipes-yosemite/fan-ctrl/fan-ctrl/set_fan_speed.sh4
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fan-ctrl/fan-ctrl_0.1.bbappend2
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/bic/bic.c349
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/bic/bic.h25
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/Makefile2
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/pal.c904
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/pal.h53
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/Makefile4
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c97
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.h3
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_fruid/yosemite_fruid.c35
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_fruid/yosemite_fruid.h1
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_gpio/yosemite_gpio.c8
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/Makefile2
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c609
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.h58
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/libyosemite-sensor_0.1.bb2
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fbutils_0.1.bb4
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/bic-util/bic-util.c17
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fpc-util/Makefile10
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fpc-util/fpc-util.c85
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fw-util/Makefile10
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fw-util/fw-util.c161
-rwxr-xr-xmeta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/setup-gpio.sh102
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/yosemite-sensors/yosemite-sensors.c12
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fpc-util_0.1.bb21
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fw-util_0.1.bb21
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/files/Makefile2
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/files/front-paneld.c327
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/front-paneld_0.1.bb2
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/gpiod.c81
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/gpiod/files/setup-gpiod.sh25
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/gpiod/gpiod_0.1.bb2
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/ipmbd/ipmbd_0.1.bbappend3
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/bic.c10
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/fruid.c27
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/lan.c127
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/sensor.c14
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/ipmid/ipmid_0.2.bbappend5
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/me-util/files/Makefile10
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/me-util/files/me-util.c119
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/me-util/me-util_0.1.bb38
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/rest-api/rest-api_0.2.bbappend2
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/sensor-mon/files/setup-sensord.sh24
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/sensor-mon/sensor-mon_0.1.bbappend7
47 files changed, 2900 insertions, 534 deletions
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/bic-cached/bic-cached_0.1.bb b/meta-facebook/meta-yosemite/recipes-yosemite/bic-cached/bic-cached_0.1.bb
index ef7a15c..010e8cf 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/bic-cached/bic-cached_0.1.bb
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/bic-cached/bic-cached_0.1.bb
@@ -31,7 +31,7 @@ do_install() {
install -d ${D}${sysconfdir}/init.d
install -d ${D}${sysconfdir}/rcS.d
install -m 755 setup-bic-cached.sh ${D}${sysconfdir}/init.d/setup-bic-cached.sh
- update-rc.d -r ${D} setup-bic-cached.sh start 66 S .
+ update-rc.d -r ${D} setup-bic-cached.sh start 66 5 .
}
FBPACKAGEDIR = "${prefix}/local/fbpackages"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/bic-cached/files/bic-cached.c b/meta-facebook/meta-yosemite/recipes-yosemite/bic-cached/files/bic-cached.c
index 3a2dd28..78e443d 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/bic-cached/files/bic-cached.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/bic-cached/files/bic-cached.c
@@ -49,7 +49,7 @@ fruid_cache_init(uint8_t slot_id) {
ret = bic_read_fruid(slot_id, 0, fruid_temp_path);
if (ret) {
- syslog(LOG_ALERT, "fruid_cache_init: bic_read_fruid returns %d\n", ret);
+ syslog(LOG_WARNING, "fruid_cache_init: bic_read_fruid returns %d\n", ret);
}
rename(fruid_temp_path, fruid_path);
@@ -83,14 +83,14 @@ sdr_cache_init(uint8_t slot_id) {
unlink(path);
fd = open(path, O_WRONLY | O_CREAT | O_EXCL, 0666);
if (fd < 0) {
- syslog(LOG_ALERT, "sdr_cache_init: open fails for path: %s\n", path);
+ syslog(LOG_WARNING, "sdr_cache_init: open fails for path: %s\n", path);
return;
}
while (1) {
ret = bic_get_sdr(slot_id, &req, res, &rlen);
if (ret) {
- syslog(LOG_ALERT, "sdr_cache_init:bic_get_sdr returns %d\n", ret);
+ syslog(LOG_WARNING, "sdr_cache_init:bic_get_sdr returns %d\n", ret);
continue;
}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fan-ctrl/fan-ctrl/set_fan_speed.sh b/meta-facebook/meta-yosemite/recipes-yosemite/fan-ctrl/fan-ctrl/set_fan_speed.sh
index 49ef55b..7876619 100755
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fan-ctrl/fan-ctrl/set_fan_speed.sh
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fan-ctrl/fan-ctrl/set_fan_speed.sh
@@ -37,14 +37,14 @@ fi
# refer to the comments in init_pwn.sh regarding
# the fan unit and PWM mapping
if [ "$#" -eq 1 ]; then
- PWMS="0:0 1:0"
+ PWMS="0:0 1:1"
else
case "$2" in
"0")
PWMS="0:0"
;;
"1")
- PWMS="1:0"
+ PWMS="1:1"
;;
*)
usage
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fan-ctrl/fan-ctrl_0.1.bbappend b/meta-facebook/meta-yosemite/recipes-yosemite/fan-ctrl/fan-ctrl_0.1.bbappend
index d5659ae..eb91d6c 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fan-ctrl/fan-ctrl_0.1.bbappend
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fan-ctrl/fan-ctrl_0.1.bbappend
@@ -51,7 +51,7 @@ do_install() {
install -d ${D}${sysconfdir}/init.d
install -d ${D}${sysconfdir}/rcS.d
install -m 755 setup-fan.sh ${D}${sysconfdir}/init.d/setup-fan.sh
- update-rc.d -r ${D} setup-fan.sh start 91 S .
+ update-rc.d -r ${D} setup-fan.sh start 91 5 .
}
FBPACKAGEDIR = "${prefix}/local/fbpackages"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/bic/bic.c b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/bic/bic.c
index 55cd56b..4139b44 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/bic/bic.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/bic/bic.c
@@ -22,10 +22,15 @@
#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
+#include <syslog.h>
#include "bic.h"
#define FRUID_READ_COUNT_MAX 0x30
+#define FRUID_WRITE_COUNT_MAX 0x30
+#define CPLD_WRITE_COUNT_MAX 0x50
#define SDR_READ_COUNT_MAX 0x1A
+#define SIZE_SYS_GUID 16
+#define SIZE_IANA_ID 3
enum {
IPMB_BUS_SLOT1 = 3,
@@ -87,7 +92,9 @@ bic_ipmb_wrapper(uint8_t slot_id, uint8_t netfn, uint8_t cmd,
ret = get_ipmb_bus_id(slot_id);
if (ret < 0) {
- printf("bic_ipmb_wrapper: Wrong Slot ID %d\n", slot_id);
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_ipmb_wrapper: Wrong Slot ID %d\n", slot_id);
+#endif
return ret;
}
@@ -114,8 +121,11 @@ bic_ipmb_wrapper(uint8_t slot_id, uint8_t netfn, uint8_t cmd,
// Invoke IPMB library handler
lib_ipmb_handle(bus_id, tbuf, tlen, &rbuf, &rlen);
+
if (rlen == 0) {
- printf("bic_ipmb_wrapper: Zero bytes received\n");
+#ifdef DEBUG
+ syslog(LOG_DEBUG, "bic_ipmb_wrapper: Zero bytes received\n");
+#endif
return -1;
}
@@ -123,7 +133,9 @@ bic_ipmb_wrapper(uint8_t slot_id, uint8_t netfn, uint8_t cmd,
res = (ipmb_res_t*) rbuf;
if (res->cc) {
- printf("bic_ipmb_wrapper: Completion Code: 0x%X\n", res->cc);
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_ipmb_wrapper: Completion Code: 0x%X\n", res->cc);
+#endif
return -1;
}
@@ -148,17 +160,23 @@ bic_get_dev_id(uint8_t slot_id, ipmi_dev_id_t *dev_id) {
// Get GPIO value and configuration
int
bic_get_gpio(uint8_t slot_id, bic_gpio_t *gpio) {
+ uint8_t tbuf[3] = {0x15, 0xA0, 0x00}; // IANA ID
+ uint8_t rbuf[7] = {0x00};
uint8_t rlen = 0;
int ret;
- ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_GET_GPIO, NULL, 0, (uint8_t*) gpio, &rlen);
+ ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_GET_GPIO, tbuf, 0x03, rbuf, &rlen);
+
+ // Ignore first 3 bytes of IANA ID
+ memcpy((uint8_t*) gpio, &rbuf[3], 4);
return ret;
}
int
bic_get_gpio_config(uint8_t slot_id, uint8_t gpio, bic_gpio_config_t *gpio_config) {
- uint8_t tbuf[4] = {0};
+ uint8_t tbuf[7] = {0x15, 0xA0, 0x00}; // IANA ID
+ uint8_t rbuf[4] = {0x00};
uint8_t rlen = 0;
uint8_t tlen = 0;
uint32_t pin;
@@ -166,75 +184,245 @@ bic_get_gpio_config(uint8_t slot_id, uint8_t gpio, bic_gpio_config_t *gpio_confi
pin = 1 << gpio;
- tbuf[0] = pin & 0xFF;
- tbuf[1] = (pin >> 8) & 0xFF;
- tbuf[2] = (pin >> 16) & 0xFF;
- tbuf[3] = (pin >> 24) & 0xFF;
+ tbuf[3] = pin & 0xFF;
+ tbuf[4] = (pin >> 8) & 0xFF;
+ tbuf[5] = (pin >> 16) & 0xFF;
+ tbuf[6] = (pin >> 24) & 0xFF;
- tlen = 4;
+ tlen = 7;
- ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_GET_GPIO_CONFIG, tbuf, tlen, (uint8_t *) gpio_config, &rlen);
+ ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_GET_GPIO_CONFIG, tbuf, tlen, rbuf, &rlen);
+
+ // Ignore IANA ID
+ *(uint8_t *) gpio_config = rbuf[3];
return ret;
}
int
bic_set_gpio_config(uint8_t slot_id, uint8_t gpio, bic_gpio_config_t *gpio_config) {
- uint8_t tbuf[5] = {0};
+ uint8_t tbuf[8] = {0x15, 0xA0, 0x00}; // IANA ID
+ uint8_t rbuf[4] = {0x00};
uint8_t rlen = 0;
uint8_t tlen = 0;
uint32_t pin;
- uint8_t res;
int ret;
pin = 1 << gpio;
- tbuf[0] = pin & 0xFF;
- tbuf[1] = (pin >> 8) & 0xFF;
- tbuf[2] = (pin >> 16) & 0xFF;
- tbuf[3] = (pin >> 24) & 0xFF;
- tbuf[4] = (*(uint8_t *) gpio_config) & 0x1F;
+ tbuf[3] = pin & 0xFF;
+ tbuf[4] = (pin >> 8) & 0xFF;
+ tbuf[5] = (pin >> 16) & 0xFF;
+ tbuf[6] = (pin >> 24) & 0xFF;
+ tbuf[7] = (*(uint8_t *) gpio_config) & 0x1F;
- tlen = 5;
+ tlen = 8;
ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_SET_GPIO_CONFIG,
- tbuf, tlen, &res, &rlen);
+ tbuf, tlen, rbuf, &rlen);
return ret;
}
// Get BIC Configuration
int
bic_get_config(uint8_t slot_id, bic_config_t *cfg) {
+ uint8_t tbuf[3] = {0x15, 0xA0, 0x00}; // IANA ID
+ uint8_t rbuf[4] = {0x00};
uint8_t rlen = 0;
int ret;
ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_GET_CONFIG,
- NULL, 0x00, (uint8_t *) cfg, &rlen);
+ tbuf, 0x03, rbuf, &rlen);
+ // Ignore IANA ID
+ *(uint8_t *) cfg = rbuf[3];
+
return ret;
}
// Set BIC Configuration
int
bic_set_config(uint8_t slot_id, bic_config_t *cfg) {
+ uint8_t tbuf[4] = {0x15, 0xA0, 0x00}; // IANA ID
uint8_t rlen = 0;
uint8_t rbuf[4] = {0};
int ret;
+ tbuf[3] = *(uint8_t *) cfg;
+
ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_SET_CONFIG,
- (uint8_t *) cfg, 1, rbuf, &rlen);
+ tbuf, 0x04, rbuf, &rlen);
return ret;
}
// Read POST Buffer
int
bic_get_post_buf(uint8_t slot_id, uint8_t *buf, uint8_t *len) {
+ uint8_t tbuf[3] = {0x15, 0xA0, 0x00}; // IANA ID
+ uint8_t rbuf[255] = {0x00};
+ uint8_t rlen = 0;
+ int ret;
+
+ ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_GET_POST_BUF, tbuf, 0x03, rbuf, &rlen);
+
+ //Ignore IANA ID
+ memcpy(buf, &rbuf[3], rlen-3);
+
+ *len = rlen - 3;
+
+ return ret;
+}
+
+// Read Firwmare Versions of various components
+int
+bic_get_fw_ver(uint8_t slot_id, uint8_t comp, uint8_t *ver) {
+ uint8_t tbuf[4] = {0x15, 0xA0, 0x00}; // IANA ID
+ uint8_t rbuf[16] = {0x00};
+ uint8_t rlen = 0;
int ret;
- ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_GET_POST_BUF, NULL, 0, buf, len);
+ // Fill the component for which firmware is requested
+ tbuf[3] = comp;
+
+ ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_GET_FW_VER, tbuf, 0x04, rbuf, &rlen);
+ // fw version has to be between 2 and 5 bytes based on component
+ if (ret || (rlen < 2+SIZE_IANA_ID) || (rlen > 5+SIZE_IANA_ID)) {
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_get_fw_ver: ret: %d, rlen: %d\n", ret, rlen);
+#endif
+ return -1;
+ }
+
+ //Ignore IANA ID
+ memcpy(ver, &rbuf[3], rlen-3);
return ret;
}
+// Update firmware for various components
+static int
+_update_fw(uint8_t slot_id, uint8_t target, uint32_t offset, uint16_t len, uint8_t *buf) {
+ uint8_t tbuf[256] = {0x15, 0xA0, 0x00}; // IANA ID
+ uint8_t rbuf[16] = {0x00};
+ uint8_t tlen = 0;
+ uint8_t rlen = 0;
+ int ret;
+ int retries = 3;
+
+ // Fill the component for which firmware is requested
+ tbuf[3] = target;
+
+ tbuf[4] = (offset) & 0xFF;
+ tbuf[5] = (offset >> 8) & 0xFF;
+ tbuf[6] = (offset >> 16) & 0xFF;
+ tbuf[7] = (offset >> 24) & 0xFF;
+
+ tbuf[8] = len & 0xFF;
+ tbuf[9] = (len >> 8) & 0xFF;
+
+ memcpy(&tbuf[10], buf, len);
+
+ printf("_update_fw: target: %d, offset: %d, len: %d\n", target, offset, len);
+
+ tlen = len + 10;
+
+bic_send:
+ ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_UPDATE_FW, tbuf, tlen, rbuf, &rlen);
+ if ((ret) && (retries--)) {
+ sleep(1);
+ printf("_update_fw: retrying..\n");
+ goto bic_send;
+ }
+
+ return ret;
+}
+
+int
+bic_update_fw(uint8_t slot_id, uint8_t comp, char *path) {
+ int ret;
+ uint32_t offset;
+ uint16_t count;
+ uint8_t buf[256] = {0};
+ uint8_t len = 0;
+ uint8_t target;
+ int fd;
+
+ // Open the file exclusively for read
+ fd = open(path, O_RDONLY, 0666);
+ if (fd < 0) {
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_update_fw: open fails for path: %s\n", path);
+#endif
+ goto error_exit;
+ }
+
+ // Write chunks of CPLD binary data in a loop
+ offset = 0;
+ while (1) {
+ // Read from file
+ count = read(fd, buf, CPLD_WRITE_COUNT_MAX);
+ if (count <= 0) {
+ break;
+ }
+
+ if (count == CPLD_WRITE_COUNT_MAX) {
+ target = comp;
+ } else {
+ target = comp | 0x80;
+ }
+
+ // Write to the CPLD
+ ret = _update_fw(slot_id, target, offset, count, buf);
+ if (ret) {
+ break;
+ }
+
+ // Update counter
+ offset += count;
+ }
+
+error_exit:
+ if (fd > 0 ) {
+ close(fd);
+ }
+
+ return ret;
+}
+
+int
+bic_me_xmit(uint8_t slot_id, uint8_t *txbuf, uint8_t txlen, uint8_t *rxbuf, uint8_t *rxlen) {
+ uint8_t tbuf[256] = {0x15, 0xA0, 0x00}; // IANA ID
+ uint8_t rbuf[256] = {0x00};
+ uint8_t rlen = 0;
+ uint8_t tlen = 0;
+ int ret;
+
+ // Fill the interface number as ME
+ tbuf[3] = BIC_INTF_ME;
+
+ // Fill the data to be sent
+ memcpy(&tbuf[4], txbuf, txlen);
+
+ // Send data length includes IANA ID and interface number
+ tlen = txlen + 4;
+
+ ret = bic_ipmb_wrapper(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_MSG_OUT, tbuf, tlen, rbuf, &rlen);
+ if (ret ) {
+ return -1;
+ }
+
+ // Make sure the received interface number is same
+ if (rbuf[3] != tbuf[3]) {
+ return -1;
+ }
+
+ // Copy the received data to caller skipping header
+ memcpy(rxbuf, &rbuf[7], rlen-7);
+
+ *rxlen = rlen-7;
+
+ return 0;
+}
+
// Read 1S server's FRUID
int
bic_get_fruid_info(uint8_t slot_id, uint8_t fru_id, ipmi_fruid_info_t *info) {
@@ -279,19 +467,23 @@ bic_read_fruid(uint8_t slot_id, uint8_t fru_id, const char *path) {
// Open the file exclusively for write
fd = open(path, O_WRONLY | O_CREAT | O_EXCL, 0666);
if (fd < 0) {
- printf("bic_read_fruid: open fails for path: %s\n", path);
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_read_fruid: open fails for path: %s\n", path);
+#endif
goto error_exit;
}
// Read the FRUID information
ret = bic_get_fruid_info(slot_id, fru_id, &info);
if (ret) {
- printf("bic_read_fruid: bic_read_fruid_info returns %d\n", ret);
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_read_fruid: bic_read_fruid_info returns %d\n", ret);
+#endif
goto error_exit;
}
// Indicates the size of the FRUID
- nread = (info.size_msb << 8) + (info.size_lsb);
+ nread = (info.size_msb << 6) + (info.size_lsb);
// Read chunks of FRUID binary data in a loop
offset = 0;
@@ -304,7 +496,9 @@ bic_read_fruid(uint8_t slot_id, uint8_t fru_id, const char *path) {
ret = _read_fruid(slot_id, fru_id, offset, count, rbuf, &rlen);
if (ret) {
- printf("bic_read_fruid: ipmb_wrapper fails\n");
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_read_fruid: ipmb_wrapper fails\n");
+#endif
goto error_exit;
}
@@ -324,6 +518,79 @@ error_exit:
return ret;
}
+static int
+_write_fruid(uint8_t slot_id, uint8_t fru_id, uint32_t offset, uint8_t count, uint8_t *buf) {
+ int ret;
+ uint8_t tbuf[64] = {0};
+ uint8_t rbuf[4] = {0};
+ uint8_t tlen = 0;
+ uint8_t rlen = 0;
+
+ tbuf[0] = fru_id;
+ tbuf[1] = offset & 0xFF;
+ tbuf[2] = (offset >> 8) & 0xFF;
+
+ memcpy(&tbuf[3], buf, count);
+ tlen = count + 3;
+
+ ret = bic_ipmb_wrapper(slot_id, NETFN_STORAGE_REQ, CMD_STORAGE_WRITE_FRUID_DATA, tbuf, tlen, rbuf, &rlen);
+
+ if (ret) {
+ return ret;
+ }
+
+ if (rbuf[0] != count) {
+ return -1;
+ }
+
+ return ret;
+}
+
+int
+bic_write_fruid(uint8_t slot_id, uint8_t fru_id, const char *path) {
+ int ret;
+ uint32_t offset;
+ uint8_t count;
+ uint8_t buf[64] = {0};
+ uint8_t len = 0;
+ int fd;
+
+ // Open the file exclusively for read
+ fd = open(path, O_RDONLY, 0666);
+ if (fd < 0) {
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_write_fruid: open fails for path: %s\n", path);
+#endif
+ goto error_exit;
+ }
+
+ // Write chunks of FRUID binary data in a loop
+ offset = 0;
+ while (1) {
+ // Read from file
+ count = read(fd, buf, FRUID_WRITE_COUNT_MAX);
+ if (count <= 0) {
+ break;
+ }
+
+ // Write to the FRUID
+ ret = _write_fruid(slot_id, fru_id, offset, count, buf);
+ if (ret) {
+ break;
+ }
+
+ // Update counter
+ offset += count;
+ }
+
+error_exit:
+ if (fd > 0 ) {
+ close(fd);
+ }
+
+ return ret;
+}
+
// Read System Event Log (SEL)
int
bic_get_sel_info(uint8_t slot_id, ipmi_sel_sdr_info_t *info) {
@@ -398,7 +665,9 @@ bic_get_sdr(uint8_t slot_id, ipmi_sel_sdr_req_t *req, ipmi_sel_sdr_res_t *res, u
// Get SDR reservation ID for the given record
ret = _get_sdr_rsv(slot_id, &req->rsv_id);
if (ret) {
- printf("bic_read_sdr: _get_sdr_rsv returns %d\n", ret);
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_read_sdr: _get_sdr_rsv returns %d\n", ret);
+#endif
return ret;
}
@@ -411,7 +680,9 @@ bic_get_sdr(uint8_t slot_id, ipmi_sel_sdr_req_t *req, ipmi_sel_sdr_res_t *res, u
ret = _get_sdr(slot_id, req, tbuf, &tlen);
if (ret) {
- printf("bic_read_sdr: _get_sdr returns %d\n", ret);
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_read_sdr: _get_sdr returns %d\n", ret);
+#endif
return ret;
}
@@ -439,7 +710,9 @@ bic_get_sdr(uint8_t slot_id, ipmi_sel_sdr_req_t *req, ipmi_sel_sdr_res_t *res, u
ret = _get_sdr(slot_id, req, tbuf, &tlen);
if (ret) {
- printf("bic_read_sdr: _get_sdr returns %d\n", ret);
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_read_sdr: _get_sdr returns %d\n", ret);
+#endif
return ret;
}
@@ -464,3 +737,19 @@ bic_read_sensor(uint8_t slot_id, uint8_t sensor_num, ipmi_sensor_reading_t *sens
return ret;
}
+
+int
+bic_get_sys_guid(uint8_t slot_id, uint8_t *guid) {
+ int ret;
+ int rlen = 0;
+
+ ret = bic_ipmb_wrapper(slot_id, NETFN_APP_REQ, CMD_APP_GET_SYSTEM_GUID, NULL, 0, guid, &rlen);
+ if (rlen != SIZE_SYS_GUID) {
+#ifdef DEBUG
+ syslog(LOG_ERR, "bic_get_sys_guid: returned rlen of %d\n");
+#endif
+ return -1;
+ }
+
+ return ret;
+}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/bic/bic.h b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/bic/bic.h
index 47b0baa..7110574 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/bic/bic.h
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/bic/bic.h
@@ -66,6 +66,23 @@ enum {
RESERVED_31,
};
+enum {
+ FW_CPLD = 1,
+ FW_BIC,
+ FW_ME,
+ FW_PVCCIN_VR,
+ FW_DDRAB_VR,
+ FW_P1V05_VR,
+ FW_PVCCGBE_VR,
+ FW_PVCCSCSUS_VR,
+};
+
+enum {
+ UPDATE_BIOS = 0,
+ UPDATE_CPLD,
+ UPDATE_BIC_BOOT
+};
+
// Bridge IC Spec
typedef struct _bic_gpio_t {
uint32_t pwrgood_cpu:1;
@@ -138,6 +155,7 @@ int bic_get_post_buf(uint8_t slot_id, uint8_t *buf, uint8_t *len);
int bic_get_fruid_info(uint8_t slot_id, uint8_t fru_id, ipmi_fruid_info_t *info);
int bic_read_fruid(uint8_t slot_id, uint8_t fru_id, const char *path);
+int bic_write_fruid(uint8_t slot_id, uint8_t fru_id, const char *path);
int bic_get_sel_info(uint8_t slot_id, ipmi_sel_sdr_info_t *info);
int bic_get_sel_rsv(uint8_t slot_id, uint16_t *rsv);
@@ -149,6 +167,13 @@ int bic_get_sdr(uint8_t slot_id, ipmi_sel_sdr_req_t *req, ipmi_sel_sdr_res_t *re
int bic_read_sensor(uint8_t slot_id, uint8_t sensor_num, ipmi_sensor_reading_t *sensor);
+int bic_get_sys_guid(uint8_t slot_id, uint8_t *guid);
+
+int bic_get_fw_ver(uint8_t slot_id, uint8_t comp, uint8_t *ver);
+
+int bic_update_fw(uint8_t slot_id, uint8_t comp, char *path);
+int bic_me_xmit(uint8_t slot_id, uint8_t *txbuf, uint8_t txlen, uint8_t *rxbuf, uint8_t *rxlen);
+
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/Makefile b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/Makefile
index bab4007..c207a7d 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/Makefile
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/Makefile
@@ -2,7 +2,7 @@
lib: libpal.so
libpal.so: pal.c
- $(CC) $(CFLAGS) -fPIC -c -o pal.o pal.c
+ $(CC) $(CFLAGS) -fPIC -c -pthread -o pal.o pal.c
$(CC) -lbic -lyosemite_common -lyosemite_fruid -lyosemite_sensor -shared -o libpal.so pal.o -lc
.PHONY: clean
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/pal.c b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/pal.c
index 93a5fbf..ec0be12 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/pal.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/pal.c
@@ -27,6 +27,7 @@
#include <syslog.h>
#include <sys/mman.h>
#include <string.h>
+#include <pthread.h>
#include "pal.h"
#define BIT(value, index) ((value >> index) & 1)
@@ -45,8 +46,11 @@
#define GPIO_RST_BTN 144
#define GPIO_PWR_BTN 24
+#define GPIO_HB_LED 135
+
#define GPIO_USB_SW0 36
#define GPIO_USB_SW1 37
+#define GPIO_USB_MUX_EN_N 147
#define GPIO_UART_SEL0 32
#define GPIO_UART_SEL1 33
@@ -68,20 +72,27 @@
#define AST_SCU_BASE 0x1e6e2000
#define PIN_CTRL1_OFFSET 0x80
#define PIN_CTRL2_OFFSET 0x84
+#define AST_WDT_BASE 0x1e785000
+#define WDT_OFFSET 0x10
#define UART1_TXD (1 << 22)
#define UART2_TXD (1 << 30)
#define UART3_TXD (1 << 22)
#define UART4_TXD (1 << 30)
-#define BIT(v, i) ((v >> i) & 1)
#define DELAY_GRACEFUL_SHUTDOWN 1
-#define DELAY_POWER_OFF 5
-
-static uint8_t gpio_rst_btn[5] = { 0, 57, 56, 59, 58 };
-static uint8_t gpio_led[5] = { 0, 97, 96, 99, 98 };
-static uint8_t gpio_prsnt[5] = { 0, 61, 60, 63, 62 };
-static uint8_t gpio_power[5] = { 0, 27, 25, 31, 29 };
+#define DELAY_POWER_OFF 6
+#define DELAY_POWER_CYCLE 10
+#define DELAY_12V_CYCLE 5
+
+#define CRASHDUMP_BIN "/usr/local/bin/dump.sh"
+#define CRASHDUMP_FILE "/mnt/data/crashdump_"
+const static uint8_t gpio_rst_btn[] = { 0, 57, 56, 59, 58 };
+const static uint8_t gpio_led[] = { 0, 97, 96, 99, 98 };
+const static uint8_t gpio_id_led[] = { 0, 41, 40, 43, 42 };
+const static uint8_t gpio_prsnt[] = { 0, 61, 60, 63, 62 };
+const static uint8_t gpio_power[] = { 0, 27, 25, 31, 29 };
+const static uint8_t gpio_12v[] = { 0, 117, 116, 119, 118 };
const char pal_fru_list[] = "all, slot1, slot2, slot3, slot4, spb, nic";
const char pal_server_list[] = "slot1, slot2, slot3, slot4";
@@ -90,6 +101,16 @@ char * key_list[] = {
"pwr_server2_last_state",
"pwr_server3_last_state",
"pwr_server4_last_state",
+"sysfw_ver_slot1",
+"sysfw_ver_slot2",
+"sysfw_ver_slot3",
+"sysfw_ver_slot4",
+"identify_sled",
+"identify_slot1",
+"identify_slot2",
+"identify_slot3",
+"identify_slot4",
+"timestamp_sled",
"slot1_por_cfg",
"slot2_por_cfg",
"slot3_por_cfg",
@@ -98,6 +119,29 @@ char * key_list[] = {
LAST_KEY /* This is the last key of the list */
};
+char * def_val_list[] = {
+ "on", /* pwr_server1_last_state */
+ "on", /* pwr_server2_last_state */
+ "on", /* pwr_server3_last_state */
+ "on", /* pwr_server4_last_state */
+ "0", /* sysfw_ver_slot1 */
+ "0", /* sysfw_ver_slot2 */
+ "0", /* sysfw_ver_slot3 */
+ "0", /* sysfw_ver_slot4 */
+ "off", /* identify_sled */
+ "off", /* identify_slot1 */
+ "off", /* identify_slot2 */
+ "off", /* identify_slot3 */
+ "off", /* identify_slot4 */
+ "0", /* timestamp_sled */
+ "on", /* slot1_por_cfg */
+ "on", /* slot2_por_cfg */
+ "on", /* slot3_por_cfg */
+ "on", /* slot4_por_cfg */
+ /* Add more def values for the correspoding keys*/
+ LAST_KEY /* Same as last entry of the key_list */
+};
+
// Helper Functions
static int
read_device(const char *device, int *value) {
@@ -107,15 +151,18 @@ read_device(const char *device, int *value) {
fp = fopen(device, "r");
if (!fp) {
int err = errno;
-
+#ifdef DEBUG
syslog(LOG_INFO, "failed to open device %s", device);
+#endif
return err;
}
rc = fscanf(fp, "%d", value);
fclose(fp);
if (rc != 1) {
+#ifdef DEBUG
syslog(LOG_INFO, "failed to read device %s", device);
+#endif
return ENOENT;
} else {
return 0;
@@ -130,8 +177,9 @@ write_device(const char *device, const char *value) {
fp = fopen(device, "w");
if (!fp) {
int err = errno;
-
+#ifdef DEBUG
syslog(LOG_INFO, "failed to open device for write %s", device);
+#endif
return err;
}
@@ -139,7 +187,9 @@ write_device(const char *device, const char *value) {
fclose(fp);
if (rc < 0) {
+#ifdef DEBUG
syslog(LOG_INFO, "failed to write device %s", device);
+#endif
return ENOENT;
} else {
return 0;
@@ -204,6 +254,42 @@ server_power_off(uint8_t slot_id, bool gs_flag) {
return 0;
}
+// Control 12V to the server in a given slot
+static int
+server_12v_on(uint8_t slot_id) {
+ char vpath[64] = {0};
+
+ if (slot_id < 1 || slot_id > 4) {
+ return -1;
+ }
+
+ sprintf(vpath, GPIO_VAL, gpio_12v[slot_id]);
+
+ if (write_device(vpath, "1")) {
+ return -1;
+ }
+
+ return 0;
+}
+
+// Turn off 12V for the server in given slot
+static int
+server_12v_off(uint8_t slot_id) {
+ char vpath[64] = {0};
+
+ if (slot_id < 1 || slot_id > 4) {
+ return -1;
+ }
+
+ sprintf(vpath, GPIO_VAL, gpio_12v[slot_id]);
+
+ if (write_device(vpath, "0")) {
+ return -1;
+ }
+
+ return 0;
+}
+
// Debug Card's UART and BMC/SoL port share UART port and need to enable only
// one TXD i.e. either BMC's TXD or Debug Port's TXD.
static int
@@ -216,7 +302,9 @@ control_sol_txd(uint8_t slot) {
scu_fd = open("/dev/mem", O_RDWR | O_SYNC );
if (scu_fd < 0) {
- syslog(LOG_ALERT, "control_sol_txd: open fails\n");
+#ifdef DEBUG
+ syslog(LOG_WARNING, "control_sol_txd: open fails\n");
+#endif
return -1;
}
@@ -295,7 +383,9 @@ pal_post_display(uint8_t status) {
int ret;
char *val;
- syslog(LOG_ALERT, "pal_post_display: status is %d\n", status);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "pal_post_display: status is %d\n", status);
+#endif
sprintf(path, GPIO_VAL, GPIO_POSTCODE_0);
@@ -396,7 +486,9 @@ pal_post_display(uint8_t status) {
post_exit:
if (ret) {
- syslog(LOG_ALERT, "write_device failed for %s\n", path);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "write_device failed for %s\n", path);
+#endif
return -1;
} else {
return 0;
@@ -453,11 +545,10 @@ pal_is_debug_card_prsnt(uint8_t *status) {
return -1;
}
- // TODO: Logic is reversed until DVT board with h/w fix
if (val == 0x0) {
- *status = 0;
- } else {
*status = 1;
+ } else {
+ *status = 0;
}
return 0;
@@ -466,11 +557,19 @@ pal_is_debug_card_prsnt(uint8_t *status) {
int
pal_get_server_power(uint8_t slot_id, uint8_t *status) {
int ret;
+ char value[MAX_VALUE_LEN];
bic_gpio_t gpio;
ret = bic_get_gpio(slot_id, &gpio);
if (ret) {
- return ret;
+ // Check for if the BIC is irresponsive due to 12V_OFF or 12V_CYCLE
+ pal_get_last_pwr_state(slot_id, value);
+ if (!(strcmp(value, "off"))) {
+ *status = SERVER_POWER_OFF;
+ return 0;
+ } else {
+ return ret;
+ }
}
if (gpio.pwrgood_cpu) {
@@ -512,10 +611,18 @@ pal_set_server_power(uint8_t slot_id, uint8_t cmd) {
break;
case SERVER_POWER_CYCLE:
- if (status == SERVER_POWER_ON)
- return (server_power_off(slot_id, gs_flag) || server_power_on(slot_id));
- else if (status == SERVER_POWER_OFF)
+ if (status == SERVER_POWER_ON) {
+ if (server_power_off(slot_id, gs_flag))
+ return -1;
+
+ sleep(DELAY_POWER_CYCLE);
+
+ return server_power_on(slot_id);
+
+ } else if (status == SERVER_POWER_OFF) {
+
return (server_power_on(slot_id));
+ }
break;
case SERVER_GRACEFUL_SHUTDOWN:
@@ -525,6 +632,23 @@ pal_set_server_power(uint8_t slot_id, uint8_t cmd) {
gs_flag = true;
return server_power_off(slot_id, gs_flag);
break;
+
+ case SERVER_12V_ON:
+ return server_12v_on(slot_id);
+ break;
+
+ case SERVER_12V_OFF:
+ return server_12v_off(slot_id);
+ break;
+
+ case SERVER_12V_CYCLE:
+ if (server_12v_off(slot_id)) {
+ return -1;
+ }
+
+ sleep(DELAY_12V_CYCLE);
+
+ return (server_12v_on(slot_id));
default:
return -1;
}
@@ -582,20 +706,20 @@ pal_get_hand_sw(uint8_t *pos) {
loc = ((id8 << 3) | (id4 << 2) | (id2 << 1) | (id1));
switch(loc) {
+ case 0:
+ case 5:
+ *pos = HAND_SW_SERVER1;
+ break;
case 1:
case 6:
- *pos = HAND_SW_SERVER1;
+ *pos = HAND_SW_SERVER2;
break;
case 2:
case 7:
- *pos = HAND_SW_SERVER2;
+ *pos = HAND_SW_SERVER3;
break;
case 3:
case 8:
- *pos = HAND_SW_SERVER3;
- break;
- case 4:
- case 9:
*pos = HAND_SW_SERVER4;
break;
default:
@@ -657,9 +781,9 @@ pal_set_rst_btn(uint8_t slot, uint8_t status) {
}
if (status) {
- val = "0";
- } else {
val = "1";
+ } else {
+ val = "0";
}
sprintf(path, GPIO_VAL, gpio_rst_btn[slot]);
@@ -694,6 +818,81 @@ pal_set_led(uint8_t slot, uint8_t status) {
return 0;
}
+// Update Heartbeet LED
+int
+pal_set_hb_led(uint8_t status) {
+ char path[64] = {0};
+ char *val;
+
+ if (status) {
+ val = "1";
+ } else {
+ val = "0";
+ }
+
+ sprintf(path, GPIO_VAL, GPIO_HB_LED);
+ if (write_device(path, val)) {
+ return -1;
+ }
+
+ return 0;
+}
+
+// Update the Identification LED for the given slot with the status
+int
+pal_set_id_led(uint8_t slot, uint8_t status) {
+ char path[64] = {0};
+ char *val;
+
+ if (slot < 1 || slot > 4) {
+ return -1;
+ }
+
+ if (status) {
+ val = "1";
+ } else {
+ val = "0";
+ }
+
+ sprintf(path, GPIO_VAL, gpio_id_led[slot]);
+ if (write_device(path, val)) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static int
+set_usb_mux(uint8_t state) {
+ int val;
+ char *new_state;
+ char path[64] = {0};
+
+ sprintf(path, GPIO_VAL, GPIO_USB_MUX_EN_N);
+
+ if (read_device(path, &val)) {
+ return -1;
+ }
+
+ // This GPIO Pin is active low
+ if (!val == state)
+ return 0;
+
+ if (state)
+ new_state = "0";
+ else
+ new_state = "1";
+
+ if (write_device(path, new_state) < 0) {
+#ifdef DEBUG
+ syslog(LOG_WARNING, "write_device failed for %s\n", path);
+#endif
+ return -1;
+ }
+
+ return 0;
+}
+
// Update the USB Mux to the server at given slot
int
pal_switch_usb_mux(uint8_t slot) {
@@ -702,36 +901,49 @@ pal_switch_usb_mux(uint8_t slot) {
// Based on the USB mux table in Schematics
switch(slot) {
- case 1:
+ case HAND_SW_SERVER1:
gpio_sw0 = "1";
gpio_sw1 = "0";
break;
- case 2:
+ case HAND_SW_SERVER2:
gpio_sw0 = "0";
gpio_sw1 = "0";
break;
- case 3:
+ case HAND_SW_SERVER3:
gpio_sw0 = "1";
gpio_sw1 = "1";
break;
- case 4:
+ case HAND_SW_SERVER4:
gpio_sw0 = "0";
gpio_sw1 = "1";
break;
+ case HAND_SW_BMC:
+ // Disable the USB MUX
+ if (set_usb_mux(USB_MUX_OFF) < 0)
+ return -1;
+ else
+ return 0;
default:
- // Default is for BMC itself
return 0;
}
+ // Enable the USB MUX
+ if (set_usb_mux(USB_MUX_ON) < 0)
+ return -1;
+
sprintf(path, GPIO_VAL, GPIO_USB_SW0);
if (write_device(path, gpio_sw0) < 0) {
- syslog(LOG_ALERT, "write_device failed for %s\n", path);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "write_device failed for %s\n", path);
+#endif
return -1;
}
sprintf(path, GPIO_VAL, GPIO_USB_SW1);
if (write_device(path, gpio_sw1) < 0) {
- syslog(LOG_ALERT, "write_device failed for %s\n", path);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "write_device failed for %s\n", path);
+#endif
return -1;
}
@@ -750,25 +962,25 @@ pal_switch_uart_mux(uint8_t slot) {
// Refer the UART select table in schematic
switch(slot) {
- case 1:
+ case HAND_SW_SERVER1:
gpio_uart_sel2 = "0";
gpio_uart_sel1 = "0";
gpio_uart_sel0 = "1";
gpio_uart_rx = "0";
break;
- case 2:
+ case HAND_SW_SERVER2:
gpio_uart_sel2 = "0";
gpio_uart_sel1 = "0";
gpio_uart_sel0 = "0";
gpio_uart_rx = "0";
break;
- case 3:
+ case HAND_SW_SERVER3:
gpio_uart_sel2 = "0";
gpio_uart_sel1 = "1";
gpio_uart_sel0 = "1";
gpio_uart_rx = "0";
break;
- case 4:
+ case HAND_SW_SERVER4:
gpio_uart_sel2 = "0";
gpio_uart_sel1 = "1";
gpio_uart_sel0 = "0";
@@ -816,7 +1028,9 @@ pal_switch_uart_mux(uint8_t slot) {
uart_exit:
if (ret) {
- syslog(LOG_ALERT, "pal_switch_uart_mux: write_device failed: %s\n", path);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "pal_switch_uart_mux: write_device failed: %s\n", path);
+#endif
return ret;
} else {
return 0;
@@ -833,7 +1047,9 @@ pal_post_enable(uint8_t slot) {
ret = bic_get_config(slot, &config);
if (ret) {
- syslog(LOG_ALERT, "post_enable: bic_get_config failed\n");
+#ifdef DEBUG
+ syslog(LOG_WARNING, "post_enable: bic_get_config failed for fru: %d\n", slot);
+#endif
return ret;
}
@@ -841,7 +1057,9 @@ pal_post_enable(uint8_t slot) {
ret = bic_set_config(slot, &config);
if (ret) {
- syslog(LOG_ALERT, "post_enable: bic_set_config failed\n");
+#ifdef DEBUG
+ syslog(LOG_WARNING, "post_enable: bic_set_config failed\n");
+#endif
return ret;
}
@@ -937,14 +1155,18 @@ read_kv(char *key, char *value) {
fp = fopen(key, "r");
if (!fp) {
int err = errno;
- syslog(LOG_ALERT, "read_kv: failed to open %s", key);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "read_kv: failed to open %s", key);
+#endif
return err;
}
rc = (int) fread(value, 1, MAX_VALUE_LEN, fp);
fclose(fp);
if (rc <= 0) {
+#ifdef DEBUG
syslog(LOG_INFO, "read_kv: failed to read %s", key);
+#endif
return ENOENT;
} else {
return 0;
@@ -960,7 +1182,9 @@ write_kv(char *key, char *value) {
fp = fopen(key, "w");
if (!fp) {
int err = errno;
- syslog(LOG_ALERT, "write_kv: failed to open %s", key);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "write_kv: failed to open %s", key);
+#endif
return err;
}
@@ -968,7 +1192,9 @@ write_kv(char *key, char *value) {
fclose(fp);
if (rc < 0) {
- syslog(LOG_ALERT, "write_kv: failed to write to %s", key);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "write_kv: failed to write to %s", key);
+#endif
return ENOENT;
} else {
return 0;
@@ -982,6 +1208,17 @@ pal_get_fru_id(char *str, uint8_t *fru) {
}
int
+pal_get_fru_name(uint8_t fru, char *name) {
+
+ return yosemite_common_fru_name(fru, name);
+}
+
+int
+pal_get_fru_sdr_path(uint8_t fru, char *path) {
+ return yosemite_sensor_sdr_path(fru, path);
+}
+
+int
pal_get_fru_sensor_list(uint8_t fru, uint8_t **sensor_list, int *cnt) {
switch(fru) {
@@ -997,22 +1234,39 @@ pal_get_fru_sensor_list(uint8_t fru, uint8_t **sensor_list, int *cnt) {
*cnt = spb_sensor_cnt;
break;
case FRU_NIC:
- *sensor_list = NULL; // (uint8_t *) nic_sensor_list;
- *cnt = 0; //nic_sensor_cnt;
+ *sensor_list = (uint8_t *) nic_sensor_list;
+ *cnt = nic_sensor_cnt;
break;
default:
- syslog(LOG_ALERT, "pal_get_fru_sensor_list: Wrong fru id %u", fru);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "pal_get_fru_sensor_list: Wrong fru id %u", fru);
+#endif
return -1;
}
return 0;
}
int
+pal_fruid_write(uint8_t fru, char *path) {
+ return bic_write_fruid(fru, 0, path);
+}
+
+int
+pal_sensor_sdr_init(uint8_t fru, sensor_info_t *sinfo) {
+ return yosemite_sensor_sdr_init(fru, sinfo);
+}
+
+int
pal_sensor_read(uint8_t fru, uint8_t sensor_num, void *value) {
return yosemite_sensor_read(fru, sensor_num, value);
}
int
+pal_get_sensor_threshold(uint8_t fru, uint8_t sensor_num, uint8_t thresh, void *value) {
+ return yosemite_sensor_threshold(fru, sensor_num, thresh, value);
+}
+
+int
pal_get_sensor_name(uint8_t fru, uint8_t sensor_num, char *name) {
return yosemite_sensor_name(fru, sensor_num, name);
}
@@ -1028,6 +1282,11 @@ pal_get_fruid_path(uint8_t fru, char *path) {
}
int
+pal_get_fruid_eeprom_path(uint8_t fru, char *path) {
+ return yosemite_get_fruid_eeprom_path(fru, path);
+}
+
+int
pal_get_fruid_name(uint8_t fru, char *name) {
return yosemite_get_fruid_name(fru, name);
}
@@ -1073,7 +1332,9 @@ pal_get_key_value(char *key, char *value) {
if (!strcmp(key, key_list[i])) {
// Key is valid
if ((ret = get_key_value(key, value)) < 0 ) {
- syslog(LOG_ALERT, "pal_get_key_value: get_key_value failed. %d", ret);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "pal_get_key_value: get_key_value failed. %d", ret);
+#endif
return ret;
}
return ret;
@@ -1085,6 +1346,31 @@ pal_get_key_value(char *key, char *value) {
}
int
+pal_set_def_key_value() {
+
+ int ret;
+ int i;
+ char kpath[64] = {0};
+
+ i = 0;
+ while(strcmp(key_list[i], LAST_KEY)) {
+
+ sprintf(kpath, KV_STORE, key_list[i]);
+
+ if (access(kpath, F_OK) == -1) {
+ if ((ret = set_key_value(key_list[i], def_val_list[i])) < 0) {
+#ifdef DEBUG
+ syslog(LOG_WARNING, "pal_set_def_key_value: set_key_value failed. %d", ret);
+#endif
+ }
+ }
+ i++;
+ }
+
+ return 0;
+}
+
+int
pal_set_key_value(char *key, char *value) {
int ret;
@@ -1096,8 +1382,9 @@ pal_set_key_value(char *key, char *value) {
if (!strcmp(key, key_list[i])) {
// Key is valid
if ((ret = set_key_value(key, value)) < 0) {
- syslog(LOG_ALERT, "pal_set_key_value: set_key_value failed. %d", ret);
- printf("pal_set_key_value: ret = %d\n", ret);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "pal_set_key_value: set_key_value failed. %d", ret);
+#endif
return ret;
}
return ret;
@@ -1125,7 +1412,9 @@ pal_get_fru_devtty(uint8_t fru, char *devtty) {
sprintf(devtty, "/dev/ttyS3");
break;
default:
- syslog(LOG_ALERT, "pal_get_fru_devtty: Wrong fru id %u", fru);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "pal_get_fru_devtty: Wrong fru id %u", fru);
+#endif
return -1;
}
return 0;
@@ -1149,3 +1438,516 @@ pal_dump_key_value(void) {
memset(value, 0, MAX_VALUE_LEN);
}
}
+
+int
+pal_set_last_pwr_state(uint8_t fru, char *state) {
+
+ int ret;
+ char key[MAX_KEY_LEN] = {0};
+
+ sprintf(key, "pwr_server%d_last_state", (int) fru);
+
+ ret = pal_set_key_value(key, state);
+ if (ret < 0) {
+#ifdef DEBUG
+ syslog(LOG_WARNING, "pal_set_last_pwr_state: pal_set_key_value failed for "
+ "fru %u", fru);
+#endif
+ }
+ return ret;
+}
+
+int
+pal_get_last_pwr_state(uint8_t fru, char *state) {
+ int ret;
+ char key[MAX_KEY_LEN] = {0};
+
+ switch(fru) {
+ case FRU_SLOT1:
+ case FRU_SLOT2:
+ case FRU_SLOT3:
+ case FRU_SLOT4:
+
+ sprintf(key, "pwr_server%d_last_state", (int) fru);
+
+ ret = pal_get_key_value(key, state);
+ if (ret < 0) {
+#ifdef DEBUG
+ syslog(LOG_WARNING, "pal_get_last_pwr_state: pal_get_key_value failed for "
+ "fru %u", fru);
+#endif
+ }
+ return ret;
+ case FRU_SPB:
+ case FRU_NIC:
+ sprintf(state, "on");
+ return 0;
+ }
+}
+
+int
+pal_get_sys_guid(uint8_t slot, char *guid) {
+ int ret;
+
+ return bic_get_sys_guid(slot, guid);
+}
+
+int
+pal_set_sysfw_ver(uint8_t slot, uint8_t *ver) {
+ int i;
+ char key[MAX_KEY_LEN] = {0};
+ char str[MAX_VALUE_LEN] = {0};
+ char tstr[10] = {0};
+
+ sprintf(key, "sysfw_ver_slot%d", (int) slot);
+
+ for (i = 0; i < SIZE_SYSFW_VER; i++) {
+ sprintf(tstr, "%02x", ver[i]);
+ strcat(str, tstr);
+ }
+
+ return pal_set_key_value(key, str);
+}
+
+int
+pal_get_sysfw_ver(uint8_t slot, uint8_t *ver) {
+ int i;
+ int j = 0;
+ int ret;
+ int msb, lsb;
+ char key[MAX_KEY_LEN] = {0};
+ char str[MAX_VALUE_LEN] = {0};
+ char tstr[4] = {0};
+
+ sprintf(key, "sysfw_ver_slot%d", (int) slot);
+
+ ret = pal_get_key_value(key, str);
+ if (ret) {
+ return ret;
+ }
+
+ for (i = 0; i < 2*SIZE_SYSFW_VER; i += 2) {
+ sprintf(tstr, "%c\n", str[i]);
+ msb = strtol(tstr, NULL, 16);
+
+ sprintf(tstr, "%c\n", str[i+1]);
+ lsb = strtol(tstr, NULL, 16);
+ ver[j++] = (msb << 4) | lsb;
+ }
+
+ return 0;
+}
+
+int
+pal_is_bmc_por(void) {
+ uint32_t scu_fd;
+ uint32_t wdt;
+ void *scu_reg;
+ void *scu_wdt;
+
+ scu_fd = open("/dev/mem", O_RDWR | O_SYNC );
+ if (scu_fd < 0) {
+ return 0;
+ }
+
+ scu_reg = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, scu_fd,
+ AST_WDT_BASE);
+ scu_wdt = (char*)scu_reg + WDT_OFFSET;
+
+ wdt = *(volatile uint32_t*) scu_wdt;
+
+ munmap(scu_reg, PAGE_SIZE);
+ close(scu_fd);
+
+ if (wdt & 0xff00) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
+int
+pal_get_fru_discrete_list(uint8_t fru, uint8_t **sensor_list, int *cnt) {
+
+ switch(fru) {
+ case FRU_SLOT1:
+ case FRU_SLOT2:
+ case FRU_SLOT3:
+ case FRU_SLOT4:
+ *sensor_list = (uint8_t *) bic_discrete_list;
+ *cnt = bic_discrete_cnt;
+ break;
+ case FRU_SPB:
+ case FRU_NIC:
+ return -1;
+ default:
+#ifdef DEBUG
+ syslog(LOG_WARNING, "pal_get_fru_discrete_list: Wrong fru id %u", fru);
+#endif
+ return -1;
+ }
+ return 0;
+}
+
+static void
+_print_sensor_discrete_log(uint8_t fru, uint8_t snr_num, char *snr_name,
+ uint8_t val, char *event) {
+ if (val) {
+ syslog(LOG_CRIT, "ASSERT: %s discrete - raised - FRU: %d, num: 0x%X,"
+ " snr: %-16s val: %d", event, fru, snr_num, snr_name, val);
+ } else {
+ syslog(LOG_CRIT, "DEASSERT: %s discrete - settled - FRU: %d, num: 0x%X,"
+ " snr: %-16s val: %d", event, fru, snr_num, snr_name, val);
+ }
+}
+
+int
+pal_sensor_discrete_check(uint8_t fru, uint8_t snr_num, char *snr_name,
+ uint8_t o_val, uint8_t n_val) {
+
+ char name[32];
+ bool valid = false;
+ uint8_t diff = o_val ^ n_val;
+
+ if (GETBIT(diff, 0)) {
+ switch(snr_num) {
+ case BIC_SENSOR_SYSTEM_STATUS:
+ sprintf(name, "SOC_Thermal_Trip");
+ valid = true;
+ break;
+ case BIC_SENSOR_VR_HOT:
+ sprintf(name, "SOC_VR_Hot");
+ valid = true;
+ break;
+ case BIC_SENSOR_CPU_DIMM_HOT:
+ sprintf(name, "SOC_Hot");
+ valid = true;
+ break;
+ }
+ if (valid) {
+ _print_sensor_discrete_log( fru, snr_num, snr_name, GETBIT(n_val, 0), name);
+ valid = false;
+ }
+ }
+
+ if (GETBIT(diff, 1)) {
+ switch(snr_num) {
+ case BIC_SENSOR_SYSTEM_STATUS:
+ sprintf(name, "SOC_FIVR_Fault");
+ valid = true;
+ break;
+ case BIC_SENSOR_VR_HOT:
+ sprintf(name, "SOC_DIMM_VR_Hot");
+ valid = true;
+ break;
+ case BIC_SENSOR_CPU_DIMM_HOT:
+ sprintf(name, "SOC_MEMHOT");
+ valid = true;
+ break;
+ }
+ if (valid) {
+ _print_sensor_discrete_log( fru, snr_num, snr_name, GETBIT(n_val, 1), name);
+ valid = false;
+ }
+ }
+
+ if (GETBIT(diff, 2)) {
+ switch(snr_num) {
+ case BIC_SENSOR_SYSTEM_STATUS:
+ sprintf(name, "SOC_Throttle");
+ valid = true;
+ break;
+ }
+ if (valid) {
+ _print_sensor_discrete_log( fru, snr_num, snr_name, GETBIT(n_val, 2), name);
+ valid = false;
+ }
+ }
+}
+
+static int
+pal_store_crashdump(uint8_t fru) {
+
+ return yosemite_common_crashdump(fru);
+}
+
+int
+pal_sel_handler(uint8_t fru, uint8_t snr_num) {
+
+ switch(snr_num) {
+ case CATERR:
+ pal_store_crashdump(fru);
+ break;
+ }
+
+ return 0;
+}
+
+int
+pal_get_event_sensor_name(uint8_t fru, uint8_t snr_num, char *name) {
+
+ switch(snr_num) {
+ case SYSTEM_EVENT:
+ sprintf(name, "SYSTEM_EVENT");
+ break;
+ case THERM_THRESH_EVT:
+ sprintf(name, "THERM_THRESH_EVT");
+ break;
+ case BUTTON:
+ sprintf(name, "BUTTON");
+ break;
+ case POWER_STATE:
+ sprintf(name, "POWER_STATE");
+ break;
+ case CRITICAL_IRQ:
+ sprintf(name, "CRITICAL_IRQ");
+ break;
+ case POST_ERROR:
+ sprintf(name, "POST_ERROR");
+ break;
+ case MACHINE_CHK_ERR:
+ sprintf(name, "MACHINE_CHK_ERR");
+ break;
+ case PCIE_ERR:
+ sprintf(name, "PCIE_ERR");
+ break;
+ case IIO_ERR:
+ sprintf(name, "IIO_ERR");
+ break;
+ case MEMORY_ECC_ERR:
+ sprintf(name, "MEMORY_ECC_ERR");
+ break;
+ case PROCHOT_EXT:
+ sprintf(name, "PROCHOT_EXT");
+ break;
+ case PWR_ERR:
+ sprintf(name, "PWR_ERR");
+ break;
+ case CATERR:
+ sprintf(name, "CATERR");
+ break;
+ default:
+ sprintf(name, "unknown");
+ break;
+ }
+
+ return 0;
+}
+
+int
+pal_parse_sel(uint8_t fru, uint8_t snr_num, uint8_t *event_data,
+ char *error_log) {
+
+ char *ed = event_data;
+ char temp_log[128] = {0};
+ uint8_t temp;
+
+ switch(snr_num) {
+ case SYSTEM_EVENT:
+ sprintf(error_log, "SYSTEM_EVENT");
+ if (ed[0] == 0xE5) {
+ strcat(error_log, ": Cause of Time change");
+
+ if (ed[2] == 0x00)
+ strcat(error_log, ": NTP");
+ else if (ed[2] == 0x01)
+ strcat(error_log, ": Host RTL");
+ else if (ed[2] == 0x02)
+ strcat(error_log, ": Set SEL time cmd ");
+ else if (ed[2] == 0x03)
+ strcat(error_log, ": Set SEL time UTC offset cmd");
+ else
+ strcat(error_log, ": Unknown");
+
+ if (ed[1] == 0x00)
+ strcat(error_log, ": First Time");
+ else if(ed[1] == 0x80)
+ strcat(error_log, ": Second Time");
+
+ }
+ break;
+
+ case THERM_THRESH_EVT:
+ sprintf(error_log, "THERM_THRESH_EVT");
+ if (ed[0] == 0x1)
+ strcat(error_log, ": Limit Exceeded");
+ else
+ strcat(error_log, ": Unknown");
+ break;
+
+ case BUTTON:
+ sprintf(error_log, "BUTTON");
+ if (ed[0] == 0x0)
+ strcat(error_log, ": Power button pressed");
+ else if (ed[0] == 0x2)
+ strcat(error_log, ": Reset button pressed");
+ else
+ strcat(error_log, ": Unknown");
+ break;
+
+ case POWER_STATE:
+ sprintf(error_log, "POWER_STATE");
+ if (ed[0] == 0x0)
+ strcat(error_log, ": Transition to Running");
+ else if (ed[0] == 0x2)
+ strcat(error_log, ": Transition to Power Off");
+ else
+ strcat(error_log, ": Unknown");
+ break;
+
+ case CRITICAL_IRQ:
+ sprintf(error_log, "CRITICAL_IRQ");
+ if (ed[0] == 0x0)
+ strcat(error_log, ": Diagnostic Interrupt");
+ else
+ strcat(error_log, ": Unknown");
+ break;
+
+ case POST_ERROR:
+ sprintf(error_log, "POST_ERROR");
+ if ((ed[0] & 0x0F) == 0x0)
+ strcat(error_log, ": System Firmware Error");
+ else
+ strcat(error_log, ": Unknown");
+ if (((ed[0] >> 6) & 0x03) == 0x3) {
+ // TODO: Need to implement IPMI spec based Post Code
+ strcat(error_log, ": IPMI Post Code");
+ } else if (((ed[0] >> 6) & 0x03) == 0x2) {
+ sprintf(temp_log, "OEM Post Code: 0x%X 0x%X", ed[2], ed[1]);
+ strcat(error_log, temp_log);
+ }
+ break;
+
+ case MACHINE_CHK_ERR:
+ sprintf(error_log, "MACHINE_CHK_ERR");
+ if ((ed[0] & 0x0F) == 0x0B) {
+ strcat(error_log, ": Uncorrectable");
+ } else if ((ed[0] & 0x0F) == 0x0C) {
+ strcat(error_log, ": Correctable");
+ } else {
+ strcat(error_log, ": Unknown");
+ }
+
+ sprintf(temp_log, "Machine Check bank Number - %d ", ed[1]);
+ strcat(error_log, temp_log);
+ sprintf(temp_log, "CPU - %d, Core - %d ", ed[2] >> 5, ed[2] & 0x1F);
+ strcat(error_log, temp_log);
+
+ break;
+
+ case PCIE_ERR:
+ sprintf(error_log, "PCIE_ERR");
+ if ((ed[0] & 0xF) == 0x4)
+ strcat(error_log, ": PCI PERR");
+ else if ((ed[0] & 0xF) == 0x5)
+ strcat(error_log, ": PCI SERR");
+ else if ((ed[0] & 0xF) == 0x7)
+ strcat(error_log, ": Correctable");
+ else if ((ed[0] & 0xF) == 0x8)
+ strcat(error_log, ": Uncorrectable");
+ else if ((ed[0] & 0xF) == 0xA)
+ strcat(error_log, ": Bus Fatal");
+ else
+ strcat(error_log, ": Unknown");
+ break;
+
+ case IIO_ERR:
+ sprintf(error_log, "IIO_ERR");
+ if ((ed[0] & 0xF) == 0) {
+
+ sprintf(temp_log, ": CPU - %d, Error ID - 0x%X", (ed[2] & 0xE0) >> 5,
+ ed[1]);
+ strcat(error_log, temp_log);
+
+ temp = ed[2] & 0x7;
+ if (temp == 0x0)
+ strcat(error_log, ": IRP0");
+ else if (temp == 0x1)
+ strcat(error_log, ": IRP1");
+ else if (temp == 0x2)
+ strcat(error_log, ": IIO-Core");
+ else if (temp == 0x3)
+ strcat(error_log, ": VT-d");
+ else if (temp == 0x4)
+ strcat(error_log, ": Intel Quick Data");
+ else if (temp == 0x5)
+ strcat(error_log, ": Misc");
+ else
+ strcat(error_log, ": Reserved");
+ }
+ break;
+
+ case MEMORY_ECC_ERR:
+ sprintf(error_log, "MEMORY_ECC_ERR");
+ if ((ed[0] & 0x0F) == 0x0)
+ strcat(error_log, ": Correctable");
+ else if ((ed[0] & 0x0F) == 0x1)
+ strcat(error_log, ": Uncorrectable");
+ else if ((ed[0] & 0x0F) == 0x5)
+ strcat(error_log, ": Correctable ECC error Logging Limit Reached");
+ else
+ strcat(error_log, ": Unknown");
+
+ if (((ed[1] & 0xC) >> 2) == 0x0) {
+ /* All Info Valid */
+ sprintf(temp_log, ": CPU# - %d, CHN# - %d, DIMM# - %d ",
+ (ed[2] & 0xE0) >> 5, (ed[2] & 0x18) >> 3, ed[2] & 0x7);
+ } else if (((ed[1] & 0xC) >> 2) == 0x1) {
+ /* DIMM info not valid */
+ sprintf(temp_log, ": CPU# - %d, CHN# - %d",
+ (ed[2] & 0xE0) >> 5, (ed[2] & 0x18) >> 3);
+ } else if (((ed[1] & 0xC) >> 2) == 0x2) {
+ /* CHN info not valid */
+ sprintf(temp_log, ": CPU# - %d, DIMM# - %d ",
+ (ed[2] & 0xE0) >> 5, ed[2] & 0x7);
+ } else if (((ed[1] & 0xC) >> 2) == 0x3) {
+ /* CPU info not valid */
+ sprintf(temp_log, ": CHN# - %d, DIMM# - %d ",
+ (ed[2] & 0x18) >> 3, ed[2] & 0x7);
+ }
+ strcat(error_log, temp_log);
+
+ break;
+
+ case PROCHOT_EXT:
+ sprintf(error_log, "PROCHOT_EXT");
+ if ((ed[0] & 0xF) == 0xA)
+ strcat(error_log, ": Processor Thermal Throttling Offset");
+ else
+ strcat(error_log, ": Unknown");
+ break;
+
+ if ((ed[1] & 0x3) == 0x1)
+ strcat(error_log, ": External (VR)");
+ else if ((ed[1] & 0x3) == 0x0)
+ strcat(error_log, ": Native");
+ break;
+
+ sprintf(temp_log, ": SOC ID - %d", (ed[2] & 0xE0) >> 5);
+ strcat(error_log, temp_log);
+
+ case PWR_ERR:
+ sprintf(error_log, "PWR_ERR");
+ if (ed[0] == 0x2)
+ strcat(error_log, ": PCH_PWROK failure");
+ else
+ strcat(error_log, ": Unknown");
+ break;
+
+ case CATERR:
+ sprintf(error_log, "CATERR");
+ if (ed[0] == 0x0)
+ strcat(error_log, ": IERR");
+ else if (ed[0] == 0xB)
+ strcat(error_log, ": MCERR");
+ else
+ strcat(error_log, ": Unknown");
+ break;
+
+ default:
+ sprintf(error_log, "unknown");
+ break;
+ }
+
+ return 0;
+}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/pal.h b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/pal.h
index 1d9f3b9..b3f542a 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/pal.h
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/pal/pal.h
@@ -30,13 +30,17 @@ extern "C" {
#include <facebook/yosemite_fruid.h>
#include <facebook/yosemite_sensor.h>
-#define MAX_NUM_FRUS 6
#define MAX_KEY_LEN 64
#define MAX_VALUE_LEN 64
#define KV_STORE "/mnt/data/kv_store/%s"
#define KV_STORE_PATH "/mnt/data/kv_store"
+#define SETBIT(x, y) (x | (1 << y))
+#define GETBIT(x, y) ((x & (1 << y)) > y)
+#define CLEARBIT(x, y) (x & (~(1 << y)))
+#define GETMASK(y) (1 << y)
+
extern char * key_list[];
extern const char pal_fru_list[];
extern const char pal_server_list[];
@@ -47,10 +51,18 @@ enum {
};
enum {
+ USB_MUX_OFF,
+ USB_MUX_ON,
+};
+
+enum {
SERVER_POWER_OFF,
SERVER_POWER_ON,
SERVER_POWER_CYCLE,
SERVER_GRACEFUL_SHUTDOWN,
+ SERVER_12V_OFF,
+ SERVER_12V_ON,
+ SERVER_12V_CYCLE,
};
enum {
@@ -61,6 +73,22 @@ enum {
HAND_SW_BMC
};
+enum {
+ SYSTEM_EVENT = 0xE9,
+ THERM_THRESH_EVT = 0x7D,
+ BUTTON = 0xAA,
+ POWER_STATE = 0xAB,
+ CRITICAL_IRQ = 0xEA,
+ POST_ERROR = 0x2B,
+ MACHINE_CHK_ERR = 0x40,
+ PCIE_ERR = 0x41,
+ IIO_ERR = 0x43,
+ MEMORY_ECC_ERR = 0X63,
+ PROCHOT_EXT = 0X51,
+ PWR_ERR = 0X56,
+ CATERR= 0xEB,
+};
+
int pal_get_platform_name(char *name);
int pal_get_num_slots(uint8_t *num);
int pal_is_server_prsnt(uint8_t slot_id, uint8_t *status);
@@ -79,17 +107,40 @@ int pal_get_pwr_btn(uint8_t *status);
int pal_get_rst_btn(uint8_t *status);
int pal_set_rst_btn(uint8_t slot, uint8_t status);
int pal_set_led(uint8_t slot, uint8_t status);
+int pal_set_hb_led(uint8_t status);
+int pal_set_id_led(uint8_t slot, uint8_t status);
int pal_get_fru_id(char *fru_str, uint8_t *fru);
+int pal_get_fru_name(uint8_t fru, char *name);
int pal_get_fruid_path(uint8_t fru, char *path);
+int pal_get_fruid_eeprom_path(uint8_t fru, char *path);
int pal_get_fruid_name(uint8_t fru, char *name);
+int pal_get_fru_sdr_path(uint8_t fru, char *path);
int pal_get_sensor_units(uint8_t fru, uint8_t sensor_num, char *units);
int pal_get_fru_sensor_list(uint8_t fru, uint8_t **sensor_list, int *cnt);
+int pal_get_fru_discrete_list(uint8_t fru, uint8_t **sensor_list, int *cnt);
+int pal_sensor_sdr_init(uint8_t fru, sensor_info_t *sinfo);
int pal_sensor_read(uint8_t fru, uint8_t sensor_num, void *value);
int pal_get_sensor_name(uint8_t fru, uint8_t sensor_num, char *name);
+int pal_get_sensor_threshold(uint8_t fru, uint8_t sensor_num, uint8_t thresh,
+ void *value);
int pal_get_key_value(char *key, char *value);
int pal_set_key_value(char *key, char *value);
+int pal_set_def_key_value();
void pal_dump_key_value(void);
int pal_get_fru_devtty(uint8_t fru, char *devtty);
+int pal_get_last_pwr_state(uint8_t fru, char *state);
+int pal_set_last_pwr_state(uint8_t fru, char *state);
+int pal_get_sys_guid(uint8_t slot, char *guid);
+int pal_set_sysfw_ver(uint8_t slot, uint8_t *ver);
+int pal_get_sysfw_ver(uint8_t slot, uint8_t *ver);
+int pal_fruid_write(uint8_t slot, char *path);
+int pal_is_bmc_por(void);
+int pal_sensor_discrete_check(uint8_t fru, uint8_t snr_num, char *snr_name,
+ uint8_t o_val, uint8_t n_val);
+int pal_get_event_sensor_name(uint8_t fru, uint8_t snr_num, char *name);
+int pal_parse_sel(uint8_t fru, uint8_t snr_num, uint8_t *event_data,
+ char *error_log);
+int pal_sel_handler(uint8_t fru, uint8_t snr_num);
#ifdef __cplusplus
} // extern "C"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/Makefile b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/Makefile
index 76bf61f..40ea2a8 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/Makefile
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/Makefile
@@ -2,8 +2,8 @@
lib: libyosemite_common.so
libyosemite_common.so: yosemite_common.c
- $(CC) $(CFLAGS) -fPIC -c -o yosemite_common.o yosemite_common.c
- $(CC) -shared -o libyosemite_common.so yosemite_common.o -lc
+ $(CC) $(CFLAGS) -fPIC -pthread -c -o yosemite_common.o yosemite_common.c
+ $(CC) -lpthread -shared -o libyosemite_common.so yosemite_common.o -lc
.PHONY: clean
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c
index e41690f..c638809 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c
@@ -27,8 +27,51 @@
#include <fcntl.h>
#include <errno.h>
#include <syslog.h>
+#include <pthread.h>
+#include <string.h>
#include "yosemite_common.h"
+#define CRASHDUMP_BIN "/usr/local/bin/dump.sh"
+#define CRASHDUMP_FILE "/mnt/data/crashdump_"
+
+int
+yosemite_common_fru_name(uint8_t fru, char *str) {
+
+ switch(fru) {
+ case FRU_SLOT1:
+ sprintf(str, "slot1");
+ break;
+
+ case FRU_SLOT2:
+ sprintf(str, "slot2");
+ break;
+
+ case FRU_SLOT3:
+ sprintf(str, "slot3");
+ break;
+
+ case FRU_SLOT4:
+ sprintf(str, "slot4");
+ break;
+
+ case FRU_SPB:
+ sprintf(str, "spb");
+ break;
+
+ case FRU_NIC:
+ sprintf(str, "nic");
+ break;
+
+ default:
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_common_fru_id: Wrong fru id");
+#endif
+ return -1;
+ }
+
+ return 0;
+}
+
int
yosemite_common_fru_id(char *str, uint8_t *fru) {
@@ -47,9 +90,61 @@ yosemite_common_fru_id(char *str, uint8_t *fru) {
} else if (!strcmp(str, "nic")) {
*fru = FRU_NIC;
} else {
- syslog(LOG_ALERT, "yosemite_common_fru_id: Wrong fru id");
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_common_fru_id: Wrong fru id");
+#endif
return -1;
}
return 0;
}
+
+void *
+generate_dump(void *arg) {
+
+ uint8_t fru = *(uint8_t *) arg;
+ char cmd[128];
+ char fruname[16];
+
+ yosemite_common_fru_name(fru, fruname);
+
+ // HEADER LINE for the dump
+ memset(cmd, 0, 128);
+ sprintf(cmd, "%s time > %s%s", CRASHDUMP_BIN, CRASHDUMP_FILE, fruname);
+ system(cmd);
+
+ // COREID dump
+ memset(cmd, 0, 128);
+ sprintf(cmd, "%s %s 48 coreid >> %s%s", CRASHDUMP_BIN, fruname,
+ CRASHDUMP_FILE, fruname);
+ system(cmd);
+
+ // MSR dump
+ memset(cmd, 0, 128);
+ sprintf(cmd, "%s %s 48 msr >> %s%s", CRASHDUMP_BIN, fruname,
+ CRASHDUMP_FILE, fruname);
+ system(cmd);
+
+ syslog(LOG_CRIT, "Crashdump for FRU: %d is generated.", fru);
+}
+
+int
+yosemite_common_crashdump(uint8_t fru) {
+
+ if (access(CRASHDUMP_BIN, F_OK) == -1) {
+ syslog(LOG_CRIT, "Crashdump for FRU: %d failed : "
+ "crashdump binary is not preset", fru);
+ return 0;
+ }
+
+ pthread_t t_dump;
+
+ if (pthread_create(&t_dump, NULL, generate_dump, (void*) &fru) < 0) {
+ syslog(LOG_WARNING, "pal_store_crashdump: pthread_create for"
+ " FRU %d failed\n", fru);
+ }
+
+ syslog(LOG_INFO, "Crashdump for FRU: %d is being generated.", fru);
+
+ return 0;
+}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.h b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.h
index 85d8638..f2128ef 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.h
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.h
@@ -25,6 +25,7 @@
extern "C" {
#endif
+#define MAX_NUM_FRUS 6
enum {
FRU_ALL = 0,
FRU_SLOT1 = 1,
@@ -35,7 +36,9 @@ enum {
FRU_NIC = 6,
};
+int yosemite_common_fru_name(uint8_t fru, char *str);
int yosemite_common_fru_id(char *str, uint8_t *fru);
+int yosemite_common_crashdump(uint8_t fru);
#ifdef __cplusplus
} // extern "C"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_fruid/yosemite_fruid.c b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_fruid/yosemite_fruid.c
index 226f2f8..d431d34 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_fruid/yosemite_fruid.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_fruid/yosemite_fruid.c
@@ -48,13 +48,42 @@ yosemite_get_fruid_path(uint8_t fru, char *path) {
sprintf(fname, "nic");
break;
default:
- syslog(LOG_ALERT, "yosemite_get_fruid_path: wrong fruid");
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_get_fruid_path: wrong fruid");
+#endif
return -1;
}
sprintf(path, YOSEMITE_FRU_PATH, fname);
return 0;
}
+
+int
+yosemite_get_fruid_eeprom_path(uint8_t fru, char *path) {
+ char fname[16] = {0};
+
+ switch(fru) {
+ case FRU_SLOT1:
+ case FRU_SLOT2:
+ case FRU_SLOT3:
+ case FRU_SLOT4:
+ return -1;
+ case FRU_SPB:
+ sprintf(path, "/sys/class/i2c-adapter/i2c-8/8-0051/eeprom");
+ break;
+ case FRU_NIC:
+ sprintf(path, "/sys/class/i2c-adapter/i2c-12/12-0051/eeprom");
+ break;
+ default:
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_get_fruid_eeprom_path: wrong fruid");
+#endif
+ return -1;
+ }
+
+ return 0;
+}
+
/* Populate char name[] with the path to the fru's name */
int
yosemite_get_fruid_name(uint8_t fru, char *name) {
@@ -79,7 +108,9 @@ yosemite_get_fruid_name(uint8_t fru, char *name) {
sprintf(name, "CX4 NIC");
break;
default:
- syslog(LOG_ALERT, "yosemite_get_fruid_name: wrong fruid");
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_get_fruid_name: wrong fruid");
+#endif
return -1;
}
return 0;
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_fruid/yosemite_fruid.h b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_fruid/yosemite_fruid.h
index 5c01267..78cdbe4 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_fruid/yosemite_fruid.h
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_fruid/yosemite_fruid.h
@@ -28,6 +28,7 @@ extern "C" {
#endif
int yosemite_get_fruid_path(uint8_t fru, char *path);
+int yosemite_get_fruid_eeprom_path(uint8_t fru, char *path);
int yosemite_get_fruid_name(uint8_t fru, char *name);
#ifdef __cplusplus
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_gpio/yosemite_gpio.c b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_gpio/yosemite_gpio.c
index ac2c820..4f22500 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_gpio/yosemite_gpio.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_gpio/yosemite_gpio.c
@@ -102,12 +102,16 @@ yosemite_get_gpio_name(uint8_t fru, uint8_t gpio, char *name) {
//TODO: Add support for BMC GPIO pins
if (fru < 1 || fru > 4) {
- syslog(LOG_ALERT, "yosemite_get_gpio_name: Wrong fru %u", fru);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_get_gpio_name: Wrong fru %u", fru);
+#endif
return -1;
}
if (gpio < 0 || gpio > MAX_GPIO_PINS) {
- syslog(LOG_ALERT, "yosemite_get_gpio_name: Wrong gpio pin %u", gpio);
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_get_gpio_name: Wrong gpio pin %u", gpio);
+#endif
return -1;
}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/Makefile b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/Makefile
index 63b334c..dd013a9 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/Makefile
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/Makefile
@@ -3,7 +3,7 @@ lib: libyosemite_sensor.so
libyosemite_sensor.so: yosemite_sensor.c
$(CC) $(CFLAGS) -fPIC -c -o yosemite_sensor.o yosemite_sensor.c
- $(CC) -lm -lbic -lsdr -lipmi -lipmb -lyosemite_common -shared -o libyosemite_sensor.so yosemite_sensor.o -lc
+ $(CC) -lm -lbic -lipmi -lipmb -lyosemite_common -shared -o libyosemite_sensor.so yosemite_sensor.o -lc
.PHONY: clean
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c
index 0f25e54..9d075ce 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.c
@@ -24,6 +24,7 @@
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
+#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <syslog.h>
@@ -51,6 +52,10 @@
#define UNIT_DIV 1000
+#define MEZZ_SENSOR_I2CBUS "11"
+#define MEZZ_SENSOR_I2C_BUS_ADDR "0x1f"
+#define MEZZ_SENSOR_TEMP_REGISTER "0x01"
+
#define BIC_SENSOR_READ_NA 0x20
#define MAX_SENSOR_NUM 0xFF
@@ -77,6 +82,7 @@ const uint8_t bic_sensor_list[] = {
BIC_SENSOR_VCCIN_VR_CURR,
BIC_SENSOR_VCCIN_VR_VOL,
BIC_SENSOR_INA230_POWER,
+ BIC_SENSOR_INA230_VOL,
BIC_SENSOR_SOC_PACKAGE_PWR,
BIC_SENSOR_SOC_TJMAX,
BIC_SENSOR_VDDR_VR_POUT,
@@ -88,6 +94,7 @@ const uint8_t bic_sensor_list[] = {
BIC_SENSOR_VCC_SCSUS_VR_POUT,
BIC_SENSOR_VCC_GBE_VR_POUT,
BIC_SENSOR_VCC_GBE_VR_VOL,
+ BIC_SENSOR_1V05_PCH_VR_POUT,
BIC_SENSOR_1V05_PCH_VR_VOL,
BIC_SENSOR_SOC_DIMMA0_TEMP,
BIC_SENSOR_SOC_DIMMA1_TEMP,
@@ -101,22 +108,13 @@ const uint8_t bic_sensor_list[] = {
BIC_SENSOR_PV_BAT,
BIC_SENSOR_PVDDR,
BIC_SENSOR_PVCC_GBE,
+};
+
+const uint8_t bic_discrete_list[] = {
/* Discrete sensors */
- //BIC_SENSOR_SYSTEM_STATUS,
- //BIC_SENSOR_SYS_BOOT_STAT,
- //BIC_SENSOR_CPU_DIMM_HOT,
- //BIC_SENSOR_PROC_FAIL,
- //BIC_SENSOR_VR_HOT,
- /* Event-only sensors */
- //BIC_SENSOR_POST_ERR,
- //BIC_SENSOR_SPS_FW_HLTH,
- //BIC_SENSOR_POWER_THRESH_EVENT,
- //BIC_SENSOR_MACHINE_CHK_ERR,
- //BIC_SENSOR_PCIE_ERR,
- //BIC_SENSOR_OTHER_IIO_ERR,
- //BIC_SENSOR_PROC_HOT_EXT,
- //BIC_SENSOR_POWER_ERR,
- //BIC_SENSOR_CAT_ERR,
+ BIC_SENSOR_SYSTEM_STATUS,
+ BIC_SENSOR_VR_HOT,
+ BIC_SENSOR_CPU_DIMM_HOT,
};
// List of SPB sensors to be monitored
@@ -130,10 +128,10 @@ const uint8_t spb_sensor_list[] = {
SP_SENSOR_P5V,
SP_SENSOR_P12V,
SP_SENSOR_P3V3_STBY,
- SP_SENSOR_P12V_SLOT0,
SP_SENSOR_P12V_SLOT1,
SP_SENSOR_P12V_SLOT2,
SP_SENSOR_P12V_SLOT3,
+ SP_SENSOR_P12V_SLOT4,
SP_SENSOR_P3V3,
SP_SENSOR_HSC_IN_VOLT,
SP_SENSOR_HSC_OUT_CURR,
@@ -141,10 +139,63 @@ const uint8_t spb_sensor_list[] = {
SP_SENSOR_HSC_IN_POWER,
};
+// List of NIC sensors to be monitored
+const uint8_t nic_sensor_list[] = {
+ MEZZ_SENSOR_TEMP,
+};
+
+float spb_sensor_threshold[MAX_SENSOR_NUM][MAX_SENSOR_THRESHOLD + 1] = {0};
+float nic_sensor_threshold[MAX_SENSOR_NUM][MAX_SENSOR_THRESHOLD + 1] = {0};
+
+static void
+sensor_thresh_array_init() {
+ static bool init_done = false;
+
+ if (init_done)
+ return;
+
+ spb_sensor_threshold[SP_SENSOR_INLET_TEMP][UCR_THRESH] = 40;
+ spb_sensor_threshold[SP_SENSOR_OUTLET_TEMP][UCR_THRESH] = 70;
+ spb_sensor_threshold[SP_SENSOR_FAN0_TACH][UCR_THRESH] = 10000;
+ spb_sensor_threshold[SP_SENSOR_FAN0_TACH][LCR_THRESH] = 500;
+ spb_sensor_threshold[SP_SENSOR_FAN1_TACH][UCR_THRESH] = 10000;
+ spb_sensor_threshold[SP_SENSOR_FAN1_TACH][LCR_THRESH] = 500;
+ //spb_sensor_threshold[SP_SENSOR_AIR_FLOW][UCR_THRESH] = {75.0, 0, 0, 0, 0, 0, 0, 0};
+ spb_sensor_threshold[SP_SENSOR_P5V][UCR_THRESH] = 5.493;
+ spb_sensor_threshold[SP_SENSOR_P5V][LCR_THRESH] = 4.501;
+ spb_sensor_threshold[SP_SENSOR_P12V][UCR_THRESH] = 13.216;
+ spb_sensor_threshold[SP_SENSOR_P12V][LCR_THRESH] = 11.269;
+ spb_sensor_threshold[SP_SENSOR_P3V3_STBY][UCR_THRESH] = 3.625;
+ spb_sensor_threshold[SP_SENSOR_P3V3_STBY][LCR_THRESH] = 2.973;
+ spb_sensor_threshold[SP_SENSOR_P12V_SLOT1][UCR_THRESH] = 13.216;
+ spb_sensor_threshold[SP_SENSOR_P12V_SLOT1][LCR_THRESH] = 11.269;
+ spb_sensor_threshold[SP_SENSOR_P12V_SLOT2][UCR_THRESH] = 13.216;
+ spb_sensor_threshold[SP_SENSOR_P12V_SLOT2][LCR_THRESH] = 11.269;
+ spb_sensor_threshold[SP_SENSOR_P12V_SLOT3][UCR_THRESH] = 13.216;
+ spb_sensor_threshold[SP_SENSOR_P12V_SLOT3][LCR_THRESH] = 11.269;
+ spb_sensor_threshold[SP_SENSOR_P12V_SLOT4][UCR_THRESH] = 13.216;
+ spb_sensor_threshold[SP_SENSOR_P12V_SLOT4][LCR_THRESH] = 11.269;
+ spb_sensor_threshold[SP_SENSOR_P3V3][UCR_THRESH] = 3.625;
+ spb_sensor_threshold[SP_SENSOR_P3V3][LCR_THRESH] = 2.973;
+ spb_sensor_threshold[SP_SENSOR_HSC_IN_VOLT][UCR_THRESH] = 13.2;
+ spb_sensor_threshold[SP_SENSOR_HSC_IN_VOLT][LCR_THRESH] = 10.8;
+ spb_sensor_threshold[SP_SENSOR_HSC_OUT_CURR][UCR_THRESH] = 47.705;
+ spb_sensor_threshold[SP_SENSOR_HSC_TEMP][UCR_THRESH] = 120;
+ spb_sensor_threshold[SP_SENSOR_HSC_IN_POWER][UCR_THRESH] = 525;
+
+ nic_sensor_threshold[MEZZ_SENSOR_TEMP][UCR_THRESH] = 80;
+
+ init_done = true;
+}
+
size_t bic_sensor_cnt = sizeof(bic_sensor_list)/sizeof(uint8_t);
+size_t bic_discrete_cnt = sizeof(bic_discrete_list)/sizeof(uint8_t);
+
size_t spb_sensor_cnt = sizeof(spb_sensor_list)/sizeof(uint8_t);
+size_t nic_sensor_cnt = sizeof(nic_sensor_list)/sizeof(uint8_t);
+
enum {
FAN0 = 0,
FAN1,
@@ -161,12 +212,7 @@ enum {
ADC_PIN7,
};
-static sensor_info_t g_sinfo1[MAX_SENSOR_NUM] = {0};
-static sensor_info_t g_sinfo2[MAX_SENSOR_NUM] = {0};
-static sensor_info_t g_sinfo3[MAX_SENSOR_NUM] = {0};
-static sensor_info_t g_sinfo4[MAX_SENSOR_NUM] = {0};
-static sensor_info_t g_sinfo_spb[MAX_SENSOR_NUM] = {0};
-static sensor_info_t g_sinfo_nic[MAX_SENSOR_NUM] = {0};
+static sensor_info_t g_sinfo[MAX_NUM_FRUS][MAX_SENSOR_NUM] = {0};
static int
read_device(const char *device, int *value) {
@@ -177,7 +223,9 @@ read_device(const char *device, int *value) {
if (!fp) {
int err = errno;
+#ifdef DEBUG
syslog(LOG_INFO, "failed to open device %s", device);
+#endif
return err;
}
@@ -185,7 +233,9 @@ read_device(const char *device, int *value) {
fclose(fp);
if (rc != 1) {
+#ifdef DEBUG
syslog(LOG_INFO, "failed to read device %s", device);
+#endif
return ENOENT;
} else {
return 0;
@@ -201,8 +251,9 @@ read_device_float(const char *device, float *value) {
fp = fopen(device, "r");
if (!fp) {
int err = errno;
-
+#ifdef DEBUG
syslog(LOG_INFO, "failed to open device %s", device);
+#endif
return err;
}
@@ -210,7 +261,9 @@ read_device_float(const char *device, float *value) {
fclose(fp);
if (rc != 1) {
+#ifdef DEBUG
syslog(LOG_INFO, "failed to read device %s", device);
+#endif
return ENOENT;
}
@@ -271,46 +324,52 @@ read_hsc_value(const char *device, float *value) {
}
static int
-bic_read_sensor_wrapper(uint8_t slot_id, uint8_t sensor_num, void *value) {
+read_nic_temp(uint8_t snr_num, float *value) {
+ char command[64];
+ char tmp[8];
+
+ if (snr_num == MEZZ_SENSOR_TEMP) {
+ sprintf(command, "i2cget -y %s %s %s b", MEZZ_SENSOR_I2CBUS,
+ MEZZ_SENSOR_I2C_BUS_ADDR, MEZZ_SENSOR_TEMP_REGISTER);
+
+ FILE *fp = popen(command, "r");
+ fscanf(fp, "%s", tmp);
+ pclose(fp);
+
+ *value = (float) strtol(tmp, NULL, 16);
+ }
+
+ return 0;
+}
+
+static int
+bic_read_sensor_wrapper(uint8_t fru, uint8_t sensor_num, bool discrete,
+ void *value) {
+
int ret;
+ sdr_full_t *sdr;
ipmi_sensor_reading_t sensor;
- ret = bic_read_sensor(slot_id, sensor_num, &sensor);
+ ret = bic_read_sensor(fru, sensor_num, &sensor);
if (ret) {
return ret;
}
if (sensor.flags & BIC_SENSOR_READ_NA) {
+#ifdef DEBUG
syslog(LOG_ERR, "bic_read_sensor_wrapper: Reading Not Available");
syslog(LOG_ERR, "bic_read_sensor_wrapper: sensor_num: 0x%X, flag: 0x%X",
sensor_num, sensor.flags);
+#endif
return -1;
}
- if (sensor.status) {
- //printf("bic_read_sensor_wrapper: Status Asserted: 0x%X\n", sensor.status);
+ if (discrete) {
+ *(float *) value = (float) sensor.status;
+ return 0;
}
- // Check SDR to convert raw value to actual
- sdr_full_t *sdr;
-
- switch (slot_id) {
- case 1:
- sdr = &g_sinfo1[sensor_num].sdr;
- break;
- case 2:
- sdr = &g_sinfo2[sensor_num].sdr;
- break;
- case 3:
- sdr = &g_sinfo3[sensor_num].sdr;
- break;
- case 4:
- sdr = &g_sinfo4[sensor_num].sdr;
- break;
- default:
- syslog(LOG_ALERT, "bic_read_sensor_wrapper: Wrong Slot ID\n");
- return -1;
- }
+ sdr = &g_sinfo[fru-1][sensor_num].sdr;
// If the SDR is not type1, no need for conversion
if (sdr->type !=1) {
@@ -350,106 +409,148 @@ bic_read_sensor_wrapper(uint8_t slot_id, uint8_t sensor_num, void *value) {
* (float *) value = ((m * x) + (b * pow(10, b_exp))) * (pow(10, r_exp));
+ if ((sensor_num == BIC_SENSOR_SOC_THERM_MARGIN) && (* (float *) value > 0)) {
+ * (float *) value -= (float) THERMAL_CONSTANT;
+ }
+
return 0;
}
-/* Returns the all the SDRs for the particular fru# */
-static sensor_info_t *
-get_struct_sensor_info(uint8_t fru) {
- sensor_info_t *sinfo;
- switch(fru) {
+int
+yosemite_sensor_sdr_path(uint8_t fru, char *path) {
+
+char fru_name[16] = {0};
+
+switch(fru) {
case FRU_SLOT1:
- sinfo = g_sinfo1;
+ sprintf(fru_name, "%s", "slot1");
break;
case FRU_SLOT2:
- sinfo = g_sinfo2;
+ sprintf(fru_name, "%s", "slot2");
break;
case FRU_SLOT3:
- sinfo = g_sinfo3;
+ sprintf(fru_name, "%s", "slot3");
break;
case FRU_SLOT4:
- sinfo = g_sinfo4;
+ sprintf(fru_name, "%s", "slot4");
break;
case FRU_SPB:
- sinfo = g_sinfo_spb;
+ sprintf(fru_name, "%s", "spb");
break;
case FRU_NIC:
- sinfo = g_sinfo_nic;
+ sprintf(fru_name, "%s", "nic");
break;
default:
- syslog(LOG_ALERT, "yosemite_sdr_init: Wrong Slot ID\n");
- return NULL;
- }
- return sinfo;
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_sensor_sdr_path: Wrong Slot ID\n");
+#endif
+ return -1;
}
+sprintf(path, YOSEMITE_SDR_PATH, fru_name);
+
+if (access(path, F_OK) == -1) {
+ return -1;
+}
+
+return 0;
+}
+
+/* Populates all sensor_info_t struct using the path to SDR dump */
int
-get_fru_sdr_path(uint8_t fru, char *path) {
+sdr_init(char *path, sensor_info_t *sinfo) {
+int fd;
+uint8_t buf[MAX_SDR_LEN] = {0};
+uint8_t bytes_rd = 0;
+uint8_t snr_num = 0;
+sdr_full_t *sdr;
+
+while (access(path, F_OK) == -1) {
+ sleep(5);
+}
+
+fd = open(path, O_RDONLY);
+if (fd < 0) {
+ syslog(LOG_ERR, "sdr_init: open failed for %s\n", path);
+ return -1;
+}
+
+while ((bytes_rd = read(fd, buf, sizeof(sdr_full_t))) > 0) {
+ if (bytes_rd != sizeof(sdr_full_t)) {
+ syslog(LOG_ERR, "sdr_init: read returns %d bytes\n", bytes_rd);
+ return -1;
+ }
+
+ sdr = (sdr_full_t *) buf;
+ snr_num = sdr->sensor_num;
+ sinfo[snr_num].valid = true;
+ memcpy(&sinfo[snr_num].sdr, sdr, sizeof(sdr_full_t));
+}
+
+return 0;
+}
- char fru_name[16] = {0};
+int
+yosemite_sensor_sdr_init(uint8_t fru, sensor_info_t *sinfo) {
+ int fd;
+ uint8_t buf[MAX_SDR_LEN] = {0};
+ uint8_t bytes_rd = 0;
+ uint8_t sn = 0;
+ char path[64] = {0};
switch(fru) {
case FRU_SLOT1:
- sprintf(fru_name, "%s", "slot1");
- break;
case FRU_SLOT2:
- sprintf(fru_name, "%s", "slot2");
- break;
case FRU_SLOT3:
- sprintf(fru_name, "%s", "slot3");
- break;
case FRU_SLOT4:
- sprintf(fru_name, "%s", "slot4");
+ if (yosemite_sensor_sdr_path(fru, path) < 0) {
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_sensor_sdr_init: get_fru_sdr_path failed\n");
+#endif
+ return ERR_NOT_READY;
+ }
+
+ if (sdr_init(path, sinfo) < 0) {
+#ifdef DEBUG
+ syslog(LOG_ERR, "yosemite_sensor_sdr_init: sdr_init failed for FRU %d", fru);
+#endif
+ }
break;
+
case FRU_SPB:
- sprintf(fru_name, "%s", "spb");
- break;
case FRU_NIC:
- sprintf(fru_name, "%s", "nic");
- break;
- default:
- syslog(LOG_ALERT, "yosemite_sdr_init: Wrong Slot ID\n");
return -1;
+ break;
}
- sprintf(path, YOSEMITE_SDR_PATH, fru_name);
-
return 0;
}
static int
yosemite_sdr_init(uint8_t fru) {
- int fd;
- uint8_t buf[MAX_SDR_LEN] = {0};
- uint8_t bytes_rd = 0;
- uint8_t sn = 0;
- char path[64] = {0};
- sensor_info_t *sinfo;
- if (get_fru_sdr_path(fru, path) < 0) {
- syslog(LOG_ALERT, "yosemite_sdr_init: get_fru_sdr_path failed\n");
- return -1;
- }
- sinfo = get_struct_sensor_info(fru);
- if (sinfo == NULL) {
- syslog(LOG_ALERT, "yosemite_sdr_init: get_struct_sensor_info failed\n");
- return -1;
- }
+ static bool init_done[MAX_NUM_FRUS] = {false};
+
+ if (!init_done[fru - 1]) {
+
+ sensor_info_t *sinfo = g_sinfo[fru-1];
+
+ if (yosemite_sensor_sdr_init(fru, sinfo) < 0)
+ return ERR_NOT_READY;
- if (sdr_init(path, sinfo) < 0) {
- syslog(LOG_ERR, "yosemite_sdr_init: sdr_init failed for FRU %d", fru);
+ init_done[fru - 1] = true;
}
return 0;
}
static bool
-is_server_prsnt(uint8_t slot_id) {
+is_server_prsnt(uint8_t fru) {
uint8_t gpio;
int val;
char path[64] = {0};
- switch(slot_id) {
+ switch(fru) {
case 1:
gpio = 61;
break;
@@ -482,44 +583,21 @@ is_server_prsnt(uint8_t slot_id) {
/* Get the units for the sensor */
int
yosemite_sensor_units(uint8_t fru, uint8_t sensor_num, char *units) {
- static bool init_done = false;
uint8_t op, modifier;
sensor_info_t *sinfo;
- if (!init_done) {
-
- if (is_server_prsnt(1) && (yosemite_sdr_init(FRU_SLOT1) != 0)) {
+ if (is_server_prsnt(fru) && (yosemite_sdr_init(fru) != 0)) {
return -1;
}
- if (is_server_prsnt(2) && (yosemite_sdr_init(FRU_SLOT2) != 0)) {
- return -1;
- }
- if (is_server_prsnt(3) && (yosemite_sdr_init(FRU_SLOT3) != 0)) {
- return -1;
- }
- if (is_server_prsnt(4) && (yosemite_sdr_init(FRU_SLOT4) != 0)) {
- return -1;
- }
- init_done = true;
- }
switch(fru) {
case FRU_SLOT1:
case FRU_SLOT2:
case FRU_SLOT3:
case FRU_SLOT4:
- sinfo = get_struct_sensor_info(fru);
- if (sinfo == NULL) {
- syslog(LOG_ALERT, "yosemite_sensor_units: get_struct_sensor_info failed\n");
- return -1;
- }
+ sprintf(units, "");
+ break;
- if (sdr_get_sensor_units(&sinfo[sensor_num].sdr, &op, &modifier, units)) {
- syslog(LOG_ALERT, "yosemite_sensor_units: FRU %d: num 0x%2X: reading units"
- " from SDR failed.", fru, sensor_num);
- return -1;
- }
- break;
case FRU_SPB:
switch(sensor_num) {
case SP_SENSOR_INLET_TEMP:
@@ -549,16 +627,10 @@ yosemite_sensor_units(uint8_t fru, uint8_t sensor_num, char *units) {
case SP_SENSOR_P3V3_STBY:
sprintf(units, "Volts");
break;
- case SP_SENSOR_P12V_SLOT0:
- sprintf(units, "Volts");
- break;
case SP_SENSOR_P12V_SLOT1:
- sprintf(units, "Volts");
- break;
case SP_SENSOR_P12V_SLOT2:
- sprintf(units, "Volts");
- break;
case SP_SENSOR_P12V_SLOT3:
+ case SP_SENSOR_P12V_SLOT4:
sprintf(units, "Volts");
break;
case SP_SENSOR_P3V3:
@@ -579,114 +651,132 @@ yosemite_sensor_units(uint8_t fru, uint8_t sensor_num, char *units) {
}
break;
case FRU_NIC:
- sprintf(units, "");
- break;
+ switch(sensor_num) {
+ case MEZZ_SENSOR_TEMP:
+ sprintf(units, "C");
+ break;
+ }
+ break;
}
return 0;
}
-/* Get the name for the sensor */
int
-yosemite_sensor_name(uint8_t fru, uint8_t sensor_num, char *name) {
- static bool init_done = false;
- uint8_t op, modifier;
- sensor_info_t *sinfo;
+yosemite_sensor_threshold(uint8_t fru, uint8_t sensor_num, uint8_t thresh, float *value) {
- if (!init_done) {
+ sensor_thresh_array_init();
- if (is_server_prsnt(1) && (yosemite_sdr_init(FRU_SLOT1) != 0)) {
- return -1;
- }
- if (is_server_prsnt(2) && (yosemite_sdr_init(FRU_SLOT2) != 0)) {
- return -1;
- }
- if (is_server_prsnt(3) && (yosemite_sdr_init(FRU_SLOT3) != 0)) {
- return -1;
- }
- if (is_server_prsnt(4) && (yosemite_sdr_init(FRU_SLOT4) != 0)) {
- return -1;
- }
- init_done = true;
+ switch(fru) {
+ case FRU_SLOT1:
+ case FRU_SLOT2:
+ case FRU_SLOT3:
+ case FRU_SLOT4:
+ break;
+ case FRU_SPB:
+ *value = spb_sensor_threshold[sensor_num][thresh];
+ break;
+ case FRU_NIC:
+ *value = nic_sensor_threshold[sensor_num][thresh];
+ break;
}
+ return 0;
+}
+
+/* Get the name for the sensor */
+int
+yosemite_sensor_name(uint8_t fru, uint8_t sensor_num, char *name) {
switch(fru) {
case FRU_SLOT1:
case FRU_SLOT2:
case FRU_SLOT3:
case FRU_SLOT4:
- sinfo = get_struct_sensor_info(fru);
- if (sinfo == NULL) {
- syslog(LOG_ALERT, "yosemite_sensor_name: get_struct_sensor_info failed\n");
- return -1;
- }
-
- if (sdr_get_sensor_name(&sinfo[sensor_num].sdr, name)) {
- syslog(LOG_ALERT, "yosemite_sensor_name: FRU %d: num 0x%2X: reading units"
- " from SDR failed.", fru, sensor_num);
- return -1;
+ switch(sensor_num) {
+ case BIC_SENSOR_SYSTEM_STATUS:
+ sprintf(name, "SYSTEM_STATUS");
+ break;
+ case BIC_SENSOR_SYS_BOOT_STAT:
+ sprintf(name, "SYS_BOOT_STAT");
+ break;
+ case BIC_SENSOR_CPU_DIMM_HOT:
+ sprintf(name, "CPU_DIMM_HOT");
+ break;
+ case BIC_SENSOR_PROC_FAIL:
+ sprintf(name, "PROC_FAIL");
+ break;
+ case BIC_SENSOR_VR_HOT:
+ sprintf(name, "VR_HOT");
+ break;
+ default:
+ sprintf(name, "");
+ break;
}
-
break;
+
case FRU_SPB:
switch(sensor_num) {
case SP_SENSOR_INLET_TEMP:
- sprintf(name, "SP_SENSOR_INLET_TEMP");
+ sprintf(name, "SP_INLET_TEMP");
break;
case SP_SENSOR_OUTLET_TEMP:
- sprintf(name, "SP_SENSOR_OUTLET_TEMP");
+ sprintf(name, "SP_OUTLET_TEMP");
break;
case SP_SENSOR_MEZZ_TEMP:
- sprintf(name, "SP_SENSOR_MEZZ_TEMP");
+ sprintf(name, "SP_MEZZ_TEMP");
break;
case SP_SENSOR_FAN0_TACH:
- sprintf(name, "SP_SENSOR_FAN0_TACH");
+ sprintf(name, "SP_FAN0_TACH");
break;
case SP_SENSOR_FAN1_TACH:
- sprintf(name, "SP_SENSOR_FAN1_TACH");
+ sprintf(name, "SP_FAN1_TACH");
break;
case SP_SENSOR_AIR_FLOW:
- sprintf(name, "SP_SENSOR_AIR_FLOW");
+ sprintf(name, "SP_AIR_FLOW");
break;
case SP_SENSOR_P5V:
- sprintf(name, "SP_SENSOR_P5V");
+ sprintf(name, "SP_P5V");
break;
case SP_SENSOR_P12V:
- sprintf(name, "SP_SENSOR_P12V");
+ sprintf(name, "SP_P12V");
break;
case SP_SENSOR_P3V3_STBY:
- sprintf(name, "SP_SENSOR_P3V3_STBY");
- break;
- case SP_SENSOR_P12V_SLOT0:
- sprintf(name, "SP_SENSOR_P12V_SLOT0");
+ sprintf(name, "SP_P3V3_STBY");
break;
case SP_SENSOR_P12V_SLOT1:
- sprintf(name, "SP_SENSOR_P12V_SLOT1");
+ sprintf(name, "SP_P12V_SLOT1");
break;
case SP_SENSOR_P12V_SLOT2:
- sprintf(name, "SP_SENSOR_P12V_SLOT2");
+ sprintf(name, "SP_P12V_SLOT2");
break;
case SP_SENSOR_P12V_SLOT3:
- sprintf(name, "SP_SENSOR_P12V_SLOT3");
+ sprintf(name, "SP_P12V_SLOT3");
+ break;
+ case SP_SENSOR_P12V_SLOT4:
+ sprintf(name, "SP_P12V_SLOT4");
break;
case SP_SENSOR_P3V3:
- sprintf(name, "SP_SENSOR_P3V3");
+ sprintf(name, "SP_P3V3");
break;
case SP_SENSOR_HSC_IN_VOLT:
- sprintf(name, "SP_SENSOR_HSC_IN_VOLT");
+ sprintf(name, "SP_HSC_IN_VOLT");
break;
case SP_SENSOR_HSC_OUT_CURR:
- sprintf(name, "SP_SENSOR_HSC_OUT_CURR");
+ sprintf(name, "SP_HSC_OUT_CURR");
break;
case SP_SENSOR_HSC_TEMP:
- sprintf(name, "SP_SENSOR_HSC_TEMP");
+ sprintf(name, "SP_HSC_TEMP");
break;
case SP_SENSOR_HSC_IN_POWER:
- sprintf(name, "SP_SENSOR_HSC_IN_POWER");
+ sprintf(name, "SP_HSC_IN_POWER");
break;
}
break;
case FRU_NIC:
- sprintf(name, "");
+ switch(sensor_num) {
+ case MEZZ_SENSOR_TEMP:
+ sprintf(name, "MEZZ_SENSOR_TEMP");
+ break;
+ }
break;
}
return 0;
@@ -694,85 +784,100 @@ yosemite_sensor_name(uint8_t fru, uint8_t sensor_num, char *name) {
int
-yosemite_sensor_read(uint8_t slot_id, uint8_t sensor_num, void *value) {
- static bool init_done = false;
+yosemite_sensor_read(uint8_t fru, uint8_t sensor_num, void *value) {
+
float volt;
float curr;
+ int ret;
+ bool discrete;
+ int i;
- if (!init_done) {
+ switch (fru) {
+ case FRU_SLOT1:
+ case FRU_SLOT2:
+ case FRU_SLOT3:
+ case FRU_SLOT4:
- if (is_server_prsnt(1) && (yosemite_sdr_init(FRU_SLOT1) != 0)) {
- return -1;
- }
+ if (!(is_server_prsnt(fru))) {
+ return -1;
+ }
- if (is_server_prsnt(2) && (yosemite_sdr_init(FRU_SLOT2) != 0)) {
- return -1;
- }
+ ret = yosemite_sdr_init(fru);
+ if (ret < 0) {
+ return ret;
+ }
- if (is_server_prsnt(3) && (yosemite_sdr_init(FRU_SLOT3) != 0)) {
- return -1;
- }
+ discrete = false;
- if (is_server_prsnt(4) && (yosemite_sdr_init(FRU_SLOT4) != 0)) {
- return -1;
- }
+ i = 0;
+ while (i < bic_discrete_cnt) {
+ if (sensor_num == bic_discrete_list[i++]) {
+ discrete = true;
+ break;
+ }
+ }
- init_done = true;
- }
+ return bic_read_sensor_wrapper(fru, sensor_num, discrete, value);
- switch(sensor_num) {
- // Inlet, Outlet Temp
-
- case SP_SENSOR_INLET_TEMP:
- return read_temp(SP_INLET_TEMP_DEVICE, (float*) value);
- case SP_SENSOR_OUTLET_TEMP:
- return read_temp(SP_OUTLET_TEMP_DEVICE, (float*) value);
-
- // Fan Tach Values
- case SP_SENSOR_FAN0_TACH:
- return read_fan_value(FAN0, FAN_TACH_RPM, (float*) value);
- case SP_SENSOR_FAN1_TACH:
- return read_fan_value(FAN1, FAN_TACH_RPM, (float*) value);
-
- // Various Voltages
- case SP_SENSOR_P5V:
- return read_adc_value(ADC_PIN0, ADC_VALUE, (float*) value);
- case SP_SENSOR_P12V:
- return read_adc_value(ADC_PIN1, ADC_VALUE, (float*) value);
- case SP_SENSOR_P3V3_STBY:
- return read_adc_value(ADC_PIN2, ADC_VALUE, (float*) value);
- case SP_SENSOR_P12V_SLOT0:
- return read_adc_value(ADC_PIN3, ADC_VALUE, (float*) value);
- case SP_SENSOR_P12V_SLOT1:
- return read_adc_value(ADC_PIN4, ADC_VALUE, (float*) value);
- case SP_SENSOR_P12V_SLOT2:
- return read_adc_value(ADC_PIN5, ADC_VALUE, (float*) value);
- case SP_SENSOR_P12V_SLOT3:
- return read_adc_value(ADC_PIN6, ADC_VALUE, (float*) value);
- case SP_SENSOR_P3V3:
- return read_adc_value(ADC_PIN7, ADC_VALUE, (float*) value);
-
- // Hot Swap Controller
- case SP_SENSOR_HSC_IN_VOLT:
- return read_hsc_value(HSC_IN_VOLT, (float*) value);
- case SP_SENSOR_HSC_OUT_CURR:
- return read_hsc_value(HSC_OUT_CURR, (float*) value);
- case SP_SENSOR_HSC_TEMP:
- return read_hsc_value(HSC_TEMP, (float*) value);
- case SP_SENSOR_HSC_IN_POWER:
- if (read_hsc_value(HSC_IN_VOLT, &volt)) {
- return -1;
- }
+ case FRU_SPB:
+ switch(sensor_num) {
- if (read_hsc_value(HSC_OUT_CURR, &curr)) {
- return -1;
- }
+ // Inlet, Outlet Temp
+ case SP_SENSOR_INLET_TEMP:
+ return read_temp(SP_INLET_TEMP_DEVICE, (float*) value);
+ case SP_SENSOR_OUTLET_TEMP:
+ return read_temp(SP_OUTLET_TEMP_DEVICE, (float*) value);
- * (float*) value = volt * curr;
- return 0;
- default:
- // For all others we assume the sensors are on Monolake
- return bic_read_sensor_wrapper(slot_id, sensor_num, value);
+ // Fan Tach Values
+ case SP_SENSOR_FAN0_TACH:
+ return read_fan_value(FAN0, FAN_TACH_RPM, (float*) value);
+ case SP_SENSOR_FAN1_TACH:
+ return read_fan_value(FAN1, FAN_TACH_RPM, (float*) value);
+
+ // Various Voltages
+ case SP_SENSOR_P5V:
+ return read_adc_value(ADC_PIN0, ADC_VALUE, (float*) value);
+ case SP_SENSOR_P12V:
+ return read_adc_value(ADC_PIN1, ADC_VALUE, (float*) value);
+ case SP_SENSOR_P3V3_STBY:
+ return read_adc_value(ADC_PIN2, ADC_VALUE, (float*) value);
+ case SP_SENSOR_P12V_SLOT1:
+ return read_adc_value(ADC_PIN4, ADC_VALUE, (float*) value);
+ case SP_SENSOR_P12V_SLOT2:
+ return read_adc_value(ADC_PIN3, ADC_VALUE, (float*) value);
+ case SP_SENSOR_P12V_SLOT3:
+ return read_adc_value(ADC_PIN6, ADC_VALUE, (float*) value);
+ case SP_SENSOR_P12V_SLOT4:
+ return read_adc_value(ADC_PIN5, ADC_VALUE, (float*) value);
+ case SP_SENSOR_P3V3:
+ return read_adc_value(ADC_PIN7, ADC_VALUE, (float*) value);
+
+ // Hot Swap Controller
+ case SP_SENSOR_HSC_IN_VOLT:
+ return read_hsc_value(HSC_IN_VOLT, (float*) value);
+ case SP_SENSOR_HSC_OUT_CURR:
+ return read_hsc_value(HSC_OUT_CURR, (float*) value);
+ case SP_SENSOR_HSC_TEMP:
+ return read_hsc_value(HSC_TEMP, (float*) value);
+ case SP_SENSOR_HSC_IN_POWER:
+ if (read_hsc_value(HSC_IN_VOLT, &volt)) {
+ return -1;
+ }
+ if (read_hsc_value(HSC_OUT_CURR, &curr)) {
+ return -1;
+ }
+ * (float*) value = volt * curr;
+ return 0;
+ }
+ break;
+
+ case FRU_NIC:
+ switch(sensor_num) {
+ // Mezz Temp
+ case MEZZ_SENSOR_TEMP:
+ return read_nic_temp(MEZZ_SENSOR_TEMP, (float*) value);
+ }
+ break;
}
}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.h b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.h
index 0a33173..8775f15 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.h
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_sensor/yosemite_sensor.h
@@ -24,7 +24,6 @@
#include <stdbool.h>
#include <openbmc/ipmi.h>
#include <openbmc/ipmb.h>
-#include <openbmc/sdr.h>
#include <facebook/bic.h>
#include <facebook/yosemite_common.h>
@@ -32,6 +31,30 @@
extern "C" {
#endif
+#define MAX_SDR_LEN 64
+#define MAX_SENSOR_NUM 0xFF
+#define MAX_SENSOR_THRESHOLD 8
+#define MAX_RETRIES_SDR_INIT 30
+#define THERMAL_CONSTANT 255
+#define ERR_NOT_READY -2
+
+typedef struct _sensor_info_t {
+ bool valid;
+ sdr_full_t sdr;
+} sensor_info_t;
+
+/* Enum for type of Upper and Lower threshold values */
+enum {
+ UCR_THRESH = 0x01,
+ UNC_THRESH,
+ UNR_THRESH,
+ LCR_THRESH,
+ LNC_THRESH,
+ LNR_THRESH,
+ POS_HYST,
+ NEG_HYST,
+};
+
// Sensors under Bridge IC
enum {
BIC_SENSOR_MB_OUTLET_TEMP = 0x01,
@@ -51,6 +74,7 @@ enum {
BIC_SENSOR_VCCIN_VR_CURR = 0x23,
BIC_SENSOR_VCCIN_VR_VOL = 0x24,
BIC_SENSOR_INA230_POWER = 0x29,
+ BIC_SENSOR_INA230_VOL = 0x2A,
BIC_SENSOR_POST_ERR = 0x2B, //Event-only
BIC_SENSOR_SOC_PACKAGE_PWR = 0x2C,
BIC_SENSOR_SOC_TJMAX = 0x30,
@@ -63,9 +87,9 @@ enum {
BIC_SENSOR_VCC_SCSUS_VR_POUT = 0x38,
BIC_SENSOR_VCC_GBE_VR_POUT = 0x39,
BIC_SENSOR_POWER_THRESH_EVENT = 0x3B, //Event-only
- //BIC_SENSOR_1V05_PCH_VR_POUT = 0x40,
BIC_SENSOR_MACHINE_CHK_ERR = 0x40, //Event-only
BIC_SENSOR_PCIE_ERR = 0x41, //Event-only
+ BIC_SENSOR_1V05_PCH_VR_POUT = 0x42,
BIC_SENSOR_OTHER_IIO_ERR = 0x43, //Event-only
BIC_SENSOR_PROC_HOT_EXT = 0x51, //Event-only
BIC_SENSOR_VCC_GBE_VR_VOL = 0x54,
@@ -102,10 +126,10 @@ enum {
SP_SENSOR_P5V = 0xE0,
SP_SENSOR_P12V = 0xE1,
SP_SENSOR_P3V3_STBY = 0xE2,
- SP_SENSOR_P12V_SLOT0 = 0xE3,
- SP_SENSOR_P12V_SLOT1 = 0xE4,
- SP_SENSOR_P12V_SLOT2 = 0xE5,
- SP_SENSOR_P12V_SLOT3 = 0xE6,
+ SP_SENSOR_P12V_SLOT1 = 0xE3,
+ SP_SENSOR_P12V_SLOT2 = 0xE4,
+ SP_SENSOR_P12V_SLOT3 = 0xE5,
+ SP_SENSOR_P12V_SLOT4 = 0xE6,
SP_SENSOR_P3V3 = 0xE7,
SP_SENSOR_HSC_IN_VOLT = 0xC0,
SP_SENSOR_HSC_OUT_CURR = 0xC1,
@@ -113,18 +137,36 @@ enum {
SP_SENSOR_HSC_IN_POWER = 0xC3,
};
+enum{
+ MEZZ_SENSOR_TEMP = 0x01,
+};
extern const uint8_t bic_sensor_list[];
+extern const uint8_t bic_discrete_list[];
+
extern const uint8_t spb_sensor_list[];
+extern const uint8_t nic_sensor_list[];
+
+//extern float spb_sensor_threshold[MAX_SENSOR_NUM][MAX_SENSOR_THRESHOLD + 1];
+
+//extern float nic_sensor_threshold[MAX_SENSOR_NUM][MAX_SENSOR_THRESHOLD + 1];
+
extern size_t bic_sensor_cnt;
+extern size_t bic_discrete_cnt;
+
extern size_t spb_sensor_cnt;
-int yosemite_sensor_read(uint8_t slot_id, uint8_t sensor_num, void *value);
+extern size_t nic_sensor_cnt;
+
+int yosemite_sensor_read(uint8_t fru, uint8_t sensor_num, void *value);
int yosemite_sensor_name(uint8_t fru, uint8_t sensor_num, char *name);
int yosemite_sensor_units(uint8_t fru, uint8_t sensor_num, char *units);
-int get_fru_sdr_path(uint8_t fru, char *path);
+int yosemite_sensor_sdr_path(uint8_t fru, char *path);
+int yosemite_sensor_threshold(uint8_t fru, uint8_t sensor_num, uint8_t thresh, float *value);
+int yosemite_sensor_sdr_init(uint8_t fru, sensor_info_t *sinfo);
+
#ifdef __cplusplus
} // extern "C"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/libyosemite-sensor_0.1.bb b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/libyosemite-sensor_0.1.bb
index fbb4a15..4bbeef1 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/libyosemite-sensor_0.1.bb
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/libyosemite-sensor_0.1.bb
@@ -9,7 +9,7 @@ LIC_FILES_CHKSUM = "file://yosemite_sensor.c;beginline=8;endline=20;md5=da359787
SRC_URI = "file://yosemite_sensor \
"
-DEPENDS =+ " libipmi libipmb libbic libsdr libyosemite-common "
+DEPENDS =+ " libipmi libipmb libbic libyosemite-common "
S = "${WORKDIR}/yosemite_sensor"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fbutils_0.1.bb b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fbutils_0.1.bb
index 9a9f5fe..e00f558 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fbutils_0.1.bb
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fbutils_0.1.bb
@@ -83,7 +83,7 @@ do_install() {
install -m 0755 ${WORKDIR}/rc.early ${D}${sysconfdir}/init.d/rc.early
update-rc.d -r ${D} rc.early start 04 S .
install -m 755 setup-gpio.sh ${D}${sysconfdir}/init.d/setup-gpio.sh
- update-rc.d -r ${D} setup-gpio.sh start 59 S .
+ update-rc.d -r ${D} setup-gpio.sh start 59 5 .
# create VLAN intf automatically
#install -d ${D}/${sysconfdir}/network/if-up.d
#install -m 755 create_vlan_intf ${D}${sysconfdir}/network/if-up.d/create_vlan_intf
@@ -92,7 +92,7 @@ do_install() {
#install -m 755 eth0_mac_fixup.sh ${D}${sysconfdir}/init.d/eth0_mac_fixup.sh
#update-rc.d -r ${D} eth0_mac_fixup.sh start 70 S .
install -m 755 power-on.sh ${D}${sysconfdir}/init.d/power-on.sh
- update-rc.d -r ${D} power-on.sh start 85 S .
+ update-rc.d -r ${D} power-on.sh start 85 5 .
#install -m 755 fcswitcher.sh ${D}${sysconfdir}/init.d/fcswitcher.sh
#update-rc.d -r ${D} fcswitcher.sh start 90 S .
install -m 0755 ${WORKDIR}/rc.local ${D}${sysconfdir}/init.d/rc.local
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/bic-util/bic-util.c b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/bic-util/bic-util.c
index 4a8966d..3ebc3f1 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/bic-util/bic-util.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/bic-util/bic-util.c
@@ -55,6 +55,19 @@ util_get_device_id(uint8_t slot_id) {
printf("Aux. FW Rev: 0x%X:0x%X:0x%X:0x%X\n", id.aux_fw_rev[0], id.aux_fw_rev[1],id.aux_fw_rev[2],id.aux_fw_rev[3]);
}
+static void
+util_get_fw_ver(uint8_t slot_id) {
+ int i, j, ret;
+ uint8_t buf[16] = {0};
+ for (i = 1; i <= 8; i++) {
+ ret = bic_get_fw_ver(slot_id, i, buf);
+ printf("version of comp: %d is", i);
+ for (j = 0; j < 10; j++)
+ printf("%02X:", buf[j]);
+ printf("\n");
+ }
+}
+
// Tests for reading GPIO values and configuration
static void
util_get_gpio(uint8_t slot_id) {
@@ -363,6 +376,9 @@ main(int argc, char **argv) {
slot_id = atoi(argv[1]);
+ util_get_fw_ver(slot_id);
+
+#if 0
util_get_device_id(slot_id);
util_get_gpio(slot_id);
@@ -381,4 +397,5 @@ main(int argc, char **argv) {
util_get_sdr_info(slot_id);
util_get_sdr(slot_id);
util_read_sensor(slot_id);
+#endif
}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fpc-util/Makefile b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fpc-util/Makefile
new file mode 100644
index 0000000..cb90045
--- /dev/null
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fpc-util/Makefile
@@ -0,0 +1,10 @@
+# Copyright 2015-present Facebook. All Rights Reserved.
+all: fpc-util
+
+fpc-util: fpc-util.c
+ $(CC) -pthread -lipmi -lipmb -lbic -lpal -std=c99 -o $@ $^ $(LDFLAGS)
+
+.PHONY: clean
+
+clean:
+ rm -rf *.o fpc-util
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fpc-util/fpc-util.c b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fpc-util/fpc-util.c
new file mode 100644
index 0000000..93c1166
--- /dev/null
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fpc-util/fpc-util.c
@@ -0,0 +1,85 @@
+/*
+ * fpc-util
+ *
+ * Copyright 2015-present Facebook. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <syslog.h>
+#include <stdint.h>
+#include <pthread.h>
+#include <facebook/bic.h>
+#include <openbmc/pal.h>
+#include <openbmc/ipmi.h>
+
+static void
+print_usage_help(void) {
+ printf("Usage: fpc-util <slot1|slot2|slot3|slot4> --usb\n");
+ printf(" fpc-util <slot1|slot2|slot3|slot4|all> --identify <on/off>\n");
+}
+
+int
+main(int argc, char **argv) {
+
+ uint8_t slot_id;
+ char tstr[64] = {0};
+
+ if (argc < 3) {
+ goto err_exit;
+ }
+
+ if (!strcmp(argv[1], "slot1")) {
+ slot_id = 1;
+ } else if (!strcmp(argv[1] , "slot2")) {
+ slot_id = 2;
+ } else if (!strcmp(argv[1] , "slot3")) {
+ slot_id = 3;
+ } else if (!strcmp(argv[1] , "slot4")) {
+ slot_id = 4;
+ } else if (!strcmp(argv[1] , "all")) {
+ slot_id = 0;
+ } else {
+ goto err_exit;
+ }
+
+ if (!strcmp(argv[2], "--usb")) {
+ printf("fpc-util: switching USB channel to slot%d\n", slot_id);
+ return pal_switch_usb_mux(slot_id);
+ } else if (!strcmp(argv[2], "--identify")) {
+ if (argc != 4) {
+ goto err_exit;
+ }
+ printf("fpc-util: identication for %s is %s\n", argv[1], argv[3]);
+ if (slot_id == 0) {
+ sprintf(tstr, "identify_sled");
+ } else {
+ sprintf(tstr, "identify_slot%d", slot_id);
+ }
+
+ return pal_set_key_value(tstr, argv[3]);
+ } else {
+ goto err_exit;
+ }
+
+ return 0;
+err_exit:
+ print_usage_help();
+ return -1;
+}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fw-util/Makefile b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fw-util/Makefile
new file mode 100644
index 0000000..b56fca9
--- /dev/null
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fw-util/Makefile
@@ -0,0 +1,10 @@
+# Copyright 2015-present Facebook. All Rights Reserved.
+all: fw-util
+
+fw-util: fw-util.c
+ $(CC) -pthread -lipmi -lipmb -lbic -lpal -std=c99 -o $@ $^ $(LDFLAGS)
+
+.PHONY: clean
+
+clean:
+ rm -rf *.o fw-util
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fw-util/fw-util.c b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fw-util/fw-util.c
new file mode 100644
index 0000000..2b472b3
--- /dev/null
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/fw-util/fw-util.c
@@ -0,0 +1,161 @@
+/*
+ * fw-util
+ *
+ * Copyright 2015-present Facebook. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <syslog.h>
+#include <stdint.h>
+#include <pthread.h>
+#include <facebook/bic.h>
+#include <openbmc/pal.h>
+#include <openbmc/ipmi.h>
+
+static void
+print_usage_help(void) {
+ printf("Usage: fw_util <slot1|slot2|slot3|slot4> <--version>\n");
+ printf(" fw_util <slot1|slot2|slot3|slot4> <--update> <--cpld> <path>\n");
+}
+
+// TODO: Need to confirm the interpretation of firmware version for print
+// Right now using decimal to print the versions
+static void
+print_fw_ver(uint8_t slot_id) {
+ int i;
+ uint8_t ver[32] = {0};
+
+ // Print CPLD Version
+ if (bic_get_fw_ver(slot_id, FW_CPLD, ver)) {
+ return;
+ }
+
+ printf("CPLD Version: 0x%02x%02x%02x%02x\n", ver[0], ver[1], ver[2], ver[3]);
+
+ // Print Bridge-IC Version
+ if (bic_get_fw_ver(slot_id, FW_BIC, ver)) {
+ return;
+ }
+
+ printf("Bridge-IC Version: v%x.%x\n", ver[0], ver[1]);
+
+ // Print ME Version
+ if (bic_get_fw_ver(slot_id, FW_ME, ver)){
+ return;
+ }
+
+ printf("ME Version: %x.%x.%x.%x%x\n", ver[0], ver[1], ver[2], ver[3], ver[4]);
+
+ // Print PVCCIN VR Version
+ if (bic_get_fw_ver(slot_id, FW_PVCCIN_VR, ver)){
+ return;
+ }
+
+ printf("PVCCIN VR Version: 0x%02x%02x, 0x%02x%02x\n", ver[0], ver[1], ver[2], ver[3]);
+
+ // Print DDRAB VR Version
+ if (bic_get_fw_ver(slot_id, FW_DDRAB_VR, ver)){
+ return;
+ }
+
+ printf("DDRAB VR Version: 0x%02x%02x, 0x%02x%02x\n", ver[0], ver[1], ver[2], ver[3]);
+
+ // Print P1V05 VR Version
+ if (bic_get_fw_ver(slot_id, FW_P1V05_VR, ver)){
+ return;
+ }
+
+ printf("P1V05 VR Version: 0x%02x%02x, 0x%02x%02x\n", ver[0], ver[1], ver[2], ver[3]);
+
+ // Print PVCCGBE VR Version
+ if (bic_get_fw_ver(slot_id, FW_PVCCGBE_VR, ver)){
+ return;
+ }
+
+ printf("PVCCGBE VR Version: 0x%02x%02x, 0x%02x%02x\n", ver[0], ver[1], ver[2], ver[3]);
+
+ // Print PVCCSCSUS VR Version
+ if (bic_get_fw_ver(slot_id, FW_PVCCSCSUS_VR, ver)){
+ return;
+ }
+
+ printf("PVCCSCSUS VR Version: 0x%02x%02x, 0x%02x%02x\n", ver[0], ver[1], ver[2], ver[3]);
+
+ // Print BIOS version
+ if (pal_get_sysfw_ver(slot_id, ver)) {
+ return;
+ }
+
+ // BIOS version response contains the length at offset 2 followed by ascii string
+ printf("BIOS Version: ");
+ for (i = 3; i < 3+ver[2]; i++) {
+ printf("%c", ver[i]);
+ }
+ printf("\n");
+}
+
+int
+main(int argc, char **argv) {
+
+ uint8_t slot_id;
+
+ // Check for border conditions
+ if ((argc != 3) && (argc != 5)) {
+ goto err_exit;
+ }
+
+ // Derive slot_id from first parameter
+ if (!strcmp(argv[1], "slot1")) {
+ slot_id = 1;
+ } else if (!strcmp(argv[1] , "slot2")) {
+ slot_id =2;
+ } else if (!strcmp(argv[1] , "slot3")) {
+ slot_id =3;
+ } else if (!strcmp(argv[1] , "slot4")) {
+ slot_id =4;
+ } else {
+ goto err_exit;
+ }
+
+ // check operation to perform
+ if (!strcmp(argv[2], "--version")) {
+ // handle printing versions of f/w components
+ print_fw_ver(slot_id);
+ } else if (!strcmp(argv[2], "--update")) {
+ // handle firmware update
+ if (argc != 5) {
+ goto err_exit;
+ }
+
+ if (!strcmp(argv[3], "--cpld")) {
+ return bic_update_fw(slot_id, UPDATE_CPLD, argv[4]);
+ } else {
+ goto err_exit;
+ }
+ } else {
+ goto err_exit;
+ }
+
+ return 0;
+
+err_exit:
+ print_usage_help();
+ return -1;
+}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/setup-gpio.sh b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/setup-gpio.sh
index 91797c5..10aad30 100755
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/setup-gpio.sh
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/setup-gpio.sh
@@ -106,6 +106,20 @@ devmem_clear_bit $(scu_addr 80) 8
gpio_export B0
+# Enable P3V3: GPIOS1(145)
+# To use GPIOS1 (145), SCU8C[1], SCU94[0], and SCU94[1] must be 0
+devmem_clear_bit $(scu_addr 8C) 1
+devmem_clear_bit $(scu_addr 94) 0
+devmem_clear_bit $(scu_addr 94) 1
+
+gpio_set S1 1
+
+# PWRGD_P3V3: GPIOS2(146)
+# To use GPIOS2 (146), SCU8C[2], SCU94[0], and SCU94[1] must be 0
+devmem_clear_bit $(scu_addr 8C) 2
+devmem_clear_bit $(scu_addr 94) 0
+devmem_clear_bit $(scu_addr 94) 1
+
# Setup GPIOs to Mux Enable: GPIOS3(147), Channel Select: GPIOE4(36), GPIOE5(37)
# To use GPIOS3 (147), SCU8C[3], SCU94[0], and SCU94[1] must be 0
@@ -123,11 +137,11 @@ devmem_clear_bit $(scu_addr 80) 21
devmem_clear_bit $(scu_addr 8C) 14
devmem_clear_bit $(scu_addr 70) 22
-gpio_export S3
-gpio_export E4
-gpio_export E5
+gpio_set S3 0
+gpio_set E4 1
+gpio_set E5 0
-# BMC_HEARTBEAT_N, heartbeat LED, GPIO Q7
+# BMC_HEARTBEAT_N, heartbeat LED, GPIO Q7(135)
devmem_clear_bit $(scu_addr 90) 28
gpio_export Q7
@@ -204,6 +218,34 @@ devmem_clear_bit $(scu_addr 84) 27
gpio_set M3 1
+
+# Identify LED for Slot#2:
+# To use GPIOF0 (40), SCU80[24] must be 0
+devmem_clear_bit $(scu_addr 80) 24
+
+gpio_set F0 1
+
+# Identify LED for Slot#1:
+# To use GPIOF1 (41), SCU80[25], SCUA4[12], must be 0
+devmem_clear_bit $(scu_addr 80) 25
+devmem_clear_bit $(scu_addr A4) 12
+
+gpio_set F1 1
+
+# Identify LED for Slot#4:
+# To use GPIOF2 (42), SCU80[26], SCUA4[13], must be 0
+devmem_clear_bit $(scu_addr 80) 26
+devmem_clear_bit $(scu_addr A4) 13
+
+gpio_set F2 1
+
+# Identify LED for Slot#3:
+# To use GPIOF3 (43), SCU80[27], SCUA4[14], must be 0
+devmem_clear_bit $(scu_addr 80) 27
+devmem_clear_bit $(scu_addr A4) 14
+
+gpio_set F3 1
+
# Front Panel Hand Switch GPIO setup
# HAND_SW_ID1: GPIOR2(138)
# To use GPIOR2, SCU88[26] must be 0
@@ -305,3 +347,55 @@ gpio_set H3 1
# RST_SLOT4_SYS_RESET_N: GPIOH2 (58)
# To use GPIOH2, SCU90[6], SCU90[7] must be 0
gpio_set H2 1
+
+# 12V_STBY Enable for Slots
+
+# P12V_STBY_SLOT1_EN: GPIOO5 (117)
+# To use GPIOO5, SCU88[13] must be 0
+devmem_clear_bit $(scu_addr 88) 13
+
+gpio_set O5 1
+
+# P12V_STBY_SLOT2_EN: GPIOO4 (116)
+# To use GPIOO4, SCU88[12] must be 0
+devmem_clear_bit $(scu_addr 88) 12
+
+gpio_set O4 1
+
+# P12V_STBY_SLOT3_EN: GPIOO7 (119)
+# To use GPIOO7, SCU88[15] must be 0
+devmem_clear_bit $(scu_addr 88) 15
+
+gpio_set O7 1
+
+# P12V_STBY_SLOT4_EN: GPIOO6 (118)
+# To use GPIOO6, SCU88[13] must be 0
+devmem_clear_bit $(scu_addr 88) 14
+
+gpio_set O6 1
+
+# PWRGD_P12V_STBY_SLOT1: GPIOP1 (121)
+# To use GPIOP1, SCU88[17] must be 0
+devmem_clear_bit $(scu_addr 88) 17
+gpio_export P1
+
+# PWRGD_P12V_STBY_SLOT2: GPIOP0 (120)
+# To use GPIOP0, SCU88[16] must be 0
+devmem_clear_bit $(scu_addr 88) 16
+gpio_export P0
+
+# PWRGD_P12V_STBY_SLOT3: GPIOP3 (123)
+# To use GPIOP3, SCU88[19] must be 0
+devmem_clear_bit $(scu_addr 88) 19
+gpio_export P3
+
+# PWRGD_P12V_STBY_SLOT4: GPIOP2 (122)
+# To use GPIOP2, SCU88[18] must be 0
+devmem_clear_bit $(scu_addr 88) 18
+gpio_export P2
+
+# TODO: Enable this pin after the HW issue is fixed
+# Enable the the EXTRST functionality of GPIOB7
+#devmem_set_bit $(scu_addr 80) 15
+#devmem_clear_bit $(scu_addr 90) 31
+#devmem_set_bit $(scu_addr 3c) 3
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/yosemite-sensors/yosemite-sensors.c b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/yosemite-sensors/yosemite-sensors.c
index aa921db..8eb772b 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/yosemite-sensors/yosemite-sensors.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/files/yosemite-sensors/yosemite-sensors.c
@@ -79,12 +79,6 @@ main(int argc, char **argv) {
printf("SP_SENSOR_P3V3_STBY: %.2f Volts\n", fvalue);
}
- if (yosemite_sensor_read(slot_id, SP_SENSOR_P12V_SLOT0, &fvalue)) {
- printf("yosemite_sensor_read failed: SP_SENSOR_P12V_SLOT0\n");
- } else {
- printf("SP_SENSOR_P12V_SLOT0: %.2f Volts\n", fvalue);
- }
-
if (yosemite_sensor_read(slot_id, SP_SENSOR_P12V_SLOT1, &fvalue)) {
printf("yosemite_sensor_read failed: SP_SENSOR_P12V_SLOT1\n");
} else {
@@ -103,6 +97,12 @@ main(int argc, char **argv) {
printf("SP_SENSOR_P12V_SLOT3: %.2f Volts\n", fvalue);
}
+ if (yosemite_sensor_read(slot_id, SP_SENSOR_P12V_SLOT4, &fvalue)) {
+ printf("yosemite_sensor_read failed: SP_SENSOR_P12V_SLOT4\n");
+ } else {
+ printf("SP_SENSOR_P12V_SLOT4: %.2f Volts\n", fvalue);
+ }
+
if (yosemite_sensor_read(slot_id, SP_SENSOR_P3V3, &fvalue)) {
printf("yosemite_sensor_read failed: SP_SENSOR_P3V3\n");
} else {
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fpc-util_0.1.bb b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fpc-util_0.1.bb
new file mode 100644
index 0000000..04665f1
--- /dev/null
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fpc-util_0.1.bb
@@ -0,0 +1,21 @@
+# Copyright 2015-present Facebook. All Rights Reserved.
+SUMMARY = "Front Panel Control Utility"
+DESCRIPTION = "Util to override the front panel control remotely"
+SECTION = "base"
+PR = "r1"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://fpc-util.c;beginline=4;endline=16;md5=b395943ba8a0717a83e62ca123a8d238"
+
+SRC_URI = "file://fpc-util \
+ "
+
+S = "${WORKDIR}/fpc-util"
+
+do_install() {
+ install -d ${D}${bindir}
+ install -m 0755 fpc-util ${D}${bindir}/fpc-util
+}
+
+DEPENDS += "libpal"
+
+FILES_${PN} = "${bindir}"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fw-util_0.1.bb b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fw-util_0.1.bb
new file mode 100644
index 0000000..80c3064
--- /dev/null
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fbutils/fw-util_0.1.bb
@@ -0,0 +1,21 @@
+# Copyright 2015-present Facebook. All Rights Reserved.
+SUMMARY = "Firmware Utility"
+DESCRIPTION = "Util for printing or updating firmware images"
+SECTION = "base"
+PR = "r1"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://fw-util.c;beginline=4;endline=16;md5=b395943ba8a0717a83e62ca123a8d238"
+
+SRC_URI = "file://fw-util \
+ "
+
+S = "${WORKDIR}/fw-util"
+
+do_install() {
+ install -d ${D}${bindir}
+ install -m 0755 fw-util ${D}${bindir}/fw-util
+}
+
+DEPENDS += " libbic libpal"
+
+FILES_${PN} = "${bindir}"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/files/Makefile b/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/files/Makefile
index c542230..604fabf 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/files/Makefile
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/files/Makefile
@@ -2,7 +2,7 @@
all: front-paneld
front-paneld: front-paneld.c
- $(CC) -pthread -lpal -lbic -std=c99 -o $@ $^ $(LDFLAGS)
+ $(CC) -pthread -lpal -lbic -o $@ $^ $(LDFLAGS)
.PHONY: clean
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/files/front-paneld.c b/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/files/front-paneld.c
index 03849cd..5f1c1ff 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/files/front-paneld.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/files/front-paneld.c
@@ -29,12 +29,15 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <time.h>
+#include <sys/time.h>
#include <openbmc/ipmi.h>
#include <openbmc/ipmb.h>
#include <openbmc/pal.h>
-#define BTN_MAX_SAMPLES 200
+#define BTN_MAX_SAMPLES 200
+#define BTN_POWER_OFF 40
#define MAX_NUM_SLOTS 4
+#define HB_TIMESTAMP_COUNT (60 * 60)
// Helper function for msleep
void
@@ -55,7 +58,8 @@ debug_card_handler() {
int curr = -1;
int prev = -1;
uint8_t prsnt;
- uint8_t pos;
+ uint8_t pos ;
+ uint8_t prev_pos = -1;
uint8_t lpc;
int i, ret;
@@ -67,24 +71,37 @@ debug_card_handler() {
}
curr = prsnt;
- if (curr == prev) {
- // No state change, continue
- goto debug_card_out;
+
+ // Check if Debug Card was either inserted or removed
+ if (curr != prev) {
+
+ if (!curr) {
+ // Debug Card was removed
+ syslog(LOG_WARNING, "Debug Card Extraction\n");
+ // Switch UART mux to BMC
+ ret = pal_switch_uart_mux(HAND_SW_BMC);
+ if (ret) {
+ goto debug_card_out;
+ }
+ } else {
+ // Debug Card was inserted
+ syslog(LOG_WARNING, "Debug Card Insertion\n");
+
+ }
}
+ // If Debug Card is present
if (curr) {
- syslog(LOG_ALERT, "Debug Card Insertion\n");
- // Get current position of hand switch
ret = pal_get_hand_sw(&pos);
if (ret) {
goto debug_card_out;
}
- // Switch USB mux based on hand switch
- ret = pal_switch_usb_mux(pos);
- if (ret) {
- goto debug_card_out;
+ if (pos == prev_pos && pos != HAND_SW_BMC & !prev) {
+ goto display_post;
}
+
+
// Switch UART mux based on hand switch
ret = pal_switch_uart_mux(pos);
if (ret) {
@@ -109,6 +126,7 @@ debug_card_handler() {
goto debug_card_out;
}
+display_post:
// Get last post code and display it
ret = pal_post_get_last(pos, &lpc);
if (ret) {
@@ -119,24 +137,23 @@ debug_card_handler() {
if (ret) {
goto debug_card_out;
}
- } else {
- syslog(LOG_ALERT, "Debug Card Extraction\n");
- // Switch UART mux to BMC
- ret = pal_switch_uart_mux(HAND_SW_BMC);
- if (ret) {
- goto debug_card_out;
- }
+
}
+
debug_card_done:
prev = curr;
+ prev_pos = pos;
debug_card_out:
- sleep(1);
+ if (prsnt)
+ msleep(500);
+ else
+ sleep(1);
}
}
// Thread to monitor the hand switch
static void *
-hand_sw_handler() {
+usb_handler() {
int curr = -1;
int prev = -1;
int ret;
@@ -162,48 +179,6 @@ hand_sw_handler() {
goto hand_sw_out;
}
- // If Debug Card is present, update UART MUX
- ret = pal_is_debug_card_prsnt(&prsnt);
- if (ret) {
- goto hand_sw_out;
- }
-
- if (prsnt) {
- // Switch UART mux based on position
- ret = pal_switch_uart_mux(pos);
- if (ret) {
- goto hand_sw_out;
- }
-
- if (pos == HAND_SW_BMC) {
- // For BMC, there is no need for POST enable/disable code
- goto hand_sw_done;
- }
-
- ret = pal_is_server_prsnt(pos, &prsnt);
- if (ret || !prsnt) {
- // Server at chosen position is not present
- goto hand_sw_done;
- }
-
- // Enable post for the chosen server
- ret = pal_post_enable(pos);
- if (ret) {
- goto hand_sw_out;
- }
-
- // Get last post code and display it
- ret = pal_post_get_last(pos, &lpc);
- if (ret) {
- goto hand_sw_out;
- }
-
- ret = pal_post_handle(pos, lpc);
- if (ret) {
- goto hand_sw_out;
- }
- }
-hand_sw_done:
prev = curr;
hand_sw_out:
sleep(1);
@@ -235,7 +210,7 @@ rst_btn_handler() {
}
// Pass the reset button to the selected slot
- syslog(LOG_ALERT, "reset button pressed\n");
+ syslog(LOG_WARNING, "Reset button pressed\n");
ret = pal_set_rst_btn(pos, 0);
if (ret) {
goto rst_btn_out;
@@ -248,14 +223,15 @@ rst_btn_handler() {
msleep(100);
continue;
}
- syslog(LOG_ALERT, "Reset button released\n");
+ syslog(LOG_WARNING, "Reset button released\n");
+ syslog(LOG_CRIT, "Reset Button pressed for FRU: %d\n", pos);
ret = pal_set_rst_btn(pos, 1);
goto rst_btn_out;
}
// handle error case
if (i == BTN_MAX_SAMPLES) {
- syslog(LOG_ALERT, "Reset button seems to stuck for long time\n");
+ syslog(LOG_WARNING, "Reset button seems to stuck for long time\n");
goto rst_btn_out;
}
rst_btn_out:
@@ -267,7 +243,7 @@ rst_btn_out:
static void *
pwr_btn_handler() {
int ret;
- uint8_t pos, btn;
+ uint8_t pos, btn, cmd;
int i;
uint8_t power;
@@ -285,7 +261,7 @@ pwr_btn_handler() {
goto pwr_btn_out;
}
- syslog(LOG_ALERT, "power button pressed\n");
+ syslog(LOG_WARNING, "power button pressed\n");
// Wait for the button to be released
for (i = 0; i < BTN_MAX_SAMPLES; i++) {
@@ -294,13 +270,13 @@ pwr_btn_handler() {
msleep(100);
continue;
}
- syslog(LOG_ALERT, "power button released\n");
+ syslog(LOG_WARNING, "power button released\n");
break;
}
// handle error case
if (i == BTN_MAX_SAMPLES) {
- syslog(LOG_ALERT, "Power button seems to stuck for long time\n");
+ syslog(LOG_WARNING, "Power button seems to stuck for long time\n");
goto pwr_btn_out;
}
@@ -310,13 +286,96 @@ pwr_btn_handler() {
goto pwr_btn_out;
}
+ // Set power command should reverse of current power state
+ cmd = !power;
+
+ // To determine long button press
+ if (i >= BTN_POWER_OFF) {
+ syslog(LOG_CRIT, "Power Button Long Press for FRU: %d\n", pos);
+ } else {
+
+ // If current power state is ON and it is not a long press,
+ // the power off should be Graceful Shutdown
+ if (power == SERVER_POWER_ON)
+ cmd = SERVER_GRACEFUL_SHUTDOWN;
+
+ syslog(LOG_CRIT, "Power Button Press for FRU: %d\n", pos);
+ }
+
// Reverse the power state of the given server
- ret = pal_set_server_power(pos, !power);
+ ret = pal_set_server_power(pos, cmd);
pwr_btn_out:
msleep(100);
}
}
+// Thread to handle Heart Beat LED and monitor SLED Cycles
+static void *
+hb_handler() {
+ int count = 0;
+ struct timespec ts;
+ struct timespec mts;
+ char tstr[64] = {0};
+ char buf[128] = {0};
+ uint8_t por = 0;
+ uint8_t time_init = 0;
+ long time_sled_on;
+ long time_sled_off;
+
+ // Read the last timestamp from KV storage
+ pal_get_key_value("timestamp_sled", tstr);
+ time_sled_off = (long) strtoul(tstr, NULL, 10);
+
+ // If this reset is due to Power-On-Reset, we detected SLED power OFF event
+ if (pal_is_bmc_por()) {
+ ctime_r(&time_sled_off, buf);
+ syslog(LOG_CRIT, "SLED Powered OFF at %s", buf);
+ }
+
+
+ while (1) {
+ // Toggle HB LED
+ pal_set_hb_led(1);
+ msleep(500);
+ pal_set_hb_led(0);
+ msleep(500);
+
+ // Make sure the time is initialized properly
+ // Since there is no battery backup, the time could be reset to build time
+ if (time_init == 0) {
+ // Read current time
+ clock_gettime(CLOCK_REALTIME, &ts);
+
+ if (ts.tv_sec < time_sled_off) {
+ continue;
+ }
+
+ // If current time is more than the stored time, the date is correct
+ time_init = 1;
+
+ // Need to log SLED ON event, if this is Power-On-Reset
+ if (pal_is_bmc_por()) {
+ // Get uptime
+ clock_gettime(CLOCK_MONOTONIC, &mts);
+ // To find out when SLED was on, subtract the uptime from current time
+ time_sled_on = ts.tv_sec - mts.tv_sec;
+
+ ctime_r(&time_sled_on, buf);
+ // Log an event if this is Power-On-Reset
+ syslog(LOG_CRIT, "SLED Powered ON at %s", buf);
+ }
+ }
+
+ // Store timestamp every one hour to keep track of SLED power
+ if (count++ == HB_TIMESTAMP_COUNT) {
+ clock_gettime(CLOCK_REALTIME, &ts);
+ sprintf(tstr, "%d", ts.tv_sec);
+ pal_set_key_value("timestamp_sled", tstr);
+ count = 0;
+ }
+ }
+}
+
// Thread to handle LED state of the server at given slot
static void *
led_handler(void *num) {
@@ -324,13 +383,21 @@ led_handler(void *num) {
uint8_t prsnt;
uint8_t power;
uint8_t pos;
- uint8_t ident;
uint8_t led_blink;
+ uint8_t ident = 0;
int led_on_time, led_off_time;
+ char identify[16] = {0};
+ char tstr[64] = {0};
+ int id_led_on_time = 200;
+ int id_led_off_time = 200;
+ int power_led_on_time = 500;
+ int power_led_off_time = 500;
uint8_t slot = (*(int*) num) + 1;
+#ifdef DEBUG
syslog(LOG_INFO, "led_handler for slot %d\n", slot);
+#endif
ret = pal_is_server_prsnt(slot, &prsnt);
if (ret || !prsnt) {
@@ -340,6 +407,45 @@ led_handler(void *num) {
}
while (1) {
+
+ // Check if this slot needs to be identified
+ ident = 0;
+
+ // Check if sled needs to be identified
+ memset(identify, 0x0, 16);
+ ret = pal_get_key_value("identify_sled", identify);
+ if (ret == 0 && !strcmp(identify, "on")) {
+ ident = 0x1;
+ }
+
+ // Check if slot needs to be identified
+ if (!ident) {
+ sprintf(tstr, "identify_slot%d", slot);
+ memset(identify, 0x0, 16);
+ ret = pal_get_key_value(tstr, identify);
+ if (ret == 0 && !strcmp(identify, "on")) {
+ ident = 0x1;
+ }
+ }
+
+ if (ident) {
+ // Turn OFF Power LED
+ pal_set_led(slot, 0);
+
+ // Start blinking the ID LED
+ pal_set_id_led(slot, 0);
+
+ msleep(id_led_on_time);
+
+ pal_set_id_led(slot, 1);
+
+ msleep(id_led_off_time);
+ continue;
+ } else {
+ // Turn OFF ID LED
+ pal_set_id_led(slot, 1);
+ }
+
// Get power status for this slot
ret = pal_get_server_power(slot, &power);
if (ret) {
@@ -354,27 +460,22 @@ led_handler(void *num) {
continue;
}
- if (pos == slot) {
- // This server is selcted one, set ident flag
- ident = 1;
- } else {
- ident = 0;
+ if (pos == HAND_SW_BMC) {
+ // Start blinking the ID LED
+ pal_set_led(slot, 0);
+
+ msleep(power_led_off_time);
+
+ pal_set_led(slot, 1);
+
+ msleep(power_led_on_time);
+ continue;
}
- // Update LED based on current state
- if (ident) {
- // If this is selected server the blink flag is one
+ if (pos == slot) {
+ // This server is selcted one, set led_blink flag
led_blink = 1;
- // update the blink rate based on power state
- if (power) {
- led_on_time = 900;
- led_off_time = 100;
- } else {
- led_on_time = 100;
- led_off_time = 900;
- }
} else {
- // This server is not selected one
led_blink = 0;
}
@@ -384,7 +485,16 @@ led_handler(void *num) {
goto led_handler_out;
}
- // Since this is selected slot, start blinking the LED
+ // Set blink rate
+ if (power) {
+ led_on_time = 900;
+ led_off_time = 100;
+ } else {
+ led_on_time = 100;
+ led_off_time = 900;
+ }
+
+ // Start blinking the LED
ret = pal_set_led(slot, 1);
if (ret) {
goto led_handler_out;
@@ -412,30 +522,47 @@ main (int argc, char * const argv[]) {
pthread_t tid_debug_card;
pthread_t tid_rst_btn;
pthread_t tid_pwr_btn;
+ pthread_t tid_hb;
pthread_t tid_leds[MAX_NUM_SLOTS];
int i;
int *ip;
+ int rc;
+ int pid_file;
+
+ pid_file = open("/var/run/front-paneld.pid", O_CREAT | O_RDWR, 0666);
+ rc = flock(pid_file, LOCK_EX | LOCK_NB);
+ if(rc) {
+ if(EWOULDBLOCK == errno) {
+ printf("Another front-paneld instance is running...\n");
+ exit(-1);
+ }
+ } else {
+ daemon(0, 1);
+ openlog("front-paneld", LOG_CONS, LOG_DAEMON);
+ }
- daemon(1, 0);
- openlog("front-paneld", LOG_CONS, LOG_DAEMON);
- if (pthread_create(&tid_debug_card, NULL, debug_card_handler, NULL) < 0) {
- syslog(LOG_ALERT, "pthread_create for debug card error\n");
+ if (pthread_create(&tid_debug_card, NULL, debug_card_handler, NULL) < 0) {
+ syslog(LOG_WARNING, "pthread_create for debug card error\n");
exit(1);
}
-
- if (pthread_create(&tid_hand_sw, NULL, hand_sw_handler, NULL) < 0) {
- syslog(LOG_ALERT, "pthread_create for hand switch error\n");
+ if (pthread_create(&tid_hand_sw, NULL, usb_handler, NULL) < 0) {
+ syslog(LOG_WARNING, "pthread_create for hand switch error\n");
exit(1);
}
if (pthread_create(&tid_rst_btn, NULL, rst_btn_handler, NULL) < 0) {
- syslog(LOG_ALERT, "pthread_create for reset button error\n");
+ syslog(LOG_WARNING, "pthread_create for reset button error\n");
exit(1);
}
if (pthread_create(&tid_pwr_btn, NULL, pwr_btn_handler, NULL) < 0) {
- syslog(LOG_ALERT, "pthread_create for power button error\n");
+ syslog(LOG_WARNING, "pthread_create for power button error\n");
+ exit(1);
+ }
+
+ if (pthread_create(&tid_hb, NULL, hb_handler, NULL) < 0) {
+ syslog(LOG_WARNING, "pthread_create for heart beat error\n");
exit(1);
}
@@ -443,15 +570,15 @@ main (int argc, char * const argv[]) {
ip = malloc(sizeof(int));
*ip = i;
if (pthread_create(&tid_leds[i], NULL, led_handler, (void*)ip) < 0) {
- syslog(LOG_ALERT, "pthread_create for hand switch error\n");
+ syslog(LOG_WARNING, "pthread_create for hand switch error\n");
exit(1);
}
}
-
pthread_join(tid_debug_card, NULL);
pthread_join(tid_hand_sw, NULL);
pthread_join(tid_rst_btn, NULL);
pthread_join(tid_pwr_btn, NULL);
+ pthread_join(tid_hb, NULL);
for (i = 0; i < MAX_NUM_SLOTS; i++) {
pthread_join(tid_leds[i], NULL);
}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/front-paneld_0.1.bb b/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/front-paneld_0.1.bb
index 26db659..8eb4457 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/front-paneld_0.1.bb
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/front-paneld/front-paneld_0.1.bb
@@ -31,7 +31,7 @@ do_install() {
install -d ${D}${sysconfdir}/init.d
install -d ${D}${sysconfdir}/rcS.d
install -m 755 setup-front-paneld.sh ${D}${sysconfdir}/init.d/setup-front-paneld.sh
- update-rc.d -r ${D} setup-front-paneld.sh start 67 S .
+ update-rc.d -r ${D} setup-front-paneld.sh start 67 5 .
}
FBPACKAGEDIR = "${prefix}/local/fbpackages"
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"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/ipmbd/ipmbd_0.1.bbappend b/meta-facebook/meta-yosemite/recipes-yosemite/ipmbd/ipmbd_0.1.bbappend
index bf2af1e..f2cc6a7 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/ipmbd/ipmbd_0.1.bbappend
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/ipmbd/ipmbd_0.1.bbappend
@@ -3,6 +3,7 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += " file://setup-ipmbd.sh \
"
+DEPENDS_append = " fbutils "
CFLAGS_prepend = " -DCONFIG_YOSEMITE"
@@ -16,7 +17,7 @@ do_install() {
install -d ${D}${sysconfdir}/init.d
install -d ${D}${sysconfdir}/rcS.d
install -m 755 setup-ipmbd.sh ${D}${sysconfdir}/init.d/setup-ipmbd.sh
- update-rc.d -r ${D} setup-ipmbd.sh start 65 S .
+ update-rc.d -r ${D} setup-ipmbd.sh start 65 5 .
}
FBPACKAGEDIR = "${prefix}/local/fbpackages"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/bic.c b/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/bic.c
index 5af03ce..938e076 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/bic.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/bic.c
@@ -42,7 +42,7 @@ lib_gpio_intr_handle(unsigned char *request, unsigned char req_len,
// TODO: Need to update to reuse the socket instead of creating new
if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
- syslog(LOG_ALERT, "lib_gpio_intr_handle: socket() failed\n");
+ syslog(LOG_WARNING, "lib_gpio_intr_handle: socket() failed\n");
return;
}
@@ -51,12 +51,12 @@ lib_gpio_intr_handle(unsigned char *request, unsigned char req_len,
len = strlen(remote.sun_path) + sizeof(remote.sun_family);
if (connect(sockfd, (struct sockaddr *)&remote, len) == -1) {
- syslog(LOG_ALERT, "lib_gpio_intr_handle: connect() failed\n");
+ syslog(LOG_WARNING, "lib_gpio_intr_handle: connect() failed\n");
return;
}
if (send(sockfd, request, req_len, 0) == -1) {
- syslog(LOG_ALERT, "lib_gpio_intr_handle: send() failed\n");
+ syslog(LOG_WARNING, "lib_gpio_intr_handle: send() failed\n");
return;
}
@@ -64,9 +64,9 @@ lib_gpio_intr_handle(unsigned char *request, unsigned char req_len,
*res_len = t;
} else {
if (t < 0) {
- syslog(LOG_ALERT, "lib_gpio_intr_handle: recv() failed\n");
+ syslog(LOG_WARNING, "lib_gpio_intr_handle: recv() failed\n");
} else {
- printf("Server closed connection");
+ syslog(LOG_WARNING, "Server closed connection");
}
return;
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/fruid.c b/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/fruid.c
index 04772d7..d3fb856 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/fruid.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/fruid.c
@@ -34,12 +34,15 @@
#include "fruid.h"
#define EEPROM_SPB "/sys/class/i2c-adapter/i2c-8/8-0051/eeprom"
+#define EEPROM_NIC "/sys/class/i2c-adapter/i2c-12/12-0051/eeprom"
#define BIN_SPB "/tmp/fruid_spb.bin"
+#define BIN_NIC "/tmp/fruid_nic.bin"
#define NAME_SPB "Side Plane Board"
+#define NAME_NIC "Mezz Card"
-#define BUF_SIZE 1024
+#define FRUID_SIZE 256
/*
* copy_eeprom_to_bin - copy the eeprom to binary file im /tmp directory
@@ -54,7 +57,7 @@ int copy_eeprom_to_bin(const char * eeprom_file, const char * bin_file) {
int eeprom;
int bin;
- uint64_t tmp[BUF_SIZE];
+ uint64_t tmp[FRUID_SIZE];
ssize_t bytes_rd, bytes_wr;
errno = 0;
@@ -75,13 +78,18 @@ int copy_eeprom_to_bin(const char * eeprom_file, const char * bin_file) {
return errno;
}
- while ((bytes_rd = read(eeprom, tmp, BUF_SIZE)) > 0) {
- bytes_wr = write(bin, tmp, bytes_rd);
- if (bytes_wr != bytes_rd) {
- syslog(LOG_ERR, "copy_eeprom_to_bin: write to %s file failed: %s",
- bin_file, strerror(errno));
- return errno;
- }
+ bytes_rd = read(eeprom, tmp, FRUID_SIZE);
+ if (bytes_rd != FRUID_SIZE) {
+ syslog(LOG_ERR, "copy_eeprom_to_bin: write to %s file failed: %s",
+ eeprom_file, strerror(errno));
+ return errno;
+ }
+
+ bytes_wr = write(bin, tmp, bytes_rd);
+ if (bytes_wr != bytes_rd) {
+ syslog(LOG_ERR, "copy_eeprom_to_bin: write to %s file failed: %s",
+ bin_file, strerror(errno));
+ return errno;
}
close(bin);
@@ -97,6 +105,7 @@ int plat_fruid_init(void) {
int ret;
ret = copy_eeprom_to_bin(EEPROM_SPB, BIN_SPB);
+ ret = copy_eeprom_to_bin(EEPROM_NIC, BIN_NIC);
return ret;
}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/lan.c b/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/lan.c
new file mode 100644
index 0000000..3b36046
--- /dev/null
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/lan.c
@@ -0,0 +1,127 @@
+/*
+ * lan.c
+ *
+ * Copyright 2015-present Facebook. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define _GNU_SOURCE /* To get defns of NI_MAXSERV and NI_MAXHOST */
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <ifaddrs.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <net/if.h>
+#include <linux/if_link.h>
+#include <sys/ioctl.h>
+#include <stdbool.h>
+#include <openbmc/ipmi.h>
+
+#define ETH_INTF_NAME "eth0"
+
+#define IPV6_LINK_LOCAL_BYTE1 0xFE
+#define IPV6_LINK_LOCAL_BYTE2 0x80
+
+#define BYTE_MASK 0xFF
+#define BYTE1_OFFSET 8
+#define BYTE2_OFFSET 16
+#define BYTE3_OFFSET 24
+
+void plat_lan_init(lan_config_t *lan)
+{
+ struct ifaddrs *ifaddr, *ifa;
+ struct sockaddr_in *addr;
+ struct sockaddr_in6 *addr6;
+ int family, s, n, i;
+ unsigned long ip;
+ unsigned char *ip6;
+ int sd;
+ struct ifreq ifr;
+ uint8_t mac_addr[6];
+ uint8_t eui_64_addr[8] = {0x0};
+ bool slaac_flag = false;
+ char test[64];
+
+ if (getifaddrs(&ifaddr) == -1) {
+ return;
+ }
+
+ for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
+ if (ifa->ifa_addr == NULL) {
+ continue;
+ }
+
+ if (strcmp(ifa->ifa_name, ETH_INTF_NAME)) {
+ continue;
+ }
+
+ family = ifa->ifa_addr->sa_family;
+
+ if (family == AF_INET) {
+ addr = (struct sockaddr_in*) ifa->ifa_addr;
+ ip = addr->sin_addr.s_addr;
+
+ // copy the ip address from long to byte array with MSB first
+ lan->ip_addr[3] = (ip >> BYTE3_OFFSET) & BYTE_MASK;
+ lan->ip_addr[2] = (ip >> BYTE2_OFFSET) & BYTE_MASK;
+ lan->ip_addr[1] = (ip >> BYTE1_OFFSET) & BYTE_MASK;
+ lan->ip_addr[0] = ip & BYTE_MASK;
+ } else if (family == AF_INET6) {
+ addr6 = (struct sockaddr_in6*) ifa->ifa_addr;
+ ip6 = addr6->sin6_addr.s6_addr;
+
+ // If the address is Link Local, Ignore it
+ if ((ip6[0] == IPV6_LINK_LOCAL_BYTE1) && (ip6[1] == IPV6_LINK_LOCAL_BYTE2)) {
+ continue;
+ }
+
+ // Get the MAC address
+ sd = socket(PF_INET, SOCK_DGRAM, 0);
+ strcpy(ifr.ifr_name, ifa->ifa_name);
+ if(ioctl(sd, SIOCGIFHWADDR, &ifr) != -1) {
+ uint8_t* mac_addr = (uint8_t*)ifr.ifr_hwaddr.sa_data;
+
+ /*
+ * SLAAC address has lower 8B as follows:
+ * 3B == First 24b MAC address
+ * 2B == FFFE
+ * 3B == Last 24b MAC address
+ */
+ memcpy((void *)&eui_64_addr[0], (void *)&mac_addr[0], 3);
+ eui_64_addr[3] = 0xFF;
+ eui_64_addr[4] = 0xFE;
+ memcpy((void *)&eui_64_addr[5], (void *)&mac_addr[3], 3);
+ eui_64_addr[0] += 2;
+
+ // Check if the address is SLAAC address. If yes, skip it.
+ if (!memcmp((void *)&ip6[8], (void *)eui_64_addr, 8)) {
+ slaac_flag = true;
+ }
+ }
+
+ if (slaac_flag)
+ continue;
+
+ // copy the ip address from array with MSB first
+ memcpy(lan->ip6_addr, ip6, SIZE_IP6_ADDR);
+ }
+ }
+
+ freeifaddrs(ifaddr);
+}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/sensor.c b/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/sensor.c
index 16cf98e..57ab5ec 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/sensor.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/files/sensor.c
@@ -81,7 +81,7 @@ populate_mgmt_sensors(void) {
// Add this sensor to the global table
if (g_sensor_mgmt.num >= SENSOR_MGMT_MAX) {
- syslog(LOG_ALERT, "populate_mgmt_sensors: num exceeded\n");
+ syslog(LOG_WARNING, "populate_mgmt_sensors: num exceeded\n");
return;
}
@@ -126,7 +126,7 @@ populate_disc_sensors(void) {
// Add this sensor to the global table
if (g_sensor_disc.num >= SENSOR_DISC_MAX) {
- syslog(LOG_ALERT, "populate_disc_sensors: num exceeded\n");
+ syslog(LOG_WARNING, "populate_disc_sensors: num exceeded\n");
return;
}
@@ -166,7 +166,7 @@ populate_disc_sensors(void) {
// Add this sensor to the global table
if (g_sensor_disc.num >= SENSOR_DISC_MAX) {
- syslog(LOG_ALERT, "populate_disc_sensors: num exceeded\n");
+ syslog(LOG_WARNING, "populate_disc_sensors: num exceeded\n");
return;
}
@@ -207,7 +207,7 @@ populate_disc_sensors(void) {
// Add this sensor to the global table
if (g_sensor_disc.num >= SENSOR_DISC_MAX) {
- syslog(LOG_ALERT, "populate_disc_sensors: num exceeded\n");
+ syslog(LOG_WARNING, "populate_disc_sensors: num exceeded\n");
return;
}
@@ -245,7 +245,7 @@ populate_disc_sensors(void) {
// Add this sensor to the global table
if (g_sensor_disc.num >= SENSOR_DISC_MAX) {
- syslog(LOG_ALERT, "populate_disc_sensors: num exceeded\n");
+ syslog(LOG_WARNING, "populate_disc_sensors: num exceeded\n");
return;
}
@@ -282,7 +282,7 @@ populate_disc_sensors(void) {
// Add this sensor to the global table
if (g_sensor_disc.num >= SENSOR_DISC_MAX) {
- syslog(LOG_ALERT, "populate_disc_sensors: num exceeded\n");
+ syslog(LOG_WARNING, "populate_disc_sensors: num exceeded\n");
return;
}
@@ -323,7 +323,7 @@ populate_disc_sensors(void) {
// Add this sensor to the global table
if (g_sensor_disc.num >= SENSOR_DISC_MAX) {
- syslog(LOG_ALERT, "populate_disc_sensors: num exceeded\n");
+ syslog(LOG_WARNING, "populate_disc_sensors: num exceeded\n");
return;
}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/ipmid_0.2.bbappend b/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/ipmid_0.2.bbappend
index 4a92e78..57215c5 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/ipmid_0.2.bbappend
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/ipmid/ipmid_0.2.bbappend
@@ -21,10 +21,13 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += "file://setup-ipmid.sh \
file://sensor.c \
file://fruid.c \
+ file://lan.c \
"
S = "${WORKDIR}"
+CFLAGS_prepend = " -DCONFIG_YOSEMITE "
+
do_install() {
dst="${D}/usr/local/fbpackages/${pkgdir}"
bin="${D}/usr/local/bin"
@@ -35,7 +38,7 @@ do_install() {
install -d ${D}${sysconfdir}/init.d
install -d ${D}${sysconfdir}/rcS.d
install -m 755 setup-ipmid.sh ${D}${sysconfdir}/init.d/setup-ipmid.sh
- update-rc.d -r ${D} setup-ipmid.sh start 64 S .
+ update-rc.d -r ${D} setup-ipmid.sh start 64 5 .
}
FBPACKAGEDIR = "${prefix}/local/fbpackages"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/me-util/files/Makefile b/meta-facebook/meta-yosemite/recipes-yosemite/me-util/files/Makefile
new file mode 100644
index 0000000..941ef10
--- /dev/null
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/me-util/files/Makefile
@@ -0,0 +1,10 @@
+# Copyright 2015-present Facebook. All Rights Reserved.
+all: me-util
+
+me-util: me-util.o
+ $(CC) $(CFLAGS) -pthread -lipmi -lipmb -lbic -lpal -std=c99 -o $@ $^ $(LDFLAGS)
+
+.PHONY: clean
+
+clean:
+ rm -rf *.o me-util
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/me-util/files/me-util.c b/meta-facebook/meta-yosemite/recipes-yosemite/me-util/files/me-util.c
new file mode 100644
index 0000000..3a181b2
--- /dev/null
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/me-util/files/me-util.c
@@ -0,0 +1,119 @@
+/*
+ * me-util
+ *
+ * Copyright 2015-present Facebook. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <syslog.h>
+#include <stdint.h>
+#include <pthread.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <facebook/bic.h>
+#include <openbmc/ipmi.h>
+
+#define LOGFILE "/tmp/me-util.log"
+
+static void
+print_usage_help(void) {
+ printf("Usage: me-util <slot1|slot2|slot3|slot4> <[0..n]data_bytes_to_send>\n");
+}
+
+int
+main(int argc, char **argv) {
+ uint8_t slot_id;
+ uint8_t tbuf[256] = {0x00};
+ uint8_t rbuf[256] = {0x00};
+ uint8_t tlen = 0;
+ uint8_t rlen = 0;
+ int i;
+ int ret;
+ int logfd;
+ int len;
+ char log[128];
+ char temp[8];
+
+ if (argc < 3) {
+ goto err_exit;
+ }
+
+ if (!strcmp(argv[1], "slot1")) {
+ slot_id = 1;
+ } else if (!strcmp(argv[1] , "slot2")) {
+ slot_id = 2;
+ } else if (!strcmp(argv[1] , "slot3")) {
+ slot_id = 3;
+ } else if (!strcmp(argv[1] , "slot4")) {
+ slot_id = 4;
+ } else {
+ goto err_exit;
+ }
+
+ for (i = 2; i < argc; i++) {
+ tbuf[tlen++] = (uint8_t)strtoul(argv[i], NULL, 0);
+ }
+
+#if 1
+ ret = bic_me_xmit(slot_id, tbuf, tlen, rbuf, &rlen);
+ if (ret) {
+ return ret;
+ }
+#endif
+
+ // memcpy(rbuf, tbuf, tlen);
+ //rlen = tlen;
+
+
+ memset(log, 0, 128);
+ for (i = 0; i < rlen; i++) {
+ printf("%02X ", rbuf[i]);
+ memset(temp, 0, 8);
+ sprintf(temp, "%02X ", rbuf[i]);
+ strcat(log, temp);
+ }
+ printf("\n");
+ sprintf(temp, "\n");
+ strcat(log, temp);
+
+ errno = 0;
+
+ logfd = open(LOGFILE, O_CREAT | O_WRONLY);
+ if (logfd < 0) {
+ syslog(LOG_WARNING, "Opening a tmp file failed. errno: %d", errno);
+ return -1;
+ }
+
+ len = write(logfd, log, strlen(log));
+ if (len != strlen(log)) {
+ syslog(LOG_WARNING, "Error writing the log to the file");
+ return -1;
+ }
+
+ close(logfd);
+
+ return 0;
+err_exit:
+ print_usage_help();
+ return -1;
+}
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/me-util/me-util_0.1.bb b/meta-facebook/meta-yosemite/recipes-yosemite/me-util/me-util_0.1.bb
new file mode 100644
index 0000000..02219f2
--- /dev/null
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/me-util/me-util_0.1.bb
@@ -0,0 +1,38 @@
+# Copyright 2015-present Facebook. All Rights Reserved.
+SUMMARY = "Management Engine Utility"
+DESCRIPTION = "Util for communicating to Intel ME"
+SECTION = "base"
+PR = "r1"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://me-util.c;beginline=4;endline=16;md5=b395943ba8a0717a83e62ca123a8d238"
+
+SRC_URI = "file://me-util.c \
+ file://Makefile \
+ "
+
+S = "${WORKDIR}"
+
+binfiles = "me-util \
+ "
+
+pkgdir = "me-util"
+
+DEPENDS = " libbic libpal "
+
+do_install() {
+ dst="${D}/usr/local/fbpackages/${pkgdir}"
+ bin="${D}/usr/local/bin"
+ install -d $dst
+ install -d $bin
+ for f in ${binfiles}; do
+ install -m 755 $f ${dst}/$f
+ ln -snf ../fbpackages/${pkgdir}/$f ${bin}/$f
+ done
+}
+
+FBPACKAGEDIR = "${prefix}/local/fbpackages"
+
+FILES_${PN} = "${FBPACKAGEDIR}/me-util ${prefix}/local/bin"
+
+INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
+INHIBIT_PACKAGE_STRIP = "1"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/rest-api/rest-api_0.2.bbappend b/meta-facebook/meta-yosemite/recipes-yosemite/rest-api/rest-api_0.2.bbappend
index ce33bba..701a8d1 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/rest-api/rest-api_0.2.bbappend
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/rest-api/rest-api_0.2.bbappend
@@ -54,7 +54,7 @@ do_install() {
install -d ${D}${sysconfdir}/init.d
install -d ${D}${sysconfdir}/rcS.d
install -m 755 setup-rest-api.sh ${D}${sysconfdir}/init.d/setup-rest-api.sh
- update-rc.d -r ${D} setup-rest-api.sh start 95 2 3 4 5 .
+ update-rc.d -r ${D} setup-rest-api.sh start 95 5 .
}
FBPACKAGEDIR = "${prefix}/local/fbpackages"
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/sensor-mon/files/setup-sensord.sh b/meta-facebook/meta-yosemite/recipes-yosemite/sensor-mon/files/setup-sensord.sh
index 3f4b38e..f387d20 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/sensor-mon/files/setup-sensord.sh
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/sensor-mon/files/setup-sensord.sh
@@ -29,7 +29,27 @@
. /usr/local/fbpackages/utils/ast-functions
-# TODO: check for the if slot/server is present before starting the daemon
echo -n "Setup sensor monitoring for yosemite... "
-/usr/local/bin/sensord 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
+
+SLOTS="$SLOTS spb nic"
+/usr/local/bin/sensord $SLOTS
+
echo "done."
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/sensor-mon/sensor-mon_0.1.bbappend b/meta-facebook/meta-yosemite/recipes-yosemite/sensor-mon/sensor-mon_0.1.bbappend
index 687a599..b920973 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/sensor-mon/sensor-mon_0.1.bbappend
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/sensor-mon/sensor-mon_0.1.bbappend
@@ -22,11 +22,8 @@ SRC_URI += "file://setup-sensord.sh \
S = "${WORKDIR}"
-CFLAGS_prepend = " -DCONFIG_YOSEMITE "
-LDFLAGS_append = " -lyosemite_sensor "
-
-DEPENDS_append = "libyosemite-sensor update-rc.d-native"
+DEPENDS_append = "update-rc.d-native"
pkgdir = "sensor-mon"
@@ -45,7 +42,7 @@ do_install() {
install -d ${D}${sysconfdir}/init.d
install -d ${D}${sysconfdir}/rcS.d
install -m 755 setup-sensord.sh ${D}${sysconfdir}/init.d/setup-sensord.sh
- update-rc.d -r ${D} setup-sensord.sh start 91 S .
+ update-rc.d -r ${D} setup-sensord.sh start 91 5 .
}
FBPACKAGEDIR = "${prefix}/local/fbpackages"
OpenPOWER on IntegriCloud