[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:
parent
914a8a1756
commit
f9a29ef056
@ -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)"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
638
device/accton/x86_64-accton_as4630_54pe-r0/pddf/pddf-device.json
Normal file
638
device/accton/x86_64-accton_as4630_54pe-r0/pddf/pddf-device.json
Normal 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"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"skip_ledd": true,
|
"skip_ledd": true,
|
||||||
"skip_thermalctld": true
|
"skip_pcied": true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
@ -0,0 +1 @@
|
|||||||
|
../../../../pddf/i2c/service/pddf-platform-init.service
|
@ -0,0 +1,3 @@
|
|||||||
|
# All the derived classes for PDDF
|
||||||
|
__all__ = ["platform", "chassis", "sfp", "psu", "thermal"]
|
||||||
|
from . import platform
|
@ -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)
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
||||||
|
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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',
|
||||||
|
)
|
@ -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:])
|
@ -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"
|
||||||
|
|
@ -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()
|
@ -0,0 +1 @@
|
|||||||
|
as4630-54pe/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-accton_as4630_54pe-r0/pddf
|
@ -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
|
Loading…
Reference in New Issue
Block a user