diff --git a/packages/base/any/kernels/modules/ym2651y.c b/packages/base/any/kernels/modules/ym2651y.c index 8e8cc540..224137b2 100644 --- a/packages/base/any/kernels/modules/ym2651y.c +++ b/packages/base/any/kernels/modules/ym2651y.c @@ -32,6 +32,7 @@ #include #include #include +#include #define MAX_FAN_DUTY_CYCLE 100 #define I2C_RW_RETRY_COUNT 10 @@ -62,6 +63,9 @@ struct ym2651y_data { u16 status_word; /* Register value */ u8 fan_fault; /* Register value */ u8 over_temp; /* Register value */ + u16 v_in; /* Register value */ + u16 i_in; /* Register value */ + u16 p_in; /* Register value */ u16 v_out; /* Register value */ u16 i_out; /* Register value */ u16 p_out; /* Register value */ @@ -110,6 +114,9 @@ enum ym2651y_sysfs_attributes { PSU_FAN1_FAULT, PSU_FAN_DIRECTION, PSU_OVER_TEMP, + PSU_V_IN, + PSU_I_IN, + PSU_P_IN, PSU_V_OUT, PSU_I_OUT, PSU_P_OUT, @@ -138,6 +145,9 @@ 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_in, S_IRUGO, show_linear, NULL, PSU_V_IN); +static SENSOR_DEVICE_ATTR(psu_i_in, S_IRUGO, show_linear, NULL, PSU_I_IN); +static SENSOR_DEVICE_ATTR(psu_p_in, S_IRUGO, show_linear, NULL, PSU_P_IN); 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); @@ -152,8 +162,8 @@ static SENSOR_DEVICE_ATTR(psu_mfr_revision, S_IRUGO, show_ascii, NULL, PSU_MFR_R static SENSOR_DEVICE_ATTR(psu_mfr_serial, S_IRUGO, show_ascii, NULL, PSU_MFR_SERIAL); static SENSOR_DEVICE_ATTR(psu_mfr_vin_min, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MIN); static SENSOR_DEVICE_ATTR(psu_mfr_vin_max, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_vout_min, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MIN); -static SENSOR_DEVICE_ATTR(psu_mfr_vout_max, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MAX); +static SENSOR_DEVICE_ATTR(psu_mfr_vout_min, S_IRUGO, show_vout, NULL, PSU_MFR_VOUT_MIN); +static SENSOR_DEVICE_ATTR(psu_mfr_vout_max, S_IRUGO, show_vout, NULL, PSU_MFR_VOUT_MAX); static SENSOR_DEVICE_ATTR(psu_mfr_iin_max, S_IRUGO, show_linear, NULL, PSU_MFR_IIN_MAX); static SENSOR_DEVICE_ATTR(psu_mfr_iout_max, S_IRUGO, show_linear, NULL, PSU_MFR_IOUT_MAX); static SENSOR_DEVICE_ATTR(psu_mfr_pin_max, S_IRUGO, show_linear, NULL, PSU_MFR_PIN_MAX); @@ -165,6 +175,9 @@ static struct attribute *ym2651y_attributes[] = { &sensor_dev_attr_psu_power_good.dev_attr.attr, &sensor_dev_attr_psu_fan1_fault.dev_attr.attr, &sensor_dev_attr_psu_over_temp.dev_attr.attr, + &sensor_dev_attr_psu_v_in.dev_attr.attr, + &sensor_dev_attr_psu_i_in.dev_attr.attr, + &sensor_dev_attr_psu_p_in.dev_attr.attr, &sensor_dev_attr_psu_v_out.dev_attr.attr, &sensor_dev_attr_psu_i_out.dev_attr.attr, &sensor_dev_attr_psu_p_out.dev_attr.attr, @@ -223,6 +236,8 @@ static ssize_t show_word(struct device *dev, struct device_attribute *da, case PSU_POWER_GOOD: /* psu_power_good, high byte bit 3 of status_word, 0=>OK, 1=>FAIL */ status = (data->status_word & 0x800) ? 0 : 1; break; + default: + return 0; } return sprintf(buf, "%d\n", status); @@ -266,16 +281,36 @@ static ssize_t show_linear(struct device *dev, struct device_attribute *da, { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ym2651y_data *data = ym2651y_update_device(dev); + u8 *ptr = NULL; u16 value = 0; int exponent, mantissa; int multiplier = 1000; + ptr = data->mfr_model + 1; /* The first byte is the count byte of string. */ if (!data->valid) { return 0; } switch (attr->index) { + case PSU_V_IN: + if ((strncmp(ptr, "DPS-850A", strlen("DPS-850A")) == 0)|| + (strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0)) { + value = data->v_in; + } + break; + case PSU_I_IN: + if ((strncmp(ptr, "DPS-850A", strlen("DPS-850A")) == 0)|| + (strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0)) { + value = data->i_in; + } + break; + case PSU_P_IN: + if ((strncmp(ptr, "DPS-850A", strlen("DPS-850A")) == 0)|| + (strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0)) { + value = data->p_in; + } + break; case PSU_V_OUT: value = data->v_out; break; @@ -320,6 +355,8 @@ static ssize_t show_linear(struct device *dev, struct device_attribute *da, case PSU_MFR_IIN_MAX: value = data->mfr_iin_max; break; + default: + return 0; } exponent = two_complement_to_int(value >> 11, 5, 0x1f); @@ -394,6 +431,7 @@ static ssize_t show_ascii(struct device *dev, struct device_attribute *da, static ssize_t show_vout_by_mode(struct device *dev, struct device_attribute *da, char *buf) { + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ym2651y_data *data = ym2651y_update_device(dev); int exponent, mantissa; int multiplier = 1000; @@ -403,7 +441,19 @@ static ssize_t show_vout_by_mode(struct device *dev, struct device_attribute *da } exponent = two_complement_to_int(data->vout_mode, 5, 0x1f); - mantissa = data->v_out; + switch (attr->index) { + case PSU_MFR_VOUT_MIN: + mantissa = data->mfr_vout_min; + break; + case PSU_MFR_VOUT_MAX: + mantissa = data->mfr_vout_max; + break; + case PSU_V_OUT: + mantissa = data->v_out; + break; + default: + return 0; + } return (exponent > 0) ? sprintf(buf, "%d\n", (mantissa << exponent) * multiplier) : sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); @@ -414,12 +464,19 @@ static ssize_t show_vout(struct device *dev, struct device_attribute *da, { struct i2c_client *client = to_i2c_client(dev); struct ym2651y_data *data = i2c_get_clientdata(client); + u8 *ptr = NULL; + ptr = data->mfr_model + 1; /* The first byte is the count byte of string. */ if (data->chip == YM2401) { return show_vout_by_mode(dev, da, buf); } - - return show_linear(dev, da, buf); + else if ((strncmp(ptr, "DPS-850A", strlen("DPS-850A")) == 0)|| + (strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0)) { + return show_vout_by_mode(dev, da, buf); + } + else { + return show_linear(dev, da, buf); + } } static const struct attribute_group ym2651y_group = { @@ -612,8 +669,11 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev) {0x81, &data->fan_fault}, {0x98, &data->pmbus_revision}}; struct reg_data_word regs_word[] = { {0x79, &data->status_word}, + {0x88, &data->v_in}, {0x8b, &data->v_out}, + {0x89, &data->i_in}, {0x8c, &data->i_out}, + {0x97, &data->p_in}, {0x96, &data->p_out}, {0x8d, &data->temp}, {0x3b, &(data->fan_duty_cycle[0])}, @@ -751,4 +811,3 @@ MODULE_LICENSE("GPL"); module_init(ym2651y_init); module_exit(ym2651y_exit); - diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/onlp/builds/src/module/src/platform_lib.c b/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/onlp/builds/src/module/src/platform_lib.c index 52c64d94..209193b7 100755 --- a/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/onlp/builds/src/module/src/platform_lib.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/onlp/builds/src/module/src/platform_lib.c @@ -32,6 +32,7 @@ #define PSU_MODEL_NAME_LEN 8 #define PSU_SERIAL_NUMBER_LEN 18 #define PSU_NODE_MAX_PATH_LEN 64 +#define PSU_FAN_DIR_LEN 3 int psu_serial_number_get(int id, char *serial, int serial_len) { @@ -60,6 +61,7 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) int ret = ONLP_STATUS_OK; char model[PSU_MODEL_NAME_LEN + 1] = {0}; char *prefix = NULL; + char fan_dir[PSU_FAN_DIR_LEN + 1] = {0}; if (modelname && modelname_len < PSU_MODEL_NAME_LEN) { return PSU_TYPE_UNKNOWN; @@ -89,11 +91,51 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) } if (strncmp(model, "DPS-850A", strlen("DPS-850A")) == 0) { - return PSU_TYPE_AC_DPS850_F2B; + prefix = (id == PSU1_ID) ? PSU1_AC_PMBUS_PREFIX : PSU2_AC_PMBUS_PREFIX; + ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); + if (ret != ONLP_STATUS_OK || value != PSU_FAN_DIR_LEN) { + return PSU_TYPE_UNKNOWN; + } + + if (strncmp(fan_dir, "F2B", strlen("F2B")) == 0) { + return PSU_TYPE_AC_DPS850_F2B; + } + + if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) { + return PSU_TYPE_AC_DPS850_B2F; + } } if (strncmp(model, "YM-2851F", strlen("YM-2851F")) == 0) { - return PSU_TYPE_AC_YM2851_F2B; + prefix = (id == PSU1_ID) ? PSU1_AC_PMBUS_PREFIX : PSU2_AC_PMBUS_PREFIX; + ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); + if (ret != ONLP_STATUS_OK || value != PSU_FAN_DIR_LEN) { + return PSU_TYPE_UNKNOWN; + } + + if (strncmp(fan_dir, "F2B", strlen("F2B")) == 0) { + return PSU_TYPE_AC_YM2851_F2B; + } + + if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) { + return PSU_TYPE_AC_YM2851_B2F; + } + } + + if (strncmp(model, "YM-2851J", strlen("YM-2851J")) == 0) { + prefix = (id == PSU1_ID) ? PSU1_AC_PMBUS_PREFIX : PSU2_AC_PMBUS_PREFIX; + ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); + if (ret != ONLP_STATUS_OK || value != PSU_FAN_DIR_LEN) { + return PSU_TYPE_UNKNOWN; + } + + if (strncmp(fan_dir, "F2B", strlen("F2B")) == 0) { + return PSU_TYPE_AC_YM2851_F2B; + } + + if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) { + return PSU_TYPE_AC_YM2851_B2F; + } } return PSU_TYPE_UNKNOWN; diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/onlp/builds/src/module/src/psui.c b/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/onlp/builds/src/module/src/psui.c index f0390173..c40e840e 100755 --- a/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/onlp/builds/src/module/src/psui.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/onlp/builds/src/module/src/psui.c @@ -60,21 +60,56 @@ psu_ym2651y_info_get(onlp_psu_info_t* info) /* 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); + + if (strncmp(info->model, "YM-2851J", strlen("YM-2851J")) == 0) { + + /* Read voltage, current and power */ + if (psu_dps850_pmbus_info_get(index, "psu_v_out", &val) == 0) { + info->mvout = val; + info->caps |= ONLP_PSU_CAPS_VOUT; + } - /* Read voltage, current and power */ - if (psu_ym2651y_pmbus_info_get(index, "psu_v_out", &val) == 0) { - info->mvout = val; - info->caps |= ONLP_PSU_CAPS_VOUT; - } + if (psu_dps850_pmbus_info_get(index, "psu_v_in", &val) == 0) { + info->mvin = val; + info->caps |= ONLP_PSU_CAPS_VIN; + } - if (psu_ym2651y_pmbus_info_get(index, "psu_i_out", &val) == 0) { - info->miout = val; - info->caps |= ONLP_PSU_CAPS_IOUT; - } + if (psu_dps850_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) { - info->mpout = val; - info->caps |= ONLP_PSU_CAPS_POUT; + if (psu_dps850_pmbus_info_get(index, "psu_i_in", &val) == 0) { + info->caps |= ONLP_PSU_CAPS_IIN; + } + + if (psu_dps850_pmbus_info_get(index, "psu_p_out", &val) == 0) { + info->mpout = val; + info->caps |= ONLP_PSU_CAPS_POUT; + } + + if (psu_dps850_pmbus_info_get(index, "psu_p_in", &val) == 0) { + info->mpin = val; + info->caps |= ONLP_PSU_CAPS_PIN; + } + } + else { + + /* Read voltage, current and power */ + if (psu_ym2651y_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) { + info->miout = val; + info->caps |= ONLP_PSU_CAPS_IOUT; + } + + if (psu_ym2651y_pmbus_info_get(index, "psu_p_out", &val) == 0) { + info->mpout = val; + info->caps |= ONLP_PSU_CAPS_POUT; + } } psu_serial_number_get(index, info->serial, sizeof(info->serial)); diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/platform-config/r0/src/python/x86_64_accton_as7816_64x_r0/__init__.py b/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/platform-config/r0/src/python/x86_64_accton_as7816_64x_r0/__init__.py index accf55b5..364fe6e1 100755 --- a/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/platform-config/r0/src/python/x86_64_accton_as7816_64x_r0/__init__.py +++ b/packages/platforms/accton/x86-64/x86-64-accton-as7816-64x/platform-config/r0/src/python/x86_64_accton_as7816_64x_r0/__init__.py @@ -6,16 +6,10 @@ class OnlPlatform_x86_64_accton_as7816_64x_r0(OnlPlatformAccton, PLATFORM='x86-64-accton-as7816-64x-r0' MODEL="AS7816-64x" SYS_OBJECT_ID=".7816.64" - PSU1_MODEL="/sys/bus/i2c/devices/i2c-10/10-005b/psu_mfr_model" - PSU2_MODEL="/sys/bus/i2c/devices/i2c-9/9-0058/psu_mfr_model" - PSU1_POWER="/sys/bus/i2c/devices/i2c-19/19-0060/psu1_power_good" - PSU2_POWER="/sys/bus/i2c/devices/i2c-19/19-0060/psu2_power_good" - def baseconfig(self): self.insmod('optoe') self.insmod('ym2651y') - self.insmod('dps850') self.insmod('accton_i2c_cpld') for m in [ 'fan', 'cpld1', 'leds' ]: self.insmod("x86-64-accton-as7816-64x-%s.ko" % m) @@ -32,13 +26,11 @@ class OnlPlatform_x86_64_accton_as7816_64x_r0(OnlPlatformAccton, # initiate PSU-1 ('24c02', 0x53, 10), - ('dps850', 0x5b, 10), - #('ym2851', 0x5b, 10), + ('ym2851', 0x5b, 10), # initiate PSU-2 ('24c02', 0x50, 9), - ('dps850', 0x58, 9), - #('ym2851', 0x58, 9), + ('ym2851', 0x58, 9), # initiate chassis fan ('as7816_64x_fan', 0x68, 17), @@ -200,40 +192,5 @@ class OnlPlatform_x86_64_accton_as7816_64x_r0(OnlPlatformAccton, subprocess.call('echo port50 > /sys/bus/i2c/devices/86-0050/port_name', shell=True) subprocess.call('echo port51 > /sys/bus/i2c/devices/87-0050/port_name', shell=True) subprocess.call('echo port52 > /sys/bus/i2c/devices/88-0050/port_name', shell=True) - - PSU_DELTA="DPS-850" - PSU_3Y= "YM-2851F" - if os.path.exists(self.PSU2_POWER): - with open(self.PSU2_POWER, 'r') as fd: - val=int(fd.read()) - if val==1: - if os.path.exists(self.PSU2_MODEL): - with open(self.PSU2_MODEL, 'r') as fd: - f=open(self.PSU2_MODEL) - val_str=f.read() - if int(val_str.find(PSU_3Y))== 0: - subprocess.call('echo 0x58 > /sys/bus/i2c/devices/i2c-9/delete_device', shell=True) - subprocess.call('echo 0x5b > /sys/bus/i2c/devices/i2c-10/delete_device', shell=True) - self.new_i2c_devices([ - ('ym2851', 0x58, 9), - ('ym2851', 0x5b, 10), - ]) - return True - if os.path.exists(self.PSU1_POWER): - with open(self.PSU1_POWER, 'r') as fd: - val=int(fd.read()) - if val==1: - if os.path.exists(self.PSU1_MODEL): - with open(self.PSU1_MODEL, 'r') as fd: - f=open(self.PSU1_MODEL) - val_str=f.read() - if int(val_str.find(PSU_3Y))== 0: - subprocess.call('echo 0x58 > /sys/bus/i2c/devices/i2c-9/delete_device', shell=True) - subprocess.call('echo 0x5b > /sys/bus/i2c/devices/i2c-10/delete_device', shell=True) - self.new_i2c_devices([ - ('ym2851', 0x58, 9), - ('ym2851', 0x5b, 10), - ]) - return True - + return True