From 892f26556ce546d3838aa34215c510a1f852df16 Mon Sep 17 00:00:00 2001 From: Jemston Fernando Date: Wed, 18 Jan 2023 23:30:07 +0530 Subject: [PATCH] [platform]: Fix Belgite platform issues (#13389) As part of platform hardening this commit fixes several platform issues in various components like PSU, FAN, Temperature, LED. --- .../CELESTICA-BELGITE/hwsku.json | 284 +++++++++++++ .../x86_64-cel_belgite-r0/custom_led.bin | Bin 216 -> 220 bytes .../led-source-code/cmicx/custom_led.c | 2 +- .../x86_64-cel_belgite-r0/led_proc_init.soc | 2 +- .../x86_64-cel_belgite-r0/pddf/pd-plugin.json | 8 +- .../pddf/pddf-device.json | 24 +- .../x86_64-cel_belgite-r0/platform.json | 400 +++++++++++++++++- .../platform_components.json | 10 + .../x86_64-cel_belgite-r0/plugins/psuutil.py | 78 ++++ .../x86_64-cel_belgite-r0/plugins/sfputil.py | 142 +++++++ .../pmon_daemon_control.json | 4 +- .../system_health_monitoring_config.json | 8 +- .../belgite/pddf/sonic_platform/chassis.py | 130 ++++-- .../belgite/pddf/sonic_platform/component.py | 65 ++- .../belgite/pddf/sonic_platform/fan.py | 130 ++---- .../belgite/pddf/sonic_platform/psu.py | 18 + .../scripts/pddf_post_device_create.sh | 3 + 17 files changed, 1122 insertions(+), 186 deletions(-) create mode 100644 device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/hwsku.json create mode 100644 device/celestica/x86_64-cel_belgite-r0/platform_components.json create mode 100644 device/celestica/x86_64-cel_belgite-r0/plugins/psuutil.py create mode 100644 device/celestica/x86_64-cel_belgite-r0/plugins/sfputil.py diff --git a/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/hwsku.json b/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/hwsku.json new file mode 100644 index 0000000000..160d768bde --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/CELESTICA-BELGITE/hwsku.json @@ -0,0 +1,284 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet1": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet2": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet3": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet4": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet5": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet6": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet7": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet8": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet9": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet10": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet11": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet12": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet13": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet14": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet15": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet16": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet17": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet18": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet19": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet20": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet21": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet22": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet23": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet24": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet25": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet26": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet27": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet28": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet29": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet30": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet31": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet32": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet33": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet34": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet35": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet36": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet37": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet38": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet39": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet40": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet41": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet42": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet43": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet44": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet45": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet46": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet47": { + "default_brkout_mode": "1x1000[100,10]", + "autoneg": "on", + "fec": "none" + }, + "Ethernet48": { + "default_brkout_mode": "1x10G[1G]", + "autoneg": "off", + "fec": "none" + }, + "Ethernet49": { + "default_brkout_mode": "1x10G[1G]", + "autoneg": "off", + "fec": "none" + }, + "Ethernet50": { + "default_brkout_mode": "1x10G[1G]", + "autoneg": "off", + "fec": "none" + }, + "Ethernet51": { + "default_brkout_mode": "1x10G[1G]", + "autoneg": "off", + "fec": "none" + }, + "Ethernet52": { + "default_brkout_mode": "1x10G[1G]", + "autoneg": "off", + "fec": "none" + }, + "Ethernet53": { + "default_brkout_mode": "1x10G[1G]", + "autoneg": "off", + "fec": "none" + }, + "Ethernet54": { + "default_brkout_mode": "1x10G[1G]", + "autoneg": "off", + "fec": "none" + }, + "Ethernet55": { + "default_brkout_mode": "1x10G[1G]", + "autoneg": "off", + "fec": "none" + } + } +} \ No newline at end of file diff --git a/device/celestica/x86_64-cel_belgite-r0/custom_led.bin b/device/celestica/x86_64-cel_belgite-r0/custom_led.bin index 6973a4c9a73a6d0ee9eaac6150be92d1933ddf5b..c1b5e0e1b1d6df0a03d57ba312715b5ebb0b772e 100644 GIT binary patch delta 114 zcmV-&0FD3H0o(x`@U_N90JRuO765QI03-t?fFqbjeme_5oJI=ZkuVfF3(ymY0Xv%j z0ccxV9YXEUDFA0i059&*=;r|=!(jj;17bHKLSi*Kf?~s9!(zi@!(@QGxJK~3Y>{PS U5Ig`n06PFV06qXf06hRd0NV*BaR2}S delta 126 zcmV-^0D=G90oVa$@U=%qfV3A%765QI03-t?fFqbjeme_5oJJFf0Xv%j0ccxV9YO=p zDFA0i051g5K}HKeSwdMs0x?5q8B+o>1T?Zj>Cpir!(jj;17bHKLSi*Kf?~s9!(zi@ g!(;@!kVf#mXpw1S5IO)n0673V06+jf06zdd0ITmN3IG5A diff --git a/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.c b/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.c index 92fe25f5b8..712b5503e3 100755 --- a/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.c +++ b/device/celestica/x86_64-cel_belgite-r0/led-source-code/cmicx/custom_led.c @@ -105,7 +105,7 @@ unsigned short portmap[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, - 58, 60, 57, 59, 64, 62, 63, 61 + 60, 58, 59, 57, 62, 64, 61, 63 }; diff --git a/device/celestica/x86_64-cel_belgite-r0/led_proc_init.soc b/device/celestica/x86_64-cel_belgite-r0/led_proc_init.soc index f7192c5b08..57ee7fedaf 100644 --- a/device/celestica/x86_64-cel_belgite-r0/led_proc_init.soc +++ b/device/celestica/x86_64-cel_belgite-r0/led_proc_init.soc @@ -1,3 +1,3 @@ m0 load 0 0x3800 /usr/share/sonic/platform/custom_led.bin +led auto on led start - diff --git a/device/celestica/x86_64-cel_belgite-r0/pddf/pd-plugin.json b/device/celestica/x86_64-cel_belgite-r0/pddf/pd-plugin.json index 05d724f362..454afd2399 100644 --- a/device/celestica/x86_64-cel_belgite-r0/pddf/pd-plugin.json +++ b/device/celestica/x86_64-cel_belgite-r0/pddf/pd-plugin.json @@ -5,7 +5,7 @@ { "i2c": { - "valmap-SFP28": {"1":false, "0":true } + "valmap-SFP+": {"1":false, "0":true } } } }, @@ -29,7 +29,7 @@ { "i2c": { - "valmap": { "F2B":"INTAKE", "B2F":"EXHAUST" } + "valmap": { "0":"INTAKE", "1":"EXHAUST" } } }, "PSU_FAN_MAX_SPEED":"18000" @@ -50,10 +50,6 @@ "valmap": {"1":false, "0":true} } }, - "fan_master_led_color": - { - "colmap": {"green":"green", "red":"amber"} - }, "duty_cycle_to_pwm": "lambda dc: dc*255/100", "pwm_to_duty_cycle": "lambda pwm: pwm/255*100" diff --git a/device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json b/device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json index 7ccbd41fff..a97102c1f4 100644 --- a/device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json +++ b/device/celestica/x86_64-cel_belgite-r0/pddf/pddf-device.json @@ -179,7 +179,7 @@ { "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, { "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, { "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc5", "attr_mask":"0x18", "attr_cmpval":"0x08", "attr_len":"1"}, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x80", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"1"}, { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, { "attr_name":"psu_temp1_input", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} ] @@ -215,7 +215,7 @@ { "attr_name":"psu_v_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, { "attr_name":"psu_i_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, { "attr_name":"psu_p_out", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_fan_dir", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0xc5", "attr_mask":"0x18", "attr_cmpval":"0x08", "attr_len":"1"}, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x80", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"1"}, { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, { "attr_name":"psu_temp1_input", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0x8d", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} ] @@ -283,7 +283,7 @@ }, "PORT49": { - "dev_info": { "device_type":"SFP28", "device_name":"PORT49", "device_parent":"MUX2"}, + "dev_info": { "device_type":"SFP+", "device_name":"PORT49", "device_parent":"MUX2"}, "dev_attr": { "dev_idx":"49"}, "i2c": { @@ -324,7 +324,7 @@ }, "PORT50": { - "dev_info": { "device_type":"SFP28", "device_name":"PORT50", "device_parent":"MUX2"}, + "dev_info": { "device_type":"SFP+", "device_name":"PORT50", "device_parent":"MUX2"}, "dev_attr": { "dev_idx":"50"}, "i2c": { @@ -366,7 +366,7 @@ }, "PORT51": { - "dev_info": { "device_type":"SFP28", "device_name":"PORT51", "device_parent":"MUX2"}, + "dev_info": { "device_type":"SFP+", "device_name":"PORT51", "device_parent":"MUX2"}, "dev_attr": { "dev_idx":"51"}, "i2c": { @@ -407,7 +407,7 @@ }, "PORT52": { - "dev_info": { "device_type":"SFP28", "device_name":"PORT52", "device_parent":"MUX2"}, + "dev_info": { "device_type":"SFP+", "device_name":"PORT52", "device_parent":"MUX2"}, "dev_attr": { "dev_idx":"52"}, "i2c": { @@ -449,7 +449,7 @@ }, "PORT53": { - "dev_info": { "device_type":"SFP28", "device_name":"PORT53", "device_parent":"MUX2"}, + "dev_info": { "device_type":"SFP+", "device_name":"PORT53", "device_parent":"MUX2"}, "dev_attr": { "dev_idx":"53"}, "i2c": { @@ -491,7 +491,7 @@ }, "PORT54": { - "dev_info": { "device_type":"SFP28", "device_name":"PORT54", "device_parent":"MUX2"}, + "dev_info": { "device_type":"SFP+", "device_name":"PORT54", "device_parent":"MUX2"}, "dev_attr": { "dev_idx":"54"}, "i2c": { @@ -532,7 +532,7 @@ }, "PORT55": { - "dev_info": { "device_type":"SFP28", "device_name":"PORT55", "device_parent":"MUX2"}, + "dev_info": { "device_type":"SFP+", "device_name":"PORT55", "device_parent":"MUX2"}, "dev_attr": { "dev_idx":"55"}, "i2c": { @@ -573,7 +573,7 @@ }, "PORT56": { - "dev_info": { "device_type":"SFP28", "device_name":"PORT56", "device_parent":"MUX2"}, + "dev_info": { "device_type":"SFP+", "device_name":"PORT56", "device_parent":"MUX2"}, "dev_attr": { "dev_idx":"56"}, "i2c": { @@ -642,7 +642,7 @@ [ {"attr_name":"STATUS_LED_COLOR_AMBER","swpld_addr":"0x32","attr_devtype":"cpld","attr_devname":"CPLD1", "bits":"5:4","descr":"","value":"0x1","swpld_addr_offset":"0x43"}, {"attr_name":"STATUS_LED_COLOR_GREEN","swpld_addr":"0x32","attr_devtype":"cpld","attr_devname":"CPLD1", "bits":"5:4","descr":"","value":"0x2","swpld_addr_offset":"0x43"}, - {"attr_name":"STATUS_LED_COLOR_OFF","swpld_addr":"0x32","attr_devtype":"cpld","attr_devname":"CPLD1", "bits":"5:4","descr":"","value":"0x0","swpld_addr_offset":"0x43"} + {"attr_name":"STATUS_LED_COLOR_OFF","swpld_addr":"0x32","attr_devtype":"cpld","attr_devname":"CPLD1", "bits":"5:4","descr":"","value":"0x3","swpld_addr_offset":"0x43"} ] } }, @@ -666,7 +666,7 @@ "attr_list": [ {"attr_name":"STATUS_LED_COLOR_GREEN","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x1","swpld_addr":"0x32","swpld_addr_offset":"0x37"}, - {"attr_name":"STATUS_LED_COLOR_AMBER","attr_devtype":"cpld","attr_devname":"CPLD1B","bits":"1:0","descr":"","value":"0x2","swpld_addr":"0x32","swpld_addr_offset":"0x37"} + {"attr_name":"STATUS_LED_COLOR_AMBER","attr_devtype":"cpld","attr_devname":"CPLD1","bits":"1:0","descr":"","value":"0x2","swpld_addr":"0x32","swpld_addr_offset":"0x37"} ] } }, diff --git a/device/celestica/x86_64-cel_belgite-r0/platform.json b/device/celestica/x86_64-cel_belgite-r0/platform.json index 1d4a1f9e34..0e40fe8a88 100644 --- a/device/celestica/x86_64-cel_belgite-r0/platform.json +++ b/device/celestica/x86_64-cel_belgite-r0/platform.json @@ -11,10 +11,7 @@ "name": "SWCPLD" }, { - "name": "Main_BIOS" - }, - { - "name": "Backup_BIOS" + "name": "BIOS" } ], "fans": [ @@ -391,5 +388,398 @@ } ] }, - "interfaces": {} + "interfaces": { + "Ethernet0": { + "index": "1", + "lanes": "26", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/1"] + } + }, + "Ethernet1": { + "index": "2", + "lanes": "25", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/2"] + } + }, + "Ethernet2": { + "index": "3", + "lanes": "28", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/3"] + } + }, + "Ethernet3": { + "index": "4", + "lanes": "27", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/4"] + } + }, + "Ethernet4": { + "index": "5", + "lanes": "30", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/5"] + } + }, + "Ethernet5": { + "index": "6", + "lanes": "29", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/6"] + } + }, + "Ethernet6": { + "index": "7", + "lanes": "32", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/7"] + } + }, + "Ethernet7": { + "index": "8", + "lanes": "31", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/8"] + } + }, + "Ethernet8": { + "index": "9", + "lanes": "34", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/9"] + } + }, + "Ethernet9": { + "index": "10", + "lanes": "33", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/10"] + } + }, + "Ethernet10": { + "index": "11", + "lanes": "36", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/11"] + } + }, + "Ethernet11": { + "index": "12", + "lanes": "35", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/12"] + } + }, + "Ethernet12": { + "index": "13", + "lanes": "38", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/13"] + } + }, + "Ethernet13": { + "index": "14", + "lanes": "37", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/14"] + } + }, + "Ethernet14": { + "index": "15", + "lanes": "40", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/15"] + } + }, + "Ethernet15": { + "index": "16", + "lanes": "39", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/16"] + } + }, + "Ethernet16": { + "index": "17", + "lanes": "42", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/17"] + } + }, + "Ethernet17": { + "index": "18", + "lanes": "41", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/18"] + } + }, + "Ethernet18": { + "index": "19", + "lanes": "44", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/19"] + } + }, + "Ethernet19": { + "index": "20", + "lanes": "43", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/20"] + } + }, + "Ethernet20": { + "index": "21", + "lanes": "50", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/21"] + } + }, + "Ethernet21": { + "index": "22", + "lanes": "49", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/22"] + } + }, + "Ethernet22": { + "index": "23", + "lanes": "52", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/23"] + } + }, + "Ethernet23": { + "index": "24", + "lanes": "51", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/24"] + } + }, + "Ethernet24": { + "index": "25", + "lanes": "2", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/25"] + } + }, + "Ethernet25": { + "index": "26", + "lanes": "1", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/26"] + } + }, + "Ethernet26": { + "index": "27", + "lanes": "4", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/27"] + } + }, + "Ethernet27": { + "index": "28", + "lanes": "3", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/28"] + } + }, + "Ethernet28": { + "index": "29", + "lanes": "6", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/29"] + } + }, + "Ethernet29": { + "index": "30", + "lanes": "5", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/30"] + } + }, + "Ethernet30": { + "index": "31", + "lanes": "8", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/31"] + } + }, + "Ethernet31": { + "index": "32", + "lanes": "7", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/32"] + } + }, + "Ethernet32": { + "index": "33", + "lanes": "10", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/33"] + } + }, + "Ethernet33": { + "index": "34", + "lanes": "9", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/34"] + } + }, + "Ethernet34": { + "index": "35", + "lanes": "12", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/35"] + } + }, + "Ethernet35": { + "index": "36", + "lanes": "11", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/36"] + } + }, + "Ethernet36": { + "index": "37", + "lanes": "14", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/37"] + } + }, + "Ethernet37": { + "index": "38", + "lanes": "13", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/38"] + } + }, + "Ethernet38": { + "index": "39", + "lanes": "16", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/39"] + } + }, + "Ethernet39": { + "index": "40", + "lanes": "15", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/40"] + } + }, + "Ethernet40": { + "index": "41", + "lanes": "18", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/41"] + } + }, + "Ethernet41": { + "index": "42", + "lanes": "17", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/42"] + } + }, + "Ethernet42": { + "index": "43", + "lanes": "20", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/43"] + } + }, + "Ethernet43": { + "index": "44", + "lanes": "19", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/44"] + } + }, + "Ethernet44": { + "index": "45", + "lanes": "22", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/45"] + } + }, + "Ethernet45": { + "index": "46", + "lanes": "21", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/46"] + } + }, + "Ethernet46": { + "index": "47", + "lanes": "24", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/47"] + } + }, + "Ethernet47": { + "index": "48", + "lanes": "23", + "breakout_modes": { + "1x1000[100,10]": ["Ethernet1/0/48"] + } + }, + "Ethernet48": { + "index": "49", + "lanes": "60", + "breakout_modes": { + "1x10G[1G]": ["Ethernet1/0/49"] + } + }, + "Ethernet49": { + "index": "50", + "lanes": "58", + "breakout_modes": { + "1x10G[1G]": ["Ethernet1/0/50"] + } + }, + "Ethernet50": { + "index": "51", + "lanes": "59", + "breakout_modes": { + "1x10G[1G]": ["Ethernet1/0/51"] + } + }, + "Ethernet51": { + "index": "52", + "lanes": "57", + "breakout_modes": { + "1x10G[1G]": ["Ethernet1/0/52"] + } + }, + "Ethernet52": { + "index": "53", + "lanes": "62", + "breakout_modes": { + "1x10G[1G]": ["Ethernet1/0/53"] + } + }, + "Ethernet53": { + "index": "54", + "lanes": "64", + "breakout_modes": { + "1x10G[1G]": ["Ethernet1/0/54"] + } + }, + "Ethernet54": { + "index": "55", + "lanes": "61", + "breakout_modes": { + "1x10G[1G]": ["Ethernet1/0/55"] + } + }, + "Ethernet55": { + "index": "56", + "lanes": "63", + "breakout_modes": { + "1x10G[1G]": ["Ethernet1/0/56"] + } + } + } } diff --git a/device/celestica/x86_64-cel_belgite-r0/platform_components.json b/device/celestica/x86_64-cel_belgite-r0/platform_components.json new file mode 100644 index 0000000000..23a4ce41cd --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/platform_components.json @@ -0,0 +1,10 @@ +{ + "chassis": { + "E1070": { + "component": { + "SWCPLD": {}, + "BIOS": {} + } + } + } +} diff --git a/device/celestica/x86_64-cel_belgite-r0/plugins/psuutil.py b/device/celestica/x86_64-cel_belgite-r0/plugins/psuutil.py new file mode 100644 index 0000000000..056a3f1b17 --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/plugins/psuutil.py @@ -0,0 +1,78 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + +import os + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + if index == 1: + status_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-0/i2c-4/4-0058/psu_power_good" + elif index == 2: + status_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-0/i2c-4/4-0059/psu_power_good" + else: + return False + + try: + with open(status_path, 'r') as fd: + status = fd.read().rstrip('\r\n') + if status == '0': + return True + else: + return False + except IOError: + return False + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + + if index == 1: + status_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-0/i2c-4/4-0058/psu_present" + elif index == 2: + status_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-0/i2c-4/4-0059/psu_present" + else: + return False + + try: + with open(status_path, 'r') as fd: + status = fd.read().rstrip('\r\n') + if status == '1': + return True + else: + return False + except IOError: + return False diff --git a/device/celestica/x86_64-cel_belgite-r0/plugins/sfputil.py b/device/celestica/x86_64-cel_belgite-r0/plugins/sfputil.py new file mode 100644 index 0000000000..d938bf4c1a --- /dev/null +++ b/device/celestica/x86_64-cel_belgite-r0/plugins/sfputil.py @@ -0,0 +1,142 @@ +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 1 + PORT_END = 56 + SFP_PORT_START = 49 + SFP_PORT_END = 56 + SFP_I2C_BUS_START = 0xa + PORTS_IN_BLOCK = 56 + + _port_to_eeprom_mapping = {} + sfp_status_dict = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return list(range(self.PORT_START, self.PORTS_IN_BLOCK + 1)) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' + + for port_idx in range(self.SFP_PORT_START, self.SFP_PORT_END + 1): + self._port_to_eeprom_mapping[port_idx] = eeprom_path.format(self.SFP_I2C_BUS_START + (port_idx - self.SFP_PORT_START)) + self.sfp_status_dict[port_idx] = 0 #Initialize all modules as absent/removed + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.SFP_PORT_START or port_num > self.SFP_PORT_END: + return False + + sfp_status_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-0/i2c-9/i2c-{0}/{0}-0066/xcvr_present"\ + .format(self.SFP_I2C_BUS_START + (port_num - self.SFP_PORT_START)) + try: + with open(sfp_status_path, 'r') as fd: + status = fd.read().rstrip('\r\n') + if status == '0': + return True + else: + return False + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.SFP_PORT_START or port_num > self.SFP_PORT_END: + return False + + sfp_lpmode_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-0/i2c-9/i2c-{0}/{0}-0066/xcvr_lpmode"\ + .format(self.SFP_I2C_BUS_START + (port_num - self.SFP_PORT_START)) + try: + with open(sfp_lpmode_path, 'r') as fd: + status = fd.read().rstrip('\r\n') + if status == '1': + return True + else: + return False + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + return False + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.SFP_PORT_START or port_num > self.SFP_PORT_END: + return False + + sfp_lpmode_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-0/i2c-9/i2c-{0}/{0}-0066/xcvr_lpmode"\ + .format(self.SFP_I2C_BUS_START + (port_num - self.SFP_PORT_START)) + try: + with open(sfp_lpmode_path, 'w') as fd: + if lpmode: + fd.write('1') + else: + fd.write('0') + + return True + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + return False + + def reset(self, port_num): + # SFP reset is not supported + return False + + def get_transceiver_change_event(self, timeout=0): + sfp_dict = {} + + SFP_REMOVED = '0' + SFP_INSERTED = '1' + + SFP_PRESENT = True + SFP_ABSENT = False + + start_time = time.time() + time_period = timeout/float(1000) #Convert msecs to secs + + while time.time() < (start_time + time_period) or timeout == 0: + for port_idx in range(self.SFP_PORT_START, self.SFP_PORT_END + 1): + if self.sfp_status_dict[port_idx] == SFP_REMOVED and \ + self.get_presence(port_idx) == SFP_PRESENT: + sfp_dict[str(port_idx)] = SFP_INSERTED + self.sfp_status_dict[port_idx] = SFP_INSERTED + elif self.sfp_status_dict[port_idx] == SFP_INSERTED and \ + self.get_presence(port_idx) == SFP_ABSENT: + sfp_dict[str(port_idx)] = SFP_REMOVED + self.sfp_status_dict[port_idx] = SFP_REMOVED + + if sfp_dict != {}: + return (True, {'sfp':sfp_dict}) + + time.sleep(0.5) + + return (True, {}) # Timeout diff --git a/device/celestica/x86_64-cel_belgite-r0/pmon_daemon_control.json b/device/celestica/x86_64-cel_belgite-r0/pmon_daemon_control.json index 689def2c1e..32250390cd 100644 --- a/device/celestica/x86_64-cel_belgite-r0/pmon_daemon_control.json +++ b/device/celestica/x86_64-cel_belgite-r0/pmon_daemon_control.json @@ -1,4 +1,6 @@ { "skip_ledd": true, - "skip_pcied": true + "skip_pcied": true, + "skip_fancontrol": true, + "skip_xcvrd_cmis_mgr": true } diff --git a/device/celestica/x86_64-cel_belgite-r0/system_health_monitoring_config.json b/device/celestica/x86_64-cel_belgite-r0/system_health_monitoring_config.json index 4dc38d035a..28b3e30a66 100644 --- a/device/celestica/x86_64-cel_belgite-r0/system_health_monitoring_config.json +++ b/device/celestica/x86_64-cel_belgite-r0/system_health_monitoring_config.json @@ -3,14 +3,14 @@ "devices_to_ignore": [ "asic", "psu.temperature", - "PSU2 Fan", - "PSU1 Fan" + "PSU1_FAN1", + "PSU2_FAN1" ], "user_defined_checkers": [], "polling_interval": 60, "led_color": { - "fault": "orange", + "fault": "amber", "normal": "green", "booting": "orange_blink" } -} \ No newline at end of file +} diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/chassis.py index 5e2b204e3d..ed2e339461 100644 --- a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/chassis.py @@ -4,6 +4,7 @@ # ############################################################################# import os +import time try: from sonic_platform_pddf_base.pddf_chassis import PddfChassis @@ -14,26 +15,29 @@ try: import sys import subprocess from sonic_py_common import device_info + from sonic_platform_base.sfp_base import SfpBase except ImportError as e: raise ImportError(str(e) + "- required module not found") -NUM_COMPONENT = 3 -FAN_DIRECTION_FILE_PATH = "/var/fan_direction" +NUM_COMPONENT = 2 class Chassis(PddfChassis): """ PDDF Platform-specific Chassis class """ + sfp_status_dict = {} def __init__(self, pddf_data=None, pddf_plugin_data=None): PddfChassis.__init__(self, pddf_data, pddf_plugin_data) - vendor_ext = self._eeprom.vendor_ext_str() - with open(FAN_DIRECTION_FILE_PATH, "w+") as f: - f.write(vendor_ext) (self.platform, self.hwsku) = device_info.get_platform_and_hwsku() self.__initialize_components() + self.sfp_port_list = list(range(49, 56+1)) + + for port_idx in self.sfp_port_list: + present = self.get_sfp(port_idx).get_presence() + self.sfp_status_dict[port_idx] = '1' if present else '0' def __initialize_components(self): from sonic_platform.component import Component @@ -121,12 +125,14 @@ class Chassis(PddfChassis): description = 'Unkown Reason' return (reboot_cause, description) - - def get_serial(self): - return self._eeprom.serial_number_str() - + def get_revision(self): - return self._eeprom.revision_str() + version_str = self._eeprom.revision_str() + + if version_str != "NA": + return str(bytearray(version_str, 'ascii')[0]) + + return version_str @staticmethod def get_position_in_parent(): @@ -134,19 +140,7 @@ class Chassis(PddfChassis): @staticmethod def is_replaceable(): - return True - - def get_base_mac(self): - return self._eeprom.base_mac_addr() - - def get_system_eeprom_info(self): - return self._eeprom.system_eeprom_info() - - def get_name(self): - return self.modelstr() - - def get_model(self): - return self._eeprom.part_number_str() + return False def set_status_led(self, color): color_dict = { @@ -155,8 +149,94 @@ class Chassis(PddfChassis): 'amber': "STATUS_LED_COLOR_AMBER", 'off': "STATUS_LED_COLOR_OFF" } - return self.set_system_led("SYS_LED", color_dict.get(color, "off")) + return self.set_system_led("SYS_LED", color_dict.get(color, "STATUS_LED_COLOR_OFF")) def get_status_led(self): return self.get_system_led("SYS_LED") - + + def get_port_or_cage_type(self, index): + """ + Retrieves sfp port or cage type corresponding to physical port + + Args: + index: An integer (>=0), the index of the sfp to retrieve. + The index should correspond to the physical port in a chassis. + For example:- + 1 for Ethernet0, 2 for Ethernet4 and so on for one platform. + 0 for Ethernet0, 1 for Ethernet4 and so on for another platform. + + Returns: + The masks of all types of port or cage that can be supported on the port + Types are defined in sfp_base.py + Eg. + Both SFP and SFP+ are supported on the port, the return value should be 0x0a + which is 0x02 | 0x08 + """ + if index in range(1, 48+1): + return SfpBase.SFP_PORT_TYPE_BIT_RJ45 + elif index in range(49, 56+1): + return (SfpBase.SFP_PORT_TYPE_BIT_SFP | SfpBase.SFP_PORT_TYPE_BIT_SFP_PLUS) + else: + raise NotImplementedError + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + + Returns: + (bool, dict): + - True if call successful, False if not; + - A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, + where device_id is the device ID for this device and + device_event, + status='1' represents device inserted, + status='0' represents device removed. + Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0'}} + indicates that fan 0 has been removed, fan 2 + has been inserted and sfp 11 has been removed. + Specifically for SFP event, besides SFP plug in and plug out, + there are some other error event could be raised from SFP, when + these error happened, SFP eeprom will not be avalaible, XCVRD shall + stop to read eeprom before SFP recovered from error status. + status='2' I2C bus stuck, + status='3' Bad eeprom, + status='4' Unsupported cable, + status='5' High Temperature, + status='6' Bad cable. + """ + + sfp_dict = {} + + SFP_REMOVED = '0' + SFP_INSERTED = '1' + + SFP_PRESENT = True + SFP_ABSENT = False + + start_time = time.time() + time_period = timeout/float(1000) #Convert msecs to secs + + while time.time() < (start_time + time_period) or timeout == 0: + for port_idx in self.sfp_port_list: + if self.sfp_status_dict[port_idx] == SFP_REMOVED and \ + self.get_sfp(port_idx).get_presence() == SFP_PRESENT: + sfp_dict[port_idx] = SFP_INSERTED + self.sfp_status_dict[port_idx] = SFP_INSERTED + elif self.sfp_status_dict[port_idx] == SFP_INSERTED and \ + self.get_sfp(port_idx).get_presence() == SFP_ABSENT: + sfp_dict[port_idx] = SFP_REMOVED + self.sfp_status_dict[port_idx] = SFP_REMOVED + + if sfp_dict: + return True, {'sfp':sfp_dict} + + time.sleep(0.5) + + return True, {'sfp':{}} # Timeout diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/component.py index 7fee0aee58..3b68c5759b 100644 --- a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/component.py +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/component.py @@ -9,21 +9,19 @@ ############################################################################# import subprocess +import time try: from sonic_platform_base.component_base import ComponentBase - from sonic_py_common.general import getstatusoutput_noshell_pipe #from helper import APIHelper except ImportError as e: raise ImportError(str(e) + "- required module not found") -SWCPLD_VERSION_PATH = ["i2cget", "-y", "-f", "2", "0x32", "0"] -BIOS_VERSION_PATH_CMD1 = ["dmidecode", "-t", "bios"] -BIOS_VERSION_PATH_CMD2 = ["grep", "Version"] -COMPONENT_NAME_LIST = ["SWCPLD", "Main_BIOS", "Backup_BIOS"] -COMPONENT_DES_LIST = ["Use for boot control and BIOS switch", - "Main basic Input/Output System", - "Backup basic Input/Output System"] +SWCPLD_VERSION_PATH = ['i2cget', '-y', '-f', '2', '0x32', '0'] +BIOS_VERSION_PATH = ['dmidecode', '-s', 'bios-version'] +COMPONENT_NAME_LIST = ["SWCPLD", "BIOS"] +COMPONENT_DES_LIST = ["Used for managing the chassis and SFP+ ports (49-56)", + "Basic Input/Output System"] class Component(ComponentBase): @@ -34,43 +32,32 @@ class Component(ComponentBase): def __init__(self, component_index): ComponentBase.__init__(self) self.index = component_index - #self._api_helper = APIHelper() self.name = self.get_name() - def run_command(self,cmd): - responses = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True).stdout.read() - return responses - def __get_bios_version(self): # Retrieves the BIOS firmware version - result = self.run_command(["i2cget", "-y", "-f", "2", "0x32", "0x19"]) - if result.strip() == "0x01": - if self.name == "Main_BIOS": - _, version = getstatusoutput_noshell_pipe(BIOS_VERSION_PATH_CMD1, BIOS_VERSION_PATH_CMD2) - bios_version = version.strip().split(" ")[1] - return str(bios_version) - elif self.name == "Backup_BIOS": - bios_version = "na" - return bios_version - - elif result.strip() == "0x03": - if self.name == "Backup_BIOS": - _, version = getstatusoutput_noshell_pipe(BIOS_VERSION_PATH_CMD1, BIOS_VERSION_PATH_CMD2) - bios_version = version.strip().split(" ")[1] - return str(bios_version) - elif self.name == "Main_BIOS": - bios_version = "na" - return bios_version + version = "N/A" + + try: + p = subprocess.Popen(BIOS_VERSION_PATH, stdout=subprocess.PIPE, universal_newlines=True) + data = p.communicate() + version = data[0].strip() + except IOError: + pass + + return version def __get_cpld_version(self): - if self.name == "SWCPLD": - ver = self.run_command(SWCPLD_VERSION_PATH) - print("ver is %s" % ver) - ver = ver.strip().split("x")[1] - print("ver2 is %s" % ver) - version = int(ver.strip()) / 10 - return str(version) + version = "N/A" + try: + p = subprocess.Popen(SWCPLD_VERSION_PATH, stdout=subprocess.PIPE, universal_newlines=True) + data = p.communicate() + ver = int(data[0].strip(), 16) + version = "{0}.{1}".format(ver >> 4, ver & 0x0F) + except (IOError, ValueError): + pass + return version def get_name(self): """ @@ -96,7 +83,7 @@ class Component(ComponentBase): """ fw_version = None - if "BIOS" in self.name: + if self.name == "BIOS": fw_version = self.__get_bios_version() elif "CPLD" in self.name: fw_version = self.__get_cpld_version() diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan.py index d5ee08049d..5ece7e9809 100644 --- a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan.py +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/fan.py @@ -9,7 +9,6 @@ except ImportError as e: # add function:set_status_led, # Solve the problem that when a fan is pulled out, the Fan LED on the front panel is still green Issue-#11525 # ------------------------------------------------------------------ -FAN_DIRECTION_FILE_PATH = "/var/fan_direction" class Fan(PddfFan): @@ -31,11 +30,25 @@ class Fan(PddfFan): # Fix the speed vairance to 10 percent. If it changes based on platforms, overwrite # this value in derived pddf fan class return 20 - - + def get_presence(self): - #Overwirte the PDDF Common since the FANs on Belgite are all Fixed and present - return True + if self.is_psu_fan: + #For PSU, FAN must be present when PSU is present + try: + cmd = ['i2cget', '-y', '-f', '0x2', '0x32', '0x41'] + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) + data = p.communicate() + status = int(data[0].strip(), 16) + if (self.fans_psu_index == 1 and (status & 0x10) == 0) or \ + (self.fans_psu_index == 2 and (status & 0x20) == 0): + return True + except (IOError, ValueError): + pass + + return False + else: + #Overwirte the PDDF Common since the FANs on Belgite are all Fixed and present + return True def get_direction(self): """ @@ -46,102 +59,35 @@ class Fan(PddfFan): depending on fan direction """ if self.is_psu_fan: - cmd_num = "58" if self.fans_psu_index == 1 else "59" - cmd = ["i2cget", "-y", "-f", "4", "", "0x80"] - cmd[4] = "0x" + cmd_num - res = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True).stdout.read() - # F2B - if res.strip() == "0x01": - direction = "EXHAUST" - else: - direction = "INTAKE" + # Belgite PSU module only has EXHAUST fan + return "EXHAUST" else: - direction = "INTAKE" - with open(FAN_DIRECTION_FILE_PATH, "r") as f: - fan_direction = f.read() - if fan_direction.strip() == "FB": - direction = "EXHAUST" - return direction - + return super().get_direction() - def get_status(self): - speed = self.get_speed_rpm() - status = True if (speed != 0) else False - return status - - def get_target_speed(self): + def get_status_led(self): """ - Retrieves the target (expected) speed of the fan + Gets the state of the fan status LED Returns: - An integer, the percentage of full fan speed, in the range 0 (off) - to 100 (full speed) + A string, one of the predefined STATUS_LED_COLOR_* strings above """ - target_speed = 0 if self.is_psu_fan: - # Target speed not usually supported for PSU fans - target_speed = "N/A" + return "N/A" else: - idx = (self.fantray_index - 1) * 1 + self.fan_index - attr = "fan" + str(idx) + "_pwm" - pwm_path = "/sys/devices/pci0000:00/0000:00:12.0/i2c-0/i2c-2/2-0066/" + attr - pwm = 0 - with open(pwm_path, "r") as f: - pwm = f.read() - - percentage = int(pwm.strip()) - speed_percentage = int(round(percentage / 255 * 100)) - target_speed = speed_percentage - - return target_speed + return super().get_status_led() def set_status_led(self, color): - color_dict = {"green": "STATUS_LED_COLOR_GREEN", - "red": "STATUS_LED_COLOR_AMBER"} - color = color_dict.get(color, "off") - index = str(self.fantray_index - 1) - led_device_name = "FANTRAY{}".format(self.fantray_index) + "_LED" + """ + Sets the state of the fan module status LED - result, msg = self.pddf_obj.is_supported_sysled_state(led_device_name, color) - if result is False: + Args: + color: A string representing the color with which to set the + fan module status LED + + Returns: + bool: True if status LED state is set successfully, False if not + """ + if self.is_psu_fan: return False - device_name = self.pddf_obj.data[led_device_name]['dev_info']['device_name'] - self.pddf_obj.create_attr('device_name', device_name, self.pddf_obj.get_led_path()) - self.pddf_obj.create_attr('index', index, self.pddf_obj.get_led_path()) - self.pddf_obj.create_attr('color', color, self.pddf_obj.get_led_cur_state_path()) - - self.pddf_obj.create_attr('dev_ops', 'set_status', self.pddf_obj.get_led_path()) - return True - - @staticmethod - def get_model(): - """ - Retrieves the model number (or part number) of the device - Returns: - string: Model/part number of device - """ - model = "Unknown" - return model - - @staticmethod - def get_serial(): - """ - Retrieves the serial number of the device - Returns: - string: Serial number of device - """ - serial = "Unknown" - return serial - - def get_position_in_parent(self): - """ - Retrieves the fan/psu fan index number - """ - return self.fantray_index if not self.is_psu_fan else self.fans_psu_index + 4 - - @staticmethod - def is_replaceable(): - """ - Retrieves whether the device is replaceable - """ - return False + else: + return super().set_status_led(color) diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/psu.py index 9616d03001..f1047bed74 100644 --- a/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/psu.py +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/pddf/sonic_platform/psu.py @@ -53,3 +53,21 @@ class Psu(PddfPsu): def temperature(self): return self.get_temperature() + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + return 12.6 + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + return 11.4 diff --git a/platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_post_device_create.sh b/platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_post_device_create.sh index 414eea7a2b..436cf61d6d 100755 --- a/platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_post_device_create.sh +++ b/platform/broadcom/sonic-platform-modules-cel/belgite/scripts/pddf_post_device_create.sh @@ -7,4 +7,7 @@ sleep 0.1 #Set LM75 shutdown enable sudo i2cset -y -f 2 0x32 0x45 0x1 +# set sys led green status +sudo i2cset -y -f 2 0x32 0x43 0xec + echo -2 | tee /sys/bus/i2c/drivers/pca954x/*-00*/idle_state