DellEMC: Initial commit for Z9432F platform (#10640)
Why I did it Added support for the device Z9432F How I did it Implemented the support for the platform Z9432F Switch Vendor: DellEMC Switch SKU: Z9432F-ON ASIC Vendor: Broadcom SONiC Image: sonic-broadcom.bin
This commit is contained in:
parent
cfdb3d5978
commit
756de913cb
@ -0,0 +1,2 @@
|
|||||||
|
{%- set default_topo = 't1' %}
|
||||||
|
{%- include 'buffers_config.j2' %}
|
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
{%- set default_cable = '40m' %}
|
||||||
|
|
||||||
|
{%- macro generate_buffer_pool_and_profiles() %}
|
||||||
|
"BUFFER_POOL": {
|
||||||
|
},
|
||||||
|
"BUFFER_PROFILE": {
|
||||||
|
},
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{%- macro generate_pg_profils(port_names_active) %}
|
||||||
|
"BUFFER_PG": {
|
||||||
|
},
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{% macro generate_queue_buffers(port_names_active) %}
|
||||||
|
"BUFFER_QUEUE": {
|
||||||
|
}
|
||||||
|
{% endmacro %}
|
||||||
|
|
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
{%- set default_cable = '40m' %}
|
||||||
|
|
||||||
|
{%- macro generate_buffer_pool_and_profiles() %}
|
||||||
|
"BUFFER_POOL": {
|
||||||
|
},
|
||||||
|
"BUFFER_PROFILE": {
|
||||||
|
},
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{%- macro generate_pg_profils(port_names_active) %}
|
||||||
|
"BUFFER_PG": {
|
||||||
|
},
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{% macro generate_queue_buffers(port_names_active) %}
|
||||||
|
"BUFFER_QUEUE": {
|
||||||
|
}
|
||||||
|
{% endmacro %}
|
||||||
|
|
@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"fec-mode": {
|
||||||
|
"Ethernet0-255": {
|
||||||
|
"1": {
|
||||||
|
"10000": [ "none" ],
|
||||||
|
"25000": [ "none", "fc", "rs" ],
|
||||||
|
"50000": [ "rs" ]
|
||||||
|
},
|
||||||
|
"2":{
|
||||||
|
"50000": [ "none", "fc", "rs" ],
|
||||||
|
"100000": [ "rs" ]
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"40000": [ "none" ],
|
||||||
|
"100000": [ "none", "rs" ],
|
||||||
|
"200000": [ "rs" ]
|
||||||
|
},
|
||||||
|
"8": [ "rs" ]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"default-fec-mode": {
|
||||||
|
"Ethernet0-255": {
|
||||||
|
"1": {
|
||||||
|
"10000": "none",
|
||||||
|
"25000": "none",
|
||||||
|
"50000": "rs"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"20000": "none",
|
||||||
|
"50000": "none",
|
||||||
|
"100000": "rs"
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"40000": "none",
|
||||||
|
"100000": "none",
|
||||||
|
"200000": "rs"
|
||||||
|
},
|
||||||
|
"8": "rs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"native-port-supported-speeds": {
|
||||||
|
"Ethernet0-255": {
|
||||||
|
"8": ["400000"]
|
||||||
|
},
|
||||||
|
"Ethernet256-257": {
|
||||||
|
"1": ["10000","1000"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
# name lanes alias index speed
|
||||||
|
Ethernet0 17,18,19,20,21,22,23,24 fourhundredGigE1/1 1 400000
|
||||||
|
Ethernet8 25,26,27,28,29,30,31,32 fourhundredGigE1/2 2 400000
|
||||||
|
Ethernet16 1,2,3,4,5,6,7,8 fourhundredGigE1/3 3 400000
|
||||||
|
Ethernet24 9,10,11,12,13,14,15,16 fourhundredGigE1/4 4 400000
|
||||||
|
Ethernet32 49,50,51,52,53,54,55,56 fourhundredGigE1/5 5 400000
|
||||||
|
Ethernet40 57,58,59,60,61,62,63,64 fourhundredGigE1/6 6 400000
|
||||||
|
Ethernet48 33,34,35,36,37,38,39,40 fourhundredGigE1/7 7 400000
|
||||||
|
Ethernet56 41,42,43,44,45,46,47,48 fourhundredGigE1/8 8 400000
|
||||||
|
Ethernet64 81,82,83,84,85,86,87,88 fourhundredGigE1/9 9 400000
|
||||||
|
Ethernet72 89,90,91,92,93,94,95,96 fourhundredGigE1/10 10 400000
|
||||||
|
Ethernet80 65,66,67,68,69,70,71,72 fourhundredGigE1/11 11 400000
|
||||||
|
Ethernet88 73,74,75,76,77,78,79,80 fourhundredGigE1/12 12 400000
|
||||||
|
Ethernet96 113,114,115,116,117,118,119,120 fourhundredGigE1/13 13 400000
|
||||||
|
Ethernet104 121,122,123,124,125,126,127,128 fourhundredGigE1/14 14 400000
|
||||||
|
Ethernet112 97,98,99,100,101,102,103,104 fourhundredGigE1/15 15 400000
|
||||||
|
Ethernet120 105,106,107,108,109,110,111,112 fourhundredGigE1/16 16 400000
|
||||||
|
Ethernet128 129,130,131,132,133,134,135,136 fourhundredGigE1/17 17 400000
|
||||||
|
Ethernet136 137,138,139,140,141,142,143,144 fourhundredGigE1/18 18 400000
|
||||||
|
Ethernet144 145,146,147,148,149,150,151,152 fourhundredGigE1/19 19 400000
|
||||||
|
Ethernet152 153,154,155,156,157,158,159,160 fourhundredGigE1/20 20 400000
|
||||||
|
Ethernet160 161,162,163,164,165,166,167,168 fourhundredGigE1/21 21 400000
|
||||||
|
Ethernet168 169,170,171,172,173,174,175,176 fourhundredGigE1/22 22 400000
|
||||||
|
Ethernet176 177,178,179,180,181,182,183,184 fourhundredGigE1/23 23 400000
|
||||||
|
Ethernet184 185,186,187,188,189,190,191,192 fourhundredGigE1/24 24 400000
|
||||||
|
Ethernet192 193,194,195,196,197,198,199,200 fourhundredGigE1/25 25 400000
|
||||||
|
Ethernet200 201,202,203,204,205,206,207,208 fourhundredGigE1/26 26 400000
|
||||||
|
Ethernet208 209,210,211,212,213,214,215,216 fourhundredGigE1/27 27 400000
|
||||||
|
Ethernet216 217,218,219,220,221,222,223,224 fourhundredGigE1/28 28 400000
|
||||||
|
Ethernet224 225,226,227,228,229,230,231,232 fourhundredGigE1/29 29 400000
|
||||||
|
Ethernet232 233,234,235,236,237,238,239,240 fourhundredGigE1/30 30 400000
|
||||||
|
Ethernet240 241,242,243,244,245,246,247,248 fourhundredGigE1/31 31 400000
|
||||||
|
Ethernet248 249,250,251,252,253,254,255,256 fourhundredGigE1/32 32 400000
|
||||||
|
Ethernet256 257 tenGigE1/33 33 10000
|
||||||
|
Ethernet257 259 tenGigE1/34 34 10000
|
@ -0,0 +1,225 @@
|
|||||||
|
{%- set PORT_ALL = [] %}
|
||||||
|
{%- for port in PORT %}
|
||||||
|
{%- if PORT_ALL.append(port) %}{% endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- if PORT_ALL | sort_by_port_index %}{% endif %}
|
||||||
|
|
||||||
|
{%- set port_names_list_all = [] %}
|
||||||
|
{%- for port in PORT_ALL %}
|
||||||
|
{%- if port_names_list_all.append(port) %}{% endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- set port_names_all = port_names_list_all | join(',') -%}
|
||||||
|
|
||||||
|
|
||||||
|
{%- set PORT_ACTIVE = [] %}
|
||||||
|
{%- if DEVICE_NEIGHBOR is not defined %}
|
||||||
|
{%- set PORT_ACTIVE = PORT_ALL %}
|
||||||
|
{%- else %}
|
||||||
|
{%- for port in DEVICE_NEIGHBOR.keys() %}
|
||||||
|
{%- if PORT_ACTIVE.append(port) %}{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endif %}
|
||||||
|
{%- if PORT_ACTIVE | sort_by_port_index %}{% endif %}
|
||||||
|
|
||||||
|
{%- set port_names_list_active = [] %}
|
||||||
|
{%- for port in PORT_ACTIVE %}
|
||||||
|
{%- if port_names_list_active.append(port) %}{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- set port_names_active = port_names_list_active | join(',') -%}
|
||||||
|
|
||||||
|
|
||||||
|
{%- set pfc_to_pg_map_supported_asics = ['mellanox', 'barefoot', 'marvell'] -%}
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
{% if generate_tc_to_pg_map is defined %}
|
||||||
|
{{- generate_tc_to_pg_map() }}
|
||||||
|
{% else %}
|
||||||
|
"TC_TO_PRIORITY_GROUP_MAP": {
|
||||||
|
"DEFAULT": {
|
||||||
|
"0": "0",
|
||||||
|
"1": "0",
|
||||||
|
"2": "0",
|
||||||
|
"3": "0",
|
||||||
|
"4": "0",
|
||||||
|
"5": "0",
|
||||||
|
"6": "0",
|
||||||
|
"7": "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{% endif %}
|
||||||
|
"MAP_PFC_PRIORITY_TO_QUEUE": {
|
||||||
|
"DEFAULT": {
|
||||||
|
"0": "0",
|
||||||
|
"1": "1",
|
||||||
|
"2": "2",
|
||||||
|
"3": "3",
|
||||||
|
"4": "4",
|
||||||
|
"5": "5",
|
||||||
|
"6": "6",
|
||||||
|
"7": "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"TC_TO_QUEUE_MAP": {
|
||||||
|
"DEFAULT": {
|
||||||
|
"0": "0",
|
||||||
|
"1": "1",
|
||||||
|
"2": "2",
|
||||||
|
"3": "3",
|
||||||
|
"4": "4",
|
||||||
|
"5": "5",
|
||||||
|
"6": "6",
|
||||||
|
"7": "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DSCP_TO_TC_MAP": {
|
||||||
|
"DEFAULT": {
|
||||||
|
"0" : "0",
|
||||||
|
"1" : "0",
|
||||||
|
"2" : "0",
|
||||||
|
"3" : "0",
|
||||||
|
"4" : "0",
|
||||||
|
"5" : "0",
|
||||||
|
"6" : "0",
|
||||||
|
"7" : "0",
|
||||||
|
"8" : "0",
|
||||||
|
"9" : "0",
|
||||||
|
"10": "0",
|
||||||
|
"11": "0",
|
||||||
|
"12": "0",
|
||||||
|
"13": "0",
|
||||||
|
"14": "0",
|
||||||
|
"15": "0",
|
||||||
|
"16": "0",
|
||||||
|
"17": "0",
|
||||||
|
"18": "0",
|
||||||
|
"19": "0",
|
||||||
|
"20": "0",
|
||||||
|
"21": "0",
|
||||||
|
"22": "0",
|
||||||
|
"23": "0",
|
||||||
|
"24": "0",
|
||||||
|
"25": "0",
|
||||||
|
"26": "0",
|
||||||
|
"27": "0",
|
||||||
|
"28": "0",
|
||||||
|
"29": "0",
|
||||||
|
"30": "0",
|
||||||
|
"31": "0",
|
||||||
|
"32": "0",
|
||||||
|
"33": "0",
|
||||||
|
"34": "0",
|
||||||
|
"35": "0",
|
||||||
|
"36": "0",
|
||||||
|
"37": "0",
|
||||||
|
"38": "0",
|
||||||
|
"39": "0",
|
||||||
|
"40": "0",
|
||||||
|
"41": "0",
|
||||||
|
"42": "0",
|
||||||
|
"43": "0",
|
||||||
|
"44": "0",
|
||||||
|
"45": "0",
|
||||||
|
"46": "0",
|
||||||
|
"47": "0",
|
||||||
|
"48": "0",
|
||||||
|
"49": "0",
|
||||||
|
"50": "0",
|
||||||
|
"51": "0",
|
||||||
|
"52": "0",
|
||||||
|
"53": "0",
|
||||||
|
"54": "0",
|
||||||
|
"55": "0",
|
||||||
|
"56": "0",
|
||||||
|
"57": "0",
|
||||||
|
"58": "0",
|
||||||
|
"59": "0",
|
||||||
|
"60": "0",
|
||||||
|
"61": "0",
|
||||||
|
"62": "0",
|
||||||
|
"63": "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"SCHEDULER": {
|
||||||
|
"scheduler.0": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "1"
|
||||||
|
},
|
||||||
|
"scheduler.1": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "2"
|
||||||
|
},
|
||||||
|
"scheduler.2": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "3"
|
||||||
|
},
|
||||||
|
"scheduler.3": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "4"
|
||||||
|
},
|
||||||
|
"scheduler.4": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "5"
|
||||||
|
},
|
||||||
|
"scheduler.5": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "10"
|
||||||
|
},
|
||||||
|
"scheduler.6": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "25"
|
||||||
|
},
|
||||||
|
"scheduler.7": {
|
||||||
|
"type" : "STRICT"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PORT_QOS_MAP": {
|
||||||
|
"{{ port_names_active }}": {
|
||||||
|
"dscp_to_tc_map" : "[DSCP_TO_TC_MAP|DEFAULT]",
|
||||||
|
"tc_to_queue_map" : "[TC_TO_QUEUE_MAP|DEFAULT]",
|
||||||
|
"tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|DEFAULT]"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"QUEUE": {
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|0": {
|
||||||
|
"scheduler" : "[SCHEDULER|scheduler.0]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|1": {
|
||||||
|
"scheduler" : "[SCHEDULER|scheduler.1]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|2": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.2]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|3": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.3]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|4": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.4]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|5": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.5]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|6": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.6]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|7": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.7]"
|
||||||
|
}{% if not loop.last %},{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td4-z9432f-32x400G.config.yml
|
@ -0,0 +1,700 @@
|
|||||||
|
---
|
||||||
|
bcm_device:
|
||||||
|
0:
|
||||||
|
global:
|
||||||
|
l2_table_default_view: 1
|
||||||
|
pktio_mode: 1
|
||||||
|
vlan_flooding_l2mc_num_reserved: 0
|
||||||
|
shared_block_mask_section: uc_mc
|
||||||
|
ctr_evict_enable: 0
|
||||||
|
uat_mode: 1
|
||||||
|
uft_mode: 4
|
||||||
|
sai_brcm_sonic_acl_enhancements: 1
|
||||||
|
sai_tunnel_support: 1
|
||||||
|
multi_network_groups: 1
|
||||||
|
sai_field_group_auto_prioritize: 1
|
||||||
|
sai_modify_hash_flexdigest: 1
|
||||||
|
sai_fast_convergence_support: 1
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
DEVICE_CONFIG:
|
||||||
|
# CORE CLOCK FREQUENCY
|
||||||
|
CORE_CLK_FREQ: CLK_1350MHZ
|
||||||
|
# PP CLOCK FREQUENCY
|
||||||
|
PP_CLK_FREQ: CLK_1350MHZ
|
||||||
|
VARIANT: DNA_4_9_5_0
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
PC_PM_CORE:
|
||||||
|
?
|
||||||
|
PC_PM_ID: 1
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x05471326
|
||||||
|
TX_LANE_MAP: 0x53016724
|
||||||
|
RX_POLARITY_FLIP: 0x44
|
||||||
|
TX_POLARITY_FLIP: 0x56
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 2
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x20536741
|
||||||
|
TX_LANE_MAP: 0x36104527
|
||||||
|
RX_POLARITY_FLIP: 0xB3
|
||||||
|
TX_POLARITY_FLIP: 0xA4
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 3
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x25173046
|
||||||
|
TX_LANE_MAP: 0x71460352
|
||||||
|
RX_POLARITY_FLIP: 0x35
|
||||||
|
TX_POLARITY_FLIP: 0x10
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 4
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x34261507
|
||||||
|
TX_LANE_MAP: 0x54027631
|
||||||
|
RX_POLARITY_FLIP: 0x5
|
||||||
|
TX_POLARITY_FLIP: 0xD5
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 5
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_4
|
||||||
|
RX_LANE_MAP: 0x06534217
|
||||||
|
TX_LANE_MAP: 0x31746250
|
||||||
|
RX_POLARITY_FLIP: 0xAF
|
||||||
|
TX_POLARITY_FLIP: 0x2D
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 6
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x27641305
|
||||||
|
TX_LANE_MAP: 0x76130524
|
||||||
|
RX_POLARITY_FLIP: 0xea
|
||||||
|
TX_POLARITY_FLIP: 0x0d
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 7
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x57134602
|
||||||
|
TX_LANE_MAP: 0x61537240
|
||||||
|
RX_POLARITY_FLIP: 0xFF
|
||||||
|
TX_POLARITY_FLIP: 0xA8
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 8
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x31607425
|
||||||
|
TX_LANE_MAP: 0x74106523
|
||||||
|
RX_POLARITY_FLIP: 0xFE
|
||||||
|
TX_POLARITY_FLIP: 0x1C
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 9
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x47612350
|
||||||
|
TX_LANE_MAP: 0x17362504
|
||||||
|
RX_POLARITY_FLIP: 0xBB
|
||||||
|
TX_POLARITY_FLIP: 0xAF
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 10
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_4
|
||||||
|
RX_LANE_MAP: 0x74523061
|
||||||
|
TX_LANE_MAP: 0x10654372
|
||||||
|
RX_POLARITY_FLIP: 0xB1
|
||||||
|
TX_POLARITY_FLIP: 0x5B
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 11
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x53071246
|
||||||
|
TX_LANE_MAP: 0x16240537
|
||||||
|
RX_POLARITY_FLIP: 0x0
|
||||||
|
TX_POLARITY_FLIP: 0x96
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 12
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x75243061
|
||||||
|
TX_LANE_MAP: 0x02371564
|
||||||
|
RX_POLARITY_FLIP: 0x1
|
||||||
|
TX_POLARITY_FLIP: 0xA9
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 13
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x60317425
|
||||||
|
TX_LANE_MAP: 0x54612703
|
||||||
|
RX_POLARITY_FLIP: 0x44
|
||||||
|
TX_POLARITY_FLIP: 0xBB
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 14
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x53704261
|
||||||
|
TX_LANE_MAP: 0x13467052
|
||||||
|
RX_POLARITY_FLIP: 0xBb
|
||||||
|
TX_POLARITY_FLIP: 0xC6
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 15
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x20573146
|
||||||
|
TX_LANE_MAP: 0x07352416
|
||||||
|
RX_POLARITY_FLIP: 0xaa
|
||||||
|
TX_POLARITY_FLIP: 0x4E
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 16
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x16570243
|
||||||
|
TX_LANE_MAP: 0x57016423
|
||||||
|
RX_POLARITY_FLIP: 0xfb
|
||||||
|
TX_POLARITY_FLIP: 0x44
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 17
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x40675132
|
||||||
|
TX_LANE_MAP: 0x57360214
|
||||||
|
RX_POLARITY_FLIP: 0xee
|
||||||
|
TX_POLARITY_FLIP: 0x95
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 18
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x73240516
|
||||||
|
TX_LANE_MAP: 0x54307612
|
||||||
|
RX_POLARITY_FLIP: 0xfa
|
||||||
|
TX_POLARITY_FLIP: 0x65
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 19
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x64751203
|
||||||
|
TX_LANE_MAP: 0x01547263
|
||||||
|
RX_POLARITY_FLIP: 0xd4
|
||||||
|
TX_POLARITY_FLIP: 0xAD
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 20
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x13572046
|
||||||
|
TX_LANE_MAP: 0x67230415
|
||||||
|
RX_POLARITY_FLIP: 0x33
|
||||||
|
TX_POLARITY_FLIP: 0x5C
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 21
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x23416750
|
||||||
|
TX_LANE_MAP: 0x52346170
|
||||||
|
RX_POLARITY_FLIP: 0x3F
|
||||||
|
TX_POLARITY_FLIP: 0x89
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 22
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x61043527
|
||||||
|
TX_LANE_MAP: 0x76205413
|
||||||
|
RX_POLARITY_FLIP: 0x7F
|
||||||
|
TX_POLARITY_FLIP: 0xFF
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 23
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x07352614
|
||||||
|
TX_LANE_MAP: 0x21456073
|
||||||
|
RX_POLARITY_FLIP: 0xEE
|
||||||
|
TX_POLARITY_FLIP: 0x9C
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 24
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_21
|
||||||
|
RX_LANE_MAP: 0x13604752
|
||||||
|
TX_LANE_MAP: 0x57230614
|
||||||
|
RX_POLARITY_FLIP: 0x11
|
||||||
|
TX_POLARITY_FLIP: 0xCC
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 25
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x13475206
|
||||||
|
TX_LANE_MAP: 0x25431607
|
||||||
|
RX_POLARITY_FLIP: 0x01
|
||||||
|
TX_POLARITY_FLIP: 0x5a
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 26
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x74502163
|
||||||
|
TX_LANE_MAP: 0x24150736
|
||||||
|
RX_POLARITY_FLIP: 0x9
|
||||||
|
TX_POLARITY_FLIP: 0x14
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 27
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_21
|
||||||
|
RX_LANE_MAP: 0x73506241
|
||||||
|
TX_LANE_MAP: 0x25341607
|
||||||
|
RX_POLARITY_FLIP: 0x11
|
||||||
|
TX_POLARITY_FLIP: 0x2F
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 28
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_21
|
||||||
|
RX_LANE_MAP: 0x37625041
|
||||||
|
TX_LANE_MAP: 0x24170536
|
||||||
|
RX_POLARITY_FLIP: 0x3B
|
||||||
|
TX_POLARITY_FLIP: 0x0
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 29
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x24753160
|
||||||
|
TX_LANE_MAP: 0x37051642
|
||||||
|
RX_POLARITY_FLIP: 0x61
|
||||||
|
TX_POLARITY_FLIP: 0x90
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 30
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x31657024
|
||||||
|
TX_LANE_MAP: 0x25361704
|
||||||
|
RX_POLARITY_FLIP: 0x7C
|
||||||
|
TX_POLARITY_FLIP: 0xC5
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 31
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x20563147
|
||||||
|
TX_LANE_MAP: 0x26543710
|
||||||
|
RX_POLARITY_FLIP: 0x37
|
||||||
|
TX_POLARITY_FLIP: 0xE1
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 32
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x05471623
|
||||||
|
TX_LANE_MAP: 0x24607351
|
||||||
|
RX_POLARITY_FLIP: 0x44
|
||||||
|
TX_POLARITY_FLIP: 0x33
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
PC_PORT_PHYS_MAP:
|
||||||
|
?
|
||||||
|
# CPU port
|
||||||
|
PORT_ID: 0
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 0
|
||||||
|
?
|
||||||
|
PORT_ID: 1
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 17
|
||||||
|
?
|
||||||
|
PORT_ID: 5
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 25
|
||||||
|
?
|
||||||
|
PORT_ID: 10
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 1
|
||||||
|
?
|
||||||
|
PORT_ID: 14
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 9
|
||||||
|
?
|
||||||
|
PORT_ID: 20
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 49
|
||||||
|
?
|
||||||
|
PORT_ID: 24
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 57
|
||||||
|
?
|
||||||
|
PORT_ID: 29
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 33
|
||||||
|
?
|
||||||
|
PORT_ID: 33
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 41
|
||||||
|
?
|
||||||
|
PORT_ID: 40
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 81
|
||||||
|
?
|
||||||
|
PORT_ID: 44
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 89
|
||||||
|
?
|
||||||
|
PORT_ID: 49
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 65
|
||||||
|
?
|
||||||
|
PORT_ID: 53
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 73
|
||||||
|
?
|
||||||
|
PORT_ID: 60
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 113
|
||||||
|
?
|
||||||
|
PORT_ID: 64
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 121
|
||||||
|
?
|
||||||
|
PORT_ID: 69
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 97
|
||||||
|
?
|
||||||
|
PORT_ID: 73
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 105
|
||||||
|
?
|
||||||
|
PORT_ID: 80
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 129
|
||||||
|
?
|
||||||
|
PORT_ID: 84
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 137
|
||||||
|
?
|
||||||
|
PORT_ID: 89
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 145
|
||||||
|
?
|
||||||
|
PORT_ID: 93
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 153
|
||||||
|
?
|
||||||
|
PORT_ID: 100
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 161
|
||||||
|
?
|
||||||
|
PORT_ID: 104
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 169
|
||||||
|
?
|
||||||
|
PORT_ID: 109
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 177
|
||||||
|
?
|
||||||
|
PORT_ID: 113
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 185
|
||||||
|
?
|
||||||
|
PORT_ID: 120
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 193
|
||||||
|
?
|
||||||
|
PORT_ID: 124
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 201
|
||||||
|
?
|
||||||
|
PORT_ID: 129
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 209
|
||||||
|
?
|
||||||
|
PORT_ID: 133
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 217
|
||||||
|
?
|
||||||
|
PORT_ID: 140
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 225
|
||||||
|
?
|
||||||
|
PORT_ID: 144
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 233
|
||||||
|
?
|
||||||
|
PORT_ID: 149
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 241
|
||||||
|
?
|
||||||
|
PORT_ID: 153
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 249
|
||||||
|
?
|
||||||
|
# management port
|
||||||
|
PORT_ID: 38
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 257
|
||||||
|
?
|
||||||
|
# management port
|
||||||
|
PORT_ID: 118
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 259
|
||||||
|
?
|
||||||
|
# Loopback port 0 (Pipe 1)
|
||||||
|
PORT_ID: 39
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 261
|
||||||
|
?
|
||||||
|
# Loopback port 1 (Pipe 3)
|
||||||
|
PORT_ID: 79
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 262
|
||||||
|
?
|
||||||
|
# Loopback port 2 (Pipe 5)
|
||||||
|
PORT_ID: 119
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 263
|
||||||
|
?
|
||||||
|
# Loopback port 3 (Pipe 7)
|
||||||
|
PORT_ID: 159
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 264
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
PC_PORT:
|
||||||
|
?
|
||||||
|
PORT_ID: [0,
|
||||||
|
39, # Loopback port 0 (Pipe 1)
|
||||||
|
79, # Loopback port 1 (Pipe 3)
|
||||||
|
119, # Loopback port 2 (Pipe 5)
|
||||||
|
159] # Loopback port 3 (Pipe 7)
|
||||||
|
:
|
||||||
|
&port_mode_10g
|
||||||
|
ENABLE: 1
|
||||||
|
SPEED: 10000
|
||||||
|
NUM_LANES: 1
|
||||||
|
?
|
||||||
|
PORT_ID: [1, 5, 10, 14,
|
||||||
|
20, 24, 29, 33,
|
||||||
|
40, 44, 49, 53,
|
||||||
|
60, 64, 69, 73,
|
||||||
|
80, 84, 89, 93,
|
||||||
|
100, 104, 109, 113,
|
||||||
|
120, 124, 129, 133,
|
||||||
|
140, 144, 149, 153]
|
||||||
|
:
|
||||||
|
&port_mode_400g
|
||||||
|
ENABLE: 0
|
||||||
|
SPEED: 400000
|
||||||
|
NUM_LANES: 8
|
||||||
|
FEC_MODE: PC_FEC_RS544_2XN
|
||||||
|
MAX_FRAME_SIZE: 9416
|
||||||
|
LINK_TRAINING: 0
|
||||||
|
?
|
||||||
|
PORT_ID: [38, # Management port 0 (Pipe 1)
|
||||||
|
118] # Management port 2 (Pipe 5)
|
||||||
|
:
|
||||||
|
&port_mode_10g_xfi
|
||||||
|
ENABLE: 0
|
||||||
|
SPEED: 10000
|
||||||
|
NUM_LANES: 1
|
||||||
|
MAX_FRAME_SIZE: 9416
|
||||||
|
SER_CONFIG:
|
||||||
|
SER_ENABLE: 0
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
PC_TX_TAPS:
|
||||||
|
PORT_ID: [1, 5, 10, 14,
|
||||||
|
20, 24, 29, 33,
|
||||||
|
40, 44, 49, 53,
|
||||||
|
60, 64, 69, 73,
|
||||||
|
80, 84, 89, 93,
|
||||||
|
100, 104, 109, 113,
|
||||||
|
120, 124, 129, 133,
|
||||||
|
140, 144, 149, 153]
|
||||||
|
TX_SIG_MODE: PC_SIG_MODE_PAM4
|
||||||
|
TXFIR_TAP_MODE: PC_TXFIR_PAM4_TAPS_6
|
||||||
|
TX_DRV_MODE_SIGN: 0
|
||||||
|
TX_DRV_MODE: 0
|
||||||
|
TX_AMP_SIGN: 0
|
||||||
|
TX_AMP: 0
|
||||||
|
TX_RPARA_SIGN: 1
|
||||||
|
TX_RPARA: 1
|
||||||
|
TX_POST3_SIGN: 0
|
||||||
|
TX_POST3: 0
|
||||||
|
TX_POST2_SIGN: 0
|
||||||
|
TX_POST2: 6
|
||||||
|
TX_POST_SIGN: 0
|
||||||
|
TX_POST: 0
|
||||||
|
TX_MAIN_SIGN: 0
|
||||||
|
TX_MAIN: 0x76
|
||||||
|
TX_PRE2_SIGN: 0
|
||||||
|
TX_PRE2: 8
|
||||||
|
TX_PRE_SIGN: 1
|
||||||
|
TX_PRE: 0x24
|
||||||
|
LANE_INDEX: 0
|
||||||
|
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
# Per pipe flex counter configuration
|
||||||
|
CTR_EFLEX_CONFIG:
|
||||||
|
CTR_ING_EFLEX_OPERMODE_PIPEUNIQUE: 0
|
||||||
|
CTR_EGR_EFLEX_OPERMODE_PIPEUNIQUE: 0
|
||||||
|
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
PC_PMD_FIRMWARE:
|
||||||
|
PORT_ID: [1, 5, 10, 14,
|
||||||
|
20, 24, 29, 33, 38,
|
||||||
|
40, 44, 49, 53,
|
||||||
|
60, 64, 69, 73, 78,
|
||||||
|
80, 84, 89, 93,
|
||||||
|
100, 104, 109, 113 , 118,
|
||||||
|
120, 124, 129, 133,
|
||||||
|
140, 144, 149, 153, 158]
|
||||||
|
MEDIUM_TYPE: PC_PHY_MEDIUM_COPPER
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
FP_CONFIG:
|
||||||
|
FP_ING_OPERMODE: GLOBAL_PIPE_AWARE
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
CTR_CONTROL:
|
||||||
|
# Counter Collection Interval in Microseconds
|
||||||
|
INTERVAL: 2000000
|
||||||
|
...
|
@ -0,0 +1,2 @@
|
|||||||
|
{%- set default_topo = 't1' %}
|
||||||
|
{%- include 'buffers_config.j2' %}
|
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
{%- set default_cable = '40m' %}
|
||||||
|
|
||||||
|
{%- macro generate_buffer_pool_and_profiles() %}
|
||||||
|
"BUFFER_POOL": {
|
||||||
|
},
|
||||||
|
"BUFFER_PROFILE": {
|
||||||
|
},
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{%- macro generate_pg_profils(port_names_active) %}
|
||||||
|
"BUFFER_PG": {
|
||||||
|
},
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{% macro generate_queue_buffers(port_names_active) %}
|
||||||
|
"BUFFER_QUEUE": {
|
||||||
|
}
|
||||||
|
{% endmacro %}
|
||||||
|
|
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
{%- set default_cable = '40m' %}
|
||||||
|
|
||||||
|
{%- macro generate_buffer_pool_and_profiles() %}
|
||||||
|
"BUFFER_POOL": {
|
||||||
|
},
|
||||||
|
"BUFFER_PROFILE": {
|
||||||
|
},
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{%- macro generate_pg_profils(port_names_active) %}
|
||||||
|
"BUFFER_PG": {
|
||||||
|
},
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{% macro generate_queue_buffers(port_names_active) %}
|
||||||
|
"BUFFER_QUEUE": {
|
||||||
|
}
|
||||||
|
{% endmacro %}
|
||||||
|
|
@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"fec-mode": {
|
||||||
|
"Ethernet0-255": {
|
||||||
|
"1": {
|
||||||
|
"10000": [ "none" ],
|
||||||
|
"25000": [ "none", "fc", "rs" ],
|
||||||
|
"50000": [ "rs" ]
|
||||||
|
},
|
||||||
|
"2":{
|
||||||
|
"50000": [ "none", "fc", "rs" ],
|
||||||
|
"100000": [ "rs" ]
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"40000": [ "none" ],
|
||||||
|
"100000": [ "none", "rs" ],
|
||||||
|
"200000": [ "rs" ]
|
||||||
|
},
|
||||||
|
"8": [ "rs" ]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"default-fec-mode": {
|
||||||
|
"Ethernet0-255": {
|
||||||
|
"1": {
|
||||||
|
"10000": "none",
|
||||||
|
"25000": "none",
|
||||||
|
"50000": "rs"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"20000": "none",
|
||||||
|
"50000": "none",
|
||||||
|
"100000": "rs"
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"40000": "none",
|
||||||
|
"100000": "none",
|
||||||
|
"200000": "rs"
|
||||||
|
},
|
||||||
|
"8": "rs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"native-port-supported-speeds": {
|
||||||
|
"Ethernet0-255": {
|
||||||
|
},
|
||||||
|
"Ethernet256-257": {
|
||||||
|
"1": ["10000","1000"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
# name lanes alias index speed
|
||||||
|
Ethernet0 17,18,19,20,21,22,23,24 fourhundredGigE1/1 1 400000
|
||||||
|
Ethernet8 25,26,27,28,29,30,31,32 fourhundredGigE1/2 2 400000
|
||||||
|
Ethernet16 1,2,3,4,5,6,7,8 fourhundredGigE1/3 3 400000
|
||||||
|
Ethernet24 9,10,11,12,13,14,15,16 fourhundredGigE1/4 4 400000
|
||||||
|
Ethernet32 49,50,51,52,53,54,55,56 fourhundredGigE1/5 5 400000
|
||||||
|
Ethernet40 57,58,59,60,61,62,63,64 fourhundredGigE1/6 6 400000
|
||||||
|
Ethernet48 33,34,35,36,37,38,39,40 fourhundredGigE1/7 7 400000
|
||||||
|
Ethernet56 41,42,43,44,45,46,47,48 fourhundredGigE1/8 8 400000
|
||||||
|
Ethernet64 81,82,83,84,85,86,87,88 fourhundredGigE1/9 9 400000
|
||||||
|
Ethernet72 89,90,91,92,93,94,95,96 fourhundredGigE1/10 10 400000
|
||||||
|
Ethernet80 65,66,67,68,69,70,71,72 fourhundredGigE1/11 11 400000
|
||||||
|
Ethernet88 73,74,75,76,77,78,79,80 fourhundredGigE1/12 12 400000
|
||||||
|
Ethernet96 113,114,115,116,117,118,119,120 fourhundredGigE1/13 13 400000
|
||||||
|
Ethernet104 121,122,123,124,125,126,127,128 fourhundredGigE1/14 14 400000
|
||||||
|
Ethernet112 97,98,99,100,101,102,103,104 fourhundredGigE1/15 15 400000
|
||||||
|
Ethernet120 105,106,107,108,109,110,111,112 fourhundredGigE1/16 16 400000
|
||||||
|
Ethernet128 129,130,131,132,133,134,135,136 fourhundredGigE1/17 17 400000
|
||||||
|
Ethernet136 137,138,139,140,141,142,143,144 fourhundredGigE1/18 18 400000
|
||||||
|
Ethernet144 145,146,147,148,149,150,151,152 fourhundredGigE1/19 19 400000
|
||||||
|
Ethernet152 153,154,155,156,157,158,159,160 fourhundredGigE1/20 20 400000
|
||||||
|
Ethernet160 161,162,163,164,165,166,167,168 fourhundredGigE1/21 21 400000
|
||||||
|
Ethernet168 169,170,171,172,173,174,175,176 fourhundredGigE1/22 22 400000
|
||||||
|
Ethernet176 177,178,179,180,181,182,183,184 fourhundredGigE1/23 23 400000
|
||||||
|
Ethernet184 185,186,187,188,189,190,191,192 fourhundredGigE1/24 24 400000
|
||||||
|
Ethernet192 193,194,195,196,197,198,199,200 fourhundredGigE1/25 25 400000
|
||||||
|
Ethernet200 201,202,203,204,205,206,207,208 fourhundredGigE1/26 26 400000
|
||||||
|
Ethernet208 209,210,211,212,213,214,215,216 fourhundredGigE1/27 27 400000
|
||||||
|
Ethernet216 217,218,219,220,221,222,223,224 fourhundredGigE1/28 28 400000
|
||||||
|
Ethernet224 225,226,227,228,229,230,231,232 fourhundredGigE1/29 29 400000
|
||||||
|
Ethernet232 233,234,235,236,237,238,239,240 fourhundredGigE1/30 30 400000
|
||||||
|
Ethernet240 241,242,243,244,245,246,247,248 fourhundredGigE1/31 31 400000
|
||||||
|
Ethernet248 249,250,251,252,253,254,255,256 fourhundredGigE1/32 32 400000
|
||||||
|
Ethernet256 257 tenGigE1/33 33 10000
|
||||||
|
Ethernet257 259 tenGigE1/34 34 10000
|
@ -0,0 +1,225 @@
|
|||||||
|
{%- set PORT_ALL = [] %}
|
||||||
|
{%- for port in PORT %}
|
||||||
|
{%- if PORT_ALL.append(port) %}{% endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- if PORT_ALL | sort_by_port_index %}{% endif %}
|
||||||
|
|
||||||
|
{%- set port_names_list_all = [] %}
|
||||||
|
{%- for port in PORT_ALL %}
|
||||||
|
{%- if port_names_list_all.append(port) %}{% endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- set port_names_all = port_names_list_all | join(',') -%}
|
||||||
|
|
||||||
|
|
||||||
|
{%- set PORT_ACTIVE = [] %}
|
||||||
|
{%- if DEVICE_NEIGHBOR is not defined %}
|
||||||
|
{%- set PORT_ACTIVE = PORT_ALL %}
|
||||||
|
{%- else %}
|
||||||
|
{%- for port in DEVICE_NEIGHBOR.keys() %}
|
||||||
|
{%- if PORT_ACTIVE.append(port) %}{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endif %}
|
||||||
|
{%- if PORT_ACTIVE | sort_by_port_index %}{% endif %}
|
||||||
|
|
||||||
|
{%- set port_names_list_active = [] %}
|
||||||
|
{%- for port in PORT_ACTIVE %}
|
||||||
|
{%- if port_names_list_active.append(port) %}{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- set port_names_active = port_names_list_active | join(',') -%}
|
||||||
|
|
||||||
|
|
||||||
|
{%- set pfc_to_pg_map_supported_asics = ['mellanox', 'barefoot', 'marvell'] -%}
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
{% if generate_tc_to_pg_map is defined %}
|
||||||
|
{{- generate_tc_to_pg_map() }}
|
||||||
|
{% else %}
|
||||||
|
"TC_TO_PRIORITY_GROUP_MAP": {
|
||||||
|
"DEFAULT": {
|
||||||
|
"0": "0",
|
||||||
|
"1": "0",
|
||||||
|
"2": "0",
|
||||||
|
"3": "0",
|
||||||
|
"4": "0",
|
||||||
|
"5": "0",
|
||||||
|
"6": "0",
|
||||||
|
"7": "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{% endif %}
|
||||||
|
"MAP_PFC_PRIORITY_TO_QUEUE": {
|
||||||
|
"DEFAULT": {
|
||||||
|
"0": "0",
|
||||||
|
"1": "1",
|
||||||
|
"2": "2",
|
||||||
|
"3": "3",
|
||||||
|
"4": "4",
|
||||||
|
"5": "5",
|
||||||
|
"6": "6",
|
||||||
|
"7": "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"TC_TO_QUEUE_MAP": {
|
||||||
|
"DEFAULT": {
|
||||||
|
"0": "0",
|
||||||
|
"1": "1",
|
||||||
|
"2": "2",
|
||||||
|
"3": "3",
|
||||||
|
"4": "4",
|
||||||
|
"5": "5",
|
||||||
|
"6": "6",
|
||||||
|
"7": "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DSCP_TO_TC_MAP": {
|
||||||
|
"DEFAULT": {
|
||||||
|
"0" : "0",
|
||||||
|
"1" : "0",
|
||||||
|
"2" : "0",
|
||||||
|
"3" : "0",
|
||||||
|
"4" : "0",
|
||||||
|
"5" : "0",
|
||||||
|
"6" : "0",
|
||||||
|
"7" : "0",
|
||||||
|
"8" : "0",
|
||||||
|
"9" : "0",
|
||||||
|
"10": "0",
|
||||||
|
"11": "0",
|
||||||
|
"12": "0",
|
||||||
|
"13": "0",
|
||||||
|
"14": "0",
|
||||||
|
"15": "0",
|
||||||
|
"16": "0",
|
||||||
|
"17": "0",
|
||||||
|
"18": "0",
|
||||||
|
"19": "0",
|
||||||
|
"20": "0",
|
||||||
|
"21": "0",
|
||||||
|
"22": "0",
|
||||||
|
"23": "0",
|
||||||
|
"24": "0",
|
||||||
|
"25": "0",
|
||||||
|
"26": "0",
|
||||||
|
"27": "0",
|
||||||
|
"28": "0",
|
||||||
|
"29": "0",
|
||||||
|
"30": "0",
|
||||||
|
"31": "0",
|
||||||
|
"32": "0",
|
||||||
|
"33": "0",
|
||||||
|
"34": "0",
|
||||||
|
"35": "0",
|
||||||
|
"36": "0",
|
||||||
|
"37": "0",
|
||||||
|
"38": "0",
|
||||||
|
"39": "0",
|
||||||
|
"40": "0",
|
||||||
|
"41": "0",
|
||||||
|
"42": "0",
|
||||||
|
"43": "0",
|
||||||
|
"44": "0",
|
||||||
|
"45": "0",
|
||||||
|
"46": "0",
|
||||||
|
"47": "0",
|
||||||
|
"48": "0",
|
||||||
|
"49": "0",
|
||||||
|
"50": "0",
|
||||||
|
"51": "0",
|
||||||
|
"52": "0",
|
||||||
|
"53": "0",
|
||||||
|
"54": "0",
|
||||||
|
"55": "0",
|
||||||
|
"56": "0",
|
||||||
|
"57": "0",
|
||||||
|
"58": "0",
|
||||||
|
"59": "0",
|
||||||
|
"60": "0",
|
||||||
|
"61": "0",
|
||||||
|
"62": "0",
|
||||||
|
"63": "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"SCHEDULER": {
|
||||||
|
"scheduler.0": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "1"
|
||||||
|
},
|
||||||
|
"scheduler.1": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "2"
|
||||||
|
},
|
||||||
|
"scheduler.2": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "3"
|
||||||
|
},
|
||||||
|
"scheduler.3": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "4"
|
||||||
|
},
|
||||||
|
"scheduler.4": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "5"
|
||||||
|
},
|
||||||
|
"scheduler.5": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "10"
|
||||||
|
},
|
||||||
|
"scheduler.6": {
|
||||||
|
"type" : "DWRR",
|
||||||
|
"weight": "25"
|
||||||
|
},
|
||||||
|
"scheduler.7": {
|
||||||
|
"type" : "STRICT"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PORT_QOS_MAP": {
|
||||||
|
"{{ port_names_active }}": {
|
||||||
|
"dscp_to_tc_map" : "[DSCP_TO_TC_MAP|DEFAULT]",
|
||||||
|
"tc_to_queue_map" : "[TC_TO_QUEUE_MAP|DEFAULT]",
|
||||||
|
"tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|DEFAULT]"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"QUEUE": {
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|0": {
|
||||||
|
"scheduler" : "[SCHEDULER|scheduler.0]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|1": {
|
||||||
|
"scheduler" : "[SCHEDULER|scheduler.1]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|2": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.2]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|3": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.3]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|4": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.4]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|5": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.5]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|6": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.6]"
|
||||||
|
},
|
||||||
|
{% endfor %}
|
||||||
|
{% for port in PORT_ACTIVE %}
|
||||||
|
"{{ port }}|7": {
|
||||||
|
"scheduler": "[SCHEDULER|scheduler.7]"
|
||||||
|
}{% if not loop.last %},{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td4-z9432f-32x400G.config.yml
|
@ -0,0 +1,700 @@
|
|||||||
|
---
|
||||||
|
bcm_device:
|
||||||
|
0:
|
||||||
|
global:
|
||||||
|
l2_table_default_view: 1
|
||||||
|
pktio_mode: 1
|
||||||
|
vlan_flooding_l2mc_num_reserved: 0
|
||||||
|
shared_block_mask_section: uc_mc
|
||||||
|
ctr_evict_enable: 0
|
||||||
|
uat_mode: 1
|
||||||
|
uft_mode: 4
|
||||||
|
sai_brcm_sonic_acl_enhancements: 1
|
||||||
|
sai_tunnel_support: 1
|
||||||
|
multi_network_groups: 1
|
||||||
|
sai_field_group_auto_prioritize: 1
|
||||||
|
sai_modify_hash_flexdigest: 1
|
||||||
|
sai_fast_convergence_support: 1
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
DEVICE_CONFIG:
|
||||||
|
# CORE CLOCK FREQUENCY
|
||||||
|
CORE_CLK_FREQ: CLK_1350MHZ
|
||||||
|
# PP CLOCK FREQUENCY
|
||||||
|
PP_CLK_FREQ: CLK_1350MHZ
|
||||||
|
VARIANT: DNA_4_9_5_0
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
PC_PM_CORE:
|
||||||
|
?
|
||||||
|
PC_PM_ID: 1
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x05471326
|
||||||
|
TX_LANE_MAP: 0x53016724
|
||||||
|
RX_POLARITY_FLIP: 0x44
|
||||||
|
TX_POLARITY_FLIP: 0x56
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 2
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x20536741
|
||||||
|
TX_LANE_MAP: 0x36104527
|
||||||
|
RX_POLARITY_FLIP: 0xB3
|
||||||
|
TX_POLARITY_FLIP: 0xA4
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 3
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x25173046
|
||||||
|
TX_LANE_MAP: 0x71460352
|
||||||
|
RX_POLARITY_FLIP: 0x35
|
||||||
|
TX_POLARITY_FLIP: 0x10
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 4
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x34261507
|
||||||
|
TX_LANE_MAP: 0x54027631
|
||||||
|
RX_POLARITY_FLIP: 0x5
|
||||||
|
TX_POLARITY_FLIP: 0xD5
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 5
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_4
|
||||||
|
RX_LANE_MAP: 0x06534217
|
||||||
|
TX_LANE_MAP: 0x31746250
|
||||||
|
RX_POLARITY_FLIP: 0xAF
|
||||||
|
TX_POLARITY_FLIP: 0x2D
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 6
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x27641305
|
||||||
|
TX_LANE_MAP: 0x76130524
|
||||||
|
RX_POLARITY_FLIP: 0xea
|
||||||
|
TX_POLARITY_FLIP: 0x0d
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 7
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x57134602
|
||||||
|
TX_LANE_MAP: 0x61537240
|
||||||
|
RX_POLARITY_FLIP: 0xFF
|
||||||
|
TX_POLARITY_FLIP: 0xA8
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 8
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x31607425
|
||||||
|
TX_LANE_MAP: 0x74106523
|
||||||
|
RX_POLARITY_FLIP: 0xFE
|
||||||
|
TX_POLARITY_FLIP: 0x1C
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 9
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x47612350
|
||||||
|
TX_LANE_MAP: 0x17362504
|
||||||
|
RX_POLARITY_FLIP: 0xBB
|
||||||
|
TX_POLARITY_FLIP: 0xAF
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 10
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_4
|
||||||
|
RX_LANE_MAP: 0x74523061
|
||||||
|
TX_LANE_MAP: 0x10654372
|
||||||
|
RX_POLARITY_FLIP: 0xB1
|
||||||
|
TX_POLARITY_FLIP: 0x5B
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 11
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x53071246
|
||||||
|
TX_LANE_MAP: 0x16240537
|
||||||
|
RX_POLARITY_FLIP: 0x0
|
||||||
|
TX_POLARITY_FLIP: 0x96
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 12
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x75243061
|
||||||
|
TX_LANE_MAP: 0x02371564
|
||||||
|
RX_POLARITY_FLIP: 0x1
|
||||||
|
TX_POLARITY_FLIP: 0xA9
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 13
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x60317425
|
||||||
|
TX_LANE_MAP: 0x54612703
|
||||||
|
RX_POLARITY_FLIP: 0x44
|
||||||
|
TX_POLARITY_FLIP: 0xBB
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 14
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x53704261
|
||||||
|
TX_LANE_MAP: 0x13467052
|
||||||
|
RX_POLARITY_FLIP: 0xBb
|
||||||
|
TX_POLARITY_FLIP: 0xC6
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 15
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x20573146
|
||||||
|
TX_LANE_MAP: 0x07352416
|
||||||
|
RX_POLARITY_FLIP: 0xaa
|
||||||
|
TX_POLARITY_FLIP: 0x4E
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 16
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x16570243
|
||||||
|
TX_LANE_MAP: 0x57016423
|
||||||
|
RX_POLARITY_FLIP: 0xfb
|
||||||
|
TX_POLARITY_FLIP: 0x44
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 17
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x40675132
|
||||||
|
TX_LANE_MAP: 0x57360214
|
||||||
|
RX_POLARITY_FLIP: 0xee
|
||||||
|
TX_POLARITY_FLIP: 0x95
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 18
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x73240516
|
||||||
|
TX_LANE_MAP: 0x54307612
|
||||||
|
RX_POLARITY_FLIP: 0xfa
|
||||||
|
TX_POLARITY_FLIP: 0x65
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 19
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x64751203
|
||||||
|
TX_LANE_MAP: 0x01547263
|
||||||
|
RX_POLARITY_FLIP: 0xd4
|
||||||
|
TX_POLARITY_FLIP: 0xAD
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 20
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x13572046
|
||||||
|
TX_LANE_MAP: 0x67230415
|
||||||
|
RX_POLARITY_FLIP: 0x33
|
||||||
|
TX_POLARITY_FLIP: 0x5C
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 21
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x23416750
|
||||||
|
TX_LANE_MAP: 0x52346170
|
||||||
|
RX_POLARITY_FLIP: 0x3F
|
||||||
|
TX_POLARITY_FLIP: 0x89
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 22
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x61043527
|
||||||
|
TX_LANE_MAP: 0x76205413
|
||||||
|
RX_POLARITY_FLIP: 0x7F
|
||||||
|
TX_POLARITY_FLIP: 0xFF
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 23
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x07352614
|
||||||
|
TX_LANE_MAP: 0x21456073
|
||||||
|
RX_POLARITY_FLIP: 0xEE
|
||||||
|
TX_POLARITY_FLIP: 0x9C
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 24
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_21
|
||||||
|
RX_LANE_MAP: 0x13604752
|
||||||
|
TX_LANE_MAP: 0x57230614
|
||||||
|
RX_POLARITY_FLIP: 0x11
|
||||||
|
TX_POLARITY_FLIP: 0xCC
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 25
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x13475206
|
||||||
|
TX_LANE_MAP: 0x25431607
|
||||||
|
RX_POLARITY_FLIP: 0x01
|
||||||
|
TX_POLARITY_FLIP: 0x5a
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 26
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x74502163
|
||||||
|
TX_LANE_MAP: 0x24150736
|
||||||
|
RX_POLARITY_FLIP: 0x9
|
||||||
|
TX_POLARITY_FLIP: 0x14
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 27
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_21
|
||||||
|
RX_LANE_MAP: 0x73506241
|
||||||
|
TX_LANE_MAP: 0x25341607
|
||||||
|
RX_POLARITY_FLIP: 0x11
|
||||||
|
TX_POLARITY_FLIP: 0x2F
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 28
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_21
|
||||||
|
RX_LANE_MAP: 0x37625041
|
||||||
|
TX_LANE_MAP: 0x24170536
|
||||||
|
RX_POLARITY_FLIP: 0x3B
|
||||||
|
TX_POLARITY_FLIP: 0x0
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 29
|
||||||
|
CORE_INDEX: 0
|
||||||
|
:
|
||||||
|
RX_LANE_MAP: 0x24753160
|
||||||
|
TX_LANE_MAP: 0x37051642
|
||||||
|
RX_POLARITY_FLIP: 0x61
|
||||||
|
TX_POLARITY_FLIP: 0x90
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 30
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x31657024
|
||||||
|
TX_LANE_MAP: 0x25361704
|
||||||
|
RX_POLARITY_FLIP: 0x7C
|
||||||
|
TX_POLARITY_FLIP: 0xC5
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 31
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x20563147
|
||||||
|
TX_LANE_MAP: 0x26543710
|
||||||
|
RX_POLARITY_FLIP: 0x37
|
||||||
|
TX_POLARITY_FLIP: 0xE1
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
?
|
||||||
|
PC_PM_ID: 32
|
||||||
|
CORE_INDEX: 0
|
||||||
|
: # Same as PM_ID_0
|
||||||
|
RX_LANE_MAP: 0x05471623
|
||||||
|
TX_LANE_MAP: 0x24607351
|
||||||
|
RX_POLARITY_FLIP: 0x44
|
||||||
|
TX_POLARITY_FLIP: 0x33
|
||||||
|
RX_POLARITY_FLIP_AUTO: 0
|
||||||
|
TX_POLARITY_FLIP_AUTO: 0
|
||||||
|
RX_LANE_MAP_AUTO: 0
|
||||||
|
TX_LANE_MAP_AUTO: 0
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
PC_PORT_PHYS_MAP:
|
||||||
|
?
|
||||||
|
# CPU port
|
||||||
|
PORT_ID: 0
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 0
|
||||||
|
?
|
||||||
|
PORT_ID: 1
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 17
|
||||||
|
?
|
||||||
|
PORT_ID: 2
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 25
|
||||||
|
?
|
||||||
|
PORT_ID: 10
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 1
|
||||||
|
?
|
||||||
|
PORT_ID: 11
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 9
|
||||||
|
?
|
||||||
|
PORT_ID: 20
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 49
|
||||||
|
?
|
||||||
|
PORT_ID: 21
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 57
|
||||||
|
?
|
||||||
|
PORT_ID: 29
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 33
|
||||||
|
?
|
||||||
|
PORT_ID: 30
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 41
|
||||||
|
?
|
||||||
|
PORT_ID: 40
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 81
|
||||||
|
?
|
||||||
|
PORT_ID: 41
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 89
|
||||||
|
?
|
||||||
|
PORT_ID: 49
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 65
|
||||||
|
?
|
||||||
|
PORT_ID: 50
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 73
|
||||||
|
?
|
||||||
|
PORT_ID: 60
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 113
|
||||||
|
?
|
||||||
|
PORT_ID: 61
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 121
|
||||||
|
?
|
||||||
|
PORT_ID: 69
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 97
|
||||||
|
?
|
||||||
|
PORT_ID: 70
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 105
|
||||||
|
?
|
||||||
|
PORT_ID: 80
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 129
|
||||||
|
?
|
||||||
|
PORT_ID: 84
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 137
|
||||||
|
?
|
||||||
|
PORT_ID: 89
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 145
|
||||||
|
?
|
||||||
|
PORT_ID: 93
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 153
|
||||||
|
?
|
||||||
|
PORT_ID: 100
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 161
|
||||||
|
?
|
||||||
|
PORT_ID: 104
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 169
|
||||||
|
?
|
||||||
|
PORT_ID: 109
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 177
|
||||||
|
?
|
||||||
|
PORT_ID: 113
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 185
|
||||||
|
?
|
||||||
|
PORT_ID: 120
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 193
|
||||||
|
?
|
||||||
|
PORT_ID: 124
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 201
|
||||||
|
?
|
||||||
|
PORT_ID: 129
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 209
|
||||||
|
?
|
||||||
|
PORT_ID: 133
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 217
|
||||||
|
?
|
||||||
|
PORT_ID: 140
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 225
|
||||||
|
?
|
||||||
|
PORT_ID: 144
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 233
|
||||||
|
?
|
||||||
|
PORT_ID: 149
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 241
|
||||||
|
?
|
||||||
|
PORT_ID: 153
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 249
|
||||||
|
?
|
||||||
|
# management port
|
||||||
|
PORT_ID: 38
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 257
|
||||||
|
?
|
||||||
|
# management port
|
||||||
|
PORT_ID: 118
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 259
|
||||||
|
?
|
||||||
|
# Loopback port 0 (Pipe 1)
|
||||||
|
PORT_ID: 39
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 261
|
||||||
|
?
|
||||||
|
# Loopback port 1 (Pipe 3)
|
||||||
|
PORT_ID: 79
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 262
|
||||||
|
?
|
||||||
|
# Loopback port 2 (Pipe 5)
|
||||||
|
PORT_ID: 119
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 263
|
||||||
|
?
|
||||||
|
# Loopback port 3 (Pipe 7)
|
||||||
|
PORT_ID: 159
|
||||||
|
:
|
||||||
|
PC_PHYS_PORT_ID: 264
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
PC_PORT:
|
||||||
|
?
|
||||||
|
PORT_ID: [0,
|
||||||
|
39, # Loopback port 0 (Pipe 1)
|
||||||
|
79, # Loopback port 1 (Pipe 3)
|
||||||
|
119, # Loopback port 2 (Pipe 5)
|
||||||
|
159] # Loopback port 3 (Pipe 7)
|
||||||
|
:
|
||||||
|
&port_mode_10g
|
||||||
|
ENABLE: 1
|
||||||
|
SPEED: 10000
|
||||||
|
NUM_LANES: 1
|
||||||
|
?
|
||||||
|
PORT_ID: [1, 2, 10, 11,
|
||||||
|
20, 21, 29, 30,
|
||||||
|
40, 41, 49, 50,
|
||||||
|
60, 61, 69, 70,
|
||||||
|
80, 84, 89, 93,
|
||||||
|
100, 104, 109, 113,
|
||||||
|
120, 124, 129, 133,
|
||||||
|
140, 144, 149, 153]
|
||||||
|
:
|
||||||
|
&port_mode_400g
|
||||||
|
ENABLE: 0
|
||||||
|
SPEED: 400000
|
||||||
|
NUM_LANES: 8
|
||||||
|
FEC_MODE: PC_FEC_RS544_2XN
|
||||||
|
MAX_FRAME_SIZE: 9416
|
||||||
|
LINK_TRAINING: 0
|
||||||
|
?
|
||||||
|
PORT_ID: [38, # Management port 0 (Pipe 1)
|
||||||
|
118] # Management port 2 (Pipe 5)
|
||||||
|
:
|
||||||
|
&port_mode_10g_xfi
|
||||||
|
ENABLE: 0
|
||||||
|
SPEED: 10000
|
||||||
|
NUM_LANES: 1
|
||||||
|
MAX_FRAME_SIZE: 9416
|
||||||
|
SER_CONFIG:
|
||||||
|
SER_ENABLE: 0
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
PC_TX_TAPS:
|
||||||
|
PORT_ID: [1, 2, 10, 11,
|
||||||
|
20, 21, 29, 30,
|
||||||
|
40, 41, 49, 50,
|
||||||
|
60, 61, 69, 70,
|
||||||
|
80, 84, 89, 93,
|
||||||
|
100, 104, 109, 113,
|
||||||
|
120, 124, 129, 133,
|
||||||
|
140, 144, 149, 153]
|
||||||
|
TX_SIG_MODE: PC_SIG_MODE_PAM4
|
||||||
|
TXFIR_TAP_MODE: PC_TXFIR_PAM4_TAPS_6
|
||||||
|
TX_DRV_MODE_SIGN: 0
|
||||||
|
TX_DRV_MODE: 0
|
||||||
|
TX_AMP_SIGN: 0
|
||||||
|
TX_AMP: 0
|
||||||
|
TX_RPARA_SIGN: 1
|
||||||
|
TX_RPARA: 1
|
||||||
|
TX_POST3_SIGN: 0
|
||||||
|
TX_POST3: 0
|
||||||
|
TX_POST2_SIGN: 0
|
||||||
|
TX_POST2: 6
|
||||||
|
TX_POST_SIGN: 0
|
||||||
|
TX_POST: 0
|
||||||
|
TX_MAIN_SIGN: 0
|
||||||
|
TX_MAIN: 0x76
|
||||||
|
TX_PRE2_SIGN: 0
|
||||||
|
TX_PRE2: 8
|
||||||
|
TX_PRE_SIGN: 1
|
||||||
|
TX_PRE: 0x24
|
||||||
|
LANE_INDEX: 0
|
||||||
|
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
# Per pipe flex counter configuration
|
||||||
|
CTR_EFLEX_CONFIG:
|
||||||
|
CTR_ING_EFLEX_OPERMODE_PIPEUNIQUE: 0
|
||||||
|
CTR_EGR_EFLEX_OPERMODE_PIPEUNIQUE: 0
|
||||||
|
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
PC_PMD_FIRMWARE:
|
||||||
|
PORT_ID: [1, 2, 10, 11,
|
||||||
|
20, 21, 29, 30, 38,
|
||||||
|
40, 41, 49, 50,
|
||||||
|
60, 61, 69, 70, 78,
|
||||||
|
80, 84, 89, 93,
|
||||||
|
100, 104, 109, 113 , 118,
|
||||||
|
120, 124, 129, 133,
|
||||||
|
140, 144, 149, 153, 158]
|
||||||
|
MEDIUM_TYPE: PC_PHY_MEDIUM_COPPER
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
FP_CONFIG:
|
||||||
|
FP_ING_OPERMODE: GLOBAL_PIPE_AWARE
|
||||||
|
...
|
||||||
|
---
|
||||||
|
device:
|
||||||
|
0:
|
||||||
|
CTR_CONTROL:
|
||||||
|
# Counter Collection Interval in Microseconds
|
||||||
|
INTERVAL: 2000000
|
||||||
|
...
|
BIN
device/dell/x86_64-dellemc_z9432f_c3758-r0/custom_led.bin
Normal file
BIN
device/dell/x86_64-dellemc_z9432f_c3758-r0/custom_led.bin
Normal file
Binary file not shown.
1
device/dell/x86_64-dellemc_z9432f_c3758-r0/default_sku
Normal file
1
device/dell/x86_64-dellemc_z9432f_c3758-r0/default_sku
Normal file
@ -0,0 +1 @@
|
|||||||
|
DellEMC-Z9432f-O32 t1
|
@ -0,0 +1,3 @@
|
|||||||
|
CONSOLE_PORT=0x3f8
|
||||||
|
CONSOLE_DEV=0
|
||||||
|
ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="intel_iommu=off"
|
@ -0,0 +1,7 @@
|
|||||||
|
# LED microprocessor initialization for Dell z9432
|
||||||
|
#
|
||||||
|
#
|
||||||
|
led 0 stop
|
||||||
|
led 0 load /usr/share/sonic/platform/custom_led.bin
|
||||||
|
led start
|
||||||
|
led auto on
|
583
device/dell/x86_64-dellemc_z9432f_c3758-r0/platform.json
Normal file
583
device/dell/x86_64-dellemc_z9432f_c3758-r0/platform.json
Normal file
@ -0,0 +1,583 @@
|
|||||||
|
{
|
||||||
|
"chassis": {
|
||||||
|
"name": "Z9432F-ON",
|
||||||
|
"thermal_manager":false,
|
||||||
|
"status_led": {
|
||||||
|
"controllable": true,
|
||||||
|
"colors": ["green", "blinking_green", "amber", "blinking_amber"]
|
||||||
|
},
|
||||||
|
"components": [
|
||||||
|
{
|
||||||
|
"name": "BIOS"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FPGA"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "BMC"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Baseboard CPLD"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Switch CPLD 1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Switch CPLD 2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "FanTray1-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray1-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray2-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray2-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray3-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray3-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray4-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray4-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray5-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray5-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray6-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray6-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray7-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray7-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fan_drawers":[
|
||||||
|
{
|
||||||
|
"name": "FanTray1",
|
||||||
|
"status_led": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "FanTray1-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray1-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray2",
|
||||||
|
"status_led": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "FanTray2-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray2-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray3",
|
||||||
|
"status_led": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "FanTray3-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray3-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray4",
|
||||||
|
"status_led": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "FanTray4-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray4-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray5",
|
||||||
|
"status_led": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "FanTray5-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray5-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray6",
|
||||||
|
"status_led": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "FanTray6-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray6-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray7",
|
||||||
|
"status_led": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "FanTray7-Fan1",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FanTray7-Fan2",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"psus": [
|
||||||
|
{
|
||||||
|
"name": "PSU1",
|
||||||
|
"status_led": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "PSU1 Fan",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PSU2",
|
||||||
|
"status_led": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "PSU2 Fan",
|
||||||
|
"speed": {
|
||||||
|
"controllable": false
|
||||||
|
},
|
||||||
|
"status_led": {
|
||||||
|
"available": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"thermals": [
|
||||||
|
{
|
||||||
|
"name": "CPU Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FAN Right Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "NPU Front Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "NPU Rear Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "NPU Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PSU1 AF Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"high-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PSU1 Mid Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"high-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PSU1 Rear Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"high-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PSU2 AF Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"high-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PSU2 Mid Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"high-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PSU2 Rear Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"high-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PT Left Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PT Right Temp",
|
||||||
|
"controllable": false,
|
||||||
|
"low-crit-threshold": false,
|
||||||
|
"minimum-recorded": false,
|
||||||
|
"maximum-recorded": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"modules": [],
|
||||||
|
"sfps": [
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QSFP-DD Double Density 8X Pluggable Transceiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "SFP/SFP+/SFP28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "SFP/SFP+/SFP28"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"interfaces": {}
|
||||||
|
}
|
1
device/dell/x86_64-dellemc_z9432f_c3758-r0/platform_asic
Normal file
1
device/dell/x86_64-dellemc_z9432f_c3758-r0/platform_asic
Normal file
@ -0,0 +1 @@
|
|||||||
|
broadcom
|
31
device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/eeprom.py
Normal file
31
device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/eeprom.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
# DellEMC S5232f
|
||||||
|
#
|
||||||
|
# Platform and model specific eeprom subclass, inherits from the base class,
|
||||||
|
# and provides the followings:
|
||||||
|
# - the eeprom format definition
|
||||||
|
# - specific encoder/decoder if there is special need
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
try:
|
||||||
|
import os.path
|
||||||
|
from sonic_eeprom import eeprom_tlvinfo
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError (str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class board(eeprom_tlvinfo.TlvInfoDecoder):
|
||||||
|
|
||||||
|
def __init__(self, name, path, cpld_root, ro):
|
||||||
|
self.eeprom_path = None
|
||||||
|
for b in (0, 1):
|
||||||
|
f = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom'.format(b)
|
||||||
|
if os.path.exists(f):
|
||||||
|
self.eeprom_path = f
|
||||||
|
break
|
||||||
|
if self.eeprom_path is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
super(board, self).__init__(self.eeprom_path, 0, '', True)
|
156
device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/fanutil.py
Normal file
156
device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/fanutil.py
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#############################################################################
|
||||||
|
# Dell
|
||||||
|
#
|
||||||
|
# Module contains an implementation of SONiC FAN Base API and
|
||||||
|
# provides various info about the FANs which are available in the platform
|
||||||
|
#
|
||||||
|
#############################################################################
|
||||||
|
import logging
|
||||||
|
import commands
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_fan.fan_base import FanBase
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError (str(e) + "- required module not found")
|
||||||
|
|
||||||
|
class FanUtil(FanBase):
|
||||||
|
"""Platform-specific FANutil class"""
|
||||||
|
FANTRAY_NUM_ON_MAIN_BOARD = 7
|
||||||
|
NUM_FANS_PERTRAY = 2
|
||||||
|
FANTRAY_NUM_START_IDX = 1
|
||||||
|
FRU_FAN_START_IDX = 1
|
||||||
|
IPMI_FAN_PRESENCE = "ipmitool sensor get FAN{0}_prsnt"
|
||||||
|
IPMI_FAN_FRONT_SPEED = "ipmitool sdr get Fan{0}_Front_rpm"
|
||||||
|
IPMI_FAN_REAR_SPEED = "ipmitool sdr get Fan{0}_Rear_rpm"
|
||||||
|
IPMI_FRU_DATA = "ipmitool fru print {0}"
|
||||||
|
|
||||||
|
def __init__(self, log_level=logging.DEBUG):
|
||||||
|
FanBase.__init__(self)
|
||||||
|
self.num_fans = (self.FANTRAY_NUM_ON_MAIN_BOARD*self.NUM_FANS_PERTRAY)
|
||||||
|
|
||||||
|
def get_fan_status(self,fan_id):
|
||||||
|
try:
|
||||||
|
ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_FAN_PRESENCE.format(fan_id))
|
||||||
|
if ret_status == 0:
|
||||||
|
return(ipmi_cmd_ret.splitlines()[5].strip(' ').strip('[]'))
|
||||||
|
except Exception:
|
||||||
|
logging.error('Failed to execute : %s'%self.IPMI_FAN_PRESENCE.format(fan_id))
|
||||||
|
|
||||||
|
def get_front_fan_speed(self,fan_id):
|
||||||
|
try:
|
||||||
|
ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_FAN_FRONT_SPEED.format(fan_id))
|
||||||
|
if ret_status == 0:
|
||||||
|
rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1]
|
||||||
|
return rdata
|
||||||
|
except Exception:
|
||||||
|
logging.error('Failed to execute : %s'%self.IPMI_FAN_FRONT_SPEED.format(fan_id))
|
||||||
|
|
||||||
|
def get_rear_fan_speed(self,fan_id):
|
||||||
|
try:
|
||||||
|
ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_FAN_REAR_SPEED.format(fan_id))
|
||||||
|
if ret_status == 0:
|
||||||
|
rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1]
|
||||||
|
return rdata
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
logging.error('Failed to execute : %s'%self.IPMI_FAN_REAR_SPEED.format(fan_id))
|
||||||
|
|
||||||
|
|
||||||
|
# Read FAN FRU info
|
||||||
|
def get_fan_direction_from_fru(self,fru_id,reg_name):
|
||||||
|
output = None
|
||||||
|
try:
|
||||||
|
status, ipmi_fru_list = commands.getstatusoutput(self.IPMI_FRU_DATA.format(fru_id))
|
||||||
|
if status == 0:
|
||||||
|
for item in ipmi_fru_list.split("\n"):
|
||||||
|
if reg_name in item:
|
||||||
|
output = item.strip()
|
||||||
|
if output is None:
|
||||||
|
logging.error('\nFailed to fetch: ' + reg_name + ' sensor ')
|
||||||
|
output = output.split(':')[1].strip(' ')
|
||||||
|
if output == 'F2B' or output == 'B2F':
|
||||||
|
return output
|
||||||
|
except Exception:
|
||||||
|
logging.error('Failed to execute:' + ipmi_fru_list)
|
||||||
|
|
||||||
|
def get_num_fans(self):
|
||||||
|
return self.num_fans
|
||||||
|
|
||||||
|
def get_presence(self, index):
|
||||||
|
if index is None:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if index < self.FANTRAY_NUM_START_IDX or index > self.FANTRAY_NUM_START_IDX + self.num_fans - 1:
|
||||||
|
logging.error('Invalid FAN index:%d', index)
|
||||||
|
return False
|
||||||
|
|
||||||
|
tray_index = ((index-1)/self.NUM_FANS_PERTRAY) + 1
|
||||||
|
|
||||||
|
if (self.get_fan_status(tray_index) == 'Device Present'):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_status(self, index):
|
||||||
|
if index is None:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if index < self.FANTRAY_NUM_START_IDX or index > self.FANTRAY_NUM_START_IDX + self.num_fans - 1:
|
||||||
|
logging.error('Invalid FAN index:%d', index)
|
||||||
|
return False
|
||||||
|
|
||||||
|
tray_index = ((index-1)/self.NUM_FANS_PERTRAY) + 1
|
||||||
|
fantray_front_speed=self.get_front_fan_speed(tray_index)
|
||||||
|
fantray_rear_speed=self.get_rear_fan_speed(tray_index)
|
||||||
|
|
||||||
|
if (fantray_front_speed != '0' and fantray_rear_speed != '0'):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def get_direction(self, index):
|
||||||
|
if index is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if index < self.FANTRAY_NUM_START_IDX or index > self.FANTRAY_NUM_START_IDX + self.num_fans - 1:
|
||||||
|
logging.error('Invalid FAN index:%d', index)
|
||||||
|
return None
|
||||||
|
|
||||||
|
tray_index = ((index-1)/self.NUM_FANS_PERTRAY)
|
||||||
|
fru_id = self.FRU_FAN_START_IDX + tray_index
|
||||||
|
direction = self.get_fan_direction_from_fru(fru_id,'Board Extra')
|
||||||
|
|
||||||
|
if direction == 'B2F':
|
||||||
|
return "INTAKE"
|
||||||
|
elif direction == 'F2B':
|
||||||
|
return "EXHAUST"
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def get_speed(self, index):
|
||||||
|
if index is None:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if index < self.FANTRAY_NUM_START_IDX or index > self.FANTRAY_NUM_START_IDX + self.num_fans - 1:
|
||||||
|
logging.error('Invalid FAN index:%d', index)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
tray_index = ((index-1)/self.NUM_FANS_PERTRAY) + 1
|
||||||
|
|
||||||
|
if (index % 2 != 0):
|
||||||
|
fantray_speed=self.get_front_fan_speed(tray_index)
|
||||||
|
else:
|
||||||
|
fantray_speed=self.get_rear_fan_speed(tray_index)
|
||||||
|
|
||||||
|
if (self.get_presence(index) == True):
|
||||||
|
return int(fantray_speed.strip())
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def set_speed(self, val):
|
||||||
|
logging.error("Not allowed to set fan speed!")
|
||||||
|
|
||||||
|
return False
|
25
device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/pcie.yaml
Normal file
25
device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/pcie.yaml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
- bus: '03'
|
||||||
|
dev: '00'
|
||||||
|
fn: '0'
|
||||||
|
id: '1533'
|
||||||
|
name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03)'
|
||||||
|
- bus: '02'
|
||||||
|
dev: '00'
|
||||||
|
fn: '0'
|
||||||
|
id: b881
|
||||||
|
name: 'Ethernet controller: Broadcom Limited Device b881 (rev 11)'
|
||||||
|
- bus: '04'
|
||||||
|
dev: '00'
|
||||||
|
fn: '0'
|
||||||
|
id: '7021'
|
||||||
|
name: 'Non-VGA unclassified device: Xilinx Corporation Device 7021'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '13'
|
||||||
|
fn: '0'
|
||||||
|
id: 19b2
|
||||||
|
name: 'SATA controller: Intel Corporation DNV SATA Controller 0 (rev 11)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '14'
|
||||||
|
fn: '0'
|
||||||
|
id: 19c2
|
||||||
|
name: 'SATA controller: Intel Corporation DNV SATA Controller 1 (rev 11)'
|
236
device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/psuutil.py
Normal file
236
device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/psuutil.py
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
#
|
||||||
|
# psuutil.py
|
||||||
|
# Platform-specific PSU status interface for SONiC
|
||||||
|
#
|
||||||
|
import logging
|
||||||
|
import commands
|
||||||
|
|
||||||
|
Z9332F_MAX_PSUS = 2
|
||||||
|
FRU_PSUL = 11
|
||||||
|
FRU_PSUR = 12
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_psu.psu_base import PsuBase
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class PsuUtil(PsuBase):
|
||||||
|
"""Platform-specific PSUutil class"""
|
||||||
|
IPMI_PSU1_DATA = "ipmitool raw 0x04 0x2d 0x2f | awk '{print substr($0,9,1)}'"
|
||||||
|
IPMI_PSU2_DATA = "ipmitool raw 0x04 0x2d 0x39 | awk '{print substr($0,9,1)}'"
|
||||||
|
IPMI_PSU_VOUT = "ipmitool sdr get PSU{0}_VOut"
|
||||||
|
IPMI_PSU_POUT = "ipmitool sdr get PSU{0}_POut"
|
||||||
|
IPMI_PSU_COUT = "ipmitool sdr get PSU{0}_COut"
|
||||||
|
IPMI_PSU_FAN_SPEED = "ipmitool sdr get PSU{0}_Fan"
|
||||||
|
IPMI_FRU = "ipmitool fru"
|
||||||
|
IPMI_FRU_DATA = "ipmitool fru print {0}"
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
PsuBase.__init__(self)
|
||||||
|
|
||||||
|
def isDockerEnv(self):
|
||||||
|
num_docker = open('/proc/self/cgroup', 'r').read().count(":/docker")
|
||||||
|
if num_docker > 0:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_psu_vout(self,index):
|
||||||
|
try:
|
||||||
|
ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_PSU_VOUT.format(index))
|
||||||
|
if ret_status == 0:
|
||||||
|
rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1]
|
||||||
|
return rdata
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
logging.error('Failed to execute : %s'%self.IPMI_PSU_VOUT.format(index))
|
||||||
|
|
||||||
|
def get_psu_cout(self,index):
|
||||||
|
try:
|
||||||
|
ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_PSU_COUT.format(index))
|
||||||
|
if ret_status == 0:
|
||||||
|
rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1]
|
||||||
|
return rdata
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
logging.error('Failed to execute : %s'%self.IPMI_PSU_COUT.format(index))
|
||||||
|
|
||||||
|
def get_psu_pout(self,index):
|
||||||
|
try:
|
||||||
|
ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_PSU_POUT.format(index))
|
||||||
|
if ret_status == 0:
|
||||||
|
rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1]
|
||||||
|
return rdata
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
logging.error('Failed to execute : %s'%self.IPMI_PSU_POUT.format(index))
|
||||||
|
|
||||||
|
def get_psu_fan_speed(self,index):
|
||||||
|
try:
|
||||||
|
ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_PSU_FAN_SPEED.format(index))
|
||||||
|
if ret_status == 0:
|
||||||
|
rdata = ipmi_cmd_ret.splitlines()[3].split(':')[1].split(' ')[1]
|
||||||
|
return rdata
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
logging.error('Failed to execute : %s'%self.IPMI_PSU_FAN_SPEED.format(index))
|
||||||
|
|
||||||
|
|
||||||
|
#Fetch FRU Data for given fruid
|
||||||
|
def get_psu_airflow(self, index):
|
||||||
|
if index == 1:
|
||||||
|
fru_id = 'FRU_PSUL'
|
||||||
|
else:
|
||||||
|
fru_id = 'FRU_PSUR'
|
||||||
|
|
||||||
|
ret_status, ipmi_cmd_ret = commands.getstatusoutput(self.IPMI_FRU)
|
||||||
|
if ret_status:
|
||||||
|
logging.error('Failed to execute ipmitool: '+ self.IPMI_FRU)
|
||||||
|
|
||||||
|
found_fru = False
|
||||||
|
for line in ipmi_cmd_ret.splitlines():
|
||||||
|
if line.startswith('FRU Device Description') and fru_id in line.split(':')[1] :
|
||||||
|
found_fru = True
|
||||||
|
if found_fru and line.startswith(' Board Product '):
|
||||||
|
return ' B2F' if 'PS/IO' in line else ' F2B'
|
||||||
|
return ''
|
||||||
|
|
||||||
|
# Read FRU info
|
||||||
|
def get_fru_info(self,fru_id,reg_name):
|
||||||
|
output = None
|
||||||
|
Found = False
|
||||||
|
try:
|
||||||
|
status, ipmi_fru_list = commands.getstatusoutput(self.IPMI_FRU_DATA.format(fru_id))
|
||||||
|
if status == 0:
|
||||||
|
for item in ipmi_fru_list.split("\n"):
|
||||||
|
if reg_name == item.split(':')[0].strip(' '):
|
||||||
|
output = item.strip()
|
||||||
|
output = output.split(':')[1]
|
||||||
|
Found = True
|
||||||
|
break;
|
||||||
|
|
||||||
|
if not Found:
|
||||||
|
logging.error('\nFailed to fetch: ' + reg_name + ' sensor ')
|
||||||
|
|
||||||
|
return output
|
||||||
|
except Exception:
|
||||||
|
logging.error('Failed to execute:' + ipmi_fru_list)
|
||||||
|
|
||||||
|
def get_num_psus(self):
|
||||||
|
"""
|
||||||
|
Retrieves the number of PSUs available on the device
|
||||||
|
:return: An integer, the number of PSUs available on the device
|
||||||
|
"""
|
||||||
|
Z9332F_MAX_PSUS = 2
|
||||||
|
return Z9332F_MAX_PSUS
|
||||||
|
|
||||||
|
def get_psu_status(self, index):
|
||||||
|
"""
|
||||||
|
Retrieves the oprational status of power supply unit (PSU) defined
|
||||||
|
by index <index>
|
||||||
|
:param index: An integer, index of the PSU of which to query status
|
||||||
|
:return: Boolean, True if PSU is operating properly, False if PSU is\
|
||||||
|
faulty
|
||||||
|
"""
|
||||||
|
psu_status = '0'
|
||||||
|
|
||||||
|
if index == 1:
|
||||||
|
cmd_status, psu_status = commands.getstatusoutput(self.IPMI_PSU1_DATA)
|
||||||
|
elif index == 2:
|
||||||
|
cmd_status, psu_status = commands.getstatusoutput(self.IPMI_PSU2_DATA)
|
||||||
|
else:
|
||||||
|
logging.error("Invalid PSU number:" + index)
|
||||||
|
|
||||||
|
if cmd_status:
|
||||||
|
logging.error('Failed to execute ipmitool')
|
||||||
|
|
||||||
|
return (not int(psu_status, 16) > 1)
|
||||||
|
|
||||||
|
def get_psu_presence(self, index):
|
||||||
|
"""
|
||||||
|
Retrieves the presence status of power supply unit (PSU) defined
|
||||||
|
by index <index>
|
||||||
|
:param index: An integer, index of the PSU of which to query status
|
||||||
|
:return: Boolean, True if PSU is plugged, False if not
|
||||||
|
"""
|
||||||
|
psu_status = '0'
|
||||||
|
|
||||||
|
if index == 1:
|
||||||
|
cmd_status, psu_status = commands.getstatusoutput(self.IPMI_PSU1_DATA)
|
||||||
|
elif index == 2:
|
||||||
|
cmd_status, psu_status = commands.getstatusoutput(self.IPMI_PSU2_DATA)
|
||||||
|
else:
|
||||||
|
logging.error("Invalid PSU number:" + index)
|
||||||
|
|
||||||
|
if cmd_status:
|
||||||
|
logging.error('Failed to execute ipmitool')
|
||||||
|
|
||||||
|
return (int(psu_status, 16) & 1)
|
||||||
|
|
||||||
|
def get_output_voltage(self, index):
|
||||||
|
if index is None:
|
||||||
|
return 0.0
|
||||||
|
psuvoltage=self.get_psu_vout(index)
|
||||||
|
return float(psuvoltage.strip())
|
||||||
|
|
||||||
|
def get_output_current(self, index):
|
||||||
|
if index is None:
|
||||||
|
return 0.0
|
||||||
|
psucurrent=self.get_psu_cout(index)
|
||||||
|
return float(psucurrent.strip())
|
||||||
|
|
||||||
|
def get_output_power(self, index):
|
||||||
|
if index is None:
|
||||||
|
return 0.0
|
||||||
|
psupower=self.get_psu_pout(index)
|
||||||
|
return float(psupower.strip())
|
||||||
|
|
||||||
|
def get_fan_rpm(self, index, fan_idx):
|
||||||
|
if index is None:
|
||||||
|
return 0
|
||||||
|
fanrpm=self.get_psu_fan_speed(index)
|
||||||
|
return int(fanrpm.strip())
|
||||||
|
|
||||||
|
def get_serial(self, index):
|
||||||
|
if index is None:
|
||||||
|
return None
|
||||||
|
if index == 1:
|
||||||
|
fru_id = FRU_PSUL
|
||||||
|
else:
|
||||||
|
fru_id = FRU_PSUR
|
||||||
|
|
||||||
|
return self.get_fru_info(fru_id,'Board Serial')
|
||||||
|
|
||||||
|
def get_model(self, index):
|
||||||
|
if index is None:
|
||||||
|
return None
|
||||||
|
if index == 1:
|
||||||
|
fru_id = FRU_PSUL
|
||||||
|
else:
|
||||||
|
fru_id = FRU_PSUR
|
||||||
|
|
||||||
|
return self.get_fru_info(fru_id,'Board Part Number')
|
||||||
|
|
||||||
|
def get_mfr_id(self, index):
|
||||||
|
if index is None:
|
||||||
|
return None
|
||||||
|
if index == 1:
|
||||||
|
fru_id = FRU_PSUL
|
||||||
|
else:
|
||||||
|
fru_id = FRU_PSUR
|
||||||
|
|
||||||
|
return self.get_fru_info(fru_id,'Board Mfg')
|
||||||
|
|
||||||
|
def get_direction(self, index):
|
||||||
|
if index is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
direction=self.get_psu_airflow(index).strip()
|
||||||
|
if direction == 'B2F':
|
||||||
|
return "INTAKE"
|
||||||
|
elif direction == 'F2B':
|
||||||
|
return "EXHAUST"
|
||||||
|
else:
|
||||||
|
return None
|
246
device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/sfputil.py
Normal file
246
device/dell/x86_64-dellemc_z9432f_c3758-r0/plugins/sfputil.py
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
# sfputil.py
|
||||||
|
#
|
||||||
|
# Platform-specific SFP transceiver interface for SONiC
|
||||||
|
#
|
||||||
|
|
||||||
|
try:
|
||||||
|
import struct
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
from sonic_sfp.sfputilbase import SfpUtilBase
|
||||||
|
from mmap import *
|
||||||
|
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError("%s - required module not found" % str(e))
|
||||||
|
|
||||||
|
#from xcvrd
|
||||||
|
SFP_STATUS_REMOVED = '0'
|
||||||
|
SFP_STATUS_INSERTED = '1'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class SfpUtil(SfpUtilBase):
|
||||||
|
"""Platform-specific SfpUtil class"""
|
||||||
|
|
||||||
|
PORT_START = 1
|
||||||
|
PORT_END = 34
|
||||||
|
PORTS_IN_BLOCK = 32
|
||||||
|
|
||||||
|
BASE_RES_PATH = "/sys/bus/pci/devices/0000:04:00.0/resource0"
|
||||||
|
|
||||||
|
_port_to_eeprom_mapping = {}
|
||||||
|
|
||||||
|
_global_port_pres_dict = {}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def port_start(self):
|
||||||
|
return self.PORT_START
|
||||||
|
|
||||||
|
@property
|
||||||
|
def port_end(self):
|
||||||
|
return self.PORT_END
|
||||||
|
|
||||||
|
@property
|
||||||
|
def qsfp_ports(self):
|
||||||
|
return range(self.PORT_START, self.PORTS_IN_BLOCK + 1)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def port_to_eeprom_mapping(self):
|
||||||
|
return self._port_to_eeprom_mapping
|
||||||
|
|
||||||
|
def pci_mem_read(self, mm, offset):
|
||||||
|
mm.seek(offset)
|
||||||
|
read_data_stream = mm.read(4)
|
||||||
|
reg_val = struct.unpack('I', read_data_stream)
|
||||||
|
mem_val = str(reg_val)[1:-2]
|
||||||
|
# print "reg_val read:%x"%reg_val
|
||||||
|
return mem_val
|
||||||
|
|
||||||
|
def pci_mem_write(self, mm, offset, data):
|
||||||
|
mm.seek(offset)
|
||||||
|
# print "data to write:%x"%data
|
||||||
|
mm.write(struct.pack('I', data))
|
||||||
|
|
||||||
|
def pci_set_value(self, resource, val, offset):
|
||||||
|
fd = os.open(resource, os.O_RDWR)
|
||||||
|
mm = mmap(fd, 0)
|
||||||
|
val = self.pci_mem_write(mm, offset, val)
|
||||||
|
mm.close()
|
||||||
|
os.close(fd)
|
||||||
|
return val
|
||||||
|
|
||||||
|
def pci_get_value(self, resource, offset):
|
||||||
|
fd = os.open(resource, os.O_RDWR)
|
||||||
|
mm = mmap(fd, 0)
|
||||||
|
val = self.pci_mem_read(mm, offset)
|
||||||
|
mm.close()
|
||||||
|
os.close(fd)
|
||||||
|
return val
|
||||||
|
|
||||||
|
def init_global_port_presence(self):
|
||||||
|
for port_num in range(self.port_start, (self.port_end + 1)):
|
||||||
|
presence = self.get_presence(port_num)
|
||||||
|
if(presence):
|
||||||
|
self._global_port_pres_dict[port_num] = '1'
|
||||||
|
else:
|
||||||
|
self._global_port_pres_dict[port_num] = '0'
|
||||||
|
|
||||||
|
def mod_pres(self):
|
||||||
|
port_pres_mask =0
|
||||||
|
for port_num in range(self.port_start, (self.port_end + 1)):
|
||||||
|
presence = self.get_presence(port_num)
|
||||||
|
if(presence):
|
||||||
|
self._global_port_pres_dict[port_num] = '1'
|
||||||
|
port_val = (1 << (port_num -1))
|
||||||
|
port_pres_mask = (port_pres_mask | port_val)
|
||||||
|
else:
|
||||||
|
self._global_port_pres_dict[port_num] = '0'
|
||||||
|
port_val = ~(1 << (port_num -1))
|
||||||
|
port_pres_mask = (port_pres_mask & port_val)
|
||||||
|
|
||||||
|
return port_pres_mask
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom"
|
||||||
|
|
||||||
|
for x in range(self.port_start, self.port_end + 1):
|
||||||
|
self.port_to_eeprom_mapping[x] = eeprom_path.format(x+1)
|
||||||
|
self.init_global_port_presence()
|
||||||
|
SfpUtilBase.__init__(self)
|
||||||
|
|
||||||
|
def get_presence(self, port_num):
|
||||||
|
# Check for invalid port_num
|
||||||
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Port offset starts with 0x4004
|
||||||
|
port_offset = 16388 + ((port_num-1) * 16)
|
||||||
|
|
||||||
|
status = self.pci_get_value(self.BASE_RES_PATH, port_offset)
|
||||||
|
reg_value = int(status)
|
||||||
|
|
||||||
|
# Absence of status throws error
|
||||||
|
if (reg_value == ""):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Mask off 4th bit for presence
|
||||||
|
mask = (1 << 4)
|
||||||
|
|
||||||
|
# Mask off 1st bit for presence 33,34
|
||||||
|
if (port_num > 32):
|
||||||
|
mask = (1 << 0)
|
||||||
|
|
||||||
|
# ModPrsL is active low
|
||||||
|
if reg_value & mask == 0:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_low_power_mode(self, port_num):
|
||||||
|
|
||||||
|
# Check for invalid port_num
|
||||||
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Port offset starts with 0x4000
|
||||||
|
port_offset = 16384 + ((port_num-1) * 16)
|
||||||
|
|
||||||
|
status = self.pci_get_value(self.BASE_RES_PATH, port_offset)
|
||||||
|
reg_value = int(status)
|
||||||
|
|
||||||
|
# Absence of status throws error
|
||||||
|
if (reg_value == ""):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Mask off 4th bit for presence
|
||||||
|
mask = (1 << 6)
|
||||||
|
|
||||||
|
# LPMode is active high
|
||||||
|
if reg_value & mask == 0:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def set_low_power_mode(self, port_num, lpmode):
|
||||||
|
|
||||||
|
# Check for invalid port_num
|
||||||
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Port offset starts with 0x4000
|
||||||
|
port_offset = 16384 + ((port_num-1) * 16)
|
||||||
|
|
||||||
|
status = self.pci_get_value(self.BASE_RES_PATH, port_offset)
|
||||||
|
reg_value = int(status)
|
||||||
|
|
||||||
|
# Absence of status throws error
|
||||||
|
if (reg_value == ""):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Mask off 4th bit for presence
|
||||||
|
mask = (1 << 6)
|
||||||
|
|
||||||
|
# LPMode is active high; set or clear the bit accordingly
|
||||||
|
if lpmode is True:
|
||||||
|
reg_value = reg_value | mask
|
||||||
|
else:
|
||||||
|
reg_value = reg_value & ~mask
|
||||||
|
|
||||||
|
# Convert our register value back to a hex string and write back
|
||||||
|
self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def reset(self, port_num):
|
||||||
|
|
||||||
|
# Check for invalid port_num
|
||||||
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Port offset starts with 0x4000
|
||||||
|
port_offset = 16384 + ((port_num-1) * 16)
|
||||||
|
|
||||||
|
status = self.pci_get_value(self.BASE_RES_PATH, port_offset)
|
||||||
|
reg_value = int(status)
|
||||||
|
|
||||||
|
# Absence of status throws error
|
||||||
|
if (reg_value == ""):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Mask off 4th bit for presence
|
||||||
|
mask = (1 << 6)
|
||||||
|
|
||||||
|
# ResetL is active low
|
||||||
|
reg_value = reg_value & ~mask
|
||||||
|
|
||||||
|
# Convert our register value back to a hex string and write back
|
||||||
|
self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset)
|
||||||
|
|
||||||
|
# Sleep 1 second to allow it to settle
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
reg_value = reg_value | mask
|
||||||
|
|
||||||
|
# Convert our register value back to a hex string and write back
|
||||||
|
self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_transceiver_change_event(self):
|
||||||
|
port_dict = {}
|
||||||
|
while True:
|
||||||
|
for port_num in range(self.port_start, (self.port_end + 1)):
|
||||||
|
presence = self.get_presence(port_num)
|
||||||
|
if(presence and self._global_port_pres_dict[port_num] == '0'):
|
||||||
|
self._global_port_pres_dict[port_num] = '1'
|
||||||
|
port_dict[port_num] = '1'
|
||||||
|
elif(not presence and
|
||||||
|
self._global_port_pres_dict[port_num] == '1'):
|
||||||
|
self._global_port_pres_dict[port_num] = '0'
|
||||||
|
port_dict[port_num] = '0'
|
||||||
|
|
||||||
|
if(len(port_dict) > 0):
|
||||||
|
return True, port_dict
|
||||||
|
|
||||||
|
time.sleep(0.5)
|
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"skip_ledd": true,
|
||||||
|
"start_ipmievd": true
|
||||||
|
}
|
308
device/dell/x86_64-dellemc_z9432f_c3758-r0/port-locator.soc
Normal file
308
device/dell/x86_64-dellemc_z9432f_c3758-r0/port-locator.soc
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
# LED interface controls
|
||||||
|
config add sai_led_intf_enable_0=1
|
||||||
|
config add sai_led_intf_head_0=0
|
||||||
|
config add sai_led_intf_tail_0=15
|
||||||
|
config add sai_led_intf_bits_0=1
|
||||||
|
|
||||||
|
config add sai_led_intf_enable_2=1
|
||||||
|
config add sai_led_intf_head_2=16
|
||||||
|
config add sai_led_intf_tail_2=33
|
||||||
|
config add sai_led_intf_bits_2=1
|
||||||
|
|
||||||
|
# LED data patterns for ON/OFF
|
||||||
|
config add sai_led_patt_off_0=0x1
|
||||||
|
config add sai_led_patt_on_0=0x0
|
||||||
|
|
||||||
|
# Physical Port --> LED Port (1-based indexing)
|
||||||
|
# QSFPDD [17-24] Ethernet0-7 Eth1/1/1-8
|
||||||
|
config add sai_led_portmap_17=1
|
||||||
|
config add sai_led_portmap_18=1
|
||||||
|
config add sai_led_portmap_19=1
|
||||||
|
config add sai_led_portmap_20=1
|
||||||
|
config add sai_led_portmap_21=1
|
||||||
|
config add sai_led_portmap_22=1
|
||||||
|
config add sai_led_portmap_23=1
|
||||||
|
config add sai_led_portmap_24=1
|
||||||
|
# QSFPDD [25-32] Ethernet8-15 Eth1/2/1-8
|
||||||
|
config add sai_led_portmap_25=2
|
||||||
|
config add sai_led_portmap_26=2
|
||||||
|
config add sai_led_portmap_27=2
|
||||||
|
config add sai_led_portmap_28=2
|
||||||
|
config add sai_led_portmap_29=2
|
||||||
|
config add sai_led_portmap_30=2
|
||||||
|
config add sai_led_portmap_31=2
|
||||||
|
config add sai_led_portmap_32=2
|
||||||
|
# QSFPDD [1-8] Ethernet16-23 Eth1/3/1-8
|
||||||
|
config add sai_led_portmap_1=3
|
||||||
|
config add sai_led_portmap_2=3
|
||||||
|
config add sai_led_portmap_3=3
|
||||||
|
config add sai_led_portmap_4=3
|
||||||
|
config add sai_led_portmap_5=3
|
||||||
|
config add sai_led_portmap_6=3
|
||||||
|
config add sai_led_portmap_7=3
|
||||||
|
config add sai_led_portmap_8=3
|
||||||
|
# QSFPDD [9-16] Ethernet24-31 Eth1/4/1-8
|
||||||
|
config add sai_led_portmap_9=4
|
||||||
|
config add sai_led_portmap_10=4
|
||||||
|
config add sai_led_portmap_11=4
|
||||||
|
config add sai_led_portmap_12=4
|
||||||
|
config add sai_led_portmap_13=4
|
||||||
|
config add sai_led_portmap_14=4
|
||||||
|
config add sai_led_portmap_15=4
|
||||||
|
config add sai_led_portmap_16=4
|
||||||
|
# QSFPDD [49-56] Ethernet32-39 Eth1/5/1-8
|
||||||
|
config add sai_led_portmap_49=5
|
||||||
|
config add sai_led_portmap_50=5
|
||||||
|
config add sai_led_portmap_51=5
|
||||||
|
config add sai_led_portmap_52=5
|
||||||
|
config add sai_led_portmap_53=5
|
||||||
|
config add sai_led_portmap_54=5
|
||||||
|
config add sai_led_portmap_55=5
|
||||||
|
config add sai_led_portmap_56=5
|
||||||
|
# QSFPDD [57-64] Ethernet40-47 Eth1/6/1-8
|
||||||
|
config add sai_led_portmap_57=6
|
||||||
|
config add sai_led_portmap_58=6
|
||||||
|
config add sai_led_portmap_59=6
|
||||||
|
config add sai_led_portmap_60=6
|
||||||
|
config add sai_led_portmap_61=6
|
||||||
|
config add sai_led_portmap_62=6
|
||||||
|
config add sai_led_portmap_63=6
|
||||||
|
config add sai_led_portmap_64=6
|
||||||
|
# QSFPDD [33-40] Ethernet48-55 Eth1/7/1-8
|
||||||
|
config add sai_led_portmap_33=7
|
||||||
|
config add sai_led_portmap_34=7
|
||||||
|
config add sai_led_portmap_35=7
|
||||||
|
config add sai_led_portmap_36=7
|
||||||
|
config add sai_led_portmap_37=7
|
||||||
|
config add sai_led_portmap_38=7
|
||||||
|
config add sai_led_portmap_39=7
|
||||||
|
config add sai_led_portmap_40=7
|
||||||
|
# QSFPDD [41-48] Ethernet56-63 Eth1/8/1-8
|
||||||
|
config add sai_led_portmap_41=8
|
||||||
|
config add sai_led_portmap_42=8
|
||||||
|
config add sai_led_portmap_43=8
|
||||||
|
config add sai_led_portmap_44=8
|
||||||
|
config add sai_led_portmap_45=8
|
||||||
|
config add sai_led_portmap_46=8
|
||||||
|
config add sai_led_portmap_47=8
|
||||||
|
config add sai_led_portmap_48=8
|
||||||
|
# QSFPDD [81-88] Ethernet64-71 Eth1/9/1-8
|
||||||
|
config add sai_led_portmap_81=9
|
||||||
|
config add sai_led_portmap_82=9
|
||||||
|
config add sai_led_portmap_83=9
|
||||||
|
config add sai_led_portmap_84=9
|
||||||
|
config add sai_led_portmap_85=9
|
||||||
|
config add sai_led_portmap_86=9
|
||||||
|
config add sai_led_portmap_87=9
|
||||||
|
config add sai_led_portmap_88=9
|
||||||
|
# QSFPDD [89-96] Ethernet72-79 Eth1/10/1-8
|
||||||
|
config add sai_led_portmap_89=10
|
||||||
|
config add sai_led_portmap_90=10
|
||||||
|
config add sai_led_portmap_91=10
|
||||||
|
config add sai_led_portmap_92=10
|
||||||
|
config add sai_led_portmap_93=10
|
||||||
|
config add sai_led_portmap_94=10
|
||||||
|
config add sai_led_portmap_95=10
|
||||||
|
config add sai_led_portmap_96=10
|
||||||
|
# QSFPDD [65-72] Ethernet80-87 Eth1/11/1-8
|
||||||
|
config add sai_led_portmap_65=11
|
||||||
|
config add sai_led_portmap_66=11
|
||||||
|
config add sai_led_portmap_67=11
|
||||||
|
config add sai_led_portmap_68=11
|
||||||
|
config add sai_led_portmap_69=11
|
||||||
|
config add sai_led_portmap_70=11
|
||||||
|
config add sai_led_portmap_71=11
|
||||||
|
config add sai_led_portmap_72=11
|
||||||
|
# QSFPDD [73-80] Ethernet88-95 Eth1/12/1-8
|
||||||
|
config add sai_led_portmap_73=12
|
||||||
|
config add sai_led_portmap_74=12
|
||||||
|
config add sai_led_portmap_75=12
|
||||||
|
config add sai_led_portmap_76=12
|
||||||
|
config add sai_led_portmap_77=12
|
||||||
|
config add sai_led_portmap_78=12
|
||||||
|
config add sai_led_portmap_79=12
|
||||||
|
config add sai_led_portmap_80=12
|
||||||
|
# QSFPDD [113-120] Ethernet96-103 Eth1/13/1-8
|
||||||
|
config add sai_led_portmap_113=13
|
||||||
|
config add sai_led_portmap_114=13
|
||||||
|
config add sai_led_portmap_115=13
|
||||||
|
config add sai_led_portmap_116=13
|
||||||
|
config add sai_led_portmap_117=13
|
||||||
|
config add sai_led_portmap_118=13
|
||||||
|
config add sai_led_portmap_119=13
|
||||||
|
config add sai_led_portmap_120=13
|
||||||
|
# QSFPDD [121-128] Ethernet104-111 Eth1/14/1-8
|
||||||
|
config add sai_led_portmap_121=14
|
||||||
|
config add sai_led_portmap_122=14
|
||||||
|
config add sai_led_portmap_123=14
|
||||||
|
config add sai_led_portmap_124=14
|
||||||
|
config add sai_led_portmap_125=14
|
||||||
|
config add sai_led_portmap_126=14
|
||||||
|
config add sai_led_portmap_127=14
|
||||||
|
config add sai_led_portmap_128=14
|
||||||
|
# QSFPDD [97-104] Ethernet112-119 Eth1/15/1-8
|
||||||
|
config add sai_led_portmap_97=15
|
||||||
|
config add sai_led_portmap_98=15
|
||||||
|
config add sai_led_portmap_99=15
|
||||||
|
config add sai_led_portmap_100=15
|
||||||
|
config add sai_led_portmap_101=15
|
||||||
|
config add sai_led_portmap_102=15
|
||||||
|
config add sai_led_portmap_103=15
|
||||||
|
config add sai_led_portmap_104=15
|
||||||
|
# QSFPDD [105-112] Ethernet120-127 Eth1/16/1-8
|
||||||
|
config add sai_led_portmap_105=16
|
||||||
|
config add sai_led_portmap_106=16
|
||||||
|
config add sai_led_portmap_107=16
|
||||||
|
config add sai_led_portmap_108=16
|
||||||
|
config add sai_led_portmap_109=16
|
||||||
|
config add sai_led_portmap_110=16
|
||||||
|
config add sai_led_portmap_111=16
|
||||||
|
config add sai_led_portmap_112=16
|
||||||
|
# QSFPDD [129-136] Ethernet128-135 Eth1/17/1-8
|
||||||
|
config add sai_led_portmap_129=17
|
||||||
|
config add sai_led_portmap_130=17
|
||||||
|
config add sai_led_portmap_131=17
|
||||||
|
config add sai_led_portmap_132=17
|
||||||
|
config add sai_led_portmap_133=17
|
||||||
|
config add sai_led_portmap_134=17
|
||||||
|
config add sai_led_portmap_135=17
|
||||||
|
config add sai_led_portmap_136=17
|
||||||
|
# QSFPDD [137-144] Ethernet136-143 Eth1/18/1-8
|
||||||
|
config add sai_led_portmap_137=18
|
||||||
|
config add sai_led_portmap_138=18
|
||||||
|
config add sai_led_portmap_139=18
|
||||||
|
config add sai_led_portmap_140=18
|
||||||
|
config add sai_led_portmap_141=18
|
||||||
|
config add sai_led_portmap_142=18
|
||||||
|
config add sai_led_portmap_143=18
|
||||||
|
config add sai_led_portmap_144=18
|
||||||
|
# QSFPDD [145-152] Ethernet144-151 Eth1/19/1-8
|
||||||
|
config add sai_led_portmap_145=19
|
||||||
|
config add sai_led_portmap_146=19
|
||||||
|
config add sai_led_portmap_147=19
|
||||||
|
config add sai_led_portmap_148=19
|
||||||
|
config add sai_led_portmap_149=19
|
||||||
|
config add sai_led_portmap_150=19
|
||||||
|
config add sai_led_portmap_151=19
|
||||||
|
config add sai_led_portmap_152=19
|
||||||
|
# QSFPDD [153-160] Ethernet152-159 Eth1/20/1-8
|
||||||
|
config add sai_led_portmap_153=20
|
||||||
|
config add sai_led_portmap_154=20
|
||||||
|
config add sai_led_portmap_155=20
|
||||||
|
config add sai_led_portmap_156=20
|
||||||
|
config add sai_led_portmap_157=20
|
||||||
|
config add sai_led_portmap_158=20
|
||||||
|
config add sai_led_portmap_159=20
|
||||||
|
config add sai_led_portmap_160=20
|
||||||
|
# QSFPDD [161-168] Ethernet160-167 Eth1/21/1-8
|
||||||
|
config add sai_led_portmap_161=21
|
||||||
|
config add sai_led_portmap_162=21
|
||||||
|
config add sai_led_portmap_163=21
|
||||||
|
config add sai_led_portmap_164=21
|
||||||
|
config add sai_led_portmap_165=21
|
||||||
|
config add sai_led_portmap_166=21
|
||||||
|
config add sai_led_portmap_167=21
|
||||||
|
config add sai_led_portmap_168=21
|
||||||
|
# QSFPDD [169-176] Ethernet168-175 Eth1/22/1-8
|
||||||
|
config add sai_led_portmap_169=22
|
||||||
|
config add sai_led_portmap_170=22
|
||||||
|
config add sai_led_portmap_171=22
|
||||||
|
config add sai_led_portmap_172=22
|
||||||
|
config add sai_led_portmap_173=22
|
||||||
|
config add sai_led_portmap_174=22
|
||||||
|
config add sai_led_portmap_175=22
|
||||||
|
config add sai_led_portmap_176=22
|
||||||
|
# QSFPDD [177-184] Ethernet176-183 Eth1/23/1-8
|
||||||
|
config add sai_led_portmap_177=23
|
||||||
|
config add sai_led_portmap_178=23
|
||||||
|
config add sai_led_portmap_179=23
|
||||||
|
config add sai_led_portmap_180=23
|
||||||
|
config add sai_led_portmap_181=23
|
||||||
|
config add sai_led_portmap_182=23
|
||||||
|
config add sai_led_portmap_183=23
|
||||||
|
config add sai_led_portmap_184=23
|
||||||
|
# QSFPDD [185-192] Ethernet184-191 Eth1/24/1-8
|
||||||
|
config add sai_led_portmap_185=24
|
||||||
|
config add sai_led_portmap_186=24
|
||||||
|
config add sai_led_portmap_187=24
|
||||||
|
config add sai_led_portmap_188=24
|
||||||
|
config add sai_led_portmap_189=24
|
||||||
|
config add sai_led_portmap_190=24
|
||||||
|
config add sai_led_portmap_191=24
|
||||||
|
config add sai_led_portmap_192=24
|
||||||
|
# QSFPDD [193-200] Ethernet192-199 Eth1/25/1-8
|
||||||
|
config add sai_led_portmap_193=25
|
||||||
|
config add sai_led_portmap_194=25
|
||||||
|
config add sai_led_portmap_195=25
|
||||||
|
config add sai_led_portmap_196=25
|
||||||
|
config add sai_led_portmap_197=25
|
||||||
|
config add sai_led_portmap_198=25
|
||||||
|
config add sai_led_portmap_199=25
|
||||||
|
config add sai_led_portmap_200=25
|
||||||
|
# QSFPDD [201-208] Ethernet200-207 Eth1/26/1-8
|
||||||
|
config add sai_led_portmap_201=26
|
||||||
|
config add sai_led_portmap_202=26
|
||||||
|
config add sai_led_portmap_203=26
|
||||||
|
config add sai_led_portmap_204=26
|
||||||
|
config add sai_led_portmap_205=26
|
||||||
|
config add sai_led_portmap_206=26
|
||||||
|
config add sai_led_portmap_207=26
|
||||||
|
config add sai_led_portmap_208=26
|
||||||
|
# QSFPDD [209-216] Ethernet208-215 Eth1/27/1-8
|
||||||
|
config add sai_led_portmap_209=27
|
||||||
|
config add sai_led_portmap_210=27
|
||||||
|
config add sai_led_portmap_211=27
|
||||||
|
config add sai_led_portmap_212=27
|
||||||
|
config add sai_led_portmap_213=27
|
||||||
|
config add sai_led_portmap_214=27
|
||||||
|
config add sai_led_portmap_215=27
|
||||||
|
config add sai_led_portmap_216=27
|
||||||
|
# QSFPDD [217-224] Ethernet216-223 Eth1/28/1-8
|
||||||
|
config add sai_led_portmap_217=28
|
||||||
|
config add sai_led_portmap_218=28
|
||||||
|
config add sai_led_portmap_219=28
|
||||||
|
config add sai_led_portmap_220=28
|
||||||
|
config add sai_led_portmap_221=28
|
||||||
|
config add sai_led_portmap_222=28
|
||||||
|
config add sai_led_portmap_223=28
|
||||||
|
config add sai_led_portmap_224=28
|
||||||
|
# QSFPDD [225-232] Ethernet224-231 Eth1/29/1-8
|
||||||
|
config add sai_led_portmap_225=29
|
||||||
|
config add sai_led_portmap_226=29
|
||||||
|
config add sai_led_portmap_227=29
|
||||||
|
config add sai_led_portmap_228=29
|
||||||
|
config add sai_led_portmap_229=29
|
||||||
|
config add sai_led_portmap_230=29
|
||||||
|
config add sai_led_portmap_231=29
|
||||||
|
config add sai_led_portmap_232=29
|
||||||
|
# QSFPDD [233-240] Ethernet232-239 Eth1/30/1-8
|
||||||
|
config add sai_led_portmap_233=30
|
||||||
|
config add sai_led_portmap_234=30
|
||||||
|
config add sai_led_portmap_235=30
|
||||||
|
config add sai_led_portmap_236=30
|
||||||
|
config add sai_led_portmap_237=30
|
||||||
|
config add sai_led_portmap_238=30
|
||||||
|
config add sai_led_portmap_239=30
|
||||||
|
config add sai_led_portmap_240=30
|
||||||
|
# QSFPDD [241-248] Ethernet240-247 Eth1/31/1-8
|
||||||
|
config add sai_led_portmap_241=31
|
||||||
|
config add sai_led_portmap_242=31
|
||||||
|
config add sai_led_portmap_243=31
|
||||||
|
config add sai_led_portmap_244=31
|
||||||
|
config add sai_led_portmap_245=31
|
||||||
|
config add sai_led_portmap_246=31
|
||||||
|
config add sai_led_portmap_247=31
|
||||||
|
config add sai_led_portmap_248=31
|
||||||
|
# QSFPDD [249-256] Ethernet248-255 Eth1/32/1-8
|
||||||
|
config add sai_led_portmap_249=32
|
||||||
|
config add sai_led_portmap_250=32
|
||||||
|
config add sai_led_portmap_251=32
|
||||||
|
config add sai_led_portmap_252=32
|
||||||
|
config add sai_led_portmap_253=32
|
||||||
|
config add sai_led_portmap_254=32
|
||||||
|
config add sai_led_portmap_255=32
|
||||||
|
config add sai_led_portmap_256=32
|
||||||
|
# 1-lane port [257-257] Ethernet256 Eth1/33
|
||||||
|
config add sai_led_portmap_257=33
|
||||||
|
# 1-lane port [259-259] Ethernet257 Eth1/34
|
||||||
|
config add sai_led_portmap_259=34
|
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"services_to_ignore": [],
|
||||||
|
"devices_to_ignore": ["fan.speed","psu.temperature","psu.voltage","asic"],
|
||||||
|
"user_defined_checkers": [],
|
||||||
|
"polling_interval": 60,
|
||||||
|
"led_color": {
|
||||||
|
"fault" : "blink_yellow",
|
||||||
|
"normal" : "green",
|
||||||
|
"booting": "blink_green"
|
||||||
|
}
|
||||||
|
}
|
@ -14,6 +14,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \
|
|||||||
$(DELL_S5232F_PLATFORM_MODULE) \
|
$(DELL_S5232F_PLATFORM_MODULE) \
|
||||||
$(DELL_S5248F_PLATFORM_MODULE) \
|
$(DELL_S5248F_PLATFORM_MODULE) \
|
||||||
$(DELL_Z9332F_PLATFORM_MODULE) \
|
$(DELL_Z9332F_PLATFORM_MODULE) \
|
||||||
|
$(DELL_Z9432F_PLATFORM_MODULE) \
|
||||||
$(DELL_S5296F_PLATFORM_MODULE) \
|
$(DELL_S5296F_PLATFORM_MODULE) \
|
||||||
$(DELL_Z9100_PLATFORM_MODULE) \
|
$(DELL_Z9100_PLATFORM_MODULE) \
|
||||||
$(DELL_S6100_PLATFORM_MODULE) \
|
$(DELL_S6100_PLATFORM_MODULE) \
|
||||||
|
@ -8,6 +8,7 @@ DELL_S5212F_PLATFORM_MODULE_VERSION = 1.1
|
|||||||
DELL_S5224F_PLATFORM_MODULE_VERSION = 1.1
|
DELL_S5224F_PLATFORM_MODULE_VERSION = 1.1
|
||||||
DELL_S5232F_PLATFORM_MODULE_VERSION = 1.1
|
DELL_S5232F_PLATFORM_MODULE_VERSION = 1.1
|
||||||
DELL_Z9332F_PLATFORM_MODULE_VERSION = 1.1
|
DELL_Z9332F_PLATFORM_MODULE_VERSION = 1.1
|
||||||
|
DELL_Z9432F_PLATFORM_MODULE_VERSION = 1.1
|
||||||
DELL_S5248F_PLATFORM_MODULE_VERSION = 1.1
|
DELL_S5248F_PLATFORM_MODULE_VERSION = 1.1
|
||||||
DELL_S5296F_PLATFORM_MODULE_VERSION = 1.1
|
DELL_S5296F_PLATFORM_MODULE_VERSION = 1.1
|
||||||
DELL_N3248PXE_PLATFORM_MODULE_VERSION = 1.1
|
DELL_N3248PXE_PLATFORM_MODULE_VERSION = 1.1
|
||||||
@ -21,6 +22,7 @@ export DELL_S5212F_PLATFORM_MODULE_VERSION
|
|||||||
export DELL_S5224F_PLATFORM_MODULE_VERSION
|
export DELL_S5224F_PLATFORM_MODULE_VERSION
|
||||||
export DELL_S5232F_PLATFORM_MODULE_VERSION
|
export DELL_S5232F_PLATFORM_MODULE_VERSION
|
||||||
export DELL_Z9332F_PLATFORM_MODULE_VERSION
|
export DELL_Z9332F_PLATFORM_MODULE_VERSION
|
||||||
|
export DELL_Z9432F_PLATFORM_MODULE_VERSION
|
||||||
export DELL_S5248F_PLATFORM_MODULE_VERSION
|
export DELL_S5248F_PLATFORM_MODULE_VERSION
|
||||||
export DELL_S5296F_PLATFORM_MODULE_VERSION
|
export DELL_S5296F_PLATFORM_MODULE_VERSION
|
||||||
export DELL_N3248PXE_PLATFORM_MODULE_VERSION
|
export DELL_N3248PXE_PLATFORM_MODULE_VERSION
|
||||||
@ -61,6 +63,10 @@ DELL_Z9332F_PLATFORM_MODULE = platform-modules-z9332f_$(DELL_Z9332F_PLATFORM_MOD
|
|||||||
$(DELL_Z9332F_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_z9332f_d1508-r0
|
$(DELL_Z9332F_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_z9332f_d1508-r0
|
||||||
$(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_Z9332F_PLATFORM_MODULE)))
|
$(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_Z9332F_PLATFORM_MODULE)))
|
||||||
|
|
||||||
|
DELL_Z9432F_PLATFORM_MODULE = platform-modules-z9432f_$(DELL_Z9432F_PLATFORM_MODULE_VERSION)_amd64.deb
|
||||||
|
$(DELL_Z9432F_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_z9432f_c3758-r0
|
||||||
|
$(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_Z9432F_PLATFORM_MODULE)))
|
||||||
|
|
||||||
DELL_S5248F_PLATFORM_MODULE = platform-modules-s5248f_$(DELL_S5248F_PLATFORM_MODULE_VERSION)_amd64.deb
|
DELL_S5248F_PLATFORM_MODULE = platform-modules-s5248f_$(DELL_S5248F_PLATFORM_MODULE_VERSION)_amd64.deb
|
||||||
$(DELL_S5248F_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_s5248f_c3538-r0
|
$(DELL_S5248F_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_s5248f_c3538-r0
|
||||||
$(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_S5248F_PLATFORM_MODULE)))
|
$(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_S5248F_PLATFORM_MODULE)))
|
||||||
|
@ -55,6 +55,11 @@ Architecture: amd64
|
|||||||
Depends: linux-image-5.10.0-12-2-amd64-unsigned
|
Depends: linux-image-5.10.0-12-2-amd64-unsigned
|
||||||
Description: kernel modules for platform devices such as fan, led, sfp
|
Description: kernel modules for platform devices such as fan, led, sfp
|
||||||
|
|
||||||
|
Package: platform-modules-z9432f
|
||||||
|
Architecture: amd64
|
||||||
|
Depends: linux-image-5.10.0-8-2-amd64-unsigned
|
||||||
|
Description: kernel modules for platform devices such as fan, led, sfp
|
||||||
|
|
||||||
Package: platform-modules-n3248pxe
|
Package: platform-modules-n3248pxe
|
||||||
Architecture: amd64
|
Architecture: amd64
|
||||||
Depends: linux-image-5.10.0-12-2-amd64-unsigned
|
Depends: linux-image-5.10.0-12-2-amd64-unsigned
|
||||||
|
@ -0,0 +1,40 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: setup-board
|
||||||
|
# Required-Start:
|
||||||
|
# Required-Stop:
|
||||||
|
# Should-Start:
|
||||||
|
# Should-Stop:
|
||||||
|
# Default-Start: S
|
||||||
|
# Default-Stop: 0 6
|
||||||
|
# Short-Description: Setup Z9432f board.
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
echo -n "Setting up board... "
|
||||||
|
|
||||||
|
# /usr/local/bin/iom_power_on.sh
|
||||||
|
/usr/local/bin/z9432f_platform.sh init
|
||||||
|
|
||||||
|
echo "done."
|
||||||
|
;;
|
||||||
|
|
||||||
|
stop)
|
||||||
|
/usr/local/bin/z9432f_platform.sh deinit
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
force-reload|restart)
|
||||||
|
echo "Not supported"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Usage: /etc/init.d/platform-modules-z9432f.init {start|stop}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
@ -0,0 +1,12 @@
|
|||||||
|
z9432f/scripts/z9432f_platform.sh usr/local/bin
|
||||||
|
z9432f/scripts/check_qsfp.sh usr/local/bin
|
||||||
|
z9432f/scripts/platform_sensors.py usr/local/bin
|
||||||
|
z9432f/scripts/sensors usr/bin
|
||||||
|
z9432f/scripts/pcisysfs.py usr/bin
|
||||||
|
z9432f/scripts/qsfp_irq_enable.py usr/bin
|
||||||
|
z9432f/cfg/z9432f-modules.conf etc/modules-load.d
|
||||||
|
z9432f/systemd/platform-modules-z9432f.service etc/systemd/system
|
||||||
|
z9432f/modules/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-dellemc_z9432f_c3758-r0
|
||||||
|
common/platform_reboot usr/share/sonic/device/x86_64-dellemc_z9432f_c3758-r0
|
||||||
|
common/fw-updater usr/local/bin
|
||||||
|
common/onie_mode_set usr/local/bin
|
@ -0,0 +1,10 @@
|
|||||||
|
# postinst script for Z9432f
|
||||||
|
|
||||||
|
# Enable Dell-Z9432f-platform-service
|
||||||
|
depmod -a
|
||||||
|
systemctl enable platform-modules-z9432f.service
|
||||||
|
systemctl start platform-modules-z9432f.service
|
||||||
|
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
@ -5,7 +5,7 @@ export INSTALL_MOD_DIR:=extra
|
|||||||
KVERSION ?= $(shell uname -r)
|
KVERSION ?= $(shell uname -r)
|
||||||
KERNEL_SRC := /lib/modules/$(KVERSION)
|
KERNEL_SRC := /lib/modules/$(KVERSION)
|
||||||
MOD_SRC_DIR:= $(shell pwd)
|
MOD_SRC_DIR:= $(shell pwd)
|
||||||
MODULE_DIRS:= s6000 z9100 s6100 z9264f s5212f s5224f s5232f s5248f z9332f s5296f n3248pxe n3248te
|
MODULE_DIRS:= s6000 z9100 s6100 z9264f s5212f s5224f s5232f s5248f z9332f z9432f s5296f n3248pxe n3248te
|
||||||
COMMON_DIR := common
|
COMMON_DIR := common
|
||||||
|
|
||||||
%:
|
%:
|
||||||
@ -64,6 +64,11 @@ override_dh_auto_build:
|
|||||||
cd $(MOD_SRC_DIR)/$${mod}; \
|
cd $(MOD_SRC_DIR)/$${mod}; \
|
||||||
python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \
|
python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \
|
||||||
cd $(MOD_SRC_DIR); \
|
cd $(MOD_SRC_DIR); \
|
||||||
|
elif [ $$mod = "z9432f" ]; then \
|
||||||
|
cp $(COMMON_DIR)/ipmihelper.py $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \
|
||||||
|
cd $(MOD_SRC_DIR)/$${mod}; \
|
||||||
|
python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \
|
||||||
|
cd $(MOD_SRC_DIR); \
|
||||||
elif [ $$mod = "n3248pxe" ]; then \
|
elif [ $$mod = "n3248pxe" ]; then \
|
||||||
cd $(MOD_SRC_DIR)/$${mod}; \
|
cd $(MOD_SRC_DIR)/$${mod}; \
|
||||||
python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \
|
python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \
|
||||||
@ -140,6 +145,11 @@ override_dh_clean:
|
|||||||
rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \
|
rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \
|
||||||
rm -rf $(MOD_SRC_DIR)/$${mod}/build; \
|
rm -rf $(MOD_SRC_DIR)/$${mod}/build; \
|
||||||
rm -rf $(MOD_SRC_DIR)/$${mod}/build/*.egg-info; \
|
rm -rf $(MOD_SRC_DIR)/$${mod}/build/*.egg-info; \
|
||||||
|
elif [ $$mod = "z9432f" ]; then \
|
||||||
|
rm -f $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \
|
||||||
|
rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \
|
||||||
|
rm -rf $(MOD_SRC_DIR)/$${mod}/build; \
|
||||||
|
rm -rf $(MOD_SRC_DIR)/$${mod}/build/*.egg-info; \
|
||||||
elif [ $$mod = "n3248pxe" ]; then \
|
elif [ $$mod = "n3248pxe" ]; then \
|
||||||
rm -f $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \
|
rm -f $(MOD_SRC_DIR)/$${mod}/sonic_platform/ipmihelper.py; \
|
||||||
rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \
|
rm -f $(MOD_SRC_DIR)/$${mod}/modules/*.whl; \
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
# /etc/modules: kernel modules to load at boot time.
|
||||||
|
#
|
||||||
|
# This file contains the names of kernel modules that should be loaded
|
||||||
|
# at boot time, one per line. Lines beginning with "#" are ignored.
|
||||||
|
|
||||||
|
i2c-i801
|
||||||
|
i2c-isch
|
||||||
|
i2c-ismt
|
||||||
|
i2c-dev
|
||||||
|
i2c-mux
|
||||||
|
i2c-smbus
|
||||||
|
|
||||||
|
i2c-mux-pca954x
|
||||||
|
|
||||||
|
ipmi_devintf
|
||||||
|
ipmi_si
|
@ -0,0 +1,2 @@
|
|||||||
|
obj-m := dell_z9432f_fpga_ocores.o mc24lc64t.o
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,142 @@
|
|||||||
|
/*
|
||||||
|
* mc24lc64t.c - driver for Microchip 24LC64T
|
||||||
|
*
|
||||||
|
* Copyright (C) 2017 Celestica Corp.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
#include <linux/jiffies.h>
|
||||||
|
|
||||||
|
struct mc24lc64t_data {
|
||||||
|
struct i2c_client *fake_client;
|
||||||
|
struct mutex update_lock;
|
||||||
|
};
|
||||||
|
|
||||||
|
static ssize_t mc24lc64t_read(struct file *filp, struct kobject *kobj,
|
||||||
|
struct bin_attribute *bin_attr,
|
||||||
|
char *buf, loff_t off, size_t count)
|
||||||
|
{
|
||||||
|
struct i2c_client *client = kobj_to_i2c_client(kobj);
|
||||||
|
struct mc24lc64t_data *drvdata = i2c_get_clientdata(client);
|
||||||
|
unsigned long timeout, read_time, i = 0;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
mutex_lock(&drvdata->update_lock);
|
||||||
|
|
||||||
|
if (i2c_smbus_write_byte_data(client, off>>8, off))
|
||||||
|
{
|
||||||
|
status = -EIO;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
msleep(1);
|
||||||
|
|
||||||
|
begin:
|
||||||
|
|
||||||
|
if (i < count)
|
||||||
|
{
|
||||||
|
timeout = jiffies + msecs_to_jiffies(25); /* 25 mS timeout*/
|
||||||
|
do {
|
||||||
|
read_time = jiffies;
|
||||||
|
|
||||||
|
status = i2c_smbus_read_byte(client);
|
||||||
|
if (status >= 0)
|
||||||
|
{
|
||||||
|
buf[i++] = status;
|
||||||
|
goto begin;
|
||||||
|
}
|
||||||
|
} while (time_before(read_time, timeout));
|
||||||
|
|
||||||
|
status = -ETIMEDOUT;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = count;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
mutex_unlock(&drvdata->update_lock);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct bin_attribute mc24lc64t_bit_attr = {
|
||||||
|
.attr = {
|
||||||
|
.name = "eeprom",
|
||||||
|
.mode = S_IRUGO,
|
||||||
|
},
|
||||||
|
.size = 65536,
|
||||||
|
.read = mc24lc64t_read,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int mc24lc64t_probe(struct i2c_client *client,
|
||||||
|
const struct i2c_device_id *id)
|
||||||
|
{
|
||||||
|
struct i2c_adapter *adapter = client->adapter;
|
||||||
|
struct mc24lc64t_data *drvdata;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA
|
||||||
|
| I2C_FUNC_SMBUS_READ_BYTE))
|
||||||
|
return -EPFNOSUPPORT;
|
||||||
|
|
||||||
|
if (!(drvdata = devm_kzalloc(&client->dev,
|
||||||
|
sizeof(struct mc24lc64t_data), GFP_KERNEL)))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
drvdata->fake_client = i2c_new_dummy_device(client->adapter, client->addr + 1);
|
||||||
|
if (!drvdata->fake_client)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
i2c_set_clientdata(client, drvdata);
|
||||||
|
mutex_init(&drvdata->update_lock);
|
||||||
|
|
||||||
|
err = sysfs_create_bin_file(&client->dev.kobj, &mc24lc64t_bit_attr);
|
||||||
|
if (err)
|
||||||
|
i2c_unregister_device(drvdata->fake_client);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mc24lc64t_remove(struct i2c_client *client)
|
||||||
|
{
|
||||||
|
struct mc24lc64t_data *drvdata = i2c_get_clientdata(client);
|
||||||
|
|
||||||
|
i2c_unregister_device(drvdata->fake_client);
|
||||||
|
|
||||||
|
sysfs_remove_bin_file(&client->dev.kobj, &mc24lc64t_bit_attr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct i2c_device_id mc24lc64t_id[] = {
|
||||||
|
{ "24lc64t", 0 },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(i2c, mc24lc64t_id);
|
||||||
|
|
||||||
|
static struct i2c_driver mc24lc64t_driver = {
|
||||||
|
.driver = {
|
||||||
|
.name = "mc24lc64t",
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
},
|
||||||
|
.probe = mc24lc64t_probe,
|
||||||
|
.remove = mc24lc64t_remove,
|
||||||
|
.id_table = mc24lc64t_id,
|
||||||
|
};
|
||||||
|
|
||||||
|
module_i2c_driver(mc24lc64t_driver);
|
||||||
|
|
||||||
|
MODULE_AUTHOR("Abhisit Sangjan <asang@celestica.com>");
|
||||||
|
MODULE_DESCRIPTION("Microchip 24LC64T Driver");
|
||||||
|
MODULE_LICENSE("GPL");
|
@ -0,0 +1,3 @@
|
|||||||
|
# Temporary dummy file for Z9432F.
|
||||||
|
# Will be updated soon.
|
||||||
|
|
102
platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/pcisysfs.py
Executable file
102
platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/pcisysfs.py
Executable file
@ -0,0 +1,102 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# Copyright (c) 2015 Dell Inc.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
import struct
|
||||||
|
import sys
|
||||||
|
import getopt
|
||||||
|
from os import *
|
||||||
|
from mmap import *
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
''' This is the Usage Method '''
|
||||||
|
|
||||||
|
print '\t\t pcisysfs.py --get --offset <offset> --res <resource>'
|
||||||
|
print '\t\t pcisysfs.py --set --val <val> --offset <offset> --res <resource>'
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def pci_mem_read(mm,offset):
|
||||||
|
mm.seek(offset)
|
||||||
|
read_data_stream=mm.read(4)
|
||||||
|
print ""
|
||||||
|
reg_val=struct.unpack('I',read_data_stream)
|
||||||
|
print "reg_val read:%x"%reg_val
|
||||||
|
return reg_val
|
||||||
|
|
||||||
|
def pci_mem_write(mm,offset,data):
|
||||||
|
mm.seek(offset)
|
||||||
|
print "data to write:%x"%data
|
||||||
|
mm.write(struct.pack('I',data))
|
||||||
|
|
||||||
|
def pci_set_value(resource,val,offset):
|
||||||
|
fd=open(resource,O_RDWR)
|
||||||
|
mm=mmap(fd,0)
|
||||||
|
pci_mem_write(mm,offset,val)
|
||||||
|
|
||||||
|
def pci_get_value(resource,offset):
|
||||||
|
fd=open(resource,O_RDWR)
|
||||||
|
mm=mmap(fd,0)
|
||||||
|
pci_mem_read(mm,offset)
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
|
||||||
|
''' The main function will read the user input from the
|
||||||
|
command line argument and process the request '''
|
||||||
|
|
||||||
|
opts = ''
|
||||||
|
val = ''
|
||||||
|
choice = ''
|
||||||
|
resource = ''
|
||||||
|
offset = ''
|
||||||
|
|
||||||
|
try:
|
||||||
|
opts, args = getopt.getopt(argv, "hgsv:" , \
|
||||||
|
["val=","res=","offset=","help", "get", "set"])
|
||||||
|
|
||||||
|
except getopt.GetoptError:
|
||||||
|
usage()
|
||||||
|
|
||||||
|
for opt,arg in opts:
|
||||||
|
|
||||||
|
if opt in ('-h','--help'):
|
||||||
|
choice = 'help'
|
||||||
|
|
||||||
|
elif opt in ('-g', '--get'):
|
||||||
|
choice = 'get'
|
||||||
|
|
||||||
|
elif opt in ('-s', '--set'):
|
||||||
|
choice = 'set'
|
||||||
|
|
||||||
|
elif opt == '--res':
|
||||||
|
resource = arg
|
||||||
|
|
||||||
|
elif opt == '--val':
|
||||||
|
val = int(arg,16)
|
||||||
|
|
||||||
|
elif opt == '--offset':
|
||||||
|
offset = int(arg,16)
|
||||||
|
|
||||||
|
if choice == 'set' and val != '' and offset !='' and resource !='':
|
||||||
|
pci_set_value(resource,val,offset)
|
||||||
|
|
||||||
|
elif choice == 'get' and offset != '' and resource !='':
|
||||||
|
pci_get_value(resource,offset)
|
||||||
|
|
||||||
|
else:
|
||||||
|
usage()
|
||||||
|
|
||||||
|
#Calling the main method
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main(sys.argv[1:])
|
||||||
|
|
254
platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/platform_sensors.py
Executable file
254
platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/platform_sensors.py
Executable file
@ -0,0 +1,254 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
"""
|
||||||
|
# Module on Z9432F, the BaseBoard Management Controller is an
|
||||||
|
# autonomous subsystem provides monitoring and management
|
||||||
|
# facility independent of the host CPU. IPMI standard
|
||||||
|
# protocol is used with ipmitool to fetch sensor details.
|
||||||
|
# This provies support for the following objects:
|
||||||
|
# * Onboard temperature sensors
|
||||||
|
# * FAN trays
|
||||||
|
# * PSU
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
import commands
|
||||||
|
|
||||||
|
Z9432F_MAX_FAN_TRAYS = 7
|
||||||
|
Z9432F_MAX_PSUS = 2
|
||||||
|
IPMI_SENSOR_DATA = "ipmitool sdr elist"
|
||||||
|
|
||||||
|
IPMI_RAW_STORAGE_READ = "ipmitool raw 0x0a 0x11 {0} {1} 0 1"
|
||||||
|
|
||||||
|
# Dump sensor registers
|
||||||
|
class SdrStatus(object):
|
||||||
|
""" Contains IPMI SDR List """
|
||||||
|
def __init__(self):
|
||||||
|
ipmi_cmd = IPMI_SENSOR_DATA
|
||||||
|
status, resp = commands.getstatusoutput(ipmi_cmd)
|
||||||
|
if status:
|
||||||
|
logging.error('Failed to execute: ' + ipmi_cmd)
|
||||||
|
sys.exit(0)
|
||||||
|
self.ipmi_sdr_dict = {}
|
||||||
|
for sdr_status in resp.split('\n'):
|
||||||
|
sdr_status_l = sdr_status.split('|')
|
||||||
|
sensor = sdr_status_l[0].strip()
|
||||||
|
value = sdr_status_l[4].strip()
|
||||||
|
self.ipmi_sdr_dict[sensor] = value
|
||||||
|
|
||||||
|
|
||||||
|
def get(self):
|
||||||
|
""" Returns SDR List """
|
||||||
|
return self.ipmi_sdr_dict
|
||||||
|
|
||||||
|
# Fetch a Fan Status
|
||||||
|
SDR_STATUS = SdrStatus()
|
||||||
|
def get_fan_status(fan_id):
|
||||||
|
""" Get Fan Status of give Id """
|
||||||
|
status, cmd_ret = commands.getstatusoutput(IPMI_FAN_PRESENCE.format(fan_id))
|
||||||
|
if status:
|
||||||
|
logging.error('Failed to execute : %s', IPMI_FAN_PRESENCE.format(fan_id))
|
||||||
|
sys.exit(0)
|
||||||
|
return ' ' + cmd_ret.splitlines()[5].strip(' ').strip('[]')
|
||||||
|
|
||||||
|
# Fetch a BMC register
|
||||||
|
|
||||||
|
|
||||||
|
def get_pmc_register(reg_name):
|
||||||
|
""" Returns the value of BMC Regster """
|
||||||
|
|
||||||
|
output = None
|
||||||
|
sdr_status = SDR_STATUS.get()
|
||||||
|
if reg_name in sdr_status:
|
||||||
|
output = sdr_status[reg_name]
|
||||||
|
else:
|
||||||
|
print '\nFailed to fetch: ' + reg_name + ' sensor '
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
return output
|
||||||
|
|
||||||
|
# Fetch FRU on given offset
|
||||||
|
def fetch_raw_fru(dev_id, offset):
|
||||||
|
""" Fetch RAW value from FRU (dev_id) @ given offset """
|
||||||
|
status, cmd_ret = commands.getstatusoutput(IPMI_RAW_STORAGE_READ.format(dev_id, offset))
|
||||||
|
if status:
|
||||||
|
logging.error('Failed to execute ipmitool :' + IPMI_RAW_STORAGE_READ.format(dev_id, offset))
|
||||||
|
return -1
|
||||||
|
return int(cmd_ret.strip().split(' ')[1])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_fan_airflow(fan_id):
|
||||||
|
""" Return Airflow of direction of FANTRAY(fan_id) """
|
||||||
|
airflow_direction = ['Exhaust', 'Intake']
|
||||||
|
dir_idx = fetch_raw_fru(fan_id+2, 0x45)
|
||||||
|
if dir_idx == -1:
|
||||||
|
return 'N/A'
|
||||||
|
return airflow_direction[dir_idx]
|
||||||
|
|
||||||
|
#Fetch FRU Data for given fruid
|
||||||
|
def get_psu_airflow(psu_id):
|
||||||
|
""" Return Airflow Direction of psu_id """
|
||||||
|
airflow_direction = ['Exhaust', 'Intake']
|
||||||
|
dir_idx = fetch_raw_fru(psu_id, 0x2F)
|
||||||
|
if dir_idx == -1:
|
||||||
|
return 'N/A'
|
||||||
|
return airflow_direction[dir_idx]
|
||||||
|
|
||||||
|
# Print the information for temperature sensors
|
||||||
|
|
||||||
|
|
||||||
|
def print_temperature_sensors():
|
||||||
|
""" Prints Temperature Sensor """
|
||||||
|
|
||||||
|
print "\nOnboard Temperature Sensors:"
|
||||||
|
|
||||||
|
print ' PT Left Temp: ',\
|
||||||
|
(get_pmc_register('PT_Left_temp'))
|
||||||
|
print ' NPU Rear Temp: ',\
|
||||||
|
(get_pmc_register('NPU_Rear_temp'))
|
||||||
|
print ' PT Right Temp: ',\
|
||||||
|
(get_pmc_register('PT_Right_temp'))
|
||||||
|
print ' NPU Front Temp: ',\
|
||||||
|
(get_pmc_register('NPU_Front_temp'))
|
||||||
|
print ' FAN Right Temp: ',\
|
||||||
|
(get_pmc_register('FAN_Right_temp'))
|
||||||
|
print ' NPU Temp: ',\
|
||||||
|
(get_pmc_register('NPU_temp'))
|
||||||
|
print ' CPU Temp: ',\
|
||||||
|
(get_pmc_register('CPU_temp'))
|
||||||
|
print ' PSU1 AF Temp: ',\
|
||||||
|
(get_pmc_register('PSU1_AF_temp'))
|
||||||
|
print ' PSU1 Mid Temp: ',\
|
||||||
|
(get_pmc_register('PSU1_Mid_temp'))
|
||||||
|
print ' PSU1 Rear Temp: ',\
|
||||||
|
(get_pmc_register('PSU1_Rear_temp'))
|
||||||
|
print ' PSU2 AF Temp: ',\
|
||||||
|
(get_pmc_register('PSU2_AF_temp'))
|
||||||
|
print ' PSU2 Mid Temp: ',\
|
||||||
|
(get_pmc_register('PSU2_Mid_temp'))
|
||||||
|
print ' PSU2 Rear Temp: ',\
|
||||||
|
(get_pmc_register('PSU2_Rear_temp'))
|
||||||
|
|
||||||
|
|
||||||
|
commands.getstatusoutput('echo 0 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us')
|
||||||
|
|
||||||
|
print_temperature_sensors()
|
||||||
|
|
||||||
|
# Print the information for 1 Fan Tray
|
||||||
|
|
||||||
|
|
||||||
|
def print_fan_tray(fan_tray):
|
||||||
|
""" Prints given Fan Tray information """
|
||||||
|
fan_status = ['Abnormal', 'Normal']
|
||||||
|
|
||||||
|
print ' Fan Tray ' + str(fan_tray) + ':'
|
||||||
|
|
||||||
|
fan_front_status = (get_pmc_register('Fan{0}_Front_state'.format(str(fan_tray))) == '')
|
||||||
|
fan_rear_status = (get_pmc_register('Fan{0}_Rear_state'.format(str(fan_tray))) == '')
|
||||||
|
print ' Fan1 Speed: ', \
|
||||||
|
get_pmc_register('FAN{0}_Front_rpm'.format(str(fan_tray)))
|
||||||
|
print ' Fan2 Speed: ',\
|
||||||
|
get_pmc_register('FAN{0}_Rear_rpm'.format(str(fan_tray)))
|
||||||
|
print ' Fan1 State: ', fan_status[fan_front_status]
|
||||||
|
print ' Fan2 State: ', fan_status[fan_rear_status]
|
||||||
|
print ' Airflow: ', get_fan_airflow(fan_tray)
|
||||||
|
|
||||||
|
|
||||||
|
print '\nFan Trays:'
|
||||||
|
|
||||||
|
for tray in range(1, Z9432F_MAX_FAN_TRAYS + 1):
|
||||||
|
if get_pmc_register('FAN{0}_prsnt'.format(str(tray))) == 'Present':
|
||||||
|
print_fan_tray(tray)
|
||||||
|
else:
|
||||||
|
print ' Fan Tray {}: NOT PRESENT'.format(str(tray))
|
||||||
|
|
||||||
|
def get_psu_status(index):
|
||||||
|
"""
|
||||||
|
Retrieves the presence status of power supply unit (PSU) defined
|
||||||
|
by index <index>
|
||||||
|
:param index: An integer, index of the PSU of which to query status
|
||||||
|
:return: Boolean, True if PSU is plugged, False if not
|
||||||
|
"""
|
||||||
|
|
||||||
|
status = get_pmc_register('PSU{0}_state'.format(str(index)))
|
||||||
|
if len(status.split(',')) > 1:
|
||||||
|
return 'NOT OK'
|
||||||
|
elif 'Presence' not in status:
|
||||||
|
return 'NOT PRESENT'
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# Print the information for PSU1, PSU2
|
||||||
|
def print_psu(psu_id):
|
||||||
|
""" Print PSU information od psu_id """
|
||||||
|
|
||||||
|
|
||||||
|
# PSU FAN details
|
||||||
|
if psu_id == 1:
|
||||||
|
print ' PSU1:'
|
||||||
|
print ' AF Temperature: ',\
|
||||||
|
get_pmc_register('PSU1_AF_temp')
|
||||||
|
print ' Mid Temperature: ',\
|
||||||
|
get_pmc_register('PSU1_Mid_temp')
|
||||||
|
print ' Rear Temperature: ',\
|
||||||
|
get_pmc_register('PSU1_Rear_temp')
|
||||||
|
print ' FAN RPM: ',\
|
||||||
|
get_pmc_register('PSU1_rpm')
|
||||||
|
|
||||||
|
# PSU input & output monitors
|
||||||
|
print ' Input Voltage: ',\
|
||||||
|
get_pmc_register('PSU1_In_volt')
|
||||||
|
print ' Output Voltage: ',\
|
||||||
|
get_pmc_register('PSU1_Out_volt')
|
||||||
|
print ' Input Power: ',\
|
||||||
|
get_pmc_register('PSU1_In_watt')
|
||||||
|
print ' Output Power: ',\
|
||||||
|
get_pmc_register('PSU1_Out_watt')
|
||||||
|
print ' Input Current: ',\
|
||||||
|
get_pmc_register('PSU1_In_amp')
|
||||||
|
print ' Output Current: ',\
|
||||||
|
get_pmc_register('PSU1_Out_amp')
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
print ' PSU2:'
|
||||||
|
print ' AF Temperature: ',\
|
||||||
|
get_pmc_register('PSU2_AF_temp')
|
||||||
|
print ' Mid Temperature: ',\
|
||||||
|
get_pmc_register('PSU2_Mid_temp')
|
||||||
|
print ' Rear Temperature: ',\
|
||||||
|
get_pmc_register('PSU2_Rear_temp')
|
||||||
|
print ' FAN RPM: ',\
|
||||||
|
get_pmc_register('PSU2_rpm')
|
||||||
|
|
||||||
|
# PSU input & output monitors
|
||||||
|
print ' Input Voltage: ',\
|
||||||
|
get_pmc_register('PSU2_In_volt')
|
||||||
|
print ' Output Voltage: ',\
|
||||||
|
get_pmc_register('PSU2_Out_volt')
|
||||||
|
print ' Input Power: ',\
|
||||||
|
get_pmc_register('PSU2_In_watt')
|
||||||
|
print ' Output Power: ',\
|
||||||
|
get_pmc_register('PSU2_Out_watt')
|
||||||
|
print ' Input Current: ',\
|
||||||
|
get_pmc_register('PSU2_In_amp')
|
||||||
|
print ' Output Current: ',\
|
||||||
|
get_pmc_register('PSU2_Out_amp')
|
||||||
|
print ' Airflow: ',\
|
||||||
|
get_psu_airflow(psu_id)
|
||||||
|
|
||||||
|
|
||||||
|
print '\nPSUs:'
|
||||||
|
for psu in range(1, Z9432F_MAX_PSUS + 1):
|
||||||
|
psu_status = get_psu_status(psu)
|
||||||
|
if psu_status is not None:
|
||||||
|
print ' PSU{0}: {1}'.format(psu, psu_status)
|
||||||
|
else:
|
||||||
|
print_psu(psu)
|
||||||
|
|
||||||
|
print '\n Total Power: ',\
|
||||||
|
get_pmc_register('PSU_Total_watt')
|
||||||
|
commands.getstatusoutput('echo 1000 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us')
|
@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
try:
|
||||||
|
import struct
|
||||||
|
from os import *
|
||||||
|
from mmap import *
|
||||||
|
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError("%s - required module no found" % str(e))
|
||||||
|
|
||||||
|
BASE_RES_PATH = "/sys/bus/pci/devices/0000:04:00.0/resource0"
|
||||||
|
PORT_START = 0
|
||||||
|
PORT_END = 32
|
||||||
|
|
||||||
|
|
||||||
|
def pci_mem_write(mm, offset, data):
|
||||||
|
mm.seek(offset)
|
||||||
|
mm.write(struct.pack('I', data))
|
||||||
|
|
||||||
|
|
||||||
|
def pci_set_value(resource, val, offset):
|
||||||
|
fd = open(resource, O_RDWR)
|
||||||
|
mm = mmap(fd, 0)
|
||||||
|
pci_mem_write(mm, offset, val)
|
||||||
|
mm.close()
|
||||||
|
close(fd)
|
||||||
|
|
||||||
|
for port_num in range(PORT_START, PORT_END+1):
|
||||||
|
port_offset = 0x400c + ((port_num) * 16)
|
||||||
|
pci_set_value(BASE_RES_PATH, 0x30, port_offset)
|
8
platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/sensors
Executable file
8
platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/sensors
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
docker exec -i pmon sensors "$@"
|
||||||
|
docker exec -i pmon /usr/bin/platform_sensors.py "$@"
|
||||||
|
|
||||||
|
#To probe sensors not part of lm-sensors
|
||||||
|
#if [ -r /usr/local/bin/platform_sensors.py ]; then
|
||||||
|
# python /usr/local/bin/platform_sensors.py
|
||||||
|
#fi
|
212
platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/z9432f_platform.sh
Executable file
212
platform/broadcom/sonic-platform-modules-dell/z9432f/scripts/z9432f_platform.sh
Executable file
@ -0,0 +1,212 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
init_devnum() {
|
||||||
|
found=0
|
||||||
|
for devnum in 0 1; do
|
||||||
|
devname=`cat /sys/bus/i2c/devices/i2c-${devnum}/name`
|
||||||
|
# iSMT adapter can be at either dffd0000 or dfff0000
|
||||||
|
if [[ $devname == 'SMBus iSMT adapter at '* ]]; then
|
||||||
|
found=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
[ $found -eq 0 ] && echo "cannot find iSMT" && exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Attach/Detach syseeprom on CPU board
|
||||||
|
sys_eeprom() {
|
||||||
|
case $1 in
|
||||||
|
"new_device") echo 24c16 0x50 > /sys/bus/i2c/devices/i2c-${devnum}/$1
|
||||||
|
;;
|
||||||
|
"delete_device") echo 0x50 > /sys/bus/i2c/devices/i2c-${devnum}/$1
|
||||||
|
;;
|
||||||
|
*) echo "z9432f_platform: sys_eeprom : invalid command !"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
#Attach/Detach the MUX connecting all QSFPs
|
||||||
|
switch_board_qsfp_sfp_mux() {
|
||||||
|
case $1 in
|
||||||
|
"new_device")
|
||||||
|
for ((j=0x70,i=603;i<=607;i++,j++));
|
||||||
|
do
|
||||||
|
sleep 0.1
|
||||||
|
echo "Attaching PCA9548 @ $j"
|
||||||
|
echo pca9548 $j > /sys/bus/i2c/devices/i2c-$i/$1
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
"delete_device")
|
||||||
|
for ((j=0x70,i=603;i<=607;i++,j++));
|
||||||
|
do
|
||||||
|
echo "Detaching PCA9548 @ $j"
|
||||||
|
echo $j > /sys/bus/i2c/devices/i2c-$i/$1
|
||||||
|
done
|
||||||
|
|
||||||
|
;;
|
||||||
|
*) echo "z9432f_platform: switch_board_qsfp_sfp_mux: invalid command !"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
sleep 2
|
||||||
|
}
|
||||||
|
|
||||||
|
#Attach/Detach 2 instances of EEPROM driver SFP+ ports
|
||||||
|
#eeprom can dump data using below command
|
||||||
|
switch_board_sfp() {
|
||||||
|
case $1 in
|
||||||
|
"new_device")
|
||||||
|
for ((i=34;i<=35;i++));
|
||||||
|
do
|
||||||
|
echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-$i/$1
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
|
||||||
|
"delete_device")
|
||||||
|
for ((i=34;i<=35;i++));
|
||||||
|
do
|
||||||
|
echo 0x50 > /sys/bus/i2c/devices/i2c-$i/$1
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
|
||||||
|
*) echo "z9332f_platform: switch_board_qsfp: invalid command !"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
#Attach/Detach 32 instances of EEPROM driver QSFP ports
|
||||||
|
#eeprom can dump data using below command
|
||||||
|
switch_board_qsfp() {
|
||||||
|
case $1 in
|
||||||
|
"new_device")
|
||||||
|
for ((i=2;i<=33;i++));
|
||||||
|
do
|
||||||
|
echo optoe3 0x50 > /sys/bus/i2c/devices/i2c-$i/$1
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
|
||||||
|
"delete_device")
|
||||||
|
for ((i=2;i<=33;i++));
|
||||||
|
do
|
||||||
|
echo 0x50 > /sys/bus/i2c/devices/i2c-$i/$1
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
|
||||||
|
*) echo "z9432f_platform: switch_board_qsfp: invalid command !"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
#Modsel 64 ports to applicable QSFP type modules
|
||||||
|
#This enables the adapter to respond for i2c commands
|
||||||
|
switch_board_modsel() {
|
||||||
|
resource="/sys/bus/pci/devices/0000:04:00.0/resource0"
|
||||||
|
for ((i=1;i<=34;i++));
|
||||||
|
do
|
||||||
|
port_addr=$(( 16384 + ((i - 1) * 16)))
|
||||||
|
hex=$( printf "0x%x" $port_addr )
|
||||||
|
python /usr/bin/pcisysfs.py --set --offset $hex --val 0x10 --res $resource > /dev/null 2>&1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
platform_firmware_versions() {
|
||||||
|
FIRMWARE_VERSION_FILE=/var/log/firmware_versions
|
||||||
|
rm -rf ${FIRMWARE_VERSION_FILE}
|
||||||
|
echo "BIOS: `dmidecode -s system-version `" > $FIRMWARE_VERSION_FILE
|
||||||
|
## Get FPGA version
|
||||||
|
r=`/usr/bin/pcisysfs.py --get --offset 0x00 --res /sys/bus/pci/devices/0000\:04\:00.0/resource0 | sed '1d; s/.*\(....\)$/\1/; s/\(..\{1\}\)/\1./'`
|
||||||
|
r_min=$(echo $r | sed 's/.*\(..\)$/0x\1/')
|
||||||
|
r_maj=$(echo $r | sed 's/^\(..\).*/0x\1/')
|
||||||
|
echo "FPGA: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE
|
||||||
|
|
||||||
|
## Get BMC Firmware Revision
|
||||||
|
r=`cat /sys/class/ipmi/ipmi0/device/bmc/firmware_revision`
|
||||||
|
echo "BMC: $r" >> $FIRMWARE_VERSION_FILE
|
||||||
|
|
||||||
|
#System CPLD 0x31 on i2c bus 601 ( physical FPGA I2C-2)
|
||||||
|
r_min=`/usr/sbin/i2cget -y 601 0x31 0x0 | sed ' s/.*\(0x..\)$/\1/'`
|
||||||
|
r_maj=`/usr/sbin/i2cget -y 601 0x31 0x1 | sed ' s/.*\(0x..\)$/\1/'`
|
||||||
|
echo "System CPLD: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE
|
||||||
|
|
||||||
|
#Slave CPLD 1 0x30 on i2c bus 600 ( physical FPGA I2C-1)
|
||||||
|
r_min=`/usr/sbin/i2cget -y 600 0x30 0x0 | sed ' s/.*\(0x..\)$/\1/'`
|
||||||
|
r_maj=`/usr/sbin/i2cget -y 600 0x30 0x1 | sed ' s/.*\(0x..\)$/\1/'`
|
||||||
|
echo "Slave CPLD 1: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE
|
||||||
|
|
||||||
|
#Slave CPLD 2 0x31 on i2c bus 600 ( physical FPGA I2C-1)
|
||||||
|
r_min=`/usr/sbin/i2cget -y 600 0x31 0x0 | sed ' s/.*\(0x..\)$/\1/'`
|
||||||
|
r_maj=`/usr/sbin/i2cget -y 600 0x31 0x1 | sed ' s/.*\(0x..\)$/\1/'`
|
||||||
|
echo "Slave CPLD 2: $((r_maj)).$((r_min))" >> $FIRMWARE_VERSION_FILE
|
||||||
|
}
|
||||||
|
|
||||||
|
#This enables the led control for CPU and default states
|
||||||
|
switch_board_led_default() {
|
||||||
|
resource="/sys/bus/pci/devices/0000:04:00.0/resource0"
|
||||||
|
python /usr/bin/pcisysfs.py --set --offset 0x24 --val 0x194 --res $resource > /dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
install_python_api_package() {
|
||||||
|
device="/usr/share/sonic/device"
|
||||||
|
platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform)
|
||||||
|
|
||||||
|
pip3 install $device/$platform/sonic_platform-1.0-py3-none-any.whl
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_python_api_package() {
|
||||||
|
rv=$(pip3 show sonic-platform > /dev/null 2>/dev/null)
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
rv=$(pip3 uninstall -y sonic-platform > /dev/null 2>/dev/null)
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_reboot_cause() {
|
||||||
|
REBOOT_REASON_FILE="/host/reboot-cause/platform/reboot_reason"
|
||||||
|
resource="/sys/bus/pci/devices/0000:04:00.0/resource0"
|
||||||
|
|
||||||
|
mkdir -p $(dirname $REBOOT_REASON_FILE)
|
||||||
|
|
||||||
|
# Handle First Boot into software version with reboot cause determination support
|
||||||
|
if [[ ! -e $REBOOT_REASON_FILE ]]; then
|
||||||
|
echo "0" > $REBOOT_REASON_FILE
|
||||||
|
else
|
||||||
|
/usr/bin/pcisysfs.py --get --offset 0x18 --res $resource | sed '1d; s/.*:\(.*\)$/\1/;' > $REBOOT_REASON_FILE
|
||||||
|
fi
|
||||||
|
/usr/bin/pcisysfs.py --set --val 0x0 --offset 0x18 --res $resource
|
||||||
|
}
|
||||||
|
|
||||||
|
init_devnum
|
||||||
|
|
||||||
|
if [ "$1" == "init" ]; then
|
||||||
|
modprobe i2c-dev
|
||||||
|
modprobe i2c-mux-pca954x force_deselect_on_exit=1
|
||||||
|
modprobe ipmi_devintf
|
||||||
|
modprobe ipmi_si kipmid_max_busy_us=1000
|
||||||
|
modprobe i2c_ocores
|
||||||
|
modprobe dell_z9432f_fpga_ocores
|
||||||
|
modprobe mc24lc64t
|
||||||
|
sys_eeprom "new_device"
|
||||||
|
switch_board_qsfp_sfp_mux "new_device"
|
||||||
|
switch_board_qsfp "new_device"
|
||||||
|
switch_board_sfp "new_device"
|
||||||
|
switch_board_modsel
|
||||||
|
switch_board_led_default
|
||||||
|
install_python_api_package
|
||||||
|
#python /usr/bin/qsfp_irq_enable.py
|
||||||
|
platform_firmware_versions
|
||||||
|
get_reboot_cause
|
||||||
|
echo 1000 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us
|
||||||
|
|
||||||
|
elif [ "$1" == "deinit" ]; then
|
||||||
|
sys_eeprom "delete_device"
|
||||||
|
switch_board_sfp "delete_device"
|
||||||
|
switch_board_qsfp "delete_device"
|
||||||
|
switch_board_qsfp_sfp_mux "delete_device"
|
||||||
|
|
||||||
|
modprobe -r mc24lc64t
|
||||||
|
modprobe -r i2c-mux-pca954x
|
||||||
|
modprobe -r i2c-dev
|
||||||
|
remove_python_api_package
|
||||||
|
else
|
||||||
|
echo "z9432f_platform : Invalid option !"
|
||||||
|
fi
|
||||||
|
|
1
platform/broadcom/sonic-platform-modules-dell/z9432f/setup.py
Symbolic link
1
platform/broadcom/sonic-platform-modules-dell/z9432f/setup.py
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../s6100/setup.py
|
@ -0,0 +1,2 @@
|
|||||||
|
__all__ = ["platform", "chassis", "sfp", "eeprom", "component", "psu", "thermal", "fan", "fan_drawer"]
|
||||||
|
from sonic_platform import *
|
@ -0,0 +1,425 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""
|
||||||
|
#############################################################################
|
||||||
|
# DELLEMC Z9432F
|
||||||
|
#
|
||||||
|
# Module contains an implementation of SONiC Platform Base API and
|
||||||
|
# provides the platform information
|
||||||
|
#
|
||||||
|
#############################################################################
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
from sonic_platform_base.chassis_base import ChassisBase
|
||||||
|
from sonic_platform.sfp import Sfp
|
||||||
|
from sonic_platform.eeprom import Eeprom
|
||||||
|
from sonic_platform.component import Component
|
||||||
|
from sonic_platform.psu import Psu
|
||||||
|
from sonic_platform.thermal import Thermal
|
||||||
|
from sonic_platform.watchdog import Watchdog
|
||||||
|
from sonic_platform.fan_drawer import FanDrawer
|
||||||
|
import sonic_platform.hwaccess as hwaccess
|
||||||
|
except ImportError as err:
|
||||||
|
raise ImportError(str(err) + "- required module not found")
|
||||||
|
|
||||||
|
MAX_Z9432F_COMPONENT = 6 # BIOS,BMC,FPGA,SYSTEM CPLD,2 SLAVE CPLDs
|
||||||
|
MAX_Z9432F_FANTRAY = 7
|
||||||
|
MAX_Z9432F_FAN = 2
|
||||||
|
MAX_Z9432F_PSU = 2
|
||||||
|
MAX_Z9432F_THERMAL = 13
|
||||||
|
SYSTEM_LED_REG = 0x24
|
||||||
|
SYSTEM_BEACON_LED_SET = 0x8
|
||||||
|
SYSTEM_BEACON_LED_CLEAR = 0xFFFFFFF7
|
||||||
|
|
||||||
|
MEDIA_PART_NUM_LIST = set([ \
|
||||||
|
"8T47V", "XTY28", "MHVPK", "GF76J", "J6FGD", "F1KMV", "9DN5J", "H4DHD", "6MCNV", "0WRX0", "X7F70",
|
||||||
|
"5R2PT", "WTRD1", "WTRD1", "WTRD1", "WTRD1", "5250G", "WTRD1", "C5RNH", "C5RNH", "FTLX8571D3BCL-FC",
|
||||||
|
"C5RNH", "5250G", "N8TDR", "7D64H", "7D64H", "RN84N", "RN84N", "HMTNW", "6K3Y6", "6K3Y6", "TY5FM",
|
||||||
|
"50M0R", "PGYJT", "WP2PP", "85Y13", "1HCGH", "FP9R1", "FYD0M", "C6Y7M", "C6Y7M", "V250M", "V250M",
|
||||||
|
"5CWK6", "5CWK6", "53HVN", "53HVN", "358VV", "358VV", "MV799", "MV799", "YJF03", "P9GND", "T1KCN",
|
||||||
|
"1DXKP", "MT7R2", "K0T7R", "W5G04", "7TCDN", "7TCDN", "7TCDN", "7TCDN", "7TCDN", "V3XJK", "0MV31",
|
||||||
|
"5FVP7", "N6KM9", "C41MF", "77KC3", "XW7J0", "V4NJV", "2XJHY", "H93DH", "H93DH", "F8CG0", "F8CG0",
|
||||||
|
"F8CG0", "119N6", "WFMF5", "794RX", "288F6", "1M31V", "1M31V", "5NP8R", "5NP8R", "4TC09", "4TC09",
|
||||||
|
"FC6KV", "FC6KV", "J90VN", "J90VN", "05RH0", "05RH0", "YDN52", "0C2YV", "YDN52", "0C2YV", "9JT65",
|
||||||
|
"D7M6H", "6GW14", "FYVFW", "0VF5H", "P4YPY", "P4YPY", "TCPM2", "TCPM2", "JNPF8", "JNPF8", "27GG5",
|
||||||
|
"27GG5", "P8T4W", "P8T4W", "JR54Y", "M6N0J", "XJYD0", "K44H9", "035KG", "P7C7N", "76V43", "3CC35",
|
||||||
|
"FN4FC", "26FN3", "YFNDD", "YFNDD", "7R9N9", "035KG", "P7C7N", "76V43", "3CC35", "PLRXPLSCS43811",
|
||||||
|
"FN4FC", "26FN3", "YFNDD", "YFNDD", "7R9N9", "G86YJ", "V407F", "V407F", "9KH6T", "G86YJ", "V407F",
|
||||||
|
"9KH6T", "2JVDD", "D0R73", "VXFJY", "9X8JP", "2JVDD", "D0R73", "VXFJY", "9X8JP", "2JVDD", "D0R73",
|
||||||
|
"VXFJY", "9X8JP", "GMFC5", "GMFC5", "GMFC5", "D7P80", "3MFXG", "3MFXG", "0GWXJ", "THPF3", "PJ62G",
|
||||||
|
"3XCX1", "JJYKG", "RRRTK", "16K56", "86JM2", "K5R6C", "7MG2C", "WTPPN", "9HTT2", "NKM4F", "VXGGG",
|
||||||
|
"JC9W6", "6MR8M", "RP3GV", "M5PPJ", "XKY55", "TKCXT", "05J8P", "5WGKD", "XFDRT", "NW8DM", "YPKH3",
|
||||||
|
"5WGKD", "XFDRT", "NW8DM", "YPKH3", "71XXK", "MVCX6", "0XYP6", "HPPVW", "3GHRT", "71XXK", "MVCX6",
|
||||||
|
"0XYP6", "HPPVW", "3GHRT", "2X5T6", "135V2", "KD5MV", "2X5T6", "KD5MV", "HHFK0", "3YWG7", "5CMT2",
|
||||||
|
"RCVP5", "X5DH4", "HHFK0", "3YWG7", "5CMT2", "RCVP5", "X5DH4", "3YWG7", "5CMT2", "RCVP5", "X5DH4",
|
||||||
|
"4WJ41", "4WJ41", "14NV5", "14NV5", "14NV5", "4WGYD", "YKMH7", "X7CCC", "X7CCC", "0X9CT", "0CY8V",
|
||||||
|
"P7D7R", "W4GPP", "W4GPP", "W4GPP", "HHHCHC", "07RN7", "07RN7", "0YR96", "0YR96", "JCYM9",
|
||||||
|
"FTLX8571D3BCL", "DDW0X", "VPFDJ", "229KM", "9FC7D", "DDW0X", "VPFDJ", "6FMR5", "J7K20", "N3K9W",
|
||||||
|
"6FMR5", "8R4VM", "7VN5T", "D9YM8", "8R4VM", "VYXPW", "87TPX", "WY6FK", "VYXPW", "87TPX", "WY6FK",
|
||||||
|
"WG8C4", "N8K82", "2DV6Y", "77C3C", "RC0HM", "77C3C", "RC0HM", "JHXTN", "3P3PG", "92YVM", "4VX5M",
|
||||||
|
"4VX5M", "6RRGD", "W4JWV", "22V6R", "XR11M", "9GMDY", "JMCWK", "TP2F0", "6MGDY", "78RHK", "C0TP5",
|
||||||
|
"0WDNV", "FCLF8522P2BTL"])
|
||||||
|
|
||||||
|
PORT_START = 1
|
||||||
|
PORT_END = 34
|
||||||
|
PORTS_IN_BLOCK = (PORT_END + 1)
|
||||||
|
REBOOT_CAUSE_PATH = "/host/reboot-cause/platform/reboot_reason"
|
||||||
|
PCI_RES = "/sys/bus/pci/devices/0000:04:00.0/resource0"
|
||||||
|
|
||||||
|
class Chassis(ChassisBase):
|
||||||
|
"""
|
||||||
|
DELLEMC Platform-specific Chassis class
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
sysled_offset = 0x0024
|
||||||
|
|
||||||
|
SYSLED_COLOR_TO_REG = {
|
||||||
|
"blinking_green": 0x0,
|
||||||
|
"green" : 0x10,
|
||||||
|
"amber" : 0x20,
|
||||||
|
"blinking_amber": 0x30
|
||||||
|
}
|
||||||
|
|
||||||
|
REG_TO_SYSLED_COLOR = {
|
||||||
|
0x0 : "blinking_green",
|
||||||
|
0x10 : "green",
|
||||||
|
0x20 : "amber",
|
||||||
|
0x30 : "blinking_amber"
|
||||||
|
}
|
||||||
|
|
||||||
|
_global_port_pres_dict = {}
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
ChassisBase.__init__(self)
|
||||||
|
# sfp.py will read eeprom contents and retrive the eeprom data.
|
||||||
|
# We pass the eeprom path from chassis.py
|
||||||
|
_sfp_port = list(range(33, PORTS_IN_BLOCK))
|
||||||
|
i2c_bus_for_port = 2
|
||||||
|
i2c_mux_to_populate = 603
|
||||||
|
i2c_mux_address = 70
|
||||||
|
i2c_mux_is_good = False
|
||||||
|
eeprom_base = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom"
|
||||||
|
mux_channel = "/sys/class/i2c-adapter/i2c-{0}/{0}-00{1}/channel-0"
|
||||||
|
for index in range(PORT_START, PORTS_IN_BLOCK):
|
||||||
|
eeprom_path = ""
|
||||||
|
if index%8 == 1: # 8 buses per i2c mux
|
||||||
|
i2c_mux_is_good = True if os.path.exists(mux_channel.format(i2c_mux_to_populate, i2c_mux_address)) else False
|
||||||
|
i2c_mux_to_populate += 1
|
||||||
|
i2c_mux_address += 1
|
||||||
|
if i2c_mux_is_good:
|
||||||
|
eeprom_path = eeprom_base.format(i2c_bus_for_port)
|
||||||
|
i2c_bus_for_port += 1
|
||||||
|
port_type = 'QSFP_DD' if index not in _sfp_port else 'SFP'
|
||||||
|
sfp_node = Sfp(index, port_type, eeprom_path)
|
||||||
|
self._sfp_list.append(sfp_node)
|
||||||
|
|
||||||
|
self._eeprom = Eeprom()
|
||||||
|
self._watchdog = Watchdog()
|
||||||
|
self._num_sfps = PORT_END
|
||||||
|
self._num_fans = MAX_Z9432F_FANTRAY * MAX_Z9432F_FAN
|
||||||
|
|
||||||
|
for i in range(MAX_Z9432F_FANTRAY):
|
||||||
|
fandrawer = FanDrawer(i)
|
||||||
|
self._fan_drawer_list.append(fandrawer)
|
||||||
|
self._fan_list.extend(fandrawer._fan_list)
|
||||||
|
|
||||||
|
self._psu_list = [Psu(i) for i in range(MAX_Z9432F_PSU)]
|
||||||
|
self._thermal_list = [Thermal(i) for i in range(MAX_Z9432F_THERMAL)]
|
||||||
|
self._component_list = [Component(i) for i in range(MAX_Z9432F_COMPONENT)]
|
||||||
|
for port_num in range(PORT_START, PORTS_IN_BLOCK):
|
||||||
|
presence = self.get_sfp(port_num).get_presence()
|
||||||
|
self._global_port_pres_dict[port_num] = '1' if presence else '0'
|
||||||
|
|
||||||
|
self._watchdog = Watchdog()
|
||||||
|
#self.LOCATOR_LED_ON = self.STATUS_LED_COLOR_BLUE_BLINK
|
||||||
|
#self.LOCATOR_LED_OFF = self.STATUS_LED_COLOR_OFF
|
||||||
|
#ext_media_override()
|
||||||
|
|
||||||
|
# check for this event change for sfp / do we need to handle timeout/sleep
|
||||||
|
|
||||||
|
def get_change_event(self, timeout=0):
|
||||||
|
"""
|
||||||
|
Returns a nested dictionary containing all devices which have
|
||||||
|
experienced a change at chassis level
|
||||||
|
"""
|
||||||
|
start_ms = time.time() * 1000
|
||||||
|
port_dict = {}
|
||||||
|
change_dict = {}
|
||||||
|
change_dict['sfp'] = port_dict
|
||||||
|
while True:
|
||||||
|
time.sleep(0.5)
|
||||||
|
for port_num in range(PORT_START, (PORT_END + 1)):
|
||||||
|
presence = self.get_sfp(port_num).get_presence()
|
||||||
|
if presence and self._global_port_pres_dict[port_num] == '0':
|
||||||
|
self._global_port_pres_dict[port_num] = '1'
|
||||||
|
port_dict[port_num] = '1'
|
||||||
|
elif(not presence and
|
||||||
|
self._global_port_pres_dict[port_num] == '1'):
|
||||||
|
self._global_port_pres_dict[port_num] = '0'
|
||||||
|
port_dict[port_num] = '0'
|
||||||
|
|
||||||
|
if len(port_dict) > 0:
|
||||||
|
return True, change_dict
|
||||||
|
|
||||||
|
if timeout:
|
||||||
|
now_ms = time.time() * 1000
|
||||||
|
if now_ms - start_ms >= timeout:
|
||||||
|
return True, change_dict
|
||||||
|
|
||||||
|
|
||||||
|
def get_status_led(self):
|
||||||
|
"""
|
||||||
|
Gets the state of the system LED
|
||||||
|
Returns:
|
||||||
|
A string, one of the valid LED color strings which could be
|
||||||
|
vendor specified.
|
||||||
|
"""
|
||||||
|
val = hwaccess.pci_get_value(PCI_RES, self.sysled_offset)
|
||||||
|
if val != -1:
|
||||||
|
val = val & 0x30
|
||||||
|
return self.REG_TO_SYSLED_COLOR.get(val)
|
||||||
|
return self.sys_ledcolor
|
||||||
|
|
||||||
|
def initizalize_system_led(self):
|
||||||
|
self.sys_ledcolor = "green"
|
||||||
|
|
||||||
|
def set_status_led(self, color):
|
||||||
|
"""
|
||||||
|
Sets the state of the system LED
|
||||||
|
Args:
|
||||||
|
color: A string representing the color with which to set the
|
||||||
|
system LED
|
||||||
|
Returns:
|
||||||
|
bool: True if system LED state is set successfully, False if not
|
||||||
|
"""
|
||||||
|
if color not in list(self.SYSLED_COLOR_TO_REG.keys()):
|
||||||
|
return False
|
||||||
|
|
||||||
|
val = hwaccess.pci_get_value(PCI_RES, self.sysled_offset)
|
||||||
|
val = (val & 0xFFCF) | self.SYSLED_COLOR_TO_REG[color]
|
||||||
|
|
||||||
|
hwaccess.pci_set_value(PCI_RES, val, self.sysled_offset)
|
||||||
|
self.sys_ledcolor = color
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_sfp(self, index):
|
||||||
|
"""
|
||||||
|
Retrieves sfp represented by (0-based) index <index>
|
||||||
|
|
||||||
|
Args:
|
||||||
|
index: An integer, the index (0-based) of the sfp to retrieve.
|
||||||
|
The index should be the sequence of a physical port in a chassis,
|
||||||
|
starting from 0.
|
||||||
|
For example, 0 for Ethernet0, 1 for Ethernet4 and so on.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An object dervied from SfpBase representing the specified sfp
|
||||||
|
"""
|
||||||
|
sfp = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
# The 'index' is 1-based
|
||||||
|
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 get_name(self):
|
||||||
|
"""
|
||||||
|
Retrieves the name of the chassis
|
||||||
|
Returns:
|
||||||
|
string: The name of the chassis
|
||||||
|
"""
|
||||||
|
return self._eeprom.modelstr()
|
||||||
|
|
||||||
|
def get_presence(self):
|
||||||
|
"""
|
||||||
|
Retrieves the presence of the chassis
|
||||||
|
Returns:
|
||||||
|
bool: True if chassis is present, False if not
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_model(self):
|
||||||
|
"""
|
||||||
|
Retrieves the model number (or part number) of the chassis
|
||||||
|
Returns:
|
||||||
|
string: Model/part number of chassis
|
||||||
|
"""
|
||||||
|
return self._eeprom.part_number_str()
|
||||||
|
|
||||||
|
def get_serial(self):
|
||||||
|
"""
|
||||||
|
Retrieves the serial number of the chassis (Service tag)
|
||||||
|
Returns:
|
||||||
|
string: Serial number of chassis
|
||||||
|
"""
|
||||||
|
return self._eeprom.serial_str()
|
||||||
|
|
||||||
|
def get_status(self):
|
||||||
|
"""
|
||||||
|
Retrieves the operational status of the chassis
|
||||||
|
Returns:
|
||||||
|
bool: A boolean value, True if chassis is operating properly
|
||||||
|
False if not
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_base_mac(self):
|
||||||
|
"""
|
||||||
|
Retrieves the base MAC address for the chassis
|
||||||
|
Returns:
|
||||||
|
A string containing the MAC address in the format
|
||||||
|
'XX:XX:XX:XX:XX:XX'
|
||||||
|
"""
|
||||||
|
return self._eeprom.base_mac_addr()
|
||||||
|
|
||||||
|
def get_serial_number(self):
|
||||||
|
"""
|
||||||
|
Retrieves the hardware serial number for the chassis
|
||||||
|
Returns:
|
||||||
|
A string containing the hardware serial number for this chassis.
|
||||||
|
"""
|
||||||
|
return self._eeprom.serial_number_str()
|
||||||
|
|
||||||
|
def get_revision(self):
|
||||||
|
"""
|
||||||
|
Retrieves the hardware revision of the device
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
string: Revision value of device
|
||||||
|
"""
|
||||||
|
return self._eeprom.revision_str()
|
||||||
|
|
||||||
|
def get_system_eeprom_info(self):
|
||||||
|
"""
|
||||||
|
Retrieves the full content of system EEPROM information for the chassis
|
||||||
|
Returns:
|
||||||
|
A dictionary where keys are the type code defined in
|
||||||
|
OCP ONIE TlvInfo EEPROM format and values are their corresponding
|
||||||
|
values.
|
||||||
|
"""
|
||||||
|
return self._eeprom.system_eeprom_info()
|
||||||
|
|
||||||
|
def get_eeprom(self):
|
||||||
|
"""
|
||||||
|
Retrieves the Sys Eeprom instance for the chassis.
|
||||||
|
Returns :
|
||||||
|
The instance of the Sys Eeprom
|
||||||
|
"""
|
||||||
|
return self._eeprom
|
||||||
|
|
||||||
|
def get_num_fans(self):
|
||||||
|
"""
|
||||||
|
Retrives the number of Fans on the chassis.
|
||||||
|
Returns :
|
||||||
|
An integer represents the number of Fans on the chassis.
|
||||||
|
"""
|
||||||
|
return self._num_fans
|
||||||
|
|
||||||
|
def get_num_sfps(self):
|
||||||
|
"""
|
||||||
|
Retrives the numnber of Media on the chassis.
|
||||||
|
Returns:
|
||||||
|
An integer represences the number of SFPs on the chassis.
|
||||||
|
"""
|
||||||
|
return self._num_sfps
|
||||||
|
|
||||||
|
def get_reboot_cause(self):
|
||||||
|
"""
|
||||||
|
Retrieves the cause of the previous reboot
|
||||||
|
Returns:
|
||||||
|
A tuple (string, string) where the first element is a string
|
||||||
|
containing the cause of the previous reboot. This string must be
|
||||||
|
one of the predefined strings in this class. If the first string
|
||||||
|
is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used
|
||||||
|
to pass a description of the reboot cause.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
with open(REBOOT_CAUSE_PATH) as filed:
|
||||||
|
reboot_cause = int(filed.read(), 16)
|
||||||
|
except EnvironmentError:
|
||||||
|
return (self.REBOOT_CAUSE_NON_HARDWARE, None)
|
||||||
|
|
||||||
|
if reboot_cause & 0x1:
|
||||||
|
retval = (self.REBOOT_CAUSE_POWER_LOSS, None)
|
||||||
|
elif reboot_cause & 0x2:
|
||||||
|
retval = (self.REBOOT_CAUSE_NON_HARDWARE, None)
|
||||||
|
elif reboot_cause & 0x4:
|
||||||
|
retval = (self.REBOOT_CAUSE_HARDWARE_OTHER, "PSU Shutdown")
|
||||||
|
elif reboot_cause & 0x8:
|
||||||
|
retval = (self.REBOOT_CAUSE_THERMAL_OVERLOAD_CPU, None)
|
||||||
|
elif reboot_cause & 0x10:
|
||||||
|
retval = (self.REBOOT_CAUSE_WATCHDOG, None)
|
||||||
|
elif reboot_cause & 0x20:
|
||||||
|
retval = (self.REBOOT_CAUSE_HARDWARE_OTHER, "BMC Shutdown")
|
||||||
|
elif reboot_cause & 0x40:
|
||||||
|
retval = (self.REBOOT_CAUSE_HARDWARE_OTHER, "Hot-Swap Shutdown")
|
||||||
|
elif reboot_cause & 0x80:
|
||||||
|
retval = (self.REBOOT_CAUSE_HARDWARE_OTHER, "Reset Button Shutdown")
|
||||||
|
elif reboot_cause & 0x100:
|
||||||
|
retval = (self.REBOOT_CAUSE_HARDWARE_OTHER, "Reset Button Cold Reboot")
|
||||||
|
else:
|
||||||
|
retval = (self.REBOOT_CAUSE_NON_HARDWARE, None)
|
||||||
|
return retval
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_qualified_media_list():
|
||||||
|
""" Returns Dell Qualified Media List """
|
||||||
|
return MEDIA_PART_NUM_LIST
|
||||||
|
|
||||||
|
def set_locator_led(self, color):
|
||||||
|
"""
|
||||||
|
Sets the state of the Chassis Locator LED
|
||||||
|
|
||||||
|
Args:
|
||||||
|
color: A string representing the color with which to set the Chassis Locator LED
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if the Chassis Locator LED state is set successfully, False if not
|
||||||
|
|
||||||
|
"""
|
||||||
|
val = hwaccess.pci_get_value(PCI_RES, SYSTEM_LED_REG)
|
||||||
|
if self.LOCATOR_LED_ON == color:
|
||||||
|
val = int(val) | SYSTEM_BEACON_LED_SET
|
||||||
|
elif self.LOCATOR_LED_OFF == color:
|
||||||
|
val = int(val) & SYSTEM_BEACON_LED_CLEAR
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
hwaccess.pci_set_value(PCI_RES, val, SYSTEM_LED_REG)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_locator_led(self):
|
||||||
|
"""
|
||||||
|
Gets the state of the Chassis Locator LED
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
LOCATOR_LED_ON or LOCATOR_LED_OFF
|
||||||
|
"""
|
||||||
|
val = hwaccess.pci_get_value(PCI_RES, SYSTEM_LED_REG)
|
||||||
|
val = int(val) & SYSTEM_BEACON_LED_SET
|
||||||
|
if not val:
|
||||||
|
return self.LOCATOR_LED_OFF
|
||||||
|
else:
|
||||||
|
return self.LOCATOR_LED_ON
|
||||||
|
|
||||||
|
def get_position_in_parent(self):
|
||||||
|
"""
|
||||||
|
Retrieves 1-based relative physical position in parent device.
|
||||||
|
Returns:
|
||||||
|
integer: The 1-based relative physical position in parent
|
||||||
|
device or -1 if cannot determine the position
|
||||||
|
"""
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def is_replaceable(self):
|
||||||
|
"""
|
||||||
|
Indicate whether Chassis is replaceable.
|
||||||
|
Returns:
|
||||||
|
bool: True if it is replaceable.
|
||||||
|
"""
|
||||||
|
return False
|
@ -0,0 +1,428 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# DELLEMC Z9432F
|
||||||
|
#
|
||||||
|
# Module contains an implementation of SONiC Platform Base API and
|
||||||
|
# provides the Components' (e.g., BIOS, CPLD, FPGA, BMC etc.) available in
|
||||||
|
# the platform
|
||||||
|
#
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
try:
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import tarfile
|
||||||
|
import tempfile
|
||||||
|
from sonic_platform_base.component_base import ComponentBase
|
||||||
|
import sonic_platform.hwaccess as hwaccess
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
def get_bios_version():
|
||||||
|
return subprocess.check_output(
|
||||||
|
['dmidecode', '-s', 'bios-version']).decode('utf-8').strip()
|
||||||
|
|
||||||
|
def get_fpga_version():
|
||||||
|
val = hwaccess.pci_get_value('/sys/bus/pci/devices/0000:04:00.0/resource0', 0)
|
||||||
|
return '{}.{}'.format((val >> 8) & 0xff, val & 0xff)
|
||||||
|
|
||||||
|
def get_bmc_version():
|
||||||
|
return subprocess.check_output(
|
||||||
|
['cat', '/sys/class/ipmi/ipmi0/device/bmc/firmware_revision']
|
||||||
|
).decode('utf-8').strip()
|
||||||
|
|
||||||
|
def get_cpld_version(bus, i2caddr):
|
||||||
|
return '{}.{}'.format(hwaccess.i2c_get(bus, i2caddr, 1),
|
||||||
|
hwaccess.i2c_get(bus, i2caddr, 0))
|
||||||
|
|
||||||
|
def get_cpld0_version():
|
||||||
|
return get_cpld_version(601, 0x31)
|
||||||
|
|
||||||
|
def get_cpld1_version():
|
||||||
|
return get_cpld_version(600, 0x30)
|
||||||
|
|
||||||
|
def get_cpld2_version():
|
||||||
|
return get_cpld_version(600, 0x31)
|
||||||
|
|
||||||
|
def get_ssd_version():
|
||||||
|
val = 'NA'
|
||||||
|
try:
|
||||||
|
ssd_ver = subprocess.check_output(['ssdutil', '-v'],
|
||||||
|
stderr=subprocess.STDOUT, text=True)
|
||||||
|
except (FileNotFoundError, subprocess.CalledProcessError):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
version = re.search(r'Firmware\s*:(.*)',ssd_ver)
|
||||||
|
if version:
|
||||||
|
val = version.group(1).strip()
|
||||||
|
|
||||||
|
return val
|
||||||
|
|
||||||
|
def get_pciephy_version():
|
||||||
|
val = 'NA'
|
||||||
|
try:
|
||||||
|
pcie_ver = subprocess.check_output(['bcmcmd', 'pciephy fw version'],
|
||||||
|
stderr=subprocess.STDOUT, text=True)
|
||||||
|
except (FileNotFoundError, subprocess.CalledProcessError):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
version = re.search(r'PCIe FW loader version:\s(.*)', pcie_ver)
|
||||||
|
if version:
|
||||||
|
val = version.group(1).strip()
|
||||||
|
|
||||||
|
return val
|
||||||
|
|
||||||
|
|
||||||
|
class Component(ComponentBase):
|
||||||
|
"""DellEMC Platform-specific Component class"""
|
||||||
|
|
||||||
|
CHASSIS_COMPONENTS = [
|
||||||
|
['BIOS',
|
||||||
|
'Performs initialization of hardware components during booting',
|
||||||
|
get_bios_version
|
||||||
|
],
|
||||||
|
|
||||||
|
['FPGA',
|
||||||
|
'Used for managing the system LEDs',
|
||||||
|
get_fpga_version
|
||||||
|
],
|
||||||
|
|
||||||
|
['BMC',
|
||||||
|
'Platform management controller for on-board temperature monitoring,in-chassis power, Fan and LED control',
|
||||||
|
get_bmc_version
|
||||||
|
],
|
||||||
|
|
||||||
|
['Baseboard CPLD',
|
||||||
|
'Used for managing the CPU power sequence and CPU states',
|
||||||
|
get_cpld0_version
|
||||||
|
],
|
||||||
|
|
||||||
|
['Switch CPLD 1',
|
||||||
|
'Used for managing QSFP-DD/QSFP28/SFP port transceivers ',
|
||||||
|
get_cpld1_version
|
||||||
|
],
|
||||||
|
|
||||||
|
['Switch CPLD 2',
|
||||||
|
'Used for managing QSFP-DD/QSFP28/SFP port transceivers',
|
||||||
|
get_cpld2_version
|
||||||
|
],
|
||||||
|
|
||||||
|
['SSD',
|
||||||
|
'Solid State Drive that stores data persistently',
|
||||||
|
get_ssd_version
|
||||||
|
],
|
||||||
|
|
||||||
|
['PCIe',
|
||||||
|
'ASIC PCIe firmware',
|
||||||
|
get_pciephy_version
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self, component_index=0):
|
||||||
|
ComponentBase.__init__(self)
|
||||||
|
self.index = component_index
|
||||||
|
self.name = self.CHASSIS_COMPONENTS[self.index][0]
|
||||||
|
self.description = self.CHASSIS_COMPONENTS[self.index][1]
|
||||||
|
self.version = self.CHASSIS_COMPONENTS[self.index][2]()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_available_firmware_version(image_path):
|
||||||
|
if not os.path.isfile(image_path):
|
||||||
|
return False, "ERROR: File not found"
|
||||||
|
|
||||||
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||||||
|
cmd = "sed -e '1,/^exit_marker$/d' {} | tar -x -C {} installer/onie-update.tar.xz".format(image_path, tmpdir)
|
||||||
|
try:
|
||||||
|
subprocess.check_call(cmd, stdout=subprocess.DEVNULL,
|
||||||
|
stderr=subprocess.DEVNULL, shell=True)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
return False, "ERROR: Unable to extract firmware updater"
|
||||||
|
|
||||||
|
try:
|
||||||
|
updater = tarfile.open(os.path.join(tmpdir, "installer/onie-update.tar.xz"), "r")
|
||||||
|
except tarfile.ReadError:
|
||||||
|
return False, "ERROR: Unable to extract firmware updater"
|
||||||
|
|
||||||
|
try:
|
||||||
|
ver_info_fd = updater.extractfile("firmware/fw-component-version")
|
||||||
|
except KeyError:
|
||||||
|
updater.close()
|
||||||
|
return False, "ERROR: Version info not available"
|
||||||
|
|
||||||
|
ver_info = json.load(ver_info_fd)
|
||||||
|
ver_info_fd.close()
|
||||||
|
updater.close()
|
||||||
|
|
||||||
|
ver_info = ver_info.get("x86_64-dellemc_z9432f_c3758-r0")
|
||||||
|
if ver_info:
|
||||||
|
return True, ver_info
|
||||||
|
else:
|
||||||
|
return False, "ERROR: Version info not available"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _stage_firmware_package(image_path):
|
||||||
|
stage_msg = None
|
||||||
|
cmd = "onie_stage_fwpkg -a {}".format(image_path)
|
||||||
|
try:
|
||||||
|
subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT, text=True)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
if e.returncode != 2:
|
||||||
|
return False, e.output.strip()
|
||||||
|
else:
|
||||||
|
stage_msg = e.output.strip()
|
||||||
|
|
||||||
|
cmd = "onie_mode_set -o update"
|
||||||
|
try:
|
||||||
|
subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT, text=True)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
return False, e.output.strip()
|
||||||
|
|
||||||
|
if stage_msg:
|
||||||
|
return True, stage_msg
|
||||||
|
else:
|
||||||
|
return True, "INFO: Firmware upgrade staged"
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
"""
|
||||||
|
Retrieves the name of the component
|
||||||
|
Returns:
|
||||||
|
A string containing the name of the component
|
||||||
|
"""
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
def get_description(self):
|
||||||
|
"""
|
||||||
|
Retrieves the description of the component
|
||||||
|
Returns:
|
||||||
|
A string containing the description of the component
|
||||||
|
"""
|
||||||
|
return self.description
|
||||||
|
|
||||||
|
def get_firmware_version(self):
|
||||||
|
"""
|
||||||
|
Retrieves the firmware version of the component
|
||||||
|
Returns:
|
||||||
|
A string containing the firmware version of the component
|
||||||
|
"""
|
||||||
|
return self.version
|
||||||
|
|
||||||
|
def get_presence(self):
|
||||||
|
"""
|
||||||
|
Retrieves the presence of the component
|
||||||
|
Returns:
|
||||||
|
bool: True if present, False if not
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_model(self):
|
||||||
|
"""
|
||||||
|
Retrieves the part number of the component
|
||||||
|
Returns:
|
||||||
|
string: Part number of component
|
||||||
|
"""
|
||||||
|
return 'NA'
|
||||||
|
|
||||||
|
def get_serial(self):
|
||||||
|
"""
|
||||||
|
Retrieves the serial number of the component
|
||||||
|
Returns:
|
||||||
|
string: Serial number of component
|
||||||
|
"""
|
||||||
|
return 'NA'
|
||||||
|
|
||||||
|
def get_status(self):
|
||||||
|
"""
|
||||||
|
Retrieves the operational status of the component
|
||||||
|
Returns:
|
||||||
|
bool: True if component is operating properly, False if not
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_position_in_parent(self):
|
||||||
|
"""
|
||||||
|
Retrieves 1-based relative physical position in parent device.
|
||||||
|
Returns:
|
||||||
|
integer: The 1-based relative physical position in parent
|
||||||
|
device or -1 if cannot determine the position
|
||||||
|
"""
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def is_replaceable(self):
|
||||||
|
"""
|
||||||
|
Indicate whether component is replaceable.
|
||||||
|
Returns:
|
||||||
|
bool: True if it is replaceable.
|
||||||
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_available_firmware_version(self, image_path):
|
||||||
|
"""
|
||||||
|
Retrieves the available firmware version of the component
|
||||||
|
|
||||||
|
Note: the firmware version will be read from image
|
||||||
|
|
||||||
|
Args:
|
||||||
|
image_path: A string, path to firmware image
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A string containing the available firmware version of the component
|
||||||
|
"""
|
||||||
|
avail_ver = None
|
||||||
|
valid, version = self._get_available_firmware_version(image_path)
|
||||||
|
if valid:
|
||||||
|
avail_ver = version.get(self.name)
|
||||||
|
if avail_ver:
|
||||||
|
avail_ver = avail_ver.get("version")
|
||||||
|
else:
|
||||||
|
print(version)
|
||||||
|
|
||||||
|
return avail_ver if avail_ver else "NA"
|
||||||
|
|
||||||
|
def get_firmware_update_notification(self, image_path):
|
||||||
|
"""
|
||||||
|
Retrieves a notification on what should be done in order to complete
|
||||||
|
the component firmware update
|
||||||
|
|
||||||
|
Args:
|
||||||
|
image_path: A string, path to firmware image
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A string containing the component firmware update notification if required.
|
||||||
|
By default 'None' value will be used, which indicates that no actions are required
|
||||||
|
"""
|
||||||
|
valid, version = self._get_available_firmware_version(image_path)
|
||||||
|
if valid:
|
||||||
|
avail_ver = version.get(self.name)
|
||||||
|
if avail_ver:
|
||||||
|
avail_ver = avail_ver.get("version")
|
||||||
|
if avail_ver and avail_ver != self.get_firmware_version():
|
||||||
|
return "Cold reboot is required to perform firmware upgrade"
|
||||||
|
else:
|
||||||
|
print(version)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def install_firmware(self, image_path):
|
||||||
|
"""
|
||||||
|
Installs firmware to the component
|
||||||
|
|
||||||
|
This API performs firmware installation only: this may/may not be the same as firmware update.
|
||||||
|
In case platform component requires some extra steps (apart from calling Low Level Utility)
|
||||||
|
to load the installed firmware (e.g, reboot, power cycle, etc.) - this must be done manually by user
|
||||||
|
|
||||||
|
Note: in case immediate actions are required to complete the component firmware update
|
||||||
|
(e.g., reboot, power cycle, etc.) - will be done automatically by API and no return value provided
|
||||||
|
|
||||||
|
Args:
|
||||||
|
image_path: A string, path to firmware image
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A boolean, True if install was successful, False if not
|
||||||
|
"""
|
||||||
|
valid, version = self._get_available_firmware_version(image_path)
|
||||||
|
if valid:
|
||||||
|
avail_ver = version.get(self.name)
|
||||||
|
if avail_ver:
|
||||||
|
avail_ver = avail_ver.get("version")
|
||||||
|
if avail_ver and avail_ver != self.get_firmware_version():
|
||||||
|
status, msg = self._stage_firmware_package(image_path)
|
||||||
|
print(msg)
|
||||||
|
if status:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
print("INFO: Firmware version up-to-date")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(version)
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def update_firmware(self, image_path):
|
||||||
|
"""
|
||||||
|
Updates firmware of the component
|
||||||
|
|
||||||
|
This API performs firmware update: it assumes firmware installation and loading in a single call.
|
||||||
|
In case platform component requires some extra steps (apart from calling Low Level Utility)
|
||||||
|
to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically by API
|
||||||
|
|
||||||
|
Args:
|
||||||
|
image_path: A string, path to firmware image
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
RuntimeError: update failed
|
||||||
|
"""
|
||||||
|
valid, version = self._get_available_firmware_version(image_path)
|
||||||
|
if valid:
|
||||||
|
avail_ver = version.get(self.name)
|
||||||
|
if avail_ver:
|
||||||
|
avail_ver = avail_ver.get("version")
|
||||||
|
if avail_ver and avail_ver != self.get_firmware_version():
|
||||||
|
status, msg = self._stage_firmware_package(image_path)
|
||||||
|
if status:
|
||||||
|
print(msg)
|
||||||
|
subprocess.call("reboot")
|
||||||
|
else:
|
||||||
|
raise RuntimeError(msg)
|
||||||
|
|
||||||
|
print("INFO: Firmware version up-to-date")
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
raise RuntimeError(version)
|
||||||
|
|
||||||
|
def auto_update_firmware(self, image_path, boot_type):
|
||||||
|
"""
|
||||||
|
Updates firmware of the component
|
||||||
|
|
||||||
|
This API performs firmware update automatically based on boot_type: it assumes firmware installation
|
||||||
|
and/or creating a loading task during the reboot, if needed, in a single call.
|
||||||
|
In case platform component requires some extra steps (apart from calling Low Level Utility)
|
||||||
|
to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically during the reboot.
|
||||||
|
The loading task will be created by API.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
image_path: A string, path to firmware image
|
||||||
|
boot_type: A string, reboot type following the upgrade
|
||||||
|
- none/fast/warm/cold
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Output: A return code
|
||||||
|
return_code: An integer number, status of component firmware auto-update
|
||||||
|
- return code of a positive number indicates successful auto-update
|
||||||
|
- status_installed = 1
|
||||||
|
- status_updated = 2
|
||||||
|
- status_scheduled = 3
|
||||||
|
- return_code of a negative number indicates failed auto-update
|
||||||
|
- status_err_boot_type = -1
|
||||||
|
- status_err_image = -2
|
||||||
|
- status_err_unknown = -3
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
RuntimeError: auto-update failure cause
|
||||||
|
"""
|
||||||
|
valid, version = self._get_available_firmware_version(image_path)
|
||||||
|
if valid:
|
||||||
|
avail_ver = version.get(self.name)
|
||||||
|
if avail_ver:
|
||||||
|
avail_ver = avail_ver.get("version")
|
||||||
|
if avail_ver and avail_ver != self.get_firmware_version():
|
||||||
|
if boot_type != "cold":
|
||||||
|
return -1
|
||||||
|
|
||||||
|
status, msg = self._stage_firmware_package(image_path)
|
||||||
|
if status:
|
||||||
|
print(msg)
|
||||||
|
return 3
|
||||||
|
else:
|
||||||
|
raise RuntimeError(msg)
|
||||||
|
|
||||||
|
print("INFO: Firmware version up-to-date")
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
print(version)
|
||||||
|
return -2
|
@ -0,0 +1,133 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
# DellEmc Z9432F
|
||||||
|
#
|
||||||
|
# Platform and model specific eeprom subclass, inherits from the base class,
|
||||||
|
# and provides the followings:
|
||||||
|
# - the eeprom format definition
|
||||||
|
# - specific encoder/decoder if there is special need
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
try:
|
||||||
|
import os.path
|
||||||
|
from sonic_eeprom import eeprom_tlvinfo
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class Eeprom(eeprom_tlvinfo.TlvInfoDecoder):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.eeprom_path = None
|
||||||
|
for b in (0, 1):
|
||||||
|
f = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom'.format(b)
|
||||||
|
if os.path.exists(f):
|
||||||
|
self.eeprom_path = f
|
||||||
|
break
|
||||||
|
if self.eeprom_path is None:
|
||||||
|
return
|
||||||
|
super(Eeprom, self).__init__(self.eeprom_path, 0, '', True)
|
||||||
|
self.eeprom_tlv_dict = dict()
|
||||||
|
try:
|
||||||
|
self.eeprom_data = self.read_eeprom()
|
||||||
|
except:
|
||||||
|
self.eeprom_data = "N/A"
|
||||||
|
raise RuntimeError("Eeprom is not Programmed")
|
||||||
|
else:
|
||||||
|
eeprom = self.eeprom_data
|
||||||
|
|
||||||
|
if not self.is_valid_tlvinfo_header(eeprom):
|
||||||
|
return
|
||||||
|
|
||||||
|
total_length = (eeprom[9] << 8) | eeprom[10]
|
||||||
|
tlv_index = self._TLV_INFO_HDR_LEN
|
||||||
|
tlv_end = self._TLV_INFO_HDR_LEN + total_length
|
||||||
|
|
||||||
|
while (tlv_index + 2) < len(eeprom) and tlv_index < tlv_end:
|
||||||
|
if not self.is_valid_tlv(eeprom[tlv_index:]):
|
||||||
|
break
|
||||||
|
|
||||||
|
tlv = eeprom[tlv_index:tlv_index + 2
|
||||||
|
+ eeprom[tlv_index + 1]]
|
||||||
|
code = "0x%02X" % tlv[0]
|
||||||
|
name, value = self.decoder(None, tlv)
|
||||||
|
|
||||||
|
self.eeprom_tlv_dict[code] = value
|
||||||
|
if eeprom[tlv_index] == self._TLV_CODE_CRC_32:
|
||||||
|
break
|
||||||
|
|
||||||
|
tlv_index += eeprom[tlv_index+1] + 2
|
||||||
|
|
||||||
|
def serial_number_str(self):
|
||||||
|
"""
|
||||||
|
Returns the serial number
|
||||||
|
"""
|
||||||
|
(is_valid, results) = self.get_tlv_field(
|
||||||
|
self.eeprom_data, self._TLV_CODE_SERIAL_NUMBER)
|
||||||
|
if not is_valid:
|
||||||
|
return "N/A"
|
||||||
|
return results[2].decode('ascii')
|
||||||
|
|
||||||
|
def base_mac_addr(self):
|
||||||
|
"""
|
||||||
|
Returns the base mac address found in the system EEPROM
|
||||||
|
"""
|
||||||
|
(is_valid, t) = self.get_tlv_field(
|
||||||
|
self.eeprom_data, self._TLV_CODE_MAC_BASE)
|
||||||
|
if not is_valid or t[1] != 6:
|
||||||
|
return super(TlvInfoDecoder, self).switchaddrstr(e)
|
||||||
|
|
||||||
|
return ":".join(["{:02x}".format(T) for T in t[2]]).upper()
|
||||||
|
|
||||||
|
def modelstr(self):
|
||||||
|
"""
|
||||||
|
Returns the Model name
|
||||||
|
"""
|
||||||
|
(is_valid, results) = self.get_tlv_field(
|
||||||
|
self.eeprom_data, self._TLV_CODE_PRODUCT_NAME)
|
||||||
|
if not is_valid:
|
||||||
|
return "N/A"
|
||||||
|
|
||||||
|
return results[2].decode('ascii')
|
||||||
|
|
||||||
|
def part_number_str(self):
|
||||||
|
"""
|
||||||
|
Returns the part number
|
||||||
|
"""
|
||||||
|
(is_valid, results) = self.get_tlv_field(
|
||||||
|
self.eeprom_data, self._TLV_CODE_PART_NUMBER)
|
||||||
|
if not is_valid:
|
||||||
|
return "N/A"
|
||||||
|
|
||||||
|
return results[2].decode('ascii')
|
||||||
|
|
||||||
|
def serial_str(self):
|
||||||
|
"""
|
||||||
|
Returns the servicetag number
|
||||||
|
"""
|
||||||
|
(is_valid, results) = self.get_tlv_field(
|
||||||
|
self.eeprom_data, self._TLV_CODE_SERVICE_TAG)
|
||||||
|
if not is_valid:
|
||||||
|
return "N/A"
|
||||||
|
|
||||||
|
return results[2].decode('ascii')
|
||||||
|
|
||||||
|
def revision_str(self):
|
||||||
|
"""
|
||||||
|
Returns the device revision
|
||||||
|
"""
|
||||||
|
(is_valid, results) = self.get_tlv_field(
|
||||||
|
self.eeprom_data, self._TLV_CODE_LABEL_REVISION)
|
||||||
|
if not is_valid:
|
||||||
|
return "N/A"
|
||||||
|
|
||||||
|
return results[2].decode('ascii')
|
||||||
|
|
||||||
|
def system_eeprom_info(self):
|
||||||
|
"""
|
||||||
|
Returns a dictionary, where keys are the type code defined in
|
||||||
|
ONIE EEPROM format and values are their corresponding values
|
||||||
|
found in the system EEPROM.
|
||||||
|
"""
|
||||||
|
return self.eeprom_tlv_dict
|
@ -0,0 +1,229 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# DellEMC Z9432F
|
||||||
|
#
|
||||||
|
# Module contains an implementation of SONiC Platform Base API and
|
||||||
|
# provides the Fans' information which are available in the platform.
|
||||||
|
#
|
||||||
|
########################################################################
|
||||||
|
try:
|
||||||
|
from sonic_platform_base.fan_base import FanBase
|
||||||
|
from sonic_platform.ipmihelper import IpmiSensor, IpmiFru
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
FAN1_MAX_SPEED_OFFSET = 71
|
||||||
|
FAN2_MAX_SPEED_OFFSET = 73
|
||||||
|
PSU_FAN_MAX_SPEED_OFFSET = 50
|
||||||
|
FAN_DIRECTION_OFFSET = 69
|
||||||
|
PSU_FAN_DIRECTION_OFFSET = 47
|
||||||
|
|
||||||
|
class Fan(FanBase):
|
||||||
|
"""DellEMC Platform-specific Fan class"""
|
||||||
|
# { FAN-ID: { Sensor-Name: Sensor-ID } }
|
||||||
|
FAN_SENSOR_MAPPING = {1: {"Prsnt": 0x57, "State": 0x20, "Speed": 0x1c},
|
||||||
|
2: {"Prsnt": 0x57, "State": 0x21, "Speed": 0x1d},
|
||||||
|
3: {"Prsnt": 0x56, "State": 0x22, "Speed": 0x1a},
|
||||||
|
4: {"Prsnt": 0x56, "State": 0x23, "Speed": 0x1b},
|
||||||
|
5: {"Prsnt": 0x55, "State": 0x24, "Speed": 0x18},
|
||||||
|
6: {"Prsnt": 0x55, "State": 0x25, "Speed": 0x19},
|
||||||
|
7: {"Prsnt": 0x54, "State": 0x26, "Speed": 0x16},
|
||||||
|
8: {"Prsnt": 0x54, "State": 0x27, "Speed": 0x17},
|
||||||
|
9: {"Prsnt": 0x53, "State": 0x28, "Speed": 0x14},
|
||||||
|
10: {"Prsnt": 0x53, "State": 0x29, "Speed": 0x15},
|
||||||
|
11: {"Prsnt": 0x52, "State": 0x2a, "Speed": 0x12},
|
||||||
|
12: {"Prsnt": 0x52, "State": 0x2b, "Speed": 0x13},
|
||||||
|
13: {"Prsnt": 0x51, "State": 0x2c, "Speed": 0x10},
|
||||||
|
14: {"Prsnt": 0x51, "State": 0x2d, "Speed": 0x11}}
|
||||||
|
PSU_FAN_SENSOR_MAPPING = {1: {"State": 0x40, "Speed": 0x45},
|
||||||
|
2: {"State": 0x30, "Speed": 0x35}}
|
||||||
|
|
||||||
|
# { FANTRAY-ID: FRU-ID }
|
||||||
|
FAN_FRU_MAPPING = {1: 3, 2: 4, 3: 5, 4: 6, 5: 7, 6: 8, 7: 9}
|
||||||
|
PSU_FRU_MAPPING = {1: 1, 2: 2}
|
||||||
|
|
||||||
|
def __init__(self, fantray_index=1, fan_index=1, psu_fan=False, dependency=None):
|
||||||
|
FanBase.__init__(self)
|
||||||
|
self.is_psu_fan = psu_fan
|
||||||
|
if not self.is_psu_fan:
|
||||||
|
# API index is starting from 0, DellEMC platform index is
|
||||||
|
# starting from 1
|
||||||
|
self.fantrayindex = fantray_index + 1
|
||||||
|
self.fanindex = fan_index + 1
|
||||||
|
self.index = (self.fantrayindex - 1) * 2 + self.fanindex
|
||||||
|
self.prsnt_sensor = IpmiSensor(self.FAN_SENSOR_MAPPING[self.index]["Prsnt"],
|
||||||
|
is_discrete=True)
|
||||||
|
self.state_sensor = IpmiSensor(self.FAN_SENSOR_MAPPING[self.index]["State"],
|
||||||
|
is_discrete=True)
|
||||||
|
self.speed_sensor = IpmiSensor(self.FAN_SENSOR_MAPPING[self.index]["Speed"])
|
||||||
|
self.fru = IpmiFru(self.FAN_FRU_MAPPING[self.fantrayindex])
|
||||||
|
if self.fanindex == 1:
|
||||||
|
self.max_speed_offset = FAN1_MAX_SPEED_OFFSET
|
||||||
|
else:
|
||||||
|
self.max_speed_offset = FAN2_MAX_SPEED_OFFSET
|
||||||
|
self.fan_direction_offset = FAN_DIRECTION_OFFSET
|
||||||
|
else:
|
||||||
|
self.dependency = dependency
|
||||||
|
self.fanindex = fan_index
|
||||||
|
self.state_sensor = IpmiSensor(self.PSU_FAN_SENSOR_MAPPING[self.fanindex]["State"],
|
||||||
|
is_discrete=True)
|
||||||
|
self.speed_sensor = IpmiSensor(self.PSU_FAN_SENSOR_MAPPING[self.fanindex]["Speed"])
|
||||||
|
self.fru = IpmiFru(self.PSU_FRU_MAPPING[self.fanindex])
|
||||||
|
self.max_speed_offset = PSU_FAN_MAX_SPEED_OFFSET
|
||||||
|
self.fan_direction_offset = PSU_FAN_DIRECTION_OFFSET
|
||||||
|
#self.fan_dir_raw_cmd = "0x3a 0x0a {}".format(7+(fan_index-1))
|
||||||
|
self.max_speed = 18000
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
"""
|
||||||
|
Retrieves the name of the device
|
||||||
|
Returns:
|
||||||
|
String: The name of the device
|
||||||
|
"""
|
||||||
|
if self.is_psu_fan:
|
||||||
|
return "PSU{} Fan".format(self.fanindex)
|
||||||
|
else:
|
||||||
|
return "FanTray{}-Fan{}".format(self.fantrayindex, self.fanindex)
|
||||||
|
|
||||||
|
def get_model(self):
|
||||||
|
"""
|
||||||
|
Retrieves the part number of the FAN
|
||||||
|
Returns:
|
||||||
|
String: Part number of FAN
|
||||||
|
"""
|
||||||
|
if self.is_psu_fan:
|
||||||
|
return 'NA'
|
||||||
|
else:
|
||||||
|
return self.fru.get_board_part_number()
|
||||||
|
|
||||||
|
def get_serial(self):
|
||||||
|
"""
|
||||||
|
Retrieves the serial number of the FAN
|
||||||
|
Returns:
|
||||||
|
String: Serial number of FAN
|
||||||
|
"""
|
||||||
|
if self.is_psu_fan:
|
||||||
|
return 'NA'
|
||||||
|
else:
|
||||||
|
return self.fru.get_board_serial()
|
||||||
|
|
||||||
|
def get_presence(self):
|
||||||
|
"""
|
||||||
|
Retrieves the presence of the FAN
|
||||||
|
Returns:
|
||||||
|
bool: True if fan is present, False if not
|
||||||
|
"""
|
||||||
|
presence = False
|
||||||
|
if self.is_psu_fan:
|
||||||
|
return self.dependency.get_presence()
|
||||||
|
else:
|
||||||
|
is_valid, state = self.prsnt_sensor.get_reading()
|
||||||
|
if is_valid:
|
||||||
|
if state & 0b1:
|
||||||
|
presence = True
|
||||||
|
return presence
|
||||||
|
|
||||||
|
def get_status(self):
|
||||||
|
"""
|
||||||
|
Retrieves the operational status of the FAN
|
||||||
|
Returns:
|
||||||
|
bool: True if FAN is operating properly, False if not
|
||||||
|
"""
|
||||||
|
status = False
|
||||||
|
is_valid, state = self.state_sensor.get_reading()
|
||||||
|
if is_valid:
|
||||||
|
if state <= 1:
|
||||||
|
status = True
|
||||||
|
return status
|
||||||
|
|
||||||
|
def get_direction(self):
|
||||||
|
"""
|
||||||
|
Retrieves the fan airfow direction
|
||||||
|
Returns:
|
||||||
|
A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST
|
||||||
|
depending on fan direction
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
In DellEMC platforms,
|
||||||
|
- Forward/Exhaust : Air flows from Port side to Fan side.
|
||||||
|
- Reverse/Intake : Air flows from Fan side to Port side.
|
||||||
|
"""
|
||||||
|
direction = [self.FAN_DIRECTION_EXHAUST, self.FAN_DIRECTION_INTAKE]
|
||||||
|
fan_status = self.get_status()
|
||||||
|
if not fan_status:
|
||||||
|
return None
|
||||||
|
is_valid, fan_direction = self.fru.get_fru_data(self.fan_direction_offset)
|
||||||
|
if is_valid:
|
||||||
|
return direction[fan_direction[0]]
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_speed(self):
|
||||||
|
"""
|
||||||
|
Retrieves the speed of the fan
|
||||||
|
Returns:
|
||||||
|
int: percentage of the max fan speed
|
||||||
|
"""
|
||||||
|
if self.max_speed == 0:
|
||||||
|
self.max_speed = self.fru.get_fru_data(self.max_speed_offset, 2)[1]
|
||||||
|
self.max_speed = self.max_speed[1] << 8 | self.max_speed[0]
|
||||||
|
is_valid, fan_speed = self.speed_sensor.get_reading()
|
||||||
|
if not is_valid or self.max_speed == 0:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
speed = (100 * fan_speed)//self.max_speed
|
||||||
|
return speed
|
||||||
|
|
||||||
|
def get_speed_rpm(self):
|
||||||
|
"""
|
||||||
|
Retrieves the speed of the fan
|
||||||
|
Returns:
|
||||||
|
int: percentage of the max fan speed
|
||||||
|
"""
|
||||||
|
is_valid, fan_speed = self.speed_sensor.get_reading()
|
||||||
|
return fan_speed if is_valid else None
|
||||||
|
|
||||||
|
def get_position_in_parent(self):
|
||||||
|
"""
|
||||||
|
Retrieves 1-based relative physical position in parent device.
|
||||||
|
Returns:
|
||||||
|
integer: The 1-based relative physical position in parent
|
||||||
|
device or -1 if cannot determine the position
|
||||||
|
"""
|
||||||
|
return self.fanindex
|
||||||
|
|
||||||
|
def is_replaceable(self):
|
||||||
|
"""
|
||||||
|
Indicate whether Fan is replaceable.
|
||||||
|
Returns:
|
||||||
|
bool: True if it is replaceable.
|
||||||
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_speed_tolerance(self):
|
||||||
|
"""
|
||||||
|
Retrieves the speed tolerance of the fan
|
||||||
|
Returns:
|
||||||
|
An integer, the percentage of variance from target speed which is
|
||||||
|
considered tolerable
|
||||||
|
"""
|
||||||
|
if self.get_presence():
|
||||||
|
# The tolerance value is fixed as 20% for all the DellEMC platforms
|
||||||
|
tolerance = 20
|
||||||
|
else:
|
||||||
|
tolerance = 0
|
||||||
|
|
||||||
|
return tolerance
|
||||||
|
|
||||||
|
def set_status_led(self, color):
|
||||||
|
"""
|
||||||
|
Set led to expected color
|
||||||
|
Args:
|
||||||
|
color: A string representing the color with which to set the
|
||||||
|
fan status LED
|
||||||
|
Returns:
|
||||||
|
bool: True if set success, False if fail.
|
||||||
|
"""
|
||||||
|
# Fan tray status LED controlled by HW
|
||||||
|
# Return True to avoid thermalctld alarm
|
||||||
|
return True
|
@ -0,0 +1,115 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# DellEMC Z9432F
|
||||||
|
#
|
||||||
|
# Module contains an implementation of SONiC Platform Base API and
|
||||||
|
# provides the Fan-Drawers' information available in the platform.
|
||||||
|
#
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_base.fan_drawer_base import FanDrawerBase
|
||||||
|
from sonic_platform.fan import Fan
|
||||||
|
from sonic_platform.ipmihelper import IpmiFru
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
Z9432F_FANS_PER_FANTRAY = 2
|
||||||
|
|
||||||
|
|
||||||
|
class FanDrawer(FanDrawerBase):
|
||||||
|
"""DellEMC Platform-specific Fan class"""
|
||||||
|
|
||||||
|
FAN_FRU_MAPPING = { 1: 6, 2: 7, 3: 8, 4: 9, 5: 10, 6: 11, 7: 12 }
|
||||||
|
def __init__(self, fantray_index):
|
||||||
|
|
||||||
|
FanDrawerBase.__init__(self)
|
||||||
|
# FanTray is 1-based in DellEMC platforms
|
||||||
|
self.fantrayindex = fantray_index + 1
|
||||||
|
for i in range(Z9432F_FANS_PER_FANTRAY):
|
||||||
|
self._fan_list.append(Fan(fantray_index, i))
|
||||||
|
self.fru = IpmiFru(self.FAN_FRU_MAPPING[self.fantrayindex])
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
"""
|
||||||
|
Retrieves the fan drawer name
|
||||||
|
Returns:
|
||||||
|
string: The name of the device
|
||||||
|
"""
|
||||||
|
return "FanTray{}".format(self.fantrayindex)
|
||||||
|
|
||||||
|
def get_presence(self):
|
||||||
|
"""
|
||||||
|
Retrieves the presence of the fan drawer
|
||||||
|
Returns:
|
||||||
|
bool: True if fan_tray is present, False if not
|
||||||
|
"""
|
||||||
|
return self.get_fan(0).get_presence()
|
||||||
|
|
||||||
|
def get_model(self):
|
||||||
|
"""
|
||||||
|
Retrieves the part number of the fan drawer
|
||||||
|
Returns:
|
||||||
|
string: Part number of fan drawer
|
||||||
|
"""
|
||||||
|
return self.fru.get_board_part_number()
|
||||||
|
|
||||||
|
def get_serial(self):
|
||||||
|
"""
|
||||||
|
Retrieves the serial number of the fan drawer
|
||||||
|
Returns:
|
||||||
|
string: Serial number of the fan drawer
|
||||||
|
"""
|
||||||
|
return self.fru.get_board_serial()
|
||||||
|
|
||||||
|
def get_status(self):
|
||||||
|
"""
|
||||||
|
Retrieves the operational status of the fan drawer
|
||||||
|
Returns:
|
||||||
|
bool: True if fan drawer is operating properly, False if not
|
||||||
|
"""
|
||||||
|
status = True
|
||||||
|
for fan in self.get_all_fans():
|
||||||
|
status &= fan.get_status()
|
||||||
|
return status
|
||||||
|
|
||||||
|
def get_position_in_parent(self):
|
||||||
|
"""
|
||||||
|
Retrieves 1-based relative physical position in parent device.
|
||||||
|
Returns:
|
||||||
|
integer: The 1-based relative physical position in parent
|
||||||
|
device or -1 if cannot determine the position
|
||||||
|
"""
|
||||||
|
return self.fantrayindex
|
||||||
|
|
||||||
|
def is_replaceable(self):
|
||||||
|
"""
|
||||||
|
Indicate whether this fan drawer is replaceable.
|
||||||
|
Returns:
|
||||||
|
bool: True if it is replaceable, False if not
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
def set_status_led(self, color):
|
||||||
|
"""
|
||||||
|
Set led to expected color
|
||||||
|
Args:
|
||||||
|
color: A string representing the color with which to set the
|
||||||
|
fan module status LED
|
||||||
|
Returns:
|
||||||
|
bool: True if set success, False if fail.
|
||||||
|
"""
|
||||||
|
# Fan tray status LED controlled by BMC
|
||||||
|
# Return True to avoid thermalctld alarm
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_maximum_consumed_power(self):
|
||||||
|
"""
|
||||||
|
Retrives the maximum power drawn by Fan Drawer
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A float, with value of the maximum consumable power of the
|
||||||
|
component.
|
||||||
|
"""
|
||||||
|
return 36.0
|
@ -0,0 +1 @@
|
|||||||
|
../../common/sonic_platform/hwaccess.py
|
@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
#
|
||||||
|
# Module contains an implementation of SONiC Platform Base API and
|
||||||
|
# provides the platform information
|
||||||
|
#
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_base.platform_base import PlatformBase
|
||||||
|
from sonic_platform.chassis import Chassis
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class Platform(PlatformBase):
|
||||||
|
"""
|
||||||
|
DELLEMC Platform-specific class
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
PlatformBase.__init__(self)
|
||||||
|
self._chassis = Chassis()
|
@ -0,0 +1,282 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# DellEMC Z9432F
|
||||||
|
#
|
||||||
|
# Module contains an implementation of SONiC Platform Base API and
|
||||||
|
# provides the PSUs' information which are available in the platform
|
||||||
|
#
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_base.psu_base import PsuBase
|
||||||
|
from sonic_platform.ipmihelper import IpmiSensor, IpmiFru
|
||||||
|
from sonic_platform.fan import Fan
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
PSU_TYPE_OFFSET = 48
|
||||||
|
|
||||||
|
class Psu(PsuBase):
|
||||||
|
"""DellEMC Platform-specific PSU class"""
|
||||||
|
|
||||||
|
# { PSU-ID: { Sensor-Name: Sensor-ID } }
|
||||||
|
SENSOR_MAPPING = {1: {"State": 0x40, "Current": 0x4a,
|
||||||
|
"Power": 0x4b, "Voltage": 0x49,
|
||||||
|
"InCurrent": 0x43, "InPower": 0x44,
|
||||||
|
"InVoltage": 0x42, "Temperature": 0x48 },
|
||||||
|
2: {"State": 0x30, "Current": 0x3a,
|
||||||
|
"Power": 0x3b, "Voltage": 0x39,
|
||||||
|
"InCurrent": 0x33, "InPower": 0x34,
|
||||||
|
"InVoltage": 0x32, "Temperature": 0x38 } }
|
||||||
|
# ( PSU-ID: FRU-ID }
|
||||||
|
FRU_MAPPING = {1: 1, 2: 2}
|
||||||
|
|
||||||
|
def __init__(self, psu_index):
|
||||||
|
PsuBase.__init__(self)
|
||||||
|
# PSU is 1-based in DellEMC platforms
|
||||||
|
self.index = psu_index + 1
|
||||||
|
self.state_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["State"],
|
||||||
|
is_discrete=True)
|
||||||
|
self.voltage_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Voltage"])
|
||||||
|
self.current_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Current"])
|
||||||
|
self.power_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Power"])
|
||||||
|
self.input_voltage_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InVoltage"])
|
||||||
|
self.input_current_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InCurrent"])
|
||||||
|
self.input_power_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["InPower"])
|
||||||
|
self.temp_sensor = IpmiSensor(self.SENSOR_MAPPING[self.index]["Temperature"])
|
||||||
|
self.psu_type_offset = PSU_TYPE_OFFSET
|
||||||
|
self.fru = IpmiFru(self.FRU_MAPPING[self.index])
|
||||||
|
|
||||||
|
self._fan_list.append(Fan(fan_index=self.index, psu_fan=True,
|
||||||
|
dependency=self))
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
"""
|
||||||
|
Retrieves the name of the device
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
string: The name of the device
|
||||||
|
"""
|
||||||
|
return "PSU{}".format(self.index)
|
||||||
|
|
||||||
|
def get_presence(self):
|
||||||
|
"""
|
||||||
|
Retrieves the presence of the Power Supply Unit (PSU)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if PSU is present, False if not
|
||||||
|
"""
|
||||||
|
presence = False
|
||||||
|
is_valid, state = self.state_sensor.get_reading()
|
||||||
|
if is_valid:
|
||||||
|
if state & 0b1:
|
||||||
|
presence = True
|
||||||
|
|
||||||
|
return presence
|
||||||
|
|
||||||
|
def get_model(self):
|
||||||
|
"""
|
||||||
|
Retrieves the part number of the PSU
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
string: Part number of PSU
|
||||||
|
"""
|
||||||
|
return self.fru.get_board_part_number()
|
||||||
|
|
||||||
|
def get_serial(self):
|
||||||
|
"""
|
||||||
|
Retrieves the serial number of the PSU
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
string: Serial number of PSU
|
||||||
|
"""
|
||||||
|
return self.fru.get_board_serial()
|
||||||
|
|
||||||
|
def get_revision(self):
|
||||||
|
"""
|
||||||
|
Retrieves the hardware revision of the device
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
string: Revision value of device
|
||||||
|
"""
|
||||||
|
serial = self.fru.get_board_serial()
|
||||||
|
if serial != "NA" and len(serial) == 23:
|
||||||
|
return serial[-3:]
|
||||||
|
else:
|
||||||
|
return "NA"
|
||||||
|
|
||||||
|
def get_status(self):
|
||||||
|
"""
|
||||||
|
Retrieves the operational status of the PSU
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if PSU is operating properly, False if not
|
||||||
|
"""
|
||||||
|
status = False
|
||||||
|
is_valid, state = self.state_sensor.get_reading()
|
||||||
|
if is_valid:
|
||||||
|
if state <= 0x01:
|
||||||
|
status = True
|
||||||
|
|
||||||
|
return status
|
||||||
|
|
||||||
|
def get_voltage(self):
|
||||||
|
"""
|
||||||
|
Retrieves current PSU voltage output
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A float number, the output voltage in volts,
|
||||||
|
e.g. 12.1
|
||||||
|
"""
|
||||||
|
is_valid, voltage = self.voltage_sensor.get_reading()
|
||||||
|
if not is_valid:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return float(voltage)
|
||||||
|
|
||||||
|
def get_voltage_low_threshold(self):
|
||||||
|
"""
|
||||||
|
Returns PSU low threshold in Volts
|
||||||
|
"""
|
||||||
|
is_valid, low_threshold = self.voltage_sensor.get_threshold("LowerCritical")
|
||||||
|
if not is_valid:
|
||||||
|
low_threshold = 11.4
|
||||||
|
low_threshold = "{:.2f}".format(low_threshold)
|
||||||
|
|
||||||
|
return float(low_threshold)
|
||||||
|
|
||||||
|
|
||||||
|
def get_voltage_high_threshold(self):
|
||||||
|
"""
|
||||||
|
Returns PSU high threshold in Volts
|
||||||
|
"""
|
||||||
|
is_valid, high_threshold = self.voltage_sensor.get_threshold("UpperCritical")
|
||||||
|
if not is_valid:
|
||||||
|
high_threshold = 12.6
|
||||||
|
high_threshold = "{:.2f}".format(high_threshold)
|
||||||
|
|
||||||
|
return float(high_threshold)
|
||||||
|
|
||||||
|
def get_temperature(self):
|
||||||
|
"""
|
||||||
|
Retrieves current temperature reading from thermal
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A float number of current temperature in Celsius up to
|
||||||
|
nearest thousandth of one degree Celsius, e.g. 30.125
|
||||||
|
"""
|
||||||
|
is_valid, temperature = self.temp_sensor.get_reading()
|
||||||
|
if not is_valid:
|
||||||
|
temperature = 0
|
||||||
|
|
||||||
|
return float(temperature)
|
||||||
|
|
||||||
|
def get_temperature_high_threshold(self):
|
||||||
|
"""
|
||||||
|
Returns the high temperature threshold for PSU in Celsius
|
||||||
|
"""
|
||||||
|
is_valid, high_threshold = self.temp_sensor.get_threshold("UpperCritical")
|
||||||
|
if not is_valid:
|
||||||
|
high_threshold = 113
|
||||||
|
high_threshold = "{:.2f}".format(high_threshold)
|
||||||
|
|
||||||
|
return float(high_threshold)
|
||||||
|
|
||||||
|
|
||||||
|
def get_current(self):
|
||||||
|
"""
|
||||||
|
Retrieves present electric current supplied by PSU
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A float number, electric current in amperes,
|
||||||
|
e.g. 15.4
|
||||||
|
"""
|
||||||
|
is_valid, current = self.current_sensor.get_reading()
|
||||||
|
if not is_valid:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return float(current)
|
||||||
|
|
||||||
|
def get_power(self):
|
||||||
|
"""
|
||||||
|
Retrieves current energy supplied by PSU
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A float number, the power in watts,
|
||||||
|
e.g. 302.6
|
||||||
|
"""
|
||||||
|
is_valid, power = self.power_sensor.get_reading()
|
||||||
|
if not is_valid:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return float(power)
|
||||||
|
|
||||||
|
def get_maximum_supplied_power(self):
|
||||||
|
"""
|
||||||
|
Retrieves the maximum supplied power by PSU
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A float number, the maximum power output in Watts.
|
||||||
|
e.g. 1200.1
|
||||||
|
"""
|
||||||
|
is_valid, power = self.power_sensor.get_threshold("UpperCritical")
|
||||||
|
if not is_valid:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return float(power)
|
||||||
|
|
||||||
|
def get_powergood_status(self):
|
||||||
|
"""
|
||||||
|
Retrieves the powergood status of PSU
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A boolean, True if PSU has stablized its output voltages and
|
||||||
|
passed all its internal self-tests, False if not.
|
||||||
|
"""
|
||||||
|
status = False
|
||||||
|
is_valid, state = self.state_sensor.get_reading()
|
||||||
|
if is_valid:
|
||||||
|
if state == 0x01:
|
||||||
|
status = True
|
||||||
|
|
||||||
|
return status
|
||||||
|
|
||||||
|
def get_mfr_id(self):
|
||||||
|
"""
|
||||||
|
Retrives the Manufacturer Id of PSU
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A string, the manunfacturer id.
|
||||||
|
"""
|
||||||
|
return self.fru.get_board_mfr_id()
|
||||||
|
|
||||||
|
def get_type(self):
|
||||||
|
"""
|
||||||
|
Retrives the Power Type of PSU
|
||||||
|
|
||||||
|
Returns :
|
||||||
|
A string, PSU power type
|
||||||
|
"""
|
||||||
|
psu_type = ['AC', 'DC']
|
||||||
|
is_valid , ct_psu_type = self.fru.get_fru_data(self.psu_type_offset)
|
||||||
|
if is_valid:
|
||||||
|
return psu_type[ct_psu_type[0]]
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_position_in_parent(self):
|
||||||
|
"""
|
||||||
|
Retrieves 1-based relative physical position in parent device.
|
||||||
|
Returns:
|
||||||
|
integer: The 1-based relative physical position in parent
|
||||||
|
device or -1 if cannot determine the position
|
||||||
|
"""
|
||||||
|
return self.index
|
||||||
|
|
||||||
|
def is_replaceable(self):
|
||||||
|
"""
|
||||||
|
Indicate whether this PSU is replaceable.
|
||||||
|
Returns:
|
||||||
|
bool: True if it is replaceable.
|
||||||
|
"""
|
||||||
|
return True
|
@ -0,0 +1,390 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""
|
||||||
|
#############################################################################
|
||||||
|
# DELLEMC Z9432F
|
||||||
|
#
|
||||||
|
# Module contains an implementation of SONiC Platform Base API and
|
||||||
|
# provides the platform information
|
||||||
|
#
|
||||||
|
#############################################################################
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import subprocess
|
||||||
|
import mmap
|
||||||
|
from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase
|
||||||
|
|
||||||
|
except ImportError as err:
|
||||||
|
raise ImportError(str(err) + "- required module not found")
|
||||||
|
|
||||||
|
QSFP_INFO_OFFSET = 128
|
||||||
|
SFP_INFO_OFFSET = 0
|
||||||
|
QSFP_DD_PAGE0 = 0
|
||||||
|
|
||||||
|
SFP_TYPE_LIST = [
|
||||||
|
'0x3' # SFP/SFP+/SFP28 and later
|
||||||
|
]
|
||||||
|
QSFP_TYPE_LIST = [
|
||||||
|
'0x0c', # QSFP
|
||||||
|
'0x0d', # QSFP+ or later
|
||||||
|
'0x11' # QSFP28 or later
|
||||||
|
]
|
||||||
|
QSFP_DD_TYPE_LIST = [
|
||||||
|
'0x18' #QSFP_DD Type
|
||||||
|
]
|
||||||
|
|
||||||
|
OSFP_TYPE_LIST = [
|
||||||
|
'0x19' # OSFP 8X Type
|
||||||
|
]
|
||||||
|
|
||||||
|
class Sfp(SfpOptoeBase):
|
||||||
|
"""
|
||||||
|
DELLEMC Platform-specific Sfp class
|
||||||
|
"""
|
||||||
|
BASE_RES_PATH = "/sys/bus/pci/devices/0000:04:00.0/resource0"
|
||||||
|
|
||||||
|
def __init__(self, index, sfp_type, eeprom_path):
|
||||||
|
"""
|
||||||
|
SFP Dunder init
|
||||||
|
"""
|
||||||
|
SfpOptoeBase.__init__(self)
|
||||||
|
self.index = index
|
||||||
|
self.eeprom_path = eeprom_path
|
||||||
|
self.sfp_eeprom_path = eeprom_path
|
||||||
|
#port_type is the native port type and sfp_type is the transceiver type
|
||||||
|
#sfp_type will be detected in get_transceiver_info
|
||||||
|
self.port_type = sfp_type
|
||||||
|
self.sfp_type = self.port_type
|
||||||
|
self._initialize_media(delay=False)
|
||||||
|
|
||||||
|
def get_eeprom_path(self):
|
||||||
|
"""
|
||||||
|
Returns SFP eeprom path
|
||||||
|
"""
|
||||||
|
return self.eeprom_path
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
"""
|
||||||
|
Returns native transceiver type
|
||||||
|
"""
|
||||||
|
return "QSFP-DD Double Density 8X Pluggable Transceiver" if self.index < 33 else "SFP/SFP+/SFP28"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def pci_mem_read(mem, offset):
|
||||||
|
"""
|
||||||
|
Returns the desired byte in PCI memory space
|
||||||
|
"""
|
||||||
|
mem.seek(offset)
|
||||||
|
return mem.read_byte()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def pci_mem_write(mem, offset, data):
|
||||||
|
"""
|
||||||
|
Writes the desired byte in PCI memory space
|
||||||
|
"""
|
||||||
|
mem.seek(offset)
|
||||||
|
# print "data to write:%x"%data
|
||||||
|
mem.write_byte(data)
|
||||||
|
|
||||||
|
def pci_set_value(self, resource, val, offset):
|
||||||
|
"""
|
||||||
|
Sets the value in PCI memory space
|
||||||
|
"""
|
||||||
|
filed = os.open(resource, os.O_RDWR)
|
||||||
|
mem = mmap.mmap(filed, 0)
|
||||||
|
self.pci_mem_write(mem, offset, val)
|
||||||
|
mem.close()
|
||||||
|
os.close(filed)
|
||||||
|
return val
|
||||||
|
|
||||||
|
def pci_get_value(self, resource, offset):
|
||||||
|
"""
|
||||||
|
Retrieves the value from PCI memory space
|
||||||
|
"""
|
||||||
|
filed = os.open(resource, os.O_RDWR)
|
||||||
|
mem = mmap.mmap(filed, 0)
|
||||||
|
val = self.pci_mem_read(mem, offset)
|
||||||
|
mem.close()
|
||||||
|
os.close(filed)
|
||||||
|
return val
|
||||||
|
|
||||||
|
def _initialize_media(self, delay=False):
|
||||||
|
"""
|
||||||
|
Initialize the media type and eeprom driver for SFP
|
||||||
|
"""
|
||||||
|
if delay:
|
||||||
|
time.sleep(1)
|
||||||
|
self._xcvr_api = None
|
||||||
|
self.get_xcvr_api()
|
||||||
|
|
||||||
|
self.set_media_type()
|
||||||
|
self.reinit_sfp_driver()
|
||||||
|
|
||||||
|
def get_presence(self):
|
||||||
|
"""
|
||||||
|
Retrieves the presence of the sfp
|
||||||
|
Returns : True if sfp is present and false if it is absent
|
||||||
|
"""
|
||||||
|
# Check for invalid port_num
|
||||||
|
mask = {'QSFP_DD' : (1 << 4), 'SFP' : (1 << 0)}
|
||||||
|
# Port offset starts with 0x4004
|
||||||
|
port_offset = 16388 + ((self.index-1) * 16)
|
||||||
|
|
||||||
|
try:
|
||||||
|
status = self.pci_get_value(self.BASE_RES_PATH, port_offset)
|
||||||
|
reg_value = int(status)
|
||||||
|
# ModPrsL is active low
|
||||||
|
if reg_value & mask[self.port_type] == 0:
|
||||||
|
return True
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_reset_status(self):
|
||||||
|
"""
|
||||||
|
Retrives the reset status of SFP
|
||||||
|
"""
|
||||||
|
reset_status = False
|
||||||
|
try:
|
||||||
|
if self.port_type == 'QSFP_DD':
|
||||||
|
# Port offset starts with 0x4000
|
||||||
|
port_offset = 16384 + ((self.index-1) * 16)
|
||||||
|
|
||||||
|
status = self.pci_get_value(self.BASE_RES_PATH, port_offset)
|
||||||
|
reg_value = int(status)
|
||||||
|
|
||||||
|
# Mask off 4th bit for reset status
|
||||||
|
mask = (1 << 4)
|
||||||
|
reset_status = not (reg_value & mask)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return reset_status
|
||||||
|
|
||||||
|
def get_lpmode(self):
|
||||||
|
"""
|
||||||
|
Retrieves the lpmode(low power mode) of this SFP
|
||||||
|
"""
|
||||||
|
lpmode_state = False
|
||||||
|
try:
|
||||||
|
if self.sfp_type == 'QSFP_DD':
|
||||||
|
return SfpOptoeBase.get_lpmode(self)
|
||||||
|
else:
|
||||||
|
# Port offset starts with 0x4000
|
||||||
|
port_offset = 16384 + ((self.index-1) * 16)
|
||||||
|
|
||||||
|
status = self.pci_get_value(self.BASE_RES_PATH, port_offset)
|
||||||
|
reg_value = int(status)
|
||||||
|
|
||||||
|
# Mask off 6th bit for lpmode
|
||||||
|
mask = (1 << 6)
|
||||||
|
|
||||||
|
lpmode_state = (reg_value & mask)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
return bool(lpmode_state)
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
"""
|
||||||
|
Reset the SFP and returns all user settings to their default state
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
if self.port_type == 'QSFP_DD':
|
||||||
|
# Port offset starts with 0x4000
|
||||||
|
port_offset = 16384 + ((self.index-1) * 16)
|
||||||
|
|
||||||
|
status = self.pci_get_value(self.BASE_RES_PATH, port_offset)
|
||||||
|
reg_value = int(status)
|
||||||
|
|
||||||
|
# Mask off 4th bit for reset
|
||||||
|
mask = (1 << 4)
|
||||||
|
|
||||||
|
# ResetL is active low
|
||||||
|
reg_value = reg_value & ~mask
|
||||||
|
|
||||||
|
# Convert our register value back to a hex string and write back
|
||||||
|
self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset)
|
||||||
|
|
||||||
|
# Sleep 1 second to allow it to settle
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
reg_value = reg_value | mask
|
||||||
|
|
||||||
|
# Convert our register value back to a hex string and write back
|
||||||
|
self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset)
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def set_lpmode(self, lpmode):
|
||||||
|
"""
|
||||||
|
Sets the lpmode(low power mode) of this SFP
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
if self.sfp_type == 'QSFP_DD':
|
||||||
|
return SfpOptoeBase.set_lpmode(self, lpmode)
|
||||||
|
else:
|
||||||
|
# Port offset starts with 0x4000
|
||||||
|
port_offset = 16384 + ((self.index-1) * 16)
|
||||||
|
|
||||||
|
status = self.pci_get_value(self.BASE_RES_PATH, port_offset)
|
||||||
|
reg_value = int(status)
|
||||||
|
|
||||||
|
# Mask off 6th bit for lowpower mode
|
||||||
|
mask = (1 << 6)
|
||||||
|
|
||||||
|
# LPMode is active high; set or clear the bit accordingly
|
||||||
|
if lpmode is True:
|
||||||
|
reg_value = reg_value | mask
|
||||||
|
else:
|
||||||
|
reg_value = reg_value & ~mask
|
||||||
|
|
||||||
|
# Convert our register value back to a hex string and write back
|
||||||
|
self.pci_set_value(self.BASE_RES_PATH, reg_value, port_offset)
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_intl_state(self):
|
||||||
|
"""
|
||||||
|
Sets the intL (interrupt; active low) pin of this SFP
|
||||||
|
"""
|
||||||
|
intl_state = True
|
||||||
|
try:
|
||||||
|
if self.port_type == 'QSFP_DD':
|
||||||
|
# Port offset starts with 0x4004
|
||||||
|
port_offset = 16388 + ((self.index-1) * 16)
|
||||||
|
|
||||||
|
status = self.pci_get_value(self.BASE_RES_PATH, port_offset)
|
||||||
|
reg_value = int(status)
|
||||||
|
|
||||||
|
# Mask off 4th bit for intL
|
||||||
|
mask = (1 << 4)
|
||||||
|
|
||||||
|
intl_state = (reg_value & mask)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
return intl_state
|
||||||
|
|
||||||
|
def set_media_type(self):
|
||||||
|
"""
|
||||||
|
Reads optic eeprom byte to determine media type inserted
|
||||||
|
"""
|
||||||
|
eeprom_raw = []
|
||||||
|
eeprom_raw = self._xcvr_api_factory._get_id()
|
||||||
|
if eeprom_raw is not None:
|
||||||
|
eeprom_raw = hex(eeprom_raw)
|
||||||
|
if eeprom_raw in SFP_TYPE_LIST:
|
||||||
|
self.sfp_type = 'SFP'
|
||||||
|
elif eeprom_raw in QSFP_TYPE_LIST:
|
||||||
|
self.sfp_type = 'QSFP'
|
||||||
|
elif eeprom_raw in QSFP_DD_TYPE_LIST:
|
||||||
|
self.sfp_type = 'QSFP_DD'
|
||||||
|
else:
|
||||||
|
#Set native port type if EEPROM type is not recognized/readable
|
||||||
|
self.sfp_type = self.port_type
|
||||||
|
else:
|
||||||
|
self.sfp_type = self.port_type
|
||||||
|
|
||||||
|
return self.sfp_type
|
||||||
|
|
||||||
|
def reinit_sfp_driver(self):
|
||||||
|
"""
|
||||||
|
Changes the driver based on media type detected
|
||||||
|
"""
|
||||||
|
|
||||||
|
i2c_bus = self.sfp_eeprom_path[27:].split('/')[0]
|
||||||
|
del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(i2c_bus)
|
||||||
|
new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(i2c_bus)
|
||||||
|
driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(i2c_bus)
|
||||||
|
delete_device = "echo 0x50 >" + del_sfp_path
|
||||||
|
|
||||||
|
if not os.path.isfile(driver_path):
|
||||||
|
print(driver_path, "does not exist")
|
||||||
|
return False
|
||||||
|
|
||||||
|
try:
|
||||||
|
with os.fdopen(os.open(driver_path, os.O_RDONLY)) as filed:
|
||||||
|
driver_name = filed.read()
|
||||||
|
driver_name = driver_name.rstrip('\r\n')
|
||||||
|
driver_name = driver_name.lstrip(" ")
|
||||||
|
|
||||||
|
#Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port.
|
||||||
|
if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']:
|
||||||
|
subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE)
|
||||||
|
time.sleep(0.2)
|
||||||
|
new_device = "echo optoe2 0x50 >" + new_sfp_path
|
||||||
|
subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE)
|
||||||
|
time.sleep(2)
|
||||||
|
elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']:
|
||||||
|
subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE)
|
||||||
|
time.sleep(0.2)
|
||||||
|
new_device = "echo optoe1 0x50 >" + new_sfp_path
|
||||||
|
subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE)
|
||||||
|
time.sleep(2)
|
||||||
|
elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']:
|
||||||
|
subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE)
|
||||||
|
time.sleep(0.2)
|
||||||
|
new_device = "echo optoe3 0x50 >" + new_sfp_path
|
||||||
|
subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE)
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
except IOError as err:
|
||||||
|
print("Error: Unable to open file: %s" %str(err))
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_position_in_parent(self):
|
||||||
|
"""
|
||||||
|
Retrieves 1-based relative physical position in parent device.
|
||||||
|
Returns:
|
||||||
|
integer: The 1-based relative physical position in parent
|
||||||
|
device or -1 if cannot determine the position
|
||||||
|
"""
|
||||||
|
return self.index
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_replaceable():
|
||||||
|
"""
|
||||||
|
Indicate whether this device is replaceable.
|
||||||
|
Returns:
|
||||||
|
bool: True if it is replaceable.
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_error_description(self):
|
||||||
|
"""
|
||||||
|
Retrives the error descriptions of the SFP module
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
String that represents the current error descriptions of vendor specific errors
|
||||||
|
In case there are multiple errors, they should be joined by '|',
|
||||||
|
like: "Bad EEPROM|Unsupported cable"
|
||||||
|
"""
|
||||||
|
if not self.get_presence():
|
||||||
|
return self.SFP_STATUS_UNPLUGGED
|
||||||
|
else:
|
||||||
|
if not os.path.isfile(self.eeprom_path):
|
||||||
|
return "EEPROM driver is not attached"
|
||||||
|
|
||||||
|
if self.sfp_type == 'SFP':
|
||||||
|
offset = SFP_INFO_OFFSET
|
||||||
|
elif self.sfp_type == 'QSFP':
|
||||||
|
offset = QSFP_INFO_OFFSET
|
||||||
|
elif self.sfp_type == 'QSFP_DD':
|
||||||
|
offset = QSFP_DD_PAGE0
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(self.eeprom_path, mode="rb", buffering=0) as eeprom:
|
||||||
|
eeprom.seek(offset)
|
||||||
|
eeprom.read(1)
|
||||||
|
except OSError as e:
|
||||||
|
return "EEPROM read failed ({})".format(e.strerror)
|
||||||
|
|
||||||
|
return self.SFP_STATUS_OK
|
@ -0,0 +1,195 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# DellEMC Z9432F
|
||||||
|
#
|
||||||
|
# Module contains an implementation of SONiC Platform Base API and
|
||||||
|
# provides the Thermals' information which are available in the platform
|
||||||
|
#
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_base.thermal_base import ThermalBase
|
||||||
|
from sonic_platform.ipmihelper import IpmiSensor
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class Thermal(ThermalBase):
|
||||||
|
"""DellEMC Platform-specific Thermal class"""
|
||||||
|
|
||||||
|
# [ Sensor-Name, Sensor-ID, high threshold, high critical_threshold ]
|
||||||
|
# TBD :
|
||||||
|
# high thershold/hich crit threshold
|
||||||
|
# need to be modified as True in case if it is supported
|
||||||
|
#
|
||||||
|
SENSOR_MAPPING = [
|
||||||
|
['CPU Temp', 0xd, True, True],
|
||||||
|
['FAN Right Temp', 0x0, True, True],
|
||||||
|
['NPU Front Temp', 0x1, True, True],
|
||||||
|
['NPU Rear Temp', 0x3, True, True],
|
||||||
|
['NPU Temp', 0x8, True, True],
|
||||||
|
['PSU1 AF Temp', 0x46, False, True],
|
||||||
|
['PSU1 Mid Temp', 0x47, False, True],
|
||||||
|
['PSU1 Rear Temp', 0x48, False, True],
|
||||||
|
['PSU2 AF Temp', 0x36, False, True],
|
||||||
|
['PSU2 Mid Temp', 0x37, False, True],
|
||||||
|
['PSU2 Rear Temp', 0x38, False, True],
|
||||||
|
['PT Left Temp', 0x2, True, True],
|
||||||
|
['PT Right Temp', 0x4, True, True]
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self, thermal_index=0):
|
||||||
|
ThermalBase.__init__(self)
|
||||||
|
self.index = thermal_index + 1
|
||||||
|
self.sensor = IpmiSensor(self.SENSOR_MAPPING[self.index - 1][1])
|
||||||
|
self.has_high_threshold = self.SENSOR_MAPPING[self.index - 1][2]
|
||||||
|
self.has_high_crit_threshold = self.SENSOR_MAPPING[self.index - 1][3]
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
"""
|
||||||
|
Retrieves the name of the thermal
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
string: The name of the thermal
|
||||||
|
"""
|
||||||
|
return self.SENSOR_MAPPING[self.index - 1][0]
|
||||||
|
|
||||||
|
def get_presence(self):
|
||||||
|
"""
|
||||||
|
Retrieves the presence of the thermal
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if thermal is present, False if not
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_model(self):
|
||||||
|
"""
|
||||||
|
Retrieves the model number (or part number) of the Thermal
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
string: Model/part number of Thermal
|
||||||
|
"""
|
||||||
|
return 'NA'
|
||||||
|
|
||||||
|
def get_serial(self):
|
||||||
|
"""
|
||||||
|
Retrieves the serial number of the Thermal
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
string: Serial number of Thermal
|
||||||
|
"""
|
||||||
|
return 'NA'
|
||||||
|
|
||||||
|
def get_status(self):
|
||||||
|
"""
|
||||||
|
Retrieves the operational status of the thermal
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A boolean value, True if thermal is operating properly,
|
||||||
|
False if not
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_temperature(self):
|
||||||
|
"""
|
||||||
|
Retrieves current temperature reading from thermal
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A float number of current temperature in Celsius up to
|
||||||
|
nearest thousandth of one degree Celsius, e.g. 30.125
|
||||||
|
"""
|
||||||
|
is_valid, temperature = self.sensor.get_reading()
|
||||||
|
if not is_valid:
|
||||||
|
temperature = 0
|
||||||
|
|
||||||
|
return float(temperature)
|
||||||
|
|
||||||
|
def get_high_threshold(self):
|
||||||
|
"""
|
||||||
|
Retrieves the high threshold temperature of thermal
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A float number, the high threshold temperature of thermal in
|
||||||
|
Celsius up to nearest thousandth of one degree Celsius,
|
||||||
|
e.g. 30.125
|
||||||
|
"""
|
||||||
|
if self.has_high_threshold:
|
||||||
|
is_valid, high_threshold = self.sensor.get_threshold("UpperNonCritical")
|
||||||
|
if is_valid:
|
||||||
|
return float(high_threshold)
|
||||||
|
|
||||||
|
return super(Thermal, self).get_high_threshold()
|
||||||
|
|
||||||
|
def get_low_threshold(self):
|
||||||
|
"""
|
||||||
|
Retrieves the low threshold temperature of thermal
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A float number, the low threshold temperature of thermal in
|
||||||
|
Celsius up to nearest thousandth of one degree Celsius,
|
||||||
|
e.g. 30.125
|
||||||
|
"""
|
||||||
|
return 0.0
|
||||||
|
|
||||||
|
def get_high_critical_threshold(self):
|
||||||
|
"""
|
||||||
|
Retrieves the high critical threshold temperature of thermal
|
||||||
|
Returns:
|
||||||
|
A float number, the high critical threshold temperature of
|
||||||
|
thermal in Celsius up to nearest thousandth of one degree
|
||||||
|
Celsius, e.g. 30.125
|
||||||
|
"""
|
||||||
|
if self.has_high_crit_threshold:
|
||||||
|
is_valid, high_crit_threshold = self.sensor.get_threshold("UpperCritical")
|
||||||
|
if is_valid:
|
||||||
|
return float(high_crit_threshold)
|
||||||
|
|
||||||
|
return super(Thermal, self).get_high_critical_threshold()
|
||||||
|
|
||||||
|
def set_high_threshold(self, temperature):
|
||||||
|
"""
|
||||||
|
Sets the high threshold temperature of thermal
|
||||||
|
|
||||||
|
Args :
|
||||||
|
temperature: A float number up to nearest thousandth of one
|
||||||
|
degree Celsius, e.g. 30.125
|
||||||
|
Returns:
|
||||||
|
A boolean, True if threshold is set successfully, False if
|
||||||
|
not
|
||||||
|
"""
|
||||||
|
# Thermal threshold values are pre-defined based on HW.
|
||||||
|
return False
|
||||||
|
|
||||||
|
def set_low_threshold(self, temperature):
|
||||||
|
"""
|
||||||
|
Sets the low threshold temperature of thermal
|
||||||
|
|
||||||
|
Args :
|
||||||
|
temperature: A float number up to nearest thousandth of one
|
||||||
|
degree Celsius, e.g. 30.125
|
||||||
|
Returns:
|
||||||
|
A boolean, True if threshold is set successfully, False if
|
||||||
|
not
|
||||||
|
"""
|
||||||
|
# Thermal threshold values are pre-defined based on HW.
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_position_in_parent(self):
|
||||||
|
"""
|
||||||
|
Retrieves 1-based relative physical position in parent device.
|
||||||
|
Returns:
|
||||||
|
integer: The 1-based relative physical position in parent
|
||||||
|
device or -1 if cannot determine the position
|
||||||
|
"""
|
||||||
|
return self.index
|
||||||
|
|
||||||
|
def is_replaceable(self):
|
||||||
|
"""
|
||||||
|
Indicate whether this Thermal is replaceable.
|
||||||
|
Returns:
|
||||||
|
bool: True if it is replaceable.
|
||||||
|
"""
|
||||||
|
return False
|
@ -0,0 +1,211 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
#
|
||||||
|
# DELLEMC Z9432F
|
||||||
|
#
|
||||||
|
# Abstract base class for implementing a platform-specific class with
|
||||||
|
# which to interact with a hardware watchdog module in SONiC
|
||||||
|
#
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
try:
|
||||||
|
import ctypes
|
||||||
|
import subprocess
|
||||||
|
import syslog
|
||||||
|
import sonic_platform.component as Component
|
||||||
|
from sonic_platform_base.watchdog_base import WatchdogBase
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class _timespec(ctypes.Structure):
|
||||||
|
_fields_ = [
|
||||||
|
('tv_sec', ctypes.c_long),
|
||||||
|
('tv_nsec', ctypes.c_long)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class Watchdog(WatchdogBase):
|
||||||
|
"""
|
||||||
|
Abstract base class for interfacing with a hardware watchdog module
|
||||||
|
"""
|
||||||
|
|
||||||
|
TIMERS = [15,20,30,40,50,60,65,70,80,100,120,140,160,180,210,240]
|
||||||
|
|
||||||
|
armed_time = 0
|
||||||
|
timeout = 0
|
||||||
|
CLOCK_MONOTONIC = 1
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._librt = ctypes.CDLL('librt.so.1', use_errno=True)
|
||||||
|
self._clock_gettime = self._librt.clock_gettime
|
||||||
|
self._clock_gettime.argtypes=[ctypes.c_int, ctypes.POINTER(_timespec)]
|
||||||
|
|
||||||
|
def _get_command_result(self, cmdline):
|
||||||
|
try:
|
||||||
|
proc = subprocess.Popen(cmdline.split(), stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.STDOUT)
|
||||||
|
stdout = proc.communicate()[0]
|
||||||
|
proc.wait()
|
||||||
|
result = stdout.rstrip('\n'.encode())
|
||||||
|
except OSError:
|
||||||
|
result = None
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _get_reg_val(self):
|
||||||
|
# 0x31 = CPLD I2C Base Address
|
||||||
|
# 0x07 = Watchdog Function Register
|
||||||
|
value = self._get_command_result("/usr/sbin/i2cget -y 601 0x31 0x07")
|
||||||
|
if not value:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return int(value, 16)
|
||||||
|
|
||||||
|
def _set_reg_val(self,val):
|
||||||
|
# 0x31 = CPLD I2C Base Address
|
||||||
|
# 0x07 = Watchdog Function Register
|
||||||
|
value = self._get_command_result("/usr/sbin/i2cset -y 601 0x31 0x07 %s"
|
||||||
|
% (val))
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _get_time(self):
|
||||||
|
"""
|
||||||
|
To get clock monotonic time
|
||||||
|
"""
|
||||||
|
ts = _timespec()
|
||||||
|
if self._clock_gettime(self.CLOCK_MONOTONIC, ctypes.pointer(ts)) != 0:
|
||||||
|
self._errno = ctypes.get_errno()
|
||||||
|
return 0
|
||||||
|
return ts.tv_sec + ts.tv_nsec * 1e-9
|
||||||
|
|
||||||
|
def arm(self, seconds):
|
||||||
|
"""
|
||||||
|
Arm the hardware watchdog with a timeout of <seconds> seconds.
|
||||||
|
If the watchdog is currently armed, calling this function will
|
||||||
|
simply reset the timer to the provided value. If the underlying
|
||||||
|
hardware does not support the value provided in <seconds>, this
|
||||||
|
method should arm the watchdog with the *next greater*
|
||||||
|
available value.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An integer specifying the *actual* number of seconds the
|
||||||
|
watchdog was armed with. On failure returns -1.
|
||||||
|
"""
|
||||||
|
timer_offset = -1
|
||||||
|
for key,timer_seconds in enumerate(self.TIMERS):
|
||||||
|
if seconds > 0 and seconds <= timer_seconds:
|
||||||
|
timer_offset = key
|
||||||
|
seconds = timer_seconds
|
||||||
|
break
|
||||||
|
|
||||||
|
if timer_offset == -1:
|
||||||
|
return -1
|
||||||
|
|
||||||
|
cpld_version = Component.get_cpld0_version()
|
||||||
|
wd_enabled_version = "0.8"
|
||||||
|
|
||||||
|
if cpld_version < wd_enabled_version:
|
||||||
|
syslog.syslog(syslog.LOG_ERR,
|
||||||
|
'Older System CPLD ver, Update to 0.8 to support watchdog ')
|
||||||
|
return -1
|
||||||
|
|
||||||
|
# Extracting 5th to 8th bits for WD timer values
|
||||||
|
reg_val = self._get_reg_val()
|
||||||
|
wd_timer_offset = (reg_val >> 4) & 0xf
|
||||||
|
|
||||||
|
if wd_timer_offset != timer_offset:
|
||||||
|
# Setting 5th to 7th bits
|
||||||
|
# value from timer_offset
|
||||||
|
self.disarm()
|
||||||
|
self._set_reg_val((reg_val & 0x07) | (timer_offset << 4))
|
||||||
|
|
||||||
|
if self.is_armed():
|
||||||
|
# Setting last bit to WD Timer punch
|
||||||
|
# Last bit = WD Timer punch
|
||||||
|
self._set_reg_val(reg_val & 0xFE)
|
||||||
|
|
||||||
|
self.armed_time = self._get_time()
|
||||||
|
self.timeout = seconds
|
||||||
|
return seconds
|
||||||
|
else:
|
||||||
|
# Setting 4th bit to enable WD
|
||||||
|
# 4th bit = Enable WD
|
||||||
|
reg_val = self._get_reg_val()
|
||||||
|
self._set_reg_val(reg_val | 0x8)
|
||||||
|
|
||||||
|
self.armed_time = self._get_time()
|
||||||
|
self.timeout = seconds
|
||||||
|
return seconds
|
||||||
|
|
||||||
|
def disarm(self):
|
||||||
|
"""
|
||||||
|
Disarm the hardware watchdog
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A boolean, True if watchdog is disarmed successfully, False
|
||||||
|
if not
|
||||||
|
"""
|
||||||
|
if self.is_armed():
|
||||||
|
# Setting 4th bit to disable WD
|
||||||
|
# 4th bit = Disable WD
|
||||||
|
reg_val = self._get_reg_val()
|
||||||
|
self._set_reg_val(reg_val & 0xF7)
|
||||||
|
|
||||||
|
self.armed_time = 0
|
||||||
|
self.timeout = 0
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def is_armed(self):
|
||||||
|
"""
|
||||||
|
Retrieves the armed state of the hardware watchdog.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A boolean, True if watchdog is armed, False if not
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Extracting 4th bit to get WD Enable/Disable status
|
||||||
|
# 0 - Disabled WD
|
||||||
|
# 1 - Enabled WD
|
||||||
|
reg_val = self._get_reg_val()
|
||||||
|
wd_offset = (reg_val >> 3) & 1
|
||||||
|
|
||||||
|
return bool(wd_offset)
|
||||||
|
|
||||||
|
def get_remaining_time(self):
|
||||||
|
"""
|
||||||
|
If the watchdog is armed, retrieve the number of seconds
|
||||||
|
remaining on the watchdog timer
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An integer specifying the number of seconds remaining on
|
||||||
|
their watchdog timer. If the watchdog is not armed, returns
|
||||||
|
-1.
|
||||||
|
|
||||||
|
Z9432F doesnot have hardware support to show remaining time.
|
||||||
|
Due to this limitation, this API is implemented in software.
|
||||||
|
This API would return correct software time difference if it
|
||||||
|
is called from the process which armed the watchdog timer.
|
||||||
|
If this API called from any other process, it would return
|
||||||
|
0. If the watchdog is not armed, this API would return -1.
|
||||||
|
"""
|
||||||
|
if not self.is_armed():
|
||||||
|
return -1
|
||||||
|
|
||||||
|
if self.armed_time > 0 and self.timeout != 0:
|
||||||
|
cur_time = self._get_time()
|
||||||
|
|
||||||
|
if cur_time <= 0:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
diff_time = int(cur_time - self.armed_time)
|
||||||
|
|
||||||
|
if diff_time > self.timeout:
|
||||||
|
return self.timeout
|
||||||
|
else:
|
||||||
|
return self.timeout - diff_time
|
||||||
|
|
||||||
|
return 0
|
@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Dell Z9432F Platform modules
|
||||||
|
Before=pmon.service
|
||||||
|
After=platform-init.service
|
||||||
|
DefaultDependencies=no
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/local/bin/z9432f_platform.sh init
|
||||||
|
ExecStop=/usr/local/bin/z9432f_platform.sh deinit
|
||||||
|
RemainAfterExit=yes
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
Loading…
Reference in New Issue
Block a user