From 5bd9a23fb3facd46b2cc045c411840dbd919852a Mon Sep 17 00:00:00 2001 From: Willy Liu Date: Thu, 10 Apr 2025 07:48:47 +0000 Subject: [PATCH 1/2] [ACCTON][AS7326-56X] Modify the version display for command onlpdump -x Signed-off-by: Willy Liu --- .../src/x86-64-accton-as7326-56x-cpld.c | 19 ++++++- .../builds/src/x86-64-accton-as7326-56x-fan.c | 11 ++++ .../module/src/platform_lib.h | 9 ++++ .../module/src/sysi.c | 50 ++++++++++++++++--- .../x86_64_accton_as7326_56x_r0/__init__.py | 1 + 5 files changed, 83 insertions(+), 7 deletions(-) diff --git a/packages/platforms/accton/x86-64/as7326-56x/modules/builds/src/x86-64-accton-as7326-56x-cpld.c b/packages/platforms/accton/x86-64/as7326-56x/modules/builds/src/x86-64-accton-as7326-56x-cpld.c index 7985f09aa..4de55e284 100644 --- a/packages/platforms/accton/x86-64/as7326-56x/modules/builds/src/x86-64-accton-as7326-56x-cpld.c +++ b/packages/platforms/accton/x86-64/as7326-56x/modules/builds/src/x86-64-accton-as7326-56x-cpld.c @@ -48,7 +48,8 @@ struct cpld_client_node { enum cpld_type { as7326_56x_cpld1, as7326_56x_cpld2, - as7326_56x_cpld3 + as7326_56x_cpld3, + as7326_56x_cpu_cpld }; struct as7326_56x_cpld_data { @@ -61,6 +62,7 @@ static const struct i2c_device_id as7326_56x_cpld_id[] = { { "as7326_56x_cpld1", as7326_56x_cpld1 }, { "as7326_56x_cpld2", as7326_56x_cpld2 }, { "as7326_56x_cpld3", as7326_56x_cpld3 }, + { "as7326_56x_cpu_cpld", as7326_56x_cpu_cpld }, { } }; MODULE_DEVICE_TABLE(i2c, as7326_56x_cpld_id); @@ -437,6 +439,16 @@ DECLARE_SFP_TRANSCEIVER_SENSOR_DEVICE_ATTR(48); DECLARE_SFP_TRANSCEIVER_SENSOR_DEVICE_ATTR(57); DECLARE_SFP_TRANSCEIVER_SENSOR_DEVICE_ATTR(58); +static struct attribute *as7326_56x_cpu_cpld_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + &sensor_dev_attr_access.dev_attr.attr, + NULL +}; + +static const struct attribute_group as7326_56x_cpu_cpld_group = { + .attrs = as7326_56x_cpu_cpld_attributes, +}; + static struct attribute *as7326_56x_cpld3_attributes[] = { &sensor_dev_attr_version.dev_attr.attr, &sensor_dev_attr_access.dev_attr.attr, @@ -979,6 +991,9 @@ static int as7326_56x_cpld_probe(struct i2c_client *client, case as7326_56x_cpld3: group = &as7326_56x_cpld3_group; break; + case as7326_56x_cpu_cpld: + group = &as7326_56x_cpu_cpld_group; + break; default: break; } @@ -1016,6 +1031,8 @@ static int as7326_56x_cpld_remove(struct i2c_client *client) break; case as7326_56x_cpld3: group = &as7326_56x_cpld3_group; + case as7326_56x_cpu_cpld: + group = &as7326_56x_cpu_cpld_group; break; default: break; diff --git a/packages/platforms/accton/x86-64/as7326-56x/modules/builds/src/x86-64-accton-as7326-56x-fan.c b/packages/platforms/accton/x86-64/as7326-56x/modules/builds/src/x86-64-accton-as7326-56x-fan.c index 69364115d..e0dc5ce99 100644 --- a/packages/platforms/accton/x86-64/as7326-56x/modules/builds/src/x86-64-accton-as7326-56x-fan.c +++ b/packages/platforms/accton/x86-64/as7326-56x/modules/builds/src/x86-64-accton-as7326-56x-fan.c @@ -64,6 +64,7 @@ extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); /* fan related data, the index should match sysfs_fan_attributes */ static const u8 fan_reg[] = { + 0x01, /*fan cpld version */ 0x0F, /* fan 1-6 present status */ 0x10, /* fan 1-6 direction(0:F2B 1:B2F) */ 0x11, /* fan PWM(for all fan) */ @@ -106,6 +107,7 @@ enum fan_id { }; enum sysfs_fan_attributes { + VERSION, FAN_PRESENT_REG, FAN_DIRECTION_REG, FAN_DUTY_CYCLE_PERCENTAGE, /* Only one CPLD register to control duty cycle for all fans */ @@ -146,6 +148,10 @@ enum sysfs_fan_attributes { /* Define attributes */ +#define DECLARE_VERSION_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(version, S_IRUGO, fan_show_value, NULL, VERSION) +#define DECLARE_VERSION_ATTR() &sensor_dev_attr_version.dev_attr.attr + #define DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(index, index2) \ static SENSOR_DEVICE_ATTR(fan##index##_fault, S_IRUGO, fan_show_value, NULL, FAN##index##_FAULT);\ static SENSOR_DEVICE_ATTR(fan##index2##_fault, S_IRUGO, fan_show_value, NULL, FAN##index##_FAULT) @@ -227,6 +233,7 @@ DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(1); DECLARE_FAN_SYSTEM_TEMP_SENSOR_DEV_ATTR(); /* 3 fan wdt attribute in this platform */ DECLARE_FAN_WDT_SENSOR_DEV_ATTR(); +DECLARE_VERSION_SENSOR_DEV_ATTR(); static struct attribute *as7326_56x_fan_attributes[] = { @@ -260,6 +267,7 @@ static struct attribute *as7326_56x_fan_attributes[] = { DECLARE_FAN_WDT_TIMER_ATTR(), DECLARE_FAN_WDT_MAX_PWM_ATTR(), DECLARE_FAN_WDT_STATUS_ATTR(), + DECLARE_VERSION_ATTR(), NULL }; @@ -824,6 +832,9 @@ static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, case FAN_WDT_STATUS: ret = sprintf(buf, "%u\n", data->reg_val[attr->index]); break; + case VERSION: + ret = sprintf(buf, "%u\n", data->reg_val[attr->index]); + break; default: break; } diff --git a/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/platform_lib.h b/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/platform_lib.h index 0b274939e..b70183c52 100644 --- a/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/platform_lib.h @@ -95,5 +95,14 @@ int psu_acbel_serial_number_get(int id, char *serial, int serial_len); #define DEBUG_PRINT(format, ...) #endif +#define AIM_FREE_IF_PTR(p) \ + do \ + { \ + if (p) { \ + aim_free(p); \ + p = NULL; \ + } \ + } while (0) + #endif /* __PLATFORM_LIB_H__ */ diff --git a/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/sysi.c b/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/sysi.c index d8332ab17..49f0edbda 100755 --- a/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/sysi.c +++ b/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/sysi.c @@ -39,8 +39,9 @@ #define NUM_OF_FAN_ON_MAIN_BROAD 6 +#define BIOS_VER_PATH "/sys/devices/virtual/dmi/id/bios_version" #define PREFIX_PATH_ON_CPLD_DEV "/sys/bus/i2c/devices/" -#define NUM_OF_CPLD 3 +#define NUM_OF_CPLD 5 #define FAN_DUTY_CYCLE_MAX (100) #define FAN_DUTY_CYCLE_DEFAULT (32) #define FAN_DUTY_PLUS_FOR_DIR (13) @@ -52,9 +53,11 @@ static char arr_cplddev_name[NUM_OF_CPLD][10] = { - "18-0060", - "12-0062", - "19-0064" + "0-0065", /* CPU CPLD */ + "11-0066", /* FAN CPLD */ + "18-0060", /* CPLD 1*/ + "12-0062", /* CPLD 2*/ + "19-0064" /* CPLD 3*/ }; const char* @@ -122,7 +125,30 @@ onlp_sysi_oids_get(onlp_oid_t* table, int max) int onlp_sysi_platform_info_get(onlp_platform_info_t* pi) { - int i, v[NUM_OF_CPLD]={0}; + int i, v[NUM_OF_CPLD] = {0}; + int rv, failed_cnt = 0; + onlp_onie_info_t onie; + char *bios_ver = NULL; + char *paths[] = {IDPROM_PATH_2, IDPROM_PATH_1}; + + onlp_file_read_str(&bios_ver, BIOS_VER_PATH); + + for (i = 0 ; i < AIM_ARRAYSIZE(paths); i++ ){ + rv = onlp_onie_decode_file(&onie, paths[i]); + /* Decode failed if rv < 0 */ + if(rv < 0) + { + failed_cnt++; + } + else + { + break; + } + + if (failed_cnt >= 2) + return ONLP_STATUS_E_INTERNAL; + } + for (i = 0; i < NUM_OF_CPLD; i++) { v[i] = 0; @@ -131,7 +157,19 @@ onlp_sysi_platform_info_get(onlp_platform_info_t* pi) return ONLP_STATUS_E_INTERNAL; } } - pi->cpld_versions = aim_fstrdup("%d.%d.%d", v[0], v[1], v[2]); + + pi->cpld_versions = aim_fstrdup("\r\n\t CPU CPLD(0x65): %02X" + "\r\n\t Fan CPLD(0x66): %02X" + "\r\n\t Main CPLD(0x60): %02X" + "\r\n\t Main CPLD(0x62): %02X" + "\r\n\t Main CPLD(0x64): %02X\r\n", + v[0], v[1], v[2], v[3], v[4]); + + pi->other_versions = aim_fstrdup("\r\n\t BIOS: %s\r\n\t ONIE: %s", + bios_ver, onie.onie_version); + + onlp_onie_info_free(&onie); + AIM_FREE_IF_PTR(bios_ver); return 0; } diff --git a/packages/platforms/accton/x86-64/as7326-56x/platform-config/r0/src/python/x86_64_accton_as7326_56x_r0/__init__.py b/packages/platforms/accton/x86-64/as7326-56x/platform-config/r0/src/python/x86_64_accton_as7326_56x_r0/__init__.py index e78ae8126..ff043ab09 100755 --- a/packages/platforms/accton/x86-64/as7326-56x/platform-config/r0/src/python/x86_64_accton_as7326_56x_r0/__init__.py +++ b/packages/platforms/accton/x86-64/as7326-56x/platform-config/r0/src/python/x86_64_accton_as7326_56x_r0/__init__.py @@ -62,6 +62,7 @@ def baseconfig(self): self.insmod("x86-64-accton-as7326-56x-%s.ko" % m) self.new_i2c_device('pca9548', 0x77, 0) + self.new_i2c_device('as7326_56x_cpu_cpld', 0x65, 0) ########### initialize I2C bus 1 ########### # initialize multiplexer (PCA9548) self.new_i2c_device('pca9548', 0x70, 1) From 30274dcbca17204ef9b22936dd1fadf39b8736a6 Mon Sep 17 00:00:00 2001 From: vincent_chiang Date: Tue, 5 May 2026 03:07:09 +0000 Subject: [PATCH 2/2] accton/as7326-56x: Show MFU ver with onlpdump -x 1. The last_updated_MFU_version file in ONIE partition is copied to ONL's /var/tmp/ on ONL boot. 2. onlpdump -x reads /var/tmp/last_updated_MFU_version for MFU ver. 3. Move BIOS_VER_PATH from sysi.c to platform_lib.h and add MFU_VER_PATH macro. 4. Use intermediate const char* to avoid passing NULL to aim_fstrdup when BIOS/MFU file is missing. --- .../module/src/platform_lib.h | 3 ++ .../module/src/sysi.c | 19 ++++++++--- .../x86_64_accton_as7326_56x_r0/__init__.py | 32 +++++++++++++++++++ 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/platform_lib.h b/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/platform_lib.h index b70183c52..df5016585 100644 --- a/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/platform_lib.h @@ -65,6 +65,9 @@ #define IDPROM_PATH_1 "/sys/bus/i2c/devices/0-0056/eeprom" #define IDPROM_PATH_2 "/sys/bus/i2c/devices/0-0057/eeprom" +#define BIOS_VER_PATH "/sys/devices/virtual/dmi/id/bios_version" +#define MFU_VER_PATH "/var/tmp/last_updated_MFU_version" + int onlp_file_write_integer(char *filename, int value); int onlp_file_read_binary(char *filename, char *buffer, int buf_size, int data_len); int onlp_file_read_string(char *filename, char *buffer, int buf_size, int data_len); diff --git a/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/sysi.c b/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/sysi.c index 49f0edbda..aec2cee97 100755 --- a/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/sysi.c +++ b/packages/platforms/accton/x86-64/as7326-56x/onlp/builds/x86_64_accton_as7326_56x/module/src/sysi.c @@ -39,7 +39,6 @@ #define NUM_OF_FAN_ON_MAIN_BROAD 6 -#define BIOS_VER_PATH "/sys/devices/virtual/dmi/id/bios_version" #define PREFIX_PATH_ON_CPLD_DEV "/sys/bus/i2c/devices/" #define NUM_OF_CPLD 5 #define FAN_DUTY_CYCLE_MAX (100) @@ -129,10 +128,11 @@ onlp_sysi_platform_info_get(onlp_platform_info_t* pi) int rv, failed_cnt = 0; onlp_onie_info_t onie; char *bios_ver = NULL; + char *mfu_ver = NULL; + const char *bios = ""; + const char *mfu = ""; char *paths[] = {IDPROM_PATH_2, IDPROM_PATH_1}; - onlp_file_read_str(&bios_ver, BIOS_VER_PATH); - for (i = 0 ; i < AIM_ARRAYSIZE(paths); i++ ){ rv = onlp_onie_decode_file(&onie, paths[i]); /* Decode failed if rv < 0 */ @@ -165,11 +165,20 @@ onlp_sysi_platform_info_get(onlp_platform_info_t* pi) "\r\n\t Main CPLD(0x64): %02X\r\n", v[0], v[1], v[2], v[3], v[4]); - pi->other_versions = aim_fstrdup("\r\n\t BIOS: %s\r\n\t ONIE: %s", - bios_ver, onie.onie_version); + if (onlp_file_read_str(&bios_ver, BIOS_VER_PATH) > 0) { + bios = bios_ver; + } + if (onlp_file_read_str(&mfu_ver, MFU_VER_PATH) > 0) { + mfu = mfu_ver; + } + + pi->other_versions = aim_fstrdup("\r\n\t BIOS: %s\r\n\t ONIE: %s" + "\r\n\t MFU: %s", + bios, onie.onie_version, mfu); onlp_onie_info_free(&onie); AIM_FREE_IF_PTR(bios_ver); + AIM_FREE_IF_PTR(mfu_ver); return 0; } diff --git a/packages/platforms/accton/x86-64/as7326-56x/platform-config/r0/src/python/x86_64_accton_as7326_56x_r0/__init__.py b/packages/platforms/accton/x86-64/as7326-56x/platform-config/r0/src/python/x86_64_accton_as7326_56x_r0/__init__.py index ff043ab09..6c06d0dfd 100755 --- a/packages/platforms/accton/x86-64/as7326-56x/platform-config/r0/src/python/x86_64_accton_as7326_56x_r0/__init__.py +++ b/packages/platforms/accton/x86-64/as7326-56x/platform-config/r0/src/python/x86_64_accton_as7326_56x_r0/__init__.py @@ -5,6 +5,37 @@ import os.path import time +def get_mfu_ver_file(): + cmd_list = [ + "mkdir -p /mnt/onie-boot", + "blkid | grep 'ONIE-BOOT'", + "mount -L ONIE-BOOT /mnt/onie-boot", + "cp -a /mnt/onie-boot/onie/update/last_updated_MFU_version /var/tmp", + "umount /mnt/onie-boot" + ] + + for cmd in cmd_list: + if "cp -a" in cmd: + if not os.path.isfile("/mnt/onie-boot/onie/update/last_updated_MFU_version"): + print("last_updated_MFU_version file does not exist !") + continue + + process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + process.communicate() + + if process.returncode != 0: + if "blkid" in cmd and process.returncode == 1: + print("ONIE-BOOT label does not exist !") + else: + print("'" + cmd + "'" + " runs with error return code: " + str(process.returncode)) + + if "cp -a" in cmd: + continue + + return False + + return True + #IR3570A chip casue problem when read eeprom by i2c-block mode. #It happen when read 16th-byte offset that value is 0x8. So disable chip def disable_i2c_ir3570a(addr): @@ -153,5 +184,6 @@ def baseconfig(self): ir3570_check() _8v89307_init() + get_mfu_ver_file() return True