Add gearbox phy device files and a new physyncd docker to support VS gearbox phy feature (#4851)

* buildimage: Add gearbox phy device files and a new physyncd docker to support VS gearbox phy feature

* scripts and configuration needed to support a second syncd docker (physyncd)
* physyncd supports gearbox device and phy SAI APIs and runs multiple instances of syncd, one per phy in the device
* support for VS target (sonic-sairedis vslib has been extended to support a virtual BCM81724 gearbox PHY).

HLD is located at b817a12fd8/doc/gearbox/gearbox_mgr_design.md

**- Why I did it**

This work is part of the gearbox phy joint effort between Microsoft and Broadcom, and is based
on multi-switch support in sonic-sairedis.

**- How I did it**

Overall feature was implemented across several projects. The collective pull requests (some in late stages of review at this point):

https://github.com/Azure/sonic-utilities/pull/931 - CLI (merged)
https://github.com/Azure/sonic-swss-common/pull/347 - Minor changes (merged)
https://github.com/Azure/sonic-swss/pull/1321 - gearsyncd, config parsers, changes to orchargent to create gearbox phy on supported systems
https://github.com/Azure/sonic-sairedis/pull/624 - physyncd, virtual BCM81724 gearbox phy added to vslib

**- How to verify it**

In a vslib build:

root@sonic:/home/admin# show gearbox interfaces status
  PHY Id    Interface        MAC Lanes    MAC Lane Speed        PHY Lanes    PHY Lane Speed    Line Lanes    Line Lane Speed    Oper    Admin
--------  -----------  ---------------  ----------------  ---------------  ----------------  ------------  -----------------  ------  -------
       1   Ethernet48  121,122,123,124               25G  200,201,202,203               25G       204,205                50G    down     down
       1   Ethernet49  125,126,127,128               25G  206,207,208,209               25G       210,211                50G    down     down
       1   Ethernet50      69,70,71,72               25G  212,213,214,215               25G           216               100G    down     down

In addition, docker ps | grep phy should show a physyncd docker running.

  Signed-off-by: syd.logan@broadcom.com
This commit is contained in:
Syd Logan 2020-09-25 08:32:44 -07:00 committed by GitHub
parent 584e2223dc
commit 0311a4a037
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
33 changed files with 1639 additions and 117 deletions

View File

@ -0,0 +1,88 @@
# Changing the virtual device
You can control the hw sku and default factory configuration for the VS image
by modifying the content of the file default_sku in this directory.
The format of default_sku is a single line:
```
<hw_key> <default_preset>
```
## Allowable values for hw_key
| hw_key | Device |
| ------ | ------ |
| Force10-S6000 | Dell Force10 S6000|
| brcm_gearbox_vs | Similar to Force10-S6000, but implements a virtual BRCM81724 Gearbox Phy |
## Allowable values for default_preset
These include "t1", "l2", and "empty". See the file
sonic-buildimage/src/sonic-config-engine/config_samples.py for details on how
each default_preset value is interpreted.
# Changing the hwsku of an existing VS switch
To change the default hwsku for a VS image that has already been built and installed, follow these steps:
- Edit /usr/share/sonic/device/x86_64-kvm_x86_64-r0/default_sku. For details, see the section below (Device Specific Documentation)
- Edit /etc/sonic/config_db.json, and change the "hwsku" key in DEVICE_METADATA:localhost to match the hw_key used in default_sku. Example:
"DEVICE_METADATA": {
"localhost": {
...
"hwsku": "brcm_gearbox_vs",
...
}
},
...
- Reboot the switch
- Use "show platform summary" to verify, and follow any steps specific to the platform, as needed, such as those described below for the brcm_gearbox_vs hwsku.
# Device Specific Documentation
For general info on building, see https://github.com/Azure/sonic-buildimage/blob/master/README.md
## Force-10-S6000
This is the default VS for SONiC. To enable, set contents of default_sku to:
```
Force10-S6000 t1
```
To build:
```
make init
make configure PLATFORM=vs
make target/sonic-vs.img.gz
```
## brcm_gearbox_vs
This sku simulates a device with a Broadcom BRCM81724 gearbox PHY. To enable,
set default_sku to:
```
brcm_gearbox_vs t1
```
To build (same as Force-10-S6000):
```
make init
make configure PLATFORM=vs
make target/sonic-vs.img.gz
```
To verify, install and bring up SONiC. There will be a new gbsyncd docker
which is designed to respond to configuration directed towards the gearbox phy
"switch". swss will create that gearbox switch on startup after detecting the
gearbox is present (this is done by a short lived gearsyncd that runs in the
swss docker).
The commands "show gearbox interfaces status" and "show gearbox phys status" can be
used to verify the virtual gearbox phy has been created. See https://github.com/Azure/sonic-utilities/blob/master/doc/Command-Reference.md#gearbox for details.

View File

@ -0,0 +1,3 @@
{%- set default_topo = 't1' %}
{%- include 'buffers_config.j2' %}

View File

@ -0,0 +1,45 @@
{%- set default_cable = '300m' %}
{%- macro generate_port_lists(PORT_ALL) %}
{# Generate list of ports #}
{% for port_idx in range(0,32) %}
{% if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{% endif %}
{% endfor %}
{%- endmacro %}
{%- macro generate_buffer_pool_and_profiles() %}
"BUFFER_POOL": {
"ingress_lossless_pool": {
"size": "12766208",
"type": "ingress",
"mode": "dynamic"
},
"egress_lossless_pool": {
"size": "12766208",
"type": "egress",
"mode": "static"
},
"egress_lossy_pool": {
"size": "7326924",
"type": "egress",
"mode": "dynamic"
}
},
"BUFFER_PROFILE": {
"ingress_lossy_profile": {
"pool":"[BUFFER_POOL|ingress_lossless_pool]",
"size":"0",
"dynamic_th":"3"
},
"egress_lossless_profile": {
"pool":"[BUFFER_POOL|egress_lossless_pool]",
"size":"0",
"static_th":"12766208"
},
"egress_lossy_profile": {
"pool":"[BUFFER_POOL|egress_lossy_pool]",
"size":"1518",
"dynamic_th":"3"
}
},
{%- endmacro %}

View File

@ -0,0 +1,45 @@
{%- set default_cable = '300m' %}
{%- macro generate_port_lists(PORT_ALL) %}
{# Generate list of ports #}
{% for port_idx in range(0,32) %}
{% if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{% endif %}
{% endfor %}
{%- endmacro %}
{%- macro generate_buffer_pool_and_profiles() %}
"BUFFER_POOL": {
"ingress_lossless_pool": {
"size": "12766208",
"type": "ingress",
"mode": "dynamic"
},
"egress_lossless_pool": {
"size": "12766208",
"type": "egress",
"mode": "static"
},
"egress_lossy_pool": {
"size": "7326924",
"type": "egress",
"mode": "dynamic"
}
},
"BUFFER_PROFILE": {
"ingress_lossy_profile": {
"pool":"[BUFFER_POOL|ingress_lossless_pool]",
"size":"0",
"dynamic_th":"3"
},
"egress_lossless_profile": {
"pool":"[BUFFER_POOL|egress_lossless_pool]",
"size":"0",
"static_th":"12766208"
},
"egress_lossy_profile": {
"pool":"[BUFFER_POOL|egress_lossy_pool]",
"size":"1518",
"dynamic_th":"3"
}
},
{%- endmacro %}

View File

@ -0,0 +1,45 @@
{%- set default_cable = '300m' %}
{%- macro generate_port_lists(PORT_ALL) %}
{# Generate list of ports #}
{% for port_idx in range(0,32) %}
{% if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{% endif %}
{% endfor %}
{%- endmacro %}
{%- macro generate_buffer_pool_and_profiles() %}
"BUFFER_POOL": {
"ingress_lossless_pool": {
"size": "12766208",
"type": "ingress",
"mode": "dynamic"
},
"egress_lossless_pool": {
"size": "12766208",
"type": "egress",
"mode": "static"
},
"egress_lossy_pool": {
"size": "7326924",
"type": "egress",
"mode": "dynamic"
}
},
"BUFFER_PROFILE": {
"ingress_lossy_profile": {
"pool":"[BUFFER_POOL|ingress_lossless_pool]",
"size":"0",
"dynamic_th":"3"
},
"egress_lossless_profile": {
"pool":"[BUFFER_POOL|egress_lossless_pool]",
"size":"0",
"static_th":"12766208"
},
"egress_lossy_profile": {
"pool":"[BUFFER_POOL|egress_lossy_pool]",
"size":"1518",
"dynamic_th":"3"
}
},
{%- endmacro %}

View File

@ -0,0 +1,32 @@
{
"CONTEXTS": [
{
"guid" : 0,
"name" : "sw0",
"dbAsic" : "ASIC_DB",
"dbCounters" : "COUNTERS_DB",
"dbFlex": "FLEX_COUNTER_DB",
"dbState" : "STATE_DB",
"switches": [
{
"index" : 0,
"hwinfo" : ""
}
]
},
{
"guid" : 1,
"name" : "phy1",
"dbAsic" : "GB_ASIC_DB",
"dbCounters" : "GB_COUNTERS_DB",
"dbFlex": "GB_FLEX_COUNTER_DB",
"dbState" : "STATE_DB",
"switches": [
{
"index" : 1,
"hwinfo" : ""
}
]
}
]
}

View File

@ -0,0 +1,38 @@
{
"phys": [
{
"phy_id": 1,
"name": "sesto-1",
"address": "0x1000",
"lib_name": "libsai_phy_sesto-1.so",
"firmware_path": "/tmp/phy-sesto-1.bin",
"config_file": "/usr/share/sonic/hwsku/phy1_config_1.json",
"sai_init_config_file": "/usr/share/sonic/hwsku/sesto-1.bcm",
"phy_access": "mdio",
"bus_id": 0
}
],
"interfaces": [
{
"name": "Ethernet0",
"index": 0,
"phy_id" : 1,
"system_lanes": [200,201],
"line_lanes": [206]
},
{
"name": "Ethernet4",
"index": 1,
"phy_id" : 1,
"system_lanes": [202,203],
"line_lanes": [207]
},
{
"name": "Ethernet8",
"index": 2,
"phy_id" : 1,
"system_lanes": [204,205],
"line_lanes": [208]
}
]
}

View File

@ -0,0 +1,32 @@
eth1:25,26,27,28
eth2:29,30,31,32
eth3:33,34,35,36
eth4:37,38,39,40
eth5:45,46,47,48
eth6:41,42,43,44
eth7:1,2,3,4
eth8:5,6,7,8
eth9:13,14,15,16
eth10:9,10,11,12
eth11:17,18,19,20
eth12:21,22,23,24
eth13:53,54,55,56
eth14:49,50,51,52
eth15:57,58,59,60
eth16:61,62,63,64
eth17:69,70,71,72
eth18:65,66,67,68
eth19:73,74,75,76
eth20:77,78,79,80
eth21:109,110,111,112
eth22:105,106,107,108
eth23:113,114,115,116
eth24:117,118,119,120
eth25:125,126,127,128
eth26:121,122,123,124
eth27:81,82,83,84
eth28:85,86,87,88
eth29:93,94,95,96
eth30:89,90,91,92
eth31:101,102,103,104
eth32:97,98,99,100

View File

@ -0,0 +1,17 @@
# PG lossless profiles.
# speed cable size xon xoff threshold xon_offset
10000 5m 56368 18432 55120 -3 2496
25000 5m 56368 18432 55120 -3 2496
40000 5m 56368 18432 55120 -3 2496
50000 5m 56368 18432 55120 -3 2496
100000 5m 56368 18432 55120 -3 2496
10000 40m 56368 18432 55120 -3 2496
25000 40m 56368 18432 55120 -3 2496
40000 40m 56368 18432 55120 -3 2496
50000 40m 56368 18432 55120 -3 2496
100000 40m 56368 18432 55120 -3 2496
10000 300m 56368 18432 55120 -3 2496
25000 300m 56368 18432 55120 -3 2496
40000 300m 56368 18432 55120 -3 2496
50000 300m 56368 18432 55120 -3 2496
100000 300m 56368 18432 55120 -3 2496

View File

@ -0,0 +1,168 @@
{
"lanes": [
{
"index": 200,
"local_lane_id": 0,
"system_side": true,
"tx_polarity": 0,
"rx_polarity": 0,
"line_tx_lanemap": 0,
"line_rx_lanemap": 0,
"line_to_system_lanemap": 0,
"mdio_addr": "0x0200"
},
{
"index": 201,
"local_lane_id": 0,
"system_side": true,
"tx_polarity": 0,
"rx_polarity": 0,
"line_tx_lanemap": 0,
"line_rx_lanemap": 0,
"line_to_system_lanemap": 0,
"mdio_addr": "0x0201"
},
{
"index": 202,
"local_lane_id": 0,
"system_side": true,
"tx_polarity": 0,
"rx_polarity": 0,
"line_tx_lanemap": 0,
"line_rx_lanemap": 0,
"line_to_system_lanemap": 0,
"mdio_addr": "0x0202"
},
{
"index": 203,
"local_lane_id": 0,
"system_side": true,
"tx_polarity": 0,
"rx_polarity": 0,
"line_tx_lanemap": 0,
"line_rx_lanemap": 0,
"line_to_system_lanemap": 0,
"mdio_addr": "0x0203"
},
{
"index": 204,
"local_lane_id": 0,
"system_side": false,
"tx_polarity": 0,
"rx_polarity": 0,
"line_tx_lanemap": 0,
"line_rx_lanemap": 0,
"line_to_system_lanemap": 200,
"mdio_addr": "0x0204"
},
{
"index": 205,
"local_lane_id": 0,
"system_side": false,
"tx_polarity": 0,
"rx_polarity": 0,
"line_tx_lanemap": 0,
"line_rx_lanemap": 0,
"line_to_system_lanemap": 202,
"mdio_addr": "0x0205"
},
{
"index": 206,
"local_lane_id": 0,
"system_side": true,
"tx_polarity": 0,
"rx_polarity": 0,
"line_tx_lanemap": 0,
"line_rx_lanemap": 0,
"line_to_system_lanemap": 0,
"mdio_addr": "0x0206"
},
{
"index": 207,
"local_lane_id": 0,
"system_side": false,
"tx_polarity": 0,
"rx_polarity": 0,
"line_tx_lanemap": 0,
"line_rx_lanemap": 0,
"line_to_system_lanemap": 0,
"mdio_addr": "0x0207"
},
{
"index": 208,
"local_lane_id": 0,
"system_side": true,
"tx_polarity": 0,
"rx_polarity": 0,
"line_tx_lanemap": 0,
"line_rx_lanemap": 0,
"line_to_system_lanemap": 0,
"mdio_addr": "0x0208"
}
],
"ports": [
{
"index": 0,
"mdio_addr": "0x2000",
"system_speed": 20000,
"system_fec": "none",
"system_auto_neg": true,
"system_loopback": "none",
"system_training": false,
"line_speed": 40000,
"line_fec": "none",
"line_auto_neg": true,
"line_media_type": "fiber",
"line_intf_type": "none",
"line_loopback": "none",
"line_training": false,
"line_adver_speed": [],
"line_adver_fec": [],
"line_adver_auto_neg": false,
"line_adver_asym_pause": false,
"line_adver_media_type": "fiber"
},
{
"index": 1,
"mdio_addr": "0x3000",
"system_speed": 20000,
"system_fec": "none",
"system_auto_neg": true,
"system_loopback": "none",
"system_training": false,
"line_speed": 40000,
"line_fec": "none",
"line_auto_neg": true,
"line_media_type": "fiber",
"line_intf_type": "none",
"line_loopback": "none",
"line_training": false,
"line_adver_speed": [],
"line_adver_fec": [],
"line_adver_auto_neg": false,
"line_adver_asym_pause": false,
"line_adver_media_type": "fiber"
},
{
"index": 2,
"mdio_addr": "0x4000",
"system_speed": 20000,
"system_fec": "none",
"system_auto_neg": true,
"system_loopback": "none",
"system_training": false,
"line_speed": 40000,
"line_fec": "none",
"line_auto_neg": true,
"line_media_type": "fiber",
"line_intf_type": "none",
"line_loopback": "none",
"line_training": false,
"line_adver_speed": [],
"line_adver_fec": [],
"line_adver_auto_neg": false,
"line_adver_asym_pause": false,
"line_adver_media_type": "fiber"
}
]
}

View File

@ -0,0 +1,33 @@
# name lanes alias index speed
Ethernet0 25,26,27,28 fortyGigE0/0 0 40000
Ethernet4 29,30,31,32 fortyGigE0/4 1 40000
Ethernet8 33,34,35,36 fortyGigE0/8 2 40000
Ethernet12 37,38,39,40 fortyGigE0/12 3 40000
Ethernet16 45,46,47,48 fortyGigE0/16 4 40000
Ethernet20 41,42,43,44 fortyGigE0/20 5 40000
Ethernet24 1,2,3,4 fortyGigE0/24 6 40000
Ethernet28 5,6,7,8 fortyGigE0/28 7 40000
Ethernet32 13,14,15,16 fortyGigE0/32 8 40000
Ethernet36 9,10,11,12 fortyGigE0/36 9 40000
Ethernet40 17,18,19,20 fortyGigE0/40 10 40000
Ethernet44 21,22,23,24 fortyGigE0/44 11 40000
Ethernet48 53,54,55,56 fortyGigE0/48 12 40000
Ethernet52 49,50,51,52 fortyGigE0/52 13 40000
Ethernet56 57,58,59,60 fortyGigE0/56 14 40000
Ethernet60 61,62,63,64 fortyGigE0/60 15 40000
Ethernet64 69,70,71,72 fortyGigE0/64 16 40000
Ethernet68 65,66,67,68 fortyGigE0/68 17 40000
Ethernet72 73,74,75,76 fortyGigE0/72 18 40000
Ethernet76 77,78,79,80 fortyGigE0/76 19 40000
Ethernet80 109,110,111,112 fortyGigE0/80 20 40000
Ethernet84 105,106,107,108 fortyGigE0/84 21 40000
Ethernet88 113,114,115,116 fortyGigE0/88 22 40000
Ethernet92 117,118,119,120 fortyGigE0/92 23 40000
Ethernet96 125,126,127,128 fortyGigE0/96 24 40000
Ethernet100 121,122,123,124 fortyGigE0/100 25 40000
Ethernet104 81,82,83,84 fortyGigE0/104 26 40000
Ethernet108 85,86,87,88 fortyGigE0/108 27 40000
Ethernet112 93,94,95,96 fortyGigE0/112 28 40000
Ethernet116 89,90,91,92 fortyGigE0/116 29 40000
Ethernet120 101,102,103,104 fortyGigE0/120 30 40000
Ethernet124 97,98,99,100 fortyGigE0/124 31 40000

View File

@ -0,0 +1 @@
{%- include 'qos_config.j2' %}

View File

@ -0,0 +1,5 @@
SAI_WARM_BOOT_READ_FILE=/var/cache/sai_warmboot.bin
SAI_WARM_BOOT_WRITE_FILE=/var/cache/sai_warmboot.bin
SAI_VS_SWITCH_TYPE=SAI_VS_SWITCH_TYPE_BCM56850
SAI_VS_HOSTIF_USE_TAP_DEVICE=true
SAI_VS_INTERFACE_LANE_MAP_FILE=/usr/share/sonic/hwsku/lanemap.ini

View File

@ -0,0 +1,646 @@
# Old LPM only configuration
# l2_mem_entries=163840
# l3_mem_entries=90112
# l3_alpm_enable=0
# ipv6_lpm_128b_enable=0
#
# ALPM enable
l3_alpm_enable=2
ipv6_lpm_128b_enable=1
l2_mem_entries=32768
l3_mem_entries=16384
# From old config file
os=unix
higig2_hdr_mode=1
# Parity
parity_correction=1
parity_enable=1
stat_if_parity_enable=0
#
bcm_num_cos=8
bcm_stat_interval=2000000
l2xmsg_hostbuf_size=8192
l2xmsg_mode=1
lls_num_l2uc=12
max_vp_lags=0
miim_intr_enable=0
mmu_lossless=0
module_64ports=0
schan_intr_enable=0
stable_size=0x2000000
tdma_timeout_usec=5000000
pbmp_oversubscribe=0x000007fffffffffffffffffffffffffe
pbmp_xport_xe=0x000007fffffffffffffffffffffffffe
# Ports configuration
# xe0 (40G)
portmap_1=25:40
xgxs_rx_lane_map_1=0x213
xgxs_tx_lane_map_1=0x2031
phy_xaui_rx_polarity_flip_1=0xe
phy_xaui_tx_polarity_flip_1=0x2
serdes_driver_current_lane0_xe0=0x5
serdes_driver_current_lane1_xe0=0x5
serdes_driver_current_lane2_xe0=0x5
serdes_driver_current_lane3_xe0=0x5
serdes_pre_driver_current_lane0_xe0=0x5
serdes_pre_driver_current_lane1_xe0=0x5
serdes_pre_driver_current_lane2_xe0=0x5
serdes_pre_driver_current_lane3_xe0=0x5
serdes_preemphasis_lane0_xe0=0xcad0
serdes_preemphasis_lane1_xe0=0xc6e0
serdes_preemphasis_lane2_xe0=0xc6e0
serdes_preemphasis_lane3_xe0=0xd2b0
# xe1 (40G)
portmap_2=29:40
xgxs_rx_lane_map_2=0x213
xgxs_tx_lane_map_2=0x213
phy_xaui_rx_polarity_flip_2=0xc
phy_xaui_tx_polarity_flip_2=0x9
serdes_driver_current_lane0_xe1=0x6
serdes_driver_current_lane1_xe1=0x7
serdes_driver_current_lane2_xe1=0x6
serdes_driver_current_lane3_xe1=0x6
serdes_pre_driver_current_lane0_xe1=0x6
serdes_pre_driver_current_lane1_xe1=0x7
serdes_pre_driver_current_lane2_xe1=0x6
serdes_pre_driver_current_lane3_xe1=0x6
serdes_preemphasis_lane0_xe1=0xc2f0
serdes_preemphasis_lane1_xe1=0xd2b0
serdes_preemphasis_lane2_xe1=0xc6e0
serdes_preemphasis_lane3_xe1=0xc2f0
# xe2 (40G)
portmap_3=33:40
xgxs_rx_lane_map_3=0x213
xgxs_tx_lane_map_3=0x132
phy_xaui_rx_polarity_flip_3=0xe
phy_xaui_tx_polarity_flip_3=0x2
serdes_driver_current_lane0_xe2=0x4
serdes_driver_current_lane1_xe2=0x4
serdes_driver_current_lane2_xe2=0x4
serdes_driver_current_lane3_xe2=0x4
serdes_pre_driver_current_lane0_xe2=0x4
serdes_pre_driver_current_lane1_xe2=0x4
serdes_pre_driver_current_lane2_xe2=0x4
serdes_pre_driver_current_lane3_xe2=0x4
serdes_preemphasis_lane0_xe2=0xc6e0
serdes_preemphasis_lane1_xe2=0xc6e0
serdes_preemphasis_lane2_xe2=0xc6e0
serdes_preemphasis_lane3_xe2=0xc6e0
# xe3 (40G)
portmap_4=37:40
xgxs_rx_lane_map_4=0x213
xgxs_tx_lane_map_4=0x1203
phy_xaui_rx_polarity_flip_4=0x3
phy_xaui_tx_polarity_flip_4=0xe
serdes_driver_current_lane0_xe3=0x4
serdes_driver_current_lane1_xe3=0x4
serdes_driver_current_lane2_xe3=0x4
serdes_driver_current_lane3_xe3=0x4
serdes_pre_driver_current_lane0_xe3=0x4
serdes_pre_driver_current_lane1_xe3=0x4
serdes_pre_driver_current_lane2_xe3=0x4
serdes_pre_driver_current_lane3_xe3=0x4
serdes_preemphasis_lane0_xe3=0xcad0
serdes_preemphasis_lane1_xe3=0xcad0
serdes_preemphasis_lane2_xe3=0xc2f0
serdes_preemphasis_lane3_xe3=0xc2f0
# xe4 (40G)
portmap_5=45:40
xgxs_rx_lane_map_5=0x213
xgxs_tx_lane_map_5=0x213
phy_xaui_rx_polarity_flip_5=0xe
phy_xaui_tx_polarity_flip_5=0x8
serdes_driver_current_lane0_xe4=0x4
serdes_driver_current_lane1_xe4=0x4
serdes_driver_current_lane2_xe4=0x4
serdes_driver_current_lane3_xe4=0x4
serdes_pre_driver_current_lane0_xe4=0x4
serdes_pre_driver_current_lane1_xe4=0x4
serdes_pre_driver_current_lane2_xe4=0x4
serdes_pre_driver_current_lane3_xe4=0x4
serdes_preemphasis_lane0_xe4=0xc2f0
serdes_preemphasis_lane1_xe4=0xc2f0
serdes_preemphasis_lane2_xe4=0xc2f0
serdes_preemphasis_lane3_xe4=0xc2f0
# xe5 (40G)
portmap_6=41:40
xgxs_rx_lane_map_6=0x213
xgxs_tx_lane_map_6=0x3021
phy_xaui_rx_polarity_flip_6=0x3
phy_xaui_tx_polarity_flip_6=0xb
serdes_driver_current_lane0_xe5=0x4
serdes_driver_current_lane1_xe5=0x4
serdes_driver_current_lane2_xe5=0x4
serdes_driver_current_lane3_xe5=0x4
serdes_pre_driver_current_lane0_xe5=0x4
serdes_pre_driver_current_lane1_xe5=0x4
serdes_pre_driver_current_lane2_xe5=0x4
serdes_pre_driver_current_lane3_xe5=0x4
serdes_preemphasis_lane0_xe5=0xc6e0
serdes_preemphasis_lane1_xe5=0xc2f0
serdes_preemphasis_lane2_xe5=0xc2f0
serdes_preemphasis_lane3_xe5=0xcad0
# xe6 (40G)
portmap_7=1:40
xgxs_rx_lane_map_7=0x213
xgxs_tx_lane_map_7=0x2031
phy_xaui_rx_polarity_flip_7=0xe
phy_xaui_tx_polarity_flip_7=0xd
serdes_driver_current_lane0_xe6=0x5
serdes_driver_current_lane1_xe6=0x5
serdes_driver_current_lane2_xe6=0x5
serdes_driver_current_lane3_xe6=0x5
serdes_pre_driver_current_lane0_xe6=0x5
serdes_pre_driver_current_lane1_xe6=0x5
serdes_pre_driver_current_lane2_xe6=0x5
serdes_pre_driver_current_lane3_xe6=0x5
serdes_preemphasis_lane0_xe6=0xc6e0
serdes_preemphasis_lane1_xe6=0xcad0
serdes_preemphasis_lane2_xe6=0xc6e0
serdes_preemphasis_lane3_xe6=0xcad0
# xe7 (40G)
portmap_8=5:40
xgxs_rx_lane_map_8=0x213
xgxs_tx_lane_map_8=0x1203
phy_xaui_rx_polarity_flip_8=0xc
phy_xaui_tx_polarity_flip_8=0x1
serdes_driver_current_lane0_xe7=0x4
serdes_driver_current_lane1_xe7=0x4
serdes_driver_current_lane2_xe7=0x4
serdes_driver_current_lane3_xe7=0x4
serdes_pre_driver_current_lane0_xe7=0x4
serdes_pre_driver_current_lane1_xe7=0x4
serdes_pre_driver_current_lane2_xe7=0x4
serdes_pre_driver_current_lane3_xe7=0x4
serdes_preemphasis_lane0_xe7=0xc6e0
serdes_preemphasis_lane1_xe7=0xc6e0
serdes_preemphasis_lane2_xe7=0xc6e0
serdes_preemphasis_lane3_xe7=0xc6e0
# xe8 (40G)
portmap_9=13:40
xgxs_rx_lane_map_9=0x213
xgxs_tx_lane_map_9=0x132
phy_xaui_rx_polarity_flip_9=0xe
phy_xaui_tx_polarity_flip_9=0x0
serdes_driver_current_lane0_xe8=0x2
serdes_driver_current_lane1_xe8=0x3
serdes_driver_current_lane2_xe8=0x2
serdes_driver_current_lane3_xe8=0x2
serdes_pre_driver_current_lane0_xe8=0x2
serdes_pre_driver_current_lane1_xe8=0x3
serdes_pre_driver_current_lane2_xe8=0x2
serdes_pre_driver_current_lane3_xe8=0x2
serdes_preemphasis_lane0_xe8=0xb270
serdes_preemphasis_lane1_xe8=0xbb10
serdes_preemphasis_lane2_xe8=0xb720
serdes_preemphasis_lane3_xe8=0xb720
# xe9 (40G)
portmap_10=9:40
xgxs_rx_lane_map_10=0x3120
xgxs_tx_lane_map_10=0x3021
phy_xaui_rx_polarity_flip_10=0x0
phy_xaui_tx_polarity_flip_10=0x4
serdes_driver_current_lane0_xe9=0x3
serdes_driver_current_lane1_xe9=0x3
serdes_driver_current_lane2_xe9=0x3
serdes_driver_current_lane3_xe9=0x3
serdes_pre_driver_current_lane0_xe9=0x3
serdes_pre_driver_current_lane1_xe9=0x3
serdes_pre_driver_current_lane2_xe9=0x3
serdes_pre_driver_current_lane3_xe9=0x3
serdes_preemphasis_lane0_xe9=0xc2f0
serdes_preemphasis_lane1_xe9=0xc6e0
serdes_preemphasis_lane2_xe9=0xbf00
serdes_preemphasis_lane3_xe9=0xc2f0
# xe10 (40G)
portmap_11=17:40
xgxs_rx_lane_map_11=0x213
xgxs_tx_lane_map_11=0x132
phy_xaui_rx_polarity_flip_11=0xe
phy_xaui_tx_polarity_flip_11=0x0
serdes_driver_current_lane0_xe10=0x2
serdes_driver_current_lane1_xe10=0x2
serdes_driver_current_lane2_xe10=0x2
serdes_driver_current_lane3_xe10=0x2
serdes_pre_driver_current_lane0_xe10=0x2
serdes_pre_driver_current_lane1_xe10=0x2
serdes_pre_driver_current_lane2_xe10=0x2
serdes_pre_driver_current_lane3_xe10=0x2
serdes_preemphasis_lane0_xe10=0xb330
serdes_preemphasis_lane1_xe10=0xbb10
serdes_preemphasis_lane2_xe10=0xbb10
serdes_preemphasis_lane3_xe10=0xbb10
# xe11 (40G)
portmap_12=21:40
xgxs_rx_lane_map_12=0x123
xgxs_tx_lane_map_12=0x1203
phy_xaui_rx_polarity_flip_12=0xc
phy_xaui_tx_polarity_flip_12=0xe
serdes_driver_current_lane0_xe11=0x2
serdes_driver_current_lane1_xe11=0x2
serdes_driver_current_lane2_xe11=0x2
serdes_driver_current_lane3_xe11=0x2
serdes_pre_driver_current_lane0_xe11=0x2
serdes_pre_driver_current_lane1_xe11=0x2
serdes_pre_driver_current_lane2_xe11=0x2
serdes_pre_driver_current_lane3_xe11=0x2
serdes_preemphasis_lane0_xe11=0xb330
serdes_preemphasis_lane1_xe11=0xb330
serdes_preemphasis_lane2_xe11=0xb330
serdes_preemphasis_lane3_xe11=0xb330
# xe12 (40G)
portmap_13=53:40
xgxs_rx_lane_map_13=0x213
xgxs_tx_lane_map_13=0x231
phy_xaui_rx_polarity_flip_13=0x1
phy_xaui_tx_polarity_flip_13=0x0
serdes_driver_current_lane0_xe12=0x2
serdes_driver_current_lane1_xe12=0x2
serdes_driver_current_lane2_xe12=0x2
serdes_driver_current_lane3_xe12=0x2
serdes_pre_driver_current_lane0_xe12=0x2
serdes_pre_driver_current_lane1_xe12=0x2
serdes_pre_driver_current_lane2_xe12=0x2
serdes_pre_driver_current_lane3_xe12=0x2
serdes_preemphasis_lane0_xe12=0xaf40
serdes_preemphasis_lane1_xe12=0xaf40
serdes_preemphasis_lane2_xe12=0xaf40
serdes_preemphasis_lane3_xe12=0xaf40
# xe13 (40G)
portmap_14=49:40
xgxs_rx_lane_map_14=0x1302
xgxs_tx_lane_map_14=0x2031
phy_xaui_rx_polarity_flip_14=0xb
phy_xaui_tx_polarity_flip_14=0x3
serdes_driver_current_lane0_xe13=0x2
serdes_driver_current_lane1_xe13=0x2
serdes_driver_current_lane2_xe13=0x2
serdes_driver_current_lane3_xe13=0x2
serdes_pre_driver_current_lane0_xe13=0x2
serdes_pre_driver_current_lane1_xe13=0x2
serdes_pre_driver_current_lane2_xe13=0x2
serdes_pre_driver_current_lane3_xe13=0x2
serdes_preemphasis_lane0_xe13=0xa760
serdes_preemphasis_lane1_xe13=0xa760
serdes_preemphasis_lane2_xe13=0xa760
serdes_preemphasis_lane3_xe13=0xa760
# xe14 (40G)
portmap_15=57:40
xgxs_rx_lane_map_15=0x213
xgxs_tx_lane_map_15=0x2031
phy_xaui_rx_polarity_flip_15=0x1
phy_xaui_tx_polarity_flip_15=0x0
serdes_driver_current_lane0_xe14=0x1
serdes_driver_current_lane1_xe14=0x1
serdes_driver_current_lane2_xe14=0x1
serdes_driver_current_lane3_xe14=0x1
serdes_pre_driver_current_lane0_xe14=0x1
serdes_pre_driver_current_lane1_xe14=0x1
serdes_pre_driver_current_lane2_xe14=0x1
serdes_pre_driver_current_lane3_xe14=0x1
serdes_preemphasis_lane0_xe14=0xa760
serdes_preemphasis_lane1_xe14=0xa760
serdes_preemphasis_lane2_xe14=0xa760
serdes_preemphasis_lane3_xe14=0xa760
# xe15 (40G)
portmap_16=61:40
xgxs_rx_lane_map_16=0x132
xgxs_tx_lane_map_16=0x213
phy_xaui_rx_polarity_flip_16=0x0
phy_xaui_tx_polarity_flip_16=0x0
serdes_driver_current_lane0_xe15=0x2
serdes_driver_current_lane1_xe15=0x2
serdes_driver_current_lane2_xe15=0x2
serdes_driver_current_lane3_xe15=0x2
serdes_pre_driver_current_lane0_xe15=0x2
serdes_pre_driver_current_lane1_xe15=0x2
serdes_pre_driver_current_lane2_xe15=0x2
serdes_pre_driver_current_lane3_xe15=0x2
serdes_preemphasis_lane0_xe15=0xa760
serdes_preemphasis_lane1_xe15=0xa760
serdes_preemphasis_lane2_xe15=0xa760
serdes_preemphasis_lane3_xe15=0xa760
# xe16 (40G)
portmap_17=69:40
xgxs_rx_lane_map_17=0x213
xgxs_tx_lane_map_17=0x2130
phy_xaui_rx_polarity_flip_17=0x1
phy_xaui_tx_polarity_flip_17=0xf
serdes_driver_current_lane0_xe16=0x1
serdes_driver_current_lane1_xe16=0x1
serdes_driver_current_lane2_xe16=0x1
serdes_driver_current_lane3_xe16=0x1
serdes_pre_driver_current_lane0_xe16=0x1
serdes_pre_driver_current_lane1_xe16=0x1
serdes_pre_driver_current_lane2_xe16=0x1
serdes_pre_driver_current_lane3_xe16=0x1
serdes_preemphasis_lane0_xe16=0xa760
serdes_preemphasis_lane1_xe16=0xa760
serdes_preemphasis_lane2_xe16=0xa760
serdes_preemphasis_lane3_xe16=0xa760
# xe17 (40G)
portmap_18=65:40
xgxs_rx_lane_map_18=0x132
xgxs_tx_lane_map_18=0x2031
phy_xaui_rx_polarity_flip_18=0x3
phy_xaui_tx_polarity_flip_18=0x9
serdes_driver_current_lane0_xe17=0x1
serdes_driver_current_lane1_xe17=0x1
serdes_driver_current_lane2_xe17=0x1
serdes_driver_current_lane3_xe17=0x1
serdes_pre_driver_current_lane0_xe17=0x1
serdes_pre_driver_current_lane1_xe17=0x1
serdes_pre_driver_current_lane2_xe17=0x1
serdes_pre_driver_current_lane3_xe17=0x1
serdes_preemphasis_lane0_xe17=0xa370
serdes_preemphasis_lane1_xe17=0xa370
serdes_preemphasis_lane2_xe17=0xa370
serdes_preemphasis_lane3_xe17=0xa370
# xe18 (40G)
portmap_19=73:40
xgxs_rx_lane_map_19=0x213
xgxs_tx_lane_map_19=0x2031
phy_xaui_rx_polarity_flip_19=0x1
phy_xaui_tx_polarity_flip_19=0x0
serdes_driver_current_lane0_xe18=0x2
serdes_driver_current_lane1_xe18=0x2
serdes_driver_current_lane2_xe18=0x2
serdes_driver_current_lane3_xe18=0x2
serdes_pre_driver_current_lane0_xe18=0x2
serdes_pre_driver_current_lane1_xe18=0x2
serdes_pre_driver_current_lane2_xe18=0x2
serdes_pre_driver_current_lane3_xe18=0x2
serdes_preemphasis_lane0_xe18=0xa760
serdes_preemphasis_lane1_xe18=0xa760
serdes_preemphasis_lane2_xe18=0xa760
serdes_preemphasis_lane3_xe18=0xa760
# xe19 (40G)
portmap_20=77:40
xgxs_rx_lane_map_20=0x123
xgxs_tx_lane_map_20=0x1203
phy_xaui_rx_polarity_flip_20=0x3
phy_xaui_tx_polarity_flip_20=0xe
serdes_driver_current_lane0_xe19=0x2
serdes_driver_current_lane1_xe19=0x2
serdes_driver_current_lane2_xe19=0x2
serdes_driver_current_lane3_xe19=0x2
serdes_pre_driver_current_lane0_xe19=0x2
serdes_pre_driver_current_lane1_xe19=0x2
serdes_pre_driver_current_lane2_xe19=0x2
serdes_pre_driver_current_lane3_xe19=0x2
serdes_preemphasis_lane0_xe19=0xaf40
serdes_preemphasis_lane1_xe19=0xaf40
serdes_preemphasis_lane2_xe19=0xaf40
serdes_preemphasis_lane3_xe19=0xaf40
# xe20 (40G)
portmap_21=109:40
xgxs_rx_lane_map_21=0x132
xgxs_tx_lane_map_21=0x132
phy_xaui_rx_polarity_flip_21=0x8
phy_xaui_tx_polarity_flip_21=0x0
serdes_driver_current_lane0_xe20=0x1
serdes_driver_current_lane1_xe20=0x1
serdes_driver_current_lane2_xe20=0x1
serdes_driver_current_lane3_xe20=0x2
serdes_pre_driver_current_lane0_xe20=0x1
serdes_pre_driver_current_lane1_xe20=0x1
serdes_pre_driver_current_lane2_xe20=0x1
serdes_pre_driver_current_lane3_xe20=0x2
serdes_preemphasis_lane0_xe20=0xb330
serdes_preemphasis_lane1_xe20=0xb330
serdes_preemphasis_lane2_xe20=0xb330
serdes_preemphasis_lane3_xe20=0xbff0
# xe21 (40G)
portmap_22=105:40
xgxs_rx_lane_map_22=0x1320
xgxs_tx_lane_map_22=0x3021
phy_xaui_rx_polarity_flip_22=0xd
phy_xaui_tx_polarity_flip_22=0xb
serdes_driver_current_lane0_xe21=0x1
serdes_driver_current_lane1_xe21=0x1
serdes_driver_current_lane2_xe21=0x1
serdes_driver_current_lane3_xe21=0x1
serdes_pre_driver_current_lane0_xe21=0x1
serdes_pre_driver_current_lane1_xe21=0x1
serdes_pre_driver_current_lane2_xe21=0x1
serdes_pre_driver_current_lane3_xe21=0x1
serdes_preemphasis_lane0_xe21=0xb330
serdes_preemphasis_lane1_xe21=0xb330
serdes_preemphasis_lane2_xe21=0xb330
serdes_preemphasis_lane3_xe21=0xb330
# xe22 (40G)
portmap_23=113:40
xgxs_rx_lane_map_23=0x132
xgxs_tx_lane_map_23=0x132
phy_xaui_rx_polarity_flip_23=0x8
phy_xaui_tx_polarity_flip_23=0x0
serdes_driver_current_lane0_xe22=0x1
serdes_driver_current_lane1_xe22=0x1
serdes_driver_current_lane2_xe22=0x1
serdes_driver_current_lane3_xe22=0x1
serdes_pre_driver_current_lane0_xe22=0x1
serdes_pre_driver_current_lane1_xe22=0x1
serdes_pre_driver_current_lane2_xe22=0x1
serdes_pre_driver_current_lane3_xe22=0x1
serdes_preemphasis_lane0_xe22=0xbb10
serdes_preemphasis_lane1_xe22=0xbb10
serdes_preemphasis_lane2_xe22=0xbb10
serdes_preemphasis_lane3_xe22=0xc2f0
# xe23 (40G)
portmap_24=117:40
xgxs_rx_lane_map_24=0x231
xgxs_tx_lane_map_24=0x1203
phy_xaui_rx_polarity_flip_24=0x3
phy_xaui_tx_polarity_flip_24=0xe
serdes_driver_current_lane0_xe23=0x3
serdes_driver_current_lane1_xe23=0x5
serdes_driver_current_lane2_xe23=0x3
serdes_driver_current_lane3_xe23=0x3
serdes_pre_driver_current_lane0_xe23=0x3
serdes_pre_driver_current_lane1_xe23=0x5
serdes_pre_driver_current_lane2_xe23=0x3
serdes_pre_driver_current_lane3_xe23=0x3
serdes_preemphasis_lane0_xe23=0xc6e0
serdes_preemphasis_lane1_xe23=0xc6e0
serdes_preemphasis_lane2_xe23=0xc6e0
serdes_preemphasis_lane3_xe23=0xc6e0
# xe24 (40G)
portmap_25=125:40
xgxs_rx_lane_map_25=0x132
xgxs_tx_lane_map_25=0x132
phy_xaui_rx_polarity_flip_25=0x8
phy_xaui_tx_polarity_flip_25=0x0
serdes_driver_current_lane0_xe24=0x4
serdes_driver_current_lane1_xe24=0x4
serdes_driver_current_lane2_xe24=0x4
serdes_driver_current_lane3_xe24=0x4
serdes_pre_driver_current_lane0_xe24=0x4
serdes_pre_driver_current_lane1_xe24=0x4
serdes_pre_driver_current_lane2_xe24=0x4
serdes_pre_driver_current_lane3_xe24=0x4
serdes_preemphasis_lane0_xe24=0xc6e0
serdes_preemphasis_lane1_xe24=0xc6e0
serdes_preemphasis_lane2_xe24=0xc6e0
serdes_preemphasis_lane3_xe24=0xcec0
# xe25 (40G)
portmap_26=121:40
xgxs_rx_lane_map_26=0x1320
xgxs_tx_lane_map_26=0x3021
phy_xaui_rx_polarity_flip_26=0xd
phy_xaui_tx_polarity_flip_26=0xb
serdes_driver_current_lane0_xe25=0x4
serdes_driver_current_lane1_xe25=0x4
serdes_driver_current_lane2_xe25=0x4
serdes_driver_current_lane3_xe25=0x4
serdes_pre_driver_current_lane0_xe25=0x4
serdes_pre_driver_current_lane1_xe25=0x4
serdes_pre_driver_current_lane2_xe25=0x4
serdes_pre_driver_current_lane3_xe25=0x4
serdes_preemphasis_lane0_xe25=0xc6e0
serdes_preemphasis_lane1_xe25=0xc6e0
serdes_preemphasis_lane2_xe25=0xc6e0
serdes_preemphasis_lane3_xe25=0xc6e0
# xe26 (40G)
portmap_27=81:40
xgxs_rx_lane_map_27=0x1320
xgxs_tx_lane_map_27=0x2031
phy_xaui_rx_polarity_flip_27=0x1
phy_xaui_tx_polarity_flip_27=0x2
serdes_driver_current_lane0_xe26=0x2
serdes_driver_current_lane1_xe26=0x2
serdes_driver_current_lane2_xe26=0x2
serdes_driver_current_lane3_xe26=0x2
serdes_pre_driver_current_lane0_xe26=0x2
serdes_pre_driver_current_lane1_xe26=0x2
serdes_pre_driver_current_lane2_xe26=0x2
serdes_pre_driver_current_lane3_xe26=0x2
serdes_preemphasis_lane0_xe26=0xbb10
serdes_preemphasis_lane1_xe26=0xbb10
serdes_preemphasis_lane2_xe26=0xbf00
serdes_preemphasis_lane3_xe26=0xbb10
# xe27 (40G)
portmap_28=85:40
xgxs_rx_lane_map_28=0x213
xgxs_tx_lane_map_28=0x1203
phy_xaui_rx_polarity_flip_28=0xc
phy_xaui_tx_polarity_flip_28=0xe
serdes_driver_current_lane0_xe27=0x4
serdes_driver_current_lane1_xe27=0x5
serdes_driver_current_lane2_xe27=0x4
serdes_driver_current_lane3_xe27=0x5
serdes_pre_driver_current_lane0_xe27=0x4
serdes_pre_driver_current_lane1_xe27=0x5
serdes_pre_driver_current_lane2_xe27=0x4
serdes_pre_driver_current_lane3_xe27=0x5
serdes_preemphasis_lane0_xe27=0xc2f0
serdes_preemphasis_lane1_xe27=0xc6e0
serdes_preemphasis_lane2_xe27=0xc6e0
serdes_preemphasis_lane3_xe27=0xc6e0
# xe28 (40G)
portmap_29=93:40
xgxs_rx_lane_map_29=0x1320
xgxs_tx_lane_map_29=0x2031
phy_xaui_rx_polarity_flip_29=0x1
phy_xaui_tx_polarity_flip_29=0x2
serdes_driver_current_lane0_xe28=0x4
serdes_driver_current_lane1_xe28=0x4
serdes_driver_current_lane2_xe28=0x4
serdes_driver_current_lane3_xe28=0x4
serdes_pre_driver_current_lane0_xe28=0x4
serdes_pre_driver_current_lane1_xe28=0x4
serdes_pre_driver_current_lane2_xe28=0x4
serdes_pre_driver_current_lane3_xe28=0x4
serdes_preemphasis_lane0_xe28=0xc2f0
serdes_preemphasis_lane1_xe28=0xc2f0
serdes_preemphasis_lane2_xe28=0xc2f0
serdes_preemphasis_lane3_xe28=0xc2f0
# xe29 (40G)
portmap_30=89:40
xgxs_rx_lane_map_30=0x1320
xgxs_tx_lane_map_30=0x3021
phy_xaui_rx_polarity_flip_30=0x2
phy_xaui_tx_polarity_flip_30=0xb
serdes_driver_current_lane0_xe29=0x4
serdes_driver_current_lane1_xe29=0x4
serdes_driver_current_lane2_xe29=0x4
serdes_driver_current_lane3_xe29=0x4
serdes_pre_driver_current_lane0_xe29=0x4
serdes_pre_driver_current_lane1_xe29=0x4
serdes_pre_driver_current_lane2_xe29=0x4
serdes_pre_driver_current_lane3_xe29=0x4
serdes_preemphasis_lane0_xe29=0xcad0
serdes_preemphasis_lane1_xe29=0xc6e0
serdes_preemphasis_lane2_xe29=0xc6e0
serdes_preemphasis_lane3_xe29=0xc6e0
# xe30 (40G)
portmap_31=101:40
xgxs_rx_lane_map_31=0x1320
xgxs_tx_lane_map_31=0x1203
phy_xaui_rx_polarity_flip_31=0x1
phy_xaui_tx_polarity_flip_31=0x6
serdes_driver_current_lane0_xe30=0x6
serdes_driver_current_lane1_xe30=0x6
serdes_driver_current_lane2_xe30=0x6
serdes_driver_current_lane3_xe30=0x7
serdes_pre_driver_current_lane0_xe30=0x6
serdes_pre_driver_current_lane1_xe30=0x6
serdes_pre_driver_current_lane2_xe30=0x6
serdes_pre_driver_current_lane3_xe30=0x7
serdes_preemphasis_lane0_xe30=0xcec0
serdes_preemphasis_lane1_xe30=0xcec0
serdes_preemphasis_lane2_xe30=0xcad0
serdes_preemphasis_lane3_xe30=0xc6e0
# xe31 (40G)
portmap_32=97:40
xgxs_rx_lane_map_32=0x213
xgxs_tx_lane_map_32=0x2031
phy_xaui_rx_polarity_flip_32=0xc
phy_xaui_tx_polarity_flip_32=0x3
serdes_driver_current_lane0_xe31=0x5
serdes_driver_current_lane1_xe31=0x5
serdes_driver_current_lane2_xe31=0x5
serdes_driver_current_lane3_xe31=0x5
serdes_pre_driver_current_lane0_xe31=0x5
serdes_pre_driver_current_lane1_xe31=0x5
serdes_pre_driver_current_lane2_xe31=0x5
serdes_pre_driver_current_lane3_xe31=0x5
serdes_preemphasis_lane0_xe31=0xcad0
serdes_preemphasis_lane1_xe31=0xcad0
serdes_preemphasis_lane2_xe31=0xcad0
serdes_preemphasis_lane3_xe31=0xcad0

View File

@ -57,6 +57,21 @@
"id" : 8,
"separator": "|",
"instance" : "redis"
},
"GB_ASIC_DB" : {
"id" : 9,
"separator": "|",
"instance" : "redis"
},
"GB_COUNTERS_DB" : {
"id" : 10,
"separator": "|",
"instance" : "redis"
},
"GB_FLEX_COUNTER_DB" : {
"id" : 11,
"separator": "|",
"instance" : "redis"
}
},
"VERSION" : "1.0"

View File

@ -27,6 +27,18 @@ stdout_logfile=syslog
stderr_logfile=syslog
dependent_startup=true
[program:gearsyncd]
command=/usr/bin/gearsyncd -p /usr/share/sonic/hwsku/gearbox_config.json
priority=3
autostart=false
autorestart=false
startsecs=0
startretries=0
stdout_logfile=syslog
stderr_logfile=syslog
dependent_startup=true
dependent_startup_wait_for=rsyslogd:running
[program:portsyncd]
command=/usr/bin/portsyncd
priority=3

View File

@ -0,0 +1,18 @@
[Unit]
Description=gbsyncd service
Requires=database.service updategraph.service
ConditionPathExists=!/usr/share/sonic/hwsku/gearbox_config.json
After=database.service updategraph.service
After=interfaces-config.service
After=swss.service
Before=ntp-config.service
[Service]
User=root
Environment=sonic_asic_platform={{ sonic_asic_platform }}
ExecStartPre=/usr/local/bin/gbsyncd.sh start
ExecStart=/usr/local/bin/gbsyncd.sh wait
ExecStop=/usr/local/bin/gbsyncd.sh stop
[Install]
WantedBy=multi-user.target

View File

@ -1,6 +1,6 @@
#!/bin/bash
## This script is to automate loading of vendor specific docker images
## and instalation of configuration files and vendor specific packages
## and installation of configuration files and vendor specific packages
## to debian file system.
##
## USAGE:
@ -535,6 +535,8 @@ sudo LANG=C chroot $FILESYSTEM_ROOT umount -lf /sys
# Copy service scripts (swss, syncd, bgp, radv)
sudo LANG=C cp $SCRIPTS_DIR/swss.sh $FILESYSTEM_ROOT/usr/local/bin/swss.sh
sudo LANG=C cp $SCRIPTS_DIR/syncd.sh $FILESYSTEM_ROOT/usr/local/bin/syncd.sh
sudo LANG=C cp $SCRIPTS_DIR/syncd_common.sh $FILESYSTEM_ROOT/usr/local/bin/syncd_common.sh
sudo LANG=C cp $SCRIPTS_DIR/gbsyncd.sh $FILESYSTEM_ROOT/usr/local/bin/gbsyncd.sh
sudo LANG=C cp $SCRIPTS_DIR/bgp.sh $FILESYSTEM_ROOT/usr/local/bin/bgp.sh
sudo LANG=C cp $SCRIPTS_DIR/radv.sh $FILESYSTEM_ROOT/usr/local/bin/radv.sh

45
files/scripts/gbsyncd.sh Executable file
View File

@ -0,0 +1,45 @@
#!/bin/bash
. /usr/local/bin/syncd_common.sh
function startplatform() {
:
}
function waitplatform() {
:
}
function stopplatform1() {
:
}
function stopplatform2() {
:
}
OP=$1
DEV=$2
SERVICE="gbsyncd"
PEER="swss"
DEBUGLOG="/tmp/swss-gbsyncd-debug$DEV.log"
LOCKFILE="/tmp/swss-gbsyncd-lock$DEV"
NAMESPACE_PREFIX="asic"
if [ "$DEV" ]; then
NET_NS="$NAMESPACE_PREFIX$DEV" #name of the network namespace
SONIC_DB_CLI="sonic-db-cli -n $NET_NS"
else
NET_NS=""
SONIC_DB_CLI="sonic-db-cli"
fi
case "$1" in
start|wait|stop)
$1
;;
*)
echo "Usage: $0 {start|wait|stop}"
exit 1
;;
esac

View File

@ -1,96 +1,8 @@
#!/bin/bash
. /usr/local/bin/syncd_common.sh
function debug()
{
/usr/bin/logger $1
/bin/echo `date` "- $1" >> ${DEBUGLOG}
}
function lock_service_state_change()
{
debug "Locking ${LOCKFILE} from ${SERVICE}$DEV service"
exec {LOCKFD}>${LOCKFILE}
/usr/bin/flock -x ${LOCKFD}
trap "/usr/bin/flock -u ${LOCKFD}" 0 2 3 15
debug "Locked ${LOCKFILE} (${LOCKFD}) from ${SERVICE}$DEV service"
}
function unlock_service_state_change()
{
debug "Unlocking ${LOCKFILE} (${LOCKFD}) from ${SERVICE}$DEV service"
/usr/bin/flock -u ${LOCKFD}
}
function check_warm_boot()
{
SYSTEM_WARM_START=`$SONIC_DB_CLI STATE_DB hget "WARM_RESTART_ENABLE_TABLE|system" enable`
SERVICE_WARM_START=`$SONIC_DB_CLI STATE_DB hget "WARM_RESTART_ENABLE_TABLE|${SERVICE}" enable`
# SYSTEM_WARM_START could be empty, always make WARM_BOOT meaningful.
if [[ x"$SYSTEM_WARM_START" == x"true" ]] || [[ x"$SERVICE_WARM_START" == x"true" ]]; then
WARM_BOOT="true"
else
WARM_BOOT="false"
fi
}
function wait_for_database_service()
{
# Wait for redis server start before database clean
until [[ $($SONIC_DB_CLI PING | grep -c PONG) -gt 0 ]]; do
sleep 1;
done
# Wait for configDB initialization
until [[ $($SONIC_DB_CLI CONFIG_DB GET "CONFIG_DB_INITIALIZED") ]];
do sleep 1;
done
}
function getBootType()
{
# same code snippet in files/build_templates/docker_image_ctl.j2
case "$(cat /proc/cmdline)" in
*SONIC_BOOT_TYPE=warm*)
TYPE='warm'
;;
*SONIC_BOOT_TYPE=fastfast*)
TYPE='fastfast'
;;
*SONIC_BOOT_TYPE=fast*|*fast-reboot*)
# check that the key exists
if [[ $($SONIC_DB_CLI STATE_DB GET "FAST_REBOOT|system") == "1" ]]; then
TYPE='fast'
else
TYPE='cold'
fi
;;
*)
TYPE='cold'
esac
echo "${TYPE}"
}
start() {
debug "Starting ${SERVICE}$DEV service..."
lock_service_state_change
mkdir -p /host/warmboot
wait_for_database_service
check_warm_boot
debug "Warm boot flag: ${SERVICE}$DEV ${WARM_BOOT}."
if [[ x"$WARM_BOOT" == x"true" ]]; then
# Leave a mark for syncd scripts running inside docker.
touch /host/warmboot/warm-starting
else
rm -f /host/warmboot/warm-starting
fi
function startplatform() {
# platform specific tasks
@ -119,35 +31,18 @@ start() {
/etc/init.d/xpnet.sh start
fi
fi
# start service docker
/usr/bin/${SERVICE}.sh start $DEV
debug "Started ${SERVICE} service..."
unlock_service_state_change
}
wait() {
function waitplatform() {
if [[ x"$sonic_asic_platform" == x"mellanox" ]]; then
debug "Starting pmon service..."
/bin/systemctl start pmon
debug "Started pmon service"
fi
/usr/bin/${SERVICE}.sh wait $DEV
}
stop() {
debug "Stopping ${SERVICE}$DEV service..."
lock_service_state_change
check_warm_boot
debug "Warm boot flag: ${SERVICE}$DEV ${WARM_BOOT}."
if [[ x"$WARM_BOOT" == x"true" ]]; then
TYPE=warm
else
TYPE=cold
fi
function stopplatform1() {
if [[ x$sonic_asic_platform == x"mellanox" ]] && [[ x$TYPE == x"cold" ]]; then
debug "Stopping pmon service ahead of syncd..."
@ -177,10 +72,9 @@ stop() {
/usr/bin/docker exec -i syncd$DEV /bin/sync
debug "Finished ${TYPE} shutdown syncd process ..."
fi
}
/usr/bin/${SERVICE}.sh stop $DEV
debug "Stopped ${SERVICE}$DEV service..."
function stopplatform2() {
# platform specific tasks
if [[ x"$WARM_BOOT" != x"true" ]]; then
@ -192,8 +86,6 @@ stop() {
/etc/init.d/xpnet.sh start
fi
fi
unlock_service_state_change
}
OP=$1

141
files/scripts/syncd_common.sh Executable file
View File

@ -0,0 +1,141 @@
#!/bin/bash
#
# common functions used by "syncd" scipts (syncd.sh, gbsyncd.sh, etc..)
# scripts using this must provide implementations of the following functions:
#
# startplatform
# waitplatform
# stopplatform1 and stopplatform2
#
# For examples of these, see gbsyncd.sh and syncd.sh.
#
function debug()
{
/usr/bin/logger $1
/bin/echo `date` "- $1" >> ${DEBUGLOG}
}
function lock_service_state_change()
{
debug "Locking ${LOCKFILE} from ${SERVICE}$DEV service"
exec {LOCKFD}>${LOCKFILE}
/usr/bin/flock -x ${LOCKFD}
trap "/usr/bin/flock -u ${LOCKFD}" 0 2 3 15
debug "Locked ${LOCKFILE} (${LOCKFD}) from ${SERVICE}$DEV service"
}
function unlock_service_state_change()
{
debug "Unlocking ${LOCKFILE} (${LOCKFD}) from ${SERVICE}$DEV service"
/usr/bin/flock -u ${LOCKFD}
}
function check_warm_boot()
{
SYSTEM_WARM_START=`$SONIC_DB_CLI STATE_DB hget "WARM_RESTART_ENABLE_TABLE|system" enable`
SERVICE_WARM_START=`$SONIC_DB_CLI STATE_DB hget "WARM_RESTART_ENABLE_TABLE|${SERVICE}" enable`
# SYSTEM_WARM_START could be empty, always make WARM_BOOT meaningful.
if [[ x"$SYSTEM_WARM_START" == x"true" ]] || [[ x"$SERVICE_WARM_START" == x"true" ]]; then
WARM_BOOT="true"
else
WARM_BOOT="false"
fi
}
function wait_for_database_service()
{
# Wait for redis server start before database clean
until [[ $($SONIC_DB_CLI PING | grep -c PONG) -gt 0 ]]; do
sleep 1;
done
# Wait for configDB initialization
until [[ $($SONIC_DB_CLI CONFIG_DB GET "CONFIG_DB_INITIALIZED") ]];
do sleep 1;
done
}
function getBootType()
{
# same code snippet in files/build_templates/docker_image_ctl.j2
case "$(cat /proc/cmdline)" in
*SONIC_BOOT_TYPE=warm*)
TYPE='warm'
;;
*SONIC_BOOT_TYPE=fastfast*)
TYPE='fastfast'
;;
*SONIC_BOOT_TYPE=fast*|*fast-reboot*)
# check that the key exists
if [[ $($SONIC_DB_CLI STATE_DB GET "FAST_REBOOT|system") == "1" ]]; then
TYPE='fast'
else
TYPE='cold'
fi
;;
*)
TYPE='cold'
esac
echo "${TYPE}"
}
start() {
debug "Starting ${SERVICE}$DEV service..."
lock_service_state_change
mkdir -p /host/warmboot
wait_for_database_service
check_warm_boot
debug "Warm boot flag: ${SERVICE}$DEV ${WARM_BOOT}."
if [[ x"$WARM_BOOT" == x"true" ]]; then
# Leave a mark for syncd scripts running inside docker.
touch /host/warmboot/warm-starting
else
rm -f /host/warmboot/warm-starting
fi
startplatform
# start service docker
/usr/bin/${SERVICE}.sh start $DEV
debug "Started ${SERVICE} service..."
unlock_service_state_change
}
wait() {
waitplatform
/usr/bin/${SERVICE}.sh wait $DEV
}
stop() {
debug "Stopping ${SERVICE}$DEV service..."
lock_service_state_change
check_warm_boot
debug "Warm boot flag: ${SERVICE}$DEV ${WARM_BOOT}."
if [[ x"$WARM_BOOT" == x"true" ]]; then
TYPE=warm
else
TYPE=cold
fi
stopplatform1
/usr/bin/${SERVICE}.sh stop $DEV
debug "Stopped ${SERVICE}$DEV service..."
stopplatform2
unlock_service_state_change
}

View File

@ -0,0 +1,30 @@
# docker image for gbsyncd
DOCKER_GBSYNCD_BASE_STEM = docker-gbsyncd-$(DOCKER_GBSYNCD_PLATFORM_CODE)
DOCKER_GBSYNCD_BASE = $(DOCKER_GBSYNCD_BASE_STEM).gz
DOCKER_GBSYNCD_BASE_DBG = $(DOCKER_GBSYNCD_BASE_STEM)-$(DBG_IMAGE_MARK).gz
$(DOCKER_GBSYNCD_BASE)_PATH = $(PLATFORM_PATH)/docker-gbsyncd-$(DOCKER_GBSYNCD_PLATFORM_CODE)
$(DOCKER_GBSYNCD_BASE)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT)
$(DOCKER_GBSYNCD_BASE)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER)
$(DOCKER_GBSYNCD_BASE)_DBG_DEPENDS += $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS)
$(DOCKER_GBSYNCD_BASE)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES)
SONIC_DOCKER_IMAGES += $(DOCKER_GBSYNCD_BASE)
SONIC_BUSTER_DOCKERS += $(DOCKER_GBSYNCD_BASE)
SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_GBSYNCD_BASE)
SONIC_DOCKER_DBG_IMAGES += $(DOCKER_GBSYNCD_BASE_DBG)
SONIC_BUSTER_DBG_DOCKERS += $(DOCKER_GBSYNCD_BASE_DBG)
SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_GBSYNCD_BASE_DBG)
$(DOCKER_GBSYNCD_BASE)_CONTAINER_NAME = gbsyncd
$(DOCKER_GBSYNCD_BASE)_RUN_OPT += --net=host --privileged -t
$(DOCKER_GBSYNCD_BASE)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf
$(DOCKER_GBSYNCD_BASE)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro

View File

@ -0,0 +1,11 @@
#DPKG FRK
DPATH := $($(DOCKER_GBSYNCD_BASE)_PATH)
DEP_FILES := $(SONIC_COMMON_FILES_LIST) platform/vs/docker-gbsyncd-vs.mk platform/vs/docker-gbsyncd-vs.dep
DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST)
DEP_FILES += $(shell git ls-files $(DPATH))
$(DOCKER_GBSYNCD_BASE)_CACHE_MODE := GIT_CONTENT_SHA
$(DOCKER_GBSYNCD_BASE)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST)
$(DOCKER_GBSYNCD_BASE)_DEP_FILES := $(DEP_FILES)
$(eval $(call add_dbg_docker,$(DOCKER_GBSYNCD_BASE),$(DOCKER_GBSYNCD_BASE_DBG)))

View File

@ -0,0 +1,14 @@
# docker image for vs gbsyncd
DOCKER_GBSYNCD_PLATFORM_CODE = vs
include $(PLATFORM_PATH)/../template/docker-gbsyncd-base.mk
$(DOCKER_GBSYNCD_BASE)_DEPENDS += $(SYNCD_VS)
$(DOCKER_GBSYNCD_BASE)_DBG_DEPENDS += $(SYNCD_VS_DBG) \
$(LIBSWSSCOMMON_DBG) \
$(LIBSAIMETADATA_DBG) \
$(LIBSAIREDIS_DBG) \
$(LIBSAIVS_DBG)
$(DOCKER_GBSYNCD_BASE)_RUN_OPT += -v /host/warmboot:/var/warmboot

View File

@ -0,0 +1,34 @@
FROM docker-config-engine-buster
ARG docker_container_name
RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf
## Make apt-get non-interactive
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -f -y iproute2=4.20.0-2 libcap2-bin=1:2.25-2
COPY \
{% for deb in docker_gbsyncd_vs_debs.split(' ') -%}
debs/{{ deb }}{{' '}}
{%- endfor -%}
debs/
RUN dpkg -i \
{% for deb in docker_gbsyncd_vs_debs.split(' ') -%}
debs/{{ deb }}{{' '}}
{%- endfor %}
COPY ["start.sh", "/usr/bin/"]
COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["critical_processes", "/etc/supervisor/"]
## Clean up
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
RUN rm -rf /debs
ENTRYPOINT ["/usr/bin/supervisord"]

View File

@ -0,0 +1 @@
program:syncd

View File

@ -0,0 +1,21 @@
#!/usr/bin/env bash
HWSKU_DIR=/usr/share/sonic/hwsku
mkdir -p /etc/sai.d/
# Create/Copy the pai.profile to /etc/sai.d/pai.profile
if [ -f $HWSKU_DIR/pai.profile.j2 ]; then
sonic-cfggen -d -t $HWSKU_DIR/pai.profile.j2 > /etc/sai.d/pai.profile
else
if [ -f $HWSKU_DIR/pai.profile ]; then
cp $HWSKU_DIR/pai.profile /etc/sai.d/pai.profile
fi
fi
# Create/Copy the gearbox configs to /etc/sai.d
if [[ x"$sonic_asic_platform" == x"broadcom" ]]; then
if [ -d $HWSKU_DIR/gearbox ]; then
cp $HWSKU_DIR/gearbox/*.bcm /etc/sai.d/.
fi
fi

View File

@ -0,0 +1,48 @@
[supervisord]
logfile_maxbytes=1MB
logfile_backups=2
nodaemon=true
[eventlistener:dependent-startup]
command=python -m supervisord_dependent_startup
autostart=true
autorestart=unexpected
startretries=0
exitcodes=0,3
events=PROCESS_STATE
[eventlistener:supervisor-proc-exit-listener]
command=/usr/bin/supervisor-proc-exit-listener --container-name gbsyncd
events=PROCESS_STATE_EXITED
autostart=true
autorestart=unexpected
[program:rsyslogd]
command=/usr/sbin/rsyslogd -n -iNONE
priority=1
autostart=false
autorestart=unexpected
stdout_logfile=syslog
stderr_logfile=syslog
dependent_startup=true
[program:start]
command=/usr/bin/start.sh
priority=2
autostart=false
autorestart=false
startsecs=0
stdout_logfile=syslog
stderr_logfile=syslog
dependent_startup=true
dependent_startup_wait_for=rsyslogd:running
[program:syncd]
command=/usr/bin/gbsyncd_start.sh
priority=3
autostart=false
autorestart=false
stdout_logfile=syslog
stderr_logfile=syslog
dependent_startup=true
dependent_startup_wait_for=start:exited

View File

@ -58,9 +58,24 @@
"separator": "|",
"instance" : "redis"
},
"CHASSIS_DB" : {
"GB_ASIC_DB" : {
"id" : 8,
"separator": "|",
"instance" : "redis"
},
"GB_COUNTERS_DB" : {
"id" : 9,
"separator": "|",
"instance" : "redis"
},
"GB_FLEX_COUNTER_DB" : {
"id" : 10,
"separator": "|",
"instance" : "redis"
},
"CHASSIS_DB" : {
"id" : 11,
"separator": "|",
"instance" : "redis_chassis"
}
},

14
platform/vs/gbsyncd-vs.mk Normal file
View File

@ -0,0 +1,14 @@
# docker image for vs gbsyncd
DOCKER_GBSYNCD_PLATFORM_CODE = vs
include $(PLATFORM_PATH)/../template/docker-gbsyncd-base.mk
$(DOCKER_GBSYNCD_BASE)_DEPENDS += $(SYNCD_VS)
$(DOCKER_GBSYNCD_BASE)_DBG_DEPENDS += $(SYNCD_VS_DBG) \
$(LIBSWSSCOMMON_DBG) \
$(LIBSAIMETADATA_DBG) \
$(LIBSAIREDIS_DBG) \
$(LIBSAIVS_DBG)
$(DOCKER_GBSYNCD_BASE)_RUN_OPT += -v /host/warmboot:/var/warmboot

View File

@ -2,6 +2,7 @@ include $(PLATFORM_PATH)/syncd-vs.mk
include $(PLATFORM_PATH)/sonic-version.mk
include $(PLATFORM_PATH)/docker-sonic-vs.mk
include $(PLATFORM_PATH)/docker-syncd-vs.mk
include $(PLATFORM_PATH)/docker-gbsyncd-vs.mk
include $(PLATFORM_PATH)/one-image.mk
include $(PLATFORM_PATH)/onie.mk
include $(PLATFORM_PATH)/kvm-image.mk

View File

@ -19,6 +19,9 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
cp -Lr $$d device/x86_64-kvm_x86_64-r0/ ; \
cp ./sai.vs_profile device/x86_64-kvm_x86_64-r0/$$(basename $$d)/sai.profile; \
grep -v ^# device/x86_64-kvm_x86_64-r0/$$(basename $$d)/port_config.ini | awk '{i=i+1;print "eth"i":"$$2}' > device/x86_64-kvm_x86_64-r0/$$(basename $$d)/lanemap.ini
cp ./pai.vs_profile device/x86_64-kvm_x86_64-r0/$$(basename $$d)/pai.profile; \
grep -v ^# device/x86_64-kvm_x86_64-r0/$$(basename $$d)/port_config.ini | awk '{i=i+1;print "eth"i":"$$2}' > device/x86_64-kvm_x86_64-r0/$$(basename $$d)/lanemap.ini
done;
# Build the package

View File

@ -0,0 +1,7 @@
SAI_WARM_BOOT_READ_FILE=/var/cache/sai_warmboot.bin
SAI_WARM_BOOT_WRITE_FILE=/var/cache/sai_warmboot.bin
SAI_VS_SWITCH_TYPE=SAI_VS_SWITCH_TYPE_BCM81724
SAI_VS_SAI_SWITCH_TYPE=SAI_SWITCH_TYPE_PHY
SAI_VS_HOSTIF_USE_TAP_DEVICE=false
SAI_VS_USE_BCMSIM_LINK_MON=true
SAI_VS_INTERFACE_LANE_MAP_FILE=/usr/share/sonic/hwsku/lanemap.ini