Merge pull request #555 from akenliu/wedge100bf_32x_change_psu_sysfs

we change the method to get PSU's EEPROM data.
This commit is contained in:
Jeffrey Townsend
2019-05-01 09:33:23 -07:00
committed by GitHub
6 changed files with 218 additions and 28 deletions

View File

@@ -33,7 +33,7 @@
#define TTY_PROMPT "@bmc:"
#define TTY_I2C_TIMEOUT 55000
#define TTY_BMC_LOGIN_TIMEOUT 1000000
#define TTY_RETRY 3
#define TTY_RETRY 10
#define MAXIMUM_TTY_BUFFER_LENGTH 1024
#define MAXIMUM_TTY_STRING_LENGTH (MAXIMUM_TTY_BUFFER_LENGTH - 1)
@@ -97,7 +97,7 @@ static int tty_login(void)
for (i = 1; i <= TTY_RETRY; i++) {
snprintf(tty_buf, MAXIMUM_TTY_BUFFER_LENGTH, "\r\r");
if (!tty_exec_buf(0, TTY_PROMPT)) {
if (!tty_exec_buf(TTY_BMC_LOGIN_TIMEOUT, TTY_PROMPT)) {
return 0;
}
@@ -174,6 +174,46 @@ int bmc_send_command(char *cmd)
return -1;
}
int bmc_file_read_str(char *file, char *result, int slen)
{
char *curr = NULL;
char cmd[88] = {0};
char *delimit="^@\r\n";
int flag = 0, ret = 0;
ret = snprintf(cmd, sizeof(cmd), "cat %s\r\n", file);
if( ret >= sizeof(cmd) ){
AIM_LOG_ERROR("cmd size overwrite (%d,%d)\r\n", ret, sizeof(cmd));
return ONLP_STATUS_E_INTERNAL;
}
bmc_send_command(cmd);
strtok(tty_buf, delimit);
flag = 0;
while( (curr = strtok(NULL, delimit)) != NULL ){
switch (*curr) {
case '\n':
case '\r':
case '@':
case '^':
break;
default:
flag = 1;
break;
}
if( flag ){
break;
}
}
ret = snprintf(result, slen-1, "%s", curr);
if( ret >= (slen-1) ){
AIM_LOG_ERROR("result size overwrite (%d,%d)\r\n", ret, slen-1);
return ONLP_STATUS_E_INTERNAL;
}
return 0;
}
int chk_numeric_char(char *data, int base)
{
int len, i, orig = 0;
@@ -290,6 +330,14 @@ bmc_i2c_writeb(uint8_t bus, uint8_t devaddr, uint8_t addr, uint8_t value)
return bmc_send_command(cmd);
}
int
bmc_i2c_write_quick_mode(uint8_t bus, uint8_t devaddr, uint8_t value)
{
char cmd[64] = {0};
snprintf(cmd, sizeof(cmd), "i2cset -f -y %d 0x%x 0x%x\r\n", bus, devaddr, value);
return bmc_send_command(cmd);
}
int
bmc_i2c_readw(uint8_t bus, uint8_t devaddr, uint8_t addr)
{

View File

@@ -58,9 +58,11 @@ enum onlp_thermal_id
};
int bmc_send_command(char *cmd);
int bmc_file_read_str(char *file, char *result, int slen);
int bmc_file_read_int(int* value, char *file, int base);
int bmc_i2c_readb(uint8_t bus, uint8_t devaddr, uint8_t addr);
int bmc_i2c_writeb(uint8_t bus, uint8_t devaddr, uint8_t addr, uint8_t value);
int bmc_i2c_write_quick_mode(uint8_t bus, uint8_t devaddr, uint8_t value);
int bmc_i2c_readw(uint8_t bus, uint8_t devaddr, uint8_t addr);
int bmc_i2c_readraw(uint8_t bus, uint8_t devaddr, uint8_t addr, char* data, int data_size);

View File

@@ -39,6 +39,16 @@
#define PSU1_ID 1
#define PSU2_ID 2
#define SYS_CPLD_PATH_FMT "/sys/bus/i2c/drivers/syscpld/12-0031/%s"
#define PSU_PRESENT_FMT "psu%d_present"
#define PSU_PWROK_FMT "psu%d_output_pwr_sts"
#define PSU_PFE1100_PATH_FMT "/sys/bus/i2c/devices/7-%s/%s\r\n"
#define PSU_PFE1100_MODEL "mfr_model_label"
#define PSU_PFE1100_SERIAL "mfr_serial_label"
static const char *psu_pfedrv_i2c_devaddr[] = {"0059", "005a"};
/*
* Get all information about the given PSU oid.
*/
@@ -83,10 +93,10 @@ pmbus_parse_literal_format(uint16_t value)
int
onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
{
int pid, value, addr;
int pid, value, addr, ret = 0;
char file[32] = {0};
char path[80] = {0};
uint8_t mask = 0;
VALIDATE(id);
pid = ONLP_OID_ID_GET(id);
@@ -94,13 +104,22 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
/* Get the present status
*/
mask = 1 << ((pid-1) * 4);
value = onlp_i2c_readb(1, 0x32, 0x10, ONLP_I2C_F_FORCE);
if (value < 0) {
ret = snprintf(file, sizeof(file), PSU_PRESENT_FMT, pid);
if( ret >= sizeof(file) ){
AIM_LOG_ERROR("file size overwrite (%d,%d)\r\n", ret, sizeof(file));
return ONLP_STATUS_E_INTERNAL;
}
ret = snprintf(path, sizeof(path), SYS_CPLD_PATH_FMT, file);
if( ret >= sizeof(path) ){
AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path));
return ONLP_STATUS_E_INTERNAL;
}
if (bmc_file_read_int(&value, path, 16) < 0) {
AIM_LOG_ERROR("Unable to read status from file (%s)\r\n", path);
return ONLP_STATUS_E_INTERNAL;
}
if (value & mask) {
if (value) {
info->status &= ~ONLP_PSU_STATUS_PRESENT;
return ONLP_STATUS_OK;
}
@@ -109,8 +128,22 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
/* Get power good status
*/
mask = 1 << ((pid-1) * 4 + 1);
if (!(value & mask)) {
ret = snprintf(file, sizeof(file), PSU_PWROK_FMT, pid);
if( ret >= sizeof(file) ){
AIM_LOG_ERROR("file size overwrite (%d,%d)\r\n", ret, sizeof(file));
return ONLP_STATUS_E_INTERNAL;
}
ret = snprintf(path, sizeof(path), SYS_CPLD_PATH_FMT, file);
if( ret >= sizeof(path) ){
AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path));
return ONLP_STATUS_E_INTERNAL;
}
if (bmc_file_read_int(&value, path, 16) < 0) {
AIM_LOG_ERROR("Unable to read status from file (%s)\r\n", path);
return ONLP_STATUS_E_INTERNAL;
}
if (!value) {
info->status |= ONLP_PSU_STATUS_FAILED;
return ONLP_STATUS_OK;
}
@@ -119,7 +152,8 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
/* Get input output power status
*/
value = (pid == PSU1_ID) ? 0x2 : 0x1; /* mux channel for psu */
if (bmc_i2c_writeb(7, 0x70, 0, value) < 0) {
if (bmc_i2c_write_quick_mode(7, 0x70, value) < 0) {
AIM_LOG_ERROR("Unable to set i2c device (7/0x70)\r\n");
return ONLP_STATUS_E_INTERNAL;
}
usleep(1200);
@@ -166,10 +200,21 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
}
/* Get model name */
bmc_i2c_readraw(7, addr, 0x9a, info->model, sizeof(info->model));
ret = snprintf(path, sizeof(path), PSU_PFE1100_PATH_FMT, psu_pfedrv_i2c_devaddr[pid-1], PSU_PFE1100_MODEL);
if( ret >= sizeof(path) ){
AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path));
return ONLP_STATUS_E_INTERNAL;
}
bmc_file_read_str(path, info->model, sizeof(info->model));
/* Get serial number */
return bmc_i2c_readraw(7, addr, 0x9e, info->serial, sizeof(info->serial));
ret = snprintf(path, sizeof(path), PSU_PFE1100_PATH_FMT, psu_pfedrv_i2c_devaddr[pid-1], PSU_PFE1100_SERIAL);
if( ret >= sizeof(path) ){
AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path));
return ONLP_STATUS_E_INTERNAL;
}
bmc_file_read_str(path, info->serial, sizeof(info->serial));
return ONLP_STATUS_OK;
}
int

View File

@@ -33,7 +33,7 @@
#define TTY_PROMPT "@bmc:"
#define TTY_I2C_TIMEOUT 55000
#define TTY_BMC_LOGIN_TIMEOUT 1000000
#define TTY_RETRY 3
#define TTY_RETRY 10
#define MAXIMUM_TTY_BUFFER_LENGTH 1024
#define MAXIMUM_TTY_STRING_LENGTH (MAXIMUM_TTY_BUFFER_LENGTH - 1)
@@ -97,7 +97,7 @@ static int tty_login(void)
for (i = 1; i <= TTY_RETRY; i++) {
snprintf(tty_buf, MAXIMUM_TTY_BUFFER_LENGTH, "\r\r");
if (!tty_exec_buf(0, TTY_PROMPT)) {
if (!tty_exec_buf(TTY_BMC_LOGIN_TIMEOUT, TTY_PROMPT)) {
return 0;
}
@@ -174,6 +174,46 @@ int bmc_send_command(char *cmd)
return -1;
}
int bmc_file_read_str(char *file, char *result, int slen)
{
char *curr = NULL;
char cmd[88] = {0};
char *delimit="^@\r\n";
int flag = 0, ret = 0;
ret = snprintf(cmd, sizeof(cmd), "cat %s\r\n", file);
if( ret >= sizeof(cmd) ){
AIM_LOG_ERROR("cmd size overwrite (%d,%d)\r\n", ret, sizeof(cmd));
return ONLP_STATUS_E_INTERNAL;
}
bmc_send_command(cmd);
strtok(tty_buf, delimit);
flag = 0;
while( (curr = strtok(NULL, delimit)) != NULL ){
switch (*curr) {
case '\n':
case '\r':
case '@':
case '^':
break;
default:
flag = 1;
break;
}
if( flag ){
break;
}
}
ret = snprintf(result, slen-1, "%s", curr);
if( ret >= (slen-1) ){
AIM_LOG_ERROR("result size overwrite (%d,%d)\r\n", ret, slen-1);
return ONLP_STATUS_E_INTERNAL;
}
return 0;
}
int chk_numeric_char(char *data, int base)
{
int len, i, orig = 0;
@@ -290,6 +330,14 @@ bmc_i2c_writeb(uint8_t bus, uint8_t devaddr, uint8_t addr, uint8_t value)
return bmc_send_command(cmd);
}
int
bmc_i2c_write_quick_mode(uint8_t bus, uint8_t devaddr, uint8_t value)
{
char cmd[64] = {0};
snprintf(cmd, sizeof(cmd), "i2cset -f -y %d 0x%x 0x%x\r\n", bus, devaddr, value);
return bmc_send_command(cmd);
}
int
bmc_i2c_readw(uint8_t bus, uint8_t devaddr, uint8_t addr)
{

View File

@@ -58,9 +58,11 @@ enum onlp_thermal_id
};
int bmc_send_command(char *cmd);
int bmc_file_read_str(char *file, char *result, int slen);
int bmc_file_read_int(int* value, char *file, int base);
int bmc_i2c_readb(uint8_t bus, uint8_t devaddr, uint8_t addr);
int bmc_i2c_writeb(uint8_t bus, uint8_t devaddr, uint8_t addr, uint8_t value);
int bmc_i2c_write_quick_mode(uint8_t bus, uint8_t devaddr, uint8_t value);
int bmc_i2c_readw(uint8_t bus, uint8_t devaddr, uint8_t addr);
int bmc_i2c_readraw(uint8_t bus, uint8_t devaddr, uint8_t addr, char* data, int data_size);

View File

@@ -39,6 +39,16 @@
#define PSU1_ID 1
#define PSU2_ID 2
#define SYS_CPLD_PATH_FMT "/sys/bus/i2c/drivers/syscpld/12-0031/%s"
#define PSU_PRESENT_FMT "psu%d_present"
#define PSU_PWROK_FMT "psu%d_output_pwr_sts"
#define PSU_PFE1100_PATH_FMT "/sys/bus/i2c/devices/7-%s/%s\r\n"
#define PSU_PFE1100_MODEL "mfr_model_label"
#define PSU_PFE1100_SERIAL "mfr_serial_label"
static const char *psu_pfedrv_i2c_devaddr[] = {"0059", "005a"};
/*
* Get all information about the given PSU oid.
*/
@@ -83,10 +93,10 @@ pmbus_parse_literal_format(uint16_t value)
int
onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
{
int pid, value, addr;
int pid, value, addr, ret = 0;
char file[32] = {0};
char path[80] = {0};
uint8_t mask = 0;
VALIDATE(id);
pid = ONLP_OID_ID_GET(id);
@@ -94,13 +104,22 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
/* Get the present status
*/
mask = 1 << ((pid-1) * 4);
value = onlp_i2c_readb(1, 0x32, 0x10, ONLP_I2C_F_FORCE);
if (value < 0) {
ret = snprintf(file, sizeof(file), PSU_PRESENT_FMT, pid);
if( ret >= sizeof(file) ){
AIM_LOG_ERROR("file size overwrite (%d,%d)\r\n", ret, sizeof(file));
return ONLP_STATUS_E_INTERNAL;
}
ret = snprintf(path, sizeof(path), SYS_CPLD_PATH_FMT, file);
if( ret >= sizeof(path) ){
AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path));
return ONLP_STATUS_E_INTERNAL;
}
if (bmc_file_read_int(&value, path, 16) < 0) {
AIM_LOG_ERROR("Unable to read status from file (%s)\r\n", path);
return ONLP_STATUS_E_INTERNAL;
}
if (value & mask) {
if (value) {
info->status &= ~ONLP_PSU_STATUS_PRESENT;
return ONLP_STATUS_OK;
}
@@ -109,8 +128,22 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
/* Get power good status
*/
mask = 1 << ((pid-1) * 4 + 1);
if (!(value & mask)) {
ret = snprintf(file, sizeof(file), PSU_PWROK_FMT, pid);
if( ret >= sizeof(file) ){
AIM_LOG_ERROR("file size overwrite (%d,%d)\r\n", ret, sizeof(file));
return ONLP_STATUS_E_INTERNAL;
}
ret = snprintf(path, sizeof(path), SYS_CPLD_PATH_FMT, file);
if( ret >= sizeof(path) ){
AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path));
return ONLP_STATUS_E_INTERNAL;
}
if (bmc_file_read_int(&value, path, 16) < 0) {
AIM_LOG_ERROR("Unable to read status from file (%s)\r\n", path);
return ONLP_STATUS_E_INTERNAL;
}
if (!value) {
info->status |= ONLP_PSU_STATUS_FAILED;
return ONLP_STATUS_OK;
}
@@ -119,7 +152,8 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
/* Get input output power status
*/
value = (pid == PSU1_ID) ? 0x2 : 0x1; /* mux channel for psu */
if (bmc_i2c_writeb(7, 0x70, 0, value) < 0) {
if (bmc_i2c_write_quick_mode(7, 0x70, value) < 0) {
AIM_LOG_ERROR("Unable to set i2c device (7/0x70)\r\n");
return ONLP_STATUS_E_INTERNAL;
}
usleep(1200);
@@ -166,10 +200,21 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
}
/* Get model name */
bmc_i2c_readraw(7, addr, 0x9a, info->model, sizeof(info->model));
ret = snprintf(path, sizeof(path), PSU_PFE1100_PATH_FMT, psu_pfedrv_i2c_devaddr[pid-1], PSU_PFE1100_MODEL);
if( ret >= sizeof(path) ){
AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path));
return ONLP_STATUS_E_INTERNAL;
}
bmc_file_read_str(path, info->model, sizeof(info->model));
/* Get serial number */
return bmc_i2c_readraw(7, addr, 0x9e, info->serial, sizeof(info->serial));
ret = snprintf(path, sizeof(path), PSU_PFE1100_PATH_FMT, psu_pfedrv_i2c_devaddr[pid-1], PSU_PFE1100_SERIAL);
if( ret >= sizeof(path) ){
AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path));
return ONLP_STATUS_E_INTERNAL;
}
bmc_file_read_str(path, info->serial, sizeof(info->serial));
return ONLP_STATUS_OK;
}
int