mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-12-26 17:57:01 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -36,7 +36,12 @@
|
||||
|
||||
/* Addresses scanned
|
||||
*/
|
||||
static const unsigned short normal_i2c[] = { 0x58, 0x5b, I2C_CLIENT_END };
|
||||
static const unsigned short normal_i2c[] = { I2C_CLIENT_END };
|
||||
|
||||
enum chips {
|
||||
YM2651,
|
||||
YM2401,
|
||||
};
|
||||
|
||||
/* Each client has this additional data
|
||||
*/
|
||||
@@ -45,6 +50,7 @@ struct ym2651y_data {
|
||||
struct mutex update_lock;
|
||||
char valid; /* !=0 if registers are valid */
|
||||
unsigned long last_updated; /* In jiffies */
|
||||
u8 chip; /* chip id */
|
||||
u8 capability; /* Register value */
|
||||
u16 status_word; /* Register value */
|
||||
u8 fan_fault; /* Register value */
|
||||
@@ -52,13 +58,14 @@ struct ym2651y_data {
|
||||
u16 v_out; /* Register value */
|
||||
u16 i_out; /* Register value */
|
||||
u16 p_out; /* Register value */
|
||||
u8 vout_mode; /* Register value */
|
||||
u16 temp; /* Register value */
|
||||
u16 fan_speed; /* Register value */
|
||||
u16 fan_duty_cycle[2]; /* Register value */
|
||||
u8 fan_dir[5]; /* Register value */
|
||||
u8 pmbus_revision; /* Register value */
|
||||
u8 mfr_id[10]; /* Register value */
|
||||
u8 mfr_model[10]; /* Register value */
|
||||
u8 mfr_model[16]; /* Register value */
|
||||
u8 mfr_revsion[3]; /* Register value */
|
||||
u16 mfr_vin_min; /* Register value */
|
||||
u16 mfr_vin_max; /* Register value */
|
||||
@@ -76,6 +83,7 @@ static ssize_t show_word(struct device *dev, struct device_attribute *da,
|
||||
char *buf);
|
||||
static ssize_t show_linear(struct device *dev, struct device_attribute *da,
|
||||
char *buf);
|
||||
static ssize_t show_vout(struct device *dev, struct device_attribute *da, char *buf);
|
||||
static ssize_t show_fan_fault(struct device *dev, struct device_attribute *da,
|
||||
char *buf);
|
||||
static ssize_t show_over_temp(struct device *dev, struct device_attribute *da,
|
||||
@@ -121,7 +129,7 @@ static SENSOR_DEVICE_ATTR(psu_temp_fault, S_IRUGO, show_word, NULL, PSU_TEMP
|
||||
static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_word, NULL, PSU_POWER_GOOD);
|
||||
static SENSOR_DEVICE_ATTR(psu_fan1_fault, S_IRUGO, show_fan_fault, NULL, PSU_FAN1_FAULT);
|
||||
static SENSOR_DEVICE_ATTR(psu_over_temp, S_IRUGO, show_over_temp, NULL, PSU_OVER_TEMP);
|
||||
static SENSOR_DEVICE_ATTR(psu_v_out, S_IRUGO, show_linear, NULL, PSU_V_OUT);
|
||||
static SENSOR_DEVICE_ATTR(psu_v_out, S_IRUGO, show_vout, NULL, PSU_V_OUT);
|
||||
static SENSOR_DEVICE_ATTR(psu_i_out, S_IRUGO, show_linear, NULL, PSU_I_OUT);
|
||||
static SENSOR_DEVICE_ATTR(psu_p_out, S_IRUGO, show_linear, NULL, PSU_P_OUT);
|
||||
static SENSOR_DEVICE_ATTR(psu_temp1_input, S_IRUGO, show_linear, NULL, PSU_TEMP1_INPUT);
|
||||
@@ -369,6 +377,37 @@ static ssize_t show_ascii(struct device *dev, struct device_attribute *da,
|
||||
return sprintf(buf, "%s\n", ptr);
|
||||
}
|
||||
|
||||
static ssize_t show_vout_by_mode(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct ym2651y_data *data = ym2651y_update_device(dev);
|
||||
int exponent, mantissa;
|
||||
int multiplier = 1000;
|
||||
|
||||
if (!data->valid) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
exponent = two_complement_to_int(data->vout_mode, 5, 0x1f);
|
||||
mantissa = data->v_out;
|
||||
|
||||
return (exponent > 0) ? sprintf(buf, "%d\n", (mantissa << exponent) * multiplier) :
|
||||
sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent));
|
||||
}
|
||||
|
||||
static ssize_t show_vout(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct ym2651y_data *data = i2c_get_clientdata(client);
|
||||
|
||||
if (data->chip == YM2401) {
|
||||
return show_vout_by_mode(dev, da, buf);
|
||||
}
|
||||
|
||||
return show_linear(dev, da, buf);
|
||||
}
|
||||
|
||||
static const struct attribute_group ym2651y_group = {
|
||||
.attrs = ym2651y_attributes,
|
||||
};
|
||||
@@ -395,7 +434,7 @@ static int ym2651y_probe(struct i2c_client *client,
|
||||
|
||||
i2c_set_clientdata(client, data);
|
||||
mutex_init(&data->update_lock);
|
||||
|
||||
data->chip = dev_id->driver_data;
|
||||
dev_info(&client->dev, "chip found\n");
|
||||
|
||||
/* Register sysfs hooks */
|
||||
@@ -436,7 +475,8 @@ static int ym2651y_remove(struct i2c_client *client)
|
||||
}
|
||||
|
||||
static const struct i2c_device_id ym2651y_id[] = {
|
||||
{ "ym2651", 0 },
|
||||
{ "ym2651", YM2651 },
|
||||
{ "ym2401", YM2401 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, ym2651y_id);
|
||||
@@ -504,9 +544,10 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev)
|
||||
|
||||
if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
|
||||
|| !data->valid) {
|
||||
int i, status;
|
||||
u8 command;
|
||||
int i, status, length;
|
||||
u8 command, buf;
|
||||
struct reg_data_byte regs_byte[] = { {0x19, &data->capability},
|
||||
{0x20, &data->vout_mode},
|
||||
{0x7d, &data->over_temp},
|
||||
{0x81, &data->fan_fault},
|
||||
{0x98, &data->pmbus_revision}};
|
||||
@@ -582,9 +623,17 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev)
|
||||
|
||||
/* Read mfr_model */
|
||||
command = 0x9a;
|
||||
status = ym2651y_read_block(client, command, data->mfr_model,
|
||||
ARRAY_SIZE(data->mfr_model)-1);
|
||||
data->mfr_model[ARRAY_SIZE(data->mfr_model)-1] = '\0';
|
||||
length = 1;
|
||||
|
||||
/* Read first byte to determine the length of data */
|
||||
status = ym2651y_read_block(client, command, &buf, length);
|
||||
if (status < 0) {
|
||||
dev_dbg(&client->dev, "reg %d, err %d\n", command, status);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
status = ym2651y_read_block(client, command, data->mfr_model, buf+1);
|
||||
data->mfr_model[buf+1] = '\0';
|
||||
|
||||
if (status < 0) {
|
||||
dev_dbg(&client->dev, "reg %d, err %d\n", command, status);
|
||||
|
||||
@@ -32,15 +32,23 @@
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
|
||||
#define PSU_STATUS_I2C_ADDR 0x60
|
||||
#define PSU_STATUS_I2C_REG_OFFSET 0x2
|
||||
|
||||
#define IS_POWER_GOOD(id, value) (!!(value & BIT(id*4 + 1)))
|
||||
#define IS_PRESENT(id, value) (!(value & BIT(id*4)))
|
||||
|
||||
static ssize_t show_index(struct device *dev, struct device_attribute *da, char *buf);
|
||||
static ssize_t show_status(struct device *dev, struct device_attribute *da, char *buf);
|
||||
static ssize_t show_model_name(struct device *dev, struct device_attribute *da, char *buf);
|
||||
static int as5812_54t_psu_read_block(struct i2c_client *client, u8 command, u8 *data,int data_len);
|
||||
extern int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg);
|
||||
static int as5812_54t_psu_model_name_get(struct device *dev);
|
||||
|
||||
/* Addresses scanned
|
||||
*/
|
||||
static const unsigned short normal_i2c[] = { 0x38, 0x3b, 0x50, 0x53, I2C_CLIENT_END };
|
||||
static const unsigned short normal_i2c[] = { I2C_CLIENT_END };
|
||||
|
||||
/* Each client has this additional data
|
||||
*/
|
||||
@@ -94,11 +102,15 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da,
|
||||
struct as5812_54t_psu_data *data = as5812_54t_psu_update_device(dev);
|
||||
u8 status = 0;
|
||||
|
||||
if (!data->valid) {
|
||||
return sprintf(buf, "0\n");
|
||||
}
|
||||
|
||||
if (attr->index == PSU_PRESENT) {
|
||||
status = !(data->status >> ((data->index - 1) * 4) & 0x1);
|
||||
status = IS_PRESENT(data->index, data->status);
|
||||
}
|
||||
else { /* PSU_POWER_GOOD */
|
||||
status = data->status >> ((data->index - 1) * 4 + 1) & 0x1;
|
||||
status = IS_POWER_GOOD(data->index, data->status);
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", status);
|
||||
@@ -108,8 +120,20 @@ static ssize_t show_model_name(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct as5812_54t_psu_data *data = as5812_54t_psu_update_device(dev);
|
||||
|
||||
return sprintf(buf, "%s", data->model_name);
|
||||
|
||||
if (!data->valid) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!IS_PRESENT(data->index, data->status)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (as5812_54t_psu_model_name_get(dev) < 0) {
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%s\n", data->model_name);
|
||||
}
|
||||
|
||||
static const struct attribute_group as5812_54t_psu_group = {
|
||||
@@ -135,6 +159,7 @@ static int as5812_54t_psu_probe(struct i2c_client *client,
|
||||
|
||||
i2c_set_clientdata(client, data);
|
||||
data->valid = 0;
|
||||
data->index = dev_id->driver_data;
|
||||
mutex_init(&data->update_lock);
|
||||
|
||||
dev_info(&client->dev, "chip found\n");
|
||||
@@ -151,14 +176,6 @@ static int as5812_54t_psu_probe(struct i2c_client *client,
|
||||
goto exit_remove;
|
||||
}
|
||||
|
||||
/* Update PSU index */
|
||||
if (client->addr == 0x38 || client->addr == 0x50) {
|
||||
data->index = 1;
|
||||
}
|
||||
else if (client->addr == 0x3b || client->addr == 0x53) {
|
||||
data->index = 2;
|
||||
}
|
||||
|
||||
dev_info(&client->dev, "%s: psu '%s'\n",
|
||||
dev_name(data->hwmon_dev), client->name);
|
||||
|
||||
@@ -184,8 +201,15 @@ static int as5812_54t_psu_remove(struct i2c_client *client)
|
||||
return 0;
|
||||
}
|
||||
|
||||
enum psu_index
|
||||
{
|
||||
as5812_54t_psu1,
|
||||
as5812_54t_psu2
|
||||
};
|
||||
|
||||
static const struct i2c_device_id as5812_54t_psu_id[] = {
|
||||
{ "as5812_54t_psu", 0 },
|
||||
{ "as5812_54t_psu1", as5812_54t_psu1 },
|
||||
{ "as5812_54t_psu2", as5812_54t_psu2 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, as5812_54t_psu_id);
|
||||
@@ -219,6 +243,76 @@ abort:
|
||||
return result;
|
||||
}
|
||||
|
||||
enum psu_type {
|
||||
PSU_YM_2401_JCR, /* AC110V - F2B */
|
||||
PSU_YM_2401_JDR, /* AC110V - B2F */
|
||||
PSU_CPR_4011_4M11, /* AC110V - F2B */
|
||||
PSU_CPR_4011_4M21, /* AC110V - B2F */
|
||||
PSU_CPR_6011_2M11, /* AC110V - F2B */
|
||||
PSU_CPR_6011_2M21, /* AC110V - B2F */
|
||||
PSU_UM400D_01G, /* DC48V - F2B */
|
||||
PSU_UM400D01_01G /* DC48V - B2F */
|
||||
};
|
||||
|
||||
struct model_name_info {
|
||||
enum psu_type type;
|
||||
u8 offset;
|
||||
u8 length;
|
||||
char* model_name;
|
||||
};
|
||||
|
||||
struct model_name_info models[] = {
|
||||
{PSU_YM_2401_JCR, 0x20, 11, "YM-2401JCR"},
|
||||
{PSU_YM_2401_JDR, 0x20, 11, "YM-2401JDR"},
|
||||
{PSU_CPR_4011_4M11, 0x26, 13, "CPR-4011-4M11"},
|
||||
{PSU_CPR_4011_4M21, 0x26, 13, "CPR-4011-4M21"},
|
||||
{PSU_CPR_6011_2M11, 0x26, 13, "CPR-6011-2M11"},
|
||||
{PSU_CPR_6011_2M21, 0x26, 13, "CPR-6011-2M21"},
|
||||
{PSU_UM400D_01G, 0x50, 9, "um400d01G"},
|
||||
{PSU_UM400D01_01G, 0x50, 12, "um400d01-01G"},
|
||||
};
|
||||
|
||||
static int as5812_54t_psu_model_name_get(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct as5812_54t_psu_data *data = i2c_get_clientdata(client);
|
||||
int i, status;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(models); i++) {
|
||||
memset(data->model_name, 0, sizeof(data->model_name));
|
||||
|
||||
status = as5812_54t_psu_read_block(client, models[i].offset,
|
||||
data->model_name, models[i].length);
|
||||
if (status < 0) {
|
||||
data->model_name[0] = '\0';
|
||||
dev_dbg(&client->dev, "unable to read model name from (0x%x) offset(0x%x)\n",
|
||||
client->addr, models[i].offset);
|
||||
return status;
|
||||
}
|
||||
else {
|
||||
data->model_name[models[i].length] = '\0';
|
||||
}
|
||||
|
||||
if (i == PSU_YM_2401_JCR || i == PSU_YM_2401_JDR) {
|
||||
/* Skip the meaningless data byte 8*/
|
||||
data->model_name[8] = data->model_name[9];
|
||||
data->model_name[9] = data->model_name[10];
|
||||
data->model_name[10] = '\0';
|
||||
}
|
||||
|
||||
/* Determine if the model name is known, if not, read next index
|
||||
*/
|
||||
if (strncmp(data->model_name, models[i].model_name, models[i].length) == 0) {
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
data->model_name[0] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
static struct as5812_54t_psu_data *as5812_54t_psu_update_device(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
@@ -231,41 +325,24 @@ static struct as5812_54t_psu_data *as5812_54t_psu_update_device(struct device *d
|
||||
int status = -1;
|
||||
|
||||
dev_dbg(&client->dev, "Starting as5812_54t update\n");
|
||||
|
||||
/* Read model name */
|
||||
if (client->addr == 0x38 || client->addr == 0x3b) {
|
||||
/* AC power */
|
||||
status = as5812_54t_psu_read_block(client, 0x26, data->model_name,
|
||||
ARRAY_SIZE(data->model_name)-1);
|
||||
}
|
||||
else {
|
||||
/* DC power */
|
||||
status = as5812_54t_psu_read_block(client, 0x50, data->model_name,
|
||||
ARRAY_SIZE(data->model_name)-1);
|
||||
}
|
||||
|
||||
if (status < 0) {
|
||||
data->model_name[0] = '\0';
|
||||
dev_dbg(&client->dev, "unable to read model name from (0x%x)\n", client->addr);
|
||||
}
|
||||
else {
|
||||
data->model_name[ARRAY_SIZE(data->model_name)-1] = '\0';
|
||||
}
|
||||
data->valid = 0;
|
||||
|
||||
/* Read psu status */
|
||||
status = accton_i2c_cpld_read(0x60, 0x2);
|
||||
|
||||
status = accton_i2c_cpld_read(PSU_STATUS_I2C_ADDR, PSU_STATUS_I2C_REG_OFFSET);
|
||||
|
||||
if (status < 0) {
|
||||
dev_dbg(&client->dev, "cpld reg 0x60 err %d\n", status);
|
||||
dev_dbg(&client->dev, "cpld reg (0x%x) err %d\n", PSU_STATUS_I2C_ADDR, status);
|
||||
goto exit;
|
||||
}
|
||||
else {
|
||||
data->status = status;
|
||||
}
|
||||
|
||||
|
||||
data->last_updated = jiffies;
|
||||
data->valid = 1;
|
||||
}
|
||||
|
||||
exit:
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
return data;
|
||||
@@ -273,10 +350,10 @@ static struct as5812_54t_psu_data *as5812_54t_psu_update_device(struct device *d
|
||||
|
||||
static int __init as5812_54t_psu_init(void)
|
||||
{
|
||||
extern int platform_accton_as5812_54t(void);
|
||||
if (!platform_accton_as5812_54t()) {
|
||||
return -ENODEV;
|
||||
}
|
||||
extern int platform_accton_as5812_54t(void);
|
||||
if (!platform_accton_as5812_54t()) {
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return i2c_add_driver(&as5812_54t_psu_driver);
|
||||
}
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
*
|
||||
***********************************************************/
|
||||
#include <onlp/platformi/fani.h>
|
||||
#include <onlplib/mmap.h>
|
||||
#include <unistd.h>
|
||||
#include <onlplib/file.h>
|
||||
#include <fcntl.h>
|
||||
#include "platform_lib.h"
|
||||
|
||||
@@ -51,7 +52,7 @@ typedef struct last_path_S
|
||||
char status[LEN_FILE_NAME];
|
||||
char speed[LEN_FILE_NAME];
|
||||
char direction[LEN_FILE_NAME];
|
||||
char ctrl_speed[LEN_FILE_NAME];
|
||||
char ctrl_speed[LEN_FILE_NAME];
|
||||
char r_status[LEN_FILE_NAME];
|
||||
char r_speed[LEN_FILE_NAME];
|
||||
}last_path_T;
|
||||
@@ -74,10 +75,10 @@ static last_path_T last_path[] = /* must map with onlp_fan_id */
|
||||
MAKE_FAN_LAST_PATH_ON_MAIN_BOARD(PROJECT_NAME, FAN_2_ON_MAIN_BOARD),
|
||||
MAKE_FAN_LAST_PATH_ON_MAIN_BOARD(PROJECT_NAME, FAN_3_ON_MAIN_BOARD),
|
||||
MAKE_FAN_LAST_PATH_ON_MAIN_BOARD(PROJECT_NAME, FAN_4_ON_MAIN_BOARD),
|
||||
MAKE_FAN_LAST_PATH_ON_MAIN_BOARD(PROJECT_NAME, FAN_5_ON_MAIN_BOARD),
|
||||
MAKE_FAN_LAST_PATH_ON_MAIN_BOARD(PROJECT_NAME, FAN_5_ON_MAIN_BOARD),
|
||||
|
||||
MAKE_FAN_LAST_PATH_ON_PSU(11-003c),
|
||||
MAKE_FAN_LAST_PATH_ON_PSU(12-003f),
|
||||
MAKE_FAN_LAST_PATH_ON_PSU(11-003c),
|
||||
MAKE_FAN_LAST_PATH_ON_PSU(12-003f),
|
||||
};
|
||||
|
||||
#define MAKE_FAN_INFO_NODE_ON_MAIN_BOARD(id) \
|
||||
@@ -135,11 +136,11 @@ onlp_fan_info_t linfo[] = {
|
||||
|
||||
|
||||
/* PSU relative marco */
|
||||
#define SET_PSU_TYPE_CPR_4011_F2B_FAN(info) \
|
||||
#define SET_PSU_TYPE_AC_F2B_FAN(info) \
|
||||
info->status |= (ONLP_FAN_STATUS_PRESENT | ONLP_FAN_STATUS_F2B); \
|
||||
info->caps |= ONLP_FAN_CAPS_SET_PERCENTAGE | ONLP_FAN_CAPS_GET_RPM | ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
|
||||
#define SET_PSU_TYPE_CPR_4011_B2F_FAN(info) \
|
||||
#define SET_PSU_TYPE_AC_B2F_FAN(info) \
|
||||
info->status |= (ONLP_FAN_STATUS_PRESENT | ONLP_FAN_STATUS_B2F); \
|
||||
info->caps |= ONLP_FAN_CAPS_SET_PERCENTAGE | ONLP_FAN_CAPS_GET_RPM | ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
|
||||
@@ -156,7 +157,7 @@ _onlp_fani_info_get_fan(int local_id, onlp_fan_info_t* info)
|
||||
int fd, len, nbytes = 10;
|
||||
char r_data[10] = {0};
|
||||
char fullpath[65] = {0};
|
||||
|
||||
|
||||
/* get fan/fanr fault status (turn on when any one fails)
|
||||
*/
|
||||
sprintf(fullpath, "%s%s", PREFIX_PATH_ON_MAIN_BOARD, last_path[local_id].status);
|
||||
@@ -199,10 +200,26 @@ _onlp_fani_info_get_fan(int local_id, onlp_fan_info_t* info)
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
static int
|
||||
_onlp_fani_info_get_fan_on_psu_ym2401(int pid, onlp_fan_info_t* info)
|
||||
{
|
||||
int val = 0;
|
||||
|
||||
/* get fan status
|
||||
*/
|
||||
if (psu_ym2401_pmbus_info_get(pid, "psu_fan1_speed_rpm", &val) == ONLP_STATUS_OK) {
|
||||
info->status |= (val > 0) ? 0 : ONLP_FAN_STATUS_FAILED;
|
||||
info->rpm = val;
|
||||
info->percentage = (info->rpm * 100) / 21600;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
static int
|
||||
_onlp_fani_info_get_fan_on_psu(int local_id, onlp_fan_info_t* info)
|
||||
{
|
||||
int psu_id, is_ac=0;
|
||||
int psu_id;
|
||||
int fd, len, nbytes = 10;
|
||||
char r_data[10] = {0};
|
||||
char fullpath[50] = {0};
|
||||
@@ -211,24 +228,19 @@ _onlp_fani_info_get_fan_on_psu(int local_id, onlp_fan_info_t* info)
|
||||
/* get fan other cap status according to psu type
|
||||
*/
|
||||
psu_id = (local_id-FAN_1_ON_PSU1) + 1;
|
||||
|
||||
if (LOCAL_DEBUG)
|
||||
printf("[Debug][%s][%d][psu_id: %d]\n", __FUNCTION__, __LINE__, psu_id);
|
||||
DEBUG_PRINT("[psu_id: %d]", psu_id);
|
||||
|
||||
psu_type = get_psu_type(psu_id, NULL, 0); /* psu_id = 1 , present PSU1. pus_id =2 , present PSU2 */
|
||||
|
||||
if (LOCAL_DEBUG)
|
||||
printf("[Debug][%s][%d][psu_type: %d]\n", __FUNCTION__, __LINE__, psu_type);
|
||||
|
||||
DEBUG_PRINT("[psu_type: %d]", psu_type);
|
||||
|
||||
switch (psu_type) {
|
||||
case PSU_TYPE_AC_F2B:
|
||||
SET_PSU_TYPE_CPR_4011_F2B_FAN(info);
|
||||
is_ac = 1;
|
||||
case PSU_TYPE_AC_COMPUWARE_F2B:
|
||||
case PSU_TYPE_AC_3YPOWER_F2B:
|
||||
SET_PSU_TYPE_AC_F2B_FAN(info);
|
||||
break;
|
||||
case PSU_TYPE_AC_B2F:
|
||||
SET_PSU_TYPE_CPR_4011_B2F_FAN(info);
|
||||
is_ac = 1;
|
||||
case PSU_TYPE_AC_COMPUWARE_B2F:
|
||||
case PSU_TYPE_AC_3YPOWER_B2F:
|
||||
SET_PSU_TYPE_AC_B2F_FAN(info);
|
||||
break;
|
||||
case PSU_TYPE_DC_48V_F2B:
|
||||
SET_PSU_TYPE_UM400D_F2B_FAN(info);
|
||||
@@ -243,7 +255,8 @@ _onlp_fani_info_get_fan_on_psu(int local_id, onlp_fan_info_t* info)
|
||||
break;
|
||||
}
|
||||
|
||||
if (1 == is_ac)
|
||||
if (psu_type == PSU_TYPE_AC_COMPUWARE_F2B ||
|
||||
psu_type == PSU_TYPE_AC_COMPUWARE_B2F )
|
||||
{
|
||||
/* get fan fault status
|
||||
*/
|
||||
@@ -259,10 +272,14 @@ _onlp_fani_info_get_fan_on_psu(int local_id, onlp_fan_info_t* info)
|
||||
info->rpm = atoi(r_data);
|
||||
|
||||
/* get speed percentage from rpm */
|
||||
info->percentage = (info->rpm * 100)/19328;
|
||||
|
||||
info->percentage = (info->rpm * 100)/19328;
|
||||
}
|
||||
|
||||
else if (psu_type == PSU_TYPE_AC_3YPOWER_F2B ||
|
||||
psu_type == PSU_TYPE_AC_3YPOWER_B2F )
|
||||
{
|
||||
return _onlp_fani_info_get_fan_on_psu_ym2401(psu_id, info);
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
@@ -284,17 +301,17 @@ onlp_fani_info_get(onlp_oid_t id, onlp_fan_info_t* info)
|
||||
int local_id;
|
||||
|
||||
VALIDATE(id);
|
||||
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
|
||||
|
||||
*info = linfo[local_id];
|
||||
|
||||
|
||||
if (LOCAL_DEBUG)
|
||||
printf("\n[Debug][%s][%d][local_id: %d]", __FUNCTION__, __LINE__, local_id);
|
||||
|
||||
|
||||
switch (local_id)
|
||||
{
|
||||
case FAN_1_ON_PSU1:
|
||||
case FAN_1_ON_PSU1:
|
||||
case FAN_1_ON_PSU2:
|
||||
rc = _onlp_fani_info_get_fan_on_psu(local_id, info);
|
||||
break;
|
||||
@@ -302,8 +319,8 @@ onlp_fani_info_get(onlp_oid_t id, onlp_fan_info_t* info)
|
||||
default:
|
||||
rc =_onlp_fani_info_get_fan(local_id, info);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -321,7 +338,6 @@ onlp_fani_rpm_set(onlp_oid_t id, int rpm)
|
||||
return ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This function sets the fan speed of the given OID as a percentage.
|
||||
*
|
||||
@@ -335,20 +351,31 @@ onlp_fani_percentage_set(onlp_oid_t id, int p)
|
||||
{
|
||||
int fd, len, nbytes=10, local_id;
|
||||
char data[10] = {0};
|
||||
char fullpath[70] = {0};
|
||||
char fullpath[70] = {0};
|
||||
int psu_id;
|
||||
psu_type_t psu_type;
|
||||
|
||||
VALIDATE(id);
|
||||
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
|
||||
/* reject p=0 (p=0, stop fan) */
|
||||
if (p == 0){
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
|
||||
psu_id = local_id - FAN_1_ON_PSU1 + 1;
|
||||
psu_type = get_psu_type(psu_id, NULL, 0);
|
||||
|
||||
if (psu_type == PSU_TYPE_AC_3YPOWER_F2B ||
|
||||
psu_type == PSU_TYPE_AC_3YPOWER_B2F )
|
||||
{
|
||||
return psu_ym2401_pmbus_info_set(psu_id, "psu_fan1_duty_cycle_percentage", p);
|
||||
}
|
||||
|
||||
/* get fullpath */
|
||||
switch (local_id)
|
||||
{
|
||||
{
|
||||
case FAN_1_ON_PSU1:
|
||||
case FAN_1_ON_PSU2:
|
||||
sprintf(fullpath, "%s%s", PREFIX_PATH_ON_PSU, last_path[local_id].ctrl_speed);
|
||||
@@ -357,12 +384,12 @@ onlp_fani_percentage_set(onlp_oid_t id, int p)
|
||||
sprintf(fullpath, "%s%s", PREFIX_PATH_ON_MAIN_BOARD, last_path[local_id].ctrl_speed);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
sprintf(data, "%d", p);
|
||||
|
||||
if (LOCAL_DEBUG)
|
||||
printf("[Debug][%s][%d][openfile: %s][data=%s]\n", __FUNCTION__, __LINE__, fullpath, data);
|
||||
|
||||
|
||||
/* Create output file descriptor */
|
||||
fd = open(fullpath, O_WRONLY, 0644);
|
||||
if(fd == -1){
|
||||
@@ -373,7 +400,7 @@ onlp_fani_percentage_set(onlp_oid_t id, int p)
|
||||
if(len != nbytes){
|
||||
close(fd);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return ONLP_STATUS_OK;
|
||||
|
||||
@@ -23,12 +23,13 @@
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#include <sys/mman.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <onlp/onlp.h>
|
||||
#include <onlplib/file.h>
|
||||
#include <AIM/aim.h>
|
||||
#include "platform_lib.h"
|
||||
|
||||
@@ -121,6 +122,7 @@ int deviceNodeReadString(char *filename, char *buffer, int buf_size, int data_le
|
||||
}
|
||||
|
||||
#define I2C_PSU_MODEL_NAME_LEN 13
|
||||
#define STRLEN(x) (sizeof(x) - 1)
|
||||
|
||||
psu_type_t get_psu_type(int id, char* modelname, int modelname_len)
|
||||
{
|
||||
@@ -128,50 +130,73 @@ psu_type_t get_psu_type(int id, char* modelname, int modelname_len)
|
||||
char model_name[I2C_PSU_MODEL_NAME_LEN + 1] = {0};
|
||||
|
||||
/* Check AC model name */
|
||||
node = (id == PSU1_ID) ? PSU1_AC_HWMON_NODE(psu_model_name) : PSU2_AC_HWMON_NODE(psu_model_name);
|
||||
node = (id == PSU1_ID) ? PSU1_AC_EEPROM_NODE(psu_model_name) : PSU2_AC_EEPROM_NODE(psu_model_name);
|
||||
|
||||
if (deviceNodeReadString(node, model_name, sizeof(model_name), 0) == 0) {
|
||||
if (strncmp(model_name, "CPR-4011-4M11", strlen("CPR-4011-4M11")) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, modelname_len-1);
|
||||
}
|
||||
return PSU_TYPE_AC_F2B;
|
||||
}
|
||||
else if (strncmp(model_name, "CPR-4011-4M21", strlen("CPR-4011-4M21")) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, modelname_len-1);
|
||||
}
|
||||
return PSU_TYPE_AC_B2F;
|
||||
}
|
||||
else if (strncmp(model_name, "CPR-6011-2M11", strlen("CPR-6011-2M11")) == 0) {
|
||||
if (strncmp(model_name, "CPR-4011-4M11", STRLEN("CPR-4011-4M11")) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, modelname_len-1);
|
||||
strncpy(modelname, model_name, sizeof(model_name));
|
||||
}
|
||||
return PSU_TYPE_AC_F2B;
|
||||
return PSU_TYPE_AC_COMPUWARE_F2B;
|
||||
}
|
||||
else if (strncmp(model_name, "CPR-6011-2M21", strlen("CPR-6011-2M21")) == 0) {
|
||||
else if (strncmp(model_name, "CPR-4011-4M21", STRLEN("CPR-4011-4M21")) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, modelname_len-1);
|
||||
strncpy(modelname, model_name, sizeof(model_name));
|
||||
}
|
||||
return PSU_TYPE_AC_B2F;
|
||||
return PSU_TYPE_AC_COMPUWARE_B2F;
|
||||
}
|
||||
else if (strncmp(model_name, "CPR-6011-2M11", STRLEN("CPR-6011-2M11")) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, sizeof(model_name));
|
||||
}
|
||||
return PSU_TYPE_AC_COMPUWARE_F2B;
|
||||
}
|
||||
else if (strncmp(model_name, "CPR-6011-2M21", STRLEN("CPR-6011-2M21")) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, sizeof(model_name));
|
||||
}
|
||||
return PSU_TYPE_AC_COMPUWARE_B2F;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check 3Y-Power AC model name */
|
||||
memset(model_name, 0, sizeof(model_name));
|
||||
node = (id == PSU1_ID) ? PSU1_AC_3YPOWER_EEPROM_NODE(psu_model_name) : PSU2_AC_3YPOWER_EEPROM_NODE(psu_model_name);
|
||||
|
||||
if (deviceNodeReadString(node, model_name, sizeof(model_name), 0) == 0) {
|
||||
if (strncmp(model_name, "YM-2401JCR", STRLEN("YM-2401JCR")) == 0) {
|
||||
if (modelname) {
|
||||
model_name[STRLEN("YM-2401JCR")] = 0;
|
||||
strncpy(modelname, model_name, 11);
|
||||
}
|
||||
return PSU_TYPE_AC_3YPOWER_F2B;
|
||||
}
|
||||
else if (strncmp(model_name, "YM-2401JDR", STRLEN("YM-2401JDR")) == 0) {
|
||||
if (modelname) {
|
||||
model_name[STRLEN("YM-2401JDR")] = 0;
|
||||
strncpy(modelname, model_name, 11);
|
||||
}
|
||||
return PSU_TYPE_AC_3YPOWER_B2F;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check DC model name */
|
||||
memset(model_name, 0, sizeof(model_name));
|
||||
node = (id == PSU1_ID) ? PSU1_DC_HWMON_NODE(psu_model_name) : PSU2_DC_HWMON_NODE(psu_model_name);
|
||||
node = (id == PSU1_ID) ? PSU1_DC_EEPROM_NODE(psu_model_name) : PSU2_DC_EEPROM_NODE(psu_model_name);
|
||||
|
||||
if (deviceNodeReadString(node, model_name, sizeof(model_name), 0) == 0) {
|
||||
if (strncmp(model_name, "um400d01G", strlen("um400d01G")) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, modelname_len-1);
|
||||
}
|
||||
if (strncmp(model_name, "um400d01G", STRLEN("um400d01G")) == 0) {
|
||||
if (modelname) {
|
||||
model_name[STRLEN("um400d01G")] = 0;
|
||||
strncpy(modelname, model_name, 10);
|
||||
}
|
||||
return PSU_TYPE_DC_48V_B2F;
|
||||
}
|
||||
else if (strncmp(model_name, "um400d01-01G", strlen("um400d01-01G")) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, modelname_len-1);
|
||||
}
|
||||
else if (strncmp(model_name, "um400d01-01G", STRLEN("um400d01-01G")) == 0) {
|
||||
if (modelname) {
|
||||
model_name[STRLEN("um400d01-01G")] = 0;
|
||||
strncpy(modelname, model_name, 13);
|
||||
}
|
||||
return PSU_TYPE_DC_48V_F2B;
|
||||
}
|
||||
}
|
||||
@@ -179,3 +204,48 @@ psu_type_t get_psu_type(int id, char* modelname, int modelname_len)
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
int psu_ym2401_pmbus_info_get(int id, char *node, int *value)
|
||||
{
|
||||
int ret = 0;
|
||||
char path[64] = {0};
|
||||
|
||||
*value = 0;
|
||||
|
||||
if (PSU1_ID == id) {
|
||||
sprintf(path, "%s%s", PSU1_AC_3YPOWER_PMBUS_PREFIX, node);
|
||||
}
|
||||
else {
|
||||
sprintf(path, "%s%s", PSU2_AC_3YPOWER_PMBUS_PREFIX, node);
|
||||
}
|
||||
|
||||
if (onlp_file_read_int(value, path) < 0) {
|
||||
AIM_LOG_ERROR("Unable to read status from file(%s)\r\n", path);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int psu_ym2401_pmbus_info_set(int id, char *node, int value)
|
||||
{
|
||||
char path[64] = {0};
|
||||
|
||||
switch (id) {
|
||||
case PSU1_ID:
|
||||
sprintf(path, "%s%s", PSU1_AC_3YPOWER_PMBUS_PREFIX, node);
|
||||
break;
|
||||
case PSU2_ID:
|
||||
sprintf(path, "%s%s", PSU2_AC_3YPOWER_PMBUS_PREFIX, node);
|
||||
break;
|
||||
default:
|
||||
return ONLP_STATUS_E_UNSUPPORTED;
|
||||
};
|
||||
|
||||
if (deviceNodeWriteInt(path, value, 0) < 0) {
|
||||
AIM_LOG_ERROR("Unable to write data to file (%s)\r\n", path);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,18 +34,24 @@
|
||||
#define CHASSIS_FAN_COUNT 5
|
||||
#define CHASSIS_THERMAL_COUNT 4
|
||||
|
||||
#define PSU1_AC_PMBUS_PREFIX "/sys/bus/i2c/devices/11-003c/"
|
||||
#define PSU2_AC_PMBUS_PREFIX "/sys/bus/i2c/devices/12-003f/"
|
||||
#define PSU1_AC_PMBUS_PREFIX "/sys/bus/i2c/devices/11-003c/" /* Compuware psu */
|
||||
#define PSU2_AC_PMBUS_PREFIX "/sys/bus/i2c/devices/12-003f/" /* Compuware psu */
|
||||
#define PSU1_AC_3YPOWER_PMBUS_PREFIX "/sys/bus/i2c/devices/11-0058/" /* 3YPower psu */
|
||||
#define PSU2_AC_3YPOWER_PMBUS_PREFIX "/sys/bus/i2c/devices/12-005b/" /* 3YPower psu */
|
||||
|
||||
#define PSU1_AC_HWMON_PREFIX "/sys/bus/i2c/devices/11-0038/"
|
||||
#define PSU1_DC_HWMON_PREFIX "/sys/bus/i2c/devices/11-0050/"
|
||||
#define PSU2_AC_HWMON_PREFIX "/sys/bus/i2c/devices/12-003b/"
|
||||
#define PSU2_DC_HWMON_PREFIX "/sys/bus/i2c/devices/12-0053/"
|
||||
#define PSU1_AC_EEPROM_PREFIX "/sys/bus/i2c/devices/11-0038/"
|
||||
#define PSU1_DC_EEPROM_PREFIX "/sys/bus/i2c/devices/11-0050/"
|
||||
#define PSU2_AC_EEPROM_PREFIX "/sys/bus/i2c/devices/12-003b/"
|
||||
#define PSU2_DC_EEPROM_PREFIX "/sys/bus/i2c/devices/12-0053/"
|
||||
#define PSU1_AC_3YPOWER_EEPROM_PREFIX "/sys/bus/i2c/devices/11-0050/"
|
||||
#define PSU2_AC_3YPOWER_EEPROM_PREFIX "/sys/bus/i2c/devices/12-0053/"
|
||||
|
||||
#define PSU1_AC_HWMON_NODE(node) PSU1_AC_HWMON_PREFIX#node
|
||||
#define PSU1_DC_HWMON_NODE(node) PSU1_DC_HWMON_PREFIX#node
|
||||
#define PSU2_AC_HWMON_NODE(node) PSU2_AC_HWMON_PREFIX#node
|
||||
#define PSU2_DC_HWMON_NODE(node) PSU2_DC_HWMON_PREFIX#node
|
||||
#define PSU1_AC_EEPROM_NODE(node) PSU1_AC_EEPROM_PREFIX#node
|
||||
#define PSU1_DC_EEPROM_NODE(node) PSU1_DC_EEPROM_PREFIX#node
|
||||
#define PSU2_AC_EEPROM_NODE(node) PSU2_AC_EEPROM_PREFIX#node
|
||||
#define PSU2_DC_EEPROM_NODE(node) PSU2_DC_EEPROM_PREFIX#node
|
||||
#define PSU1_AC_3YPOWER_EEPROM_NODE(node) PSU1_AC_3YPOWER_EEPROM_PREFIX#node
|
||||
#define PSU2_AC_3YPOWER_EEPROM_NODE(node) PSU2_AC_3YPOWER_EEPROM_PREFIX#node
|
||||
|
||||
#define IDPROM_PATH "/sys/devices/pci0000:00/0000:00:13.0/i2c-1/1-0057/eeprom"
|
||||
|
||||
@@ -55,12 +61,25 @@ int deviceNodeReadString(char *filename, char *buffer, int buf_size, int data_le
|
||||
|
||||
typedef enum psu_type {
|
||||
PSU_TYPE_UNKNOWN,
|
||||
PSU_TYPE_AC_F2B,
|
||||
PSU_TYPE_AC_B2F,
|
||||
PSU_TYPE_AC_COMPUWARE_F2B,
|
||||
PSU_TYPE_AC_COMPUWARE_B2F,
|
||||
PSU_TYPE_AC_3YPOWER_F2B,
|
||||
PSU_TYPE_AC_3YPOWER_B2F,
|
||||
PSU_TYPE_DC_48V_F2B,
|
||||
PSU_TYPE_DC_48V_B2F
|
||||
} psu_type_t;
|
||||
|
||||
psu_type_t get_psu_type(int id, char* modelname, int modelname_len);
|
||||
int psu_ym2401_pmbus_info_get(int id, char *node, int *value);
|
||||
int psu_ym2401_pmbus_info_set(int id, char *node, int value);
|
||||
|
||||
#define DEBUG_MODE 0
|
||||
|
||||
#if (DEBUG_MODE == 1)
|
||||
#define DEBUG_PRINT(fmt, args...) \
|
||||
printf("%s:%s[%d]: " fmt "\r\n", __FILE__, __FUNCTION__, __LINE__, ##args)
|
||||
#else
|
||||
#define DEBUG_PRINT(fmt, args...)
|
||||
#endif
|
||||
|
||||
#endif /* __PLATFORM_LIB_H__ */
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
*
|
||||
***********************************************************/
|
||||
#include <onlp/platformi/psui.h>
|
||||
#include <onlplib/mmap.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "platform_lib.h"
|
||||
@@ -52,10 +51,10 @@ psu_status_info_get(int id, int is_ac, char *node, int *value)
|
||||
*value = 0;
|
||||
|
||||
if (PSU1_ID == id) {
|
||||
sprintf(node_path, "%s%s", is_ac ? PSU1_AC_HWMON_PREFIX : PSU1_DC_HWMON_PREFIX, node);
|
||||
sprintf(node_path, "%s%s", is_ac ? PSU1_AC_EEPROM_PREFIX : PSU1_DC_EEPROM_PREFIX, node);
|
||||
}
|
||||
else if (PSU2_ID == id) {
|
||||
sprintf(node_path, "%s%s", is_ac ? PSU2_AC_HWMON_PREFIX : PSU2_DC_HWMON_PREFIX, node);
|
||||
sprintf(node_path, "%s%s", is_ac ? PSU2_AC_EEPROM_PREFIX : PSU2_DC_EEPROM_PREFIX, node);
|
||||
}
|
||||
|
||||
ret = deviceNodeReadString(node_path, buf, sizeof(buf), 0);
|
||||
@@ -108,9 +107,9 @@ psu_cpr_4011_info_get(onlp_psu_info_t* info)
|
||||
*/
|
||||
info->caps = ONLP_PSU_CAPS_AC;
|
||||
|
||||
if (info->status & ONLP_PSU_STATUS_FAILED) {
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
if (info->status & ONLP_PSU_STATUS_FAILED) {
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
/* Set the associated oid_table */
|
||||
info->hdr.coids[0] = ONLP_FAN_ID_CREATE(index + CHASSIS_FAN_COUNT);
|
||||
@@ -169,6 +168,43 @@ psu_um400d_info_get(onlp_psu_info_t* info)
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
static int
|
||||
psu_ym2401_info_get(onlp_psu_info_t* info)
|
||||
{
|
||||
int val = 0;
|
||||
int index = ONLP_OID_ID_GET(info->hdr.id);
|
||||
|
||||
/* Set capability
|
||||
*/
|
||||
info->caps = ONLP_PSU_CAPS_AC;
|
||||
|
||||
if (info->status & ONLP_PSU_STATUS_FAILED) {
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
/* Set the associated oid_table */
|
||||
info->hdr.coids[0] = ONLP_FAN_ID_CREATE(index + CHASSIS_FAN_COUNT);
|
||||
info->hdr.coids[1] = ONLP_THERMAL_ID_CREATE(index + CHASSIS_THERMAL_COUNT);
|
||||
|
||||
/* Read voltage, current and power */
|
||||
if (psu_ym2401_pmbus_info_get(index, "psu_v_out", &val) == 0) {
|
||||
info->mvout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_VOUT;
|
||||
}
|
||||
|
||||
if (psu_ym2401_pmbus_info_get(index, "psu_i_out", &val) == 0) {
|
||||
info->miout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_IOUT;
|
||||
}
|
||||
|
||||
if (psu_ym2401_pmbus_info_get(index, "psu_p_out", &val) == 0) {
|
||||
info->mpout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_POUT;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get all information about the given PSU oid.
|
||||
*/
|
||||
@@ -224,10 +260,14 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
|
||||
psu_type = get_psu_type(index, info->model, sizeof(info->model));
|
||||
|
||||
switch (psu_type) {
|
||||
case PSU_TYPE_AC_F2B:
|
||||
case PSU_TYPE_AC_B2F:
|
||||
case PSU_TYPE_AC_COMPUWARE_F2B:
|
||||
case PSU_TYPE_AC_COMPUWARE_B2F:
|
||||
ret = psu_cpr_4011_info_get(info);
|
||||
break;
|
||||
case PSU_TYPE_AC_3YPOWER_F2B:
|
||||
case PSU_TYPE_AC_3YPOWER_B2F:
|
||||
ret = psu_ym2401_info_get(info);
|
||||
break;
|
||||
case PSU_TYPE_DC_48V_F2B:
|
||||
case PSU_TYPE_DC_48V_B2F:
|
||||
ret = psu_um400d_info_get(info);
|
||||
|
||||
@@ -24,10 +24,9 @@
|
||||
*
|
||||
***********************************************************/
|
||||
#include <unistd.h>
|
||||
#include <onlplib/mmap.h>
|
||||
#include <onlplib/file.h>
|
||||
#include <onlp/platformi/thermali.h>
|
||||
#include <fcntl.h>
|
||||
#include "platform_lib.h"
|
||||
|
||||
#define VALIDATE(_id) \
|
||||
do { \
|
||||
@@ -67,7 +66,6 @@ static char* cpu_coretemp_files[] =
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
||||
/* Static values */
|
||||
static onlp_thermal_info_t linfo[] = {
|
||||
{ }, /* Not used */
|
||||
@@ -97,9 +95,6 @@ static onlp_thermal_info_t linfo[] = {
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* This will be called to intiialize the thermali subsystem.
|
||||
*/
|
||||
@@ -109,7 +104,6 @@ onlp_thermali_init(void)
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Retrieve the information structure for the given thermal OID.
|
||||
*
|
||||
@@ -124,6 +118,9 @@ int
|
||||
onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info)
|
||||
{
|
||||
int local_id;
|
||||
int psu_id;
|
||||
psu_type_t psu_type;
|
||||
|
||||
VALIDATE(id);
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
@@ -136,5 +133,14 @@ onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info)
|
||||
return rv;
|
||||
}
|
||||
|
||||
psu_id = local_id - THERMAL_1_ON_PSU1 + 1;
|
||||
psu_type = get_psu_type(psu_id, NULL, 0);
|
||||
|
||||
if (psu_type == PSU_TYPE_AC_3YPOWER_F2B || psu_type == PSU_TYPE_AC_3YPOWER_B2F ) {
|
||||
int rv = psu_ym2401_pmbus_info_get(psu_id, "psu_temp1_input", &info->mcelsius);
|
||||
return rv;
|
||||
}
|
||||
|
||||
return onlp_file_read_int(&info->mcelsius, devfiles__[local_id]);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ class OnlPlatform_x86_64_accton_as5812_54t_r0(OnlPlatformAccton,
|
||||
########### initialize I2C bus 0 ###########
|
||||
self.insmod("accton_i2c_cpld")
|
||||
self.insmod("cpr_4011_4mxx")
|
||||
self.insmod("ym2651y")
|
||||
for m in [ "sfp", "psu", "fan", "leds" ]:
|
||||
self.insmod("x86-64-accton-as5812-54t-%s" % m)
|
||||
|
||||
@@ -36,12 +37,16 @@ class OnlPlatform_x86_64_accton_as5812_54t_r0(OnlPlatformAccton,
|
||||
('pca9548', 0x70, 1),
|
||||
|
||||
# initiate PSU-1 AC Power
|
||||
('as5812_54t_psu', 0x38, 11),
|
||||
('as5812_54t_psu1', 0x38, 11),
|
||||
('cpr_4011_4mxx', 0x3c, 11),
|
||||
('as5812_54t_psu1', 0x50, 11),
|
||||
('ym2401', 0x58, 11),
|
||||
|
||||
# initiate PSU-2 AC Power
|
||||
('as5812_54t_psu', 0x3b, 12),
|
||||
('as5812_54t_psu2', 0x3b, 12),
|
||||
('cpr_4011_4mxx', 0x3f, 12),
|
||||
('as5812_54t_psu2', 0x53, 12),
|
||||
('ym2401', 0x5b, 12),
|
||||
|
||||
# initiate lm75
|
||||
('lm75', 0x48, 15),
|
||||
|
||||
@@ -43,6 +43,7 @@ extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value);
|
||||
*/
|
||||
static const u8 fan_reg[] = {
|
||||
0x0F, /* fan 1-6 present status */
|
||||
0x10, /* fan 1-6 direction(0:B2F 1:F2B) */
|
||||
0x11, /* fan PWM(for all fan) */
|
||||
0x12, /* front fan 1 speed(rpm) */
|
||||
0x13, /* front fan 2 speed(rpm) */
|
||||
@@ -78,6 +79,7 @@ enum fan_id {
|
||||
|
||||
enum sysfs_fan_attributes {
|
||||
FAN_PRESENT_REG,
|
||||
FAN_DIRECTION_REG,
|
||||
FAN_DUTY_CYCLE_PERCENTAGE, /* Only one CPLD register to control duty cycle for all fans */
|
||||
FAN1_FRONT_SPEED_RPM,
|
||||
FAN2_FRONT_SPEED_RPM,
|
||||
@@ -91,6 +93,12 @@ enum sysfs_fan_attributes {
|
||||
FAN4_REAR_SPEED_RPM,
|
||||
FAN5_REAR_SPEED_RPM,
|
||||
FAN6_REAR_SPEED_RPM,
|
||||
FAN1_DIRECTION,
|
||||
FAN2_DIRECTION,
|
||||
FAN3_DIRECTION,
|
||||
FAN4_DIRECTION,
|
||||
FAN5_DIRECTION,
|
||||
FAN6_DIRECTION,
|
||||
FAN1_PRESENT,
|
||||
FAN2_PRESENT,
|
||||
FAN3_PRESENT,
|
||||
@@ -150,6 +158,13 @@ DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(3);
|
||||
DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(4);
|
||||
DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(5);
|
||||
DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(6);
|
||||
/* 6 fan direction attribute in this platform */
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(1);
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(2);
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(3);
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(4);
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(5);
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(6);
|
||||
/* 1 fan duty cycle attribute in this platform */
|
||||
DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR();
|
||||
|
||||
@@ -173,6 +188,12 @@ static struct attribute *as7716_32x_fan_attributes[] = {
|
||||
DECLARE_FAN_PRESENT_ATTR(4),
|
||||
DECLARE_FAN_PRESENT_ATTR(5),
|
||||
DECLARE_FAN_PRESENT_ATTR(6),
|
||||
DECLARE_FAN_DIRECTION_ATTR(1),
|
||||
DECLARE_FAN_DIRECTION_ATTR(2),
|
||||
DECLARE_FAN_DIRECTION_ATTR(3),
|
||||
DECLARE_FAN_DIRECTION_ATTR(4),
|
||||
DECLARE_FAN_DIRECTION_ATTR(5),
|
||||
DECLARE_FAN_DIRECTION_ATTR(6),
|
||||
DECLARE_FAN_DUTY_CYCLE_ATTR(),
|
||||
NULL
|
||||
};
|
||||
@@ -209,6 +230,14 @@ static u32 reg_val_to_speed_rpm(u8 reg_val)
|
||||
return (u32)reg_val * FAN_REG_VAL_TO_SPEED_RPM_STEP;
|
||||
}
|
||||
|
||||
static u8 reg_val_to_direction(u8 reg_val, enum fan_id id)
|
||||
{
|
||||
u8 mask = (1 << id);
|
||||
|
||||
reg_val &= mask;
|
||||
|
||||
return reg_val ? 1 : 0;
|
||||
}
|
||||
static u8 reg_val_to_is_present(u8 reg_val, enum fan_id id)
|
||||
{
|
||||
u8 mask = (1 << id);
|
||||
@@ -299,6 +328,16 @@ static ssize_t fan_show_value(struct device *dev, struct device_attribute *da,
|
||||
case FAN6_FAULT:
|
||||
ret = sprintf(buf, "%d\n", is_fan_fault(data, attr->index - FAN1_FAULT));
|
||||
break;
|
||||
case FAN1_DIRECTION:
|
||||
case FAN2_DIRECTION:
|
||||
case FAN3_DIRECTION:
|
||||
case FAN4_DIRECTION:
|
||||
case FAN5_DIRECTION:
|
||||
case FAN6_DIRECTION:
|
||||
ret = sprintf(buf, "%d\n",
|
||||
reg_val_to_direction(data->reg_val[FAN_DIRECTION_REG],
|
||||
attr->index - FAN1_DIRECTION));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -34,14 +34,19 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
#define MAX_MODEL_NAME 16
|
||||
|
||||
#define DC12V_FAN_DIR_OFFSET 0x34
|
||||
#define DC12V_FAN_DIR_LEN 3
|
||||
|
||||
static ssize_t show_status(struct device *dev, struct device_attribute *da, char *buf);
|
||||
static ssize_t show_model_name(struct device *dev, struct device_attribute *da, char *buf);
|
||||
static ssize_t show_string(struct device *dev, struct device_attribute *da, char *buf);
|
||||
static int as7716_32x_psu_read_block(struct i2c_client *client, u8 command, u8 *data,int data_len);
|
||||
extern int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg);
|
||||
|
||||
/* Addresses scanned
|
||||
*/
|
||||
static const unsigned short normal_i2c[] = { 0x50, 0x53, I2C_CLIENT_END };
|
||||
static const unsigned short normal_i2c[] = { I2C_CLIENT_END };
|
||||
|
||||
/* Each client has this additional data
|
||||
*/
|
||||
@@ -52,7 +57,8 @@ struct as7716_32x_psu_data {
|
||||
unsigned long last_updated; /* In jiffies */
|
||||
u8 index; /* PSU index */
|
||||
u8 status; /* Status(present/power_good) register read from CPLD */
|
||||
char model_name[9]; /* Model name, read from eeprom */
|
||||
char model_name[MAX_MODEL_NAME+1]; /* Model name, read from eeprom */
|
||||
char fan_dir[DC12V_FAN_DIR_LEN+1]; /* DC12V fan direction */
|
||||
};
|
||||
|
||||
static struct as7716_32x_psu_data *as7716_32x_psu_update_device(struct device *dev);
|
||||
@@ -60,19 +66,22 @@ static struct as7716_32x_psu_data *as7716_32x_psu_update_device(struct device *d
|
||||
enum as7716_32x_psu_sysfs_attributes {
|
||||
PSU_PRESENT,
|
||||
PSU_MODEL_NAME,
|
||||
PSU_POWER_GOOD
|
||||
PSU_POWER_GOOD,
|
||||
PSU_FAN_DIR /* For DC12V only */
|
||||
};
|
||||
|
||||
/* sysfs attributes for hwmon
|
||||
*/
|
||||
static SENSOR_DEVICE_ATTR(psu_present, S_IRUGO, show_status, NULL, PSU_PRESENT);
|
||||
static SENSOR_DEVICE_ATTR(psu_model_name, S_IRUGO, show_model_name,NULL, PSU_MODEL_NAME);
|
||||
static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_status, NULL, PSU_POWER_GOOD);
|
||||
static SENSOR_DEVICE_ATTR(psu_present, S_IRUGO, show_status, NULL, PSU_PRESENT);
|
||||
static SENSOR_DEVICE_ATTR(psu_model_name, S_IRUGO, show_string, NULL, PSU_MODEL_NAME);
|
||||
static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_status, NULL, PSU_POWER_GOOD);
|
||||
static SENSOR_DEVICE_ATTR(psu_fan_dir, S_IRUGO, show_string, NULL, PSU_FAN_DIR);
|
||||
|
||||
static struct attribute *as7716_32x_psu_attributes[] = {
|
||||
&sensor_dev_attr_psu_present.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_model_name.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_power_good.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_fan_dir.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -83,6 +92,10 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da,
|
||||
struct as7716_32x_psu_data *data = as7716_32x_psu_update_device(dev);
|
||||
u8 status = 0;
|
||||
|
||||
if (!data->valid) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (attr->index == PSU_PRESENT) {
|
||||
status = !(data->status >> (1-data->index) & 0x1);
|
||||
}
|
||||
@@ -93,12 +106,25 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da,
|
||||
return sprintf(buf, "%d\n", status);
|
||||
}
|
||||
|
||||
static ssize_t show_model_name(struct device *dev, struct device_attribute *da,
|
||||
static ssize_t show_string(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
struct as7716_32x_psu_data *data = as7716_32x_psu_update_device(dev);
|
||||
|
||||
return sprintf(buf, "%s\n", data->model_name);
|
||||
char *ptr = NULL;
|
||||
|
||||
if (!data->valid) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (attr->index == PSU_MODEL_NAME) {
|
||||
ptr = data->model_name;
|
||||
}
|
||||
else { /* PSU_FAN_DIR */
|
||||
ptr = data->fan_dir;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%s\n", ptr);
|
||||
}
|
||||
|
||||
static const struct attribute_group as7716_32x_psu_group = {
|
||||
@@ -219,6 +245,59 @@ static int as7716_32x_psu_read_block(struct i2c_client *client, u8 command, u8 *
|
||||
return result;
|
||||
}
|
||||
|
||||
enum psu_type {
|
||||
PSU_TYPE_AC_110V,
|
||||
PSU_TYPE_DC_48V,
|
||||
PSU_TYPE_DC_12V
|
||||
};
|
||||
|
||||
struct model_name_info {
|
||||
enum psu_type type;
|
||||
u8 offset;
|
||||
u8 length;
|
||||
char* model_name;
|
||||
};
|
||||
|
||||
struct model_name_info models[] = {
|
||||
{PSU_TYPE_AC_110V, 0x20, 8, "YM-2651Y"},
|
||||
{PSU_TYPE_DC_48V, 0x20, 8, "YM-2651V"},
|
||||
{PSU_TYPE_DC_12V, 0x00, 11, "PSU-12V-750"},
|
||||
};
|
||||
|
||||
static int as7716_32x_psu_model_name_get(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct as7716_32x_psu_data *data = i2c_get_clientdata(client);
|
||||
int i, status;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(models); i++) {
|
||||
memset(data->model_name, 0, sizeof(data->model_name));
|
||||
|
||||
status = as7716_32x_psu_read_block(client, models[i].offset,
|
||||
data->model_name, models[i].length);
|
||||
if (status < 0) {
|
||||
data->model_name[0] = '\0';
|
||||
dev_dbg(&client->dev, "unable to read model name from (0x%x) offset(0x%x)\n",
|
||||
client->addr, models[i].offset);
|
||||
return status;
|
||||
}
|
||||
else {
|
||||
data->model_name[models[i].length] = '\0';
|
||||
}
|
||||
|
||||
/* Determine if the model name is known, if not, read next index
|
||||
*/
|
||||
if (strncmp(data->model_name, models[i].model_name, models[i].length) == 0) {
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
data->model_name[0] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
static struct as7716_32x_psu_data *as7716_32x_psu_update_device(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
@@ -231,6 +310,7 @@ static struct as7716_32x_psu_data *as7716_32x_psu_update_device(struct device *d
|
||||
int status;
|
||||
int power_good = 0;
|
||||
|
||||
data->valid = 0;
|
||||
dev_dbg(&client->dev, "Starting as7716_32x update\n");
|
||||
|
||||
/* Read psu status */
|
||||
@@ -238,6 +318,7 @@ static struct as7716_32x_psu_data *as7716_32x_psu_update_device(struct device *d
|
||||
|
||||
if (status < 0) {
|
||||
dev_dbg(&client->dev, "cpld reg 0x60 err %d\n", status);
|
||||
goto exit;
|
||||
}
|
||||
else {
|
||||
data->status = status;
|
||||
@@ -245,18 +326,27 @@ static struct as7716_32x_psu_data *as7716_32x_psu_update_device(struct device *d
|
||||
|
||||
/* Read model name */
|
||||
memset(data->model_name, 0, sizeof(data->model_name));
|
||||
memset(data->fan_dir, 0, sizeof(data->fan_dir));
|
||||
power_good = (data->status >> (3-data->index) & 0x1);
|
||||
|
||||
if (power_good) {
|
||||
status = as7716_32x_psu_read_block(client, 0x20, data->model_name,
|
||||
ARRAY_SIZE(data->model_name)-1);
|
||||
|
||||
if (status < 0) {
|
||||
data->model_name[0] = '\0';
|
||||
dev_dbg(&client->dev, "unable to read model name from (0x%x)\n", client->addr);
|
||||
if (as7716_32x_psu_model_name_get(dev) < 0) {
|
||||
goto exit;
|
||||
}
|
||||
else {
|
||||
data->model_name[ARRAY_SIZE(data->model_name)-1] = '\0';
|
||||
|
||||
if (strncmp(data->model_name,
|
||||
models[PSU_TYPE_DC_12V].model_name,
|
||||
models[PSU_TYPE_DC_12V].length) == 0) {
|
||||
/* Read fan direction */
|
||||
status = as7716_32x_psu_read_block(client, DC12V_FAN_DIR_OFFSET,
|
||||
data->fan_dir, DC12V_FAN_DIR_LEN);
|
||||
|
||||
if (status < 0) {
|
||||
data->fan_dir[0] = '\0';
|
||||
dev_dbg(&client->dev, "unable to read fan direction from (0x%x) offset(0x%x)\n",
|
||||
client->addr, DC12V_FAN_DIR_OFFSET);
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -264,6 +354,7 @@ static struct as7716_32x_psu_data *as7716_32x_psu_update_device(struct device *d
|
||||
data->valid = 1;
|
||||
}
|
||||
|
||||
exit:
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
return data;
|
||||
|
||||
@@ -52,19 +52,20 @@ typedef struct fan_path_S
|
||||
char present[LEN_FILE_NAME];
|
||||
char status[LEN_FILE_NAME];
|
||||
char speed[LEN_FILE_NAME];
|
||||
char direction[LEN_FILE_NAME];
|
||||
char ctrl_speed[LEN_FILE_NAME];
|
||||
char r_speed[LEN_FILE_NAME];
|
||||
}fan_path_T;
|
||||
|
||||
#define _MAKE_FAN_PATH_ON_MAIN_BOARD(prj,id) \
|
||||
{ #prj"fan"#id"_present", #prj"fan"#id"_fault", #prj"fan"#id"_front_speed_rpm", \
|
||||
#prj"fan"#id"_duty_cycle_percentage", #prj"fan"#id"_rear_speed_rpm" }
|
||||
#prj"fan"#id"_direction", #prj"fan"#id"_duty_cycle_percentage", #prj"fan"#id"_rear_speed_rpm" }
|
||||
|
||||
#define MAKE_FAN_PATH_ON_MAIN_BOARD(prj,id) _MAKE_FAN_PATH_ON_MAIN_BOARD(prj,id)
|
||||
|
||||
#define MAKE_FAN_PATH_ON_PSU(folder) \
|
||||
{#folder"/psu_fan1_fault", #folder"/psu_fan1_speed_rpm", \
|
||||
#folder"/psu_fan1_duty_cycle_percentage", "" }
|
||||
{"", #folder"/psu_fan1_fault", #folder"/psu_fan1_speed_rpm", \
|
||||
"", #folder"/psu_fan1_duty_cycle_percentage", "" }
|
||||
|
||||
static fan_path_T fan_path[] = /* must map with onlp_fan_id */
|
||||
{
|
||||
@@ -130,12 +131,8 @@ onlp_fan_info_t linfo[] = {
|
||||
if (close(fd) == -1) \
|
||||
return ONLP_STATUS_E_INTERNAL
|
||||
|
||||
/* There is no CPLD register for reading fan direction on this platform,
|
||||
* to read fan direction, we need to read from PSU-fan,
|
||||
* the direction of PSU-fan and chassis-fan are the same.
|
||||
*/
|
||||
static uint32_t
|
||||
_onlp_fani_info_get_fan_direction(void)
|
||||
_onlp_fani_info_get_psu_fan_direction(void)
|
||||
{
|
||||
/* Try to read direction from PSU1.
|
||||
* If PSU1 is not valid, read from PSU2
|
||||
@@ -150,12 +147,18 @@ _onlp_fani_info_get_fan_direction(void)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (PSU_TYPE_AC_F2B == psu_type) {
|
||||
return ONLP_FAN_STATUS_F2B;
|
||||
}
|
||||
else {
|
||||
return ONLP_FAN_STATUS_B2F;
|
||||
}
|
||||
switch (psu_type) {
|
||||
case PSU_TYPE_AC_F2B:
|
||||
case PSU_TYPE_DC_48V_F2B:
|
||||
case PSU_TYPE_DC_12V_F2B:
|
||||
return ONLP_FAN_STATUS_F2B;
|
||||
case PSU_TYPE_AC_B2F:
|
||||
case PSU_TYPE_DC_48V_B2F:
|
||||
case PSU_TYPE_DC_12V_B2F:
|
||||
return ONLP_FAN_STATUS_B2F;
|
||||
default:
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -186,9 +189,15 @@ _onlp_fani_info_get_fan(int local_id, onlp_fan_info_t* info)
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
/* get fan direction (both : the same)
|
||||
/* get fan/fanr direction (both : the same)
|
||||
*/
|
||||
info->status |= _onlp_fani_info_get_fan_direction();
|
||||
sprintf(fullpath, "%s%s", PREFIX_PATH_ON_MAIN_BOARD, fan_path[local_id].direction);
|
||||
OPEN_READ_FILE(fd,fullpath,r_data,nbytes,len);
|
||||
|
||||
if (atoi(r_data) == 0) /*B2F*/
|
||||
info->status |= ONLP_FAN_STATUS_B2F;
|
||||
else
|
||||
info->status |= ONLP_FAN_STATUS_F2B;
|
||||
|
||||
/* get fan speed (take the min from two speeds)
|
||||
*/
|
||||
@@ -217,7 +226,7 @@ _onlp_fani_info_get_fan_on_psu(int local_id, onlp_fan_info_t* info)
|
||||
|
||||
/* get fan direction
|
||||
*/
|
||||
info->status |= _onlp_fani_info_get_fan_direction();
|
||||
info->status |= _onlp_fani_info_get_psu_fan_direction();
|
||||
|
||||
/* get fan fault status
|
||||
*/
|
||||
|
||||
@@ -66,7 +66,7 @@ int deviceNodeWriteInt(char *filename, int value, int data_len)
|
||||
char buf[8] = {0};
|
||||
sprintf(buf, "%d", value);
|
||||
|
||||
return deviceNodeWrite(filename, buf, sizeof(buf)-1, data_len);
|
||||
return deviceNodeWrite(filename, buf, (int)strlen(buf), data_len);
|
||||
}
|
||||
|
||||
int deviceNodeReadBinary(char *filename, char *buffer, int buf_size, int data_len)
|
||||
@@ -115,9 +115,9 @@ int deviceNodeReadString(char *filename, char *buffer, int buf_size, int data_le
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define I2C_PSU_MODEL_NAME_LEN 9
|
||||
#define I2C_PSU_MODEL_NAME_LEN 11
|
||||
#define I2C_PSU_FAN_DIR_LEN 3
|
||||
|
||||
#include <ctype.h>
|
||||
psu_type_t get_psu_type(int id, char* modelname, int modelname_len)
|
||||
{
|
||||
char *node = NULL;
|
||||
@@ -131,27 +131,70 @@ psu_type_t get_psu_type(int id, char* modelname, int modelname_len)
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (strncmp(model_name, "YM-2651Y", strlen("YM-2651Y")) != 0) {
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
if(isspace(model_name[strlen(model_name)-1])) {
|
||||
model_name[strlen(model_name)-1] = 0;
|
||||
}
|
||||
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, modelname_len-1);
|
||||
if (strncmp(model_name, "YM-2651Y", 8) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, 8);
|
||||
}
|
||||
|
||||
node = (id == PSU1_ID) ? PSU1_AC_PMBUS_NODE(psu_fan_dir) : PSU2_AC_PMBUS_NODE(psu_fan_dir);
|
||||
if (deviceNodeReadString(node, fan_dir, sizeof(fan_dir), 0) != 0) {
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "F2B", strlen("F2B")) == 0) {
|
||||
return PSU_TYPE_AC_F2B;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) {
|
||||
return PSU_TYPE_AC_B2F;
|
||||
}
|
||||
}
|
||||
|
||||
node = (id == PSU1_ID) ? PSU1_AC_PMBUS_NODE(psu_fan_dir) : PSU2_AC_PMBUS_NODE(psu_fan_dir);
|
||||
if (strncmp(model_name, "YM-2651V", 8) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, 8);
|
||||
}
|
||||
|
||||
if (deviceNodeReadString(node, fan_dir, sizeof(fan_dir), 0) != 0) {
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
node = (id == PSU1_ID) ? PSU1_AC_PMBUS_NODE(psu_fan_dir) : PSU2_AC_PMBUS_NODE(psu_fan_dir);
|
||||
if (deviceNodeReadString(node, fan_dir, sizeof(fan_dir), 0) != 0) {
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "F2B", strlen("F2B")) == 0) {
|
||||
return PSU_TYPE_DC_48V_F2B;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) {
|
||||
return PSU_TYPE_DC_48V_B2F;
|
||||
}
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "F2B", strlen("F2B")) == 0) {
|
||||
return PSU_TYPE_AC_F2B;
|
||||
}
|
||||
if (strncmp(model_name, "PSU-12V-750", 11) == 0) {
|
||||
if (modelname) {
|
||||
strncpy(modelname, model_name, 11);
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) {
|
||||
return PSU_TYPE_AC_B2F;
|
||||
}
|
||||
node = (id == PSU1_ID) ? PSU1_AC_HWMON_NODE(psu_fan_dir) : PSU2_AC_HWMON_NODE(psu_fan_dir);
|
||||
if (deviceNodeReadString(node, fan_dir, sizeof(fan_dir), 0) != 0) {
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "F2B", 3) == 0) {
|
||||
return PSU_TYPE_DC_12V_F2B;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "B2F", 3) == 0) {
|
||||
return PSU_TYPE_DC_12V_B2F;
|
||||
}
|
||||
|
||||
if (strncmp(fan_dir, "NON", 3) == 0) {
|
||||
return PSU_TYPE_DC_12V_FANLESS;
|
||||
}
|
||||
}
|
||||
|
||||
return PSU_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,12 @@ int deviceNodeReadString(char *filename, char *buffer, int buf_size, int data_le
|
||||
typedef enum psu_type {
|
||||
PSU_TYPE_UNKNOWN,
|
||||
PSU_TYPE_AC_F2B,
|
||||
PSU_TYPE_AC_B2F
|
||||
PSU_TYPE_AC_B2F,
|
||||
PSU_TYPE_DC_48V_F2B,
|
||||
PSU_TYPE_DC_48V_B2F,
|
||||
PSU_TYPE_DC_12V_FANLESS,
|
||||
PSU_TYPE_DC_12V_F2B,
|
||||
PSU_TYPE_DC_12V_B2F
|
||||
} psu_type_t;
|
||||
|
||||
psu_type_t get_psu_type(int id, char* modelname, int modelname_len);
|
||||
|
||||
@@ -68,7 +68,7 @@ psu_status_info_get(int id, char *node, int *value)
|
||||
}
|
||||
|
||||
static int
|
||||
psu_ym2651y_pmbus_info_get(int id, char *node, int *value)
|
||||
psu_ym2651_pmbus_info_get(int id, char *node, int *value)
|
||||
{
|
||||
int ret = 0;
|
||||
char buf[PSU_NODE_MAX_INT_LEN + 1] = {0};
|
||||
@@ -99,15 +99,11 @@ onlp_psui_init(void)
|
||||
}
|
||||
|
||||
static int
|
||||
psu_ym2651y_info_get(onlp_psu_info_t* info)
|
||||
psu_ym2651_info_get(onlp_psu_info_t* info)
|
||||
{
|
||||
int val = 0;
|
||||
int index = ONLP_OID_ID_GET(info->hdr.id);
|
||||
|
||||
/* Set capability
|
||||
*/
|
||||
info->caps = ONLP_PSU_CAPS_AC;
|
||||
|
||||
if (info->status & ONLP_PSU_STATUS_FAILED) {
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
@@ -117,20 +113,70 @@ psu_ym2651y_info_get(onlp_psu_info_t* info)
|
||||
info->hdr.coids[1] = ONLP_THERMAL_ID_CREATE(index + CHASSIS_THERMAL_COUNT);
|
||||
|
||||
/* Read voltage, current and power */
|
||||
if (psu_ym2651y_pmbus_info_get(index, "psu_v_out", &val) == 0) {
|
||||
if (psu_ym2651_pmbus_info_get(index, "psu_v_out", &val) == 0) {
|
||||
info->mvout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_VOUT;
|
||||
}
|
||||
|
||||
if (psu_ym2651y_pmbus_info_get(index, "psu_i_out", &val) == 0) {
|
||||
if (psu_ym2651_pmbus_info_get(index, "psu_i_out", &val) == 0) {
|
||||
info->miout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_IOUT;
|
||||
}
|
||||
|
||||
if (psu_ym2651y_pmbus_info_get(index, "psu_p_out", &val) == 0) {
|
||||
if (psu_ym2651_pmbus_info_get(index, "psu_p_out", &val) == 0) {
|
||||
info->mpout = val;
|
||||
info->caps |= ONLP_PSU_CAPS_POUT;
|
||||
}
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
#include <onlplib/i2c.h>
|
||||
#define DC12V_750_REG_TO_CURRENT(low, high) (((low << 4 | high >> 4) * 20 * 1000) / 754)
|
||||
#define DC12V_750_REG_TO_VOLTAGE(low, high) ((low << 4 | high >> 4) * 25)
|
||||
|
||||
static int
|
||||
psu_dc12v_750_info_get(onlp_psu_info_t* info)
|
||||
{
|
||||
int pid = ONLP_OID_ID_GET(info->hdr.id);
|
||||
int bus = (PSU1_ID == pid) ? 18 : 17;
|
||||
int iout_low, iout_high;
|
||||
int vout_low, vout_high;
|
||||
|
||||
/* Set capability
|
||||
*/
|
||||
info->caps = ONLP_PSU_CAPS_DC12;
|
||||
|
||||
if (info->status & ONLP_PSU_STATUS_FAILED) {
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
/* Get current
|
||||
*/
|
||||
iout_low = onlp_i2c_readb(bus, 0x6f, 0x0, ONLP_I2C_F_FORCE);
|
||||
iout_high = onlp_i2c_readb(bus, 0x6f, 0x1, ONLP_I2C_F_FORCE);
|
||||
|
||||
if ((iout_low >= 0) && (iout_high >= 0)) {
|
||||
info->miout = DC12V_750_REG_TO_CURRENT(iout_low, iout_high);
|
||||
info->caps |= ONLP_PSU_CAPS_IOUT;
|
||||
}
|
||||
|
||||
/* Get voltage
|
||||
*/
|
||||
vout_low = onlp_i2c_readb(bus, 0x6f, 0x2, ONLP_I2C_F_FORCE);
|
||||
vout_high = onlp_i2c_readb(bus, 0x6f, 0x3, ONLP_I2C_F_FORCE);
|
||||
|
||||
if ((vout_low >= 0) && (vout_high >= 0)) {
|
||||
info->mvout = DC12V_750_REG_TO_VOLTAGE(vout_low, vout_high);
|
||||
info->caps |= ONLP_PSU_CAPS_VOUT;
|
||||
}
|
||||
|
||||
/* Get power based on current and voltage
|
||||
*/
|
||||
if ((info->caps & ONLP_PSU_CAPS_IOUT) && (info->caps & ONLP_PSU_CAPS_VOUT)) {
|
||||
info->mpout = (info->miout * info->mvout) / 1000;
|
||||
info->caps |= ONLP_PSU_CAPS_POUT;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
@@ -191,7 +237,23 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
|
||||
switch (psu_type) {
|
||||
case PSU_TYPE_AC_F2B:
|
||||
case PSU_TYPE_AC_B2F:
|
||||
ret = psu_ym2651y_info_get(info);
|
||||
info->caps = ONLP_PSU_CAPS_AC;
|
||||
ret = psu_ym2651_info_get(info);
|
||||
break;
|
||||
case PSU_TYPE_DC_48V_F2B:
|
||||
case PSU_TYPE_DC_48V_B2F:
|
||||
info->caps = ONLP_PSU_CAPS_DC48;
|
||||
ret = psu_ym2651_info_get(info);
|
||||
break;
|
||||
case PSU_TYPE_DC_12V_F2B:
|
||||
case PSU_TYPE_DC_12V_B2F:
|
||||
case PSU_TYPE_DC_12V_FANLESS:
|
||||
ret = psu_dc12v_750_info_get(info);
|
||||
break;
|
||||
case PSU_TYPE_UNKNOWN: /* User insert a unknown PSU or unplugged.*/
|
||||
info->status |= ONLP_PSU_STATUS_UNPLUGGED;
|
||||
info->status &= ~ONLP_PSU_STATUS_FAILED;
|
||||
ret = ONLP_STATUS_OK;
|
||||
break;
|
||||
default:
|
||||
ret = ONLP_STATUS_E_UNSUPPORTED;
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#
|
||||
############################################################
|
||||
import argparse
|
||||
import yaml
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
@@ -30,6 +31,7 @@ def setkeypath(d, kvt):
|
||||
ap=argparse.ArgumentParser(description="Simple JSON Generator.")
|
||||
|
||||
ap.add_argument("--kj", nargs=2, metavar=('KEY', 'FILE|STR'), help="Add json data.")
|
||||
ap.add_argument("--ky", nargs=2, metavar=('KEY', 'FILE|STR'), help="Add yaml jdata.")
|
||||
ap.add_argument("--kv", nargs=2, metavar=('KEY', 'VALUE'), help="Add key/value pair.")
|
||||
ap.add_argument("--kl", nargs='+', metavar=('KEY', 'ENTRY'), help="Add key/list pair.")
|
||||
ap.add_argument("--out", metavar='FILENAME', help="Write output to the given file. The default is stdout")
|
||||
@@ -48,6 +50,14 @@ if ops.kj:
|
||||
v = json.loads(j)
|
||||
setkeypath(g_data, (k, v))
|
||||
|
||||
if ops.ky:
|
||||
(k, y) = ops.ky
|
||||
if os.path.exists(y):
|
||||
v = yaml.load(open(y))
|
||||
else:
|
||||
v = yaml.load(y)
|
||||
setkeypath(g_data, (k, v))
|
||||
|
||||
if ops.kv:
|
||||
setkeypath(g_data, ops.kv)
|
||||
|
||||
@@ -63,4 +73,3 @@ if ops.out and ops.out not in ['-', 'stdout']:
|
||||
json.dump(g_data, out, indent=ops.indent)
|
||||
if not ops.no_nl:
|
||||
out.write('\n')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user