From 907b3f504bdad9ae34b58c2d73211a5fcd2196ec Mon Sep 17 00:00:00 2001 From: Willy Liu Date: Thu, 13 Nov 2025 16:41:01 +0800 Subject: [PATCH 1/5] [ACCTON][AS7816-64x] Fix PSU model name Fix PSU model name for Delta PSU DPS-850AB-5 B Signed-off-by: Willy Liu --- .../module/src/platform_lib.c | 43 ++++++++++++------- .../module/src/platform_lib.h | 9 ++++ 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c index e186159d2..423cecdc1 100644 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c @@ -99,6 +99,8 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) char model[PSU_MODEL_NAME_LEN + 1] = {0}; char *prefix = psu_pmbus_path(id); char fan_dir[PSU_FAN_DIR_LEN + 1] = {0}; + char *model_string = NULL; + int len = 0; if (modelname && modelname_len < PSU_MODEL_NAME_LEN) { return PSU_TYPE_UNKNOWN; @@ -114,24 +116,36 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) if (!value) { return PSU_TYPE_UNKNOWN; } - - /* Read mode name */ - ret = onlp_file_read((uint8_t*)model, PSU_MODEL_NAME_LEN, &value, "%s%s", prefix, "psu_mfr_model"); - if (ret != ONLP_STATUS_OK || value != PSU_MODEL_NAME_LEN) { - return PSU_TYPE_UNKNOWN; - + /* Read full model name for PSU except 3y PSU */ + len = onlp_file_read_str(&model_string, "%spsu_mfr_model", prefix); + if (!model_string || len <= 0) + { + AIM_FREE_IF_PTR(model_string); + return PSU_TYPE_UNKNOWN; } - - if (modelname) { - memcpy(modelname, model, sizeof(model)); - } - - if (strncmp(model, "DPS-850A", strlen("DPS-850A")) == 0) { + if (modelname) + strcpy(modelname, model_string); + if ((strstr(model_string, "DPS-850AB-5") != NULL)){ ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); - if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) { + if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) + { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_DPS850_B2F; } - return PSU_TYPE_AC_DPS850_F2B; + else + { + AIM_FREE_IF_PTR(model_string); + return PSU_TYPE_AC_DPS850_F2B; + } + } + /* Read mode name */ + ret = onlp_file_read((uint8_t*)model, PSU_MODEL_NAME_LEN, &value, "%s%s", prefix, "psu_mfr_model"); + if (ret != ONLP_STATUS_OK || value != PSU_MODEL_NAME_LEN) { + return PSU_TYPE_UNKNOWN; + } + + if (modelname) { + memcpy(modelname, model, sizeof(model)); } if (strncmp(model, "YM-2851F", strlen("YM-2851F")) == 0) { @@ -177,7 +191,6 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) return PSU_TYPE_DC_YM2851JFR_B2F; } - return PSU_TYPE_DC_YM2851JER_F2B; /* YM-2851JER */ } diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h index 76f8d37db..73cab29ac 100644 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h @@ -100,6 +100,15 @@ int psu_ym2651y_pmbus_info_set(int id, char *node, int value); int psu_dps850_pmbus_info_get(int id, char *node, int *value); char* psu_pmbus_path(int pid); +#define AIM_FREE_IF_PTR(p) \ + do \ + { \ + if (p) { \ + aim_free(p); \ + p = NULL; \ + } \ + } while (0) + #define DEBUG_MODE 0 #if (DEBUG_MODE == 1) From 633f65a5e793158e2f2cf3d89dbb68def1c268a8 Mon Sep 17 00:00:00 2001 From: Willy Liu Date: Mon, 17 Nov 2025 10:55:26 +0800 Subject: [PATCH 2/5] [ACCTON][AS7816-64x] Fix model name for 3Y PSU 1. Support PSU mfr_model_opt for YM-2851F, abd then the 3Y full model name can be shown Signed-off-by: Willy Liu --- packages/base/any/kernels/modules/ym2651y.c | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/base/any/kernels/modules/ym2651y.c b/packages/base/any/kernels/modules/ym2651y.c index 5ac4ca77b..870af5194 100755 --- a/packages/base/any/kernels/modules/ym2651y.c +++ b/packages/base/any/kernels/modules/ym2651y.c @@ -869,6 +869,7 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev) } if ((strncmp((data->mfr_model+1), "YM-2851J", strlen("YM-2851J")) == 0)|| + (strncmp((data->mfr_model+1), "YM-2851F", strlen("YM-2851F")) == 0)|| (strncmp((data->mfr_model+1), "YM-2651Y", strlen("YM-2651Y")) == 0)|| (strncmp((data->mfr_model+1), "YPEB1200AM", strlen("YPEB1200AM")) == 0)) { From 78d8bbb4a759756ad84cc57bf6f4da262197fa3e Mon Sep 17 00:00:00 2001 From: Willy Liu Date: Tue, 18 Nov 2025 16:58:44 +0800 Subject: [PATCH 3/5] [ACCTON][AS7816-64X] Remove read model name for length 8 and add free model string Signed-off-by: Willy Liu --- .../module/src/platform_lib.c | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c index 423cecdc1..90083c3ba 100644 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c @@ -95,8 +95,7 @@ int psu_serial_number_get(int id, char *serial, int serial_len) psu_type_t psu_type_get(int id, char* modelname, int modelname_len) { int value = 0; - int ret = ONLP_STATUS_OK; - char model[PSU_MODEL_NAME_LEN + 1] = {0}; + int ret = ONLP_STATUS_OK; char *prefix = psu_pmbus_path(id); char fan_dir[PSU_FAN_DIR_LEN + 1] = {0}; char *model_string = NULL; @@ -116,7 +115,7 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) if (!value) { return PSU_TYPE_UNKNOWN; } - /* Read full model name for PSU except 3y PSU */ + /* Read full model name */ len = onlp_file_read_str(&model_string, "%spsu_mfr_model", prefix); if (!model_string || len <= 0) { @@ -127,6 +126,12 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) strcpy(modelname, model_string); if ((strstr(model_string, "DPS-850AB-5") != NULL)){ ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); + if (ret != ONLP_STATUS_OK) + { + AIM_LOG_ERROR("Unable to read psu fan dir\r\n"); + AIM_FREE_IF_PTR(model_string); + return ONLP_STATUS_E_INTERNAL; + } if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) { AIM_FREE_IF_PTR(model_string); @@ -138,62 +143,74 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) return PSU_TYPE_AC_DPS850_F2B; } } - /* Read mode name */ - ret = onlp_file_read((uint8_t*)model, PSU_MODEL_NAME_LEN, &value, "%s%s", prefix, "psu_mfr_model"); - if (ret != ONLP_STATUS_OK || value != PSU_MODEL_NAME_LEN) { - return PSU_TYPE_UNKNOWN; - } - + /* Access length 8 data for 3Y PSU model compare */ if (modelname) { - memcpy(modelname, model, sizeof(model)); + memcpy(modelname, model_string, PSU_MODEL_NAME_LEN); } - - if (strncmp(model, "YM-2851F", strlen("YM-2851F")) == 0) { + if (strncmp(model_string, "YM-2851F", strlen("YM-2851F")) == 0) { char model_opt[PSU_MODEL_NAME_LEN + 1] = {0}; ret = onlp_file_read((uint8_t*)model_opt, PSU_MODEL_NAME_LEN, &value, "%s%s", prefix, "psu_mfr_model_opt"); + if (ret != ONLP_STATUS_OK) + { + AIM_LOG_ERROR("Unable to read psu model opt\r\n"); + AIM_FREE_IF_PTR(model_string); + return ONLP_STATUS_E_INTERNAL; + } if (modelname && value) { memcpy(modelname + PSU_MODEL_NAME_LEN, model_opt, strlen(model_opt)-1); } if ((strncmp(model_opt, "DR", strlen("DR")) == 0) || (strncmp(model_opt, "D01R", strlen("D01R")) == 0)) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_YM2851FDR_B2F; /* YM-2851FDR or YM-2851FD01R */ } else if ((strncmp(model_opt, "CR", strlen("CR")) == 0) || (strncmp(model_opt, "C01R", strlen("C01R")) == 0)) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_YM2851FCR_F2B; /* YM-2851FDR or YM-2851FD01R */ } ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); if ((strncmp(fan_dir, "B2F", strlen("B2F")) == 0) || (strncmp(fan_dir, "AFI", strlen("AFI")) == 0)) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_YM2851FDR_B2F; } - + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_YM2851FCR_F2B; } - if (strncmp(model, "YM-2851J", strlen("YM-2851J")) == 0) { + if (strncmp(model_string, "YM-2851J", strlen("YM-2851J")) == 0) { char model_opt[PSU_MODEL_NAME_LEN + 1] = {0}; ret = onlp_file_read((uint8_t*)model_opt, PSU_MODEL_NAME_LEN, &value, "%s%s", prefix, "psu_mfr_model_opt"); + if (ret != ONLP_STATUS_OK) + { + AIM_LOG_ERROR("Unable to read psu model opt\r\n"); + AIM_FREE_IF_PTR(model_string); + return ONLP_STATUS_E_INTERNAL; + } if (modelname && value) { memcpy(modelname + PSU_MODEL_NAME_LEN, model_opt, strlen(model_opt)-1); } if (strncmp(model_opt, "FR", strlen("FR")) == 0) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_DC_YM2851JFR_B2F; } else if (strncmp(model_opt, "ER", strlen("ER")) == 0) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_DC_YM2851JER_F2B; } ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); if ((strncmp(fan_dir, "B2F", strlen("B2F")) == 0) || (strncmp(fan_dir, "AFI", strlen("AFI")) == 0)) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_DC_YM2851JFR_B2F; } - + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_DC_YM2851JER_F2B; /* YM-2851JER */ } - + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_UNKNOWN; } From dc1301d22a481dc16eb6ddc91733121586824d67 Mon Sep 17 00:00:00 2001 From: Eric Yang Date: Thu, 27 Nov 2025 06:29:20 +0000 Subject: [PATCH 4/5] [ACCTON][AS7816-64x] Support Goreal PSU G1441-0850WNB Signed-off-by: Eric Yang --- packages/base/any/kernels/modules/ym2651y.c | 12 ++-- .../module/src/fani.c | 19 +++++-- .../module/src/platform_lib.c | 16 ++++++ .../module/src/platform_lib.h | 2 + .../module/src/psui.c | 56 +++++++++++++++++++ 5 files changed, 97 insertions(+), 8 deletions(-) diff --git a/packages/base/any/kernels/modules/ym2651y.c b/packages/base/any/kernels/modules/ym2651y.c index 870af5194..cf8d02af7 100755 --- a/packages/base/any/kernels/modules/ym2651y.c +++ b/packages/base/any/kernels/modules/ym2651y.c @@ -312,7 +312,8 @@ static ssize_t show_linear(struct device *dev, struct device_attribute *da, (strncmp(ptr, "FSF019", strlen("FSF019")) == 0)|| (strncmp(ptr, "FSF045", strlen("FSF045")) == 0)|| (strncmp(ptr, "SPAACTN-04", strlen("SPAACTN-04")) == 0)|| - (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)) { + (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)|| + (strncmp(ptr, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0)) { value = data->v_in; } break; @@ -323,7 +324,8 @@ static ssize_t show_linear(struct device *dev, struct device_attribute *da, (strncmp(ptr, "FSF019", strlen("FSF019")) == 0)|| (strncmp(ptr, "FSF045", strlen("FSF045")) == 0)|| (strncmp(ptr, "SPAACTN-04", strlen("SPAACTN-04")) == 0)|| - (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)) { + (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)|| + (strncmp(ptr, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0)) { value = data->i_in; } break; @@ -334,7 +336,8 @@ static ssize_t show_linear(struct device *dev, struct device_attribute *da, (strncmp(ptr, "FSF019", strlen("FSF019")) == 0)|| (strncmp(ptr, "FSF045", strlen("FSF045")) == 0)|| (strncmp(ptr, "SPAACTN-04", strlen("SPAACTN-04")) == 0)|| - (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)) { + (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)|| + (strncmp(ptr, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0)) { value = data->p_in; } break; @@ -520,7 +523,8 @@ static ssize_t show_vout(struct device *dev, struct device_attribute *da, else if ((strncmp(ptr, "DPS-850A", strlen("DPS-850A")) == 0)|| (strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0) || (strncmp(ptr, "UPD1501SA-1190G", strlen("UPD1501SA-1190G")) == 0) || - (strncmp(ptr, "UPD1501SA-1290G", strlen("UPD1501SA-1290G")) == 0)) { + (strncmp(ptr, "UPD1501SA-1290G", strlen("UPD1501SA-1290G")) == 0) || + (strncmp(ptr, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0) ) { return show_vout_by_mode(dev, da, buf); } diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/fani.c b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/fani.c index 62cec4a48..9e754a592 100755 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/fani.c +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/fani.c @@ -165,6 +165,7 @@ _onlp_get_fan_direction_on_psu(void) case PSU_TYPE_AC_DPS850_F2B: case PSU_TYPE_AC_YM2851FCR_F2B: case PSU_TYPE_DC_YM2851JER_F2B: + case PSU_TYPE_DC_G1441_0850WNB_F2B: return ONLP_FAN_STATUS_F2B; case PSU_TYPE_AC_DPS850_B2F: case PSU_TYPE_AC_YM2851FDR_B2F: @@ -202,12 +203,22 @@ _onlp_fani_info_get_fan_on_psu(int pid, onlp_fan_info_t* info) { if (psu_dps850_pmbus_info_get(pid, "psu_fan1_speed_rpm", &val) == ONLP_STATUS_OK) { - info->rpm = val; - info->percentage = (info->rpm * 100) / MAX_PSU_FAN_SPEED; - info->status |= (val == 0) ? ONLP_FAN_STATUS_FAILED : 0; + info->rpm = val; + info->percentage = (info->rpm * 100) / MAX_PSU_FAN_SPEED; + info->status |= (val == 0) ? ONLP_FAN_STATUS_FAILED : 0; + } } + + if (psu_type == PSU_TYPE_DC_G1441_0850WNB_F2B) + { + if (psu_g1441_pmbus_info_get(pid, "psu_fan1_speed_rpm", &val) == ONLP_STATUS_OK) + { + info->rpm = val; + info->percentage = (info->rpm * 100) / MAX_PSU_FAN_SPEED; + info->status |= (val == 0) ? ONLP_FAN_STATUS_FAILED : 0; + } } - + if (psu_type == PSU_TYPE_AC_YM2851FCR_F2B || psu_type == PSU_TYPE_AC_YM2851FDR_B2F || psu_type == PSU_TYPE_DC_YM2851JER_F2B || psu_type == PSU_TYPE_DC_YM2851JFR_B2F) { diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c index 90083c3ba..64b6987ea 100644 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c @@ -142,6 +142,9 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_DPS850_F2B; } + }else if(strncmp(model_string, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0){ + AIM_FREE_IF_PTR(model_string); + return PSU_TYPE_DC_G1441_0850WNB_F2B; } /* Access length 8 data for 3Y PSU model compare */ if (modelname) { @@ -252,6 +255,19 @@ int psu_dps850_pmbus_info_get(int id, char *node, int *value) return ONLP_STATUS_OK; } +int psu_g1441_pmbus_info_get(int id, char *node, int *value) +{ + char *prefix = psu_pmbus_path(id); + *value = 0; + + if (onlp_file_read_int(value, "%s%s", prefix, node) < 0) { + AIM_LOG_ERROR("Unable to read status from file(%s%s)\r\n", prefix, node); + return ONLP_STATUS_E_INTERNAL; + } + + return ONLP_STATUS_OK; +} + enum onlp_fan_dir onlp_get_fan_dir(void) { int value = FAN_DIR_F2B; diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h index 73cab29ac..fc7ad4c41 100644 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h @@ -83,6 +83,7 @@ typedef enum psu_type { PSU_TYPE_AC_DPS850_B2F, PSU_TYPE_DC_YM2851JER_F2B, PSU_TYPE_DC_YM2851JFR_B2F, + PSU_TYPE_DC_G1441_0850WNB_F2B, } psu_type_t; enum onlp_fan_dir { @@ -98,6 +99,7 @@ int psu_serial_number_get(int id, char *serial, int serial_len); int psu_ym2651y_pmbus_info_get(int id, char *node, int *value); int psu_ym2651y_pmbus_info_set(int id, char *node, int value); int psu_dps850_pmbus_info_get(int id, char *node, int *value); +int psu_g1441_pmbus_info_get(int id, char *node, int *value); char* psu_pmbus_path(int pid); #define AIM_FREE_IF_PTR(p) \ diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/psui.c b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/psui.c index 28ea31c72..fb88a7d25 100755 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/psui.c +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/psui.c @@ -167,6 +167,59 @@ psu_dps850_info_get(onlp_psu_info_t* info) return ONLP_STATUS_OK; } +static int +psu_g1441_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_g1441_pmbus_info_get(index, "psu_v_out", &val) == 0) { + info->mvout = val; + info->caps |= ONLP_PSU_CAPS_VOUT; + } + + if (psu_g1441_pmbus_info_get(index, "psu_v_in", &val) == 0) { + info->mvin = val; + info->caps |= ONLP_PSU_CAPS_VIN; + } + + if (psu_g1441_pmbus_info_get(index, "psu_i_out", &val) == 0) { + info->miout = val; + info->caps |= ONLP_PSU_CAPS_IOUT; + } + + if (psu_g1441_pmbus_info_get(index, "psu_i_in", &val) == 0) { + info->miin = val; + info->caps |= ONLP_PSU_CAPS_IIN; + } + + if (psu_g1441_pmbus_info_get(index, "psu_p_out", &val) == 0) { + info->mpout = val; + info->caps |= ONLP_PSU_CAPS_POUT; + } + + if (psu_g1441_pmbus_info_get(index, "psu_p_in", &val) == 0) { + info->mpin = val; + info->caps |= ONLP_PSU_CAPS_PIN; + } + + psu_serial_number_get(index, info->serial, sizeof(info->serial)); + + return ONLP_STATUS_OK; +} + /* * Get all information about the given PSU oid. @@ -226,6 +279,9 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) case PSU_TYPE_AC_DPS850_B2F: ret = psu_dps850_info_get(info); break; + case PSU_TYPE_DC_G1441_0850WNB_F2B: + ret = psu_g1441_info_get(info); + break; case PSU_TYPE_AC_YM2851FCR_F2B: case PSU_TYPE_AC_YM2851FDR_B2F: info->caps = ONLP_PSU_CAPS_AC; /* Set capability */ From 6fe7e31aac6b5e962026e339ad15fe04842e4c54 Mon Sep 17 00:00:00 2001 From: Eric Yang Date: Mon, 19 Jan 2026 10:20:04 +0800 Subject: [PATCH 5/5] [ACCTON][AS7816-64x] Add support for retrieving PSU fan direction via PMBus register 0xC3 Signed-off-by: Eric Yang --- .../module/src/platform_lib.c | 19 +++++++++++++++++-- .../module/src/platform_lib.h | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c index 64b6987ea..b0a8a7670 100644 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c @@ -143,8 +143,23 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) return PSU_TYPE_AC_DPS850_F2B; } }else if(strncmp(model_string, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0){ - AIM_FREE_IF_PTR(model_string); - return PSU_TYPE_DC_G1441_0850WNB_F2B; + ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); + if (ret != ONLP_STATUS_OK) + { + AIM_LOG_ERROR("Unable to read psu fan dir\r\n"); + AIM_FREE_IF_PTR(model_string); + return ONLP_STATUS_E_INTERNAL; + } + if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) + { + AIM_FREE_IF_PTR(model_string); + return PSU_TYPE_DC_G1441_0850WNB_B2F; + } + else + { + AIM_FREE_IF_PTR(model_string); + return PSU_TYPE_DC_G1441_0850WNB_F2B; + } } /* Access length 8 data for 3Y PSU model compare */ if (modelname) { diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h index fc7ad4c41..3e730502a 100644 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h @@ -84,6 +84,7 @@ typedef enum psu_type { PSU_TYPE_DC_YM2851JER_F2B, PSU_TYPE_DC_YM2851JFR_B2F, PSU_TYPE_DC_G1441_0850WNB_F2B, + PSU_TYPE_DC_G1441_0850WNB_B2F } psu_type_t; enum onlp_fan_dir {