From 755b4966ef332cec214f195558803771b3eda887 Mon Sep 17 00:00:00 2001 From: Alex Lai Date: Wed, 4 Feb 2026 09:11:42 +0000 Subject: [PATCH] [Accton][as7946-74xkb][as7946-30xb] Add unplugged psu's fan & thermal info in onlpdump 1. modify psu.c because newer openbmc fw only returns one psu thermal data for the Get PSU Data ipmi cmd 2. clear the capability of the unplugged psu 3. show the unplugged psu's fan & thermal info 4. show failed for the unplugged psu's fan & thermal sensors (its power good sysfs is equal to 0) Signed-off-by: Alex Lai --- .../builds/x86-64-accton-as7946-30xb-psu.c | 26 -------- .../module/src/fani.c | 41 ++++-------- .../module/src/platform_lib.c | 63 +++++++++++++++++++ .../module/src/platform_lib.h | 26 ++++++-- .../module/src/psui.c | 62 +++++------------- .../module/src/thermali.c | 39 ++++++------ .../builds/x86-64-accton-as7946-74xkb-psu.c | 26 -------- .../module/src/fani.c | 41 ++++-------- .../module/src/platform_lib.c | 63 +++++++++++++++++++ .../module/src/platform_lib.h | 26 ++++++-- .../module/src/psui.c | 53 +++++----------- .../module/src/thermali.c | 39 ++++++------ 12 files changed, 266 insertions(+), 239 deletions(-) create mode 100644 packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/platform_lib.c create mode 100644 packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/platform_lib.c diff --git a/packages/platforms/accton/x86-64/as7946-30xb/modules/builds/x86-64-accton-as7946-30xb-psu.c b/packages/platforms/accton/x86-64/as7946-30xb/modules/builds/x86-64-accton-as7946-30xb-psu.c index cae7c50a5d..a074867577 100644 --- a/packages/platforms/accton/x86-64/as7946-30xb/modules/builds/x86-64-accton-as7946-30xb-psu.c +++ b/packages/platforms/accton/x86-64/as7946-30xb/modules/builds/x86-64-accton-as7946-30xb-psu.c @@ -85,10 +85,6 @@ enum psu_data_index { PSU_POUT3, PSU_TEMP1_0, PSU_TEMP1_1, - PSU_TEMP2_0, - PSU_TEMP2_1, - PSU_TEMP3_0, - PSU_TEMP3_1, PSU_FAN0, PSU_FAN1, PSU_VOUT_MODE, @@ -153,8 +149,6 @@ static struct platform_driver as7946_30xb_psu_driver = { #define PSU_MODEL_ATTR_ID(index) PSU##index##_MODEL #define PSU_SERIAL_ATTR_ID(index) PSU##index##_SERIAL #define PSU_TEMP1_INPUT_ATTR_ID(index) PSU##index##_TEMP1_INPUT -#define PSU_TEMP2_INPUT_ATTR_ID(index) PSU##index##_TEMP2_INPUT -#define PSU_TEMP3_INPUT_ATTR_ID(index) PSU##index##_TEMP3_INPUT #define PSU_FAN_INPUT_ATTR_ID(index) PSU##index##_FAN_INPUT #define PSU_FAN_DIR_ATTR_ID(index) PSU##index##_FAN_DIR @@ -170,8 +164,6 @@ static struct platform_driver as7946_30xb_psu_driver = { PSU_MODEL_ATTR_ID(psu_id), \ PSU_SERIAL_ATTR_ID(psu_id), \ PSU_TEMP1_INPUT_ATTR_ID(psu_id), \ - PSU_TEMP2_INPUT_ATTR_ID(psu_id), \ - PSU_TEMP3_INPUT_ATTR_ID(psu_id), \ PSU_FAN_INPUT_ATTR_ID(psu_id), \ PSU_FAN_DIR_ATTR_ID(psu_id) @@ -207,10 +199,6 @@ enum as7946_30xb_psu_sysfs_attrs { PSU##index##_SERIAL);\ static SENSOR_DEVICE_ATTR(psu##index##_temp1_input, S_IRUGO, show_psu, NULL,\ PSU##index##_TEMP1_INPUT); \ - static SENSOR_DEVICE_ATTR(psu##index##_temp2_input, S_IRUGO, show_psu, NULL,\ - PSU##index##_TEMP2_INPUT); \ - static SENSOR_DEVICE_ATTR(psu##index##_temp3_input, S_IRUGO, show_psu, NULL,\ - PSU##index##_TEMP3_INPUT); \ static SENSOR_DEVICE_ATTR(psu##index##_fan1_input, S_IRUGO, show_psu, NULL,\ PSU##index##_FAN_INPUT); \ static SENSOR_DEVICE_ATTR(psu##index##_fan_dir, S_IRUGO, show_string, NULL,\ @@ -228,8 +216,6 @@ enum as7946_30xb_psu_sysfs_attrs { &sensor_dev_attr_psu##index##_model.dev_attr.attr, \ &sensor_dev_attr_psu##index##_serial.dev_attr.attr,\ &sensor_dev_attr_psu##index##_temp1_input.dev_attr.attr, \ - &sensor_dev_attr_psu##index##_temp2_input.dev_attr.attr, \ - &sensor_dev_attr_psu##index##_temp3_input.dev_attr.attr, \ &sensor_dev_attr_psu##index##_fan1_input.dev_attr.attr, \ &sensor_dev_attr_psu##index##_fan_dir.dev_attr.attr @@ -549,18 +535,6 @@ static ssize_t show_psu(struct device *dev, struct device_attribute *da, value = ((u32)data->ipmi_resp[pid].status[PSU_TEMP1_0] | (u32)data->ipmi_resp[pid].status[PSU_TEMP1_1] << 8); break; - case PSU1_TEMP2_INPUT: - case PSU2_TEMP2_INPUT: - VALIDATE_PRESENT_RETURN(pid); - value = ((u32)data->ipmi_resp[pid].status[PSU_TEMP2_0] | - (u32)data->ipmi_resp[pid].status[PSU_TEMP2_1] << 8); - break; - case PSU1_TEMP3_INPUT: - case PSU2_TEMP3_INPUT: - VALIDATE_PRESENT_RETURN(pid); - value = ((u32)data->ipmi_resp[pid].status[PSU_TEMP3_0] | - (u32)data->ipmi_resp[pid].status[PSU_TEMP3_1] << 8); - break; case PSU1_FAN_INPUT: case PSU2_FAN_INPUT: VALIDATE_PRESENT_RETURN(pid); diff --git a/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/fani.c b/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/fani.c index e32e9e0039..f1c762e9e7 100644 --- a/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/fani.c +++ b/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/fani.c @@ -62,15 +62,6 @@ enum fan_id { { 0 },\ } -#define AIM_FREE_IF_PTR(p) \ - do \ - { \ - if (p) { \ - aim_free(p); \ - p = NULL; \ - } \ - } while (0) - /* Static fan information */ onlp_fan_info_t finfo[] = { { }, /* Not used */ @@ -169,39 +160,33 @@ _onlp_fani_info_get_fan(int fid, onlp_fan_info_t* info) static int _onlp_fani_info_get_fan_on_psu(int pid, onlp_fan_info_t* info) { - char *fandir = NULL; - int len = 0; int val = 0; - int ret = 0; info->status |= ONLP_FAN_STATUS_PRESENT; + /* Get power good status */ + if (psu_status_info_get(pid, "power_good", &val) == ONLP_STATUS_OK) { + info->status |= (val != PSU_STATUS_POWER_GOOD) ? ONLP_FAN_STATUS_FAILED : 0; + } + /* get fan direction */ - len = onlp_file_read_str(&fandir, "%s""psu%d_fan_dir", PSU_SYSFS_PATH, pid); - if (fandir && len) { - if (strncmp(fandir, "B2F", strlen("B2F")) == 0) { + if (psu_status_info_get(pid, "fan_dir", &val) == ONLP_STATUS_OK) { + if (val == PSU_FAN_B2F) info->status |= ONLP_FAN_STATUS_B2F; - } - else { + else if (val == PSU_FAN_F2B) info->status |= ONLP_FAN_STATUS_F2B; - } } - AIM_FREE_IF_PTR(fandir); /* get fan speed */ - ret = onlp_file_read_int(&val, "%s""psu%d_fan1_input", PSU_SYSFS_PATH, pid); - if (ret < 0) { - AIM_LOG_ERROR("Unable to read status from (%s""psu%d_fan1_input)\r\n", PSU_SYSFS_PATH, pid); - return ONLP_STATUS_E_INTERNAL; + if (psu_status_info_get(pid, "fan1_input", &val) == ONLP_STATUS_OK) { + /* get speed percentage from rpm + */ + info->rpm = val; + info->percentage = (info->rpm * 100)/MAX_PSU_FAN_SPEED; } - /* get speed percentage from rpm - */ - info->rpm = val; - info->percentage = (info->rpm * 100)/MAX_PSU_FAN_SPEED; - return ONLP_STATUS_OK; } diff --git a/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/platform_lib.c b/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/platform_lib.c new file mode 100644 index 0000000000..2a3f6cc135 --- /dev/null +++ b/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/platform_lib.c @@ -0,0 +1,63 @@ +/************************************************************ + * + * + * Copyright 2014 Big Switch Networks, Inc. + * + * Licensed under the Eclipse Public License, Version 1.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.eclipse.org/legal/epl-v10.html + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the + * License. + * + * + ************************************************************ + * + * Platform Library + * + ***********************************************************/ +#include +#include +#include +#include "platform_lib.h" + +int psu_status_info_get(int id, char *node, int *value) +{ + int ret = 0; + int len = 0; + char path[PSU_NODE_MAX_PATH_LEN] = {0}; + char *fandir = NULL; + + *value = 0; + + sprintf(path, "%spsu%d_%s", PSU_SYSFS_PATH, id, node); + + if (strncmp(node, "fan_dir", strlen("fan_dir")) == 0) { + len = onlp_file_read_str(&fandir, "%s", path); + + if (fandir && len) { + if (strncmp(fandir, "B2F", strlen("B2F")) == 0) + *value = PSU_FAN_B2F; + else if (strncmp(fandir, "F2B", strlen("F2B")) == 0) + *value = PSU_FAN_F2B; + + } else { + AIM_LOG_ERROR("Unable to read status from file(%s)\r\n", path); + return ONLP_STATUS_E_INTERNAL; + } + AIM_FREE_IF_PTR(fandir); + } else { + 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; +} diff --git a/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/platform_lib.h b/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/platform_lib.h index b47291fd8e..302c5ff8de 100644 --- a/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/platform_lib.h @@ -31,17 +31,31 @@ #define CHASSIS_FAN_COUNT 5 #define CHASSIS_THERMAL_COUNT 10 -#define CHASSIS_PSU_THERMAL_COUNT 3 +#define CHASSIS_PSU_THERMAL_COUNT 1 #define CHASSIS_LED_COUNT 5 #define CHASSIS_PSU_COUNT 2 #define PSU1_ID 1 #define PSU2_ID 2 +#define PSU_NODE_MAX_PATH_LEN 64 +#define PSU_STATUS_POWER_GOOD 1 + #define PSU_SYSFS_PATH "/sys/devices/platform/as7946_30xb_psu/" #define FAN_BOARD_PATH "/sys/devices/platform/as7946_30xb_fan/" #define IDPROM_PATH "/sys/devices/platform/as7946_30xb_sys/eeprom" +int psu_status_info_get(int id, char *node, int *value); + +#define AIM_FREE_IF_PTR(p) \ + do \ + { \ + if (p) { \ + aim_free(p); \ + p = NULL; \ + } \ + } while (0) + enum onlp_led_id { LED_LOC = 1, LED_DIAG, @@ -50,6 +64,12 @@ enum onlp_led_id { LED_FAN, }; +enum onlp_psu_fan_dir { + PSU_FAN_RESERVED = 0, + PSU_FAN_F2B, + PSU_FAN_B2F, +}; + enum onlp_thermal_id { THERMAL_RESERVED = 0, THERMAL_CPU_CORE, @@ -63,11 +83,7 @@ enum onlp_thermal_id { THERMAL_1_ON_FANCPLD, /* FAN_4D Temp */ THERMAL_2_ON_FANCPLD, /* FAN_4E Temp */ THERMAL_1_ON_PSU1, - THERMAL_2_ON_PSU1, - THERMAL_3_ON_PSU1, THERMAL_1_ON_PSU2, - THERMAL_2_ON_PSU2, - THERMAL_3_ON_PSU2, }; #endif /* __PLATFORM_LIB_H__ */ diff --git a/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/psui.c b/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/psui.c index 284f06064a..9748e68dbd 100644 --- a/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/psui.c +++ b/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/psui.c @@ -37,15 +37,6 @@ } \ } while(0) -#define AIM_FREE_IF_PTR(p) \ - do \ - { \ - if (p) { \ - aim_free(p); \ - p = NULL; \ - } \ - } while (0) - int onlp_psui_init(void) { @@ -109,20 +100,9 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) } info->status |= ONLP_PSU_STATUS_PRESENT; - /* Get power good status */ - ret = onlp_file_read_int(&val, "%s""psu%d_power_good", PSU_SYSFS_PATH, pid); - if (ret < 0) { - AIM_LOG_ERROR("Unable to read status from (%s""psu%d_power_good)\r\n", PSU_SYSFS_PATH, pid); - return ONLP_STATUS_E_INTERNAL; - } - - if (val != PSU_STATUS_POWER_GOOD) { - info->status |= ONLP_PSU_STATUS_FAILED; - } - - if (info->status & ONLP_PSU_STATUS_FAILED) { - return ONLP_STATUS_OK; - } + /* Set the associated oid_table */ + info->hdr.coids[0] = ONLP_FAN_ID_CREATE(pid + CHASSIS_FAN_COUNT); + info->hdr.coids[1] = ONLP_THERMAL_ID_CREATE(((pid-1) * CHASSIS_PSU_THERMAL_COUNT) + THERMAL_1_ON_PSU1); /* Read voltage, current and power */ val = 0; @@ -161,26 +141,6 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) info->caps |= ONLP_PSU_CAPS_POUT; } - /* Set the associated oid_table */ - val = 0; - if (onlp_file_read_int(&val, "%s""psu%d_fan1_input", PSU_SYSFS_PATH, pid) == 0 && val) { - info->hdr.coids[0] = ONLP_FAN_ID_CREATE(pid + CHASSIS_FAN_COUNT); - } - - val = 0; - if (onlp_file_read_int(&val, "%s""psu%d_temp1_input", PSU_SYSFS_PATH, pid) == 0 && val) { - info->hdr.coids[1] = ONLP_THERMAL_ID_CREATE(((pid-1) * CHASSIS_PSU_THERMAL_COUNT) + THERMAL_1_ON_PSU1); - } - - val = 0; - if (onlp_file_read_int(&val, "%s""psu%d_temp2_input", PSU_SYSFS_PATH, pid) == 0 && val) { - info->hdr.coids[2] = ONLP_THERMAL_ID_CREATE(((pid-1) * CHASSIS_PSU_THERMAL_COUNT) + THERMAL_2_ON_PSU1); - } - - val = 0; - if (onlp_file_read_int(&val, "%s""psu%d_temp3_input", PSU_SYSFS_PATH, pid) == 0 && val) { - info->hdr.coids[3] = ONLP_THERMAL_ID_CREATE(((pid-1) * CHASSIS_PSU_THERMAL_COUNT) + THERMAL_3_ON_PSU1); - } /* Read model */ char *string = NULL; int len = onlp_file_read_str(&string, "%s""psu%d_model", PSU_SYSFS_PATH, pid); @@ -190,6 +150,9 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) } AIM_FREE_IF_PTR(string); + /* Set capability */ + info->caps |= get_DCorAC_cap(info->model); + /* Read serial */ len = onlp_file_read_str(&string, "%s""psu%d_serial", PSU_SYSFS_PATH, pid); if (string && len) { @@ -198,8 +161,17 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) } AIM_FREE_IF_PTR(string); - /* Set capability */ - info->caps |= get_DCorAC_cap(info->model); + /* Get power good status */ + ret = onlp_file_read_int(&val, "%s""psu%d_power_good", PSU_SYSFS_PATH, pid); + if (ret < 0) { + AIM_LOG_ERROR("Unable to read status from (%s""psu%d_power_good)\r\n", PSU_SYSFS_PATH, pid); + return ONLP_STATUS_E_INTERNAL; + } + + if (val != PSU_STATUS_POWER_GOOD) { + info->status |= ONLP_PSU_STATUS_UNPLUGGED; + info->caps = 0; + } return ret; } diff --git a/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/thermali.c b/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/thermali.c index afbf7711d7..2d6d45bbe5 100644 --- a/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/thermali.c +++ b/packages/platforms/accton/x86-64/as7946-30xb/onlp/builds/x86_64_accton_as7946_30xb/module/src/thermali.c @@ -47,11 +47,7 @@ static char* ipmi_devfiles__[] = { /* must map with onlp_thermal_id */ "/sys/devices/platform/as7946_30xb_thermal/temp8_input", "/sys/devices/platform/as7946_30xb_thermal/temp9_input", "/sys/devices/platform/as7946_30xb_psu/psu1_temp1_input", - "/sys/devices/platform/as7946_30xb_psu/psu1_temp2_input", - "/sys/devices/platform/as7946_30xb_psu/psu1_temp3_input", "/sys/devices/platform/as7946_30xb_psu/psu2_temp1_input", - "/sys/devices/platform/as7946_30xb_psu/psu2_temp2_input", - "/sys/devices/platform/as7946_30xb_psu/psu2_temp3_input", }; static char* cpu_coretemp_files[] = { @@ -121,26 +117,10 @@ static onlp_thermal_info_t linfo[] = { ONLP_THERMAL_STATUS_PRESENT, AS7946_30XB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS }, - { { ONLP_THERMAL_ID_CREATE(THERMAL_2_ON_PSU1), "PSU-1 Thermal Sensor 2", ONLP_PSU_ID_CREATE(PSU1_ID), {0} }, - ONLP_THERMAL_STATUS_PRESENT, - AS7946_30XB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(THERMAL_3_ON_PSU1), "PSU-1 Thermal Sensor 3", ONLP_PSU_ID_CREATE(PSU1_ID), {0} }, - ONLP_THERMAL_STATUS_PRESENT, - AS7946_30XB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, { { ONLP_THERMAL_ID_CREATE(THERMAL_1_ON_PSU2), "PSU-2 Thermal Sensor 1", ONLP_PSU_ID_CREATE(PSU2_ID), {0} }, ONLP_THERMAL_STATUS_PRESENT, AS7946_30XB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS }, - { { ONLP_THERMAL_ID_CREATE(THERMAL_2_ON_PSU2), "PSU-2 Thermal Sensor 2", ONLP_PSU_ID_CREATE(PSU2_ID), {0} }, - ONLP_THERMAL_STATUS_PRESENT, - AS7946_30XB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(THERMAL_3_ON_PSU2), "PSU-2 Thermal Sensor 3", ONLP_PSU_ID_CREATE(PSU2_ID), {0} }, - ONLP_THERMAL_STATUS_PRESENT, - AS7946_30XB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, }; /* @@ -166,6 +146,9 @@ int onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info) { int tid; + int psu_id, psu_tid_start = 0; + int val = 0; + int ret = 0; VALIDATE(id); tid = ONLP_OID_ID_GET(id); @@ -178,5 +161,21 @@ onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info) return rv; } + psu_tid_start = CHASSIS_THERMAL_COUNT + 1; + + if (tid >= psu_tid_start) { + psu_id = ( tid <= THERMAL_1_ON_PSU1 ) ? PSU1_ID : PSU2_ID; + /* Get power good status */ + ret = onlp_file_read_int(&val, "%s""psu%d_power_good", PSU_SYSFS_PATH, psu_id); + if (ret < 0) { + AIM_LOG_ERROR("Unable to read status from (%s""psu%d_power_good)\r\n", PSU_SYSFS_PATH, psu_id); + return ONLP_STATUS_E_INTERNAL; + } + + if(val != PSU_STATUS_POWER_GOOD) { + info->status |= ONLP_THERMAL_STATUS_FAILED; + } + } + return onlp_file_read_int(&info->mcelsius, ipmi_devfiles__[tid]); } diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-psu.c b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-psu.c index ce6202566e..75b25fa1df 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-psu.c +++ b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-psu.c @@ -85,10 +85,6 @@ enum psu_data_index { PSU_POUT3, PSU_TEMP1_0, PSU_TEMP1_1, - PSU_TEMP2_0, - PSU_TEMP2_1, - PSU_TEMP3_0, - PSU_TEMP3_1, PSU_FAN0, PSU_FAN1, PSU_VOUT_MODE, @@ -153,8 +149,6 @@ static struct platform_driver as7946_74xkb_psu_driver = { #define PSU_MODEL_ATTR_ID(index) PSU##index##_MODEL #define PSU_SERIAL_ATTR_ID(index) PSU##index##_SERIAL #define PSU_TEMP1_INPUT_ATTR_ID(index) PSU##index##_TEMP1_INPUT -#define PSU_TEMP2_INPUT_ATTR_ID(index) PSU##index##_TEMP2_INPUT -#define PSU_TEMP3_INPUT_ATTR_ID(index) PSU##index##_TEMP3_INPUT #define PSU_FAN_INPUT_ATTR_ID(index) PSU##index##_FAN_INPUT #define PSU_FAN_DIR_ATTR_ID(index) PSU##index##_FAN_DIR @@ -170,8 +164,6 @@ static struct platform_driver as7946_74xkb_psu_driver = { PSU_MODEL_ATTR_ID(psu_id), \ PSU_SERIAL_ATTR_ID(psu_id), \ PSU_TEMP1_INPUT_ATTR_ID(psu_id), \ - PSU_TEMP2_INPUT_ATTR_ID(psu_id), \ - PSU_TEMP3_INPUT_ATTR_ID(psu_id), \ PSU_FAN_INPUT_ATTR_ID(psu_id), \ PSU_FAN_DIR_ATTR_ID(psu_id) @@ -207,10 +199,6 @@ enum as7946_74xkb_psu_sysfs_attrs { PSU##index##_SERIAL);\ static SENSOR_DEVICE_ATTR(psu##index##_temp1_input, S_IRUGO, show_psu, NULL,\ PSU##index##_TEMP1_INPUT); \ - static SENSOR_DEVICE_ATTR(psu##index##_temp2_input, S_IRUGO, show_psu, NULL,\ - PSU##index##_TEMP2_INPUT); \ - static SENSOR_DEVICE_ATTR(psu##index##_temp3_input, S_IRUGO, show_psu, NULL,\ - PSU##index##_TEMP3_INPUT); \ static SENSOR_DEVICE_ATTR(psu##index##_fan1_input, S_IRUGO, show_psu, NULL,\ PSU##index##_FAN_INPUT); \ static SENSOR_DEVICE_ATTR(psu##index##_fan_dir, S_IRUGO, show_string, NULL,\ @@ -228,8 +216,6 @@ enum as7946_74xkb_psu_sysfs_attrs { &sensor_dev_attr_psu##index##_model.dev_attr.attr, \ &sensor_dev_attr_psu##index##_serial.dev_attr.attr,\ &sensor_dev_attr_psu##index##_temp1_input.dev_attr.attr, \ - &sensor_dev_attr_psu##index##_temp2_input.dev_attr.attr, \ - &sensor_dev_attr_psu##index##_temp3_input.dev_attr.attr, \ &sensor_dev_attr_psu##index##_fan1_input.dev_attr.attr, \ &sensor_dev_attr_psu##index##_fan_dir.dev_attr.attr @@ -549,18 +535,6 @@ static ssize_t show_psu(struct device *dev, struct device_attribute *da, value = ((u32)data->ipmi_resp[pid].status[PSU_TEMP1_0] | (u32)data->ipmi_resp[pid].status[PSU_TEMP1_1] << 8); break; - case PSU1_TEMP2_INPUT: - case PSU2_TEMP2_INPUT: - VALIDATE_PRESENT_RETURN(pid); - value = ((u32)data->ipmi_resp[pid].status[PSU_TEMP2_0] | - (u32)data->ipmi_resp[pid].status[PSU_TEMP2_1] << 8); - break; - case PSU1_TEMP3_INPUT: - case PSU2_TEMP3_INPUT: - VALIDATE_PRESENT_RETURN(pid); - value = ((u32)data->ipmi_resp[pid].status[PSU_TEMP3_0] | - (u32)data->ipmi_resp[pid].status[PSU_TEMP3_1] << 8); - break; case PSU1_FAN_INPUT: case PSU2_FAN_INPUT: VALIDATE_PRESENT_RETURN(pid); diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/fani.c b/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/fani.c index e32e9e0039..f1c762e9e7 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/fani.c +++ b/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/fani.c @@ -62,15 +62,6 @@ enum fan_id { { 0 },\ } -#define AIM_FREE_IF_PTR(p) \ - do \ - { \ - if (p) { \ - aim_free(p); \ - p = NULL; \ - } \ - } while (0) - /* Static fan information */ onlp_fan_info_t finfo[] = { { }, /* Not used */ @@ -169,39 +160,33 @@ _onlp_fani_info_get_fan(int fid, onlp_fan_info_t* info) static int _onlp_fani_info_get_fan_on_psu(int pid, onlp_fan_info_t* info) { - char *fandir = NULL; - int len = 0; int val = 0; - int ret = 0; info->status |= ONLP_FAN_STATUS_PRESENT; + /* Get power good status */ + if (psu_status_info_get(pid, "power_good", &val) == ONLP_STATUS_OK) { + info->status |= (val != PSU_STATUS_POWER_GOOD) ? ONLP_FAN_STATUS_FAILED : 0; + } + /* get fan direction */ - len = onlp_file_read_str(&fandir, "%s""psu%d_fan_dir", PSU_SYSFS_PATH, pid); - if (fandir && len) { - if (strncmp(fandir, "B2F", strlen("B2F")) == 0) { + if (psu_status_info_get(pid, "fan_dir", &val) == ONLP_STATUS_OK) { + if (val == PSU_FAN_B2F) info->status |= ONLP_FAN_STATUS_B2F; - } - else { + else if (val == PSU_FAN_F2B) info->status |= ONLP_FAN_STATUS_F2B; - } } - AIM_FREE_IF_PTR(fandir); /* get fan speed */ - ret = onlp_file_read_int(&val, "%s""psu%d_fan1_input", PSU_SYSFS_PATH, pid); - if (ret < 0) { - AIM_LOG_ERROR("Unable to read status from (%s""psu%d_fan1_input)\r\n", PSU_SYSFS_PATH, pid); - return ONLP_STATUS_E_INTERNAL; + if (psu_status_info_get(pid, "fan1_input", &val) == ONLP_STATUS_OK) { + /* get speed percentage from rpm + */ + info->rpm = val; + info->percentage = (info->rpm * 100)/MAX_PSU_FAN_SPEED; } - /* get speed percentage from rpm - */ - info->rpm = val; - info->percentage = (info->rpm * 100)/MAX_PSU_FAN_SPEED; - return ONLP_STATUS_OK; } diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/platform_lib.c b/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/platform_lib.c new file mode 100644 index 0000000000..2a3f6cc135 --- /dev/null +++ b/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/platform_lib.c @@ -0,0 +1,63 @@ +/************************************************************ + * + * + * Copyright 2014 Big Switch Networks, Inc. + * + * Licensed under the Eclipse Public License, Version 1.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.eclipse.org/legal/epl-v10.html + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the + * License. + * + * + ************************************************************ + * + * Platform Library + * + ***********************************************************/ +#include +#include +#include +#include "platform_lib.h" + +int psu_status_info_get(int id, char *node, int *value) +{ + int ret = 0; + int len = 0; + char path[PSU_NODE_MAX_PATH_LEN] = {0}; + char *fandir = NULL; + + *value = 0; + + sprintf(path, "%spsu%d_%s", PSU_SYSFS_PATH, id, node); + + if (strncmp(node, "fan_dir", strlen("fan_dir")) == 0) { + len = onlp_file_read_str(&fandir, "%s", path); + + if (fandir && len) { + if (strncmp(fandir, "B2F", strlen("B2F")) == 0) + *value = PSU_FAN_B2F; + else if (strncmp(fandir, "F2B", strlen("F2B")) == 0) + *value = PSU_FAN_F2B; + + } else { + AIM_LOG_ERROR("Unable to read status from file(%s)\r\n", path); + return ONLP_STATUS_E_INTERNAL; + } + AIM_FREE_IF_PTR(fandir); + } else { + 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; +} diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/platform_lib.h b/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/platform_lib.h index 70881a282a..1b89d7767f 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/platform_lib.h @@ -31,17 +31,31 @@ #define CHASSIS_FAN_COUNT 5 #define CHASSIS_THERMAL_COUNT 10 -#define CHASSIS_PSU_THERMAL_COUNT 3 +#define CHASSIS_PSU_THERMAL_COUNT 1 #define CHASSIS_LED_COUNT 5 #define CHASSIS_PSU_COUNT 2 #define PSU1_ID 1 #define PSU2_ID 2 +#define PSU_NODE_MAX_PATH_LEN 64 +#define PSU_STATUS_POWER_GOOD 1 + #define PSU_SYSFS_PATH "/sys/devices/platform/as7946_74xkb_psu/" #define FAN_BOARD_PATH "/sys/devices/platform/as7946_74xkb_fan/" #define IDPROM_PATH "/sys/devices/platform/as7946_74xkb_sys/eeprom" +int psu_status_info_get(int id, char *node, int *value); + +#define AIM_FREE_IF_PTR(p) \ + do \ + { \ + if (p) { \ + aim_free(p); \ + p = NULL; \ + } \ + } while (0) + enum onlp_led_id { LED_LOC = 1, LED_DIAG, @@ -50,6 +64,12 @@ enum onlp_led_id { LED_FAN, }; +enum onlp_psu_fan_dir { + PSU_FAN_RESERVED = 0, + PSU_FAN_F2B, + PSU_FAN_B2F, +}; + enum onlp_thermal_id { THERMAL_RESERVED = 0, THERMAL_CPU_CORE, @@ -63,11 +83,7 @@ enum onlp_thermal_id { THERMAL_1_ON_FANCPLD, /* FAN_4D Temp */ THERMAL_2_ON_FANCPLD, /* FAN_4E Temp */ THERMAL_1_ON_PSU1, - THERMAL_2_ON_PSU1, - THERMAL_3_ON_PSU1, THERMAL_1_ON_PSU2, - THERMAL_2_ON_PSU2, - THERMAL_3_ON_PSU2, }; #endif /* __PLATFORM_LIB_H__ */ diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/psui.c b/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/psui.c index 284f06064a..71f48aea11 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/psui.c +++ b/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/psui.c @@ -109,20 +109,9 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) } info->status |= ONLP_PSU_STATUS_PRESENT; - /* Get power good status */ - ret = onlp_file_read_int(&val, "%s""psu%d_power_good", PSU_SYSFS_PATH, pid); - if (ret < 0) { - AIM_LOG_ERROR("Unable to read status from (%s""psu%d_power_good)\r\n", PSU_SYSFS_PATH, pid); - return ONLP_STATUS_E_INTERNAL; - } - - if (val != PSU_STATUS_POWER_GOOD) { - info->status |= ONLP_PSU_STATUS_FAILED; - } - - if (info->status & ONLP_PSU_STATUS_FAILED) { - return ONLP_STATUS_OK; - } + /* Set the associated oid_table */ + info->hdr.coids[0] = ONLP_FAN_ID_CREATE(pid + CHASSIS_FAN_COUNT); + info->hdr.coids[1] = ONLP_THERMAL_ID_CREATE(((pid-1) * CHASSIS_PSU_THERMAL_COUNT) + THERMAL_1_ON_PSU1); /* Read voltage, current and power */ val = 0; @@ -161,26 +150,6 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) info->caps |= ONLP_PSU_CAPS_POUT; } - /* Set the associated oid_table */ - val = 0; - if (onlp_file_read_int(&val, "%s""psu%d_fan1_input", PSU_SYSFS_PATH, pid) == 0 && val) { - info->hdr.coids[0] = ONLP_FAN_ID_CREATE(pid + CHASSIS_FAN_COUNT); - } - - val = 0; - if (onlp_file_read_int(&val, "%s""psu%d_temp1_input", PSU_SYSFS_PATH, pid) == 0 && val) { - info->hdr.coids[1] = ONLP_THERMAL_ID_CREATE(((pid-1) * CHASSIS_PSU_THERMAL_COUNT) + THERMAL_1_ON_PSU1); - } - - val = 0; - if (onlp_file_read_int(&val, "%s""psu%d_temp2_input", PSU_SYSFS_PATH, pid) == 0 && val) { - info->hdr.coids[2] = ONLP_THERMAL_ID_CREATE(((pid-1) * CHASSIS_PSU_THERMAL_COUNT) + THERMAL_2_ON_PSU1); - } - - val = 0; - if (onlp_file_read_int(&val, "%s""psu%d_temp3_input", PSU_SYSFS_PATH, pid) == 0 && val) { - info->hdr.coids[3] = ONLP_THERMAL_ID_CREATE(((pid-1) * CHASSIS_PSU_THERMAL_COUNT) + THERMAL_3_ON_PSU1); - } /* Read model */ char *string = NULL; int len = onlp_file_read_str(&string, "%s""psu%d_model", PSU_SYSFS_PATH, pid); @@ -190,6 +159,9 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) } AIM_FREE_IF_PTR(string); + /* Set capability */ + info->caps |= get_DCorAC_cap(info->model); + /* Read serial */ len = onlp_file_read_str(&string, "%s""psu%d_serial", PSU_SYSFS_PATH, pid); if (string && len) { @@ -198,8 +170,17 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) } AIM_FREE_IF_PTR(string); - /* Set capability */ - info->caps |= get_DCorAC_cap(info->model); + /* Get power good status */ + ret = onlp_file_read_int(&val, "%s""psu%d_power_good", PSU_SYSFS_PATH, pid); + if (ret < 0) { + AIM_LOG_ERROR("Unable to read status from (%s""psu%d_power_good)\r\n", PSU_SYSFS_PATH, pid); + return ONLP_STATUS_E_INTERNAL; + } + + if (val != PSU_STATUS_POWER_GOOD) { + info->status |= ONLP_PSU_STATUS_UNPLUGGED; + info->caps = 0; + } return ret; } diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/thermali.c b/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/thermali.c index 2a4c6aeb8c..287aae1027 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/thermali.c +++ b/packages/platforms/accton/x86-64/as7946-74xkb/onlp/builds/x86_64_accton_as7946_74xkb/module/src/thermali.c @@ -47,11 +47,7 @@ static char* ipmi_devfiles__[] = { /* must map with onlp_thermal_id */ "/sys/devices/platform/as7946_74xkb_thermal/temp8_input", "/sys/devices/platform/as7946_74xkb_thermal/temp9_input", "/sys/devices/platform/as7946_74xkb_psu/psu1_temp1_input", - "/sys/devices/platform/as7946_74xkb_psu/psu1_temp2_input", - "/sys/devices/platform/as7946_74xkb_psu/psu1_temp3_input", "/sys/devices/platform/as7946_74xkb_psu/psu2_temp1_input", - "/sys/devices/platform/as7946_74xkb_psu/psu2_temp2_input", - "/sys/devices/platform/as7946_74xkb_psu/psu2_temp3_input", }; static char* cpu_coretemp_files[] = { @@ -121,26 +117,10 @@ static onlp_thermal_info_t linfo[] = { ONLP_THERMAL_STATUS_PRESENT, AS7946_74XKB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS }, - { { ONLP_THERMAL_ID_CREATE(THERMAL_2_ON_PSU1), "PSU-1 Thermal Sensor 2", ONLP_PSU_ID_CREATE(PSU1_ID), {0} }, - ONLP_THERMAL_STATUS_PRESENT, - AS7946_74XKB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(THERMAL_3_ON_PSU1), "PSU-1 Thermal Sensor 3", ONLP_PSU_ID_CREATE(PSU1_ID), {0} }, - ONLP_THERMAL_STATUS_PRESENT, - AS7946_74XKB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, { { ONLP_THERMAL_ID_CREATE(THERMAL_1_ON_PSU2), "PSU-2 Thermal Sensor 1", ONLP_PSU_ID_CREATE(PSU2_ID), {0} }, ONLP_THERMAL_STATUS_PRESENT, AS7946_74XKB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS }, - { { ONLP_THERMAL_ID_CREATE(THERMAL_2_ON_PSU2), "PSU-2 Thermal Sensor 2", ONLP_PSU_ID_CREATE(PSU2_ID), {0} }, - ONLP_THERMAL_STATUS_PRESENT, - AS7946_74XKB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(THERMAL_3_ON_PSU2), "PSU-2 Thermal Sensor 3", ONLP_PSU_ID_CREATE(PSU2_ID), {0} }, - ONLP_THERMAL_STATUS_PRESENT, - AS7946_74XKB_PSU_CAPS, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, }; /* @@ -166,6 +146,9 @@ int onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info) { int tid; + int psu_id, psu_tid_start = 0; + int val = 0; + int ret = 0; VALIDATE(id); tid = ONLP_OID_ID_GET(id); @@ -178,5 +161,21 @@ onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info) return rv; } + psu_tid_start = CHASSIS_THERMAL_COUNT + 1; + + if (tid >= psu_tid_start) { + psu_id = ( tid <= THERMAL_1_ON_PSU1 ) ? PSU1_ID : PSU2_ID; + /* Get power good status */ + ret = onlp_file_read_int(&val, "%s""psu%d_power_good", PSU_SYSFS_PATH, psu_id); + if (ret < 0) { + AIM_LOG_ERROR("Unable to read status from (%s""psu%d_power_good)\r\n", PSU_SYSFS_PATH, psu_id); + return ONLP_STATUS_E_INTERNAL; + } + + if(val != PSU_STATUS_POWER_GOOD) { + info->status |= ONLP_THERMAL_STATUS_FAILED; + } + } + return onlp_file_read_int(&info->mcelsius, ipmi_devfiles__[tid]); }