[AS4630-54PE] Add to support PDDF (#8014)

* [AS4630-54PE] Add to support PDDF

Signed-off-by: Jostar Yang <jostar_yang@accton.com.tw>

* Fix LGTM alerts

* Fix LGTM alerts

* Fix  LGTM alerts

* Add post_device.sh to turn off stk led

* Add to support system_health

* Correct the wait and timeout mechanism for better CPU usage

* Add event.c to support port evt change

Co-authored-by: Jostar Yang <jostar_yang@accton.com.tw>
This commit is contained in:
jostar-yang 2022-02-11 00:39:05 +08:00 committed by GitHub
parent 914a8a1756
commit f9a29ef056
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 1654 additions and 1 deletions

View File

@ -0,0 +1,66 @@
{
"XCVR":
{
"xcvr_present":
{
"i2c":
{
"valmap-SFP28": {"1":true, "0":false },
"valmap-QSFP28": {"1":true, "0":false}
}
}
},
"PSU":
{
"psu_present":
{
"i2c":
{
"valmap": { "1":true, "0":false }
}
},
"psu_power_good":
{
"i2c":
{
"valmap": { "1": true, "0":false }
}
},
"psu_fan_dir":
{
"i2c":
{
"valmap": { "F2B":"EXHAUST", "B2F":"INTAKE" }
}
},
"PSU_FAN_MAX_SPEED":"18000"
},
"FAN":
{
"direction":
{
"i2c":
{
"valmap": {"1":"EXHAUST", "0":"INTAKE"}
}
},
"present":
{
"i2c":
{
"valmap": {"1":true, "0":false}
}
},
"duty_cycle_to_pwm": "lambda dc: ((dc*100.0)/625)",
"pwm_to_duty_cycle": "lambda pwm: ((pwm*625.0)/100)"
}
}

View File

@ -0,0 +1,638 @@
{
"PLATFORM":
{
"num_psus":2,
"num_fantrays":3,
"num_fans_pertray":1,
"num_ports":54,
"num_temps": 3,
"pddf_dev_types":
{
"description":"AS4630 - Below is the list of supported PDDF device types (chip names) for various components. If any component uses some other driver, we will create the client using 'echo <dev-address> <dev-type> > <path>/new_device' method",
"CPLD":
[
"i2c_cpld"
],
"PSU":
[
"psu_eeprom",
"psu_pmbus"
],
"FAN":
[
"fan_ctrl",
"fan_eeprom",
"fan_cpld"
],
"PORT_MODULE":
[
"pddf_xcvr"
]
},
"std_kos":
[
"i2c_dev",
"i2c_mux_pca954x force_deselect_on_exit=1",
"optoe"
],
"description":"kernel modules are loaded while moving to pdf mode, but they should not be unloaded while moving to nonpddf mode.",
"std_perm_kos":
[
"i2c-i801",
"i2c-ismt"
],
"pddf_kos":
[
"pddf_client_module",
"pddf_cpld_module",
"pddf_cpld_driver",
"pddf_mux_module",
"pddf_xcvr_module",
"pddf_xcvr_driver_module",
"pddf_psu_driver_module",
"pddf_psu_module",
"pddf_fan_driver_module",
"pddf_fan_module",
"pddf_led_module"
]
},
"SYSTEM":
{
"dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null},
"i2c":
{
"CONTROLLERS":
[
{ "dev_name":"i2c-1", "dev":"SMBUS1" }
]
}
},
"SMBUS1":
{
"dev_info": {"device_type": "SMBUS", "device_name": "SMBUS1", "device_parent": "SYSTEM"},
"i2c":
{
"topo_info": {"dev_addr": "0x1"},
"DEVICES":
[
{"dev": "EEPROM1"},
{"dev": "MUX1"}
]
}
},
"EEPROM1":
{
"dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS1"},
"i2c":
{
"topo_info": {"parent_bus": "0x1", "dev_addr": "0x57", "dev_type": "24c02"},
"dev_attr": {"access_mode": "BLOCK"},
"attr_list": [
{"attr_name": "eeprom"}
]
}
},
"MUX1":
{
"dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS1"},
"i2c":
{
"topo_info": { "parent_bus":"0x1", "dev_addr":"0x77", "dev_type":"pca9548"},
"dev_attr": { "virt_bus":"0x2"},
"channel":
[
{ "chn":"0", "dev":"MUX2" },
{ "chn":"1", "dev":"MUX3" },
{ "chn":"1", "dev":"CPLD1" },
{ "chn":"1", "dev":"FAN-CTRL" }
]
}
},
"MUX2":
{
"dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"MUX1"},
"i2c":
{
"topo_info": { "parent_bus":"0x2", "dev_addr":"0x71", "dev_type":"pca9548"},
"dev_attr": { "virt_bus":"0xa"},
"channel":
[
{ "chn":"0", "dev":"PSU1" },
{ "chn":"1", "dev":"PSU2" },
{ "chn":"4", "dev":"TEMP1" }
]
}
},
"TEMP1" :
{
"dev_info": { "device_type":"TEMP_SENSOR", "device_parent":"MUX2"},
"dev_attr": { "display_name":"Temp_1"},
"i2c":
{
"topo_info": { "parent_bus":"0xe", "dev_addr":"0x48", "dev_type":"lm77"},
"attr_list":
[
{ "attr_name": "temp1_high_crit_threshold", "drv_attr_name":"temp1_crit"},
{ "attr_name": "temp1_crit_hyst"},
{ "attr_name": "temp1_crit_alarm"},
{ "attr_name": "temp1_max_alarm"},
{ "attr_name": "temp1_min_alarm"},
{ "attr_name": "temp1_input"},
{ "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"},
{ "attr_name": "temp1_low_threshold", "drv_attr_name":"temp1_min"},
{ "attr_name": "temp1_max_hyst"},
{ "attr_name": "temp1_min_hyst"}
]
}
},
"MUX3":
{
"dev_info": { "device_type":"MUX", "device_name":"MUX3", "device_parent":"MUX1"},
"i2c":
{
"topo_info": { "parent_bus":"0x3", "dev_addr":"0x70", "dev_type":"pca9548"},
"dev_attr": { "virt_bus":"0x12"},
"channel":
[
{ "chn":"0", "dev":"PORT49" },
{ "chn":"1", "dev":"PORT50" },
{ "chn":"2", "dev":"PORT51" },
{ "chn":"3", "dev":"PORT52" },
{ "chn":"4", "dev":"PORT53" },
{ "chn":"5", "dev":"PORT54" },
{ "chn":"6", "dev":"TEMP2" },
{ "chn":"7", "dev":"TEMP3" }
]
}
},
"TEMP2" :
{
"dev_info": { "device_type":"TEMP_SENSOR", "device_parent":"MUX3"},
"dev_attr": { "display_name":"Temp_CPU"},
"i2c":
{
"topo_info": { "parent_bus":"0x18", "dev_addr":"0x4b", "dev_type":"lm75"},
"attr_list":
[
{ "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"},
{ "attr_name": "temp1_max_hyst"},
{ "attr_name": "temp1_input"}
]
}
},
"TEMP3" :
{
"dev_info": { "device_type":"TEMP_SENSOR", "device_parent":"MUX3"},
"dev_attr": { "display_name":"Temp_Fan"},
"i2c":
{
"topo_info": { "parent_bus":"0x19", "dev_addr":"0x4a", "dev_type":"lm75"},
"attr_list":
[
{ "attr_name": "temp1_high_threshold", "drv_attr_name":"temp1_max"},
{ "attr_name": "temp1_max_hyst"},
{ "attr_name": "temp1_input"}
]
}
},
"CPLD1":
{
"dev_info": { "device_type":"CPLD", "device_name":"CPLD1", "device_parent":"MUX1"},
"i2c":
{
"topo_info": { "parent_bus":"0x3", "dev_addr":"0x60", "dev_type":"i2c_cpld"}
}
},
"FAN-CTRL":
{
"dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL", "device_parent":"MUX1"},
"i2c":
{
"topo_info": { "parent_bus":"0x3", "dev_addr":"0x66", "dev_type":"fan_cpld"},
"dev_attr": { "num_fantrays":"3"},
"attr_list":
[
{ "attr_name":"fan1_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x87", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"},
{ "attr_name":"fan2_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x87", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"},
{ "attr_name":"fan3_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x87", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"},
{ "attr_name":"fan1_direction", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x87", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"},
{ "attr_name":"fan2_direction", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x87", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"},
{ "attr_name":"fan3_direction", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x87", "attr_mask":"0x40", "attr_cmpval":"0x40", "attr_len":"1"},
{ "attr_name":"fan1_input", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x88", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"114", "attr_is_divisor":0},
{ "attr_name":"fan2_input", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x89", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"114" , "attr_is_divisor":0},
{ "attr_name":"fan3_input", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x8a", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"114", "attr_is_divisor":0},
{ "attr_name":"fan1_pwm", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1a", "attr_mask":"0x1F", "attr_len":"1"},
{ "attr_name":"fan2_pwm", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1a", "attr_mask":"0x1F", "attr_len":"1"},
{ "attr_name":"fan3_pwm", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x1b", "attr_mask":"0x1F", "attr_len":"1"}
]
}
},
"SYS_LED":
{
"dev_info": { "device_type":"LED", "device_name":"SYS_LED"},
"dev_attr": { "index":"0"},
"i2c" : {
"attr_list":
[
{"attr_name":"STATUS_LED_COLOR_GREEN", "bits" : "7:5", "descr" : "", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x30"},
{"attr_name":"STATUS_LED_COLOR_GREEN_BLINK", "bits" : "7:5", "descr" : "", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x30"},
{"attr_name":"STATUS_LED_COLOR_AMBER", "bits" : "7:5", "descr" : "", "value" : "0x4", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x30"},
{"attr_name":"STATUS_LED_COLOR_AMBER_BLINK", "bits" : "7:5", "descr" : "", "value" : "0x2", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x30"},
{"attr_name":"STATUS_LED_COLOR_OFF", "bits" : "7:5", "descr" : "", "value" : "0x7", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x30"}
]
}
},
"PSU1_LED":
{
"dev_info": { "device_type":"LED", "device_name":"PSU_LED"},
"dev_attr": { "index":"0"},
"i2c" : {
"attr_list":
[
{"attr_name":"STATUS_LED_COLOR_GREEN", "bits" : "1:0", "descr" : "", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x30"},
{"attr_name":"STATUS_LED_COLOR_AMBER", "bits" : "1:0", "descr" : "", "value" : "0x2", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x30"},
{"attr_name":"STATUS_LED_COLOR_OFF", "bits" : "1:0", "descr" : "", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x30"}
]
}
},
"PSU2_LED":
{
"dev_info": { "device_type":"LED", "device_name":"PSU_LED"},
"dev_attr": { "index":"1"},
"i2c" : {
"attr_list":
[
{"attr_name":"STATUS_LED_COLOR_GREEN", "bits" : "7:6", "descr" : "", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x31"},
{"attr_name":"STATUS_LED_COLOR_AMBER", "bits" : "7:6", "descr" : "", "value" : "0x2", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x31"},
{"attr_name":"STATUS_LED_COLOR_OFF", "bits" : "7:6", "descr" : "", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x31"}
]
}
},
"FAN_LED":
{
"dev_info": { "device_type":"LED", "device_name":"FAN_LED"},
"dev_attr": { "index":"0"},
"i2c" : {
"attr_list":
[
{"attr_name":"STATUS_LED_COLOR_GREEN", "bits" : "3:2", "descr" : "", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x31"},
{"attr_name":"STATUS_LED_COLOR_AMBER", "bits" : "3:2", "descr" : "", "value" : "0x2", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x31"},
{"attr_name":"STATUS_LED_COLOR_OFF", "bits" : "3:2", "descr" : "", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x31"}
]
}
},
"PSU1":
{
"dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX2"},
"dev_attr": { "dev_idx":"1", "num_psu_fans": "1"},
"i2c":
{
"interface":
[
{ "itf":"pmbus", "dev":"PSU1-PMBUS" },
{ "itf":"eeprom", "dev":"PSU1-EEPROM" }
]
}
},
"PSU1-PMBUS":
{
"dev_info": { "device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX2", "virt_parent":"PSU1"},
"i2c":
{
"topo_info":{ "parent_bus":"0xa", "dev_addr":"0x58", "dev_type":"psu_pmbus"},
"attr_list":
[
{ "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" },
{ "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"},
{ "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_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"}
]
}
},
"PSU1-EEPROM":
{
"dev_info": { "device_type":"PSU-EEPROM", "device_name":"PSU1-EEPROM", "device_parent":"MUX2", "virt_parent":"PSU1"},
"i2c":
{
"topo_info":{ "parent_bus":"0xa", "dev_addr":"0x50", "dev_type":"psu_eeprom"},
"attr_list":
[
{ "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x22", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"},
{ "attr_name":"psu_model_name", "attr_devaddr":"0x50", "attr_devtype":"eeprom", "attr_offset":"0x20", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"12" },
{ "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x22", "attr_mask":"0x40", "attr_cmpval":"0x40", "attr_len":"1"},
{ "attr_name":"psu_serial_num", "attr_devaddr":"0x50", "attr_devtype":"eeprom", "attr_offset":"0x35", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"19" }
]
}
},
"PSU2":
{
"dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX2" },
"dev_attr": { "dev_idx":"2", "num_psu_fans":"1"},
"i2c":
{
"interface":
[
{ "itf":"pmbus", "dev":"PSU2-PMBUS"},
{ "itf":"eeprom", "dev":"PSU2-EEPROM"}
]
}
},
"PSU2-PMBUS":
{
"dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX2", "virt_parent":"PSU2"},
"i2c":
{
"topo_info": { "parent_bus":"0xb", "dev_addr":"0x59", "dev_type":"psu_pmbus"},
"attr_list":
[
{ "attr_name":"psu_mfr_id", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" },
{ "attr_name":"psu_fan_dir", "attr_devaddr":"0x59", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"},
{ "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_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"}
]
}
},
"PSU2-EEPROM":
{
"dev_info": {"device_type":"PSU-EEPROM", "device_name":"PSU2-EEPROM", "device_parent":"MUX2", "virt_parent":"PSU2"},
"i2c":
{
"topo_info": { "parent_bus":"0xb", "dev_addr":"0x51", "dev_type":"psu_eeprom"},
"attr_list":
[
{ "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x22", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"},
{ "attr_name":"psu_model_name", "attr_devaddr":"0x51", "attr_devtype":"eeprom", "attr_offset":"0x20", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"12" },
{ "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x22", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"},
{ "attr_name":"psu_serial_num", "attr_devaddr":"0x51", "attr_devtype":"eeprom", "attr_offset":"0x35", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"19" }
]
}
},
"PORT49":
{
"dev_info": { "device_type":"SFP28", "device_name":"PORT49", "device_parent":"MUX3"},
"dev_attr": { "dev_idx":"49"},
"i2c":
{
"interface":
[
{ "itf":"eeprom", "dev":"PORT49-EEPROM" },
{ "itf":"control", "dev":"PORT49-CTRL" }
]
}
},
"PORT49-EEPROM":
{
"dev_info": { "device_type":"", "device_name":"PORT49-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT49"},
"i2c":
{
"topo_info": { "parent_bus":"0x12", "dev_addr":"0x50", "dev_type":"optoe2"},
"attr_list":
[
{ "attr_name":"eeprom"}
]
}
},
"PORT49-CTRL":
{
"dev_info": { "device_type":"", "device_name":"PORT49-CTRL", "device_parent":"MUX3", "virt_parent":"PORT49"},
"i2c":
{
"topo_info": { "parent_bus":"0x12", "dev_addr":"0x53", "dev_type":"pddf_xcvr"},
"attr_list":
[
{ "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x05", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}
]
}
},
"PORT50":
{
"dev_info": { "device_type":"SFP28", "device_name":"PORT50", "device_parent":"MUX3"},
"dev_attr": { "dev_idx":"50"},
"i2c":
{
"interface":
[
{ "itf":"eeprom", "dev":"PORT50-EEPROM" },
{ "itf":"control", "dev":"PORT50-CTRL" }
]
}
},
"PORT50-EEPROM":
{
"dev_info": { "device_type":"", "device_name":"PORT50-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT50"},
"i2c":
{
"topo_info": { "parent_bus":"0x13", "dev_addr":"0x50", "dev_type":"optoe2"},
"attr_list":
[
{ "attr_name":"eeprom"}
]
}
},
"PORT50-CTRL":
{
"dev_info": { "device_type":"", "device_name":"PORT50-CTRL", "device_parent":"MUX3", "virt_parent":"PORT50"},
"i2c":
{
"topo_info": { "parent_bus":"0x13", "dev_addr":"0x53", "dev_type":"pddf_xcvr"},
"attr_list":
[
{ "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x05", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}
]
}
},
"PORT51":
{
"dev_info": { "device_type":"SFP28", "device_name":"PORT51", "device_parent":"MUX3"},
"dev_attr": { "dev_idx":"51"},
"i2c":
{
"interface":
[
{ "itf":"eeprom", "dev":"PORT51-EEPROM" },
{ "itf":"control", "dev":"PORT51-CTRL" }
]
}
},
"PORT51-EEPROM":
{
"dev_info": { "device_type":"", "device_name":"PORT51-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT51"},
"i2c":
{
"topo_info": { "parent_bus":"0x14", "dev_addr":"0x50", "dev_type":"optoe2"},
"attr_list":
[
{ "attr_name":"eeprom"}
]
}
},
"PORT51-CTRL":
{
"dev_info": { "device_type":"", "device_name":"PORT51-CTRL", "device_parent":"MUX3", "virt_parent":"PORT51"},
"i2c":
{
"topo_info": { "parent_bus":"0x14", "dev_addr":"0x53", "dev_type":"pddf_xcvr"},
"attr_list":
[
{ "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x06", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}
]
}
},
"PORT52":
{
"dev_info": { "device_type":"SFP28", "device_name":"PORT52", "device_parent":"MUX3"},
"dev_attr": { "dev_idx":"52"},
"i2c":
{
"interface":
[
{ "itf":"eeprom", "dev":"PORT52-EEPROM" },
{ "itf":"control", "dev":"PORT52-CTRL" }
]
}
},
"PORT52-EEPROM":
{
"dev_info": { "device_type":"", "device_name":"PORT52-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT52"},
"i2c":
{
"topo_info": { "parent_bus":"0x15", "dev_addr":"0x50", "dev_type":"optoe2"},
"attr_list":
[
{ "attr_name":"eeprom"}
]
}
},
"PORT52-CTRL":
{
"dev_info": { "device_type":"", "device_name":"PORT52-CTRL", "device_parent":"MUX3", "virt_parent":"PORT52"},
"i2c":
{
"topo_info": { "parent_bus":"0x15", "dev_addr":"0x53", "dev_type":"pddf_xcvr"},
"attr_list":
[
{ "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x06", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}
]
}
},
"PORT53":
{
"dev_info": { "device_type":"QSFP28", "device_name":"PORT53", "device_parent":"MUX3"},
"dev_attr": { "dev_idx":"53"},
"i2c":
{
"interface":
[
{ "itf":"eeprom", "dev":"PORT53-EEPROM" },
{ "itf":"control", "dev":"PORT53-CTRL" }
]
}
},
"PORT53-EEPROM":
{
"dev_info": { "device_type":"", "device_name":"PORT53-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT53"},
"i2c":
{
"topo_info": { "parent_bus":"0x16", "dev_addr":"0x50", "dev_type":"optoe1"},
"attr_list":
[
{ "attr_name":"eeprom"}
]
}
},
"PORT53-CTRL":
{
"dev_info": { "device_type":"", "device_name":"PORT53-CTRL", "device_parent":"MUX3", "virt_parent":"PORT53"},
"i2c":
{
"topo_info": { "parent_bus":"0x16", "dev_addr":"0x53", "dev_type":"pddf_xcvr"},
"attr_list":
[
{ "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x21", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}
]
}
},
"PORT54":
{
"dev_info": { "device_type":"QSFP28", "device_name":"PORT54", "device_parent":"MUX3"},
"dev_attr": { "dev_idx":"54"},
"i2c":
{
"interface":
[
{ "itf":"eeprom", "dev":"PORT54-EEPROM" },
{ "itf":"control", "dev":"PORT54-CTRL" }
]
}
},
"PORT54-EEPROM":
{
"dev_info": { "device_type":"", "device_name":"PORT54-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT54"},
"i2c":
{
"topo_info": { "parent_bus":"0x17", "dev_addr":"0x50", "dev_type":"optoe1"},
"attr_list":
[
{ "attr_name":"eeprom"}
]
}
},
"PORT54-CTRL":
{
"dev_info": { "device_type":"", "device_name":"PORT54-CTRL", "device_parent":"MUX3", "virt_parent":"PORT54"},
"i2c":
{
"topo_info": { "parent_bus":"0x17", "dev_addr":"0x53", "dev_type":"pddf_xcvr"},
"attr_list":
[
{ "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_devname":"CPLD1", "attr_offset":"0x21", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}
]
}
}
}

View File

@ -1,5 +1,5 @@
{
"skip_ledd": true,
"skip_thermalctld": true
"skip_pcied": true
}

View File

@ -0,0 +1,17 @@
{
"services_to_ignore": [],
"devices_to_ignore": [
"asic",
"psu.voltage",
"psu.temperature",
"PSU1_FAN1.speed",
"PSU2_FAN1.speed"
],
"user_defined_checkers": [],
"polling_interval": 60,
"led_color": {
"fault": "STATUS_LED_COLOR_AMBER",
"normal": "STATUS_LED_COLOR_GREEN",
"booting": "STATUS_LED_COLOR_GREEN_BLINK"
}
}

View File

@ -0,0 +1,16 @@
[Unit]
Description=Accton AS4630-54PE Platform Monitoring service
Before=pmon.service
After=pddf-platform-init.service
DefaultDependencies=no
[Service]
ExecStart=/usr/local/bin/accton_as4630_54pe_pddf_monitor.py
KillSignal=SIGKILL
SuccessExitStatus=SIGKILL
# Resource Limitations
LimitCORE=infinity
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1 @@
../../../../pddf/i2c/service/pddf-platform-init.service

View File

@ -0,0 +1,3 @@
# All the derived classes for PDDF
__all__ = ["platform", "chassis", "sfp", "psu", "thermal"]
from . import platform

View File

@ -0,0 +1,70 @@
#!/usr/bin/env python
#############################################################################
# PDDF
# Module contains an implementation of SONiC Chassis API
#
#############################################################################
try:
import sys
from sonic_platform_pddf_base.pddf_chassis import PddfChassis
from .event import SfpEvent
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
NUM_COMPONENT = 2
class Chassis(PddfChassis):
"""
PDDF Platform-specific Chassis class
"""
SYSLED_DEV_NAME = "SYS_LED"
def __init__(self, pddf_data=None, pddf_plugin_data=None):
PddfChassis.__init__(self, pddf_data, pddf_plugin_data)
self.__initialize_components()
self._sfpevent = SfpEvent(self.get_all_sfps())
def __initialize_components(self):
from sonic_platform.component import Component
for index in range(NUM_COMPONENT):
component = Component(index)
self._component_list.append(component)
# Provide the functions/variables below for which implementation is to be overwritten
def get_change_event(self, timeout=0):
return self._sfpevent.get_sfp_event(timeout)
def get_sfp(self, index):
"""
Retrieves sfp represented by (1-based) index <index>
Args:
index: An integer, the index (1-based) of the sfp to retrieve.
The index should be the sequence of a physical port in a chassis,
starting from 1.
For example, 1 for Ethernet0, 2 for Ethernet4 and so on.
Returns:
An object derived from SfpBase representing the specified sfp
"""
sfp = None
try:
# The index will start from 1
sfp = self._sfp_list[index-1]
except IndexError:
sys.stderr.write("SFP index {} out of range (1-{})\n".format(
index, len(self._sfp_list)))
return sfp
def initizalize_system_led(self):
return
def get_status_led(self):
return self.get_system_led(self.SYSLED_DEV_NAME)
def set_status_led(self, color):
return self.set_system_led(self.SYSLED_DEV_NAME, color)

View File

@ -0,0 +1,85 @@
#!/usr/bin/env python
#############################################################################
#
# Module contains an implementation of SONiC Platform Base API and
# provides the component information (such as CPLD, FPGA, BIOS etc) which are available in the platform
#
#############################################################################
try:
import subprocess
from sonic_platform_base.component_base import ComponentBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version"
#COMPONENT_NAME_LIST = ["CPLD1"]
COMPONENT_LIST = [
("CPLD1", "CPLD 1"),
("BIOS", "Basic Input/Output System")
]
class Component(ComponentBase):
"""Platform-specific Component class"""
def __init__(self, component_index):
self.index = component_index
self.name = self.get_name()
self.cpld_mapping = {
0: ['3', '0x60']
}
def get_name(self):
"""
Retrieves the name of the component
Returns:
A string containing the name of the component
"""
return COMPONENT_LIST[self.index][0]
def get_description(self):
"""
Retrieves the description of the component
Returns:
A string containing the description of the component
"""
return COMPONENT_LIST[self.index][1]
def __get_bios_version(self):
# Retrieves the BIOS firmware version
try:
with open(BIOS_VERSION_PATH, 'r') as fd:
bios_version = fd.read()
return bios_version.strip()
except Exception as e:
return None
def get_firmware_version(self):
"""
Retrieves the firmware version of module
Returns:
string: The firmware versions of the module
"""
fw_version = None
if self.name == "BIOS":
fw_version = self.__get_bios_version()
elif "CPLD" in self.name:
cmd = "i2cget -f -y {0} {1} 0x1".format(self.cpld_mapping[self.index][0], self.cpld_mapping[self.index][1])
status, value = subprocess.getstatusoutput(cmd)
if not status:
fw_version = value.rstrip()
return fw_version
def install_firmware(self, image_path):
"""
Install firmware to module
Args:
image_path: A string, path to firmware image
Returns:
A boolean, True if install successfully, False if not
"""
raise NotImplementedError

View File

@ -0,0 +1,14 @@
#!/usr/bin/env python
try:
from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Eeprom(PddfEeprom):
def __init__(self, pddf_data=None, pddf_plugin_data=None):
PddfEeprom.__init__(self, pddf_data, pddf_plugin_data)
# Provide the functions/variables below for which implementation is to be overwritten

View File

@ -0,0 +1,60 @@
try:
import time
from sonic_py_common.logger import Logger
except ImportError as e:
raise ImportError(repr(e) + " - required module not found")
POLL_INTERVAL_IN_SEC = 1
class SfpEvent:
''' Listen to insert/remove sfp events '''
def __init__(self, sfp_list):
self._sfp_list = sfp_list
self._logger = Logger()
self._sfp_change_event_data = {'present': 0}
def get_presence_bitmap(self):
bitmap = 0
for sfp in self._sfp_list:
modpres = sfp.get_presence()
i=sfp.get_position_in_parent() - 1
if modpres:
bitmap = bitmap | (1 << i)
return bitmap
def get_sfp_event(self, timeout=2000):
port_dict = {}
change_dict = {}
change_dict['sfp'] = port_dict
if timeout < 1000:
cd_ms = 1000
else:
cd_ms = timeout
while cd_ms > 0:
bitmap = self.get_presence_bitmap()
changed_ports = self._sfp_change_event_data['present'] ^ bitmap
if changed_ports != 0:
break
time.sleep(POLL_INTERVAL_IN_SEC)
# timeout=0 means wait for event forever
if timeout != 0:
cd_ms = cd_ms - POLL_INTERVAL_IN_SEC * 1000
if changed_ports != 0:
for sfp in self._sfp_list:
i=sfp.get_position_in_parent() - 1
if (changed_ports & (1 << i)):
if (bitmap & (1 << i)) == 0:
port_dict[i+1] = '0'
else:
port_dict[i+1] = '1'
# Update the cache dict
self._sfp_change_event_data['present'] = bitmap
return True, change_dict
else:
return True, change_dict

View File

@ -0,0 +1,48 @@
#!/usr/bin/env python
try:
from sonic_platform_pddf_base.pddf_fan import PddfFan
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Fan(PddfFan):
"""PDDF Platform-Specific Fan class"""
def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0):
# idx is 0-based
PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index)
# Provide the functions/variables below for which implementation is to be overwritten
# Since AS4630 psu_fan airflow direction cant be read from sysfs, it is fixed as 'F2B' or 'Exhaust'
def get_direction(self):
"""
Retrieves the direction of fan
Returns:
A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST
depending on fan direction
"""
if self.is_psu_fan:
direction = self.FAN_DIRECTION_EXHAUST
else:
idx = (self.fantray_index-1)*self.platform['num_fans_pertray'] + self.fan_index
attr = "fan" + str(idx) + "_direction"
output = self.pddf_obj.get_attr_name_output("FAN-CTRL", attr)
if not output:
return False
mode = output['mode']
val = output['status']
val = val.rstrip()
vmap = self.plugin_data['FAN']['direction'][mode]['valmap']
if val in vmap:
direction = vmap[val]
else:
direction = val
return direction

View File

@ -0,0 +1,25 @@
#!/usr/bin/env python
#############################################################################
# PDDF
# Module contains an implementation of SONiC Platform Base API and
# provides the platform information
#
#############################################################################
try:
from sonic_platform_pddf_base.pddf_platform import PddfPlatform
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Platform(PddfPlatform):
"""
PDDF Platform-Specific Platform Class
"""
def __init__(self):
PddfPlatform.__init__(self)
# Provide the functions/variables below for which implementation is to be overwritten

View File

@ -0,0 +1,51 @@
#!/usr/bin/env python
#
try:
from sonic_platform_pddf_base.pddf_psu import PddfPsu
except ImportError as e:
raise ImportError (str(e) + "- required module not found")
class Psu(PddfPsu):
"""PDDF Platform-Specific PSU class"""
PLATFORM_PSU_CAPACITY = 1200
def __init__(self, index, pddf_data=None, pddf_plugin_data=None):
PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data)
# Provide the functions/variables below for which implementation is to be overwritten
def get_capacity(self):
"""
Gets the capacity (maximum output power) of the PSU in watts
Returns:
An integer, the capacity of PSU
"""
return (self.PLATFORM_PSU_CAPACITY)
def get_type(self):
"""
Gets the type of the PSU
Returns:
A string, the type of PSU (AC/DC)
"""
ptype = "AC"
# Currently the platform supports only AC type of PSUs
#try:
#import sonic_platform.platform
#ch=sonic_platform.platform.Platform().get_chassis()
#e=ch.sys_eeprom.read_eeprom()
#ret, prod_name = ch.sys_eeprom.get_tlv_field(e,0x21)
#if ret:
#prod_name = prod_name[2]
##print("Product name is {}".format(prod_name))
#if '48V' in prod_name:
#ptype = 'DC'
#except Exception as e:
#print("Error while trying to read syseeprom to get PSU type")
return ptype

View File

@ -0,0 +1,20 @@
#!/usr/bin/env python
try:
from sonic_platform_pddf_base.pddf_sfp import PddfSfp
except ImportError as e:
raise ImportError (str(e) + "- required module not found")
class Sfp(PddfSfp):
"""
PDDF Platform-Specific Sfp class
"""
def __init__(self, index, pddf_data=None, pddf_plugin_data=None):
PddfSfp.__init__(self, index, pddf_data, pddf_plugin_data)
# Provide the functions/variables below for which implementation is to be overwritten
def get_position_in_parent(self):
"""Retrieves 1-based relative physical position in parent device."""
return self.port_index

View File

@ -0,0 +1,17 @@
#!/usr/bin/env python
try:
from sonic_platform_pddf_base.pddf_thermal import PddfThermal
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Thermal(PddfThermal):
"""PDDF Platform-Specific Thermal class"""
def __init__(self, index, pddf_data=None, pddf_plugin_data=None):
PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data)
# Provide the functions/variables below for which implementation is to be overwritten

View File

@ -0,0 +1,24 @@
#!/usr/bin/env python
#############################################################################
#
# Module contains an implementation of platform specific watchdog API's
#
#############################################################################
try:
from sonic_platform_pddf_base.pddf_watchdog import PddfWatchdog
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Watchdog(PddfWatchdog):
"""
PDDF Platform-specific Chassis class
"""
def __init__(self):
PddfWatchdog.__init__(self)
self.timeout = 180
# Provide the functions/variables below for which implementation is to be overwritten

View File

@ -0,0 +1,25 @@
from setuptools import setup
setup(
name='sonic-platform',
version='1.0',
description='SONiC platform API implementation on Accton Platforms using PDDF',
license='Apache 2.0',
author='SONiC Team',
author_email='linuxnetdev@microsoft.com',
url='https://github.com/Azure/sonic-buildimage',
packages=['sonic_platform'],
classifiers=[
'Development Status :: 3 - Alpha',
'Environment :: Plugins',
'Intended Audience :: Developers',
'Intended Audience :: Information Technology',
'Intended Audience :: System Administrators',
'License :: OSI Approved :: Apache Software License',
'Natural Language :: English',
'Operating System :: POSIX :: Linux',
'Programming Language :: Python :: 3.7',
'Topic :: Utilities',
],
keywords='sonic SONiC platform PLATFORM',
)

View File

@ -0,0 +1,332 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*
# Copyright (c) 2019 Edgecore Networks Corporation
#
# Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
#
# THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR
# CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT
# LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS
# FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
#
# See the Apache Version 2.0 License for specific language governing
# permissions and limitations under the License.
#
# HISTORY:
# mm/dd/yyyy (A.D.)#
# 10/24/2019:Jostar create for as4630_54pe thermal plan
# ------------------------------------------------------------------
try:
import os
import sys
import getopt
import subprocess
import logging
import logging.handlers
import time
from sonic_platform import platform
except ImportError as e:
raise ImportError('%s - required module not found' % str(e))
# Deafults
VERSION = '1.0'
FUNCTION_NAME = '/usr/local/bin/accton_as4630_54pe_pddf_monitor'
# Temperature Policy
# If any fan fail , please set fan speed register to 16
# The max value of fan speed register is 14
# LM77(48)+LM75(4B)+LM75(4A) > 140, Set 10
# LM77(48)+LM75(4B)+LM75(4A) > 150, Set 12
# LM77(48)+LM75(4B)+LM75(4A) > 160, Set 14
# LM77(48)+LM75(4B)+LM75(4A) < 140, Set 8
# LM77(48)+LM75(4B)+LM75(4A) < 150, Set 10
# LM77(48)+LM75(4B)+LM75(4A) < 160, Set 12
# Reset DUT:LM77(48)>=70C
#
class switch(object):
def __init__(self, value):
self.value = value
self.fall = False
def __iter__(self):
"""Return the match method once, then stop"""
yield self.match
raise StopIteration
def match(self, *args):
"""Indicate whether or not to enter a case suite"""
if self.fall or not args:
return True
elif self.value in args: # changed for v1.5, see below
self.fall = True
return True
else:
return False
def as4630_54pe_set_fan_speed(pwm):
# This platform has 2 fans controlled by one register on CPLD and 3rd fan by another register
# Hence, we need to change the speed for all
if pwm < 0 or pwm > 100:
print("Error: Wrong duty cycle value %d" % (pwm))
platform_chassis.get_fan(0).set_speed(pwm)
platform_chassis.get_fan(2).set_speed(pwm)
return 0
fan_policy_state = 0
fan_fail = 0
fan_fail_list = [0, 0, 0]
alarm_state = 0 # 0->default or clear, 1-->alarm detect
test_temp = 0
simulate_temp_decline = 0
test_temp_list = [0, 0, 0]
temp_test_data = 0
test_temp_revert = 0
platform_chassis = None
# Make a class we can use to capture stdout and sterr in the log
class device_monitor(object):
# static temp var
temp = 0
new_pwm = 0
pwm = 0
ori_pwm = 0
default_pwm = 0x4
def __init__(self, log_file, log_level):
"""Needs a logger and a logger level."""
# set up logging to file
logging.basicConfig(
filename=log_file,
filemode='w',
level=log_level,
format='[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s',
datefmt='%H:%M:%S'
)
# set up logging to console
if log_level == logging.DEBUG:
console = logging.StreamHandler()
console.setLevel(log_level)
formatter = logging.Formatter('%(asctime)-15s %(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
sys_handler = logging.handlers.SysLogHandler(address='/dev/log')
sys_handler.setLevel(logging.WARNING)
logging.getLogger('').addHandler(sys_handler)
def get_state_from_fan_policy(self, temp, policy):
state = 0
for i in range(0, len(policy)):
if (temp > policy[i][2]): # temp_down
if temp <= policy[i][3]: # temp_up
state = i
return state
def manage_fans(self):
global fan_policy_state
global fan_fail
global fan_fail_list
global test_temp
global simulate_temp_decline
global test_temp_list
global alarm_state
global temp_test_data
global test_temp_revert
global platform_chassis
NUM_FANS = 3
LEVEL_FAN_MIN = 0
LEVEL_FAN_NORMAL = 1
LEVEL_FAN_MID = 2
LEVEL_FAN_HIGH = 3
LEVEL_TEMP_CRITICAL = 4
fan_policy = {
LEVEL_FAN_MIN: [50, 8, 0, 140000],
LEVEL_FAN_NORMAL: [62, 10, 140000, 150000],
LEVEL_FAN_MID: [75, 12, 150000, 160000],
LEVEL_FAN_HIGH: [88, 14, 160000, 240000],
LEVEL_TEMP_CRITICAL: [100, 16, 240000, 300000],
}
temp = [0, 0, 0]
#thermal = ThermalUtil()
#fan = FanUtil()
# Supposedly all the fans are set with same duty cycle
ori_duty_cycle = platform_chassis.get_fan(0).get_speed()
new_duty_cycle = 0
if test_temp == 0:
for i in range(0, 3):
temp[i] = platform_chassis.get_thermal(i).get_temperature()
if temp[i] == 0.0 or temp[i] is None:
logging.warning("Get temp-%d fail", i)
return False
temp[i] = int(temp[i]*1000)
else:
if test_temp_revert == 0:
temp_test_data = temp_test_data+2000
else:
if temp_test_data > 0:
temp_test_data = temp_test_data-2000
else:
# Stop the simulation
sys.exit('Simulation Ends !')
for i in range(0, 3):
temp[i] = test_temp_list[i]+temp_test_data
fan_fail = 0
temp_val = 0
for i in range(0, 3):
if temp[i] is None:
break
temp_val += temp[i]
# Check Fan status
for i in range(NUM_FANS):
if not platform_chassis.get_fan(i).get_status():
if test_temp == 0:
fan_fail = 1
if fan_fail_list[i] == 0:
fan_fail_list[i] = 1
else:
if fan_fail_list[i] == 1:
fan_fail_list[i] = 0
if sum(fan_fail_list) == NUM_FANS:
# Critical: Either all the fans are faulty or they are removed, shutdown the system
logging.critical('Alarm for all fan faulty/absent is detected')
logging.critical("Alarm for all fan faulty/absent is detected, reset DUT")
cmd_str = "i2cset -y -f 3 0x60 0x4 0xE4"
time.sleep(2)
subprocess.getstatusoutput('sync; sync; sync')
subprocess.getstatusoutput(cmd_str)
elif sum(fan_fail_list) != 0:
# Set the 100% speed only for first fan failure detection
logging.warning('Fan_{} failed, set remaining fan speed to 100%'.format(
' Fan_'.join(str(item+1) for item, val in enumerate(fan_fail_list) if val == 1)))
new_pwm = 100
as4630_54pe_set_fan_speed(new_pwm)
else:
fan_fail = 0
ori_state = fan_policy_state
fan_policy_state = self.get_state_from_fan_policy(temp_val, fan_policy)
if fan_policy_state > LEVEL_TEMP_CRITICAL or fan_policy_state < LEVEL_FAN_MIN:
logging.error("Get error fan current_state\n")
return 0
# Decision : Decide new fan pwm percent.
if fan_fail == 0 and ori_duty_cycle != fan_policy[fan_policy_state][0]:
new_duty_cycle = fan_policy[fan_policy_state][0]
as4630_54pe_set_fan_speed(new_duty_cycle)
if test_temp == 1:
time.sleep(3)
status, output = subprocess.getstatusoutput('pddf_fanutil getspeed')
logging.debug('\n%s\n', output)
if temp[0] >= 70000: # LM77-48
# critical case*/
logging.critical('Alarm for temperature critical is detected')
logging.critical("Alarm-Critical for temperature critical is detected, reset DUT")
# Update the reboot cause file to reflect that critical temperature
# has been crossed. Upon next boot, the contents of this file will
# be used to determine the cause of the previous reboot
status, output = subprocess.getstatusoutput(
'echo "Thermal Overload: Other" > /host/reboot-cause/reboot-cause.txt')
status, output = subprocess.getstatusoutput(
'echo "System rebooted because alarm for critical temperature (70 C) is detected [Time: $(eval date)]" >> /host/reboot-cause/reboot-cause.txt')
if status:
logging.warning('Reboot cause file not updated. {}'.format(output))
cmd_str = "i2cset -y -f 3 0x60 0x4 0xE4"
subprocess.getstatusoutput('sync; sync; sync')
time.sleep(3)
subprocess.getstatusoutput(cmd_str)
logging.debug('ori_state=%d, current_state=%d, temp_val=%d\n\n', ori_state, fan_policy_state, temp_val)
if ori_state < LEVEL_FAN_HIGH:
if fan_policy_state >= LEVEL_FAN_HIGH:
if alarm_state == 0:
logging.warning('Alarm for temperature high is detected')
alarm_state = 1
# Add a mechanism to decrease the test_temp values
if simulate_temp_decline == 1:
logging.info('Temperature decline simulation is ON. Testing temperature will decrease now')
test_temp_revert = 1
if fan_policy_state < LEVEL_FAN_MID:
if alarm_state == 1:
logging.warning('Alarm for temperature high is cleared')
alarm_state = 0
return True
def main(argv):
# Check if PDDF mode is enabled
if not os.path.exists('/usr/share/sonic/platform/pddf_support'):
print("PDDF mode is not enabled")
return 0
log_file = '%s.log' % FUNCTION_NAME
log_level = logging.INFO
global test_temp
global simulate_temp_decline
if len(sys.argv) != 1:
try:
opts, args = getopt.getopt(argv, 'hdlt:', ['lfile='])
except getopt.GetoptError:
print('Usage: %s [-d] [-l <log_file>]' % sys.argv[0])
return 0
for opt, arg in opts:
if opt == '-h':
print('Usage: %s [-d] [-l <log_file>]' % sys.argv[0])
return 0
elif opt in ('-d', '--debug'):
log_level = logging.DEBUG
elif opt in ('-l', '--lfile'):
log_file = arg
if sys.argv[1] == '-t':
if len(sys.argv) != 6:
print("temp test, need input temp decline option and three temp values")
return 0
i = 0
simulate_temp_decline = int(sys.argv[2])
for x in range(3, 6):
test_temp_list[i] = int(sys.argv[x])*1000
i = i+1
test_temp = 1
log_level = logging.DEBUG
print(test_temp_list)
global platform_chassis
platform_chassis = platform.Platform().get_chassis()
as4630_54pe_set_fan_speed(50)
monitor = device_monitor(log_file, log_level)
# Loop forever, doing something useful hopefully:
while True:
monitor.manage_fans()
time.sleep(10) # 10sec
if __name__ == '__main__':
main(sys.argv[1:])

View File

@ -0,0 +1,14 @@
#!/bin/bash
echo "Setting LED MAC Mode.."
i2cset -y -f 3 0x60 0x2a 0xff
i2cset -y -f 3 0x60 0x2b 0xff
i2cset -y -f 3 0x60 0x86 0x89
echo "Setting LED MAC Mode..DONE"
# Turn off STK1 and STK2 LED. Bit5:4 to 0x11
#i2cset -y -f 3 0x60 0xb5
stk_val=$(i2cget -y -f 3 0x60 0x31)
new_val=$((${stk_val}|0x30))
i2cset -y -f 3 0x60 0x31 ${new_val}
echo "STK LEDs are turned off successfully"

View File

@ -0,0 +1,118 @@
#!/usr/bin/env python
# Script to stop and start the respective platforms default services.
# This will be used while switching the pddf->non-pddf mode and vice versa
import commands
def check_pddf_support():
return True
def stop_platform_svc():
status, output = commands.getstatusoutput("systemctl disable as4630-54pe-platform-monitor-fan.service")
if status:
print "Disable as4630-54pe-platform-monitor-fan.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl stop as4630-54pe-platform-monitor-fan.service")
if status:
print "Stop as4630-54pe-platform-monitor-fan.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl disable as4630-54pe-platform-monitor-psu.service")
if status:
print "Disable as4630-54pe-platform-monitor-psu.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl stop as4630-54pe-platform-monitor-psu.service")
if status:
print "Stop as4630-54pe-platform-monitor-psu.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl disable as4630-54pe-platform-monitor.service")
if status:
print "Disable as4630-54pe-platform-monitor.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl stop as4630-54pe-platform-monitor.service")
if status:
print "Stop as4630-54pe-platform-monitor.service failed %d"%status
return False
status, output = commands.getstatusoutput("/usr/local/bin/accton_as4630_54pe_util.py clean")
if status:
print "accton_as4630_54pe_util.py clean command failed %d"%status
return False
# HACK , stop the pddf-platform-init service if it is active
status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service")
if status:
print "Stop pddf-platform-init.service along with other platform serives failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl stop as4630-54pe-pddf-platform-monitor.service")
if status:
print "Stop as4630-54pe-pddf-platform-monitor.service along with other platform serives failed %d"%status
return False
return True
def start_platform_svc():
status, output = commands.getstatusoutput("/usr/local/bin/accton_as4630_54pe_util.py install")
if status:
print "accton_as4630_54pe_util.py install command failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl enable as4630-54pe-platform-monitor-fan.service")
if status:
print "Enable as4630-54pe-platform-monitor-fan.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl start as4630-54pe-platform-monitor-fan.service")
if status:
print "Start as4630-54pe-platform-monitor-fan.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl enable as4630-54pe-platform-monitor-psu.service")
if status:
print "Enable as4630-54pe-platform-monitor-psu.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl start as4630-54pe-platform-monitor-psu.service")
if status:
print "Start as4630-54pe-platform-monitor-psu.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl enable as4630-54pe-platform-monitor.service")
if status:
print "Enable as4630-54pe-platform-monitor.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl start as4630-54pe-platform-monitor.service")
if status:
print "Start as4630-54pe-platform-monitor.service failed %d"%status
return False
return True
def start_platform_pddf():
status, output = commands.getstatusoutput("systemctl start pddf-platform-init.service")
if status:
print "Start pddf-platform-init.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl start as4630-54pe-pddf-platform-monitor.service")
if status:
print "Start as4630-54pe-pddf-platform-monitor.service failed %d"%status
return False
return True
def stop_platform_pddf():
status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service")
if status:
print "Stop pddf-platform-init.service failed %d"%status
return False
status, output = commands.getstatusoutput("systemctl stop as4630-54pe-pddf-platform-monitor.service")
if status:
print "Stop as4630-54pe-pddf-platform-monitor.service failed %d"%status
return False
return True
def main():
pass
if __name__ == "__main__":
main()

View File

@ -0,0 +1 @@
as4630-54pe/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as4630_54pe-r0/pddf

View File

@ -0,0 +1,8 @@
# Special arrangement to make PDDF mode default
# Disable monitor, monitor-fan, monitor-psu (not enabling them would imply they will be disabled by default)
# Enable pddf-platform-monitor
depmod -a
systemctl enable pddf-platform-init.service
systemctl start pddf-platform-init.service
systemctl enable as4630-54pe-pddf-platform-monitor.service
systemctl start as4630-54pe-pddf-platform-monitor.service